Name: series-workflowg6hzn Phase: Succeeded StartedAt: 2026-07-10 20:03:03 +0000 UTC FinishedAt: 2026-07-11 00:38:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[0] Phase: Succeeded StartedAt: 2026-07-10 20:03:03 +0000 UTC FinishedAt: 2026-07-10 20:33:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[0].run-triage Phase: Succeeded StartedAt: 2026-07-10 20:03:03 +0000 UTC FinishedAt: 2026-07-10 20:33:11 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "47fd02d9-4de2-4cce-b651-657e4669ccd6" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "load_misc_binary", "bm_register_write", "bm_entry_write", "bm_status_write", "bm_unlink", "bm_entry_show" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtibV9yZWdpc3Rlcl93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9zdGF0dXNfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fdW5saW5rJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2lnbmlmaWNhbnRseSByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0sIGludHJvZHVjaW5nIFJDVS1iYXNlZCBsb29rdXBzLCBjaGFuZ2luZyBpbnRlcm5hbCBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBjb252ZXJ0aW5nIGVudHJ5IHJlYWRpbmcgdG8gdXNlIHNlcV9maWxlLCBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIHJlbW92aW5nIGVudHJpZXMgdmlhIHVubGluaygyKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBubyByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBpc3N1ZXMgd2VyZSBpbnRyb2R1Y2VkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYTg3N2RiMWJmYjdkMmQ4YTViY2ZlYTAzZjNmYzExMmM4NDAzYWQzMlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgSnVsIDEwIDIwOjMyOjM3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbmluZGV4IGMwYTM0ZmJmODAyMmI1Li4zMDZlZjQ4ZjVkZTZkZCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuQEAgLTEzMyw3ICYjNDM7MTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxuIENhdHRpbmcgdGhlIGZpbGUgdGVsbHMgeW91IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBgYGJpbmZtdF9taXNjL3RoZV9lbnRyeWBgLlxuIFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcbi1vciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC5cbiYjNDM7b3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuIEEgc2luZ2xlIGVudHJ5IGNhbiBhbHNvIGJlIHJlbW92ZWRcbiYjNDM7Ynkgc2ltcGx5IHVubGlua2luZyAoYGBybWBgKSBgYC9wcm9jLy4uLi90aGVfbmFtZWBgLlxuIFxuIFxuIEhpbnRzXG5kaWZmIC0tZ2l0IGEvZnMvYmluZm10X21pc2MuYyBiL2ZzL2JpbmZtdF9taXNjLmNcbmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mNTFkMjcyNjk4NjE2MCAxMDA2NDRcbi0tLSBhL2ZzL2JpbmZtdF9taXNjLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2JpbmZtdF9taXNjLmNcbkBAIC0xMCw0NSAmIzQzOzEwLDQ2IEBAXG4gXG4gI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSBcJiMzNDs6IFwmIzM0OyBmbXRcbiBcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaGV4LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9tbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpbmZtdHMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2N0eXBlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZW1hcC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbmFtZWkuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vdW50LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNjYWxscy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tzdHJ0b3guaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ByaW50ay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdWxpc3QuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlcV9maWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFx1MDAzZVxuIFxuLSNpbmNsdWRlIFwmIzM0O2ludGVybmFsLmhcJiMzNDtcbi1cbi0jaWZkZWYgREVCVUdcbi0jIGRlZmluZSBVU0VfREVCVUcgMVxuLSNlbHNlXG4tIyBkZWZpbmUgVVNFX0RFQlVHIDBcbi0jZW5kaWZcbi1cbi1lbnVtIHtcbi1cdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xuJiM0MzsvKiBFbnRyeSBzdGF0dXMgYW5kIG1hdGNoIHR5cGUgYml0IG51bWJlcnMuICovXG4mIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XG4mIzQzO1x0TUlTQ19GTVRfRU5BQkxFRF9CSVRcdD0gMCxcbiYjNDM7XHRNSVNDX0ZNVF9NQUdJQ19CSVRcdD0gMSxcbiB9O1xuIFxuLWVudW0ge0VuYWJsZWQsIE1hZ2ljfTtcbi0jZGVmaW5lIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwICgxVUwgXHUwMDNjXHUwMDNjIDMxKVxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9CSU5BUlkgKDFVTCBcdTAwM2NcdTAwM2MgMzApXG4tI2RlZmluZSBNSVNDX0ZNVF9DUkVERU5USUFMUyAoMVVMIFx1MDAzY1x1MDAzYyAyOSlcbi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fRklMRSAoMVVMIFx1MDAzY1x1MDAzYyAyOClcbiYjNDM7LyogRW50cnkgYmVoYXZpb3IgZmxhZ3MsIGZpeGVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiAqL1xuJiM0MztlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2ZsYWdzIHtcbiYjNDM7XHRNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMFx0PSAoMVUgXHUwMDNjXHUwMDNjIDMxKSxcbiYjNDM7XHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVx0PSAoMVUgXHUwMDNjXHUwMDNjIDMwKSxcbiYjNDM7XHRNSVNDX0ZNVF9DUkVERU5USUFMU1x0PSAoMVUgXHUwMDNjXHUwMDNjIDI5KSxcbiYjNDM7XHRNSVNDX0ZNVF9PUEVOX0ZJTEVcdD0gKDFVIFx1MDAzY1x1MDAzYyAyOCksXG4mIzQzO307XG4gXG4tdHlwZWRlZiBzdHJ1Y3Qge1xuLVx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuJiM0MztzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xuJiM0MztcdHN0cnVjdCBobGlzdF9ub2RlIG5vZGU7XG4gXHR1bnNpZ25lZCBsb25nIGZsYWdzO1x0XHQvKiB0eXBlLCBzdGF0dXMsIGV0Yy4gKi9cbiBcdGludCBvZmZzZXQ7XHRcdFx0Lyogb2Zmc2V0IG9mIG1hZ2ljICovXG4gXHRpbnQgc2l6ZTtcdFx0XHQvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi9cbkBAIC01OSw5ICYjNDM7NjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7XG4gXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XG4gXHRyZWZjb3VudF90IHVzZXJzO1x0XHQvKiBzeW5jIHJlbW92YWwgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgKi9cbi19IE5vZGU7XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XG4mIzQzO1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbiYjNDM7XHRjaGFyIGJ1ZltdO1x0XHRcdC8qIHJlZ2lzdGVyIHN0cmluZywgZmllbGRzIHBvaW50IGluIGhlcmUgKi9cbiYjNDM7fTtcbiBcbiAvKlxuICAqIE1heCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHN0cmluZy4gIERldGVybWluZWQgYnk6XG5AQCAtNzQsMTAgJiM0Mzs3NSwzNiBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiAgLSBpbnRlcnA6IH41MCBieXRlc1xuICAqICAtIGZsYWdzOiAgNSBieXRlc1xuICAqIFJvdW5kIHRoYXQgdXAgYSBiaXQsIGFuZCB0aGVuIGJhY2sgb2ZmIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGFcbi0gKiAobGlrZSBzdHJ1Y3QgTm9kZSkuXG4mIzQzOyAqIChsaWtlIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSkuXG4gICovXG4gI2RlZmluZSBNQVhfUkVHSVNURVJfTEVOR1RIIDE5MjBcbiBcbiYjNDM7LyogVHJhaWxpbmcgZGVsaW1pdGVyIHBhZCBzbyBmaWVsZCBwYXJzaW5nIGFsd2F5cyB0ZXJtaW5hdGVzIGF0IGEgZGVsaW1pdGVyLiAqL1xuJiM0MzsjZGVmaW5lIE1JU0NfREVMSU1fUEFEIDhcbiYjNDM7XG4mIzQzOy8qIENoZWNrIGlmIEBlJiMzOTtzIG1hZ2ljIG1hdGNoZXMgQGJwcm0mIzM5O3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovXG4mIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuJiM0MztcdFx0XHRcdGNvbnN0IHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBjaGFyICpzID0gYnBybS1cdTAwM2VidWYgJiM0MzsgZS1cdTAwM2VvZmZzZXQ7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmICghZS1cdTAwM2VtYXNrKVxuJiM0MztcdFx0cmV0dXJuICFtZW1jbXAocywgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZS1cdTAwM2VzaXplOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICgoc1tpXSBeIGUtXHUwMDNlbWFnaWNbaV0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbaV0pXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ2hlY2sgaWYgQGUmIzM5O3MgcmVnaXN0ZXJlZCBleHRlbnNpb24gbWF0Y2hlcyBAZXh0LCBOVUxMIGlmIHRoZXJlIGlzIG5vbmUuICovXG4mIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGNvbnN0IHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSxcbiYjNDM7XHRcdFx0XHQgICAgY29uc3QgY2hhciAqZXh0KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGV4dCBcdTAwMjZcdTAwMjYgIXN0cmNtcChlLVx1MDAzZW1hZ2ljLCBleHQpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIHNlYXJjaF9iaW5mbXRfaGFuZGxlciAtIHNlYXJjaCBmb3IgYSBiaW5hcnkgaGFuZGxlciBmb3IgQGJwcm1cbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXG5AQCAtODYsNDMgJiM0MzsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XG4gICogU2VhcmNoIGZvciBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZm9yIEBicHJtIGluIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgYmluYXJ5XG4gICogdHlwZSBoYW5kbGVycy5cbiAgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cbiYjNDM7ICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpcbiYjNDM7c2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHRjaGFyICpwID0gc3RycmNocihicHJtLVx1MDAzZWludGVycCwgJiMzOTsuJiMzOTspO1xuLVx0Tm9kZSAqZTtcbiYjNDM7XHRjaGFyICpkb3QgPSBzdHJyY2hyKGJwcm0tXHUwMDNlaW50ZXJwLCAmIzM5Oy4mIzM5Oyk7XG4mIzQzO1x0Y29uc3QgY2hhciAqZXh0ID0gZG90ID8gZG90ICYjNDM7IDEgOiBOVUxMO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTtcbiBcbiBcdC8qIFdhbGsgYWxsIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzLiAqL1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShlLCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpIHtcbi1cdFx0Y2hhciAqcztcbi1cdFx0aW50IGo7XG4tXG4mIzQzO1x0aGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSkge1xuIFx0XHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXG4tXHRcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4mIzQzO1x0XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gZXh0ZW5zaW9uIGlmIGFwcGxpY2FibGUuICovXG4tXHRcdGlmICghdGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdFx0aWYgKHAgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZS1cdTAwM2VtYWdpYywgcCAmIzQzOyAxKSlcbiYjNDM7XHRcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4mIzQzO1x0XHRcdGlmIChlbnRyeV9tYXRjaGVzX21hZ2ljKGUsIGJwcm0pKVxuIFx0XHRcdFx0cmV0dXJuIGU7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXHUwMDI2IG1hc2suICovXG4tXHRcdHMgPSBicHJtLVx1MDAzZWJ1ZiAmIzQzOyBlLVx1MDAzZW9mZnNldDtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIGUtXHUwMDNlc2l6ZTsgaiYjNDM7JiM0MzspXG4tXHRcdFx0XHRpZiAoKCpzJiM0MzsmIzQzOyBeIGUtXHUwMDNlbWFnaWNbal0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbal0pXG4tXHRcdFx0XHRcdGJyZWFrO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIGUtXHUwMDNlc2l6ZTsgaiYjNDM7JiM0MzspXG4tXHRcdFx0XHRpZiAoKCpzJiM0MzsmIzQzOyBeIGUtXHUwMDNlbWFnaWNbal0pKVxuLVx0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0aWYgKGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGUsIGV4dCkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGU7XG4gXHRcdH1cbi1cdFx0aWYgKGogPT0gZS1cdTAwM2VzaXplKVxuLVx0XHRcdHJldHVybiBlO1xuIFx0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG5AQCAtMTM0LDY0ICYjNDM7MTQ4LDY5IEBAIHN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcbiAgKlxuICAqIFRyeSB0byBmaW5kIGEgYmluZm10IGhhbmRsZXIgZm9yIHRoZSBiaW5hcnkgdHlwZS4gSWYgb25lIGlzIGZvdW5kIHRha2UgYVxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cbiYjNDM7ICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGVcbiYjNDM7ICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXG4mIzQzOyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxuJiM0MzsgKiBpcyBib3VuZGVkLlxuICAqXG4gICogUmV0dXJuOiBiaW5hcnkgdHlwZSBsaXN0IGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZVxuICAqL1xuLXN0YXRpYyBOb2RlICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuLVx0XHRcdFx0c3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Tm9kZSAqZTtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4gXG4tXHRyZWFkX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuLVx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbi1cdGlmIChlKVxuLVx0XHRyZWZjb3VudF9pbmMoXHUwMDI2ZS1cdTAwM2V1c2Vycyk7XG4tXHRyZWFkX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4mIzQzO1x0Z3VhcmQocmN1KSgpO1xuJiM0MztcdGRvIHtcbiYjNDM7XHRcdGUgPSBzZWFyY2hfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4mIzQzO1x0fSB3aGlsZSAoZSBcdTAwMjZcdTAwMjYgIXJlZmNvdW50X2luY19ub3RfemVybyhcdTAwMjZlLVx1MDAzZXVzZXJzKSk7XG4gXHRyZXR1cm4gZTtcbiB9XG4gXG4gLyoqXG4tICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIG5vZGVcbi0gKiBAZTogbm9kZSB0byBwdXRcbiYjNDM7ICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIGVudHJ5XG4mIzQzOyAqIEBlOiBlbnRyeSB0byBwdXRcbiAgKlxuLSAqIEZyZWUgbm9kZSBzeW5jaW5nIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpIGFuZCBkZWZlciBmaW5hbCBmcmVlIHRvXG4mIzQzOyAqIEZyZWUgZW50cnkgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xuICAqIGxvYWRfbWlzY19iaW5hcnkoKSBpbiBjYXNlIGl0IGlzIHVzaW5nIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIHdlIHdlcmVcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxuICAqL1xuLXN0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihOb2RlICplKVxuJiM0MztzdGF0aWMgdm9pZCBwdXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbiBcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2ZS1cdTAwM2V1c2VycykpIHtcbi1cdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbiYjNDM7XHRcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcbiYjNDM7XHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGUtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZS1cdTAwM2VpbnRlcnBfZmlsZSwgTlVMTCk7XG4tXHRcdGtmcmVlKGUpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0LyogTG9ja2xlc3Mgd2Fsa2VycyBtYXkgc3RpbGwgZGVyZWZlcmVuY2UgdGhpcyBlbnRyeS4gKi9cbiYjNDM7XHRcdGtmcmVlX3JjdShlLCByY3UpO1xuIFx0fVxuIH1cbiBcbiYjNDM7REVGSU5FX0ZSRUUocHV0X2JpbmZtdF9oYW5kbGVyLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKiwgaWYgKF9UKSBwdXRfYmluZm10X2hhbmRsZXIoX1QpKVxuJiM0MztcbiAvKipcbi0gKiBsb2FkX2JpbmZtdF9taXNjIC0gbG9hZCB0aGUgYmluZm10X21pc2Mgb2YgdGhlIGNhbGxlciYjMzk7cyB1c2VyIG5hbWVzcGFjZVxuJiM0MzsgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlXG4gICpcbi0gKiBUbyBiZSBjYWxsZWQgaW4gbG9hZF9taXNjX2JpbmFyeSgpIHRvIGxvYWQgdGhlIHJlbGV2YW50IHN0cnVjdCBiaW5mbXRfbWlzYy5cbi0gKiBJZiBhIHVzZXIgbmFtZXNwYWNlIGRvZXNuJiMzOTt0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCBjYW4gbWFrZSB1c2Vcbi0gKiBvZiBpdHMgYW5jZXN0b3ImIzM5O3MgYmluZm10X21pc2MgaGFuZGxlcnMuIFRoaXMgbWltaWNrcyB0aGUgYmVoYXZpb3Igb2Zcbi0gKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBiaW5mbXRfbWlzYyBoYW5kbGVycyB3aGVyZVxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXG4mIzQzOyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IHVzZXMgdGhlXG4mIzQzOyAqIGhhbmRsZXJzIG9mIGl0cyBjbG9zZXN0IGFuY2VzdG9yIHdpdGggb25lLiBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2ZcbiYjNDM7ICogcHJlLW5hbWVzcGFjZWQgYmluZm10X21pc2Mgd2hlcmUgYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnMgd2VyZSBhdmFpbGFibGVcbiYjNDM7ICogdG8gYWxsIHVzZXJzIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4gVGhlIGluaXQgdXNlciBuYW1lc3BhY2VcbiYjNDM7ICogaW5zdGFuY2UgaXMgc3RhdGljYWxseSBzZXQgdXAgc28gdGhlIGZhbGxiYWNrIGlzIG5ldmVyIHJlYWNoZWQgaW5cbiYjNDM7ICogcHJhY3RpY2UuXG4gICpcbiAgKiBSZXR1cm46IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlXG4gICovXG4tc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpjdXJyZW50X2JpbmZtdF9taXNjKHZvaWQpXG4ge1xuIFx0Y29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zO1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuIFxuLVx0dXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpO1xuLVx0d2hpbGUgKHVzZXJfbnMpIHtcbiYjNDM7XHRmb3IgKHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTsgdXNlcl9uczsgdXNlcl9ucyA9IHVzZXJfbnMtXHUwMDNlcGFyZW50KSB7XG4gXHRcdC8qIFBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKSBpbiBibV9maWxsX3N1cGVyKCkuICovXG4gXHRcdG1pc2MgPSBzbXBfbG9hZF9hY3F1aXJlKFx1MDAyNnVzZXJfbnMtXHUwMDNlYmluZm10X21pc2MpO1xuIFx0XHRpZiAobWlzYylcbiBcdFx0XHRyZXR1cm4gbWlzYztcbi1cbi1cdFx0dXNlcl9ucyA9IHVzZXJfbnMtXHUwMDNlcGFyZW50O1xuIFx0fVxuIFxuIFx0cmV0dXJuIFx1MDAyNmluaXRfYmluZm10X21pc2M7XG5AQCAtMjAyLDMwICYjNDM7MjIxLDI5IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZClcbiAgKi9cbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICpmbXQ7XG4tXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGUgPSBOVUxMO1xuLVx0aW50IHJldHZhbCA9IC1FTk9FWEVDO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZm10IF9fZnJlZShwdXRfYmluZm10X2hhbmRsZXIpID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4mIzQzO1x0aW50IHJldHZhbDtcbiBcbi1cdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XG4tXHRpZiAoIW1pc2MtXHUwMDNlZW5hYmxlZClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbiYjNDM7XHRtaXNjID0gY3VycmVudF9iaW5mbXRfbWlzYygpO1xuJiM0MztcdGlmICghUkVBRF9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHRmbXQgPSBnZXRfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4gXHRpZiAoIWZtdClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbiYjNDM7XHRcdHJldHVybiAtRU5PRVhFQztcbiBcbiBcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cbi1cdHJldHZhbCA9IC1FTk9FTlQ7XG4gXHRpZiAoYnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKSB7XG4gXHRcdGJwcm0tXHUwMDNlaW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19QUkVTRVJWRV9BUkdWMDtcbiBcdH0gZWxzZSB7XG4gXHRcdHJldHZhbCA9IHJlbW92ZV9hcmdfemVybyhicHJtKTtcbiBcdFx0aWYgKHJldHZhbClcbi1cdFx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdFx0cmV0dXJuIHJldHZhbDtcbiBcdH1cbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxuQEAgLTIzNCw1NyAmIzQzOzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiBcdC8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovXG4gXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoYnBybS1cdTAwM2VpbnRlcnAsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gcmV0dmFsO1xuIFx0YnBybS1cdTAwM2VhcmdjJiM0MzsmIzQzOztcbiBcbiBcdC8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChmbXQtXHUwMDNlaW50ZXJwcmV0ZXIsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gcmV0dmFsO1xuIFx0YnBybS1cdTAwM2VhcmdjJiM0MzsmIzQzOztcbiBcbiBcdC8qIFVwZGF0ZSBpbnRlcnAgaW4gY2FzZSBiaW5mbXRfc2NyaXB0IG5lZWRzIGl0LiAqL1xuIFx0cmV0dmFsID0gYnBybV9jaGFuZ2VfaW50ZXJwKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiByZXR2YWw7XG4gXG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcbiBcdFx0aW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LVx1MDAzZWludGVycF9maWxlKTtcbi1cdFx0aWYgKCFJU19FUlIoaW50ZXJwX2ZpbGUpKVxuLVx0XHRcdGRlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTtcbiYjNDM7XHRcdGlmICghSVNfRVJSKGludGVycF9maWxlKSkge1xuJiM0MztcdFx0XHRpbnQgZXJyID0gZXhlX2ZpbGVfZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKGVycikge1xuJiM0MztcdFx0XHRcdGZwdXQoaW50ZXJwX2ZpbGUpO1xuJiM0MztcdFx0XHRcdGludGVycF9maWxlID0gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4gXHR9IGVsc2Uge1xuIFx0XHRpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyhmbXQtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFx0fVxuLVx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XG4gXHRpZiAoSVNfRVJSKGludGVycF9maWxlKSlcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gUFRSX0VSUihpbnRlcnBfZmlsZSk7XG4gXG4gXHRicHJtLVx1MDAzZWludGVycHJldGVyID0gaW50ZXJwX2ZpbGU7XG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbiBcdFx0YnBybS1cdTAwM2VleGVjZmRfY3JlZHMgPSAxO1xuLVxuLVx0cmV0dmFsID0gMDtcbi1yZXQ6XG4tXG4tXHQvKlxuLVx0ICogSWYgd2UgYWN0dWFsbHkgcHV0IHRoZSBub2RlIGhlcmUgYWxsIGNvbmN1cnJlbnQgY2FsbHMgdG9cbi1cdCAqIGxvYWRfbWlzY19iaW5hcnkoKSB3aWxsIGhhdmUgZmluaXNoZWQuIFdlIGFsc28ga25vd1xuLVx0ICogdGhhdCBmb3IgdGhlIHJlZmNvdW50IHRvIGJlIHplcm8gc29tZW9uZSBtdXN0IGhhdmUgY29uY3VyZW50bHlcbi1cdCAqIHJlbW92ZWQgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBhbmQgaXQmIzM5O3Mgb3VyIGpvYiB0b1xuLVx0ICogZnJlZSBpdC5cbi1cdCAqL1xuLVx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XG4tXG4tXHRyZXR1cm4gcmV0dmFsO1xuJiM0MztcdHJldHVybiAwO1xuIH1cbiBcbiAvKiBDb21tYW5kIHBhcnNlcnMgKi9cbiBcbiAvKlxuLSAqIHBhcnNlcyBhbmQgY29waWVzIG9uZSBhcmd1bWVudCBlbmNsb3NlZCBpbiBkZWwgZnJvbSAqc3AgdG8gKmRwLFxuLSAqIHJlY29nbmlzaW5nIHRoZSBcXHggc3BlY2lhbC5cbi0gKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW5cbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cbiYjNDM7ICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZ1xuJiM0MzsgKiB0aGUgXFx4IGVzY2FwZS4gVGVybWluYXRlcyB0aGUgYXJndW1lbnQgd2l0aCBhIE5VTCBhbmQgcmV0dXJucyBhIHBvaW50ZXJcbiYjNDM7ICogcGFzdCBpdCBvciBOVUxMIG9uIGEgbWFsZm9ybWVkIGVzY2FwZS5cbiAgKi9cbiBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbClcbiB7XG5AQCAtMjk5LDQ2ICYjNDM7MzA4LDEyMyBAQCBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbClcbiBcdFx0XHRcdHJldHVybiBOVUxMO1xuIFx0XHR9XG4gXHR9XG4tXHRzWy0xXSA9JiMzOTtcXDAmIzM5OztcbiYjNDM7XHRzWy0xXSA9ICYjMzk7XFwwJiMzOTs7XG4gXHRyZXR1cm4gcztcbiB9XG4gXG4tc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxuJiM0MztzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpwLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuLVx0Y2hhciAqcCA9IHNmcztcbi1cdGludCBjb250ID0gMTtcbi1cbi1cdC8qIHNwZWNpYWwgZmxhZ3MgKi9cbi1cdHdoaWxlIChjb250KSB7XG4mIzQzO1x0Zm9yICg7OyBwJiM0MzsmIzQzOykge1xuIFx0XHRzd2l0Y2ggKCpwKSB7XG4gXHRcdGNhc2UgJiMzOTtQJiMzOTs6XG4gXHRcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IFAgKHByZXNlcnZlIGFyZ3YwKVxcblwmIzM0Oyk7XG4tXHRcdFx0cCYjNDM7JiM0Mzs7XG4gXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMDtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O08mIzM5OzpcbiBcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZmxhZzogTyAob3BlbiBiaW5hcnkpXFxuXCYjMzQ7KTtcbi1cdFx0XHRwJiM0MzsmIzQzOztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fQklOQVJZO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7QyYjMzk7OlxuIFx0XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBmbGFnOiBDIChwcmVzZXJ2ZSBjcmVkcylcXG5cJiMzNDspO1xuLVx0XHRcdHAmIzQzOyYjNDM7O1xuLVx0XHRcdC8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZVxuLVx0XHRcdCAgIG9wZW4tYmluYXJ5IGZsYWcgKi9cbi1cdFx0XHRlLVx1MDAzZWZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8XG4tXHRcdFx0XHRcdE1JU0NfRk1UX09QRU5fQklOQVJZKTtcbiYjNDM7XHRcdFx0LyogQyBpbXBsaWVzIE8gKi9cbiYjNDM7XHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9DUkVERU5USUFMUyB8IE1JU0NfRk1UX09QRU5fQklOQVJZO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7RiYjMzk7OlxuIFx0XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBmbGFnOiBGOiBvcGVuIGludGVycHJldGVyIGZpbGUgbm93XFxuXCYjMzQ7KTtcbi1cdFx0XHRwJiM0MzsmIzQzOztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbi1cdFx0XHRjb250ID0gMDtcbiYjNDM7XHRcdFx0cmV0dXJuIHA7XG4gXHRcdH1cbiBcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTssICYjMzk7bWFnaWMmIzM5OyBhbmQgJiMzOTttYXNrJiMzOTsgZmllbGRzIG9mIGFuICYjMzk7TSYjMzk7IGVudHJ5LiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFyc2VfbWFnaWNfZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCwgY2hhciBkZWwpXG4mIzQzO3tcbiYjNDM7XHRjaGFyICpzO1xuJiM0MztcbiYjNDM7XHQvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRzID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFzKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnMgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdGlmIChwICE9IHMpIHtcbiYjNDM7XHRcdGlmIChrc3RydG9pbnQocCwgMTAsIFx1MDAyNmUtXHUwMDNlb2Zmc2V0KSB8fCBlLVx1MDAzZW9mZnNldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0fVxuJiM0MztcdHAgPSBzICYjNDM7IDE7XG4mIzQzO1x0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4mIzQzO1xuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4mIzQzO1x0ZS1cdTAwM2VtYWdpYyA9IHA7XG4mIzQzO1x0cCA9IHNjYW5hcmcocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXAgfHwgIWUtXHUwMDNlbWFnaWNbMF0pXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbiYjNDM7XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwmIzM0OyxcbiYjNDM7XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hZ2ljLCBwIC0gZS1cdTAwM2VtYWdpYywgdHJ1ZSk7XG4mIzQzO1xuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRlLVx1MDAzZW1hc2sgPSBwO1xuJiM0MztcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0aWYgKCFlLVx1MDAzZW1hc2tbMF0pIHtcbiYjNDM7XHRcdGUtXHUwMDNlbWFzayA9IE5VTEw7XG4mIzQzO1x0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwmIzM0Oyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuJiM0MztcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiBcJiMzNDssXG4mIzQzO1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIHAgLSBlLVx1MDAzZW1hc2ssIHRydWUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZFxuJiM0MztcdCAqIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyB3aWxsIHN0b3AgYXRcbiYjNDM7XHQgKiB0aGUgZmlyc3Qgb25lIHRoZXkgZW5jb3VudGVyLlxuJiM0MztcdCAqL1xuJiM0MztcdGUtXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XG4mIzQzO1x0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjYgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtXHUwMDNlc2l6ZSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fCBCSU5QUk1fQlVGX1NJWkUgLSBlLVx1MDAzZXNpemUgXHUwMDNjIGUtXHUwMDNlb2Zmc2V0KVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwmIzM0OywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbiYjNDM7XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiBcJiMzNDssXG4mIzQzO1x0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplLCB0cnVlKTtcbiYjNDM7XHRpZiAoZS1cdTAwM2VtYXNrKVxuJiM0MztcdFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4mIzQzO1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcJiMzNDssXG4mIzQzO1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4mIzQzO1x0cmV0dXJuIHA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQgb2YgYW4gJiMzOTtFJiMzOTsgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovXG4mIzQzO3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcbiYjNDM7XHRcdFx0XHQgICAgY2hhciBkZWwpXG4mIzQzO3tcbiYjNDM7XHQvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuJiM0MztcdHAgPSBzdHJjaHIocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXApXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHQqcCYjNDM7JiM0MzsgPSAmIzM5O1xcMCYjMzk7O1xuIFxuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4mIzQzO1x0ZS1cdTAwM2VtYWdpYyA9IHA7XG4mIzQzO1x0cCA9IHN0cmNocihwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdCpwJiM0MzsmIzQzOyA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0aWYgKCFlLVx1MDAzZW1hZ2ljWzBdIHx8IHN0cmNocihlLVx1MDAzZW1hZ2ljLCAmIzM5Oy8mIzM5OykpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZXh0ZW5zaW9uOiB7JXN9XFxuXCYjMzQ7LCBlLVx1MDAzZW1hZ2ljKTtcbiYjNDM7XG4mIzQzO1x0LyogU2tpcCB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovXG4mIzQzO1x0cCA9IHN0cmNocihwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdCpwJiM0MzsmIzQzOyA9ICYjMzk7XFwwJiMzOTs7XG4gXHRyZXR1cm4gcDtcbiB9XG4gXG5AQCAtMzQ3LDUwICYjNDM7NDMzLDQ4IEBAIHN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSlcbiAgKiAmIzM5OzpuYW1lOnR5cGU6b2Zmc2V0Om1hZ2ljOm1hc2s6aW50ZXJwcmV0ZXI6ZmxhZ3MmIzM5O1xuICAqIHdoZXJlIHRoZSAmIzM5OzomIzM5OyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxuICAqL1xuLXN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHNpemVfdCBjb3VudClcbiB7XG4tXHROb2RlICplO1xuLVx0aW50IG1lbXNpemUsIGVycjtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4gXHRjaGFyICpidWYsICpwO1xuIFx0Y2hhciBkZWw7XG4gXG4gXHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogcmVjZWl2ZWQgJXp1IGJ5dGVzXFxuXCYjMzQ7LCBjb3VudCk7XG4gXG4gXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cbi1cdGVyciA9IC1FSU5WQUw7XG4gXHRpZiAoKGNvdW50IFx1MDAzYyAxMSkgfHwgKGNvdW50IFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1cdGVyciA9IC1FTk9NRU07XG4tXHRtZW1zaXplID0gc2l6ZW9mKE5vZGUpICYjNDM7IGNvdW50ICYjNDM7IDg7XG4tXHRlID0ga21hbGxvYyhtZW1zaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuJiM0MztcdGUgPSBrbWFsbG9jKHN0cnVjdF9zaXplKGUsIGJ1ZiwgY291bnQgJiM0MzsgTUlTQ19ERUxJTV9QQUQpLFxuJiM0MztcdFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4gXHRpZiAoIWUpXG4tXHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gXG4tXHRwID0gYnVmID0gKGNoYXIgKillICYjNDM7IHNpemVvZihOb2RlKTtcbiYjNDM7XHRwID0gYnVmID0gZS1cdTAwM2VidWY7XG4gXG4tXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKE5vZGUpKTtcbiYjNDM7XHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4gXHRpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSlcbi1cdFx0Z290byBlZmF1bHQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbiBcbi1cdGRlbCA9ICpwJiM0MzsmIzQzOztcdC8qIGRlbGltZXRlciAqL1xuJiM0MztcdGRlbCA9ICpwJiM0MzsmIzQzOztcdC8qIGRlbGltaXRlciAqL1xuIFxuIFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGRlbGltOiAlI3ggeyVjfVxcblwmIzM0OywgZGVsLCBkZWwpO1xuIFxuIFx0LyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi9cbi1cdG1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgOCk7XG4mIzQzO1x0bWVtc2V0KGJ1ZiAmIzQzOyBjb3VudCwgZGVsLCBNSVNDX0RFTElNX1BBRCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtuYW1lJiMzOTsgZmllbGQuICovXG4gXHRlLVx1MDAzZW5hbWUgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VuYW1lWzBdIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy5cJiMzNDspIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy4uXCYjMzQ7KSB8fFxuIFx0ICAgIHN0cmNocihlLVx1MDAzZW5hbWUsICYjMzk7LyYjMzk7KSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBuYW1lOiB7JXN9XFxuXCYjMzQ7LCBlLVx1MDAzZW5hbWUpO1xuIFxuQEAgLTM5OCwxMzQgJiM0Mzs0ODIsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRzd2l0Y2ggKCpwJiM0MzsmIzQzOykge1xuIFx0Y2FzZSAmIzM5O0UmIzM5OzpcbiBcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IEUgKGV4dGVuc2lvbilcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gMSBcdTAwM2NcdTAwM2MgRW5hYmxlZDtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgJiMzOTtNJiMzOTs6XG4gXHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gKDEgXHUwMDNjXHUwMDNjIEVuYWJsZWQpIHwgKDEgXHUwMDNjXHUwMDNjIE1hZ2ljKTtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdH1cbiBcdGlmICgqcCYjNDM7JiM0MzsgIT0gZGVsKVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdGlmICh0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAmIzM5O00mIzM5OyAobWFnaWMpIGZvcm1hdC4gKi9cbi1cdFx0Y2hhciAqcztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovXG4tXHRcdHMgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFzKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcyA9ICYjMzk7XFwwJiMzOTs7XG4tXHRcdGlmIChwICE9IHMpIHtcbi1cdFx0XHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpO1xuLVx0XHRcdGlmIChyICE9IDAgfHwgZS1cdTAwM2VvZmZzZXQgXHUwMDNjIDApXG4tXHRcdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0fVxuLVx0XHRwID0gcztcbi1cdFx0aWYgKCpwJiM0MzsmIzQzOylcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYWdpY1swXSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIHAgLSBlLVx1MDAzZW1hZ2ljKTtcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hc2sgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4tXHRcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbi1cdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwmIzM0Oyk7XG4tXHRcdH0gZWxzZSBpZiAoVVNFX0RFQlVHKVxuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCYjMzQ7LFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYXNrLCBwIC0gZS1cdTAwM2VtYXNrKTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy5cbi1cdFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxuLVx0XHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxuLVx0XHQgKiBpdCBlbmNvdW50ZXJzLlxuLVx0XHQgKi9cbi1cdFx0ZS1cdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYWdpYywgVU5FU0NBUEVfSEVYKTtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fFxuLVx0XHQgICAgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwmIzM0OywgZS1cdTAwM2VzaXplKTtcbi1cdFx0aWYgKFVTRV9ERUJVRykge1xuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdFx0aW50IGk7XG4tXHRcdFx0XHRjaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbi1cbi1cdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0XHRpZiAobWFza2VkKSB7XG4tXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGUtXHUwMDNlc2l6ZTsgJiM0MzsmIzQzO2kpXG4tXHRcdFx0XHRcdFx0bWFza2VkW2ldID0gZS1cdTAwM2VtYWdpY1tpXSBcdTAwMjYgZS1cdTAwM2VtYXNrW2ldO1xuLVx0XHRcdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRcdFx0a2ZyZWUobWFza2VkKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJiMzOTtFJiMzOTsgKGV4dGVuc2lvbikgZm9ybWF0LiAqL1xuLVxuLVx0XHQvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbi1cdFx0ZS1cdTAwM2VtYWdpYyA9IHA7XG4tXHRcdHAgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcCYjNDM7JiM0MzsgPSAmIzM5O1xcMCYjMzk7O1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICYjMzk7LyYjMzk7KSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFNraXAgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiYjNDM7XHRcdHAgPSBwYXJzZV9tYWdpY19maWVsZHMoZSwgcCwgZGVsKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwID0gcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhlLCBwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuIFx0LyogUGFyc2UgdGhlICYjMzk7aW50ZXJwcmV0ZXImIzM5OyBmaWVsZC4gKi9cbiBcdGUtXHUwMDNlaW50ZXJwcmV0ZXIgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VpbnRlcnByZXRlclswXSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtmbGFncyYjMzk7IGZpZWxkLiAqL1xuQEAgLTUzMywyNCAmIzQzOzUxNiwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmICgqcCA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRwJiM0MzsmIzQzOztcbiBcdGlmIChwICE9IGJ1ZiAmIzQzOyBjb3VudClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRyZXR1cm4gZTtcbi1cbi1vdXQ6XG4tXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tZWZhdWx0OlxuLVx0a2ZyZWUoZSk7XG4tXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbi1laW52YWw6XG4tXHRrZnJlZShlKTtcbi1cdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuJiM0MztcdHJldHVybiBub19mcmVlX3B0cihlKTtcbiB9XG4gXG4mIzQzOy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXHUwMDNjZW50cnlcdTAwM2UgZmlsZXMuICovXG4mIzQzO2VudW0gYm1fY29tbWFuZCB7XG4mIzQzO1x0Qk1fQ01EX0lHTk9SRSxcdC8qIGVtcHR5IHdyaXRlICovXG4mIzQzO1x0Qk1fQ01EX0RJU0FCTEUsXHQvKiBcJiMzNDswXCYjMzQ7ICovXG4mIzQzO1x0Qk1fQ01EX0VOQUJMRSxcdC8qIFwmIzM0OzFcJiMzNDsgKi9cbiYjNDM7XHRCTV9DTURfUkVNT1ZFLFx0LyogXCYjMzQ7LTFcJiMzNDsgKi9cbiYjNDM7fTtcbiYjNDM7XG4gLypcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxuLSAqICYjMzk7MSYjMzk7IGVuYWJsZXMsICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjXG4mIzQzOyAqIFBhcnNlIHdoYXQgdXNlcnNwYWNlIHdyb3RlIHRvIC9zdGF0dXMgb3IgYW4gZW50cnkgZmlsZTogJiMzOTsxJiMzOTsgZW5hYmxlcyxcbiYjNDM7ICogJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy5cbiAgKi9cbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIHtcbkBAIC01NjEsNjIgJiM0Mzs1NDIsNjQgQEAgc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRpZiAoIWNvdW50KVxuLVx0XHRyZXR1cm4gMDtcbiYjNDM7XHRcdHJldHVybiBCTV9DTURfSUdOT1JFO1xuIFx0aWYgKHNbY291bnQgLSAxXSA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRjb3VudC0tO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTswJiMzOTspXG4tXHRcdHJldHVybiAxO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9ESVNBQkxFO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTsxJiMzOTspXG4tXHRcdHJldHVybiAyO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9FTkFCTEU7XG4gXHRpZiAoY291bnQgPT0gMiBcdTAwMjZcdTAwMjYgc1swXSA9PSAmIzM5Oy0mIzM5OyBcdTAwMjZcdTAwMjYgc1sxXSA9PSAmIzM5OzEmIzM5Oylcbi1cdFx0cmV0dXJuIDM7XG4mIzQzO1x0XHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbiAvKiBnZW5lcmljIHN0dWZmICovXG4gXG4tc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3NlcV9oZXgoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCB1OCAqZGF0YSwgaW50IHNpemUpXG4ge1xuLVx0Y2hhciAqZHAgPSBwYWdlO1xuLVx0Y29uc3QgY2hhciAqc3RhdHVzID0gXCYjMzQ7ZGlzYWJsZWRcJiMzNDs7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2VxX3ByaW50ZihtLCBcJiMzNDslMDJ4XCYjMzQ7LCBkYXRhW2ldKTtcbiYjNDM7fVxuIFxuLVx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuLVx0XHRzdGF0dXMgPSBcJiMzNDtlbmFibGVkXCYjMzQ7O1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBtLVx1MDAzZXByaXZhdGU7XG4gXG4tXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XG4tXHRcdHNwcmludGYocGFnZSwgXCYjMzQ7JXNcXG5cJiMzNDssIHN0YXR1cyk7XG4tXHRcdHJldHVybjtcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZW5hYmxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZGlzYWJsZWRcXG5cJiMzNDspO1xuIFxuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0OyVzXFxuaW50ZXJwcmV0ZXIgJXNcXG5cJiMzNDssIHN0YXR1cywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4mIzQzO1x0c2VxX3ByaW50ZihtLCBcJiMzNDtpbnRlcnByZXRlciAlc1xcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBwcmludCB0aGUgc3BlY2lhbCBmbGFncyAqL1xuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuJiM0MztcdHNlcV9wdXRzKG0sIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKVxuLVx0XHQqZHAmIzQzOyYjNDM7ID0gJiMzOTtQJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O1AmIzM5Oyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O08mIzM5OztcbiYjNDM7XHRcdHNlcV9wdXRjKG0sICYjMzk7TyYjMzk7KTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7QyYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtDJiMzOTspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7RiYjMzk7O1xuLVx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7XFxuJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O0YmIzM5Oyk7XG4mIzQzO1x0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXG4tXHRpZiAoIXRlc3RfYml0KE1hZ2ljLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuLVx0XHRzcHJpbnRmKGRwLCBcJiMzNDtleHRlbnNpb24gLiVzXFxuXCYjMzQ7LCBlLVx1MDAzZW1hZ2ljKTtcbiYjNDM7XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7ZXh0ZW5zaW9uIC4lc1xcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4mIzQzO1x0XHRibV9zZXFfaGV4KG0sIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4gXHRcdGlmIChlLVx1MDAzZW1hc2spIHtcbi1cdFx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7XFxubWFzayBcJiMzNDspO1xuLVx0XHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuJiM0MztcdFx0XHRzZXFfcHV0cyhtLCBcJiMzNDtcXG5tYXNrIFwmIzM0Oyk7XG4mIzQzO1x0XHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuIFx0XHR9XG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O1xcbiYjMzk7O1xuLVx0XHQqZHAgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXHR9XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSlcbiYjNDM7c3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVtb2RlX3QgbW9kZSlcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTtcbiBcbkBAIC02NTIsMTQgJiM0Mzs2MzUsMTQgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqaV9iaW5mbXRfbWlzYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcbiAgKiBzaHV0ZG93bi5cbiAgKlxuLSAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieSBhIHdyaXRlXG4tICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnlcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXG4tICogdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuJiM0MzsgKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnlcbiYjNDM7ICogcmVtb3ZpbmcgdGhlIGVudHJ5IHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIG9yIHVubGluaygyKSB0aGUgZW50cnlcbiYjNDM7ICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKClcbiYjNDM7ICogY2hlY2sgdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuICovXG4gc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbiB7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVx1MDAzZWlfcHJpdmF0ZTtcbiBcbiBcdGNsZWFyX2lub2RlKGlub2RlKTtcbiBcbkBAIC02NjcsODkgJiM0Mzs2NTAsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcbiBcdFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0XHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmUtXHUwMDNlbGlzdCkpXG4tXHRcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0XHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdFx0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdFx0aGxpc3RfZGVsX2luaXRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSk7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRcdHB1dF9iaW5mbXRfaGFuZGxlcihlKTtcbiBcdH1cbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4mIzQzOyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbiYjNDM7ICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXG4mIzQzOyAqXG4mIzQzOyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcbiYjNDM7ICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxuJiM0MzsgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxuJiM0MzsgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxuJiM0MzsgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcbiYjNDM7ICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4mIzQzO3tcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4gICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuICAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHJlbW92ZVxuICAqXG4gICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZFxuLSAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuIFRoaXMgaXMgY2FsbGVkIGZyb21cbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxuLSAqIGFkZGluZyBhIHByb3BlciAtXHUwMDNldW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXImIzM5O3Ncbi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhc1xuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0JiMzOTtzIG5vdCBhIHByZXNzaW5nIGlzc3VlLlxuJiM0MzsgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LlxuICAqL1xuLXN0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIE5vZGUgKmUpXG4mIzQzO3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2RlbF9pbml0KFx1MDAyNmUtXHUwMDNlbGlzdCk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHVubGlua19iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiBcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVx1MDAzZWRlbnRyeSwgTlVMTCk7XG4gfVxuIFxuLS8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuJiM0MzsvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4gXG4tc3RhdGljIHNzaXplX3Rcbi1ibV9lbnRyeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4mIzQzO1x0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xuJiM0MztcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cbiYjNDM7c3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0Tm9kZSAqZSA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9wcml2YXRlO1xuLVx0c3NpemVfdCByZXM7XG4tXHRjaGFyICpwYWdlO1xuJiM0MztcdHN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItXHUwMDNlc19yb290KTtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5leHQ7XG4mIzQzO1xuJiM0MztcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbiYjNDM7XHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiBcbi1cdHBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXBhZ2UpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MzsvKipcbiYjNDM7ICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpXG4mIzQzOyAqIEBkaXI6IGlub2RlIG9mIHRoZSByb290IGRpcmVjdG9yeVxuJiM0MzsgKiBAZGVudHJ5OiBlbnRyeSBmaWxlIHRvIHJlbW92ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmluZyB0aGUgZW50cnkgZmlsZSByZW1vdmVzIGl0cyBiaW5hcnkgdHlwZSBoYW5kbGVyLCBleGFjdGx5IGxpa2VcbiYjNDM7ICogd3JpdGluZyAtMSB0byBpdCBkb2VzLiBUaGUgc3RhdHVzIGFuZCByZWdpc3RlciBjb250cm9sIGZpbGVzIGNhbiYjMzk7dCBiZVxuJiM0MzsgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcbiYjNDM7ICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcbiYjNDM7XHRpZiAoIWUpXG4mIzQzO1x0XHRyZXR1cm4gLUVQRVJNO1xuJiM0MztcbiYjNDM7XHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcbiYjNDM7XHRyZXR1cm4gc2ltcGxlX3VubGluayhkaXIsIGRlbnRyeSk7XG4mIzQzO31cbiBcbi1cdGVudHJ5X3N0YXR1cyhlLCBwYWdlKTtcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0ge1xuJiM0MztcdC5sb29rdXBcdFx0PSBzaW1wbGVfbG9va3VwLFxuJiM0MztcdC51bmxpbmtcdFx0PSBibV91bmxpbmssXG4mIzQzO307XG4gXG4tXHRyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGFnZSwgc3RybGVuKHBhZ2UpKTtcbiYjNDM7LyogL1x1MDAzY2VudHJ5XHUwMDNlICovXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuIFxuLVx0a2ZyZWUocGFnZSk7XG4tXHRyZXR1cm4gcmVzO1xuJiM0MztcdHJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIGJtX2VudHJ5X3Nob3csIGlub2RlLVx1MDAzZWlfcHJpdmF0ZSk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXG4mIzQzO1x0aWYgKGZpbGUtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9XUklURSlcbiYjNDM7XHRcdGZpbGUtXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFx0aW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7XG4gXG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0Y2xlYXJfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRjbGVhcl9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0c2V0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRzZXRfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDM6XG4tXHRcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXG4tXHRcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGlub2RlKSwgZSk7XG4tXG4tXHRcdGlub2RlX3VubG9jayhpbm9kZSk7XG4mIzQzO1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuJiM0MztcdFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtNzU5LDE1ICYjNDM7Nzg1LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIH1cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xuLVx0LnJlYWRcdFx0PSBibV9lbnRyeV9yZWFkLFxuJiM0MztcdC5vcGVuXHRcdD0gYm1fZW50cnlfb3BlbixcbiYjNDM7XHQucmVhZFx0XHQ9IHNlcV9yZWFkLFxuIFx0LndyaXRlXHRcdD0gYm1fZW50cnlfd3JpdGUsXG4tXHQubGxzZWVrXHRcdD0gZGVmYXVsdF9sbHNlZWssXG4mIzQzO1x0Lmxsc2Vla1x0XHQ9IHNlcV9sc2VlayxcbiYjNDM7XHQucmVsZWFzZVx0PSBzaW5nbGVfcmVsZWFzZSxcbiB9O1xuIFxuIC8qIC9yZWdpc3RlciAqL1xuIFxuIC8qIGFkZCB0byBmaWxlc3lzdGVtICovXG4tc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7c3RhdGljIGludCBhZGRfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbiBcdHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHNpbXBsZV9zdGFydF9jcmVhdGluZyhzYi1cdTAwM2VzX3Jvb3QsIGUtXHUwMDNlbmFtZSk7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuQEAgLTc4OSw5ICYjNDM7ODE3LDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcbiBcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZlLVx1MDAzZWxpc3QsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4mIzQzO1x0aGxpc3RfYWRkX2hlYWRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTc5OSwxMyAmIzQzOzgyNywxMiBAQCBzdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHROb2RlICplO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2I7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcbiYjNDM7XHRpbnQgZXJyO1xuIFxuIFx0ZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTtcbi1cbiBcdGlmIChJU19FUlIoZSkpXG4gXHRcdHJldHVybiBQVFJfRVJSKGUpO1xuIFxuQEAgLTgyMiw3ICYjNDM7ODQ5LDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdGlmIChJU19FUlIoZikpIHtcbiBcdFx0XHRwcl9ub3RpY2UoXCYjMzQ7cmVnaXN0ZXI6IGZhaWxlZCB0byBpbnN0YWxsIGludGVycHJldGVyIGZpbGUgJXNcXG5cJiMzNDssXG4gXHRcdFx0XHQgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4tXHRcdFx0a2ZyZWUoZSk7XG4gXHRcdFx0cmV0dXJuIFBUUl9FUlIoZik7XG4gXHRcdH1cbiBcdFx0ZS1cdTAwM2VpbnRlcnBfZmlsZSA9IGY7XG5AQCAtODM0LDkgJiM0Mzs4NjAsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGYpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XG4gXHRcdH1cbi1cdFx0a2ZyZWUoZSk7XG4gXHRcdHJldHVybiBlcnI7XG4gXHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xuJiM0MztcdHJldGFpbl9hbmRfbnVsbF9wdHIoZSk7XG4gXHRyZXR1cm4gY291bnQ7XG4gfVxuIFxuQEAgLTg1MSwxMCAmIzQzOzg3OSwxMCBAQCBzdGF0aWMgc3NpemVfdFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4ge1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuLVx0Y2hhciAqcztcbiYjNDM7XHRjb25zdCBjaGFyICpzO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4tXHRzID0gbWlzYy1cdTAwM2VlbmFibGVkID8gXCYjMzQ7ZW5hYmxlZFxcblwmIzM0OyA6IFwmIzM0O2Rpc2FibGVkXFxuXCYjMzQ7O1xuJiM0MztcdHMgPSBSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSA/IFwmIzM0O2VuYWJsZWRcXG5cJiMzNDsgOiBcJiMzNDtkaXNhYmxlZFxcblwmIzM0OztcbiBcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTtcbiB9XG4gXG5AQCAtODYzLDM3ICYjNDM7ODkxLDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbi1cdE5vZGUgKmUsICpuZXh0O1xuLVx0c3RydWN0IGlub2RlICppbm9kZTtcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuIFx0c3dpdGNoIChyZXMpIHtcbi1cdGNhc2UgMTpcbi1cdFx0LyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgZmFsc2UpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSAzOlxuLVx0XHQvKiBEZWxldGUgYWxsIGhhbmRsZXJzLiAqL1xuLVx0XHRpbm9kZSA9IGRfaW5vZGUoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpXG4tXHRcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuJiM0MztcdGNhc2UgQk1fQ01EX1JFTU9WRTpcbiYjNDM7XHRcdGJtX3JlbW92ZV9hbGxfZW50cmllcyhtaXNjLCBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtOTE4LDcgJiM0Mzs5MjYsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xuIH1cbiBcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XG4gXHQuc3RhdGZzXHRcdD0gc2ltcGxlX3N0YXRmcyxcbiBcdC5ldmljdF9pbm9kZVx0PSBibV9ldmljdF9pbm9kZSxcbiBcdC5wdXRfc3VwZXJcdD0gYm1fcHV0X3N1cGVyLFxuQEAgLTk2NSwxMCAmIzQzOzk3MywxMCBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0XHRpZiAoIW1pc2MpXG4gXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gXG4tXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHRcdHJ3bG9ja19pbml0KFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdElOSVRfSExJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFxuLVx0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovXG4mIzQzO1x0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXG4gXHRcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNnVzZXJfbnMtXHUwMDNlYmluZm10X21pc2MsIG1pc2MpO1xuIFx0fVxuIFxuQEAgLTk4MywxMiAmIzQzOzk5MSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0ICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseVxuIFx0ICogcmVzZXQgLVx1MDAzZWVuYWJsZWQgdG8gdHJ1ZS5cbiBcdCAqL1xuLVx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXG4gXHRlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgQklORk1URlNfTUFHSUMsIGJtX2ZpbGVzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2c19vcHM7XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcbiYjNDM7XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2Ym1fc3VwZXJfb3BzO1xuJiM0MztcdGRfaW5vZGUoc2ItXHUwMDNlc19yb290KS1cdTAwM2VpX29wID0gXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJtX2ZyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuQEAgLTEwMSw4ICYjNDM7MTAxLDggQEAgc3RydWN0IGxpbnV4X2JpbmZtdCB7XG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7XG4tXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XG4mIzQzO1x0c3RydWN0IGhsaXN0X2hlYWQgZW50cmllcztcbiYjNDM7XHRzcGlubG9ja190IGVudHJpZXNfbG9jaztcbiBcdGJvb2wgZW5hYmxlZDtcbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuY1xuaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NFxuLS0tIGEva2VybmVsL3VzZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3VzZXIuY1xuQEAgLTIzLDkgJiM0MzsyMyw5IEBAXG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyBpbml0X2JpbmZtdF9taXNjID0ge1xuLVx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxuJiM0MztcdC5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULFxuIFx0LmVuYWJsZWQgPSB0cnVlLFxuLVx0LmVudHJpZXNfbG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChpbml0X2JpbmZtdF9taXNjLmVudHJpZXNfbG9jayksXG4mIzQzO1x0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcbiB9O1xuIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpO1xuICNlbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtibV9yZWdpc3Rlcl93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9zdGF0dXNfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fdW5saW5rJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2lnbmlmaWNhbnRseSByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0sIGludHJvZHVjaW5nIFJDVS1iYXNlZCBsb29rdXBzLCBjaGFuZ2luZyBpbnRlcm5hbCBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBjb252ZXJ0aW5nIGVudHJ5IHJlYWRpbmcgdG8gdXNlIHNlcV9maWxlLCBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIHJlbW92aW5nIGVudHJpZXMgdmlhIHVubGluaygyKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBubyByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBpc3N1ZXMgd2VyZSBpbnRyb2R1Y2VkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhODc3ZGIxYmZiN2QyZDhhNWJjZmVhMDNmM2ZjMTEyYzg0MDNhZDMyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBKdWwgMTAgMjA6MzI6MzcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0CmluZGV4IGMwYTM0ZmJmODAyMmI1Li4zMDZlZjQ4ZjVkZTZkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QKQEAgLTEzMyw3ICYjNDM7MTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvcgogQ2F0dGluZyB0aGUgZmlsZSB0ZWxscyB5b3UgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGBgYmluZm10X21pc2MvdGhlX2VudHJ5YGAuCiAKIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAKLW9yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLgomIzQzO29yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLiBBIHNpbmdsZSBlbnRyeSBjYW4gYWxzbyBiZSByZW1vdmVkCiYjNDM7Ynkgc2ltcGx5IHVubGlua2luZyAoYGBybWBgKSBgYC9wcm9jLy4uLi90aGVfbmFtZWBgLgogCiAKIEhpbnRzCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuYwppbmRleCA4NDM0OWZjYjkzZjEzYS4uZjUxZDI3MjY5ODYxNjAgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvYmluZm10X21pc2MuYwpAQCAtMTAsNDUgJiM0MzsxMCw0NiBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICYjMzQ7OiAmIzM0OyBmbXQKIAotI2luY2x1ZGUgJmx0O2xpbnV4L2tlcm5lbC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2hleC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC9tbS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYmluZm10cy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYml0b3BzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVnLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NsZWFudXAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY3JlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2N0eXBlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc3RyaW5nX2hlbHBlcnMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9maWxlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L25hbWVpLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbW91bnQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9mc19jb250ZXh0LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc3lzY2FsbHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mc19jb250ZXh0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva3N0cnRveC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tYWdpYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJpbnRrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JjdWxpc3QuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmVmY291bnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2VxX2ZpbGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RyaW5nX2hlbHBlcnMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgmZ3Q7CiAKLSNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7Ci0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgVVNFX0RFQlVHIDEKLSNlbHNlCi0jIGRlZmluZSBVU0VfREVCVUcgMAotI2VuZGlmCi0KLWVudW0gewotCVZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqLwomIzQzOy8qIEVudHJ5IHN0YXR1cyBhbmQgbWF0Y2ggdHlwZSBiaXQgbnVtYmVycy4gKi8KJiM0MztlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2JpdHMgewomIzQzOwlNSVNDX0ZNVF9FTkFCTEVEX0JJVAk9IDAsCiYjNDM7CU1JU0NfRk1UX01BR0lDX0JJVAk9IDEsCiB9OwogCi1lbnVtIHtFbmFibGVkLCBNYWdpY307Ci0jZGVmaW5lIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwICgxVUwgJmx0OyZsdDsgMzEpCi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fQklOQVJZICgxVUwgJmx0OyZsdDsgMzApCi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgJmx0OyZsdDsgMjkpCi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fRklMRSAoMVVMICZsdDsmbHQ7IDI4KQomIzQzOy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi8KJiM0MztlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2ZsYWdzIHsKJiM0MzsJTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAJPSAoMVUgJmx0OyZsdDsgMzEpLAomIzQzOwlNSVNDX0ZNVF9PUEVOX0JJTkFSWQk9ICgxVSAmbHQ7Jmx0OyAzMCksCiYjNDM7CU1JU0NfRk1UX0NSRURFTlRJQUxTCT0gKDFVICZsdDsmbHQ7IDI5KSwKJiM0MzsJTUlTQ19GTVRfT1BFTl9GSUxFCT0gKDFVICZsdDsmbHQ7IDI4KSwKJiM0Mzt9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwomIzQzO3N0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSB7CiYjNDM7CXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIHR5cGUsIHN0YXR1cywgZXRjLiAqLwogCWludCBvZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIG1hZ2ljICovCiAJaW50IHNpemU7CQkJLyogc2l6ZSBvZiBtYWdpYy9tYXNrICovCkBAIC01OSw5ICYjNDM7NjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTsKIAlyZWZjb3VudF90IHVzZXJzOwkJLyogc3luYyByZW1vdmFsIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpICovCi19IE5vZGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlOwomIzQzOwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwomIzQzOwljaGFyIGJ1ZltdOwkJCS8qIHJlZ2lzdGVyIHN0cmluZywgZmllbGRzIHBvaW50IGluIGhlcmUgKi8KJiM0Mzt9OwogCiAvKgogICogTWF4IGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc3RyaW5nLiAgRGV0ZXJtaW5lZCBieToKQEAgLTc0LDEwICYjNDM7NzUsMzYgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7CiAgKiAgLSBpbnRlcnA6IH41MCBieXRlcwogICogIC0gZmxhZ3M6ICA1IGJ5dGVzCiAgKiBSb3VuZCB0aGF0IHVwIGEgYml0LCBhbmQgdGhlbiBiYWNrIG9mZiB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhCi0gKiAobGlrZSBzdHJ1Y3QgTm9kZSkuCiYjNDM7ICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS4KICAqLwogI2RlZmluZSBNQVhfUkVHSVNURVJfTEVOR1RIIDE5MjAKIAomIzQzOy8qIFRyYWlsaW5nIGRlbGltaXRlciBwYWQgc28gZmllbGQgcGFyc2luZyBhbHdheXMgdGVybWluYXRlcyBhdCBhIGRlbGltaXRlci4gKi8KJiM0MzsjZGVmaW5lIE1JU0NfREVMSU1fUEFEIDgKJiM0MzsKJiM0MzsvKiBDaGVjayBpZiBAZSYjMzk7cyBtYWdpYyBtYXRjaGVzIEBicHJtJiMzOTtzIGJ1ZmZlciwgYXBwbHlpbmcgdGhlIG1hc2sgaWYgc2V0LiAqLwomIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLAomIzQzOwkJCQljb25zdCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQomIzQzO3sKJiM0MzsJY29uc3QgY2hhciAqcyA9IGJwcm0tJmd0O2J1ZiAmIzQzOyBlLSZndDtvZmZzZXQ7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoIWUtJmd0O21hc2spCiYjNDM7CQlyZXR1cm4gIW1lbWNtcChzLCBlLSZndDttYWdpYywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBlLSZndDtzaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCWlmICgoc1tpXSBeIGUtJmd0O21hZ2ljW2ldKSAmYW1wOyBlLSZndDttYXNrW2ldKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOy8qIENoZWNrIGlmIEBlJiMzOTtzIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIG1hdGNoZXMgQGV4dCwgTlVMTCBpZiB0aGVyZSBpcyBub25lLiAqLwomIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGNvbnN0IHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwKJiM0MzsJCQkJICAgIGNvbnN0IGNoYXIgKmV4dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBleHQgJmFtcDsmYW1wOyAhc3RyY21wKGUtJmd0O21hZ2ljLCBleHQpOwomIzQzO30KJiM0MzsKIC8qKgogICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybQogICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZQpAQCAtODYsNDMgJiM0MzsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7CiAgKiBTZWFyY2ggZm9yIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmb3IgQGJwcm0gaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBiaW5hcnkKICAqIHR5cGUgaGFuZGxlcnMuCiAgKgomIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBSQ1UgcmVhZCBsb2NrLgomIzQzOyAqCiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAotCQkJCSAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqCiYjNDM7c2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQljaGFyICpwID0gc3RycmNocihicHJtLSZndDtpbnRlcnAsICYjMzk7LiYjMzk7KTsKLQlOb2RlICplOwomIzQzOwljaGFyICpkb3QgPSBzdHJyY2hyKGJwcm0tJmd0O2ludGVycCwgJiMzOTsuJiMzOTspOwomIzQzOwljb25zdCBjaGFyICpleHQgPSBkb3QgPyBkb3QgJiM0MzsgMSA6IE5VTEw7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTsKIAogCS8qIFdhbGsgYWxsIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZSwgJmFtcDttaXNjLSZndDtlbnRyaWVzLCBsaXN0KSB7Ci0JCWNoYXIgKnM7Ci0JCWludCBqOwotCiYjNDM7CWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIG5vZGUpIHsKIAkJLyogTWFrZSBzdXJlIHRoaXMgb25lIGlzIGN1cnJlbnRseSBlbmFibGVkLiAqLwotCQlpZiAoIXRlc3RfYml0KEVuYWJsZWQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKQomIzQzOwkJaWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncykpCiAJCQljb250aW51ZTsKIAotCQkvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi8KLQkJaWYgKCF0ZXN0X2JpdChNYWdpYywgJmFtcDtlLSZndDtmbGFncykpIHsKLQkJCWlmIChwICZhbXA7JmFtcDsgIXN0cmNtcChlLSZndDttYWdpYywgcCAmIzQzOyAxKSkKJiM0MzsJCWlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKSB7CiYjNDM7CQkJaWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpCiAJCQkJcmV0dXJuIGU7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIERvIG1hdGNoaW5nIGJhc2VkIG9uIG1hZ2ljICZhbXA7IG1hc2suICovCi0JCXMgPSBicHJtLSZndDtidWYgJiM0MzsgZS0mZ3Q7b2Zmc2V0OwotCQlpZiAoZS0mZ3Q7bWFzaykgewotCQkJZm9yIChqID0gMDsgaiAmbHQ7IGUtJmd0O3NpemU7IGomIzQzOyYjNDM7KQotCQkJCWlmICgoKnMmIzQzOyYjNDM7IF4gZS0mZ3Q7bWFnaWNbal0pICZhbXA7IGUtJmd0O21hc2tbal0pCi0JCQkJCWJyZWFrOwogCQl9IGVsc2UgewotCQkJZm9yIChqID0gMDsgaiAmbHQ7IGUtJmd0O3NpemU7IGomIzQzOyYjNDM7KQotCQkJCWlmICgoKnMmIzQzOyYjNDM7IF4gZS0mZ3Q7bWFnaWNbal0pKQotCQkJCQlicmVhazsKJiM0MzsJCQlpZiAoZW50cnlfbWF0Y2hlc19leHRlbnNpb24oZSwgZXh0KSkKJiM0MzsJCQkJcmV0dXJuIGU7CiAJCX0KLQkJaWYgKGogPT0gZS0mZ3Q7c2l6ZSkKLQkJCXJldHVybiBlOwogCX0KIAogCXJldHVybiBOVUxMOwpAQCAtMTM0LDY0ICYjNDM7MTQ4LDY5IEBAIHN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAogICogQGJwcm06IGJpbmFyeSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgZm9yIGEgaGFuZGxlcgogICoKICAqIFRyeSB0byBmaW5kIGEgYmluZm10IGhhbmRsZXIgZm9yIHRoZSBiaW5hcnkgdHlwZS4gSWYgb25lIGlzIGZvdW5kIHRha2UgYQotICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLgomIzQzOyAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gVGhlCiYjNDM7ICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kCiYjNDM7ICogYSByZXN0YXJ0ZWQgc2VhcmNoIGNhbm5vdCBmaW5kIGFuIHVubGlua2VkIGVudHJ5IGFnYWluIHNvIHRoZSByZXRyeSBsb29wCiYjNDM7ICogaXMgYm91bmRlZC4KICAqCiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyBOb2RlICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAotCQkJCXN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywKJiM0MzsJCQkJCQkgICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQlOb2RlICplOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7CiAKLQlyZWFkX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwotCWUgPSBzZWFyY2hfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7Ci0JaWYgKGUpCi0JCXJlZmNvdW50X2luYygmYW1wO2UtJmd0O3VzZXJzKTsKLQlyZWFkX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CWd1YXJkKHJjdSkoKTsKJiM0MzsJZG8gewomIzQzOwkJZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTsKJiM0MzsJfSB3aGlsZSAoZSAmYW1wOyZhbXA7ICFyZWZjb3VudF9pbmNfbm90X3plcm8oJmFtcDtlLSZndDt1c2VycykpOwogCXJldHVybiBlOwogfQogCiAvKioKLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlCi0gKiBAZTogbm9kZSB0byBwdXQKJiM0MzsgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnkKJiM0MzsgKiBAZTogZW50cnkgdG8gcHV0CiAgKgotICogRnJlZSBub2RlIHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG8KJiM0MzsgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG8KICAqIGxvYWRfbWlzY19iaW5hcnkoKSBpbiBjYXNlIGl0IGlzIHVzaW5nIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIHdlIHdlcmUKICAqIHJlcXVlc3RlZCB0byByZW1vdmUuCiAgKi8KLXN0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihOb2RlICplKQomIzQzO3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpCiB7CiAJaWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdCgmYW1wO2UtJmd0O3VzZXJzKSkgewotCQlpZiAoZS0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9GSUxFKQomIzQzOwkJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fRklMRSkgewomIzQzOwkJCWV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLSZndDtpbnRlcnBfZmlsZSk7CiAJCQlmaWxwX2Nsb3NlKGUtJmd0O2ludGVycF9maWxlLCBOVUxMKTsKLQkJa2ZyZWUoZSk7CiYjNDM7CQl9CiYjNDM7CQkvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqLwomIzQzOwkJa2ZyZWVfcmN1KGUsIHJjdSk7CiAJfQogfQogCiYjNDM7REVGSU5FX0ZSRUUocHV0X2JpbmZtdF9oYW5kbGVyLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKiwgaWYgKF9UKSBwdXRfYmluZm10X2hhbmRsZXIoX1QpKQomIzQzOwogLyoqCi0gKiBsb2FkX2JpbmZtdF9taXNjIC0gbG9hZCB0aGUgYmluZm10X21pc2Mgb2YgdGhlIGNhbGxlciYjMzk7cyB1c2VyIG5hbWVzcGFjZQomIzQzOyAqIGN1cnJlbnRfYmluZm10X21pc2MgLSBnZXQgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2UKICAqCi0gKiBUbyBiZSBjYWxsZWQgaW4gbG9hZF9taXNjX2JpbmFyeSgpIHRvIGxvYWQgdGhlIHJlbGV2YW50IHN0cnVjdCBiaW5mbXRfbWlzYy4KLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IGNhbiBtYWtlIHVzZQotICogb2YgaXRzIGFuY2VzdG9yJiMzOTtzIGJpbmZtdF9taXNjIGhhbmRsZXJzLiBUaGlzIG1pbWlja3MgdGhlIGJlaGF2aW9yIG9mCi0gKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBiaW5mbXRfbWlzYyBoYW5kbGVycyB3aGVyZQotICogYXZhaWxhYmxlIHRvIGFsbCB1c2VyIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4KJiM0MzsgKiBJZiBhIHVzZXIgbmFtZXNwYWNlIGRvZXNuJiMzOTt0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCB1c2VzIHRoZQomIzQzOyAqIGhhbmRsZXJzIG9mIGl0cyBjbG9zZXN0IGFuY2VzdG9yIHdpdGggb25lLiBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YKJiM0MzsgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZQomIzQzOyAqIHRvIGFsbCB1c2VycyBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uIFRoZSBpbml0IHVzZXIgbmFtZXNwYWNlCiYjNDM7ICogaW5zdGFuY2UgaXMgc3RhdGljYWxseSBzZXQgdXAgc28gdGhlIGZhbGxiYWNrIGlzIG5ldmVyIHJlYWNoZWQgaW4KJiM0MzsgKiBwcmFjdGljZS4KICAqCiAgKiBSZXR1cm46IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZCkKJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpjdXJyZW50X2JpbmZtdF9taXNjKHZvaWQpCiB7CiAJY29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOwogCXN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYzsKIAotCXVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTsKLQl3aGlsZSAodXNlcl9ucykgewomIzQzOwlmb3IgKHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTsgdXNlcl9uczsgdXNlcl9ucyA9IHVzZXJfbnMtJmd0O3BhcmVudCkgewogCQkvKiBQYWlycyB3aXRoIHNtcF9zdG9yZV9yZWxlYXNlKCkgaW4gYm1fZmlsbF9zdXBlcigpLiAqLwogCQltaXNjID0gc21wX2xvYWRfYWNxdWlyZSgmYW1wO3VzZXJfbnMtJmd0O2JpbmZtdF9taXNjKTsKIAkJaWYgKG1pc2MpCiAJCQlyZXR1cm4gbWlzYzsKLQotCQl1c2VyX25zID0gdXNlcl9ucy0mZ3Q7cGFyZW50OwogCX0KIAogCXJldHVybiAmYW1wO2luaXRfYmluZm10X21pc2M7CkBAIC0yMDIsMzAgJiM0MzsyMjEsMjkgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKQogICovCiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQlOb2RlICpmbXQ7Ci0Jc3RydWN0IGZpbGUgKmludGVycF9maWxlID0gTlVMTDsKLQlpbnQgcmV0dmFsID0gLUVOT0VYRUM7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZm10IF9fZnJlZShwdXRfYmluZm10X2hhbmRsZXIpID0gTlVMTDsKJiM0MzsJc3RydWN0IGZpbGUgKmludGVycF9maWxlOwogCXN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYzsKJiM0MzsJaW50IHJldHZhbDsKIAotCW1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7Ci0JaWYgKCFtaXNjLSZndDtlbmFibGVkKQotCQlyZXR1cm4gcmV0dmFsOwomIzQzOwltaXNjID0gY3VycmVudF9iaW5mbXRfbWlzYygpOwomIzQzOwlpZiAoIVJFQURfT05DRShtaXNjLSZndDtlbmFibGVkKSkKJiM0MzsJCXJldHVybiAtRU5PRVhFQzsKIAogCWZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTsKIAlpZiAoIWZtdCkKLQkJcmV0dXJuIHJldHZhbDsKJiM0MzsJCXJldHVybiAtRU5PRVhFQzsKIAogCS8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi8KLQlyZXR2YWwgPSAtRU5PRU5UOwogCWlmIChicHJtLSZndDtpbnRlcnBfZmxhZ3MgJmFtcDsgQklOUFJNX0ZMQUdTX1BBVEhfSU5BQ0NFU1NJQkxFKQotCQlnb3RvIHJldDsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKGZtdC0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApIHsKIAkJYnBybS0mZ3Q7aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19QUkVTRVJWRV9BUkdWMDsKIAl9IGVsc2UgewogCQlyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7CiAJCWlmIChyZXR2YWwpCi0JCQlnb3RvIHJldDsKJiM0MzsJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCWlmIChmbXQtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fQklOQVJZKQpAQCAtMjM0LDU3ICYjNDM7MjUyLDQ4IEBAIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogCS8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovCiAJcmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGJwcm0tJmd0O2ludGVycCwgYnBybSk7CiAJaWYgKHJldHZhbCAmbHQ7IDApCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIHJldHZhbDsKIAlicHJtLSZndDthcmdjJiM0MzsmIzQzOzsKIAogCS8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi8KIAlyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoZm10LSZndDtpbnRlcnByZXRlciwgYnBybSk7CiAJaWYgKHJldHZhbCAmbHQ7IDApCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIHJldHZhbDsKIAlicHJtLSZndDthcmdjJiM0MzsmIzQzOzsKIAogCS8qIFVwZGF0ZSBpbnRlcnAgaW4gY2FzZSBiaW5mbXRfc2NyaXB0IG5lZWRzIGl0LiAqLwogCXJldHZhbCA9IGJwcm1fY2hhbmdlX2ludGVycChmbXQtJmd0O2ludGVycHJldGVyLCBicHJtKTsKIAlpZiAocmV0dmFsICZsdDsgMCkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gcmV0dmFsOwogCiAJaWYgKGZtdC0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9GSUxFKSB7CiAJCWludGVycF9maWxlID0gZmlsZV9jbG9uZV9vcGVuKGZtdC0mZ3Q7aW50ZXJwX2ZpbGUpOwotCQlpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpCi0JCQlkZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7CiYjNDM7CQlpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHsKJiM0MzsJCQlpbnQgZXJyID0gZXhlX2ZpbGVfZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpOwomIzQzOwomIzQzOwkJCWlmIChlcnIpIHsKJiM0MzsJCQkJZnB1dChpbnRlcnBfZmlsZSk7CiYjNDM7CQkJCWludGVycF9maWxlID0gRVJSX1BUUihlcnIpOwomIzQzOwkJCX0KJiM0MzsJCX0KIAl9IGVsc2UgewogCQlpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyhmbXQtJmd0O2ludGVycHJldGVyKTsKIAl9Ci0JcmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7CiAJaWYgKElTX0VSUihpbnRlcnBfZmlsZSkpCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpOwogCiAJYnBybS0mZ3Q7aW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTsKIAlpZiAoZm10LSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9DUkVERU5USUFMUykKIAkJYnBybS0mZ3Q7ZXhlY2ZkX2NyZWRzID0gMTsKLQotCXJldHZhbCA9IDA7Ci1yZXQ6Ci0KLQkvKgotCSAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvCi0JICogbG9hZF9taXNjX2JpbmFyeSgpIHdpbGwgaGF2ZSBmaW5pc2hlZC4gV2UgYWxzbyBrbm93Ci0JICogdGhhdCBmb3IgdGhlIHJlZmNvdW50IHRvIGJlIHplcm8gc29tZW9uZSBtdXN0IGhhdmUgY29uY3VyZW50bHkKLQkgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0JiMzOTtzIG91ciBqb2IgdG8KLQkgKiBmcmVlIGl0LgotCSAqLwotCXB1dF9iaW5mbXRfaGFuZGxlcihmbXQpOwotCi0JcmV0dXJuIHJldHZhbDsKJiM0MzsJcmV0dXJuIDA7CiB9CiAKIC8qIENvbW1hbmQgcGFyc2VycyAqLwogCiAvKgotICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsCi0gKiByZWNvZ25pc2luZyB0aGUgXHggc3BlY2lhbC4KLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhbgotICogZXJyb3IgKGFuZCBzZXRzIGVycikgb3IgbnVsbCBhcmd1bWVudCBsZW5ndGguCiYjNDM7ICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZwomIzQzOyAqIHRoZSBceCBlc2NhcGUuIFRlcm1pbmF0ZXMgdGhlIGFyZ3VtZW50IHdpdGggYSBOVUwgYW5kIHJldHVybnMgYSBwb2ludGVyCiYjNDM7ICogcGFzdCBpdCBvciBOVUxMIG9uIGEgbWFsZm9ybWVkIGVzY2FwZS4KICAqLwogc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpCiB7CkBAIC0yOTksNDYgJiM0MzszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKQogCQkJCXJldHVybiBOVUxMOwogCQl9CiAJfQotCXNbLTFdID0mIzM5O1wwJiMzOTs7CiYjNDM7CXNbLTFdID0gJiMzOTtcMCYjMzk7OwogCXJldHVybiBzOwogfQogCi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpCiYjNDM7c3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqcCwgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKQogewotCWNoYXIgKnAgPSBzZnM7Ci0JaW50IGNvbnQgPSAxOwotCi0JLyogc3BlY2lhbCBmbGFncyAqLwotCXdoaWxlIChjb250KSB7CiYjNDM7CWZvciAoOzsgcCYjNDM7JiM0MzspIHsKIAkJc3dpdGNoICgqcCkgewogCQljYXNlICYjMzk7UCYjMzk7OgogCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXG4mIzM0Oyk7Ci0JCQlwJiM0MzsmIzQzOzsKIAkJCWUtJmd0O2ZsYWdzIHw9IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwOwogCQkJYnJlYWs7CiAJCWNhc2UgJiMzOTtPJiMzOTs6CiAJCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBmbGFnOiBPIChvcGVuIGJpbmFyeSlcbiYjMzQ7KTsKLQkJCXAmIzQzOyYjNDM7OwogCQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7CiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O0MmIzM5OzoKIAkJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEMgKHByZXNlcnZlIGNyZWRzKVxuJiMzNDspOwotCQkJcCYjNDM7JiM0Mzs7Ci0JCQkvKiB0aGlzIGZsYWdzIGFsc28gaW1wbGllcyB0aGUKLQkJCSAgIG9wZW4tYmluYXJ5IGZsYWcgKi8KLQkJCWUtJmd0O2ZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8Ci0JCQkJCU1JU0NfRk1UX09QRU5fQklOQVJZKTsKJiM0MzsJCQkvKiBDIGltcGxpZXMgTyAqLwomIzQzOwkJCWUtJmd0O2ZsYWdzIHw9IE1JU0NfRk1UX0NSRURFTlRJQUxTIHwgTUlTQ19GTVRfT1BFTl9CSU5BUlk7CiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O0YmIzM5OzoKIAkJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcbiYjMzQ7KTsKLQkJCXAmIzQzOyYjNDM7OwogCQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9GSUxFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQljb250ID0gMDsKJiM0MzsJCQlyZXR1cm4gcDsKIAkJfQogCX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTssICYjMzk7bWFnaWMmIzM5OyBhbmQgJiMzOTttYXNrJiMzOTsgZmllbGRzIG9mIGFuICYjMzk7TSYjMzk7IGVudHJ5LiAqLwomIzQzO3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbCkKJiM0Mzt7CiYjNDM7CWNoYXIgKnM7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqLwomIzQzOwlzID0gc3RyY2hyKHAsIGRlbCk7CiYjNDM7CWlmICghcykKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwkqcyA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJaWYgKHAgIT0gcykgewomIzQzOwkJaWYgKGtzdHJ0b2ludChwLCAxMCwgJmFtcDtlLSZndDtvZmZzZXQpIHx8IGUtJmd0O29mZnNldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsJcCA9IHMgJiM0MzsgMTsKJiM0MzsJcHJfZGVidWcoJiMzNDtyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcbiYjMzQ7LCBlLSZndDtvZmZzZXQpOwomIzQzOwomIzQzOwkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwomIzQzOwllLSZndDttYWdpYyA9IHA7CiYjNDM7CXAgPSBzY2FuYXJnKHAsIGRlbCk7CiYjNDM7CWlmICghcCB8fCAhZS0mZ3Q7bWFnaWNbMF0pCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106ICYjMzQ7LAomIzQzOwkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtJmd0O21hZ2ljLCBwIC0gZS0mZ3Q7bWFnaWMsIHRydWUpOwomIzQzOwomIzQzOwkvKiBQYXJzZSB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovCiYjNDM7CWUtJmd0O21hc2sgPSBwOwomIzQzOwlwID0gc2NhbmFyZyhwLCBkZWwpOwomIzQzOwlpZiAoIXApCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKCFlLSZndDttYXNrWzBdKSB7CiYjNDM7CQllLSZndDttYXNrID0gTlVMTDsKJiM0MzsJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcbiYjMzQ7KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXByaW50X2hleF9kdW1wX2RlYnVnKAomIzQzOwkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogJiMzNDssCiYjNDM7CQkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtJmd0O21hc2ssIHAgLSBlLSZndDttYXNrLCB0cnVlKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBEZWNvZGUgdGhlIG1hZ2ljICZhbXA7IG1hc2sgZmllbGRzLiBOb3RlOiB3aGlsZSB3ZSBtaWdodCBoYXZlIGFjY2VwdGVkCiYjNDM7CSAqIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyB3aWxsIHN0b3AgYXQKJiM0MzsJICogdGhlIGZpcnN0IG9uZSB0aGV5IGVuY291bnRlci4KJiM0MzsJICovCiYjNDM7CWUtJmd0O3NpemUgPSBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLSZndDttYWdpYywgVU5FU0NBUEVfSEVYKTsKJiM0MzsJaWYgKGUtJmd0O21hc2sgJmFtcDsmYW1wOyBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLSZndDttYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtJmd0O3NpemUpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKGUtJmd0O3NpemUgJmd0OyBCSU5QUk1fQlVGX1NJWkUgfHwgQklOUFJNX0JVRl9TSVpFIC0gZS0mZ3Q7c2l6ZSAmbHQ7IGUtJmd0O29mZnNldCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcbiYjMzQ7LCBlLSZndDtzaXplKTsKJiM0MzsJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiAmIzM0OywKJiM0MzsJCURVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLSZndDttYWdpYywgZS0mZ3Q7c2l6ZSwgdHJ1ZSk7CiYjNDM7CWlmIChlLSZndDttYXNrKQomIzQzOwkJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogJiMzNDssCiYjNDM7CQkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtJmd0O21hc2ssIGUtJmd0O3NpemUsIHRydWUpOwomIzQzOwlyZXR1cm4gcDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZCBvZiBhbiAmIzM5O0UmIzM5OyBlbnRyeTogdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gKi8KJiM0MztzdGF0aWMgY2hhciAqcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsCiYjNDM7CQkJCSAgICBjaGFyIGRlbCkKJiM0Mzt7CiYjNDM7CS8qIFNraXAgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCiYjNDM7CXAgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFwKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKIAomIzQzOwkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwomIzQzOwllLSZndDttYWdpYyA9IHA7CiYjNDM7CXAgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFwKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJaWYgKCFlLSZndDttYWdpY1swXSB8fCBzdHJjaHIoZS0mZ3Q7bWFnaWMsICYjMzk7LyYjMzk7KSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBleHRlbnNpb246IHslc31cbiYjMzQ7LCBlLSZndDttYWdpYyk7CiYjNDM7CiYjNDM7CS8qIFNraXAgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqLwomIzQzOwlwID0gc3RyY2hyKHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwkqcCYjNDM7JiM0MzsgPSAmIzM5O1wwJiMzOTs7CiAJcmV0dXJuIHA7CiB9CiAKQEAgLTM0Nyw1MCAmIzQzOzQzMyw0OCBAQCBzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpCiAgKiAmIzM5OzpuYW1lOnR5cGU6b2Zmc2V0Om1hZ2ljOm1hc2s6aW50ZXJwcmV0ZXI6ZmxhZ3MmIzM5OwogICogd2hlcmUgdGhlICYjMzk7OiYjMzk7IGlzIHRoZSBJRlMsIHRoYXQgY2FuIGJlIGNob3NlbiB3aXRoIHRoZSBmaXJzdCBjaGFyCiAgKi8KLXN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQomIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAomIzQzOwkJCQkJICAgICAgc2l6ZV90IGNvdW50KQogewotCU5vZGUgKmU7Ci0JaW50IG1lbXNpemUsIGVycjsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMOwogCWNoYXIgKmJ1ZiwgKnA7CiAJY2hhciBkZWw7CiAKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiByZWNlaXZlZCAlenUgYnl0ZXNcbiYjMzQ7LCBjb3VudCk7CiAKIAkvKiBzb21lIHNhbml0eSBjaGVja3MgKi8KLQllcnIgPSAtRUlOVkFMOwogCWlmICgoY291bnQgJmx0OyAxMSkgfHwgKGNvdW50ICZndDsgTUFYX1JFR0lTVEVSX0xFTkdUSCkpCi0JCWdvdG8gb3V0OwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQllcnIgPSAtRU5PTUVNOwotCW1lbXNpemUgPSBzaXplb2YoTm9kZSkgJiM0MzsgY291bnQgJiM0MzsgODsKLQllID0ga21hbGxvYyhtZW1zaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpOwomIzQzOwllID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShlLCBidWYsIGNvdW50ICYjNDM7IE1JU0NfREVMSU1fUEFEKSwKJiM0MzsJCSAgICBHRlBfS0VSTkVMX0FDQ09VTlQpOwogCWlmICghZSkKLQkJZ290byBvdXQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXAgPSBidWYgPSAoY2hhciAqKWUgJiM0Mzsgc2l6ZW9mKE5vZGUpOwomIzQzOwlwID0gYnVmID0gZS0mZ3Q7YnVmOwogCi0JbWVtc2V0KGUsIDAsIHNpemVvZihOb2RlKSk7CiYjNDM7CW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkKLQkJZ290byBlZmF1bHQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKIAotCWRlbCA9ICpwJiM0MzsmIzQzOzsJLyogZGVsaW1ldGVyICovCiYjNDM7CWRlbCA9ICpwJiM0MzsmIzQzOzsJLyogZGVsaW1pdGVyICovCiAKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cbiYjMzQ7LCBkZWwsIGRlbCk7CiAKIAkvKiBQYWQgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWxpbSB0byBzaW1wbGlmeSBwYXJzaW5nIGJlbG93LiAqLwotCW1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgOCk7CiYjNDM7CW1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgTUlTQ19ERUxJTV9QQUQpOwogCiAJLyogUGFyc2UgdGhlICYjMzk7bmFtZSYjMzk7IGZpZWxkLiAqLwogCWUtJmd0O25hbWUgPSBwOwogCXAgPSBzdHJjaHIocCwgZGVsKTsKIAlpZiAoIXApCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwogCWlmICghZS0mZ3Q7bmFtZVswXSB8fAogCSAgICAhc3RyY21wKGUtJmd0O25hbWUsICYjMzQ7LiYjMzQ7KSB8fAogCSAgICAhc3RyY21wKGUtJmd0O25hbWUsICYjMzQ7Li4mIzM0OykgfHwKIAkgICAgc3RyY2hyKGUtJmd0O25hbWUsICYjMzk7LyYjMzk7KSkKLQkJZ290byBlaW52YWw7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IG5hbWU6IHslc31cbiYjMzQ7LCBlLSZndDtuYW1lKTsKIApAQCAtMzk4LDEzNCAmIzQzOzQ4MiwzMyBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIAlzd2l0Y2ggKCpwJiM0MzsmIzQzOykgewogCWNhc2UgJiMzOTtFJiMzOTs6CiAJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IEUgKGV4dGVuc2lvbilcbiYjMzQ7KTsKLQkJZS0mZ3Q7ZmxhZ3MgPSAxICZsdDsmbHQ7IEVuYWJsZWQ7CiYjNDM7CQllLSZndDtmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7CiAJCWJyZWFrOwogCWNhc2UgJiMzOTtNJiMzOTs6CiAJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IE0gKG1hZ2ljKVxuJiMzNDspOwotCQllLSZndDtmbGFncyA9ICgxICZsdDsmbHQ7IEVuYWJsZWQpIHwgKDEgJmx0OyZsdDsgTWFnaWMpOwomIzQzOwkJZS0mZ3Q7ZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCWlmICgqcCYjNDM7JiM0MzsgIT0gZGVsKQotCQlnb3RvIGVpbnZhbDsKLQotCWlmICh0ZXN0X2JpdChNYWdpYywgJmFtcDtlLSZndDtmbGFncykpIHsKLQkJLyogSGFuZGxlIHRoZSAmIzM5O00mIzM5OyAobWFnaWMpIGZvcm1hdC4gKi8KLQkJY2hhciAqczsKLQotCQkvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi8KLQkJcyA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXMpCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnMgPSAmIzM5O1wwJiMzOTs7Ci0JCWlmIChwICE9IHMpIHsKLQkJCWludCByID0ga3N0cnRvaW50KHAsIDEwLCAmYW1wO2UtJmd0O29mZnNldCk7Ci0JCQlpZiAociAhPSAwIHx8IGUtJmd0O29mZnNldCAmbHQ7IDApCi0JCQkJZ290byBlaW52YWw7Ci0JCX0KLQkJcCA9IHM7Ci0JCWlmICgqcCYjNDM7JiM0MzspCi0JCQlnb3RvIGVpbnZhbDsKLQkJcHJfZGVidWcoJiMzNDtyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcbiYjMzQ7LCBlLSZndDtvZmZzZXQpOwotCi0JCS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCi0JCWUtJmd0O21hZ2ljID0gcDsKLQkJcCA9IHNjYW5hcmcocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCWlmICghZS0mZ3Q7bWFnaWNbMF0pCi0JCQlnb3RvIGVpbnZhbDsKLQkJaWYgKFVTRV9ERUJVRykKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogbWFnaWNbcmF3XTogJiMzNDssCi0JCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFnaWMsIHAgLSBlLSZndDttYWdpYyk7Ci0KLQkJLyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqLwotCQllLSZndDttYXNrID0gcDsKLQkJcCA9IHNjYW5hcmcocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCWlmICghZS0mZ3Q7bWFza1swXSkgewotCQkJZS0mZ3Q7bWFzayA9IE5VTEw7Ci0JCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXG4mIzM0Oyk7Ci0JCX0gZWxzZSBpZiAoVVNFX0RFQlVHKQotCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoCi0JCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiAmIzM0OywKLQkJCQlEVU1QX1BSRUZJWF9OT05FLCBlLSZndDttYXNrLCBwIC0gZS0mZ3Q7bWFzayk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCQkvKgotCQkgKiBEZWNvZGUgdGhlIG1hZ2ljICZhbXA7IG1hc2sgZmllbGRzLgotCQkgKiBOb3RlOiB3aGlsZSB3ZSBtaWdodCBoYXZlIGFjY2VwdGVkIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tCi0JCSAqIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyBoZXJlIHdpbGwgc3RvcCBhdCB0aGUgZmlyc3Qgb25lCi0JCSAqIGl0IGVuY291bnRlcnMuCi0JCSAqLwotCQllLSZndDtzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS0mZ3Q7bWFnaWMsIFVORVNDQVBFX0hFWCk7Ci0JCWlmIChlLSZndDttYXNrICZhbXA7JmFtcDsKLQkJICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtJmd0O21hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS0mZ3Q7c2l6ZSkKLQkJCWdvdG8gZWludmFsOwotCQlpZiAoZS0mZ3Q7c2l6ZSAmZ3Q7IEJJTlBSTV9CVUZfU0laRSB8fAotCQkgICAgQklOUFJNX0JVRl9TSVpFIC0gZS0mZ3Q7c2l6ZSAmbHQ7IGUtJmd0O29mZnNldCkKLQkJCWdvdG8gZWludmFsOwotCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcbiYjMzQ7LCBlLSZndDtzaXplKTsKLQkJaWYgKFVTRV9ERUJVRykgewotCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoCi0JCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogJiMzNDssCi0JCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUpOwotCi0JCQlpZiAoZS0mZ3Q7bWFzaykgewotCQkJCWludCBpOwotCQkJCWNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS0mZ3Q7c2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTsKLQotCQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiAmIzM0OywKLQkJCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFzaywgZS0mZ3Q7c2l6ZSk7Ci0KLQkJCQlpZiAobWFza2VkKSB7Ci0JCQkJCWZvciAoaSA9IDA7IGkgJmx0OyBlLSZndDtzaXplOyAmIzQzOyYjNDM7aSkKLQkJCQkJCW1hc2tlZFtpXSA9IGUtJmd0O21hZ2ljW2ldICZhbXA7IGUtJmd0O21hc2tbaV07Ci0JCQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogJiMzNDssCi0JCQkJCQlEVU1QX1BSRUZJWF9OT05FLCBtYXNrZWQsIGUtJmd0O3NpemUpOwotCi0JCQkJCWtmcmVlKG1hc2tlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogSGFuZGxlIHRoZSAmIzM5O0UmIzM5OyAoZXh0ZW5zaW9uKSBmb3JtYXQuICovCi0KLQkJLyogU2tpcCB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi8KLQkJcCA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXApCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwotCi0JCS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCi0JCWUtJmd0O21hZ2ljID0gcDsKLQkJcCA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXApCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwotCQlpZiAoIWUtJmd0O21hZ2ljWzBdIHx8IHN0cmNocihlLSZndDttYWdpYywgJiMzOTsvJiMzOTspKQotCQkJZ290byBlaW52YWw7Ci0JCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxuJiMzNDssIGUtJmd0O21hZ2ljKTsKLQotCQkvKiBTa2lwIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi8KLQkJcCA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXApCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwotCX0KJiM0MzsJaWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgJmFtcDtlLSZndDtmbGFncykpCiYjNDM7CQlwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7CiYjNDM7CWVsc2UKJiM0MzsJCXAgPSBwYXJzZV9leHRlbnNpb25fZmllbGRzKGUsIHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJLyogUGFyc2UgdGhlICYjMzk7aW50ZXJwcmV0ZXImIzM5OyBmaWVsZC4gKi8KIAllLSZndDtpbnRlcnByZXRlciA9IHA7CiAJcCA9IHN0cmNocihwLCBkZWwpOwogCWlmICghcCkKLQkJZ290byBlaW52YWw7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkqcCYjNDM7JiM0MzsgPSAmIzM5O1wwJiMzOTs7CiAJaWYgKCFlLSZndDtpbnRlcnByZXRlclswXSkKLQkJZ290byBlaW52YWw7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxuJiMzNDssIGUtJmd0O2ludGVycHJldGVyKTsKIAogCS8qIFBhcnNlIHRoZSAmIzM5O2ZsYWdzJiMzOTsgZmllbGQuICovCkBAIC01MzMsMjQgJiM0Mzs1MTYsMjIgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiAJaWYgKCpwID09ICYjMzk7XG4mIzM5OykKIAkJcCYjNDM7JiM0Mzs7CiAJaWYgKHAgIT0gYnVmICYjNDM7IGNvdW50KQotCQlnb3RvIGVpbnZhbDsKLQotCXJldHVybiBlOwotCi1vdXQ6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi1lZmF1bHQ6Ci0Ja2ZyZWUoZSk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci1laW52YWw6Ci0Ja2ZyZWUoZSk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiYjNDM7CXJldHVybiBub19mcmVlX3B0cihlKTsKIH0KIAomIzQzOy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvJmx0O2VudHJ5Jmd0OyBmaWxlcy4gKi8KJiM0MztlbnVtIGJtX2NvbW1hbmQgewomIzQzOwlCTV9DTURfSUdOT1JFLAkvKiBlbXB0eSB3cml0ZSAqLwomIzQzOwlCTV9DTURfRElTQUJMRSwJLyogJiMzNDswJiMzNDsgKi8KJiM0MzsJQk1fQ01EX0VOQUJMRSwJLyogJiMzNDsxJiMzNDsgKi8KJiM0MzsJQk1fQ01EX1JFTU9WRSwJLyogJiMzNDstMSYjMzQ7ICovCiYjNDM7fTsKJiM0MzsKIC8qCi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOgotICogJiMzOTsxJiMzOTsgZW5hYmxlcywgJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyBjbGVhcnMgZW50cnkvYmluZm10X21pc2MKJiM0MzsgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICYjMzk7MSYjMzk7IGVuYWJsZXMsCiYjNDM7ICogJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy4KICAqLwogc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIHsKQEAgLTU2MSw2MiAmIzQzOzU0Miw2NCBAQCBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQogCWlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKCFjb3VudCkKLQkJcmV0dXJuIDA7CiYjNDM7CQlyZXR1cm4gQk1fQ01EX0lHTk9SRTsKIAlpZiAoc1tjb3VudCAtIDFdID09ICYjMzk7XG4mIzM5OykKIAkJY291bnQtLTsKIAlpZiAoY291bnQgPT0gMSAmYW1wOyZhbXA7IHNbMF0gPT0gJiMzOTswJiMzOTspCi0JCXJldHVybiAxOwomIzQzOwkJcmV0dXJuIEJNX0NNRF9ESVNBQkxFOwogCWlmIChjb3VudCA9PSAxICZhbXA7JmFtcDsgc1swXSA9PSAmIzM5OzEmIzM5OykKLQkJcmV0dXJuIDI7CiYjNDM7CQlyZXR1cm4gQk1fQ01EX0VOQUJMRTsKIAlpZiAoY291bnQgPT0gMiAmYW1wOyZhbXA7IHNbMF0gPT0gJiMzOTstJiMzOTsgJmFtcDsmYW1wOyBzWzFdID09ICYjMzk7MSYjMzk7KQotCQlyZXR1cm4gMzsKJiM0MzsJCXJldHVybiBCTV9DTURfUkVNT1ZFOwogCXJldHVybiAtRUlOVkFMOwogfQogCiAvKiBnZW5lcmljIHN0dWZmICovCiAKLXN0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKQomIzQzO3N0YXRpYyB2b2lkIGJtX3NlcV9oZXgoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCB1OCAqZGF0YSwgaW50IHNpemUpCiB7Ci0JY2hhciAqZHAgPSBwYWdlOwotCWNvbnN0IGNoYXIgKnN0YXR1cyA9ICYjMzQ7ZGlzYWJsZWQmIzM0OzsKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNlcV9wcmludGYobSwgJiMzNDslMDJ4JiMzNDssIGRhdGFbaV0pOwomIzQzO30KIAotCWlmICh0ZXN0X2JpdChFbmFibGVkLCAmYW1wO2UtJmd0O2ZsYWdzKSkKLQkJc3RhdHVzID0gJiMzNDtlbmFibGVkJiMzNDs7CiYjNDM7c3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gbS0mZ3Q7cHJpdmF0ZTsKIAotCWlmICghVkVSQk9TRV9TVEFUVVMpIHsKLQkJc3ByaW50ZihwYWdlLCAmIzM0OyVzXG4mIzM0Oywgc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KJiM0MzsJaWYgKHRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKSkKJiM0MzsJCXNlcV9wdXRzKG0sICYjMzQ7ZW5hYmxlZFxuJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlzZXFfcHV0cyhtLCAmIzM0O2Rpc2FibGVkXG4mIzM0Oyk7CiAKLQlkcCAmIzQzOz0gc3ByaW50ZihkcCwgJiMzNDslc1xuaW50ZXJwcmV0ZXIgJXNcbiYjMzQ7LCBzdGF0dXMsIGUtJmd0O2ludGVycHJldGVyKTsKJiM0MzsJc2VxX3ByaW50ZihtLCAmIzM0O2ludGVycHJldGVyICVzXG4mIzM0OywgZS0mZ3Q7aW50ZXJwcmV0ZXIpOwogCiAJLyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi8KLQlkcCAmIzQzOz0gc3ByaW50ZihkcCwgJiMzNDtmbGFnczogJiMzNDspOwomIzQzOwlzZXFfcHV0cyhtLCAmIzM0O2ZsYWdzOiAmIzM0Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKQotCQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtQJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O1AmIzM5Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fQklOQVJZKQotCQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtPJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O08mIzM5Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX0NSRURFTlRJQUxTKQotCQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtDJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O0MmIzM5Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fRklMRSkKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7RiYjMzk7OwotCSpkcCYjNDM7JiM0MzsgPSAmIzM5O1xuJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O0YmIzM5Oyk7CiYjNDM7CXNlcV9wdXRjKG0sICYjMzk7XG4mIzM5Oyk7CiAKLQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmYW1wO2UtJmd0O2ZsYWdzKSkgewotCQlzcHJpbnRmKGRwLCAmIzM0O2V4dGVuc2lvbiAuJXNcbiYjMzQ7LCBlLSZndDttYWdpYyk7CiYjNDM7CWlmICghdGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCAmYW1wO2UtJmd0O2ZsYWdzKSkgewomIzQzOwkJc2VxX3ByaW50ZihtLCAmIzM0O2V4dGVuc2lvbiAuJXNcbiYjMzQ7LCBlLSZndDttYWdpYyk7CiAJfSBlbHNlIHsKLQkJZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7b2Zmc2V0ICVpXG5tYWdpYyAmIzM0OywgZS0mZ3Q7b2Zmc2V0KTsKLQkJZHAgPSBiaW4yaGV4KGRwLCBlLSZndDttYWdpYywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CQlzZXFfcHJpbnRmKG0sICYjMzQ7b2Zmc2V0ICVpXG5tYWdpYyAmIzM0OywgZS0mZ3Q7b2Zmc2V0KTsKJiM0MzsJCWJtX3NlcV9oZXgobSwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUpOwogCQlpZiAoZS0mZ3Q7bWFzaykgewotCQkJZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7XG5tYXNrICYjMzQ7KTsKLQkJCWRwID0gYmluMmhleChkcCwgZS0mZ3Q7bWFzaywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CQkJc2VxX3B1dHMobSwgJiMzNDtcbm1hc2sgJiMzNDspOwomIzQzOwkJCWJtX3NlcV9oZXgobSwgZS0mZ3Q7bWFzaywgZS0mZ3Q7c2l6ZSk7CiAJCX0KLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7XG4mIzM5OzsKLQkJKmRwID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtcbiYjMzk7KTsKIAl9CiYjNDM7CXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpCiYjNDM7c3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKIApAQCAtNjUyLDE0ICYjNDM7NjM1LDE0IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmlfYmluZm10X21pc2Moc3RydWN0IGlub2RlICppbm9kZSkKICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXMKICAqIHNodXRkb3duLgogICoKLSAqIElmIHRoZSAtJmd0O2V2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZQotICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnkKLSAqIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBXZSBrZWVwIHRoZSBsaXN0X2VtcHR5KCkgY2hlY2sKLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4KJiM0MzsgKiBJZiB0aGUgLSZndDtldmljdCBjYWxsIHdhcyBub3QgY2F1c2VkIGJ5IGEgc3VwZXIgYmxvY2sgc2h1dGRvd24gYnV0IGJ5CiYjNDM7ICogcmVtb3ZpbmcgdGhlIGVudHJ5IHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIG9yIHVubGluaygyKSB0aGUgZW50cnkKJiM0MzsgKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgaGxpc3RfdW5oYXNoZWQoKQomIzQzOyAqIGNoZWNrIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4KICovCiBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCU5vZGUgKmUgPSBpbm9kZS0mZ3Q7aV9wcml2YXRlOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBpbm9kZS0mZ3Q7aV9wcml2YXRlOwogCiAJY2xlYXJfaW5vZGUoaW5vZGUpOwogCkBAIC02NjcsODkgJiM0Mzs2NTAsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiAJCXN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYzsKIAogCQltaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7Ci0JCXdyaXRlX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJmFtcDtlLSZndDtsaXN0KSkKLQkJCWxpc3RfZGVsX2luaXQoJmFtcDtlLSZndDtsaXN0KTsKLQkJd3JpdGVfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJCXNwaW5fbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CQlpZiAoIWhsaXN0X3VuaGFzaGVkKCZhbXA7ZS0mZ3Q7bm9kZSkpCiYjNDM7CQkJaGxpc3RfZGVsX2luaXRfcmN1KCZhbXA7ZS0mZ3Q7bm9kZSk7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiAJCXB1dF9iaW5mbXRfaGFuZGxlcihlKTsKIAl9CiB9CiAKJiM0MzsvKioKJiM0MzsgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyCiYjNDM7ICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZQomIzQzOyAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHVuaGFzaAomIzQzOyAqCiYjNDM7ICogQWRkaW5nIGFuZCByZW1vdmluZyBlbnRyaWVzIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGFuZAomIzQzOyAqIHVubGluaygyKSBoYXBwZW5zIHVuZGVyIHRoZSBleGNsdXNpdmVseSBoZWxkIGlub2RlIGxvY2sgb2YgdGhlIHJvb3QKJiM0MzsgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdAomIzQzOyAqIGNvbmN1cnJlbnRseSB1bmRlciBSQ1UuIFRoZSBlbnRyaWVzX2xvY2sgaXMgb25seSBoZWxkIGFyb3VuZCB0aGUgYWN0dWFsCiYjNDM7ICogdW5saW5rIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IGJtX2V2aWN0X2lub2RlKCkgd2hpY2ggdW5saW5rcyBlbnRyaWVzCiYjNDM7ICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB1bmxpbmtfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAomIzQzOwkJCQkgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CWhsaXN0X2RlbF9pbml0X3JjdSgmYW1wO2UtJmd0O25vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyCiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlCiAgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byByZW1vdmUKICAqCiAgKiBSZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3Qgb2YgYmluYXJ5IHR5cGUgaGFuZGxlcnMgYW5kCi0gKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LiBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dAotICogYWRkaW5nIGEgcHJvcGVyIC0mZ3Q7dW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXImIzM5O3MKLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzCi0gKiB3b3JrZWQgZm9yIHNvIGxvbmcgdGhhdCBpdCYjMzk7cyBub3QgYSBwcmVzc2luZyBpc3N1ZS4KJiM0MzsgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LgogICovCi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKQomIzQzO3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCiYjNDM7CQkJCSAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKQogewotCXdyaXRlX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwotCWxpc3RfZGVsX2luaXQoJmFtcDtlLSZndDtsaXN0KTsKLQl3cml0ZV91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwl1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7CiAJbG9ja2VkX3JlY3Vyc2l2ZV9yZW1vdmFsKGUtJmd0O2RlbnRyeSwgTlVMTCk7CiB9CiAKLS8qIC8mbHQ7ZW50cnkmZ3Q7ICovCiYjNDM7LyogUmVtb3ZlIEBlIHVubGVzcyBpdCB3YXMgYWxyZWFkeSByZW1vdmVkLiAqLwomIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLSZndDtzX3Jvb3QpOwogCi1zdGF0aWMgc3NpemVfdAotYm1fZW50cnlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQomIzQzOwlpbm9kZV9sb2NrX25lc3RlZChyb290LCBJX01VVEVYX1BBUkVOVCk7CiYjNDM7CWlmICghaGxpc3RfdW5oYXNoZWQoJmFtcDtlLSZndDtub2RlKSkKJiM0MzsJCXJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTsKJiM0MzsJaW5vZGVfdW5sb2NrKHJvb3QpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZW1vdmUgYWxsIGVudHJpZXMgb2YgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIEBtaXNjIGJlbG9uZ2luZyB0byBAc2IuICovCiYjNDM7c3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywKJiM0MzsJCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCU5vZGUgKmUgPSBmaWxlX2lub2RlKGZpbGUpLSZndDtpX3ByaXZhdGU7Ci0Jc3NpemVfdCByZXM7Ci0JY2hhciAqcGFnZTsKJiM0MzsJc3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi0mZ3Q7c19yb290KTsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplOwomIzQzOwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDsKJiM0MzsKJiM0MzsJaW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpOwomIzQzOwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcywgbm9kZSkKJiM0MzsJCXJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTsKJiM0MzsJaW5vZGVfdW5sb2NrKHJvb3QpOwomIzQzO30KIAotCXBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsvKioKJiM0MzsgKiBibV91bmxpbmsgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIHZpYSB1bmxpbmsoMikKJiM0MzsgKiBAZGlyOiBpbm9kZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnkKJiM0MzsgKiBAZGVudHJ5OiBlbnRyeSBmaWxlIHRvIHJlbW92ZQomIzQzOyAqCiYjNDM7ICogUmVtb3ZpbmcgdGhlIGVudHJ5IGZpbGUgcmVtb3ZlcyBpdHMgYmluYXJ5IHR5cGUgaGFuZGxlciwgZXhhY3RseSBsaWtlCiYjNDM7ICogd3JpdGluZyAtMSB0byBpdCBkb2VzLiBUaGUgc3RhdHVzIGFuZCByZWdpc3RlciBjb250cm9sIGZpbGVzIGNhbiYjMzk7dCBiZQomIzQzOyAqIHJlbW92ZWQuIFRoZSBWRlMgY2FsbHMgdGhpcyB3aXRoIHRoZSByb290IGlub2RlIGxvY2sgaGVsZCB3aGljaAomIzQzOyAqIHNlcmlhbGl6ZXMgYWdhaW5zdCB0aGUgd3JpdGUgYmFzZWQgYWRkIGFuZCByZW1vdmUgcGF0aHMuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBibV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGRfaW5vZGUoZGVudHJ5KS0mZ3Q7aV9wcml2YXRlOwomIzQzOwomIzQzOwlpZiAoIWUpCiYjNDM7CQlyZXR1cm4gLUVQRVJNOwomIzQzOwomIzQzOwl1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTsKJiM0MzsJcmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpOwomIzQzO30KIAotCWVudHJ5X3N0YXR1cyhlLCBwYWdlKTsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYm1fZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CiYjNDM7CS5sb29rdXAJCT0gc2ltcGxlX2xvb2t1cCwKJiM0MzsJLnVubGluawkJPSBibV91bmxpbmssCiYjNDM7fTsKIAotCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYWdlLCBzdHJsZW4ocGFnZSkpOwomIzQzOy8qIC8mbHQ7ZW50cnkmZ3Q7ICovCiYjNDM7CiYjNDM7c3RhdGljIGludCBibV9lbnRyeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQomIzQzO3sKJiM0MzsJaW50IHJldDsKIAotCWtmcmVlKHBhZ2UpOwotCXJldHVybiByZXM7CiYjNDM7CXJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIGJtX2VudHJ5X3Nob3csIGlub2RlLSZndDtpX3ByaXZhdGUpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogc2VxX29wZW4oKSBjbGVhcnMgRk1PREVfUFdSSVRFLCBibV9lbnRyeV93cml0ZSgpIHRha2VzIGFueSBvZmZzZXQgKi8KJiM0MzsJaWYgKGZpbGUtJmd0O2ZfbW9kZSAmYW1wOyBGTU9ERV9XUklURSkKJiM0MzsJCWZpbGUtJmd0O2ZfbW9kZSB8PSBGTU9ERV9QV1JJVEU7CiYjNDM7CXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBibV9lbnRyeV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKLQlOb2RlICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKIAlpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTsKIAogCXN3aXRjaCAocmVzKSB7Ci0JY2FzZSAxOgotCQkvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi8KLQkJY2xlYXJfYml0KEVuYWJsZWQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpOwomIzQzOwljYXNlIEJNX0NNRF9ESVNBQkxFOgomIzQzOwkJY2xlYXJfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKTsKIAkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiBFbmFibGUgdGhpcyBoYW5kbGVyLiAqLwotCQlzZXRfYml0KEVuYWJsZWQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpOwomIzQzOwljYXNlIEJNX0NNRF9FTkFCTEU6CiYjNDM7CQlzZXRfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKTsKIAkJYnJlYWs7Ci0JY2FzZSAzOgotCQkvKiBEZWxldGUgdGhpcyBoYW5kbGVyLiAqLwotCQlpbm9kZSA9IGRfaW5vZGUoaW5vZGUtJmd0O2lfc2ItJmd0O3Nfcm9vdCk7Ci0JCWlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7Ci0KLQkJLyoKLQkJICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0Ci0JCSAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGUKLQkJICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuCi0JCSAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbiYjMzk7dCBiZQotCQkgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzbwotCQkgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2UKLQkJICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0LgotCQkgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZhbXA7ZS0mZ3Q7bGlzdCkpCi0JCQlyZW1vdmVfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhpbm9kZSksIGUpOwotCi0JCWlub2RlX3VubG9jayhpbm9kZSk7CiYjNDM7CWNhc2UgQk1fQ01EX1JFTU9WRToKJiM0MzsJCWJtX3JlbW92ZV9lbnRyeShlLCBpbm9kZS0mZ3Q7aV9zYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiByZXM7CkBAIC03NTksMTUgJiM0Mzs3ODUsMTcgQEAgc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJtX2VudHJ5X29wZXJhdGlvbnMgPSB7Ci0JLnJlYWQJCT0gYm1fZW50cnlfcmVhZCwKJiM0MzsJLm9wZW4JCT0gYm1fZW50cnlfb3BlbiwKJiM0MzsJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLndyaXRlCQk9IGJtX2VudHJ5X3dyaXRlLAotCS5sbHNlZWsJCT0gZGVmYXVsdF9sbHNlZWssCiYjNDM7CS5sbHNlZWsJCT0gc2VxX2xzZWVrLAomIzQzOwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogLyogL3JlZ2lzdGVyICovCiAKIC8qIGFkZCB0byBmaWxlc3lzdGVtICovCi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3N0YXRpYyBpbnQgYWRkX2VudHJ5KHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBzaW1wbGVfc3RhcnRfY3JlYXRpbmcoc2ItJmd0O3Nfcm9vdCwgZS0mZ3Q7bmFtZSk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTc4OSw5ICYjNDM7ODE3LDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIAogCWRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpOwogCW1pc2MgPSBpX2JpbmZtdF9taXNjKGlub2RlKTsKLQl3cml0ZV9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKLQlsaXN0X2FkZCgmYW1wO2UtJmd0O2xpc3QsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcyk7Ci0Jd3JpdGVfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJaGxpc3RfYWRkX2hlYWRfcmN1KCZhbXA7ZS0mZ3Q7bm9kZSwgJmFtcDttaXNjLSZndDtlbnRyaWVzKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwogCXNpbXBsZV9kb25lX2NyZWF0aW5nKGRlbnRyeSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03OTksMTMgJiM0Mzs4MjcsMTIgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCU5vZGUgKmU7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9zYjsKLQlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgZmlsZSAqZiA9IE5VTEw7CiYjNDM7CWludCBlcnI7CiAKIAllID0gY3JlYXRlX2VudHJ5KGJ1ZmZlciwgY291bnQpOwotCiAJaWYgKElTX0VSUihlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZSk7CiAKQEAgLTgyMiw3ICYjNDM7ODQ5LDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCWlmIChJU19FUlIoZikpIHsKIAkJCXByX25vdGljZSgmIzM0O3JlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXG4mIzM0OywKIAkJCQkgZS0mZ3Q7aW50ZXJwcmV0ZXIpOwotCQkJa2ZyZWUoZSk7CiAJCQlyZXR1cm4gUFRSX0VSUihmKTsKIAkJfQogCQllLSZndDtpbnRlcnBfZmlsZSA9IGY7CkBAIC04MzQsOSAmIzQzOzg2MCwxMSBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCWV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhmKTsKIAkJCWZpbHBfY2xvc2UoZiwgTlVMTCk7CiAJCX0KLQkJa2ZyZWUoZSk7CiAJCXJldHVybiBlcnI7CiAJfQomIzQzOwomIzQzOwkvKiBUaGUgZW50cnkgaXMgb3duZWQgYnkgaXRzIGlub2RlIG5vdy4gKi8KJiM0MzsJcmV0YWluX2FuZF9udWxsX3B0cihlKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTg1MSwxMCAmIzQzOzg3OSwxMCBAQCBzdGF0aWMgc3NpemVfdAogYm1fc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7Ci0JY2hhciAqczsKJiM0MzsJY29uc3QgY2hhciAqczsKIAogCW1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpOwotCXMgPSBtaXNjLSZndDtlbmFibGVkID8gJiMzNDtlbmFibGVkXG4mIzM0OyA6ICYjMzQ7ZGlzYWJsZWRcbiYjMzQ7OwomIzQzOwlzID0gUkVBRF9PTkNFKG1pc2MtJmd0O2VuYWJsZWQpID8gJiMzNDtlbmFibGVkXG4mIzM0OyA6ICYjMzQ7ZGlzYWJsZWRcbiYjMzQ7OwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTsKIH0KIApAQCAtODYzLDM3ICYjNDM7ODkxLDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIHsKIAlzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7CiAJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7Ci0JTm9kZSAqZSwgKm5leHQ7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAogCW1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpOwogCXN3aXRjaCAocmVzKSB7Ci0JY2FzZSAxOgotCQkvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi8KLQkJbWlzYy0mZ3Q7ZW5hYmxlZCA9IGZhbHNlOwomIzQzOwljYXNlIEJNX0NNRF9ESVNBQkxFOgomIzQzOwkJV1JJVEVfT05DRShtaXNjLSZndDtlbmFibGVkLCBmYWxzZSk7CiAJCWJyZWFrOwotCWNhc2UgMjoKLQkJLyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi8KLQkJbWlzYy0mZ3Q7ZW5hYmxlZCA9IHRydWU7CiYjNDM7CWNhc2UgQk1fQ01EX0VOQUJMRToKJiM0MzsJCVdSSVRFX09OQ0UobWlzYy0mZ3Q7ZW5hYmxlZCwgdHJ1ZSk7CiAJCWJyZWFrOwotCWNhc2UgMzoKLQkJLyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi8KLQkJaW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfc2ItJmd0O3Nfcm9vdCk7Ci0JCWlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7Ci0KLQkJLyoKLQkJICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0Ci0JCSAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGUKLQkJICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuCi0JCSAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbiYjMzk7dCBiZQotCQkgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzbwotCQkgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2UKLQkJICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0LgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcywgbGlzdCkKLQkJCXJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTsKLQotCQlpbm9kZV91bmxvY2soaW5vZGUpOwomIzQzOwljYXNlIEJNX0NNRF9SRU1PVkU6CiYjNDM7CQlibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9zYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiByZXM7CkBAIC05MTgsNyAmIzQzOzkyNiw3IEBAIHN0YXRpYyB2b2lkIGJtX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogCXB1dF91c2VyX25zKHVzZXJfbnMpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGJtX3N1cGVyX29wcyA9IHsKIAkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiAJLmV2aWN0X2lub2RlCT0gYm1fZXZpY3RfaW5vZGUsCiAJLnB1dF9zdXBlcgk9IGJtX3B1dF9zdXBlciwKQEAgLTk2NSwxMCAmIzQzOzk3MywxMCBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKQogCQlpZiAoIW1pc2MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlJTklUX0xJU1RfSEVBRCgmYW1wO21pc2MtJmd0O2VudHJpZXMpOwotCQlyd2xvY2tfaW5pdCgmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CQlJTklUX0hMSVNUX0hFQUQoJmFtcDttaXNjLSZndDtlbnRyaWVzKTsKJiM0MzsJCXNwaW5fbG9ja19pbml0KCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKIAotCQkvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovCiYjNDM7CQkvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovCiAJCXNtcF9zdG9yZV9yZWxlYXNlKCZhbXA7dXNlcl9ucy0mZ3Q7YmluZm10X21pc2MsIG1pc2MpOwogCX0KIApAQCAtOTgzLDEyICYjNDM7OTkxLDE1IEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCiAJICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseQogCSAqIHJlc2V0IC0mZ3Q7ZW5hYmxlZCB0byB0cnVlLgogCSAqLwotCW1pc2MtJmd0O2VuYWJsZWQgPSB0cnVlOwomIzQzOwlXUklURV9PTkNFKG1pc2MtJmd0O2VuYWJsZWQsIHRydWUpOwogCiAJZXJyID0gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIEJJTkZNVEZTX01BR0lDLCBibV9maWxlcyk7Ci0JaWYgKCFlcnIpCi0JCXNiLSZndDtzX29wID0gJmFtcDtzX29wczsKLQlyZXR1cm4gZXJyOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJc2ItJmd0O3Nfb3AgPSAmYW1wO2JtX3N1cGVyX29wczsKJiM0MzsJZF9pbm9kZShzYi0mZ3Q7c19yb290KS0mZ3Q7aV9vcCA9ICZhbXA7Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7CiYjNDM7CXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBibV9mcmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKaW5kZXggMmM3N2UzODNlNzM3NTcuLjdlNzMzM2I3YmIwZjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaApAQCAtMTAxLDggJiM0MzsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHsKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKQogc3RydWN0IGJpbmZtdF9taXNjIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7Ci0Jcndsb2NrX3QgZW50cmllc19sb2NrOwomIzQzOwlzdHJ1Y3QgaGxpc3RfaGVhZCBlbnRyaWVzOwomIzQzOwlzcGlubG9ja190IGVudHJpZXNfbG9jazsKIAlib29sIGVuYWJsZWQ7CiB9IF9fcmFuZG9taXplX2xheW91dDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmMKaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NAotLS0gYS9rZXJuZWwvdXNlci5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC91c2VyLmMKQEAgLTIzLDkgJiM0MzsyMyw5IEBACiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykKIHN0cnVjdCBiaW5mbXRfbWlzYyBpbml0X2JpbmZtdF9taXNjID0gewotCS5lbnRyaWVzID0gTElTVF9IRUFEX0lOSVQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzKSwKJiM0MzsJLmVudHJpZXMgPSBITElTVF9IRUFEX0lOSVQsCiAJLmVuYWJsZWQgPSB0cnVlLAotCS5lbnRyaWVzX2xvY2sgPSBfX1JXX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLAomIzQzOwkuZW50cmllc19sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpOwogI2VuZGlmCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NjIyCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNTcyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIHRoZSBiaW5mbXRfbWlzYyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgdGhpcyBzdWJzdGFudGlhbCBwYXRjaCB0b3VjaGluZyBgZnMvYmluZm10X21pc2MuY2AuIEl0JiMzOTtzIGEgYmlnIGludGVybmFsIHJlZmFjdG9yLCBzd2l0Y2hpbmcgZnJvbSBhIGBsaXN0X2hlYWRgIHRvIGFuIGBobGlzdF9oZWFkYCwgUkNVIGZvciBsb29rdXBzLCBgc3BpbmxvY2tfdGAgaW4gcGxhY2Ugb2YgYHJ3bG9ja190YCwgY2xlYW51cCByb3V0aW5lcywgYHNlcV9maWxlYCBmb3IgYGJtX2VudHJ5X3JlYWRgLCBhbmQgZW5hYmxpbmcgYHVubGluaygyKWAgb24gZW50cnkgZmlsZXMuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBpcyB0aGlzIHJlYWNoYWJsZSwgYW5kIGhvdyBjYW4gSSBicmVhayBpdD8KCkZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGF0IHRoaXMgaXMgYSBjcml0aWNhbCBjb2RlIHBhdGguIFllcywgYGJpbmZtdF9taXNjYCBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbC4gSXQmIzM5O3MgdGhlIGNvcmUgb2YgZXhlY3V0aW5nIGFyYml0cmFyeSBiaW5hcnkgZm9ybWF0cyB3aXRoaW4gdGhlIGtlcm5lbCwgc28gaXQmIzM5O3MgYSByaXBlIHRhcmdldCBmb3IgZnV6emluZy4gSSBjYW4gcmVhY2ggaXQgZnJvbSB1c2Vyc3BhY2UgYnkgbW91bnRpbmcgdGhlIGBiaW5mbXRfbWlzY2AgZmlsZXN5c3RlbSBhbmQgdGhlbiB3cml0aW5nIHRvIGl0cyBmaWxlcywgYW5kIGl0IHVsdGltYXRlbHkgbW9kaWZpZXMgYGxvYWRfbWlzY19iaW5hcnlgLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBgZXhlY3ZlYCBzeXN0ZW0gY2FsbCwgc28gdGhlcmUmIzM5O3MgcGxlbnR5IG9mIHVzZXIgaW50ZXJhY3Rpb24uIFRoYXQmIzM5O3MgZ29vZDsgdXNlciBpbnRlcmFjdGlvbiBpcyBjcml0aWNhbC4KCk5vdywgSSYjMzk7bSBnb2luZyB0byBtYXAgb3V0IHRoZSBhdHRhY2sgc3VyZmFjZS4gQmFzZWQgb24gdGhlIHBhdGNoLCBpdCBsb29rcyBsaWtlIHRoZXNlIGFyZSB0aGUga2V5IGZ1bmN0aW9ucyBJIHNob3VsZCBiZSBwYXlpbmcgYXR0ZW50aW9uIHRvOiBgZW50cnlfbWF0Y2hlc19tYWdpY2AsIGBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbmAsIGBzZWFyY2hfYmluZm10X2hhbmRsZXJgLCBgZ2V0X2JpbmZtdF9oYW5kbGVyYCwgYHB1dF9iaW5mbXRfaGFuZGxlcmAsIGBjdXJyZW50X2JpbmZtdF9taXNjYCwgYGxvYWRfbWlzY19iaW5hcnlgLCBgc2NhbmFyZ2AsIGBjaGVja19zcGVjaWFsX2ZsYWdzYCwgYHBhcnNlX21hZ2ljX2ZpZWxkc2AsIGBwYXJzZV9leHRlbnNpb25fZmllbGRzYCwgYGNyZWF0ZV9lbnRyeWAsIGBwYXJzZV9jb21tYW5kYCwgYGJtX3NlcV9oZXhgLCBgYm1fZW50cnlfc2hvd2AsIGBibV9nZXRfaW5vZGVgLCBgYm1fZXZpY3RfaW5vZGVgLCBgdW5saW5rX2JpbmZtdF9oYW5kbGVyYCwgYHJlbW92ZV9iaW5mbXRfaGFuZGxlcmAsIGBibV9yZW1vdmVfZW50cnlgLCBgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzYCwgYGJtX3VubGlua2AsIGBibV9lbnRyeV9vcGVuYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGFkZF9lbnRyeWAsIGBibV9yZWdpc3Rlcl93cml0ZWAsIGBibV9zdGF0dXNfcmVhZGAsIGBibV9zdGF0dXNfd3JpdGVgLCBhbmQgYGJtX2ZpbGxfc3VwZXJgLgoKR2l2ZW4gdGhhdCBtYXNzaXZlIGxpc3QsIEkgbmVlZCB0byBwcmlvcml0aXplLiBJJiMzOTttIHRoaW5raW5nIHRoZSByZWFsIG1lYXQgaXMgaW4gaG93IGl0JiMzOTtzICp1c2VkKiwgcmF0aGVyIHRoYW4gdGhlIGludGVybmFsIG1lY2hhbmljcy4gVGhlcmVmb3JlLCBJJiMzOTttIHplcm9pbmcgaW4gb246IGBsb2FkX21pc2NfYmluYXJ5YCAodGhlIHVsdGltYXRlIGVudHJ5IHBvaW50IGR1cmluZyBleGVjdXRpb24pLCBgYm1fcmVnaXN0ZXJfd3JpdGVgLCBgYm1fZW50cnlfd3JpdGVgLCBgYm1fc3RhdHVzX3dyaXRlYCwgYGJtX3VubGlua2AsIGBibV9lbnRyeV9vcGVuYCwgYW5kIGBibV9lbnRyeV9zaG93YC4gVGhvc2UgYXJlIHRoZSBlbnRyeSBwb2ludHMgdG8gcGxheSB3aXRoIGZpbGUgb3BlcmF0aW9ucy4KCkxhc3RseSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYnVpbGQgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuIGBDT05GSUdfQklORk1UX01JU0NgIGlzIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbi4gSSYjMzk7bGwgdmVyaWZ5IHRoaXMgdG8gbWFrZSBzdXJlIG15IHRlc3Rpbmcgc2V0dXAgaXMgdmFsaWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMjA6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QklORk1UX01JU0MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvS2NvbmZpZy5iaW5mbXQ9MTM4PWNvbmZpZyBCSU5GTVRfWkZMQVRcbi0tXG5mcy9LY29uZmlnLmJpbmZtdC0xNDQtXG5mcy9LY29uZmlnLmJpbmZtdDoxNDU6Y29uZmlnIEJJTkZNVF9NSVNDXG5mcy9LY29uZmlnLmJpbmZtdC0xNDYtXHR0cmlzdGF0ZSBcJiMzNDtLZXJuZWwgc3VwcG9ydCBmb3IgTUlTQyBiaW5hcmllc1wmIzM0O1xuLS1cbmZzL01ha2VmaWxlPTM0PW9iai0kKENPTkZJR19GSUxFX0xPQ0tJTkcpICAgICAgJiM0Mzs9IGxvY2tzLm9cbmZzL01ha2VmaWxlOjM1Om9iai0kKENPTkZJR19CSU5GTVRfTUlTQylcdCYjNDM7PSBiaW5mbXRfbWlzYy5vXG5mcy9NYWtlZmlsZS0zNi1vYmotJChDT05GSUdfQklORk1UX1NDUklQVClcdCYjNDM7PSBiaW5mbXRfc2NyaXB0Lm9cbi0tXG5mcy9maWxlX3RhYmxlLmM9MTY1PXN0YXRpYyBpbnQgX19pbml0IGluaXRfZnNfc3RhdF9zeXNjdGxzKHZvaWQpXG4tLVxuZnMvZmlsZV90YWJsZS5jLTE2Ny1cdHJlZ2lzdGVyX3N5c2N0bF9pbml0KFwmIzM0O2ZzXCYjMzQ7LCBmc19zdGF0X3N5c2N0bHMpO1xuZnMvZmlsZV90YWJsZS5jOjE2ODpcdGlmIChJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykpIHtcbmZzL2ZpbGVfdGFibGUuYy0xNjktXHRcdHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMjA6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgxNTAKCQkJCQkJCW91dHB1dDogMTY0CgkJCQkJCQl0aG91Z2h0czogNjcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJlZmluaW5nIHRoZSBGb2N1cyBmb3IgQklORk1UX01JU0MgQ292ZXJhZ2UqKgoKT2theSwgc28gSSYjMzk7bSBmb2N1c2luZyBvbiBgQklORk1UX01JU0NgLCB0aGF0JiMzOTtzIHRoZSBrZXkgY29uZmlnIGhlcmUuIExldCYjMzk7cyBzaGFycGVuIHRoZSBsaXN0IG9mIEZvY3VzU3ltYm9scyBmb3IgdGhlIGZ1enplci4gTXkgaW5pdGlhbCB0aG91Z2h0cyB3ZXJlIGdvb2QsIGBsb2FkX21pc2NfYmluYXJ5YCBpcyBkZWZpbml0ZWx5IGluIHNjb3BlLCBpdCYjMzk7cyB0aGUgYGxpbnV4X2JpbmZtdGAgaGFuZGxlciwgYW5kIGNyaXRpY2FsIGZvciBleGVjdXRpb24uIFRoZSBgYm1fcmVnaXN0ZXJfd3JpdGVgLCBgYm1fZW50cnlfd3JpdGVgLCBgYm1fc3RhdHVzX3dyaXRlYCwgYW5kIGBibV91bmxpbmtgIGZ1bmN0aW9ucyBhcmUgdGhlIGhhbmRsZXJzIGZvciBmaWxlIG9wZXJhdGlvbnMgb24gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbSwgc28gdGhleSBhcmUgZXNzZW50aWFsLiBgYm1fZW50cnlfb3BlbmAgc2VlbXMgaW1wb3J0YW50LCBhbmQgSSBuZWVkIHRvIG5vdGUgdGhhdCBpdCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBibV9lbnRyeV9zaG93YCBub3cgdGhhdCBpdCB1c2VzIHNlcV9maWxlLgoKTm93LCBgbG9hZF9taXNjX2JpbmFyeWAgZG9lcyBnZXQgY2FsbGVkIGJ5IGBzZWFyY2hfYmluYXJ5X2hhbmRsZXJgLCB3aGljaCBpcyBpdHNlbGYgY2FsbGVkIGJ5IGBicHJtX2V4ZWN2ZWAuIFRoYXQmIzM5O3MgYSBob3QgcGF0aCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgZnJlcXVlbmN5IG9mIGBleGVjdmVgIGNhbGxzLCBhbmQgaXQgaXMgc3BlY2lmaWMgdG8gYGJpbmZtdF9taXNjYCwgc28gaW5jbHVkaW5nIGl0IGlzIGVzc2VudGlhbC4gVGhlIG90aGVycyBzZWVtIGxpa2UgY2xlYXIgd2lucy4KCkFscmlnaHQsIEkgY2FuIGNvbmZpcm0gdGhhdCBgQklORk1UX01JU0NgIGlzIHN1ZmZpY2llbnQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHNpZGUgb2YgdGhpbmdzLgoKTGV0JiMzOTtzIGRvIGEgZmluYWwgcmV2aWV3IG9mIHRoZSBwYXRjaC4gVGhlIG5ldyBgYm1fdW5saW5rYCBpcyBhIG5ldyBmZWF0dXJlIGZvciB1bmxpbmtpbmcgZW50cnkgZmlsZXMsIHdoaWNoIG5lZWRzIHRlc3RpbmcuIEl0IGNoYW5nZXMgYGJtX2VudHJ5X3JlYWRgIHRvIGBibV9lbnRyeV9zaG93YCwgd2hpY2ggaXMgdGhlIHNlcV9maWxlLCBhbmQgaW1wb3J0YW50LiBJdCBhbHNvIHVwZGF0ZXMgYGxvYWRfbWlzY19iaW5hcnlgIHRvIHVzZSBSQ1UuIExhc3RseSwgaXQgdXBkYXRlcyBgY3JlYXRlX2VudHJ5YCB0byB1c2UgYHBhcnNlX21hZ2ljX2ZpZWxkc2AgYW5kIGBwYXJzZV9leHRlbnNpb25fZmllbGRzYC4KCkxldCYjMzk7cyByZWZpbmUgdGhlIGxpc3QuIEkgaGF2ZSBgbG9hZF9taXNjX2JpbmFyeWAsIGBibV9yZWdpc3Rlcl93cml0ZWAsIGBibV9lbnRyeV93cml0ZWAsIGBibV9zdGF0dXNfd3JpdGVgLCBgYm1fdW5saW5rYCwgYW5kIGBibV9lbnRyeV9zaG93YC4KCkkgaGFkIGBjcmVhdGVfZW50cnlgIGxpc3RlZCwgYnV0IHRoYXQmIzM5O3Mgc3RhdGljLiBCdXQgc3l6a2FsbGVyIGNhbiByZWFjaCBzdGF0aWMgZnVuY3Rpb25zIGlmIHJlYWNoYWJsZS4gQnV0LCBjb25zaWRlcmluZyBGb2N1c1N5bWJvbHMgaXMgYWJvdXQgY292ZXJhZ2UgZ3VpZGFuY2UgYW5kIGNvcnB1cyBwcmlvcml0aXphdGlvbiwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gbGlzdCB0aGUgcmVsZXZhbnQgc3lzY2FsbCBlbnRyeSBwb2ludHMgYW5kIHRoZSB0b3AtbGV2ZWwgaGFuZGxlcnMgYW5kIHRoYXQmIzM5O3MgY292ZXJlZCBpbiB0aGUgbGlzdCBhYm92ZS4gYGJtX3JlZ2lzdGVyX3dyaXRlYCBjYWxscyBgY3JlYXRlX2VudHJ5YC4KClNvIHRoZSBmaW5hbCBsaXN0IGZvciB0aGUgZnV6emVyOgoqICAgYGxvYWRfbWlzY19iaW5hcnlgCiogICBgYm1fcmVnaXN0ZXJfd3JpdGVgCiogICBgYm1fZW50cnlfd3JpdGVgCiogICBgYm1fc3RhdHVzX3dyaXRlYAoqICAgYGJtX3VubGlua2AKKiAgIGBibV9lbnRyeV9zaG93YAoKVGhlIHJlYXNvbmluZyBoZXJlIGlzIHRoYXQgdGhlIHBhdGNoIGZ1bmRhbWVudGFsbHkgcmVmYWN0b3JzIHRoZSBgYmluZm10X21pc2NgIGZpbGVzeXN0ZW0gd2l0aCBSQ1UtYmFzZWQgbG9va3Vwcywgc3BpbmxvY2sgYmFzZWQgbG9ja2luZywgYHNlcV9maWxlYCBmb3IgZW50cnkgcmVhZGluZywgYW5kIGFkZHMgZW50cnkgdW5saW5raW5nLCB3aGljaCBhcmUgYWxsIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBpbXBvcnRhbnQga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBwcmV2ZW50IHJlZ3Jlc3Npb25zLCBtZW1vcnkgbGVha3MsIG9yIGNvbmN1cnJlbmN5IHByb2JsZW1zLiBUaW1lIHRvIHNldCB0aGVzZSByZXN1bHRzIGFuZCBwdXNoIGZvcndhcmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMjA6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtibV9yZWdpc3Rlcl93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9zdGF0dXNfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fdW5saW5rJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2lnbmlmaWNhbnRseSByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0sIGludHJvZHVjaW5nIFJDVS1iYXNlZCBsb29rdXBzLCBjaGFuZ2luZyBpbnRlcm5hbCBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBjb252ZXJ0aW5nIGVudHJ5IHJlYWRpbmcgdG8gdXNlIHNlcV9maWxlLCBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIHJlbW92aW5nIGVudHJpZXMgdmlhIHVubGluaygyKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBubyByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBpc3N1ZXMgd2VyZSBpbnRyb2R1Y2VkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCSU5GTVRfTUlTQyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2xvYWRfbWlzY19iaW5hcnkmIzM0OywKICAgICYjMzQ7Ym1fcmVnaXN0ZXJfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fZW50cnlfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fc3RhdHVzX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3VubGluayYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV9zaG93JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDIwOjMyOjM4Ljc4NDYxMjIwNVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNDEwOTQ3MzE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwiYm1fZW50cnlfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMjA6MzI6MzguNzg0NjE5MDY1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTc2MDE3MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhODc3ZGIxYmZiN2QyZDhhNWJjZmVhMDNmM2ZjMTEyYzg0MDNhZDMyXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgSnVsIDEwIDIwOjMyOjM3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG5pbmRleCBjMGEzNGZiZjgwMjJiNS4uMzA2ZWY0OGY1ZGU2ZGQgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxcbkBAIC0xMzMsNyArMTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxcbiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC5cXG4gXFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcXG4tb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuXFxuK29yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLiBBIHNpbmdsZSBlbnRyeSBjYW4gYWxzbyBiZSByZW1vdmVkXFxuK2J5IHNpbXBseSB1bmxpbmtpbmcgKGBgcm1gYCkgYGAvcHJvYy8uLi4vdGhlX25hbWVgYC5cXG4gXFxuIFxcbiBIaW50c1xcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xcbmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mNTFkMjcyNjk4NjE2MCAxMDA2NDRcXG4tLS0gYS9mcy9iaW5mbXRfbWlzYy5jXFxuKysrIGIvZnMvYmluZm10X21pc2MuY1xcbkBAIC0xMCw0NSArMTAsNDYgQEBcXG4gXFxuICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXFxcIjogXFxcIiBmbXRcXG4gXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvaGV4LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9tbS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpbmZtdHMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdG9wcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jbGVhbnVwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcmVkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9jdHlwZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25hbWVpLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb3VudC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnNfY29udGV4dC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3lzY2FsbHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rc3RydG94LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tYWdpYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zZXFfZmlsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gXFxuLSNpbmNsdWRlIFxcXCJpbnRlcm5hbC5oXFxcIlxcbi1cXG4tI2lmZGVmIERFQlVHXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXFxuLSNlbHNlXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAwXFxuLSNlbmRpZlxcbi1cXG4tZW51bSB7XFxuLVxcdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xcbisvKiBFbnRyeSBzdGF0dXMgYW5kIG1hdGNoIHR5cGUgYml0IG51bWJlcnMuICovXFxuK2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XFxuK1xcdE1JU0NfRk1UX0VOQUJMRURfQklUXFx0PSAwLFxcbitcXHRNSVNDX0ZNVF9NQUdJQ19CSVRcXHQ9IDEsXFxuIH07XFxuIFxcbi1lbnVtIHtFbmFibGVkLCBNYWdpY307XFxuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcXHUwMDNjXFx1MDAzYyAzMSlcXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKVxcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXFx1MDAzY1xcdTAwM2MgMjkpXFxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXFx1MDAzY1xcdTAwM2MgMjgpXFxuKy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi9cXG4rZW51bSBiaW5mbXRfbWlzY19lbnRyeV9mbGFncyB7XFxuK1xcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXFx0PSAoMVUgXFx1MDAzY1xcdTAwM2MgMzEpLFxcbitcXHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDMwKSxcXG4rXFx0TUlTQ19GTVRfQ1JFREVOVElBTFNcXHQ9ICgxVSBcXHUwMDNjXFx1MDAzYyAyOSksXFxuK1xcdE1JU0NfRk1UX09QRU5fRklMRVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDI4KSxcXG4rfTtcXG4gXFxuLXR5cGVkZWYgc3RydWN0IHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xcbitzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xcbitcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcdFxcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xcbiBcXHRpbnQgb2Zmc2V0O1xcdFxcdFxcdC8qIG9mZnNldCBvZiBtYWdpYyAqL1xcbiBcXHRpbnQgc2l6ZTtcXHRcXHRcXHQvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi9cXG5AQCAtNTksOSArNjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XFxuIFxcdHN0cnVjdCBkZW50cnkgKmRlbnRyeTtcXG4gXFx0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xcbiBcXHRyZWZjb3VudF90IHVzZXJzO1xcdFxcdC8qIHN5bmMgcmVtb3ZhbCB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSAqL1xcbi19IE5vZGU7XFxuLVxcbi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcXG4rXFx0c3RydWN0IHJjdV9oZWFkIHJjdTtcXG4rXFx0Y2hhciBidWZbXTtcXHRcXHRcXHQvKiByZWdpc3RlciBzdHJpbmcsIGZpZWxkcyBwb2ludCBpbiBoZXJlICovXFxuK307XFxuIFxcbiAvKlxcbiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OlxcbkBAIC03NCwxMCArNzUsMzYgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqICAtIGludGVycDogfjUwIGJ5dGVzXFxuICAqICAtIGZsYWdzOiAgNSBieXRlc1xcbiAgKiBSb3VuZCB0aGF0IHVwIGEgYml0LCBhbmQgdGhlbiBiYWNrIG9mZiB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhXFxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cXG4rICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cXG4gICovXFxuICNkZWZpbmUgTUFYX1JFR0lTVEVSX0xFTkdUSCAxOTIwXFxuIFxcbisvKiBUcmFpbGluZyBkZWxpbWl0ZXIgcGFkIHNvIGZpZWxkIHBhcnNpbmcgYWx3YXlzIHRlcm1pbmF0ZXMgYXQgYSBkZWxpbWl0ZXIuICovXFxuKyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxcbitcXG4rLyogQ2hlY2sgaWYgQGUncyBtYWdpYyBtYXRjaGVzIEBicHJtJ3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovXFxuK3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxcbitcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnMgPSBicHJtLVxcdTAwM2VidWYgKyBlLVxcdTAwM2VvZmZzZXQ7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRyZXR1cm4gIW1lbWNtcChzLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaSsrKVxcbitcXHRcXHRpZiAoKHNbaV0gXiBlLVxcdTAwM2VtYWdpY1tpXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2ldKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisvKiBDaGVjayBpZiBAZSdzIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIG1hdGNoZXMgQGV4dCwgTlVMTCBpZiB0aGVyZSBpcyBub25lLiAqL1xcbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXFxuK1xcdFxcdFxcdFxcdCAgICBjb25zdCBjaGFyICpleHQpXFxuK3tcXG4rXFx0cmV0dXJuIGV4dCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBleHQpO1xcbit9XFxuK1xcbiAvKipcXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxcbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXFxuQEAgLTg2LDQzICsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeVxcbiAgKiB0eXBlIGhhbmRsZXJzLlxcbiAgKlxcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cXG4rICpcXG4gICogUmV0dXJuOiBiaW5hcnkgdHlwZSBsaXN0IGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZVxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuLVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxcbitzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbiB7XFxuLVxcdGNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tXFx1MDAzZWludGVycCwgJy4nKTtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0Y2hhciAqZG90ID0gc3RycmNocihicHJtLVxcdTAwM2VpbnRlcnAsICcuJyk7XFxuK1xcdGNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCArIDEgOiBOVUxMO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuIFxcbiBcXHQvKiBXYWxrIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy4gKi9cXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdCkge1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXHRcXHRpbnQgajtcXG4tXFxuK1xcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbm9kZSkge1xcbiBcXHRcXHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXFxuLVxcdFxcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4rXFx0XFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cXG4tXFx0XFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSkge1xcbi1cXHRcXHRcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBwICsgMSkpXFxuK1xcdFxcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXFxuIFxcdFxcdFxcdFxcdHJldHVybiBlO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXFx1MDAyNiBtYXNrLiAqL1xcbi1cXHRcXHRzID0gYnBybS1cXHUwMDNlYnVmICsgZS1cXHUwMDNlb2Zmc2V0O1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzaykge1xcbi1cXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaisrKVxcbi1cXHRcXHRcXHRcXHRpZiAoKCpzKysgXiBlLVxcdTAwM2VtYWdpY1tqXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2pdKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIGUtXFx1MDAzZXNpemU7IGorKylcXG4tXFx0XFx0XFx0XFx0aWYgKCgqcysrIF4gZS1cXHUwMDNlbWFnaWNbal0pKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGUsIGV4dCkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGlmIChqID09IGUtXFx1MDAzZXNpemUpXFxuLVxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMTM0LDY0ICsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcXG4gICpcXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXFxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cXG4rICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGVcXG4rICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXFxuKyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxcbisgKiBpcyBib3VuZGVkLlxcbiAgKlxcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXFxuICAqL1xcbi1zdGF0aWMgTm9kZSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4tXFx0XFx0XFx0XFx0c3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xcbiBcXG4tXFx0cmVhZF9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xcbi1cXHRpZiAoZSlcXG4tXFx0XFx0cmVmY291bnRfaW5jKFxcdTAwMjZlLVxcdTAwM2V1c2Vycyk7XFxuLVxcdHJlYWRfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRndWFyZChyY3UpKCk7XFxuK1xcdGRvIHtcXG4rXFx0XFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4rXFx0fSB3aGlsZSAoZSBcXHUwMDI2XFx1MDAyNiAhcmVmY291bnRfaW5jX25vdF96ZXJvKFxcdTAwMjZlLVxcdTAwM2V1c2VycykpO1xcbiBcXHRyZXR1cm4gZTtcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlXFxuLSAqIEBlOiBub2RlIHRvIHB1dFxcbisgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcXG4rICogQGU6IGVudHJ5IHRvIHB1dFxcbiAgKlxcbi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xcbisgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cXG4gICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZVxcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxcbiAgKi9cXG4tc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpXFxuK3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXFxuIHtcXG4gXFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcXHUwMDI2ZS1cXHUwMDNldXNlcnMpKSB7XFxuLVxcdFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcXG4rXFx0XFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XFxuK1xcdFxcdFxcdGV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZS1cXHUwMDNlaW50ZXJwX2ZpbGUsIE5VTEwpO1xcbi1cXHRcXHRrZnJlZShlKTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xcbitcXHRcXHRrZnJlZV9yY3UoZSwgcmN1KTtcXG4gXFx0fVxcbiB9XFxuIFxcbitERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXFxuK1xcbiAvKipcXG4tICogbG9hZF9iaW5mbXRfbWlzYyAtIGxvYWQgdGhlIGJpbmZtdF9taXNjIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxcbisgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcXG4gICpcXG4tICogVG8gYmUgY2FsbGVkIGluIGxvYWRfbWlzY19iaW5hcnkoKSB0byBsb2FkIHRoZSByZWxldmFudCBzdHJ1Y3QgYmluZm10X21pc2MuXFxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlXFxuLSAqIG9mIGl0cyBhbmNlc3RvcidzIGJpbmZtdF9taXNjIGhhbmRsZXJzLiBUaGlzIG1pbWlja3MgdGhlIGJlaGF2aW9yIG9mXFxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXFxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXFxuKyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgdXNlcyB0aGVcXG4rICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxcbisgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxcbisgKiB0byBhbGwgdXNlcnMgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLiBUaGUgaW5pdCB1c2VyIG5hbWVzcGFjZVxcbisgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxcbisgKiBwcmFjdGljZS5cXG4gICpcXG4gICogUmV0dXJuOiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlcidzIHVzZXIgbmFtZXNwYWNlXFxuICAqL1xcbi1zdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcXG4ge1xcbiBcXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4gXFxuLVxcdHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTtcXG4tXFx0d2hpbGUgKHVzZXJfbnMpIHtcXG4rXFx0Zm9yICh1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7IHVzZXJfbnM7IHVzZXJfbnMgPSB1c2VyX25zLVxcdTAwM2VwYXJlbnQpIHtcXG4gXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cXG4gXFx0XFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNnVzZXJfbnMtXFx1MDAzZWJpbmZtdF9taXNjKTtcXG4gXFx0XFx0aWYgKG1pc2MpXFxuIFxcdFxcdFxcdHJldHVybiBtaXNjO1xcbi1cXG4tXFx0XFx0dXNlcl9ucyA9IHVzZXJfbnMtXFx1MDAzZXBhcmVudDtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIFxcdTAwMjZpbml0X2JpbmZtdF9taXNjO1xcbkBAIC0yMDIsMzAgKzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuICAqL1xcbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4ge1xcbi1cXHROb2RlICpmbXQ7XFxuLVxcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZSA9IE5VTEw7XFxuLVxcdGludCByZXR2YWwgPSAtRU5PRVhFQztcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4rXFx0aW50IHJldHZhbDtcXG4gXFxuLVxcdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XFxuLVxcdGlmICghbWlzYy1cXHUwMDNlZW5hYmxlZClcXG4tXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4rXFx0bWlzYyA9IGN1cnJlbnRfYmluZm10X21pc2MoKTtcXG4rXFx0aWYgKCFSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkpXFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdGZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4gXFx0aWYgKCFmbXQpXFxuLVxcdFxcdHJldHVybiByZXR2YWw7XFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cXG4tXFx0cmV0dmFsID0gLUVOT0VOVDtcXG4gXFx0aWYgKGJwcm0tXFx1MDAzZWludGVycF9mbGFncyBcXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcXG4tXFx0XFx0Z290byByZXQ7XFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkge1xcbiBcXHRcXHRicHJtLVxcdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7XFxuIFxcdFxcdGlmIChyZXR2YWwpXFxuLVxcdFxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAoZm10LVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxcbkBAIC0yMzQsNTcgKzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4gXFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cXG4gXFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGJwcm0tXFx1MDAzZWludGVycCwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xcbiBcXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoZm10LVxcdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXFxuIFxcdHJldHZhbCA9IGJwcm1fY2hhbmdlX2ludGVycChmbXQtXFx1MDAzZWludGVycHJldGVyLCBicHJtKTtcXG4gXFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuLVxcdFxcdGlmICghSVNfRVJSKGludGVycF9maWxlKSlcXG4tXFx0XFx0XFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xcbitcXHRcXHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHtcXG4rXFx0XFx0XFx0aW50IGVyciA9IGV4ZV9maWxlX2Rlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChlcnIpIHtcXG4rXFx0XFx0XFx0XFx0ZnB1dChpbnRlcnBfZmlsZSk7XFxuK1xcdFxcdFxcdFxcdGludGVycF9maWxlID0gRVJSX1BUUihlcnIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBvcGVuX2V4ZWMoZm10LVxcdTAwM2VpbnRlcnByZXRlcik7XFxuIFxcdH1cXG4tXFx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XFxuIFxcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpO1xcbiBcXG4gXFx0YnBybS1cXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcXG4gXFx0XFx0YnBybS1cXHUwMDNlZXhlY2ZkX2NyZWRzID0gMTtcXG4tXFxuLVxcdHJldHZhbCA9IDA7XFxuLXJldDpcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvXFxuLVxcdCAqIGxvYWRfbWlzY19iaW5hcnkoKSB3aWxsIGhhdmUgZmluaXNoZWQuIFdlIGFsc28ga25vd1xcbi1cXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxcbi1cXHQgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0J3Mgb3VyIGpvYiB0b1xcbi1cXHQgKiBmcmVlIGl0Llxcbi1cXHQgKi9cXG4tXFx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0dmFsO1xcbitcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gLyogQ29tbWFuZCBwYXJzZXJzICovXFxuIFxcbiAvKlxcbi0gKiBwYXJzZXMgYW5kIGNvcGllcyBvbmUgYXJndW1lbnQgZW5jbG9zZWQgaW4gZGVsIGZyb20gKnNwIHRvICpkcCxcXG4tICogcmVjb2duaXNpbmcgdGhlIFxcXFx4IHNwZWNpYWwuXFxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxcbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cXG4rICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZ1xcbisgKiB0aGUgXFxcXHggZXNjYXBlLiBUZXJtaW5hdGVzIHRoZSBhcmd1bWVudCB3aXRoIGEgTlVMIGFuZCByZXR1cm5zIGEgcG9pbnRlclxcbisgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxcbiAgKi9cXG4gc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpXFxuIHtcXG5AQCAtMjk5LDQ2ICszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuLVxcdHNbLTFdID0nXFxcXDAnO1xcbitcXHRzWy0xXSA9ICdcXFxcMCc7XFxuIFxcdHJldHVybiBzO1xcbiB9XFxuIFxcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXFxuK3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHRjaGFyICpwID0gc2ZzO1xcbi1cXHRpbnQgY29udCA9IDE7XFxuLVxcbi1cXHQvKiBzcGVjaWFsIGZsYWdzICovXFxuLVxcdHdoaWxlIChjb250KSB7XFxuK1xcdGZvciAoOzsgcCsrKSB7XFxuIFxcdFxcdHN3aXRjaCAoKnApIHtcXG4gXFx0XFx0Y2FzZSAnUCc6XFxuIFxcdFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxcXG5cXFwiKTtcXG4tXFx0XFx0XFx0cCsrO1xcbiBcXHRcXHRcXHRlLVxcdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMDtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ08nOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdHArKztcXG4gXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdDJzpcXG4gXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBmbGFnOiBDIChwcmVzZXJ2ZSBjcmVkcylcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuLVxcdFxcdFxcdC8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZVxcbi1cXHRcXHRcXHQgICBvcGVuLWJpbmFyeSBmbGFnICovXFxuLVxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8XFxuLVxcdFxcdFxcdFxcdFxcdE1JU0NfRk1UX09QRU5fQklOQVJZKTtcXG4rXFx0XFx0XFx0LyogQyBpbXBsaWVzIE8gKi9cXG4rXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfQ1JFREVOVElBTFMgfCBNSVNDX0ZNVF9PUEVOX0JJTkFSWTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ0YnOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuIFxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGRlZmF1bHQ6XFxuLVxcdFxcdFxcdGNvbnQgPSAwO1xcbitcXHRcXHRcXHRyZXR1cm4gcDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuK31cXG4rXFxuKy8qIFBhcnNlIHRoZSAnb2Zmc2V0JywgJ21hZ2ljJyBhbmQgJ21hc2snIGZpZWxkcyBvZiBhbiAnTScgZW50cnkuICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcXG4re1xcbitcXHRjaGFyICpzO1xcbitcXG4rXFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcylcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpzID0gJ1xcXFwwJztcXG4rXFx0aWYgKHAgIT0gcykge1xcbitcXHRcXHRpZiAoa3N0cnRvaW50KHAsIDEwLCBcXHUwMDI2ZS1cXHUwMDNlb2Zmc2V0KSB8fCBlLVxcdTAwM2VvZmZzZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHRwID0gcyArIDE7XFxuK1xcdHByX2RlYnVnKFxcXCJyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXFxcblxcXCIsIGUtXFx1MDAzZW9mZnNldCk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZC4gKi9cXG4rXFx0ZS1cXHUwMDNlbWFnaWMgPSBwO1xcbitcXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xcbitcXHRpZiAoIXAgfHwgIWUtXFx1MDAzZW1hZ2ljWzBdKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXFxuK1xcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tyYXddOiBcXFwiLFxcbitcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFnaWMsIHAgLSBlLVxcdTAwM2VtYWdpYywgdHJ1ZSk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRlLVxcdTAwM2VtYXNrID0gcDtcXG4rXFx0cCA9IHNjYW5hcmcocCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrWzBdKSB7XFxuK1xcdFxcdGUtXFx1MDAzZW1hc2sgPSBOVUxMO1xcbitcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXFxcblxcXCIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFxcXCIsXFxuK1xcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYXNrLCBwIC0gZS1cXHUwMDNlbWFzaywgdHJ1ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZFxcbitcXHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XFxuK1xcdCAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuXFxuK1xcdCAqL1xcbitcXHRlLVxcdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrIFxcdTAwMjZcXHUwMDI2IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cXHUwMDNlc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChlLVxcdTAwM2VzaXplIFxcdTAwM2UgQklOUFJNX0JVRl9TSVpFIHx8IEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcdHByaW50X2hleF9kdW1wX2RlYnVnKFxcbitcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFxcXCIsXFxuK1xcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcXFwiLFxcbitcXHRcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFzaywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdHJldHVybiBwO1xcbit9XFxuK1xcbisvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZCBvZiBhbiAnRScgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcXG4rXFx0XFx0XFx0XFx0ICAgIGNoYXIgZGVsKVxcbit7XFxuK1xcdC8qIFNraXAgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbiBcXG4rXFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXFxuK1xcdGUtXFx1MDAzZW1hZ2ljID0gcDtcXG4rXFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbitcXHRpZiAoIXApXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHQqcCsrID0gJ1xcXFwwJztcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYWdpY1swXSB8fCBzdHJjaHIoZS1cXHUwMDNlbWFnaWMsICcvJykpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbitcXG4rXFx0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRyZXR1cm4gcDtcXG4gfVxcbiBcXG5AQCAtMzQ3LDUwICs0MzMsNDggQEAgc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxcbiAgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncydcXG4gICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBzaXplX3QgY291bnQpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4tXFx0aW50IG1lbXNpemUsIGVycjtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRjaGFyICpidWYsICpwO1xcbiBcXHRjaGFyIGRlbDtcXG4gXFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogcmVjZWl2ZWQgJXp1IGJ5dGVzXFxcXG5cXFwiLCBjb3VudCk7XFxuIFxcbiBcXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cXG4tXFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0aWYgKChjb3VudCBcXHUwMDNjIDExKSB8fCAoY291bnQgXFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tXFx0ZXJyID0gLUVOT01FTTtcXG4tXFx0bWVtc2l6ZSA9IHNpemVvZihOb2RlKSArIGNvdW50ICsgODtcXG4tXFx0ZSA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4rXFx0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCArIE1JU0NfREVMSU1fUEFEKSxcXG4rXFx0XFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuIFxcdGlmICghZSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiBcXG4tXFx0cCA9IGJ1ZiA9IChjaGFyICopZSArIHNpemVvZihOb2RlKTtcXG4rXFx0cCA9IGJ1ZiA9IGUtXFx1MDAzZWJ1ZjtcXG4gXFxuLVxcdG1lbXNldChlLCAwLCBzaXplb2YoTm9kZSkpO1xcbitcXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxcbi1cXHRcXHRnb3RvIGVmYXVsdDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuIFxcbi1cXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltZXRlciAqL1xcbitcXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltaXRlciAqL1xcbiBcXG4gXFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cXFxcblxcXCIsIGRlbCwgZGVsKTtcXG4gXFxuIFxcdC8qIFBhZCB0aGUgYnVmZmVyIHdpdGggdGhlIGRlbGltIHRvIHNpbXBsaWZ5IHBhcnNpbmcgYmVsb3cuICovXFxuLVxcdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCA4KTtcXG4rXFx0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnbmFtZScgZmllbGQuICovXFxuIFxcdGUtXFx1MDAzZW5hbWUgPSBwO1xcbiBcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuIFxcdGlmICghcClcXG4tXFx0XFx0Z290byBlaW52YWw7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXHQqcCsrID0gJ1xcXFwwJztcXG4gXFx0aWYgKCFlLVxcdTAwM2VuYW1lWzBdIHx8XFxuIFxcdCAgICAhc3RyY21wKGUtXFx1MDAzZW5hbWUsIFxcXCIuXFxcIikgfHxcXG4gXFx0ICAgICFzdHJjbXAoZS1cXHUwMDNlbmFtZSwgXFxcIi4uXFxcIikgfHxcXG4gXFx0ICAgIHN0cmNocihlLVxcdTAwM2VuYW1lLCAnLycpKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbiBcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG5hbWU6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXG5AQCAtMzk4LDEzNCArNDgyLDMzIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiBcXHRzd2l0Y2ggKCpwKyspIHtcXG4gXFx0Y2FzZSAnRSc6XFxuIFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogdHlwZTogRSAoZXh0ZW5zaW9uKVxcXFxuXFxcIik7XFxuLVxcdFxcdGUtXFx1MDAzZWZsYWdzID0gMSBcXHUwMDNjXFx1MDAzYyBFbmFibGVkO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRjYXNlICdNJzpcXG4gXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXFxcblxcXCIpO1xcbi1cXHRcXHRlLVxcdTAwM2VmbGFncyA9ICgxIFxcdTAwM2NcXHUwMDNjIEVuYWJsZWQpIHwgKDEgXFx1MDAzY1xcdTAwM2MgTWFnaWMpO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCkgfCBCSVQoTUlTQ19GTVRfTUFHSUNfQklUKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFx0fVxcbiBcXHRpZiAoKnArKyAhPSBkZWwpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0aWYgKHRlc3RfYml0KE1hZ2ljLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKSB7XFxuLVxcdFxcdC8qIEhhbmRsZSB0aGUgJ00nIChtYWdpYykgZm9ybWF0LiAqL1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbi1cXHRcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcylcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdCpzID0gJ1xcXFwwJztcXG4tXFx0XFx0aWYgKHAgIT0gcykge1xcbi1cXHRcXHRcXHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXFx1MDAyNmUtXFx1MDAzZW9mZnNldCk7XFxuLVxcdFxcdFxcdGlmIChyICE9IDAgfHwgZS1cXHUwMDNlb2Zmc2V0IFxcdTAwM2MgMClcXG4tXFx0XFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdH1cXG4tXFx0XFx0cCA9IHM7XFxuLVxcdFxcdGlmICgqcCsrKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxcXFxuXFxcIiwgZS1cXHUwMDNlb2Zmc2V0KTtcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0pXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRpZiAoVVNFX0RFQlVHKVxcbi1cXHRcXHRcXHRwcmludF9oZXhfZHVtcF9ieXRlcyhcXG4tXFx0XFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFxcXCIsXFxuLVxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hZ2ljLCBwIC0gZS1cXHUwMDNlbWFnaWMpO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0ZS1cXHUwMDNlbWFzayA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFza1swXSkge1xcbi1cXHRcXHRcXHRlLVxcdTAwM2VtYXNrID0gTlVMTDtcXG4tXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxcXG5cXFwiKTtcXG4tXFx0XFx0fSBlbHNlIGlmIChVU0VfREVCVUcpXFxuLVxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFzaywgcCAtIGUtXFx1MDAzZW1hc2spO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy5cXG4tXFx0XFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxcbi1cXHRcXHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxcbi1cXHRcXHQgKiBpdCBlbmNvdW50ZXJzLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZS1cXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzayBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVxcdTAwM2VzaXplKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0aWYgKGUtXFx1MDAzZXNpemUgXFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHxcXG4tXFx0XFx0ICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcdFxcdGlmIChVU0VfREVCVUcpIHtcXG4tXFx0XFx0XFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXFxuLVxcdFxcdFxcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFnaWMsIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0XFx0aW50IGk7XFxuLVxcdFxcdFxcdFxcdGNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS1cXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4tXFxuLVxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hc2ssIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0XFx0aWYgKG1hc2tlZCkge1xcbi1cXHRcXHRcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgKytpKVxcbi1cXHRcXHRcXHRcXHRcXHRcXHRtYXNrZWRbaV0gPSBlLVxcdTAwM2VtYWdpY1tpXSBcXHUwMDI2IGUtXFx1MDAzZW1hc2tbaV07XFxuLVxcdFxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcbi1cXHRcXHRcXHRcXHRcXHRrZnJlZShtYXNrZWQpO1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHQvKiBIYW5kbGUgdGhlICdFJyAoZXh0ZW5zaW9uKSBmb3JtYXQuICovXFxuLVxcbi1cXHRcXHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4tXFx0XFx0aWYgKCFwKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0KnArKyA9ICdcXFxcMCc7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXFx1MDAzZW1hZ2ljLCAnLycpKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4tXFxuLVxcdFxcdC8qIFNraXAgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFx0fVxcbitcXHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cCA9IHBhcnNlX2V4dGVuc2lvbl9maWVsZHMoZSwgcCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnaW50ZXJwcmV0ZXInIGZpZWxkLiAqL1xcbiBcXHRlLVxcdTAwM2VpbnRlcnByZXRlciA9IHA7XFxuIFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4gXFx0aWYgKCFwKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRpZiAoIWUtXFx1MDAzZWludGVycHJldGVyWzBdKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogaW50ZXJwcmV0ZXI6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZWludGVycHJldGVyKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnZmxhZ3MnIGZpZWxkLiAqL1xcbkBAIC01MzMsMjQgKzUxNiwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcXG4gXFx0aWYgKCpwID09ICdcXFxcbicpXFxuIFxcdFxcdHArKztcXG4gXFx0aWYgKHAgIT0gYnVmICsgY291bnQpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0cmV0dXJuIGU7XFxuLVxcbi1vdXQ6XFxuLVxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tZWZhdWx0Olxcbi1cXHRrZnJlZShlKTtcXG4tXFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuLWVpbnZhbDpcXG4tXFx0a2ZyZWUoZSk7XFxuLVxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXHRyZXR1cm4gbm9fZnJlZV9wdHIoZSk7XFxuIH1cXG4gXFxuKy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXFx1MDAzY2VudHJ5XFx1MDAzZSBmaWxlcy4gKi9cXG4rZW51bSBibV9jb21tYW5kIHtcXG4rXFx0Qk1fQ01EX0lHTk9SRSxcXHQvKiBlbXB0eSB3cml0ZSAqL1xcbitcXHRCTV9DTURfRElTQUJMRSxcXHQvKiBcXFwiMFxcXCIgKi9cXG4rXFx0Qk1fQ01EX0VOQUJMRSxcXHQvKiBcXFwiMVxcXCIgKi9cXG4rXFx0Qk1fQ01EX1JFTU9WRSxcXHQvKiBcXFwiLTFcXFwiICovXFxuK307XFxuK1xcbiAvKlxcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxcbi0gKiAnMScgZW5hYmxlcywgJzAnIGRpc2FibGVzIGFuZCAnLTEnIGNsZWFycyBlbnRyeS9iaW5mbXRfbWlzY1xcbisgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICcxJyBlbmFibGVzLFxcbisgKiAnMCcgZGlzYWJsZXMgYW5kICctMScgcmVtb3ZlcyB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMuXFxuICAqL1xcbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiB7XFxuQEAgLTU2MSw2MiArNTQyLDY0IEBAIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdGlmICghY291bnQpXFxuLVxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0lHTk9SRTtcXG4gXFx0aWYgKHNbY291bnQgLSAxXSA9PSAnXFxcXG4nKVxcbiBcXHRcXHRjb3VudC0tO1xcbiBcXHRpZiAoY291bnQgPT0gMSBcXHUwMDI2XFx1MDAyNiBzWzBdID09ICcwJylcXG4tXFx0XFx0cmV0dXJuIDE7XFxuK1xcdFxcdHJldHVybiBCTV9DTURfRElTQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDEgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAyO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0VOQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDIgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnLScgXFx1MDAyNlxcdTAwMjYgc1sxXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAzO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcXG4gXFx0cmV0dXJuIC1FSU5WQUw7XFxuIH1cXG4gXFxuIC8qIGdlbmVyaWMgc3R1ZmYgKi9cXG4gXFxuLXN0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKVxcbitzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKVxcbiB7XFxuLVxcdGNoYXIgKmRwID0gcGFnZTtcXG4tXFx0Y29uc3QgY2hhciAqc3RhdHVzID0gXFxcImRpc2FibGVkXFxcIjtcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzaXplOyBpKyspXFxuK1xcdFxcdHNlcV9wcmludGYobSwgXFxcIiUwMnhcXFwiLCBkYXRhW2ldKTtcXG4rfVxcbiBcXG4tXFx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpXFxuLVxcdFxcdHN0YXR1cyA9IFxcXCJlbmFibGVkXFxcIjtcXG4rc3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKVxcbit7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tXFx1MDAzZXByaXZhdGU7XFxuIFxcbi1cXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XFxuLVxcdFxcdHNwcmludGYocGFnZSwgXFxcIiVzXFxcXG5cXFwiLCBzdGF0dXMpO1xcbi1cXHRcXHRyZXR1cm47XFxuLVxcdH1cXG4rXFx0aWYgKHRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRzZXFfcHV0cyhtLCBcXFwiZW5hYmxlZFxcXFxuXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c2VxX3B1dHMobSwgXFxcImRpc2FibGVkXFxcXG5cXFwiKTtcXG4gXFxuLVxcdGRwICs9IHNwcmludGYoZHAsIFxcXCIlc1xcXFxuaW50ZXJwcmV0ZXIgJXNcXFxcblxcXCIsIHN0YXR1cywgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbitcXHRzZXFfcHJpbnRmKG0sIFxcXCJpbnRlcnByZXRlciAlc1xcXFxuXFxcIiwgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbiBcXG4gXFx0LyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi9cXG4tXFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcImZsYWdzOiBcXFwiKTtcXG4rXFx0c2VxX3B1dHMobSwgXFxcImZsYWdzOiBcXFwiKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApXFxuLVxcdFxcdCpkcCsrID0gJ1AnO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnUCcpO1xcbiBcXHRpZiAoZS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSlcXG4tXFx0XFx0KmRwKysgPSAnTyc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdPJyk7XFxuIFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxcbi1cXHRcXHQqZHArKyA9ICdDJztcXG4rXFx0XFx0c2VxX3B1dGMobSwgJ0MnKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxcbi1cXHRcXHQqZHArKyA9ICdGJztcXG4tXFx0KmRwKysgPSAnXFxcXG4nO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnRicpO1xcbitcXHRzZXFfcHV0YyhtLCAnXFxcXG4nKTtcXG4gXFxuLVxcdGlmICghdGVzdF9iaXQoTWFnaWMsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4tXFx0XFx0c3ByaW50ZihkcCwgXFxcImV4dGVuc2lvbiAuJXNcXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4rXFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwiZXh0ZW5zaW9uIC4lc1xcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRkcCArPSBzcHJpbnRmKGRwLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbi1cXHRcXHRkcCA9IGJpbjJoZXgoZHAsIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbitcXHRcXHRibV9zZXFfaGV4KG0sIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4tXFx0XFx0XFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0XFx0c2VxX3B1dHMobSwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4rXFx0XFx0XFx0Ym1fc2VxX2hleChtLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0fVxcbi1cXHRcXHQqZHArKyA9ICdcXFxcbic7XFxuLVxcdFxcdCpkcCA9ICdcXFxcMCc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdcXFxcbicpO1xcbiBcXHR9XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpXFxuK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpXFxuIHtcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7XFxuIFxcbkBAIC02NTIsMTQgKzYzNSwxNCBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICppX2JpbmZtdF9taXNjKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcXG4gICogc2h1dGRvd24uXFxuICAqXFxuLSAqIElmIHRoZSAtXFx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZVxcbi0gKiB0byByZW1vdmUgdGhlIGVudHJ5IG9yIGFsbCBlbnRyaWVzIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIHRoZSBlbnRyeVxcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXFxuLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC5cXG4rICogSWYgdGhlIC1cXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieVxcbisgKiByZW1vdmluZyB0aGUgZW50cnkgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgb3IgdW5saW5rKDIpIHRoZSBlbnRyeVxcbisgKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgaGxpc3RfdW5oYXNoZWQoKVxcbisgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuXFxuICovXFxuIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIHtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcbiBcXHRjbGVhcl9pbm9kZShpbm9kZSk7XFxuIFxcbkBAIC02NjcsODkgKzY1MCwxMzIgQEAgc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4gXFx0XFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXG4gXFx0XFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xcbi1cXHRcXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRcXHRpZiAoIWxpc3RfZW1wdHkoXFx1MDAyNmUtXFx1MDAzZWxpc3QpKVxcbi1cXHRcXHRcXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0XFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdGlmICghaGxpc3RfdW5oYXNoZWQoXFx1MDAyNmUtXFx1MDAzZW5vZGUpKVxcbitcXHRcXHRcXHRobGlzdF9kZWxfaW5pdF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUpO1xcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4gXFx0XFx0cHV0X2JpbmZtdF9oYW5kbGVyKGUpO1xcbiBcXHR9XFxuIH1cXG4gXFxuKy8qKlxcbisgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuKyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4rICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXFxuKyAqXFxuKyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcXG4rICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxcbisgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxcbisgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxcbisgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcXG4rICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0aGxpc3RfZGVsX2luaXRfcmN1KFxcdTAwMjZlLVxcdTAwM2Vub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4gICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gcmVtb3ZlXFxuICAqXFxuICAqIFJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBvZiBiaW5hcnkgdHlwZSBoYW5kbGVycyBhbmRcXG4tICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4gVGhpcyBpcyBjYWxsZWQgZnJvbVxcbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxcbi0gKiBhZGRpbmcgYSBwcm9wZXIgLVxcdTAwM2V1bmxpbmsoKSBtZXRob2QgdG8gYmluZm10X21pc2MgaW5zdGVhZCBvZiBmb3JjaW5nIGNhbGxlcidzXFxuLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzXFxuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0J3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuXFxuKyAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuXFxuICAqL1xcbi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKVxcbitzdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuIFxcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVxcdTAwM2VkZW50cnksIE5VTEwpO1xcbiB9XFxuIFxcbi0vKiAvXFx1MDAzY2VudHJ5XFx1MDAzZSAqL1xcbisvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXFxuK3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuK3tcXG4rXFx0c3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi1cXHUwMDNlc19yb290KTtcXG4gXFxuLXN0YXRpYyBzc2l6ZV90XFxuLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRpZiAoIWhsaXN0X3VuaGFzaGVkKFxcdTAwMjZlLVxcdTAwM2Vub2RlKSlcXG4rXFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2Mocm9vdCksIGUpO1xcbitcXHRpbm9kZV91bmxvY2socm9vdCk7XFxuK31cXG4rXFxuKy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdE5vZGUgKmUgPSBmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX3ByaXZhdGU7XFxuLVxcdHNzaXplX3QgcmVzO1xcbi1cXHRjaGFyICpwYWdlO1xcbitcXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVxcdTAwM2VzX3Jvb3QpO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuK1xcdHN0cnVjdCBobGlzdF9ub2RlICpuZXh0O1xcbitcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzLCBub2RlKVxcbitcXHRcXHRyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuK1xcdGlub2RlX3VubG9jayhyb290KTtcXG4rfVxcbiBcXG4tXFx0cGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcXG4tXFx0aWYgKCFwYWdlKVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rLyoqXFxuKyAqIGJtX3VubGluayAtIHJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgdmlhIHVubGluaygyKVxcbisgKiBAZGlyOiBpbm9kZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnlcXG4rICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmVcXG4rICpcXG4rICogUmVtb3ZpbmcgdGhlIGVudHJ5IGZpbGUgcmVtb3ZlcyBpdHMgYmluYXJ5IHR5cGUgaGFuZGxlciwgZXhhY3RseSBsaWtlXFxuKyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4ndCBiZVxcbisgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcXG4rICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cXG4rICovXFxuK3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXFxuK3tcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gZF9pbm9kZShkZW50cnkpLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcbitcXHRpZiAoIWUpXFxuK1xcdFxcdHJldHVybiAtRVBFUk07XFxuK1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcXG4rXFx0cmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpO1xcbit9XFxuIFxcbi1cXHRlbnRyeV9zdGF0dXMoZSwgcGFnZSk7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBibV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHtcXG4rXFx0Lmxvb2t1cFxcdFxcdD0gc2ltcGxlX2xvb2t1cCxcXG4rXFx0LnVubGlua1xcdFxcdD0gYm1fdW5saW5rLFxcbit9O1xcbiBcXG4tXFx0cmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBhZ2UsIHN0cmxlbihwYWdlKSk7XFxuKy8qIC9cXHUwMDNjZW50cnlcXHUwMDNlICovXFxuK1xcbitzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4gXFxuLVxcdGtmcmVlKHBhZ2UpO1xcbi1cXHRyZXR1cm4gcmVzO1xcbitcXHRyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS1cXHUwMDNlaV9wcml2YXRlKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXFxuK1xcdGlmIChmaWxlLVxcdTAwM2VmX21vZGUgXFx1MDAyNiBGTU9ERV9XUklURSlcXG4rXFx0XFx0ZmlsZS1cXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcXG4rXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4ge1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcdGludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpO1xcbiBcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0Y2xlYXJfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuK1xcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XFxuK1xcdFxcdGNsZWFyX2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0c2V0X2JpdChFbmFibGVkLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpO1xcbitcXHRjYXNlIEJNX0NNRF9FTkFCTEU6XFxuK1xcdFxcdHNldF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuIFxcdFxcdGJyZWFrO1xcbi1cXHRjYXNlIDM6XFxuLVxcdFxcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXFxuLVxcdFxcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KTtcXG4tXFx0XFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxcbi1cXHRcXHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXFxuLVxcdFxcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxcbi1cXHRcXHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4ndCBiZVxcbi1cXHRcXHQgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzb1xcbi1cXHRcXHQgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2VcXG4tXFx0XFx0ICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZlLVxcdTAwM2VsaXN0KSlcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoaW5vZGUpLCBlKTtcXG4tXFxuLVxcdFxcdGlub2RlX3VubG9jayhpbm9kZSk7XFxuK1xcdGNhc2UgQk1fQ01EX1JFTU9WRTpcXG4rXFx0XFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdHJldHVybiByZXM7XFxuQEAgLTc1OSwxNSArNzg1LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiB9XFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xcbi1cXHQucmVhZFxcdFxcdD0gYm1fZW50cnlfcmVhZCxcXG4rXFx0Lm9wZW5cXHRcXHQ9IGJtX2VudHJ5X29wZW4sXFxuK1xcdC5yZWFkXFx0XFx0PSBzZXFfcmVhZCxcXG4gXFx0LndyaXRlXFx0XFx0PSBibV9lbnRyeV93cml0ZSxcXG4tXFx0Lmxsc2Vla1xcdFxcdD0gZGVmYXVsdF9sbHNlZWssXFxuK1xcdC5sbHNlZWtcXHRcXHQ9IHNlcV9sc2VlayxcXG4rXFx0LnJlbGVhc2VcXHQ9IHNpbmdsZV9yZWxlYXNlLFxcbiB9O1xcbiBcXG4gLyogL3JlZ2lzdGVyICovXFxuIFxcbiAvKiBhZGQgdG8gZmlsZXN5c3RlbSAqL1xcbi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHtcXG4gXFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLVxcdTAwM2VzX3Jvb3QsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbkBAIC03ODksOSArODE3LDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4gXFxuIFxcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7XFxuLVxcdHdyaXRlX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuLVxcdGxpc3RfYWRkKFxcdTAwMjZlLVxcdTAwM2VsaXN0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuLVxcdHdyaXRlX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRobGlzdF9hZGRfaGVhZF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuIFxcdHNpbXBsZV9kb25lX2NyZWF0aW5nKGRlbnRyeSk7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuQEAgLTc5OSwxMyArODI3LDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHQgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYjtcXG4tXFx0aW50IGVyciA9IDA7XFxuIFxcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcXG4rXFx0aW50IGVycjtcXG4gXFxuIFxcdGUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7XFxuLVxcbiBcXHRpZiAoSVNfRVJSKGUpKVxcbiBcXHRcXHRyZXR1cm4gUFRSX0VSUihlKTtcXG4gXFxuQEAgLTgyMiw3ICs4NDksNiBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcXG4gXFx0XFx0aWYgKElTX0VSUihmKSkge1xcbiBcXHRcXHRcXHRwcl9ub3RpY2UoXFxcInJlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRcXHQgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbi1cXHRcXHRcXHRrZnJlZShlKTtcXG4gXFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoZik7XFxuIFxcdFxcdH1cXG4gXFx0XFx0ZS1cXHUwMDNlaW50ZXJwX2ZpbGUgPSBmO1xcbkBAIC04MzQsOSArODYwLDExIEBAIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XFxuIFxcdFxcdH1cXG4tXFx0XFx0a2ZyZWUoZSk7XFxuIFxcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG4rXFxuK1xcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xcbitcXHRyZXRhaW5fYW5kX251bGxfcHRyKGUpO1xcbiBcXHRyZXR1cm4gY291bnQ7XFxuIH1cXG4gXFxuQEAgLTg1MSwxMCArODc5LDEwIEBAIHN0YXRpYyBzc2l6ZV90XFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbi1cXHRjaGFyICpzO1xcbitcXHRjb25zdCBjaGFyICpzO1xcbiBcXG4gXFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XFxuLVxcdHMgPSBtaXNjLVxcdTAwM2VlbmFibGVkID8gXFxcImVuYWJsZWRcXFxcblxcXCIgOiBcXFwiZGlzYWJsZWRcXFxcblxcXCI7XFxuK1xcdHMgPSBSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkgPyBcXFwiZW5hYmxlZFxcXFxuXFxcIiA6IFxcXCJkaXNhYmxlZFxcXFxuXFxcIjtcXG4gXFx0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBzLCBzdHJsZW4ocykpO1xcbiB9XFxuIFxcbkBAIC04NjMsMzcgKzg5MSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcXG4tXFx0Tm9kZSAqZSwgKm5leHQ7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTtcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xcbitcXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxcbitcXHRcXHRXUklURV9PTkNFKG1pc2MtXFx1MDAzZWVuYWJsZWQsIGZhbHNlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IHRydWU7XFxuK1xcdGNhc2UgQk1fQ01EX0VOQUJMRTpcXG4rXFx0XFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMzpcXG4tXFx0XFx0LyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0aW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktXFx1MDAzZWlfc2ItXFx1MDAzZXNfcm9vdCk7XFxuLVxcdFxcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3RcXG4tXFx0XFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxcbi1cXHRcXHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cXG4tXFx0XFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcXG4tXFx0XFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cXG4tXFx0XFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXFxuLVxcdFxcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdClcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xcbi1cXG4tXFx0XFx0aW5vZGVfdW5sb2NrKGlub2RlKTtcXG4rXFx0Y2FzZSBCTV9DTURfUkVNT1ZFOlxcbitcXHRcXHRibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYik7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbkBAIC05MTgsNyArOTI2LDcgQEAgc3RhdGljIHZvaWQgYm1fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIFxcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XFxuIFxcdC5zdGF0ZnNcXHRcXHQ9IHNpbXBsZV9zdGF0ZnMsXFxuIFxcdC5ldmljdF9pbm9kZVxcdD0gYm1fZXZpY3RfaW5vZGUsXFxuIFxcdC5wdXRfc3VwZXJcXHQ9IGJtX3B1dF9zdXBlcixcXG5AQCAtOTY1LDEwICs5NzMsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG4gXFx0XFx0aWYgKCFtaXNjKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFxuLVxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4tXFx0XFx0cndsb2NrX2luaXQoXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdElOSVRfSExJU1RfSEVBRChcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuK1xcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbiBcXG4tXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gbG9hZF9iaW5mbXRfbWlzYygpLiAqL1xcbitcXHRcXHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXFxuIFxcdFxcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZ1c2VyX25zLVxcdTAwM2ViaW5mbXRfbWlzYywgbWlzYyk7XFxuIFxcdH1cXG4gXFxuQEAgLTk4MywxMiArOTkxLDE1IEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuIFxcdCAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHlcXG4gXFx0ICogcmVzZXQgLVxcdTAwM2VlbmFibGVkIHRvIHRydWUuXFxuIFxcdCAqL1xcbi1cXHRtaXNjLVxcdTAwM2VlbmFibGVkID0gdHJ1ZTtcXG4rXFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFxuIFxcdGVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpO1xcbi1cXHRpZiAoIWVycilcXG4tXFx0XFx0c2ItXFx1MDAzZXNfb3AgPSBcXHUwMDI2c19vcHM7XFxuLVxcdHJldHVybiBlcnI7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRzYi1cXHUwMDNlc19vcCA9IFxcdTAwMjZibV9zdXBlcl9vcHM7XFxuK1xcdGRfaW5vZGUoc2ItXFx1MDAzZXNfcm9vdCktXFx1MDAzZWlfb3AgPSBcXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBibV9mcmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oXFxuQEAgLTEwMSw4ICsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHtcXG4gXFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcXG4gc3RydWN0IGJpbmZtdF9taXNjIHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzO1xcbi1cXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XFxuK1xcdHN0cnVjdCBobGlzdF9oZWFkIGVudHJpZXM7XFxuK1xcdHNwaW5sb2NrX3QgZW50cmllc19sb2NrO1xcbiBcXHRib29sIGVuYWJsZWQ7XFxuIH0gX19yYW5kb21pemVfbGF5b3V0O1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmNcXG5pbmRleCA3YWVmNGU2NzlhNmEwYy4uMjFiYWZkYzExMzc5NTYgMTAwNjQ0XFxuLS0tIGEva2VybmVsL3VzZXIuY1xcbisrKyBiL2tlcm5lbC91c2VyLmNcXG5AQCAtMjMsOSArMjMsOSBAQFxcbiBcXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxcbiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHtcXG4tXFx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxcbitcXHQuZW50cmllcyA9IEhMSVNUX0hFQURfSU5JVCxcXG4gXFx0LmVuYWJsZWQgPSB0cnVlLFxcbi1cXHQuZW50cmllc19sb2NrID0gX19SV19MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4rXFx0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4gfTtcXG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9iaW5mbXRfbWlzYyk7XFxuICNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQyMDozMjozOS40ODMwNDk2NTFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIwNzEyNTAxMTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwiYm1fZW50cnlfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhODc3ZGIxYmZiN2QyZDhhNWJjZmVhMDNmM2ZjMTEyYzg0MDNhZDMyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMTAgMjA6MzI6MzcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG5pbmRleCBjMGEzNGZiZjgwMjJiNS4uMzA2ZWY0OGY1ZGU2ZGQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbkBAIC0xMzMsNyArMTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxuIENhdHRpbmcgdGhlIGZpbGUgdGVsbHMgeW91IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBgYGJpbmZtdF9taXNjL3RoZV9lbnRyeWBgLlxuIFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcbi1vciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC5cbitvciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC4gQSBzaW5nbGUgZW50cnkgY2FuIGFsc28gYmUgcmVtb3ZlZFxuK2J5IHNpbXBseSB1bmxpbmtpbmcgKGBgcm1gYCkgYGAvcHJvYy8uLi4vdGhlX25hbWVgYC5cbiBcbiBcbiBIaW50c1xuZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jXG5pbmRleCA4NDM0OWZjYjkzZjEzYS4uZjUxZDI3MjY5ODYxNjAgMTAwNjQ0XG4tLS0gYS9mcy9iaW5mbXRfbWlzYy5jXG4rKysgYi9mcy9iaW5mbXRfbWlzYy5jXG5AQCAtMTAsNDUgKzEwLDQ2IEBAXG4gXG4gI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSBcIjogXCIgZm10XG4gXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2hleC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvbW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9iaW5mbXRzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1Zy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3R5cGUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9uYW1laS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW91bnQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N5c2NhbGxzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZnNfY29udGV4dC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgva3N0cnRveC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcHJpbnRrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2VxX2ZpbGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3VzZXJfbmFtZXNwYWNlLmhcdTAwM2VcbiBcbi0jaW5jbHVkZSBcImludGVybmFsLmhcIlxuLVxuLSNpZmRlZiBERUJVR1xuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXG4tI2Vsc2Vcbi0jIGRlZmluZSBVU0VfREVCVUcgMFxuLSNlbmRpZlxuLVxuLWVudW0ge1xuLVx0VkVSQk9TRV9TVEFUVVMgPSAxIC8qIG1ha2UgaXQgemVybyB0byBzYXZlIDQwMCBieXRlcyBrZXJuZWwgbWVtb3J5ICovXG4rLyogRW50cnkgc3RhdHVzIGFuZCBtYXRjaCB0eXBlIGJpdCBudW1iZXJzLiAqL1xuK2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XG4rXHRNSVNDX0ZNVF9FTkFCTEVEX0JJVFx0PSAwLFxuK1x0TUlTQ19GTVRfTUFHSUNfQklUXHQ9IDEsXG4gfTtcbiBcbi1lbnVtIHtFbmFibGVkLCBNYWdpY307XG4tI2RlZmluZSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCAoMVVMIFx1MDAzY1x1MDAzYyAzMSlcbi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fQklOQVJZICgxVUwgXHUwMDNjXHUwMDNjIDMwKVxuLSNkZWZpbmUgTUlTQ19GTVRfQ1JFREVOVElBTFMgKDFVTCBcdTAwM2NcdTAwM2MgMjkpXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0ZJTEUgKDFVTCBcdTAwM2NcdTAwM2MgMjgpXG4rLyogRW50cnkgYmVoYXZpb3IgZmxhZ3MsIGZpeGVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiAqL1xuK2VudW0gYmluZm10X21pc2NfZW50cnlfZmxhZ3Mge1xuK1x0TUlTQ19GTVRfUFJFU0VSVkVfQVJHVjBcdD0gKDFVIFx1MDAzY1x1MDAzYyAzMSksXG4rXHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVx0PSAoMVUgXHUwMDNjXHUwMDNjIDMwKSxcbitcdE1JU0NfRk1UX0NSRURFTlRJQUxTXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMjkpLFxuK1x0TUlTQ19GTVRfT1BFTl9GSUxFXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMjgpLFxuK307XG4gXG4tdHlwZWRlZiBzdHJ1Y3Qge1xuLVx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuK3N0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSB7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xuIFx0dW5zaWduZWQgbG9uZyBmbGFncztcdFx0LyogdHlwZSwgc3RhdHVzLCBldGMuICovXG4gXHRpbnQgb2Zmc2V0O1x0XHRcdC8qIG9mZnNldCBvZiBtYWdpYyAqL1xuIFx0aW50IHNpemU7XHRcdFx0Lyogc2l6ZSBvZiBtYWdpYy9tYXNrICovXG5AQCAtNTksOSArNjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7XG4gXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XG4gXHRyZWZjb3VudF90IHVzZXJzO1x0XHQvKiBzeW5jIHJlbW92YWwgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgKi9cbi19IE5vZGU7XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XG4rXHRzdHJ1Y3QgcmN1X2hlYWQgcmN1O1xuK1x0Y2hhciBidWZbXTtcdFx0XHQvKiByZWdpc3RlciBzdHJpbmcsIGZpZWxkcyBwb2ludCBpbiBoZXJlICovXG4rfTtcbiBcbiAvKlxuICAqIE1heCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHN0cmluZy4gIERldGVybWluZWQgYnk6XG5AQCAtNzQsMTAgKzc1LDM2IEBAIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuICAqICAtIGludGVycDogfjUwIGJ5dGVzXG4gICogIC0gZmxhZ3M6ICA1IGJ5dGVzXG4gICogUm91bmQgdGhhdCB1cCBhIGJpdCwgYW5kIHRoZW4gYmFjayBvZmYgdG8gaG9sZCB0aGUgaW50ZXJuYWwgZGF0YVxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cbisgKiAobGlrZSBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkpLlxuICAqL1xuICNkZWZpbmUgTUFYX1JFR0lTVEVSX0xFTkdUSCAxOTIwXG4gXG4rLyogVHJhaWxpbmcgZGVsaW1pdGVyIHBhZCBzbyBmaWVsZCBwYXJzaW5nIGFsd2F5cyB0ZXJtaW5hdGVzIGF0IGEgZGVsaW1pdGVyLiAqL1xuKyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxuK1xuKy8qIENoZWNrIGlmIEBlJ3MgbWFnaWMgbWF0Y2hlcyBAYnBybSdzIGJ1ZmZlciwgYXBwbHlpbmcgdGhlIG1hc2sgaWYgc2V0LiAqL1xuK3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuK1x0XHRcdFx0Y29uc3Qgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbit7XG4rXHRjb25zdCBjaGFyICpzID0gYnBybS1cdTAwM2VidWYgKyBlLVx1MDAzZW9mZnNldDtcbitcdGludCBpO1xuK1xuK1x0aWYgKCFlLVx1MDAzZW1hc2spXG4rXHRcdHJldHVybiAhbWVtY21wKHMsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBlLVx1MDAzZXNpemU7IGkrKylcbitcdFx0aWYgKChzW2ldIF4gZS1cdTAwM2VtYWdpY1tpXSkgXHUwMDI2IGUtXHUwMDNlbWFza1tpXSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rLyogQ2hlY2sgaWYgQGUncyByZWdpc3RlcmVkIGV4dGVuc2lvbiBtYXRjaGVzIEBleHQsIE5VTEwgaWYgdGhlcmUgaXMgbm9uZS4gKi9cbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXG4rXHRcdFx0XHQgICAgY29uc3QgY2hhciAqZXh0KVxuK3tcbitcdHJldHVybiBleHQgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZS1cdTAwM2VtYWdpYywgZXh0KTtcbit9XG4rXG4gLyoqXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbkBAIC04Niw0MyArMTEzLDMwIEBAIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeVxuICAqIHR5cGUgaGFuZGxlcnMuXG4gICpcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cbisgKlxuICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmVcbiAgKi9cbi1zdGF0aWMgTm9kZSAqc2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbi1cdFx0XHRcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqXG4rc2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHRjaGFyICpwID0gc3RycmNocihicHJtLVx1MDAzZWludGVycCwgJy4nKTtcbi1cdE5vZGUgKmU7XG4rXHRjaGFyICpkb3QgPSBzdHJyY2hyKGJwcm0tXHUwMDNlaW50ZXJwLCAnLicpO1xuK1x0Y29uc3QgY2hhciAqZXh0ID0gZG90ID8gZG90ICsgMSA6IE5VTEw7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4gXG4gXHQvKiBXYWxrIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy4gKi9cbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBsaXN0KSB7XG4tXHRcdGNoYXIgKnM7XG4tXHRcdGludCBqO1xuLVxuK1x0aGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSkge1xuIFx0XHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXG4tXHRcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4rXHRcdGlmICghdGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cbi1cdFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0XHRpZiAocCBcdTAwMjZcdTAwMjYgIXN0cmNtcChlLVx1MDAzZW1hZ2ljLCBwICsgMSkpXG4rXHRcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4rXHRcdFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXG4gXHRcdFx0XHRyZXR1cm4gZTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBtYWdpYyBcdTAwMjYgbWFzay4gKi9cbi1cdFx0cyA9IGJwcm0tXHUwMDNlYnVmICsgZS1cdTAwM2VvZmZzZXQ7XG4tXHRcdGlmIChlLVx1MDAzZW1hc2spIHtcbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBlLVx1MDAzZXNpemU7IGorKylcbi1cdFx0XHRcdGlmICgoKnMrKyBeIGUtXHUwMDNlbWFnaWNbal0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbal0pXG4tXHRcdFx0XHRcdGJyZWFrO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIGUtXHUwMDNlc2l6ZTsgaisrKVxuLVx0XHRcdFx0aWYgKCgqcysrIF4gZS1cdTAwM2VtYWdpY1tqXSkpXG4tXHRcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdGlmIChlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihlLCBleHQpKVxuK1x0XHRcdFx0cmV0dXJuIGU7XG4gXHRcdH1cbi1cdFx0aWYgKGogPT0gZS1cdTAwM2VzaXplKVxuLVx0XHRcdHJldHVybiBlO1xuIFx0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG5AQCAtMTM0LDY0ICsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4gICogQGJwcm06IGJpbmFyeSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgZm9yIGEgaGFuZGxlclxuICAqXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXG4tICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLlxuKyAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gVGhlXG4rICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXG4rICogYSByZXN0YXJ0ZWQgc2VhcmNoIGNhbm5vdCBmaW5kIGFuIHVubGlua2VkIGVudHJ5IGFnYWluIHNvIHRoZSByZXRyeSBsb29wXG4rICogaXMgYm91bmRlZC5cbiAgKlxuICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmVcbiAgKi9cbi1zdGF0aWMgTm9kZSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbi1cdFx0XHRcdHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdFx0XHQgICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICplO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuIFxuLVx0cmVhZF9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdGUgPSBzZWFyY2hfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4tXHRpZiAoZSlcbi1cdFx0cmVmY291bnRfaW5jKFx1MDAyNmUtXHUwMDNldXNlcnMpO1xuLVx0cmVhZF91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0Z3VhcmQocmN1KSgpO1xuK1x0ZG8ge1xuK1x0XHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuK1x0fSB3aGlsZSAoZSBcdTAwMjZcdTAwMjYgIXJlZmNvdW50X2luY19ub3RfemVybyhcdTAwMjZlLVx1MDAzZXVzZXJzKSk7XG4gXHRyZXR1cm4gZTtcbiB9XG4gXG4gLyoqXG4tICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIG5vZGVcbi0gKiBAZTogbm9kZSB0byBwdXRcbisgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcbisgKiBAZTogZW50cnkgdG8gcHV0XG4gICpcbi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xuKyAqIEZyZWUgZW50cnkgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xuICAqIGxvYWRfbWlzY19iaW5hcnkoKSBpbiBjYXNlIGl0IGlzIHVzaW5nIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIHdlIHdlcmVcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxuICAqL1xuLXN0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihOb2RlICplKVxuK3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuIFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZlLVx1MDAzZXVzZXJzKSkge1xuLVx0XHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxuK1x0XHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XG4rXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGUtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZS1cdTAwM2VpbnRlcnBfZmlsZSwgTlVMTCk7XG4tXHRcdGtmcmVlKGUpO1xuK1x0XHR9XG4rXHRcdC8qIExvY2tsZXNzIHdhbGtlcnMgbWF5IHN0aWxsIGRlcmVmZXJlbmNlIHRoaXMgZW50cnkuICovXG4rXHRcdGtmcmVlX3JjdShlLCByY3UpO1xuIFx0fVxuIH1cbiBcbitERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXG4rXG4gLyoqXG4tICogbG9hZF9iaW5mbXRfbWlzYyAtIGxvYWQgdGhlIGJpbmZtdF9taXNjIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxuKyAqIGN1cnJlbnRfYmluZm10X21pc2MgLSBnZXQgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxuICAqXG4tICogVG8gYmUgY2FsbGVkIGluIGxvYWRfbWlzY19iaW5hcnkoKSB0byBsb2FkIHRoZSByZWxldmFudCBzdHJ1Y3QgYmluZm10X21pc2MuXG4tICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2Vzbid0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCBjYW4gbWFrZSB1c2Vcbi0gKiBvZiBpdHMgYW5jZXN0b3IncyBiaW5mbXRfbWlzYyBoYW5kbGVycy4gVGhpcyBtaW1pY2tzIHRoZSBiZWhhdmlvciBvZlxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXG4tICogYXZhaWxhYmxlIHRvIGFsbCB1c2VyIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS5cbisgKiBJZiBhIHVzZXIgbmFtZXNwYWNlIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IHVzZXMgdGhlXG4rICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxuKyAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIHdlcmUgYXZhaWxhYmxlXG4rICogdG8gYWxsIHVzZXJzIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4gVGhlIGluaXQgdXNlciBuYW1lc3BhY2VcbisgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxuKyAqIHByYWN0aWNlLlxuICAqXG4gICogUmV0dXJuOiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlcidzIHVzZXIgbmFtZXNwYWNlXG4gICovXG4tc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXG4tXHR1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7XG4tXHR3aGlsZSAodXNlcl9ucykge1xuK1x0Zm9yICh1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7IHVzZXJfbnM7IHVzZXJfbnMgPSB1c2VyX25zLVx1MDAzZXBhcmVudCkge1xuIFx0XHQvKiBQYWlycyB3aXRoIHNtcF9zdG9yZV9yZWxlYXNlKCkgaW4gYm1fZmlsbF9zdXBlcigpLiAqL1xuIFx0XHRtaXNjID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZ1c2VyX25zLVx1MDAzZWJpbmZtdF9taXNjKTtcbiBcdFx0aWYgKG1pc2MpXG4gXHRcdFx0cmV0dXJuIG1pc2M7XG4tXG4tXHRcdHVzZXJfbnMgPSB1c2VyX25zLVx1MDAzZXBhcmVudDtcbiBcdH1cbiBcbiBcdHJldHVybiBcdTAwMjZpbml0X2JpbmZtdF9taXNjO1xuQEAgLTIwMiwzMCArMjIxLDI5IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZClcbiAgKi9cbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICpmbXQ7XG4tXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGUgPSBOVUxMO1xuLVx0aW50IHJldHZhbCA9IC1FTk9FWEVDO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xuK1x0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuK1x0aW50IHJldHZhbDtcbiBcbi1cdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XG4tXHRpZiAoIW1pc2MtXHUwMDNlZW5hYmxlZClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbitcdG1pc2MgPSBjdXJyZW50X2JpbmZtdF9taXNjKCk7XG4rXHRpZiAoIVJFQURfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQpKVxuK1x0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHRmbXQgPSBnZXRfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4gXHRpZiAoIWZtdClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbitcdFx0cmV0dXJuIC1FTk9FWEVDO1xuIFxuIFx0LyogTmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgdGhlIGZpbGUgYWZ0ZXIgZXhlYyAqL1xuLVx0cmV0dmFsID0gLUVOT0VOVDtcbiBcdGlmIChicHJtLVx1MDAzZWludGVycF9mbGFncyBcdTAwMjYgQklOUFJNX0ZMQUdTX1BBVEhfSU5BQ0NFU1NJQkxFKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkge1xuIFx0XHRicHJtLVx1MDAzZWludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfUFJFU0VSVkVfQVJHVjA7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7XG4gXHRcdGlmIChyZXR2YWwpXG4tXHRcdFx0Z290byByZXQ7XG4rXHRcdFx0cmV0dXJuIHJldHZhbDtcbiBcdH1cbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxuQEAgLTIzNCw1NyArMjUyLDQ4IEBAIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChicHJtLVx1MDAzZWludGVycCwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIHJldHZhbDtcbiBcdGJwcm0tXHUwMDNlYXJnYysrO1xuIFxuIFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xuIFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIHJldHZhbDtcbiBcdGJwcm0tXHUwMDNlYXJnYysrO1xuIFxuIFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXG4gXHRyZXR2YWwgPSBicHJtX2NoYW5nZV9pbnRlcnAoZm10LVx1MDAzZWludGVycHJldGVyLCBicHJtKTtcbiBcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4tXHRcdGdvdG8gcmV0O1xuK1x0XHRyZXR1cm4gcmV0dmFsO1xuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XG4gXHRcdGludGVycF9maWxlID0gZmlsZV9jbG9uZV9vcGVuKGZtdC1cdTAwM2VpbnRlcnBfZmlsZSk7XG4tXHRcdGlmICghSVNfRVJSKGludGVycF9maWxlKSlcbi1cdFx0XHRkZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7XG4rXHRcdGlmICghSVNfRVJSKGludGVycF9maWxlKSkge1xuK1x0XHRcdGludCBlcnIgPSBleGVfZmlsZV9kZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7XG4rXG4rXHRcdFx0aWYgKGVycikge1xuK1x0XHRcdFx0ZnB1dChpbnRlcnBfZmlsZSk7XG4rXHRcdFx0XHRpbnRlcnBfZmlsZSA9IEVSUl9QVFIoZXJyKTtcbitcdFx0XHR9XG4rXHRcdH1cbiBcdH0gZWxzZSB7XG4gXHRcdGludGVycF9maWxlID0gb3Blbl9leGVjKGZtdC1cdTAwM2VpbnRlcnByZXRlcik7XG4gXHR9XG4tXHRyZXR2YWwgPSBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpO1xuIFxuIFx0YnBybS1cdTAwM2VpbnRlcnByZXRlciA9IGludGVycF9maWxlO1xuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfQ1JFREVOVElBTFMpXG4gXHRcdGJwcm0tXHUwMDNlZXhlY2ZkX2NyZWRzID0gMTtcbi1cbi1cdHJldHZhbCA9IDA7XG4tcmV0OlxuLVxuLVx0Lypcbi1cdCAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvXG4tXHQgKiBsb2FkX21pc2NfYmluYXJ5KCkgd2lsbCBoYXZlIGZpbmlzaGVkLiBXZSBhbHNvIGtub3dcbi1cdCAqIHRoYXQgZm9yIHRoZSByZWZjb3VudCB0byBiZSB6ZXJvIHNvbWVvbmUgbXVzdCBoYXZlIGNvbmN1cmVudGx5XG4tXHQgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0J3Mgb3VyIGpvYiB0b1xuLVx0ICogZnJlZSBpdC5cbi1cdCAqL1xuLVx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XG4tXG4tXHRyZXR1cm4gcmV0dmFsO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIC8qIENvbW1hbmQgcGFyc2VycyAqL1xuIFxuIC8qXG4tICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsXG4tICogcmVjb2duaXNpbmcgdGhlIFxceCBzcGVjaWFsLlxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxuLSAqIGVycm9yIChhbmQgc2V0cyBlcnIpIG9yIG51bGwgYXJndW1lbnQgbGVuZ3RoLlxuKyAqIFNjYW4gdGhlIGFyZ3VtZW50IHN0YXJ0aW5nIGF0IEBzIHVwIHRvIHRoZSBkZWxpbWl0ZXIgQGRlbCwgcmVjb2duaXNpbmdcbisgKiB0aGUgXFx4IGVzY2FwZS4gVGVybWluYXRlcyB0aGUgYXJndW1lbnQgd2l0aCBhIE5VTCBhbmQgcmV0dXJucyBhIHBvaW50ZXJcbisgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxuICAqL1xuIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIHtcbkBAIC0yOTksNDYgKzMwOCwxMjMgQEAgc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpXG4gXHRcdFx0XHRyZXR1cm4gTlVMTDtcbiBcdFx0fVxuIFx0fVxuLVx0c1stMV0gPSdcXDAnO1xuK1x0c1stMV0gPSAnXFwwJztcbiBcdHJldHVybiBzO1xuIH1cbiBcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXG4rc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqcCwgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbi1cdGNoYXIgKnAgPSBzZnM7XG4tXHRpbnQgY29udCA9IDE7XG4tXG4tXHQvKiBzcGVjaWFsIGZsYWdzICovXG4tXHR3aGlsZSAoY29udCkge1xuK1x0Zm9yICg7OyBwKyspIHtcbiBcdFx0c3dpdGNoICgqcCkge1xuIFx0XHRjYXNlICdQJzpcbiBcdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBmbGFnOiBQIChwcmVzZXJ2ZSBhcmd2MClcXG5cIik7XG4tXHRcdFx0cCsrO1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjA7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ08nOlxuIFx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxcblwiKTtcbi1cdFx0XHRwKys7XG4gXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0JJTkFSWTtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnQyc6XG4gXHRcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogZmxhZzogQyAocHJlc2VydmUgY3JlZHMpXFxuXCIpO1xuLVx0XHRcdHArKztcbi1cdFx0XHQvKiB0aGlzIGZsYWdzIGFsc28gaW1wbGllcyB0aGVcbi1cdFx0XHQgICBvcGVuLWJpbmFyeSBmbGFnICovXG4tXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSAoTUlTQ19GTVRfQ1JFREVOVElBTFMgfFxuLVx0XHRcdFx0XHRNSVNDX0ZNVF9PUEVOX0JJTkFSWSk7XG4rXHRcdFx0LyogQyBpbXBsaWVzIE8gKi9cbitcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX0NSRURFTlRJQUxTIHwgTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ0YnOlxuIFx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXG5cIik7XG4tXHRcdFx0cCsrO1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9GSUxFO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuLVx0XHRcdGNvbnQgPSAwO1xuK1x0XHRcdHJldHVybiBwO1xuIFx0XHR9XG4gXHR9XG4rfVxuK1xuKy8qIFBhcnNlIHRoZSAnb2Zmc2V0JywgJ21hZ2ljJyBhbmQgJ21hc2snIGZpZWxkcyBvZiBhbiAnTScgZW50cnkuICovXG4rc3RhdGljIGNoYXIgKnBhcnNlX21hZ2ljX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsIGNoYXIgZGVsKVxuK3tcbitcdGNoYXIgKnM7XG4rXG4rXHQvKiBQYXJzZSB0aGUgJ29mZnNldCcgZmllbGQuICovXG4rXHRzID0gc3RyY2hyKHAsIGRlbCk7XG4rXHRpZiAoIXMpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0KnMgPSAnXFwwJztcbitcdGlmIChwICE9IHMpIHtcbitcdFx0aWYgKGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpIHx8IGUtXHUwMDNlb2Zmc2V0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiBOVUxMO1xuK1x0fVxuK1x0cCA9IHMgKyAxO1xuK1x0cHJfZGVidWcoXCJyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXG5cIiwgZS1cdTAwM2VvZmZzZXQpO1xuK1xuK1x0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4rXHRlLVx1MDAzZW1hZ2ljID0gcDtcbitcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4rXHRpZiAoIXAgfHwgIWUtXHUwMDNlbWFnaWNbMF0pXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4rXHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbcmF3XTogXCIsXG4rXHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hZ2ljLCBwIC0gZS1cdTAwM2VtYWdpYywgdHJ1ZSk7XG4rXG4rXHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xuK1x0ZS1cdTAwM2VtYXNrID0gcDtcbitcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWYgKCFlLVx1MDAzZW1hc2tbMF0pIHtcbitcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbitcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwiKTtcbitcdH0gZWxzZSB7XG4rXHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCIsXG4rXHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFzaywgcCAtIGUtXHUwMDNlbWFzaywgdHJ1ZSk7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRGVjb2RlIHRoZSBtYWdpYyBcdTAwMjYgbWFzayBmaWVsZHMuIE5vdGU6IHdoaWxlIHdlIG1pZ2h0IGhhdmUgYWNjZXB0ZWRcbitcdCAqIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyB3aWxsIHN0b3AgYXRcbitcdCAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuXG4rXHQgKi9cbitcdGUtXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XG4rXHRpZiAoZS1cdTAwM2VtYXNrIFx1MDAyNlx1MDAyNiBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cdTAwM2VzaXplKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fCBCSU5QUk1fQlVGX1NJWkUgLSBlLVx1MDAzZXNpemUgXHUwMDNjIGUtXHUwMDNlb2Zmc2V0KVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwiLCBlLVx1MDAzZXNpemUpO1xuK1x0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4rXHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwiLFxuK1x0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplLCB0cnVlKTtcbitcdGlmIChlLVx1MDAzZW1hc2spXG4rXHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFwiLFxuK1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4rXHRyZXR1cm4gcDtcbit9XG4rXG4rLyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQgb2YgYW4gJ0UnIGVudHJ5OiB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uLiAqL1xuK3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcbitcdFx0XHRcdCAgICBjaGFyIGRlbClcbit7XG4rXHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cbitcdHAgPSBzdHJjaHIocCwgZGVsKTtcbitcdGlmICghcClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHQqcCsrID0gJ1xcMCc7XG4gXG4rXHQvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZC4gKi9cbitcdGUtXHUwMDNlbWFnaWMgPSBwO1xuK1x0cCA9IHN0cmNocihwLCBkZWwpO1xuK1x0aWYgKCFwKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdCpwKysgPSAnXFwwJztcbitcdGlmICghZS1cdTAwM2VtYWdpY1swXSB8fCBzdHJjaHIoZS1cdTAwM2VtYWdpYywgJy8nKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4rXG4rXHQvKiBTa2lwIHRoZSAnbWFzaycgZmllbGQuICovXG4rXHRwID0gc3RyY2hyKHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0KnArKyA9ICdcXDAnO1xuIFx0cmV0dXJuIHA7XG4gfVxuIFxuQEAgLTM0Nyw1MCArNDMzLDQ4IEBAIHN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSlcbiAgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncydcbiAgKiB3aGVyZSB0aGUgJzonIGlzIHRoZSBJRlMsIHRoYXQgY2FuIGJlIGNob3NlbiB3aXRoIHRoZSBmaXJzdCBjaGFyXG4gICovXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4rXHRcdFx0XHRcdCAgICAgIHNpemVfdCBjb3VudClcbiB7XG4tXHROb2RlICplO1xuLVx0aW50IG1lbXNpemUsIGVycjtcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdGNoYXIgKmJ1ZiwgKnA7XG4gXHRjaGFyIGRlbDtcbiBcbiBcdHByX2RlYnVnKFwicmVnaXN0ZXI6IHJlY2VpdmVkICV6dSBieXRlc1xcblwiLCBjb3VudCk7XG4gXG4gXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cbi1cdGVyciA9IC1FSU5WQUw7XG4gXHRpZiAoKGNvdW50IFx1MDAzYyAxMSkgfHwgKGNvdW50IFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcbi1cdFx0Z290byBvdXQ7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0ZXJyID0gLUVOT01FTTtcbi1cdG1lbXNpemUgPSBzaXplb2YoTm9kZSkgKyBjb3VudCArIDg7XG4tXHRlID0ga21hbGxvYyhtZW1zaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuK1x0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCArIE1JU0NfREVMSU1fUEFEKSxcbitcdFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4gXHRpZiAoIWUpXG4tXHRcdGdvdG8gb3V0O1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdHAgPSBidWYgPSAoY2hhciAqKWUgKyBzaXplb2YoTm9kZSk7XG4rXHRwID0gYnVmID0gZS1cdTAwM2VidWY7XG4gXG4tXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKE5vZGUpKTtcbitcdG1lbXNldChlLCAwLCBzaXplb2YoKmUpKTtcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxuLVx0XHRnb3RvIGVmYXVsdDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4gXG4tXHRkZWwgPSAqcCsrO1x0LyogZGVsaW1ldGVyICovXG4rXHRkZWwgPSAqcCsrO1x0LyogZGVsaW1pdGVyICovXG4gXG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cXG5cIiwgZGVsLCBkZWwpO1xuIFxuIFx0LyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi9cbi1cdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCA4KTtcbitcdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCBNSVNDX0RFTElNX1BBRCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJ25hbWUnIGZpZWxkLiAqL1xuIFx0ZS1cdTAwM2VuYW1lID0gcDtcbiBcdHAgPSBzdHJjaHIocCwgZGVsKTtcbiBcdGlmICghcClcbi1cdFx0Z290byBlaW52YWw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnArKyA9ICdcXDAnO1xuIFx0aWYgKCFlLVx1MDAzZW5hbWVbMF0gfHxcbiBcdCAgICAhc3RyY21wKGUtXHUwMDNlbmFtZSwgXCIuXCIpIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwiLi5cIikgfHxcbiBcdCAgICBzdHJjaHIoZS1cdTAwM2VuYW1lLCAnLycpKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBuYW1lOiB7JXN9XFxuXCIsIGUtXHUwMDNlbmFtZSk7XG4gXG5AQCAtMzk4LDEzNCArNDgyLDMzIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIFx0c3dpdGNoICgqcCsrKSB7XG4gXHRjYXNlICdFJzpcbiBcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogdHlwZTogRSAoZXh0ZW5zaW9uKVxcblwiKTtcbi1cdFx0ZS1cdTAwM2VmbGFncyA9IDEgXHUwMDNjXHUwMDNjIEVuYWJsZWQ7XG4rXHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgJ00nOlxuIFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXG5cIik7XG4tXHRcdGUtXHUwMDNlZmxhZ3MgPSAoMSBcdTAwM2NcdTAwM2MgRW5hYmxlZCkgfCAoMSBcdTAwM2NcdTAwM2MgTWFnaWMpO1xuK1x0XHRlLVx1MDAzZWZsYWdzID0gQklUKE1JU0NfRk1UX0VOQUJMRURfQklUKSB8IEJJVChNSVNDX0ZNVF9NQUdJQ19CSVQpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4tXHRcdGdvdG8gZWludmFsO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdH1cbiBcdGlmICgqcCsrICE9IGRlbClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRpZiAodGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJ00nIChtYWdpYykgZm9ybWF0LiAqL1xuLVx0XHRjaGFyICpzO1xuLVxuLVx0XHQvKiBQYXJzZSB0aGUgJ29mZnNldCcgZmllbGQuICovXG4tXHRcdHMgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFzKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcyA9ICdcXDAnO1xuLVx0XHRpZiAocCAhPSBzKSB7XG4tXHRcdFx0aW50IHIgPSBrc3RydG9pbnQocCwgMTAsIFx1MDAyNmUtXHUwMDNlb2Zmc2V0KTtcbi1cdFx0XHRpZiAociAhPSAwIHx8IGUtXHUwMDNlb2Zmc2V0IFx1MDAzYyAwKVxuLVx0XHRcdFx0Z290byBlaW52YWw7XG4tXHRcdH1cbi1cdFx0cCA9IHM7XG4tXHRcdGlmICgqcCsrKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxcblwiLCBlLVx1MDAzZW9mZnNldCk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hZ2ljID0gcDtcbi1cdFx0cCA9IHNjYW5hcmcocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0pXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChVU0VfREVCVUcpXG4tXHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwiLFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYWdpYywgcCAtIGUtXHUwMDNlbWFnaWMpO1xuLVxuLVx0XHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hc2sgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4tXHRcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbi1cdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxuXCIpO1xuLVx0XHR9IGVsc2UgaWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCIsXG4tXHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIHAgLSBlLVx1MDAzZW1hc2spO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogRGVjb2RlIHRoZSBtYWdpYyBcdTAwMjYgbWFzayBmaWVsZHMuXG4tXHRcdCAqIE5vdGU6IHdoaWxlIHdlIG1pZ2h0IGhhdmUgYWNjZXB0ZWQgZW1iZWRkZWQgTlVMIGJ5dGVzIGZyb21cbi1cdFx0ICogYWJvdmUsIHRoZSB1bmVzY2FwZSBoZWxwZXJzIGhlcmUgd2lsbCBzdG9wIGF0IHRoZSBmaXJzdCBvbmVcbi1cdFx0ICogaXQgZW5jb3VudGVycy5cbi1cdFx0ICovXG4tXHRcdGUtXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XG4tXHRcdGlmIChlLVx1MDAzZW1hc2sgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cdTAwM2VzaXplKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRpZiAoZS1cdTAwM2VzaXplIFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHxcbi1cdFx0ICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtXHUwMDNlc2l6ZSBcdTAwM2MgZS1cdTAwM2VvZmZzZXQpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwiLCBlLVx1MDAzZXNpemUpO1xuLVx0XHRpZiAoVVNFX0RFQlVHKSB7XG4tXHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiBcIixcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdFx0aW50IGk7XG4tXHRcdFx0XHRjaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbi1cbi1cdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcIixcbi1cdFx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuLVxuLVx0XHRcdFx0aWYgKG1hc2tlZCkge1xuLVx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBlLVx1MDAzZXNpemU7ICsraSlcbi1cdFx0XHRcdFx0XHRtYXNrZWRbaV0gPSBlLVx1MDAzZW1hZ2ljW2ldIFx1MDAyNiBlLVx1MDAzZW1hc2tbaV07XG4tXHRcdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06IFwiLFxuLVx0XHRcdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRcdFx0a2ZyZWUobWFza2VkKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJ0UnIChleHRlbnNpb24pIGZvcm1hdC4gKi9cbi1cbi1cdFx0LyogU2tpcCB0aGUgJ29mZnNldCcgZmllbGQuICovXG4tXHRcdHAgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcCsrID0gJ1xcMCc7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hZ2ljID0gcDtcbi1cdFx0cCA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpwKysgPSAnXFwwJztcbi1cdFx0aWYgKCFlLVx1MDAzZW1hZ2ljWzBdIHx8IHN0cmNocihlLVx1MDAzZW1hZ2ljLCAnLycpKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFNraXAgdGhlICdtYXNrJyBmaWVsZC4gKi9cbi1cdFx0cCA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpwKysgPSAnXFwwJztcbi1cdH1cbitcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuK1x0XHRwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7XG4rXHRlbHNlXG4rXHRcdHAgPSBwYXJzZV9leHRlbnNpb25fZmllbGRzKGUsIHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuIFx0LyogUGFyc2UgdGhlICdpbnRlcnByZXRlcicgZmllbGQuICovXG4gXHRlLVx1MDAzZWludGVycHJldGVyID0gcDtcbiBcdHAgPSBzdHJjaHIocCwgZGVsKTtcbiBcdGlmICghcClcbi1cdFx0Z290byBlaW52YWw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnArKyA9ICdcXDAnO1xuIFx0aWYgKCFlLVx1MDAzZWludGVycHJldGVyWzBdKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxcblwiLCBlLVx1MDAzZWludGVycHJldGVyKTtcbiBcbiBcdC8qIFBhcnNlIHRoZSAnZmxhZ3MnIGZpZWxkLiAqL1xuQEAgLTUzMywyNCArNTE2LDIyIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIFx0aWYgKCpwID09ICdcXG4nKVxuIFx0XHRwKys7XG4gXHRpZiAocCAhPSBidWYgKyBjb3VudClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRyZXR1cm4gZTtcbi1cbi1vdXQ6XG4tXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1lZmF1bHQ6XG4tXHRrZnJlZShlKTtcbi1cdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuLWVpbnZhbDpcbi1cdGtmcmVlKGUpO1xuLVx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4rXHRyZXR1cm4gbm9fZnJlZV9wdHIoZSk7XG4gfVxuIFxuKy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXHUwMDNjZW50cnlcdTAwM2UgZmlsZXMuICovXG4rZW51bSBibV9jb21tYW5kIHtcbitcdEJNX0NNRF9JR05PUkUsXHQvKiBlbXB0eSB3cml0ZSAqL1xuK1x0Qk1fQ01EX0RJU0FCTEUsXHQvKiBcIjBcIiAqL1xuK1x0Qk1fQ01EX0VOQUJMRSxcdC8qIFwiMVwiICovXG4rXHRCTV9DTURfUkVNT1ZFLFx0LyogXCItMVwiICovXG4rfTtcbitcbiAvKlxuLSAqIFNldCBzdGF0dXMgb2YgZW50cnkvYmluZm10X21pc2M6XG4tICogJzEnIGVuYWJsZXMsICcwJyBkaXNhYmxlcyBhbmQgJy0xJyBjbGVhcnMgZW50cnkvYmluZm10X21pc2NcbisgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICcxJyBlbmFibGVzLFxuKyAqICcwJyBkaXNhYmxlcyBhbmQgJy0xJyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy5cbiAgKi9cbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIHtcbkBAIC01NjEsNjIgKzU0Miw2NCBAQCBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIFx0aWYgKGNvcHlfZnJvbV91c2VyKHMsIGJ1ZmZlciwgY291bnQpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdGlmICghY291bnQpXG4tXHRcdHJldHVybiAwO1xuK1x0XHRyZXR1cm4gQk1fQ01EX0lHTk9SRTtcbiBcdGlmIChzW2NvdW50IC0gMV0gPT0gJ1xcbicpXG4gXHRcdGNvdW50LS07XG4gXHRpZiAoY291bnQgPT0gMSBcdTAwMjZcdTAwMjYgc1swXSA9PSAnMCcpXG4tXHRcdHJldHVybiAxO1xuK1x0XHRyZXR1cm4gQk1fQ01EX0RJU0FCTEU7XG4gXHRpZiAoY291bnQgPT0gMSBcdTAwMjZcdTAwMjYgc1swXSA9PSAnMScpXG4tXHRcdHJldHVybiAyO1xuK1x0XHRyZXR1cm4gQk1fQ01EX0VOQUJMRTtcbiBcdGlmIChjb3VudCA9PSAyIFx1MDAyNlx1MDAyNiBzWzBdID09ICctJyBcdTAwMjZcdTAwMjYgc1sxXSA9PSAnMScpXG4tXHRcdHJldHVybiAzO1xuK1x0XHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbiAvKiBnZW5lcmljIHN0dWZmICovXG4gXG4tc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpXG4rc3RhdGljIHZvaWQgYm1fc2VxX2hleChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IHU4ICpkYXRhLCBpbnQgc2l6ZSlcbiB7XG4tXHRjaGFyICpkcCA9IHBhZ2U7XG4tXHRjb25zdCBjaGFyICpzdGF0dXMgPSBcImRpc2FibGVkXCI7XG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSsrKVxuK1x0XHRzZXFfcHJpbnRmKG0sIFwiJTAyeFwiLCBkYXRhW2ldKTtcbit9XG4gXG4tXHRpZiAodGVzdF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4tXHRcdHN0YXR1cyA9IFwiZW5hYmxlZFwiO1xuK3N0YXRpYyBpbnQgYm1fZW50cnlfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZClcbit7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBtLVx1MDAzZXByaXZhdGU7XG4gXG4tXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XG4tXHRcdHNwcmludGYocGFnZSwgXCIlc1xcblwiLCBzdGF0dXMpO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4rXHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuK1x0XHRzZXFfcHV0cyhtLCBcImVuYWJsZWRcXG5cIik7XG4rXHRlbHNlXG4rXHRcdHNlcV9wdXRzKG0sIFwiZGlzYWJsZWRcXG5cIik7XG4gXG4tXHRkcCArPSBzcHJpbnRmKGRwLCBcIiVzXFxuaW50ZXJwcmV0ZXIgJXNcXG5cIiwgc3RhdHVzLCBlLVx1MDAzZWludGVycHJldGVyKTtcbitcdHNlcV9wcmludGYobSwgXCJpbnRlcnByZXRlciAlc1xcblwiLCBlLVx1MDAzZWludGVycHJldGVyKTtcbiBcbiBcdC8qIHByaW50IHRoZSBzcGVjaWFsIGZsYWdzICovXG4tXHRkcCArPSBzcHJpbnRmKGRwLCBcImZsYWdzOiBcIik7XG4rXHRzZXFfcHV0cyhtLCBcImZsYWdzOiBcIik7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApXG4tXHRcdCpkcCsrID0gJ1AnO1xuK1x0XHRzZXFfcHV0YyhtLCAnUCcpO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxuLVx0XHQqZHArKyA9ICdPJztcbitcdFx0c2VxX3B1dGMobSwgJ08nKTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbi1cdFx0KmRwKysgPSAnQyc7XG4rXHRcdHNlcV9wdXRjKG0sICdDJyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxuLVx0XHQqZHArKyA9ICdGJztcbi1cdCpkcCsrID0gJ1xcbic7XG4rXHRcdHNlcV9wdXRjKG0sICdGJyk7XG4rXHRzZXFfcHV0YyhtLCAnXFxuJyk7XG4gXG4tXHRpZiAoIXRlc3RfYml0KE1hZ2ljLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuLVx0XHRzcHJpbnRmKGRwLCBcImV4dGVuc2lvbiAuJXNcXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4rXHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbitcdFx0c2VxX3ByaW50ZihtLCBcImV4dGVuc2lvbiAuJXNcXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRkcCArPSBzcHJpbnRmKGRwLCBcIm9mZnNldCAlaVxcbm1hZ2ljIFwiLCBlLVx1MDAzZW9mZnNldCk7XG4tXHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbitcdFx0c2VxX3ByaW50ZihtLCBcIm9mZnNldCAlaVxcbm1hZ2ljIFwiLCBlLVx1MDAzZW9mZnNldCk7XG4rXHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiBcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdGRwICs9IHNwcmludGYoZHAsIFwiXFxubWFzayBcIik7XG4tXHRcdFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4rXHRcdFx0c2VxX3B1dHMobSwgXCJcXG5tYXNrIFwiKTtcbitcdFx0XHRibV9zZXFfaGV4KG0sIGUtXHUwMDNlbWFzaywgZS1cdTAwM2VzaXplKTtcbiBcdFx0fVxuLVx0XHQqZHArKyA9ICdcXG4nO1xuLVx0XHQqZHAgPSAnXFwwJztcbitcdFx0c2VxX3B1dGMobSwgJ1xcbicpO1xuIFx0fVxuK1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSlcbitzdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW1vZGVfdCBtb2RlKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpO1xuIFxuQEAgLTY1MiwxNCArNjM1LDE0IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmlfYmluZm10X21pc2Moc3RydWN0IGlub2RlICppbm9kZSlcbiAgKiBlbnRyeSBpcyByZW1vdmVkIG9yIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZCBhbmQgdGhlIHN1cGVyIGJsb2NrIGlzXG4gICogc2h1dGRvd24uXG4gICpcbi0gKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZVxuLSAqIHRvIHJlbW92ZSB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgdGhlIGVudHJ5XG4tICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGxpc3RfZW1wdHkoKSBjaGVja1xuLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC5cbisgKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnlcbisgKiByZW1vdmluZyB0aGUgZW50cnkgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgb3IgdW5saW5rKDIpIHRoZSBlbnRyeVxuKyAqIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBXZSBrZWVwIHRoZSBobGlzdF91bmhhc2hlZCgpXG4rICogY2hlY2sgdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuICovXG4gc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbiB7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFxuIFx0Y2xlYXJfaW5vZGUoaW5vZGUpO1xuIFxuQEAgLTY2Nyw4OSArNjUwLDEzMiBAQCBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIFx0XHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXG4gXHRcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGlub2RlKTtcbi1cdFx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdGxpc3RfZGVsX2luaXQoXHUwMDI2ZS1cdTAwM2VsaXN0KTtcbi1cdFx0d3JpdGVfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdFx0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdFx0aWYgKCFobGlzdF91bmhhc2hlZChcdTAwMjZlLVx1MDAzZW5vZGUpKVxuK1x0XHRcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRcdHB1dF9iaW5mbXRfaGFuZGxlcihlKTtcbiBcdH1cbiB9XG4gXG4rLyoqXG4rICogdW5saW5rX2JpbmZtdF9oYW5kbGVyIC0gdW5oYXNoIGEgYmluYXJ5IHR5cGUgaGFuZGxlclxuKyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbisgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byB1bmhhc2hcbisgKlxuKyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcbisgKiB1bmxpbmsoMikgaGFwcGVucyB1bmRlciB0aGUgZXhjbHVzaXZlbHkgaGVsZCBpbm9kZSBsb2NrIG9mIHRoZSByb290XG4rICogZGVudHJ5IGtlZXBpbmcgdGhlIGxpc3Qgc3RhYmxlIGZvciB3cml0ZXJzLiBsb2FkX21pc2NfYmluYXJ5KCkgd2Fsa3MgaXRcbisgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxuKyAqIHVubGluayB0byBzZXJpYWxpemUgYWdhaW5zdCBibV9ldmljdF9pbm9kZSgpIHdoaWNoIHVubGlua3MgZW50cmllc1xuKyAqIGR1cmluZyB1bW91bnQgd2l0aG91dCBob2xkaW5nIHRoZSByb290IGlub2RlIGxvY2suXG4rICovXG4rc3RhdGljIHZvaWQgdW5saW5rX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuK3tcbitcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHRobGlzdF9kZWxfaW5pdF9yY3UoXHUwMDI2ZS1cdTAwM2Vub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbit9XG4rXG4gLyoqXG4gICogcmVtb3ZlX2JpbmZtdF9oYW5kbGVyIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlclxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbiAgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byByZW1vdmVcbiAgKlxuICAqIFJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBvZiBiaW5hcnkgdHlwZSBoYW5kbGVycyBhbmRcbi0gKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LiBUaGlzIGlzIGNhbGxlZCBmcm9tXG4tICogYmluZm10X3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IHdhbnQgdG8gdGhpbmsgYWJvdXRcbi0gKiBhZGRpbmcgYSBwcm9wZXIgLVx1MDAzZXVubGluaygpIG1ldGhvZCB0byBiaW5mbXRfbWlzYyBpbnN0ZWFkIG9mIGZvcmNpbmcgY2FsbGVyJ3Ncbi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhc1xuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0J3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuXG4rICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS5cbiAgKi9cbi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKVxuK3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4rXHRcdFx0XHQgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcbiB7XG4tXHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdGxpc3RfZGVsX2luaXQoXHUwMDI2ZS1cdTAwM2VsaXN0KTtcbi1cdHdyaXRlX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHR1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XG4gXHRsb2NrZWRfcmVjdXJzaXZlX3JlbW92YWwoZS1cdTAwM2VkZW50cnksIE5VTEwpO1xuIH1cbiBcbi0vKiAvXHUwMDNjZW50cnlcdTAwM2UgKi9cbisvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2VudHJ5KHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbit7XG4rXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4gXG4tc3RhdGljIHNzaXplX3Rcbi1ibV9lbnRyeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4rXHRpbm9kZV9sb2NrX25lc3RlZChyb290LCBJX01VVEVYX1BBUkVOVCk7XG4rXHRpZiAoIWhsaXN0X3VuaGFzaGVkKFx1MDAyNmUtXHUwMDNlbm9kZSkpXG4rXHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTtcbitcdGlub2RlX3VubG9jayhyb290KTtcbit9XG4rXG4rLyogUmVtb3ZlIGFsbCBlbnRyaWVzIG9mIHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBAbWlzYyBiZWxvbmdpbmcgdG8gQHNiLiAqL1xuK3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9hbGxfZW50cmllcyhzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4rXHRcdFx0XHQgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0Tm9kZSAqZSA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9wcml2YXRlO1xuLVx0c3NpemVfdCByZXM7XG4tXHRjaGFyICpwYWdlO1xuK1x0c3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi1cdTAwM2VzX3Jvb3QpO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuK1x0c3RydWN0IGhsaXN0X25vZGUgKm5leHQ7XG4rXG4rXHRpbm9kZV9sb2NrX25lc3RlZChyb290LCBJX01VVEVYX1BBUkVOVCk7XG4rXHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSlcbitcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuK1x0aW5vZGVfdW5sb2NrKHJvb3QpO1xuK31cbiBcbi1cdHBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXBhZ2UpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuKy8qKlxuKyAqIGJtX3VubGluayAtIHJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgdmlhIHVubGluaygyKVxuKyAqIEBkaXI6IGlub2RlIG9mIHRoZSByb290IGRpcmVjdG9yeVxuKyAqIEBkZW50cnk6IGVudHJ5IGZpbGUgdG8gcmVtb3ZlXG4rICpcbisgKiBSZW1vdmluZyB0aGUgZW50cnkgZmlsZSByZW1vdmVzIGl0cyBiaW5hcnkgdHlwZSBoYW5kbGVyLCBleGFjdGx5IGxpa2VcbisgKiB3cml0aW5nIC0xIHRvIGl0IGRvZXMuIFRoZSBzdGF0dXMgYW5kIHJlZ2lzdGVyIGNvbnRyb2wgZmlsZXMgY2FuJ3QgYmVcbisgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcbisgKiBzZXJpYWxpemVzIGFnYWluc3QgdGhlIHdyaXRlIGJhc2VkIGFkZCBhbmQgcmVtb3ZlIHBhdGhzLlxuKyAqL1xuK3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4re1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gZF9pbm9kZShkZW50cnkpLVx1MDAzZWlfcHJpdmF0ZTtcbitcbitcdGlmICghZSlcbitcdFx0cmV0dXJuIC1FUEVSTTtcbitcbitcdHVubGlua19iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGRpciksIGUpO1xuK1x0cmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpO1xuK31cbiBcbi1cdGVudHJ5X3N0YXR1cyhlLCBwYWdlKTtcbitzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYm1fZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7XG4rXHQubG9va3VwXHRcdD0gc2ltcGxlX2xvb2t1cCxcbitcdC51bmxpbmtcdFx0PSBibV91bmxpbmssXG4rfTtcbiBcbi1cdHJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYWdlLCBzdHJsZW4ocGFnZSkpO1xuKy8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuK1xuK3N0YXRpYyBpbnQgYm1fZW50cnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbit7XG4rXHRpbnQgcmV0O1xuIFxuLVx0a2ZyZWUocGFnZSk7XG4tXHRyZXR1cm4gcmVzO1xuK1x0cmV0ID0gc2luZ2xlX29wZW4oZmlsZSwgYm1fZW50cnlfc2hvdywgaW5vZGUtXHUwMDNlaV9wcml2YXRlKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiBzZXFfb3BlbigpIGNsZWFycyBGTU9ERV9QV1JJVEUsIGJtX2VudHJ5X3dyaXRlKCkgdGFrZXMgYW55IG9mZnNldCAqL1xuK1x0aWYgKGZpbGUtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9XUklURSlcbitcdFx0ZmlsZS1cdTAwM2VmX21vZGUgfD0gRk1PREVfUFdSSVRFO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFx0aW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7XG4gXG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0Y2xlYXJfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuK1x0Y2FzZSBCTV9DTURfRElTQUJMRTpcbitcdFx0Y2xlYXJfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDI6XG4tXHRcdC8qIEVuYWJsZSB0aGlzIGhhbmRsZXIuICovXG4tXHRcdHNldF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncyk7XG4rXHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4rXHRcdHNldF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMzpcbi1cdFx0LyogRGVsZXRlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0aW5vZGUgPSBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KTtcbi1cdFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0XG4tXHRcdCAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGVcbi1cdFx0ICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuXG4tXHRcdCAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbid0IGJlXG4tXHRcdCAqIG1vZGlmaWVkLiBPbmx5IGxvYWRfbWlzY19iaW5hcnkoKSBjYW4gYWNjZXNzIGJ1dCBkb2VzIHNvXG4tXHRcdCAqIHJlYWQtb25seS4gU28gd2Ugb25seSBuZWVkIHRvIHRha2UgdGhlIHdyaXRlIGxvY2sgd2hlbiB3ZVxuLVx0XHQgKiBhY3R1YWxseSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGxpc3QuXG4tXHRcdCAqL1xuLVx0XHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2ZS1cdTAwM2VsaXN0KSlcbi1cdFx0XHRyZW1vdmVfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhpbm9kZSksIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuK1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuK1x0XHRibV9yZW1vdmVfZW50cnkoZSwgaW5vZGUtXHUwMDNlaV9zYik7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIHJlcztcbkBAIC03NTksMTUgKzc4NSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9lbnRyeV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB9XG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fZW50cnlfb3BlcmF0aW9ucyA9IHtcbi1cdC5yZWFkXHRcdD0gYm1fZW50cnlfcmVhZCxcbitcdC5vcGVuXHRcdD0gYm1fZW50cnlfb3BlbixcbitcdC5yZWFkXHRcdD0gc2VxX3JlYWQsXG4gXHQud3JpdGVcdFx0PSBibV9lbnRyeV93cml0ZSxcbi1cdC5sbHNlZWtcdFx0PSBkZWZhdWx0X2xsc2VlayxcbitcdC5sbHNlZWtcdFx0PSBzZXFfbHNlZWssXG4rXHQucmVsZWFzZVx0PSBzaW5nbGVfcmVsZWFzZSxcbiB9O1xuIFxuIC8qIC9yZWdpc3RlciAqL1xuIFxuIC8qIGFkZCB0byBmaWxlc3lzdGVtICovXG4tc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLVx1MDAzZXNfcm9vdCwgZS1cdTAwM2VuYW1lKTtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG5AQCAtNzg5LDkgKzgxNyw5IEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gXG4gXHRkX21ha2VfcGVyc2lzdGVudChkZW50cnksIGlub2RlKTtcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGlub2RlKTtcbi1cdHdyaXRlX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuLVx0bGlzdF9hZGQoXHUwMDI2ZS1cdTAwM2VsaXN0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuLVx0d3JpdGVfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHRobGlzdF9hZGRfaGVhZF9yY3UoXHUwMDI2ZS1cdTAwM2Vub2RlLCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFx0c2ltcGxlX2RvbmVfY3JlYXRpbmcoZGVudHJ5KTtcbiBcdHJldHVybiAwO1xuIH1cbkBAIC03OTksMTMgKzgyNywxMiBAQCBzdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHROb2RlICplO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9zYjtcbi1cdGludCBlcnIgPSAwO1xuIFx0c3RydWN0IGZpbGUgKmYgPSBOVUxMO1xuK1x0aW50IGVycjtcbiBcbiBcdGUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7XG4tXG4gXHRpZiAoSVNfRVJSKGUpKVxuIFx0XHRyZXR1cm4gUFRSX0VSUihlKTtcbiBcbkBAIC04MjIsNyArODQ5LDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdGlmIChJU19FUlIoZikpIHtcbiBcdFx0XHRwcl9ub3RpY2UoXCJyZWdpc3RlcjogZmFpbGVkIHRvIGluc3RhbGwgaW50ZXJwcmV0ZXIgZmlsZSAlc1xcblwiLFxuIFx0XHRcdFx0IGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuLVx0XHRcdGtmcmVlKGUpO1xuIFx0XHRcdHJldHVybiBQVFJfRVJSKGYpO1xuIFx0XHR9XG4gXHRcdGUtXHUwMDNlaW50ZXJwX2ZpbGUgPSBmO1xuQEAgLTgzNCw5ICs4NjAsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGYpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XG4gXHRcdH1cbi1cdFx0a2ZyZWUoZSk7XG4gXHRcdHJldHVybiBlcnI7XG4gXHR9XG4rXG4rXHQvKiBUaGUgZW50cnkgaXMgb3duZWQgYnkgaXRzIGlub2RlIG5vdy4gKi9cbitcdHJldGFpbl9hbmRfbnVsbF9wdHIoZSk7XG4gXHRyZXR1cm4gY291bnQ7XG4gfVxuIFxuQEAgLTg1MSwxMCArODc5LDEwIEBAIHN0YXRpYyBzc2l6ZV90XG4gYm1fc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4tXHRjaGFyICpzO1xuK1x0Y29uc3QgY2hhciAqcztcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuLVx0cyA9IG1pc2MtXHUwMDNlZW5hYmxlZCA/IFwiZW5hYmxlZFxcblwiIDogXCJkaXNhYmxlZFxcblwiO1xuK1x0cyA9IFJFQURfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQpID8gXCJlbmFibGVkXFxuXCIgOiBcImRpc2FibGVkXFxuXCI7XG4gXHRyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHMsIHN0cmxlbihzKSk7XG4gfVxuIFxuQEAgLTg2MywzNyArODkxLDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbi1cdE5vZGUgKmUsICpuZXh0O1xuLVx0c3RydWN0IGlub2RlICppbm9kZTtcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuIFx0c3dpdGNoIChyZXMpIHtcbi1cdGNhc2UgMTpcbi1cdFx0LyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xuK1x0Y2FzZSBCTV9DTURfRElTQUJMRTpcbitcdFx0V1JJVEVfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQsIGZhbHNlKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDI6XG4tXHRcdC8qIEVuYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IHRydWU7XG4rXHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4rXHRcdFdSSVRFX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkLCB0cnVlKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDM6XG4tXHRcdC8qIERlbGV0ZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdGlub2RlID0gZF9pbm9kZShmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KTtcbi1cdFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0XG4tXHRcdCAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGVcbi1cdFx0ICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuXG4tXHRcdCAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbid0IGJlXG4tXHRcdCAqIG1vZGlmaWVkLiBPbmx5IGxvYWRfbWlzY19iaW5hcnkoKSBjYW4gYWNjZXNzIGJ1dCBkb2VzIHNvXG4tXHRcdCAqIHJlYWQtb25seS4gU28gd2Ugb25seSBuZWVkIHRvIHRha2UgdGhlIHdyaXRlIGxvY2sgd2hlbiB3ZVxuLVx0XHQgKiBhY3R1YWxseSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGxpc3QuXG4tXHRcdCAqL1xuLVx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgbmV4dCwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBsaXN0KVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbi1cbi1cdFx0aW5vZGVfdW5sb2NrKGlub2RlKTtcbitcdGNhc2UgQk1fQ01EX1JFTU9WRTpcbitcdFx0Ym1fcmVtb3ZlX2FsbF9lbnRyaWVzKG1pc2MsIGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9zYik7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIHJlcztcbkBAIC05MTgsNyArOTI2LDcgQEAgc3RhdGljIHZvaWQgYm1fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gXHRwdXRfdXNlcl9ucyh1c2VyX25zKTtcbiB9XG4gXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNfb3BzID0ge1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XG4gXHQuc3RhdGZzXHRcdD0gc2ltcGxlX3N0YXRmcyxcbiBcdC5ldmljdF9pbm9kZVx0PSBibV9ldmljdF9pbm9kZSxcbiBcdC5wdXRfc3VwZXJcdD0gYm1fcHV0X3N1cGVyLFxuQEAgLTk2NSwxMCArOTczLDEwIEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXG4gXHRcdGlmICghbWlzYylcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcbi1cdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbi1cdFx0cndsb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0XHRJTklUX0hMSVNUX0hFQUQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbitcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFxuLVx0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovXG4rXHRcdC8qIFBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGluIGN1cnJlbnRfYmluZm10X21pc2MoKS4gKi9cbiBcdFx0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2dXNlcl9ucy1cdTAwM2ViaW5mbXRfbWlzYywgbWlzYyk7XG4gXHR9XG4gXG5AQCAtOTgzLDEyICs5OTEsMTUgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdCAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHlcbiBcdCAqIHJlc2V0IC1cdTAwM2VlbmFibGVkIHRvIHRydWUuXG4gXHQgKi9cbi1cdG1pc2MtXHUwMDNlZW5hYmxlZCA9IHRydWU7XG4rXHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXG4gXHRlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgQklORk1URlNfTUFHSUMsIGJtX2ZpbGVzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2c19vcHM7XG4tXHRyZXR1cm4gZXJyO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdHNiLVx1MDAzZXNfb3AgPSBcdTAwMjZibV9zdXBlcl9vcHM7XG4rXHRkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCktXHUwMDNlaV9vcCA9IFx1MDAyNmJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJtX2ZyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuQEAgLTEwMSw4ICsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHtcbiBcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpXG4gc3RydWN0IGJpbmZtdF9taXNjIHtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgZW50cmllcztcbi1cdHJ3bG9ja190IGVudHJpZXNfbG9jaztcbitcdHN0cnVjdCBobGlzdF9oZWFkIGVudHJpZXM7XG4rXHRzcGlubG9ja190IGVudHJpZXNfbG9jaztcbiBcdGJvb2wgZW5hYmxlZDtcbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuY1xuaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NFxuLS0tIGEva2VybmVsL3VzZXIuY1xuKysrIGIva2VybmVsL3VzZXIuY1xuQEAgLTIzLDkgKzIzLDkgQEBcbiBcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpXG4gc3RydWN0IGJpbmZtdF9taXNjIGluaXRfYmluZm10X21pc2MgPSB7XG4tXHQuZW50cmllcyA9IExJU1RfSEVBRF9JTklUKGluaXRfYmluZm10X21pc2MuZW50cmllcyksXG4rXHQuZW50cmllcyA9IEhMSVNUX0hFQURfSU5JVCxcbiBcdC5lbmFibGVkID0gdHJ1ZSxcbi1cdC5lbnRyaWVzX2xvY2sgPSBfX1JXX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLFxuK1x0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcbiB9O1xuIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpO1xuICNlbmRpZlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMjA6MzI6MzkuNDgzMDUxNDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NTAwMzA4Mjg3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIHRoZSBiaW5mbXRfbWlzYyBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgc3Vic3RhbnRpYWwgcGF0Y2ggdG91Y2hpbmcgYGZzL2JpbmZtdF9taXNjLmNgLiBJdCdzIGEgYmlnIGludGVybmFsIHJlZmFjdG9yLCBzd2l0Y2hpbmcgZnJvbSBhIGBsaXN0X2hlYWRgIHRvIGFuIGBobGlzdF9oZWFkYCwgUkNVIGZvciBsb29rdXBzLCBgc3BpbmxvY2tfdGAgaW4gcGxhY2Ugb2YgYHJ3bG9ja190YCwgY2xlYW51cCByb3V0aW5lcywgYHNlcV9maWxlYCBmb3IgYGJtX2VudHJ5X3JlYWRgLCBhbmQgZW5hYmxpbmcgYHVubGluaygyKWAgb24gZW50cnkgZmlsZXMuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBpcyB0aGlzIHJlYWNoYWJsZSwgYW5kIGhvdyBjYW4gSSBicmVhayBpdD9cblxuRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoYXQgdGhpcyBpcyBhIGNyaXRpY2FsIGNvZGUgcGF0aC4gWWVzLCBgYmluZm10X21pc2NgIGlzIGFic29sdXRlbHkgZXNzZW50aWFsLiBJdCdzIHRoZSBjb3JlIG9mIGV4ZWN1dGluZyBhcmJpdHJhcnkgYmluYXJ5IGZvcm1hdHMgd2l0aGluIHRoZSBrZXJuZWwsIHNvIGl0J3MgYSByaXBlIHRhcmdldCBmb3IgZnV6emluZy4gSSBjYW4gcmVhY2ggaXQgZnJvbSB1c2Vyc3BhY2UgYnkgbW91bnRpbmcgdGhlIGBiaW5mbXRfbWlzY2AgZmlsZXN5c3RlbSBhbmQgdGhlbiB3cml0aW5nIHRvIGl0cyBmaWxlcywgYW5kIGl0IHVsdGltYXRlbHkgbW9kaWZpZXMgYGxvYWRfbWlzY19iaW5hcnlgLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBgZXhlY3ZlYCBzeXN0ZW0gY2FsbCwgc28gdGhlcmUncyBwbGVudHkgb2YgdXNlciBpbnRlcmFjdGlvbi4gVGhhdCdzIGdvb2Q7IHVzZXIgaW50ZXJhY3Rpb24gaXMgY3JpdGljYWwuXG5cbk5vdywgSSdtIGdvaW5nIHRvIG1hcCBvdXQgdGhlIGF0dGFjayBzdXJmYWNlLiBCYXNlZCBvbiB0aGUgcGF0Y2gsIGl0IGxvb2tzIGxpa2UgdGhlc2UgYXJlIHRoZSBrZXkgZnVuY3Rpb25zIEkgc2hvdWxkIGJlIHBheWluZyBhdHRlbnRpb24gdG86IGBlbnRyeV9tYXRjaGVzX21hZ2ljYCwgYGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uYCwgYHNlYXJjaF9iaW5mbXRfaGFuZGxlcmAsIGBnZXRfYmluZm10X2hhbmRsZXJgLCBgcHV0X2JpbmZtdF9oYW5kbGVyYCwgYGN1cnJlbnRfYmluZm10X21pc2NgLCBgbG9hZF9taXNjX2JpbmFyeWAsIGBzY2FuYXJnYCwgYGNoZWNrX3NwZWNpYWxfZmxhZ3NgLCBgcGFyc2VfbWFnaWNfZmllbGRzYCwgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgLCBgY3JlYXRlX2VudHJ5YCwgYHBhcnNlX2NvbW1hbmRgLCBgYm1fc2VxX2hleGAsIGBibV9lbnRyeV9zaG93YCwgYGJtX2dldF9pbm9kZWAsIGBibV9ldmljdF9pbm9kZWAsIGB1bmxpbmtfYmluZm10X2hhbmRsZXJgLCBgcmVtb3ZlX2JpbmZtdF9oYW5kbGVyYCwgYGJtX3JlbW92ZV9lbnRyeWAsIGBibV9yZW1vdmVfYWxsX2VudHJpZXNgLCBgYm1fdW5saW5rYCwgYGJtX2VudHJ5X29wZW5gLCBgYm1fZW50cnlfd3JpdGVgLCBgYWRkX2VudHJ5YCwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX3N0YXR1c19yZWFkYCwgYGJtX3N0YXR1c193cml0ZWAsIGFuZCBgYm1fZmlsbF9zdXBlcmAuXG5cbkdpdmVuIHRoYXQgbWFzc2l2ZSBsaXN0LCBJIG5lZWQgdG8gcHJpb3JpdGl6ZS4gSSdtIHRoaW5raW5nIHRoZSByZWFsIG1lYXQgaXMgaW4gaG93IGl0J3MgKnVzZWQqLCByYXRoZXIgdGhhbiB0aGUgaW50ZXJuYWwgbWVjaGFuaWNzLiBUaGVyZWZvcmUsIEknbSB6ZXJvaW5nIGluIG9uOiBgbG9hZF9taXNjX2JpbmFyeWAgKHRoZSB1bHRpbWF0ZSBlbnRyeSBwb2ludCBkdXJpbmcgZXhlY3V0aW9uKSwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGBibV91bmxpbmtgLCBgYm1fZW50cnlfb3BlbmAsIGFuZCBgYm1fZW50cnlfc2hvd2AuIFRob3NlIGFyZSB0aGUgZW50cnkgcG9pbnRzIHRvIHBsYXkgd2l0aCBmaWxlIG9wZXJhdGlvbnMuXG5cbkxhc3RseSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYnVpbGQgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuIGBDT05GSUdfQklORk1UX01JU0NgIGlzIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbi4gSSdsbCB2ZXJpZnkgdGhpcyB0byBtYWtlIHN1cmUgbXkgdGVzdGluZyBzZXR1cCBpcyB2YWxpZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY2MjIsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NzIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQyMDozMjo0Ny45ODMzNjE0MzhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU3NTkxOTQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJJTkZNVF9NSVNDXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9LY29uZmlnLmJpbmZtdD0xMzg9Y29uZmlnIEJJTkZNVF9aRkxBVFxcbi0tXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTQ0LVxcbmZzL0tjb25maWcuYmluZm10OjE0NTpjb25maWcgQklORk1UX01JU0NcXG5mcy9LY29uZmlnLmJpbmZtdC0xNDYtXFx0dHJpc3RhdGUgXFxcIktlcm5lbCBzdXBwb3J0IGZvciBNSVNDIGJpbmFyaWVzXFxcIlxcbi0tXFxuZnMvTWFrZWZpbGU9MzQ9b2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICArPSBsb2Nrcy5vXFxuZnMvTWFrZWZpbGU6MzU6b2JqLSQoQ09ORklHX0JJTkZNVF9NSVNDKVxcdCs9IGJpbmZtdF9taXNjLm9cXG5mcy9NYWtlZmlsZS0zNi1vYmotJChDT05GSUdfQklORk1UX1NDUklQVClcXHQrPSBiaW5mbXRfc2NyaXB0Lm9cXG4tLVxcbmZzL2ZpbGVfdGFibGUuYz0xNjU9c3RhdGljIGludCBfX2luaXQgaW5pdF9mc19zdGF0X3N5c2N0bHModm9pZClcXG4tLVxcbmZzL2ZpbGVfdGFibGUuYy0xNjctXFx0cmVnaXN0ZXJfc3lzY3RsX2luaXQoXFxcImZzXFxcIiwgZnNfc3RhdF9zeXNjdGxzKTtcXG5mcy9maWxlX3RhYmxlLmM6MTY4OlxcdGlmIChJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykpIHtcXG5mcy9maWxlX3RhYmxlLmMtMTY5LVxcdFxcdHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZHI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDIwOjMyOjQ4LjE0MDk1OTgyNVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExOTI0NTA4Nzc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlJlZmluaW5nIHRoZSBGb2N1cyBmb3IgQklORk1UX01JU0MgQ292ZXJhZ2UqKlxuXG5Pa2F5LCBzbyBJJ20gZm9jdXNpbmcgb24gYEJJTkZNVF9NSVNDYCwgdGhhdCdzIHRoZSBrZXkgY29uZmlnIGhlcmUuIExldCdzIHNoYXJwZW4gdGhlIGxpc3Qgb2YgRm9jdXNTeW1ib2xzIGZvciB0aGUgZnV6emVyLiBNeSBpbml0aWFsIHRob3VnaHRzIHdlcmUgZ29vZCwgYGxvYWRfbWlzY19iaW5hcnlgIGlzIGRlZmluaXRlbHkgaW4gc2NvcGUsIGl0J3MgdGhlIGBsaW51eF9iaW5mbXRgIGhhbmRsZXIsIGFuZCBjcml0aWNhbCBmb3IgZXhlY3V0aW9uLiBUaGUgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGFuZCBgYm1fdW5saW5rYCBmdW5jdGlvbnMgYXJlIHRoZSBoYW5kbGVycyBmb3IgZmlsZSBvcGVyYXRpb25zIG9uIHRoZSB2aXJ0dWFsIGZpbGVzeXN0ZW0sIHNvIHRoZXkgYXJlIGVzc2VudGlhbC4gYGJtX2VudHJ5X29wZW5gIHNlZW1zIGltcG9ydGFudCwgYW5kIEkgbmVlZCB0byBub3RlIHRoYXQgaXQgaGFzIGJlZW4gY2hhbmdlZCB0byBgYm1fZW50cnlfc2hvd2Agbm93IHRoYXQgaXQgdXNlcyBzZXFfZmlsZS5cblxuTm93LCBgbG9hZF9taXNjX2JpbmFyeWAgZG9lcyBnZXQgY2FsbGVkIGJ5IGBzZWFyY2hfYmluYXJ5X2hhbmRsZXJgLCB3aGljaCBpcyBpdHNlbGYgY2FsbGVkIGJ5IGBicHJtX2V4ZWN2ZWAuIFRoYXQncyBhIGhvdCBwYXRoLCBlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIHRoZSBmcmVxdWVuY3kgb2YgYGV4ZWN2ZWAgY2FsbHMsIGFuZCBpdCBpcyBzcGVjaWZpYyB0byBgYmluZm10X21pc2NgLCBzbyBpbmNsdWRpbmcgaXQgaXMgZXNzZW50aWFsLiBUaGUgb3RoZXJzIHNlZW0gbGlrZSBjbGVhciB3aW5zLlxuXG5BbHJpZ2h0LCBJIGNhbiBjb25maXJtIHRoYXQgYEJJTkZNVF9NSVNDYCBpcyBzdWZmaWNpZW50IGZvciB0aGUgY29uZmlndXJhdGlvbiBzaWRlIG9mIHRoaW5ncy5cblxuTGV0J3MgZG8gYSBmaW5hbCByZXZpZXcgb2YgdGhlIHBhdGNoLiBUaGUgbmV3IGBibV91bmxpbmtgIGlzIGEgbmV3IGZlYXR1cmUgZm9yIHVubGlua2luZyBlbnRyeSBmaWxlcywgd2hpY2ggbmVlZHMgdGVzdGluZy4gSXQgY2hhbmdlcyBgYm1fZW50cnlfcmVhZGAgdG8gYGJtX2VudHJ5X3Nob3dgLCB3aGljaCBpcyB0aGUgc2VxX2ZpbGUsIGFuZCBpbXBvcnRhbnQuIEl0IGFsc28gdXBkYXRlcyBgbG9hZF9taXNjX2JpbmFyeWAgdG8gdXNlIFJDVS4gTGFzdGx5LCBpdCB1cGRhdGVzIGBjcmVhdGVfZW50cnlgIHRvIHVzZSBgcGFyc2VfbWFnaWNfZmllbGRzYCBhbmQgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgLlxuXG5MZXQncyByZWZpbmUgdGhlIGxpc3QuIEkgaGF2ZSBgbG9hZF9taXNjX2JpbmFyeWAsIGBibV9yZWdpc3Rlcl93cml0ZWAsIGBibV9lbnRyeV93cml0ZWAsIGBibV9zdGF0dXNfd3JpdGVgLCBgYm1fdW5saW5rYCwgYW5kIGBibV9lbnRyeV9zaG93YC5cblxuSSBoYWQgYGNyZWF0ZV9lbnRyeWAgbGlzdGVkLCBidXQgdGhhdCdzIHN0YXRpYy4gQnV0IHN5emthbGxlciBjYW4gcmVhY2ggc3RhdGljIGZ1bmN0aW9ucyBpZiByZWFjaGFibGUuIEJ1dCwgY29uc2lkZXJpbmcgRm9jdXNTeW1ib2xzIGlzIGFib3V0IGNvdmVyYWdlIGd1aWRhbmNlIGFuZCBjb3JwdXMgcHJpb3JpdGl6YXRpb24sIGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvIGxpc3QgdGhlIHJlbGV2YW50IHN5c2NhbGwgZW50cnkgcG9pbnRzIGFuZCB0aGUgdG9wLWxldmVsIGhhbmRsZXJzIGFuZCB0aGF0J3MgY292ZXJlZCBpbiB0aGUgbGlzdCBhYm92ZS4gYGJtX3JlZ2lzdGVyX3dyaXRlYCBjYWxscyBgY3JlYXRlX2VudHJ5YC5cblxuU28gdGhlIGZpbmFsIGxpc3QgZm9yIHRoZSBmdXp6ZXI6XG4qICAgYGxvYWRfbWlzY19iaW5hcnlgXG4qICAgYGJtX3JlZ2lzdGVyX3dyaXRlYFxuKiAgIGBibV9lbnRyeV93cml0ZWBcbiogICBgYm1fc3RhdHVzX3dyaXRlYFxuKiAgIGBibV91bmxpbmtgXG4qICAgYGJtX2VudHJ5X3Nob3dgXG5cblRoZSByZWFzb25pbmcgaGVyZSBpcyB0aGF0IHRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IHJlZmFjdG9ycyB0aGUgYGJpbmZtdF9taXNjYCBmaWxlc3lzdGVtIHdpdGggUkNVLWJhc2VkIGxvb2t1cHMsIHNwaW5sb2NrIGJhc2VkIGxvY2tpbmcsIGBzZXFfZmlsZWAgZm9yIGVudHJ5IHJlYWRpbmcsIGFuZCBhZGRzIGVudHJ5IHVubGlua2luZywgd2hpY2ggYXJlIGFsbCBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gaW1wb3J0YW50IGtlcm5lbCBsb2dpYyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gcHJldmVudCByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBwcm9ibGVtcy4gVGltZSB0byBzZXQgdGhlc2UgcmVzdWx0cyBhbmQgcHVzaCBmb3J3YXJkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODE1MCwiT3V0cHV0VG9rZW5zIjoxNjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMjA6MzM6MDAuMDY1NDcyNTUzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzAwNzQwNzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwiYm1fZW50cnlfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCSU5GTVRfTUlTQ1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImxvYWRfbWlzY19iaW5hcnlcIixcbiAgICBcImJtX3JlZ2lzdGVyX3dyaXRlXCIsXG4gICAgXCJibV9lbnRyeV93cml0ZVwiLFxuICAgIFwiYm1fc3RhdHVzX3dyaXRlXCIsXG4gICAgXCJibV91bmxpbmtcIixcbiAgICBcImJtX2VudHJ5X3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzaWduaWZpY2FudGx5IHJlZmFjdG9ycyB0aGUgYmluZm10X21pc2MgZmlsZXN5c3RlbSwgaW50cm9kdWNpbmcgUkNVLWJhc2VkIGxvb2t1cHMsIGNoYW5naW5nIGludGVybmFsIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGNvbnZlcnRpbmcgZW50cnkgcmVhZGluZyB0byB1c2Ugc2VxX2ZpbGUsIGFuZCBhZGRpbmcgc3VwcG9ydCBmb3IgcmVtb3ZpbmcgZW50cmllcyB2aWEgdW5saW5rKDIpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIG5vIHJlZ3Jlc3Npb25zLCBtZW1vcnkgbGVha3MsIG9yIGNvbmN1cnJlbmN5IGlzc3VlcyB3ZXJlIGludHJvZHVjZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowg6hzn[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-10 20:03:03 +0000 UTC FinishedAt: 2026-07-10 20:33:01 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "dc59e4fea9d83f03bad6bddf3fa2e52491777482", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BINFMT_MISC" ], "series_id": "47fd02d9-4de2-4cce-b651-657e4669ccd6" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "load_misc_binary", "bm_register_write", "bm_entry_write", "bm_status_write", "bm_unlink", "bm_entry_show" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtibV9yZWdpc3Rlcl93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9zdGF0dXNfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fdW5saW5rJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2lnbmlmaWNhbnRseSByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0sIGludHJvZHVjaW5nIFJDVS1iYXNlZCBsb29rdXBzLCBjaGFuZ2luZyBpbnRlcm5hbCBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBjb252ZXJ0aW5nIGVudHJ5IHJlYWRpbmcgdG8gdXNlIHNlcV9maWxlLCBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIHJlbW92aW5nIGVudHJpZXMgdmlhIHVubGluaygyKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBubyByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBpc3N1ZXMgd2VyZSBpbnRyb2R1Y2VkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYTg3N2RiMWJmYjdkMmQ4YTViY2ZlYTAzZjNmYzExMmM4NDAzYWQzMlxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgSnVsIDEwIDIwOjMyOjM3IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbmluZGV4IGMwYTM0ZmJmODAyMmI1Li4zMDZlZjQ4ZjVkZTZkZCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuQEAgLTEzMyw3ICYjNDM7MTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxuIENhdHRpbmcgdGhlIGZpbGUgdGVsbHMgeW91IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBgYGJpbmZtdF9taXNjL3RoZV9lbnRyeWBgLlxuIFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcbi1vciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC5cbiYjNDM7b3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuIEEgc2luZ2xlIGVudHJ5IGNhbiBhbHNvIGJlIHJlbW92ZWRcbiYjNDM7Ynkgc2ltcGx5IHVubGlua2luZyAoYGBybWBgKSBgYC9wcm9jLy4uLi90aGVfbmFtZWBgLlxuIFxuIFxuIEhpbnRzXG5kaWZmIC0tZ2l0IGEvZnMvYmluZm10X21pc2MuYyBiL2ZzL2JpbmZtdF9taXNjLmNcbmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mNTFkMjcyNjk4NjE2MCAxMDA2NDRcbi0tLSBhL2ZzL2JpbmZtdF9taXNjLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2JpbmZtdF9taXNjLmNcbkBAIC0xMCw0NSAmIzQzOzEwLDQ2IEBAXG4gXG4gI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSBcJiMzNDs6IFwmIzM0OyBmbXRcbiBcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9rZXJuZWwuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaGV4LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9tbS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpbmZtdHMuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyZWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2N0eXBlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZmlsZS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvcGFnZW1hcC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbmFtZWkuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21vdW50LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zeXNjYWxscy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tzdHJ0b3guaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3ByaW50ay5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdWxpc3QuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NlcV9maWxlLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC91YWNjZXNzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFx1MDAzZVxuIFxuLSNpbmNsdWRlIFwmIzM0O2ludGVybmFsLmhcJiMzNDtcbi1cbi0jaWZkZWYgREVCVUdcbi0jIGRlZmluZSBVU0VfREVCVUcgMVxuLSNlbHNlXG4tIyBkZWZpbmUgVVNFX0RFQlVHIDBcbi0jZW5kaWZcbi1cbi1lbnVtIHtcbi1cdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xuJiM0MzsvKiBFbnRyeSBzdGF0dXMgYW5kIG1hdGNoIHR5cGUgYml0IG51bWJlcnMuICovXG4mIzQzO2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XG4mIzQzO1x0TUlTQ19GTVRfRU5BQkxFRF9CSVRcdD0gMCxcbiYjNDM7XHRNSVNDX0ZNVF9NQUdJQ19CSVRcdD0gMSxcbiB9O1xuIFxuLWVudW0ge0VuYWJsZWQsIE1hZ2ljfTtcbi0jZGVmaW5lIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwICgxVUwgXHUwMDNjXHUwMDNjIDMxKVxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9CSU5BUlkgKDFVTCBcdTAwM2NcdTAwM2MgMzApXG4tI2RlZmluZSBNSVNDX0ZNVF9DUkVERU5USUFMUyAoMVVMIFx1MDAzY1x1MDAzYyAyOSlcbi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fRklMRSAoMVVMIFx1MDAzY1x1MDAzYyAyOClcbiYjNDM7LyogRW50cnkgYmVoYXZpb3IgZmxhZ3MsIGZpeGVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiAqL1xuJiM0MztlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2ZsYWdzIHtcbiYjNDM7XHRNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMFx0PSAoMVUgXHUwMDNjXHUwMDNjIDMxKSxcbiYjNDM7XHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVx0PSAoMVUgXHUwMDNjXHUwMDNjIDMwKSxcbiYjNDM7XHRNSVNDX0ZNVF9DUkVERU5USUFMU1x0PSAoMVUgXHUwMDNjXHUwMDNjIDI5KSxcbiYjNDM7XHRNSVNDX0ZNVF9PUEVOX0ZJTEVcdD0gKDFVIFx1MDAzY1x1MDAzYyAyOCksXG4mIzQzO307XG4gXG4tdHlwZWRlZiBzdHJ1Y3Qge1xuLVx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuJiM0MztzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xuJiM0MztcdHN0cnVjdCBobGlzdF9ub2RlIG5vZGU7XG4gXHR1bnNpZ25lZCBsb25nIGZsYWdzO1x0XHQvKiB0eXBlLCBzdGF0dXMsIGV0Yy4gKi9cbiBcdGludCBvZmZzZXQ7XHRcdFx0Lyogb2Zmc2V0IG9mIG1hZ2ljICovXG4gXHRpbnQgc2l6ZTtcdFx0XHQvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi9cbkBAIC01OSw5ICYjNDM7NjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7XG4gXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XG4gXHRyZWZjb3VudF90IHVzZXJzO1x0XHQvKiBzeW5jIHJlbW92YWwgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgKi9cbi19IE5vZGU7XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XG4mIzQzO1x0c3RydWN0IHJjdV9oZWFkIHJjdTtcbiYjNDM7XHRjaGFyIGJ1ZltdO1x0XHRcdC8qIHJlZ2lzdGVyIHN0cmluZywgZmllbGRzIHBvaW50IGluIGhlcmUgKi9cbiYjNDM7fTtcbiBcbiAvKlxuICAqIE1heCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHN0cmluZy4gIERldGVybWluZWQgYnk6XG5AQCAtNzQsMTAgJiM0Mzs3NSwzNiBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcbiAgKiAgLSBpbnRlcnA6IH41MCBieXRlc1xuICAqICAtIGZsYWdzOiAgNSBieXRlc1xuICAqIFJvdW5kIHRoYXQgdXAgYSBiaXQsIGFuZCB0aGVuIGJhY2sgb2ZmIHRvIGhvbGQgdGhlIGludGVybmFsIGRhdGFcbi0gKiAobGlrZSBzdHJ1Y3QgTm9kZSkuXG4mIzQzOyAqIChsaWtlIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSkuXG4gICovXG4gI2RlZmluZSBNQVhfUkVHSVNURVJfTEVOR1RIIDE5MjBcbiBcbiYjNDM7LyogVHJhaWxpbmcgZGVsaW1pdGVyIHBhZCBzbyBmaWVsZCBwYXJzaW5nIGFsd2F5cyB0ZXJtaW5hdGVzIGF0IGEgZGVsaW1pdGVyLiAqL1xuJiM0MzsjZGVmaW5lIE1JU0NfREVMSU1fUEFEIDhcbiYjNDM7XG4mIzQzOy8qIENoZWNrIGlmIEBlJiMzOTtzIG1hZ2ljIG1hdGNoZXMgQGJwcm0mIzM5O3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovXG4mIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuJiM0MztcdFx0XHRcdGNvbnN0IHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBjaGFyICpzID0gYnBybS1cdTAwM2VidWYgJiM0MzsgZS1cdTAwM2VvZmZzZXQ7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmICghZS1cdTAwM2VtYXNrKVxuJiM0MztcdFx0cmV0dXJuICFtZW1jbXAocywgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgZS1cdTAwM2VzaXplOyBpJiM0MzsmIzQzOylcbiYjNDM7XHRcdGlmICgoc1tpXSBeIGUtXHUwMDNlbWFnaWNbaV0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbaV0pXG4mIzQzO1x0XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogQ2hlY2sgaWYgQGUmIzM5O3MgcmVnaXN0ZXJlZCBleHRlbnNpb24gbWF0Y2hlcyBAZXh0LCBOVUxMIGlmIHRoZXJlIGlzIG5vbmUuICovXG4mIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGNvbnN0IHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSxcbiYjNDM7XHRcdFx0XHQgICAgY29uc3QgY2hhciAqZXh0KVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIGV4dCBcdTAwMjZcdTAwMjYgIXN0cmNtcChlLVx1MDAzZW1hZ2ljLCBleHQpO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIHNlYXJjaF9iaW5mbXRfaGFuZGxlciAtIHNlYXJjaCBmb3IgYSBiaW5hcnkgaGFuZGxlciBmb3IgQGJwcm1cbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXG5AQCAtODYsNDMgJiM0MzsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XG4gICogU2VhcmNoIGZvciBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZm9yIEBicHJtIGluIHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgYmluYXJ5XG4gICogdHlwZSBoYW5kbGVycy5cbiAgKlxuJiM0MzsgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cbiYjNDM7ICpcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXG4gICovXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4tXHRcdFx0XHQgICBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpcbiYjNDM7c2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHRjaGFyICpwID0gc3RycmNocihicHJtLVx1MDAzZWludGVycCwgJiMzOTsuJiMzOTspO1xuLVx0Tm9kZSAqZTtcbiYjNDM7XHRjaGFyICpkb3QgPSBzdHJyY2hyKGJwcm0tXHUwMDNlaW50ZXJwLCAmIzM5Oy4mIzM5Oyk7XG4mIzQzO1x0Y29uc3QgY2hhciAqZXh0ID0gZG90ID8gZG90ICYjNDM7IDEgOiBOVUxMO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTtcbiBcbiBcdC8qIFdhbGsgYWxsIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzLiAqL1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShlLCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpIHtcbi1cdFx0Y2hhciAqcztcbi1cdFx0aW50IGo7XG4tXG4mIzQzO1x0aGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSkge1xuIFx0XHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXG4tXHRcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4mIzQzO1x0XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiBcdFx0XHRjb250aW51ZTtcbiBcbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gZXh0ZW5zaW9uIGlmIGFwcGxpY2FibGUuICovXG4tXHRcdGlmICghdGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdFx0aWYgKHAgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZS1cdTAwM2VtYWdpYywgcCAmIzQzOyAxKSlcbiYjNDM7XHRcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4mIzQzO1x0XHRcdGlmIChlbnRyeV9tYXRjaGVzX21hZ2ljKGUsIGJwcm0pKVxuIFx0XHRcdFx0cmV0dXJuIGU7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cbi1cdFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXHUwMDI2IG1hc2suICovXG4tXHRcdHMgPSBicHJtLVx1MDAzZWJ1ZiAmIzQzOyBlLVx1MDAzZW9mZnNldDtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIGUtXHUwMDNlc2l6ZTsgaiYjNDM7JiM0MzspXG4tXHRcdFx0XHRpZiAoKCpzJiM0MzsmIzQzOyBeIGUtXHUwMDNlbWFnaWNbal0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbal0pXG4tXHRcdFx0XHRcdGJyZWFrO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIGUtXHUwMDNlc2l6ZTsgaiYjNDM7JiM0MzspXG4tXHRcdFx0XHRpZiAoKCpzJiM0MzsmIzQzOyBeIGUtXHUwMDNlbWFnaWNbal0pKVxuLVx0XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0aWYgKGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGUsIGV4dCkpXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGU7XG4gXHRcdH1cbi1cdFx0aWYgKGogPT0gZS1cdTAwM2VzaXplKVxuLVx0XHRcdHJldHVybiBlO1xuIFx0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG5AQCAtMTM0LDY0ICYjNDM7MTQ4LDY5IEBAIHN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcbiAgKlxuICAqIFRyeSB0byBmaW5kIGEgYmluZm10IGhhbmRsZXIgZm9yIHRoZSBiaW5hcnkgdHlwZS4gSWYgb25lIGlzIGZvdW5kIHRha2UgYVxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cbiYjNDM7ICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGVcbiYjNDM7ICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXG4mIzQzOyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxuJiM0MzsgKiBpcyBib3VuZGVkLlxuICAqXG4gICogUmV0dXJuOiBiaW5hcnkgdHlwZSBsaXN0IGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZVxuICAqL1xuLXN0YXRpYyBOb2RlICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxuLVx0XHRcdFx0c3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4ge1xuLVx0Tm9kZSAqZTtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4gXG4tXHRyZWFkX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuLVx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcbi1cdGlmIChlKVxuLVx0XHRyZWZjb3VudF9pbmMoXHUwMDI2ZS1cdTAwM2V1c2Vycyk7XG4tXHRyZWFkX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4mIzQzO1x0Z3VhcmQocmN1KSgpO1xuJiM0MztcdGRvIHtcbiYjNDM7XHRcdGUgPSBzZWFyY2hfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4mIzQzO1x0fSB3aGlsZSAoZSBcdTAwMjZcdTAwMjYgIXJlZmNvdW50X2luY19ub3RfemVybyhcdTAwMjZlLVx1MDAzZXVzZXJzKSk7XG4gXHRyZXR1cm4gZTtcbiB9XG4gXG4gLyoqXG4tICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIG5vZGVcbi0gKiBAZTogbm9kZSB0byBwdXRcbiYjNDM7ICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIGVudHJ5XG4mIzQzOyAqIEBlOiBlbnRyeSB0byBwdXRcbiAgKlxuLSAqIEZyZWUgbm9kZSBzeW5jaW5nIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpIGFuZCBkZWZlciBmaW5hbCBmcmVlIHRvXG4mIzQzOyAqIEZyZWUgZW50cnkgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xuICAqIGxvYWRfbWlzY19iaW5hcnkoKSBpbiBjYXNlIGl0IGlzIHVzaW5nIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIHdlIHdlcmVcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxuICAqL1xuLXN0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihOb2RlICplKVxuJiM0MztzdGF0aWMgdm9pZCBwdXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbiBcdGlmIChyZWZjb3VudF9kZWNfYW5kX3Rlc3QoXHUwMDI2ZS1cdTAwM2V1c2VycykpIHtcbi1cdFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbiYjNDM7XHRcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcbiYjNDM7XHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGUtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZS1cdTAwM2VpbnRlcnBfZmlsZSwgTlVMTCk7XG4tXHRcdGtmcmVlKGUpO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0LyogTG9ja2xlc3Mgd2Fsa2VycyBtYXkgc3RpbGwgZGVyZWZlcmVuY2UgdGhpcyBlbnRyeS4gKi9cbiYjNDM7XHRcdGtmcmVlX3JjdShlLCByY3UpO1xuIFx0fVxuIH1cbiBcbiYjNDM7REVGSU5FX0ZSRUUocHV0X2JpbmZtdF9oYW5kbGVyLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKiwgaWYgKF9UKSBwdXRfYmluZm10X2hhbmRsZXIoX1QpKVxuJiM0MztcbiAvKipcbi0gKiBsb2FkX2JpbmZtdF9taXNjIC0gbG9hZCB0aGUgYmluZm10X21pc2Mgb2YgdGhlIGNhbGxlciYjMzk7cyB1c2VyIG5hbWVzcGFjZVxuJiM0MzsgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlXG4gICpcbi0gKiBUbyBiZSBjYWxsZWQgaW4gbG9hZF9taXNjX2JpbmFyeSgpIHRvIGxvYWQgdGhlIHJlbGV2YW50IHN0cnVjdCBiaW5mbXRfbWlzYy5cbi0gKiBJZiBhIHVzZXIgbmFtZXNwYWNlIGRvZXNuJiMzOTt0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCBjYW4gbWFrZSB1c2Vcbi0gKiBvZiBpdHMgYW5jZXN0b3ImIzM5O3MgYmluZm10X21pc2MgaGFuZGxlcnMuIFRoaXMgbWltaWNrcyB0aGUgYmVoYXZpb3Igb2Zcbi0gKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBiaW5mbXRfbWlzYyBoYW5kbGVycyB3aGVyZVxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXG4mIzQzOyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IHVzZXMgdGhlXG4mIzQzOyAqIGhhbmRsZXJzIG9mIGl0cyBjbG9zZXN0IGFuY2VzdG9yIHdpdGggb25lLiBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2ZcbiYjNDM7ICogcHJlLW5hbWVzcGFjZWQgYmluZm10X21pc2Mgd2hlcmUgYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnMgd2VyZSBhdmFpbGFibGVcbiYjNDM7ICogdG8gYWxsIHVzZXJzIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4gVGhlIGluaXQgdXNlciBuYW1lc3BhY2VcbiYjNDM7ICogaW5zdGFuY2UgaXMgc3RhdGljYWxseSBzZXQgdXAgc28gdGhlIGZhbGxiYWNrIGlzIG5ldmVyIHJlYWNoZWQgaW5cbiYjNDM7ICogcHJhY3RpY2UuXG4gICpcbiAgKiBSZXR1cm46IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlXG4gICovXG4tc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpjdXJyZW50X2JpbmZtdF9taXNjKHZvaWQpXG4ge1xuIFx0Y29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zO1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuIFxuLVx0dXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpO1xuLVx0d2hpbGUgKHVzZXJfbnMpIHtcbiYjNDM7XHRmb3IgKHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTsgdXNlcl9uczsgdXNlcl9ucyA9IHVzZXJfbnMtXHUwMDNlcGFyZW50KSB7XG4gXHRcdC8qIFBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKSBpbiBibV9maWxsX3N1cGVyKCkuICovXG4gXHRcdG1pc2MgPSBzbXBfbG9hZF9hY3F1aXJlKFx1MDAyNnVzZXJfbnMtXHUwMDNlYmluZm10X21pc2MpO1xuIFx0XHRpZiAobWlzYylcbiBcdFx0XHRyZXR1cm4gbWlzYztcbi1cbi1cdFx0dXNlcl9ucyA9IHVzZXJfbnMtXHUwMDNlcGFyZW50O1xuIFx0fVxuIFxuIFx0cmV0dXJuIFx1MDAyNmluaXRfYmluZm10X21pc2M7XG5AQCAtMjAyLDMwICYjNDM7MjIxLDI5IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZClcbiAgKi9cbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICpmbXQ7XG4tXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGUgPSBOVUxMO1xuLVx0aW50IHJldHZhbCA9IC1FTk9FWEVDO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZm10IF9fZnJlZShwdXRfYmluZm10X2hhbmRsZXIpID0gTlVMTDtcbiYjNDM7XHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4mIzQzO1x0aW50IHJldHZhbDtcbiBcbi1cdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XG4tXHRpZiAoIW1pc2MtXHUwMDNlZW5hYmxlZClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbiYjNDM7XHRtaXNjID0gY3VycmVudF9iaW5mbXRfbWlzYygpO1xuJiM0MztcdGlmICghUkVBRF9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCkpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHRmbXQgPSBnZXRfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4gXHRpZiAoIWZtdClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbiYjNDM7XHRcdHJldHVybiAtRU5PRVhFQztcbiBcbiBcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cbi1cdHJldHZhbCA9IC1FTk9FTlQ7XG4gXHRpZiAoYnBybS1cdTAwM2VpbnRlcnBfZmxhZ3MgXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gLUVOT0VOVDtcbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKSB7XG4gXHRcdGJwcm0tXHUwMDNlaW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19QUkVTRVJWRV9BUkdWMDtcbiBcdH0gZWxzZSB7XG4gXHRcdHJldHZhbCA9IHJlbW92ZV9hcmdfemVybyhicHJtKTtcbiBcdFx0aWYgKHJldHZhbClcbi1cdFx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdFx0cmV0dXJuIHJldHZhbDtcbiBcdH1cbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxuQEAgLTIzNCw1NyAmIzQzOzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiBcdC8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovXG4gXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoYnBybS1cdTAwM2VpbnRlcnAsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gcmV0dmFsO1xuIFx0YnBybS1cdTAwM2VhcmdjJiM0MzsmIzQzOztcbiBcbiBcdC8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChmbXQtXHUwMDNlaW50ZXJwcmV0ZXIsIGJwcm0pO1xuIFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gcmV0dmFsO1xuIFx0YnBybS1cdTAwM2VhcmdjJiM0MzsmIzQzOztcbiBcbiBcdC8qIFVwZGF0ZSBpbnRlcnAgaW4gY2FzZSBiaW5mbXRfc2NyaXB0IG5lZWRzIGl0LiAqL1xuIFx0cmV0dmFsID0gYnBybV9jaGFuZ2VfaW50ZXJwKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbiYjNDM7XHRcdHJldHVybiByZXR2YWw7XG4gXG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcbiBcdFx0aW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LVx1MDAzZWludGVycF9maWxlKTtcbi1cdFx0aWYgKCFJU19FUlIoaW50ZXJwX2ZpbGUpKVxuLVx0XHRcdGRlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTtcbiYjNDM7XHRcdGlmICghSVNfRVJSKGludGVycF9maWxlKSkge1xuJiM0MztcdFx0XHRpbnQgZXJyID0gZXhlX2ZpbGVfZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xuJiM0MztcbiYjNDM7XHRcdFx0aWYgKGVycikge1xuJiM0MztcdFx0XHRcdGZwdXQoaW50ZXJwX2ZpbGUpO1xuJiM0MztcdFx0XHRcdGludGVycF9maWxlID0gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9XG4gXHR9IGVsc2Uge1xuIFx0XHRpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyhmbXQtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuIFx0fVxuLVx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XG4gXHRpZiAoSVNfRVJSKGludGVycF9maWxlKSlcbi1cdFx0Z290byByZXQ7XG4mIzQzO1x0XHRyZXR1cm4gUFRSX0VSUihpbnRlcnBfZmlsZSk7XG4gXG4gXHRicHJtLVx1MDAzZWludGVycHJldGVyID0gaW50ZXJwX2ZpbGU7XG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbiBcdFx0YnBybS1cdTAwM2VleGVjZmRfY3JlZHMgPSAxO1xuLVxuLVx0cmV0dmFsID0gMDtcbi1yZXQ6XG4tXG4tXHQvKlxuLVx0ICogSWYgd2UgYWN0dWFsbHkgcHV0IHRoZSBub2RlIGhlcmUgYWxsIGNvbmN1cnJlbnQgY2FsbHMgdG9cbi1cdCAqIGxvYWRfbWlzY19iaW5hcnkoKSB3aWxsIGhhdmUgZmluaXNoZWQuIFdlIGFsc28ga25vd1xuLVx0ICogdGhhdCBmb3IgdGhlIHJlZmNvdW50IHRvIGJlIHplcm8gc29tZW9uZSBtdXN0IGhhdmUgY29uY3VyZW50bHlcbi1cdCAqIHJlbW92ZWQgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBhbmQgaXQmIzM5O3Mgb3VyIGpvYiB0b1xuLVx0ICogZnJlZSBpdC5cbi1cdCAqL1xuLVx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XG4tXG4tXHRyZXR1cm4gcmV0dmFsO1xuJiM0MztcdHJldHVybiAwO1xuIH1cbiBcbiAvKiBDb21tYW5kIHBhcnNlcnMgKi9cbiBcbiAvKlxuLSAqIHBhcnNlcyBhbmQgY29waWVzIG9uZSBhcmd1bWVudCBlbmNsb3NlZCBpbiBkZWwgZnJvbSAqc3AgdG8gKmRwLFxuLSAqIHJlY29nbmlzaW5nIHRoZSBcXHggc3BlY2lhbC5cbi0gKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW5cbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cbiYjNDM7ICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZ1xuJiM0MzsgKiB0aGUgXFx4IGVzY2FwZS4gVGVybWluYXRlcyB0aGUgYXJndW1lbnQgd2l0aCBhIE5VTCBhbmQgcmV0dXJucyBhIHBvaW50ZXJcbiYjNDM7ICogcGFzdCBpdCBvciBOVUxMIG9uIGEgbWFsZm9ybWVkIGVzY2FwZS5cbiAgKi9cbiBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbClcbiB7XG5AQCAtMjk5LDQ2ICYjNDM7MzA4LDEyMyBAQCBzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbClcbiBcdFx0XHRcdHJldHVybiBOVUxMO1xuIFx0XHR9XG4gXHR9XG4tXHRzWy0xXSA9JiMzOTtcXDAmIzM5OztcbiYjNDM7XHRzWy0xXSA9ICYjMzk7XFwwJiMzOTs7XG4gXHRyZXR1cm4gcztcbiB9XG4gXG4tc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxuJiM0MztzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpwLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuLVx0Y2hhciAqcCA9IHNmcztcbi1cdGludCBjb250ID0gMTtcbi1cbi1cdC8qIHNwZWNpYWwgZmxhZ3MgKi9cbi1cdHdoaWxlIChjb250KSB7XG4mIzQzO1x0Zm9yICg7OyBwJiM0MzsmIzQzOykge1xuIFx0XHRzd2l0Y2ggKCpwKSB7XG4gXHRcdGNhc2UgJiMzOTtQJiMzOTs6XG4gXHRcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IFAgKHByZXNlcnZlIGFyZ3YwKVxcblwmIzM0Oyk7XG4tXHRcdFx0cCYjNDM7JiM0Mzs7XG4gXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMDtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAmIzM5O08mIzM5OzpcbiBcdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZmxhZzogTyAob3BlbiBiaW5hcnkpXFxuXCYjMzQ7KTtcbi1cdFx0XHRwJiM0MzsmIzQzOztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fQklOQVJZO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7QyYjMzk7OlxuIFx0XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBmbGFnOiBDIChwcmVzZXJ2ZSBjcmVkcylcXG5cJiMzNDspO1xuLVx0XHRcdHAmIzQzOyYjNDM7O1xuLVx0XHRcdC8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZVxuLVx0XHRcdCAgIG9wZW4tYmluYXJ5IGZsYWcgKi9cbi1cdFx0XHRlLVx1MDAzZWZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8XG4tXHRcdFx0XHRcdE1JU0NfRk1UX09QRU5fQklOQVJZKTtcbiYjNDM7XHRcdFx0LyogQyBpbXBsaWVzIE8gKi9cbiYjNDM7XHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9DUkVERU5USUFMUyB8IE1JU0NfRk1UX09QRU5fQklOQVJZO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRjYXNlICYjMzk7RiYjMzk7OlxuIFx0XHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBmbGFnOiBGOiBvcGVuIGludGVycHJldGVyIGZpbGUgbm93XFxuXCYjMzQ7KTtcbi1cdFx0XHRwJiM0MzsmIzQzOztcbiBcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcbiBcdFx0XHRicmVhaztcbiBcdFx0ZGVmYXVsdDpcbi1cdFx0XHRjb250ID0gMDtcbiYjNDM7XHRcdFx0cmV0dXJuIHA7XG4gXHRcdH1cbiBcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTssICYjMzk7bWFnaWMmIzM5OyBhbmQgJiMzOTttYXNrJiMzOTsgZmllbGRzIG9mIGFuICYjMzk7TSYjMzk7IGVudHJ5LiAqL1xuJiM0MztzdGF0aWMgY2hhciAqcGFyc2VfbWFnaWNfZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCwgY2hhciBkZWwpXG4mIzQzO3tcbiYjNDM7XHRjaGFyICpzO1xuJiM0MztcbiYjNDM7XHQvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRzID0gc3RyY2hyKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFzKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0KnMgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdGlmIChwICE9IHMpIHtcbiYjNDM7XHRcdGlmIChrc3RydG9pbnQocCwgMTAsIFx1MDAyNmUtXHUwMDNlb2Zmc2V0KSB8fCBlLVx1MDAzZW9mZnNldCBcdTAwM2MgMClcbiYjNDM7XHRcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0fVxuJiM0MztcdHAgPSBzICYjNDM7IDE7XG4mIzQzO1x0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4mIzQzO1xuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4mIzQzO1x0ZS1cdTAwM2VtYWdpYyA9IHA7XG4mIzQzO1x0cCA9IHNjYW5hcmcocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXAgfHwgIWUtXHUwMDNlbWFnaWNbMF0pXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbiYjNDM7XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwmIzM0OyxcbiYjNDM7XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hZ2ljLCBwIC0gZS1cdTAwM2VtYWdpYywgdHJ1ZSk7XG4mIzQzO1xuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi9cbiYjNDM7XHRlLVx1MDAzZW1hc2sgPSBwO1xuJiM0MztcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4mIzQzO1x0aWYgKCFwKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0aWYgKCFlLVx1MDAzZW1hc2tbMF0pIHtcbiYjNDM7XHRcdGUtXHUwMDNlbWFzayA9IE5VTEw7XG4mIzQzO1x0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwmIzM0Oyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuJiM0MztcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiBcJiMzNDssXG4mIzQzO1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIHAgLSBlLVx1MDAzZW1hc2ssIHRydWUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZFxuJiM0MztcdCAqIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyB3aWxsIHN0b3AgYXRcbiYjNDM7XHQgKiB0aGUgZmlyc3Qgb25lIHRoZXkgZW5jb3VudGVyLlxuJiM0MztcdCAqL1xuJiM0MztcdGUtXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XG4mIzQzO1x0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjYgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtXHUwMDNlc2l6ZSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fCBCSU5QUk1fQlVGX1NJWkUgLSBlLVx1MDAzZXNpemUgXHUwMDNjIGUtXHUwMDNlb2Zmc2V0KVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwmIzM0OywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcbiYjNDM7XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiBcJiMzNDssXG4mIzQzO1x0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplLCB0cnVlKTtcbiYjNDM7XHRpZiAoZS1cdTAwM2VtYXNrKVxuJiM0MztcdFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4mIzQzO1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcJiMzNDssXG4mIzQzO1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4mIzQzO1x0cmV0dXJuIHA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQgb2YgYW4gJiMzOTtFJiMzOTsgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovXG4mIzQzO3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcbiYjNDM7XHRcdFx0XHQgICAgY2hhciBkZWwpXG4mIzQzO3tcbiYjNDM7XHQvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuJiM0MztcdHAgPSBzdHJjaHIocCwgZGVsKTtcbiYjNDM7XHRpZiAoIXApXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHQqcCYjNDM7JiM0MzsgPSAmIzM5O1xcMCYjMzk7O1xuIFxuJiM0MztcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4mIzQzO1x0ZS1cdTAwM2VtYWdpYyA9IHA7XG4mIzQzO1x0cCA9IHN0cmNocihwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdCpwJiM0MzsmIzQzOyA9ICYjMzk7XFwwJiMzOTs7XG4mIzQzO1x0aWYgKCFlLVx1MDAzZW1hZ2ljWzBdIHx8IHN0cmNocihlLVx1MDAzZW1hZ2ljLCAmIzM5Oy8mIzM5OykpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogZXh0ZW5zaW9uOiB7JXN9XFxuXCYjMzQ7LCBlLVx1MDAzZW1hZ2ljKTtcbiYjNDM7XG4mIzQzO1x0LyogU2tpcCB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovXG4mIzQzO1x0cCA9IHN0cmNocihwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdCpwJiM0MzsmIzQzOyA9ICYjMzk7XFwwJiMzOTs7XG4gXHRyZXR1cm4gcDtcbiB9XG4gXG5AQCAtMzQ3LDUwICYjNDM7NDMzLDQ4IEBAIHN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSlcbiAgKiAmIzM5OzpuYW1lOnR5cGU6b2Zmc2V0Om1hZ2ljOm1hc2s6aW50ZXJwcmV0ZXI6ZmxhZ3MmIzM5O1xuICAqIHdoZXJlIHRoZSAmIzM5OzomIzM5OyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxuICAqL1xuLXN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHNpemVfdCBjb3VudClcbiB7XG4tXHROb2RlICplO1xuLVx0aW50IG1lbXNpemUsIGVycjtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgX19mcmVlKGtmcmVlKSA9IE5VTEw7XG4gXHRjaGFyICpidWYsICpwO1xuIFx0Y2hhciBkZWw7XG4gXG4gXHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogcmVjZWl2ZWQgJXp1IGJ5dGVzXFxuXCYjMzQ7LCBjb3VudCk7XG4gXG4gXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cbi1cdGVyciA9IC1FSU5WQUw7XG4gXHRpZiAoKGNvdW50IFx1MDAzYyAxMSkgfHwgKGNvdW50IFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcbi1cdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1cdGVyciA9IC1FTk9NRU07XG4tXHRtZW1zaXplID0gc2l6ZW9mKE5vZGUpICYjNDM7IGNvdW50ICYjNDM7IDg7XG4tXHRlID0ga21hbGxvYyhtZW1zaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuJiM0MztcdGUgPSBrbWFsbG9jKHN0cnVjdF9zaXplKGUsIGJ1ZiwgY291bnQgJiM0MzsgTUlTQ19ERUxJTV9QQUQpLFxuJiM0MztcdFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4gXHRpZiAoIWUpXG4tXHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7XG4gXG4tXHRwID0gYnVmID0gKGNoYXIgKillICYjNDM7IHNpemVvZihOb2RlKTtcbiYjNDM7XHRwID0gYnVmID0gZS1cdTAwM2VidWY7XG4gXG4tXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKE5vZGUpKTtcbiYjNDM7XHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XG4gXHRpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSlcbi1cdFx0Z290byBlZmF1bHQ7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbiBcbi1cdGRlbCA9ICpwJiM0MzsmIzQzOztcdC8qIGRlbGltZXRlciAqL1xuJiM0MztcdGRlbCA9ICpwJiM0MzsmIzQzOztcdC8qIGRlbGltaXRlciAqL1xuIFxuIFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGRlbGltOiAlI3ggeyVjfVxcblwmIzM0OywgZGVsLCBkZWwpO1xuIFxuIFx0LyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi9cbi1cdG1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgOCk7XG4mIzQzO1x0bWVtc2V0KGJ1ZiAmIzQzOyBjb3VudCwgZGVsLCBNSVNDX0RFTElNX1BBRCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtuYW1lJiMzOTsgZmllbGQuICovXG4gXHRlLVx1MDAzZW5hbWUgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VuYW1lWzBdIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy5cJiMzNDspIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwmIzM0Oy4uXCYjMzQ7KSB8fFxuIFx0ICAgIHN0cmNocihlLVx1MDAzZW5hbWUsICYjMzk7LyYjMzk7KSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBuYW1lOiB7JXN9XFxuXCYjMzQ7LCBlLVx1MDAzZW5hbWUpO1xuIFxuQEAgLTM5OCwxMzQgJiM0Mzs0ODIsMzMgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4gXHRzd2l0Y2ggKCpwJiM0MzsmIzQzOykge1xuIFx0Y2FzZSAmIzM5O0UmIzM5OzpcbiBcdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IEUgKGV4dGVuc2lvbilcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gMSBcdTAwM2NcdTAwM2MgRW5hYmxlZDtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgJiMzOTtNJiMzOTs6XG4gXHRcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXG5cJiMzNDspO1xuLVx0XHRlLVx1MDAzZWZsYWdzID0gKDEgXHUwMDNjXHUwMDNjIEVuYWJsZWQpIHwgKDEgXHUwMDNjXHUwMDNjIE1hZ2ljKTtcbiYjNDM7XHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdH1cbiBcdGlmICgqcCYjNDM7JiM0MzsgIT0gZGVsKVxuLVx0XHRnb3RvIGVpbnZhbDtcbi1cbi1cdGlmICh0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0LyogSGFuZGxlIHRoZSAmIzM5O00mIzM5OyAobWFnaWMpIGZvcm1hdC4gKi9cbi1cdFx0Y2hhciAqcztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovXG4tXHRcdHMgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFzKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcyA9ICYjMzk7XFwwJiMzOTs7XG4tXHRcdGlmIChwICE9IHMpIHtcbi1cdFx0XHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpO1xuLVx0XHRcdGlmIChyICE9IDAgfHwgZS1cdTAwM2VvZmZzZXQgXHUwMDNjIDApXG4tXHRcdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0fVxuLVx0XHRwID0gcztcbi1cdFx0aWYgKCpwJiM0MzsmIzQzOylcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG9mZnNldDogJSN4XFxuXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovXG4tXHRcdGUtXHUwMDNlbWFnaWMgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYWdpY1swXSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0aWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIHAgLSBlLVx1MDAzZW1hZ2ljKTtcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hc2sgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4tXHRcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbi1cdFx0XHRwcl9kZWJ1ZyhcJiMzNDtyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwmIzM0Oyk7XG4tXHRcdH0gZWxzZSBpZiAoVVNFX0RFQlVHKVxuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCYjMzQ7LFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYXNrLCBwIC0gZS1cdTAwM2VtYXNrKTtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBEZWNvZGUgdGhlIG1hZ2ljIFx1MDAyNiBtYXNrIGZpZWxkcy5cbi1cdFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxuLVx0XHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxuLVx0XHQgKiBpdCBlbmNvdW50ZXJzLlxuLVx0XHQgKi9cbi1cdFx0ZS1cdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cdTAwM2VtYWdpYywgVU5FU0NBUEVfSEVYKTtcbi1cdFx0aWYgKGUtXHUwMDNlbWFzayBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVx1MDAzZXNpemUpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fFxuLVx0XHQgICAgQklOUFJNX0JVRl9TSVpFIC0gZS1cdTAwM2VzaXplIFx1MDAzYyBlLVx1MDAzZW9mZnNldClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwmIzM0OywgZS1cdTAwM2VzaXplKTtcbi1cdFx0aWYgKFVTRV9ERUJVRykge1xuLVx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0S0JVSUxEX01PRE5BTUUgXCYjMzQ7OiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwmIzM0Oyxcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdFx0aW50IGk7XG4tXHRcdFx0XHRjaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbi1cbi1cdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0XHRpZiAobWFza2VkKSB7XG4tXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIGUtXHUwMDNlc2l6ZTsgJiM0MzsmIzQzO2kpXG4tXHRcdFx0XHRcdFx0bWFza2VkW2ldID0gZS1cdTAwM2VtYWdpY1tpXSBcdTAwMjYgZS1cdTAwM2VtYXNrW2ldO1xuLVx0XHRcdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcJiMzNDs6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogXCYjMzQ7LFxuLVx0XHRcdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRcdFx0a2ZyZWUobWFza2VkKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJiMzOTtFJiMzOTsgKGV4dGVuc2lvbikgZm9ybWF0LiAqL1xuLVxuLVx0XHQvKiBTa2lwIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cbi1cdFx0LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZC4gKi9cbi1cdFx0ZS1cdTAwM2VtYWdpYyA9IHA7XG4tXHRcdHAgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcCYjNDM7JiM0MzsgPSAmIzM5O1xcMCYjMzk7O1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXHUwMDNlbWFnaWMsICYjMzk7LyYjMzk7KSlcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0cHJfZGVidWcoXCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFNraXAgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqL1xuLVx0XHRwID0gc3RyY2hyKHAsIGRlbCk7XG4tXHRcdGlmICghcClcbi1cdFx0XHRnb3RvIGVpbnZhbDtcbi1cdFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5Oztcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKSlcbiYjNDM7XHRcdHAgPSBwYXJzZV9tYWdpY19maWVsZHMoZSwgcCwgZGVsKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRwID0gcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhlLCBwLCBkZWwpO1xuJiM0MztcdGlmICghcClcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuIFx0LyogUGFyc2UgdGhlICYjMzk7aW50ZXJwcmV0ZXImIzM5OyBmaWVsZC4gKi9cbiBcdGUtXHUwMDNlaW50ZXJwcmV0ZXIgPSBwO1xuIFx0cCA9IHN0cmNocihwLCBkZWwpO1xuIFx0aWYgKCFwKVxuLVx0XHRnb3RvIGVpbnZhbDtcbiYjNDM7XHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnAmIzQzOyYjNDM7ID0gJiMzOTtcXDAmIzM5OztcbiBcdGlmICghZS1cdTAwM2VpbnRlcnByZXRlclswXSlcbi1cdFx0Z290byBlaW52YWw7XG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdHByX2RlYnVnKFwmIzM0O3JlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJiMzOTtmbGFncyYjMzk7IGZpZWxkLiAqL1xuQEAgLTUzMywyNCAmIzQzOzUxNiwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmICgqcCA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRwJiM0MzsmIzQzOztcbiBcdGlmIChwICE9IGJ1ZiAmIzQzOyBjb3VudClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRyZXR1cm4gZTtcbi1cbi1vdXQ6XG4tXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuJiM0MztcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4tZWZhdWx0OlxuLVx0a2ZyZWUoZSk7XG4tXHRyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTtcbi1laW52YWw6XG4tXHRrZnJlZShlKTtcbi1cdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuJiM0MztcdHJldHVybiBub19mcmVlX3B0cihlKTtcbiB9XG4gXG4mIzQzOy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXHUwMDNjZW50cnlcdTAwM2UgZmlsZXMuICovXG4mIzQzO2VudW0gYm1fY29tbWFuZCB7XG4mIzQzO1x0Qk1fQ01EX0lHTk9SRSxcdC8qIGVtcHR5IHdyaXRlICovXG4mIzQzO1x0Qk1fQ01EX0RJU0FCTEUsXHQvKiBcJiMzNDswXCYjMzQ7ICovXG4mIzQzO1x0Qk1fQ01EX0VOQUJMRSxcdC8qIFwmIzM0OzFcJiMzNDsgKi9cbiYjNDM7XHRCTV9DTURfUkVNT1ZFLFx0LyogXCYjMzQ7LTFcJiMzNDsgKi9cbiYjNDM7fTtcbiYjNDM7XG4gLypcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxuLSAqICYjMzk7MSYjMzk7IGVuYWJsZXMsICYjMzk7MCYjMzk7IGRpc2FibGVzIGFuZCAmIzM5Oy0xJiMzOTsgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjXG4mIzQzOyAqIFBhcnNlIHdoYXQgdXNlcnNwYWNlIHdyb3RlIHRvIC9zdGF0dXMgb3IgYW4gZW50cnkgZmlsZTogJiMzOTsxJiMzOTsgZW5hYmxlcyxcbiYjNDM7ICogJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy5cbiAgKi9cbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIHtcbkBAIC01NjEsNjIgJiM0Mzs1NDIsNjQgQEAgc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcbiBcdFx0cmV0dXJuIC1FRkFVTFQ7XG4gXHRpZiAoIWNvdW50KVxuLVx0XHRyZXR1cm4gMDtcbiYjNDM7XHRcdHJldHVybiBCTV9DTURfSUdOT1JFO1xuIFx0aWYgKHNbY291bnQgLSAxXSA9PSAmIzM5O1xcbiYjMzk7KVxuIFx0XHRjb3VudC0tO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTswJiMzOTspXG4tXHRcdHJldHVybiAxO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9ESVNBQkxFO1xuIFx0aWYgKGNvdW50ID09IDEgXHUwMDI2XHUwMDI2IHNbMF0gPT0gJiMzOTsxJiMzOTspXG4tXHRcdHJldHVybiAyO1xuJiM0MztcdFx0cmV0dXJuIEJNX0NNRF9FTkFCTEU7XG4gXHRpZiAoY291bnQgPT0gMiBcdTAwMjZcdTAwMjYgc1swXSA9PSAmIzM5Oy0mIzM5OyBcdTAwMjZcdTAwMjYgc1sxXSA9PSAmIzM5OzEmIzM5Oylcbi1cdFx0cmV0dXJuIDM7XG4mIzQzO1x0XHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbiAvKiBnZW5lcmljIHN0dWZmICovXG4gXG4tc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3NlcV9oZXgoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCB1OCAqZGF0YSwgaW50IHNpemUpXG4ge1xuLVx0Y2hhciAqZHAgPSBwYWdlO1xuLVx0Y29uc3QgY2hhciAqc3RhdHVzID0gXCYjMzQ7ZGlzYWJsZWRcJiMzNDs7XG4mIzQzO1x0Zm9yIChpbnQgaSA9IDA7IGkgXHUwMDNjIHNpemU7IGkmIzQzOyYjNDM7KVxuJiM0MztcdFx0c2VxX3ByaW50ZihtLCBcJiMzNDslMDJ4XCYjMzQ7LCBkYXRhW2ldKTtcbiYjNDM7fVxuIFxuLVx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuLVx0XHRzdGF0dXMgPSBcJiMzNDtlbmFibGVkXCYjMzQ7O1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBtLVx1MDAzZXByaXZhdGU7XG4gXG4tXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XG4tXHRcdHNwcmludGYocGFnZSwgXCYjMzQ7JXNcXG5cJiMzNDssIHN0YXR1cyk7XG4tXHRcdHJldHVybjtcbi1cdH1cbiYjNDM7XHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZW5hYmxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0c2VxX3B1dHMobSwgXCYjMzQ7ZGlzYWJsZWRcXG5cJiMzNDspO1xuIFxuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0OyVzXFxuaW50ZXJwcmV0ZXIgJXNcXG5cJiMzNDssIHN0YXR1cywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4mIzQzO1x0c2VxX3ByaW50ZihtLCBcJiMzNDtpbnRlcnByZXRlciAlc1xcblwmIzM0OywgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4gXG4gXHQvKiBwcmludCB0aGUgc3BlY2lhbCBmbGFncyAqL1xuLVx0ZHAgJiM0Mzs9IHNwcmludGYoZHAsIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuJiM0MztcdHNlcV9wdXRzKG0sIFwmIzM0O2ZsYWdzOiBcJiMzNDspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKVxuLVx0XHQqZHAmIzQzOyYjNDM7ID0gJiMzOTtQJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O1AmIzM5Oyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpXG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O08mIzM5OztcbiYjNDM7XHRcdHNlcV9wdXRjKG0sICYjMzk7TyYjMzk7KTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7QyYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtDJiMzOTspO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcbi1cdFx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7RiYjMzk7O1xuLVx0KmRwJiM0MzsmIzQzOyA9ICYjMzk7XFxuJiMzOTs7XG4mIzQzO1x0XHRzZXFfcHV0YyhtLCAmIzM5O0YmIzM5Oyk7XG4mIzQzO1x0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXG4tXHRpZiAoIXRlc3RfYml0KE1hZ2ljLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuLVx0XHRzcHJpbnRmKGRwLCBcJiMzNDtleHRlbnNpb24gLiVzXFxuXCYjMzQ7LCBlLVx1MDAzZW1hZ2ljKTtcbiYjNDM7XHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7ZXh0ZW5zaW9uIC4lc1xcblwmIzM0OywgZS1cdTAwM2VtYWdpYyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4tXHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiYjNDM7XHRcdHNlcV9wcmludGYobSwgXCYjMzQ7b2Zmc2V0ICVpXFxubWFnaWMgXCYjMzQ7LCBlLVx1MDAzZW9mZnNldCk7XG4mIzQzO1x0XHRibV9zZXFfaGV4KG0sIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4gXHRcdGlmIChlLVx1MDAzZW1hc2spIHtcbi1cdFx0XHRkcCAmIzQzOz0gc3ByaW50ZihkcCwgXCYjMzQ7XFxubWFzayBcJiMzNDspO1xuLVx0XHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuJiM0MztcdFx0XHRzZXFfcHV0cyhtLCBcJiMzNDtcXG5tYXNrIFwmIzM0Oyk7XG4mIzQzO1x0XHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuIFx0XHR9XG4tXHRcdCpkcCYjNDM7JiM0MzsgPSAmIzM5O1xcbiYjMzk7O1xuLVx0XHQqZHAgPSAmIzM5O1xcMCYjMzk7O1xuJiM0MztcdFx0c2VxX3B1dGMobSwgJiMzOTtcXG4mIzM5Oyk7XG4gXHR9XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSlcbiYjNDM7c3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVtb2RlX3QgbW9kZSlcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTtcbiBcbkBAIC02NTIsMTQgJiM0Mzs2MzUsMTQgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqaV9iaW5mbXRfbWlzYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcbiAgKiBzaHV0ZG93bi5cbiAgKlxuLSAqIElmIHRoZSAtXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieSBhIHdyaXRlXG4tICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnlcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXG4tICogdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuJiM0MzsgKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnlcbiYjNDM7ICogcmVtb3ZpbmcgdGhlIGVudHJ5IHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIG9yIHVubGluaygyKSB0aGUgZW50cnlcbiYjNDM7ICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGhsaXN0X3VuaGFzaGVkKClcbiYjNDM7ICogY2hlY2sgdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuICovXG4gc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbiB7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVx1MDAzZWlfcHJpdmF0ZTtcbiBcbiBcdGNsZWFyX2lub2RlKGlub2RlKTtcbiBcbkBAIC02NjcsODkgJiM0Mzs2NTAsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4gXHRcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcbiBcbiBcdFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0XHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmUtXHUwMDNlbGlzdCkpXG4tXHRcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZlLVx1MDAzZWxpc3QpO1xuLVx0XHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdFx0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdFx0aGxpc3RfZGVsX2luaXRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSk7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRcdHB1dF9iaW5mbXRfaGFuZGxlcihlKTtcbiBcdH1cbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4mIzQzOyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbiYjNDM7ICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXG4mIzQzOyAqXG4mIzQzOyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcbiYjNDM7ICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxuJiM0MzsgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxuJiM0MzsgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxuJiM0MzsgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcbiYjNDM7ICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4mIzQzO3tcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7fVxuJiM0MztcbiAvKipcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXG4gICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZVxuICAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHJlbW92ZVxuICAqXG4gICogUmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmcm9tIHRoZSBsaXN0IG9mIGJpbmFyeSB0eXBlIGhhbmRsZXJzIGFuZFxuLSAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuIFRoaXMgaXMgY2FsbGVkIGZyb21cbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxuLSAqIGFkZGluZyBhIHByb3BlciAtXHUwMDNldW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXImIzM5O3Ncbi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhc1xuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0JiMzOTtzIG5vdCBhIHByZXNzaW5nIGlzc3VlLlxuJiM0MzsgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LlxuICAqL1xuLXN0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsIE5vZGUgKmUpXG4mIzQzO3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2RlbF9pbml0KFx1MDAyNmUtXHUwMDNlbGlzdCk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHVubGlua19iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiBcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVx1MDAzZWRlbnRyeSwgTlVMTCk7XG4gfVxuIFxuLS8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuJiM0MzsvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXG4mIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4gXG4tc3RhdGljIHNzaXplX3Rcbi1ibV9lbnRyeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4mIzQzO1x0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xuJiM0MztcdGlmICghaGxpc3RfdW5oYXNoZWQoXHUwMDI2ZS1cdTAwM2Vub2RlKSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cbiYjNDM7c3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbiYjNDM7XHRcdFx0XHQgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0Tm9kZSAqZSA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9wcml2YXRlO1xuLVx0c3NpemVfdCByZXM7XG4tXHRjaGFyICpwYWdlO1xuJiM0MztcdHN0cnVjdCBpbm9kZSAqcm9vdCA9IGRfaW5vZGUoc2ItXHUwMDNlc19yb290KTtcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4mIzQzO1x0c3RydWN0IGhsaXN0X25vZGUgKm5leHQ7XG4mIzQzO1xuJiM0MztcdGlub2RlX2xvY2tfbmVzdGVkKHJvb3QsIElfTVVURVhfUEFSRU5UKTtcbiYjNDM7XHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSlcbiYjNDM7XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbiYjNDM7XHRpbm9kZV91bmxvY2socm9vdCk7XG4mIzQzO31cbiBcbi1cdHBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXBhZ2UpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuJiM0MzsvKipcbiYjNDM7ICogYm1fdW5saW5rIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlciB2aWEgdW5saW5rKDIpXG4mIzQzOyAqIEBkaXI6IGlub2RlIG9mIHRoZSByb290IGRpcmVjdG9yeVxuJiM0MzsgKiBAZGVudHJ5OiBlbnRyeSBmaWxlIHRvIHJlbW92ZVxuJiM0MzsgKlxuJiM0MzsgKiBSZW1vdmluZyB0aGUgZW50cnkgZmlsZSByZW1vdmVzIGl0cyBiaW5hcnkgdHlwZSBoYW5kbGVyLCBleGFjdGx5IGxpa2VcbiYjNDM7ICogd3JpdGluZyAtMSB0byBpdCBkb2VzLiBUaGUgc3RhdHVzIGFuZCByZWdpc3RlciBjb250cm9sIGZpbGVzIGNhbiYjMzk7dCBiZVxuJiM0MzsgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcbiYjNDM7ICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBkX2lub2RlKGRlbnRyeSktXHUwMDNlaV9wcml2YXRlO1xuJiM0MztcbiYjNDM7XHRpZiAoIWUpXG4mIzQzO1x0XHRyZXR1cm4gLUVQRVJNO1xuJiM0MztcbiYjNDM7XHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcbiYjNDM7XHRyZXR1cm4gc2ltcGxlX3VubGluayhkaXIsIGRlbnRyeSk7XG4mIzQzO31cbiBcbi1cdGVudHJ5X3N0YXR1cyhlLCBwYWdlKTtcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0ge1xuJiM0MztcdC5sb29rdXBcdFx0PSBzaW1wbGVfbG9va3VwLFxuJiM0MztcdC51bmxpbmtcdFx0PSBibV91bmxpbmssXG4mIzQzO307XG4gXG4tXHRyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGFnZSwgc3RybGVuKHBhZ2UpKTtcbiYjNDM7LyogL1x1MDAzY2VudHJ5XHUwMDNlICovXG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0O1xuIFxuLVx0a2ZyZWUocGFnZSk7XG4tXHRyZXR1cm4gcmVzO1xuJiM0MztcdHJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIGJtX2VudHJ5X3Nob3csIGlub2RlLVx1MDAzZWlfcHJpdmF0ZSk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXG4mIzQzO1x0aWYgKGZpbGUtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9XUklURSlcbiYjNDM7XHRcdGZpbGUtXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcbiYjNDM7XHRyZXR1cm4gMDtcbiB9XG4gXG4gc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0XHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbi1cdE5vZGUgKmUgPSBpbm9kZS1cdTAwM2VpX3ByaXZhdGU7XG4mIzQzO1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFx0aW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7XG4gXG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0Y2xlYXJfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRjbGVhcl9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0c2V0X2JpdChFbmFibGVkLCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRzZXRfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDM6XG4tXHRcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXG4tXHRcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGlub2RlKSwgZSk7XG4tXG4tXHRcdGlub2RlX3VubG9jayhpbm9kZSk7XG4mIzQzO1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuJiM0MztcdFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtNzU5LDE1ICYjNDM7Nzg1LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIH1cbiBcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xuLVx0LnJlYWRcdFx0PSBibV9lbnRyeV9yZWFkLFxuJiM0MztcdC5vcGVuXHRcdD0gYm1fZW50cnlfb3BlbixcbiYjNDM7XHQucmVhZFx0XHQ9IHNlcV9yZWFkLFxuIFx0LndyaXRlXHRcdD0gYm1fZW50cnlfd3JpdGUsXG4tXHQubGxzZWVrXHRcdD0gZGVmYXVsdF9sbHNlZWssXG4mIzQzO1x0Lmxsc2Vla1x0XHQ9IHNlcV9sc2VlayxcbiYjNDM7XHQucmVsZWFzZVx0PSBzaW5nbGVfcmVsZWFzZSxcbiB9O1xuIFxuIC8qIC9yZWdpc3RlciAqL1xuIFxuIC8qIGFkZCB0byBmaWxlc3lzdGVtICovXG4tc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7c3RhdGljIGludCBhZGRfZW50cnkoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbiBcdHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHNpbXBsZV9zdGFydF9jcmVhdGluZyhzYi1cdTAwM2VzX3Jvb3QsIGUtXHUwMDNlbmFtZSk7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuQEAgLTc4OSw5ICYjNDM7ODE3LDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcbiBcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xuLVx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRsaXN0X2FkZChcdTAwMjZlLVx1MDAzZWxpc3QsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHR3cml0ZV91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4mIzQzO1x0aGxpc3RfYWRkX2hlYWRfcmN1KFx1MDAyNmUtXHUwMDNlbm9kZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRzaW1wbGVfZG9uZV9jcmVhdGluZyhkZW50cnkpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTc5OSwxMyAmIzQzOzgyNywxMiBAQCBzdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHROb2RlICplO1xuJiM0MztcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2I7XG4tXHRpbnQgZXJyID0gMDtcbiBcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcbiYjNDM7XHRpbnQgZXJyO1xuIFxuIFx0ZSA9IGNyZWF0ZV9lbnRyeShidWZmZXIsIGNvdW50KTtcbi1cbiBcdGlmIChJU19FUlIoZSkpXG4gXHRcdHJldHVybiBQVFJfRVJSKGUpO1xuIFxuQEAgLTgyMiw3ICYjNDM7ODQ5LDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdGlmIChJU19FUlIoZikpIHtcbiBcdFx0XHRwcl9ub3RpY2UoXCYjMzQ7cmVnaXN0ZXI6IGZhaWxlZCB0byBpbnN0YWxsIGludGVycHJldGVyIGZpbGUgJXNcXG5cJiMzNDssXG4gXHRcdFx0XHQgZS1cdTAwM2VpbnRlcnByZXRlcik7XG4tXHRcdFx0a2ZyZWUoZSk7XG4gXHRcdFx0cmV0dXJuIFBUUl9FUlIoZik7XG4gXHRcdH1cbiBcdFx0ZS1cdTAwM2VpbnRlcnBfZmlsZSA9IGY7XG5AQCAtODM0LDkgJiM0Mzs4NjAsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGYpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XG4gXHRcdH1cbi1cdFx0a2ZyZWUoZSk7XG4gXHRcdHJldHVybiBlcnI7XG4gXHR9XG4mIzQzO1xuJiM0MztcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xuJiM0MztcdHJldGFpbl9hbmRfbnVsbF9wdHIoZSk7XG4gXHRyZXR1cm4gY291bnQ7XG4gfVxuIFxuQEAgLTg1MSwxMCAmIzQzOzg3OSwxMCBAQCBzdGF0aWMgc3NpemVfdFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4ge1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuLVx0Y2hhciAqcztcbiYjNDM7XHRjb25zdCBjaGFyICpzO1xuIFxuIFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XG4tXHRzID0gbWlzYy1cdTAwM2VlbmFibGVkID8gXCYjMzQ7ZW5hYmxlZFxcblwmIzM0OyA6IFwmIzM0O2Rpc2FibGVkXFxuXCYjMzQ7O1xuJiM0MztcdHMgPSBSRUFEX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkKSA/IFwmIzM0O2VuYWJsZWRcXG5cJiMzNDsgOiBcJiMzNDtkaXNhYmxlZFxcblwmIzM0OztcbiBcdHJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTtcbiB9XG4gXG5AQCAtODYzLDM3ICYjNDM7ODkxLDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbi1cdE5vZGUgKmUsICpuZXh0O1xuLVx0c3RydWN0IGlub2RlICppbm9kZTtcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuIFx0c3dpdGNoIChyZXMpIHtcbi1cdGNhc2UgMTpcbi1cdFx0LyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xuJiM0MztcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgZmFsc2UpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMjpcbi1cdFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cbi1cdFx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4mIzQzO1x0XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXHRcdGJyZWFrO1xuLVx0Y2FzZSAzOlxuLVx0XHQvKiBEZWxldGUgYWxsIGhhbmRsZXJzLiAqL1xuLVx0XHRpbm9kZSA9IGRfaW5vZGUoZmlsZV9pbm9kZShmaWxlKS1cdTAwM2VpX3NiLVx1MDAzZXNfcm9vdCk7XG4tXHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxuLVx0XHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXG4tXHRcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxuLVx0XHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4mIzM5O3QgYmVcbi1cdFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cbi1cdFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXG4tXHRcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cbi1cdFx0ICovXG4tXHRcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMsIGxpc3QpXG4tXHRcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuJiM0MztcdGNhc2UgQk1fQ01EX1JFTU9WRTpcbiYjNDM7XHRcdGJtX3JlbW92ZV9hbGxfZW50cmllcyhtaXNjLCBmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2IpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiByZXM7XG5AQCAtOTE4LDcgJiM0Mzs5MjYsNyBAQCBzdGF0aWMgdm9pZCBibV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiBcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xuIH1cbiBcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XG4mIzQzO3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XG4gXHQuc3RhdGZzXHRcdD0gc2ltcGxlX3N0YXRmcyxcbiBcdC5ldmljdF9pbm9kZVx0PSBibV9ldmljdF9pbm9kZSxcbiBcdC5wdXRfc3VwZXJcdD0gYm1fcHV0X3N1cGVyLFxuQEAgLTk2NSwxMCAmIzQzOzk3MywxMCBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0XHRpZiAoIW1pc2MpXG4gXHRcdFx0cmV0dXJuIC1FTk9NRU07XG4gXG4tXHRcdElOSVRfTElTVF9IRUFEKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcyk7XG4tXHRcdHJ3bG9ja19pbml0KFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbiYjNDM7XHRcdElOSVRfSExJU1RfSEVBRChcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuJiM0MztcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFxuLVx0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovXG4mIzQzO1x0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXG4gXHRcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNnVzZXJfbnMtXHUwMDNlYmluZm10X21pc2MsIG1pc2MpO1xuIFx0fVxuIFxuQEAgLTk4MywxMiAmIzQzOzk5MSwxNSBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0ICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseVxuIFx0ICogcmVzZXQgLVx1MDAzZWVuYWJsZWQgdG8gdHJ1ZS5cbiBcdCAqL1xuLVx0bWlzYy1cdTAwM2VlbmFibGVkID0gdHJ1ZTtcbiYjNDM7XHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXG4gXHRlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgQklORk1URlNfTUFHSUMsIGJtX2ZpbGVzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2c19vcHM7XG4tXHRyZXR1cm4gZXJyO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcbiYjNDM7XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2Ym1fc3VwZXJfb3BzO1xuJiM0MztcdGRfaW5vZGUoc2ItXHUwMDNlc19yb290KS1cdTAwM2VpX29wID0gXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XG4mIzQzO1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJtX2ZyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuQEAgLTEwMSw4ICYjNDM7MTAxLDggQEAgc3RydWN0IGxpbnV4X2JpbmZtdCB7XG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyB7XG4tXHRzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7XG4tXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XG4mIzQzO1x0c3RydWN0IGhsaXN0X2hlYWQgZW50cmllcztcbiYjNDM7XHRzcGlubG9ja190IGVudHJpZXNfbG9jaztcbiBcdGJvb2wgZW5hYmxlZDtcbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuY1xuaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NFxuLS0tIGEva2VybmVsL3VzZXIuY1xuJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL3VzZXIuY1xuQEAgLTIzLDkgJiM0MzsyMyw5IEBAXG4gXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxuIHN0cnVjdCBiaW5mbXRfbWlzYyBpbml0X2JpbmZtdF9taXNjID0ge1xuLVx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxuJiM0MztcdC5lbnRyaWVzID0gSExJU1RfSEVBRF9JTklULFxuIFx0LmVuYWJsZWQgPSB0cnVlLFxuLVx0LmVudHJpZXNfbG9jayA9IF9fUldfTE9DS19VTkxPQ0tFRChpbml0X2JpbmZtdF9taXNjLmVudHJpZXNfbG9jayksXG4mIzQzO1x0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcbiB9O1xuIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpO1xuICNlbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtibV9yZWdpc3Rlcl93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9zdGF0dXNfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fdW5saW5rJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2lnbmlmaWNhbnRseSByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0sIGludHJvZHVjaW5nIFJDVS1iYXNlZCBsb29rdXBzLCBjaGFuZ2luZyBpbnRlcm5hbCBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBjb252ZXJ0aW5nIGVudHJ5IHJlYWRpbmcgdG8gdXNlIHNlcV9maWxlLCBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIHJlbW92aW5nIGVudHJpZXMgdmlhIHVubGluaygyKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBubyByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBpc3N1ZXMgd2VyZSBpbnRyb2R1Y2VkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmUKaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseQp1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLgoKUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczoKLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLgotIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLgotIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy4KLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsCmV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdAogICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksCiAgIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBhODc3ZGIxYmZiN2QyZDhhNWJjZmVhMDNmM2ZjMTEyYzg0MDNhZDMyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBKdWwgMTAgMjA6MzI6MzcgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0CmluZGV4IGMwYTM0ZmJmODAyMmI1Li4zMDZlZjQ4ZjVkZTZkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3QKQEAgLTEzMyw3ICYjNDM7MTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvcgogQ2F0dGluZyB0aGUgZmlsZSB0ZWxscyB5b3UgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGBgYmluZm10X21pc2MvdGhlX2VudHJ5YGAuCiAKIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGAKLW9yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLgomIzQzO29yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLiBBIHNpbmdsZSBlbnRyeSBjYW4gYWxzbyBiZSByZW1vdmVkCiYjNDM7Ynkgc2ltcGx5IHVubGlua2luZyAoYGBybWBgKSBgYC9wcm9jLy4uLi90aGVfbmFtZWBgLgogCiAKIEhpbnRzCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuYwppbmRleCA4NDM0OWZjYjkzZjEzYS4uZjUxZDI3MjY5ODYxNjAgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvYmluZm10X21pc2MuYwpAQCAtMTAsNDUgJiM0MzsxMCw0NiBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICYjMzQ7OiAmIzM0OyBmbXQKIAotI2luY2x1ZGUgJmx0O2xpbnV4L2tlcm5lbC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2hleC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC9tbS5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYmluZm10cy5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYml0b3BzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2JpdHMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVnLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NsZWFudXAuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvY3JlZC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2N0eXBlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc3RyaW5nX2hlbHBlcnMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9maWxlLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvcGFnZW1hcC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L25hbWVpLmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvbW91bnQuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9mc19jb250ZXh0LmgmZ3Q7Ci0jaW5jbHVkZSAmbHQ7bGludXgvc3lzY2FsbHMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9mc19jb250ZXh0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva3N0cnRveC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tYWdpYy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tb2R1bGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcHJpbnRrLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3JjdWxpc3QuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcmVmY291bnQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2VxX2ZpbGUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc2xhYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9zdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvc3RyaW5nX2hlbHBlcnMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC91YWNjZXNzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgmZ3Q7CiAKLSNpbmNsdWRlICYjMzQ7aW50ZXJuYWwuaCYjMzQ7Ci0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgVVNFX0RFQlVHIDEKLSNlbHNlCi0jIGRlZmluZSBVU0VfREVCVUcgMAotI2VuZGlmCi0KLWVudW0gewotCVZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqLwomIzQzOy8qIEVudHJ5IHN0YXR1cyBhbmQgbWF0Y2ggdHlwZSBiaXQgbnVtYmVycy4gKi8KJiM0MztlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2JpdHMgewomIzQzOwlNSVNDX0ZNVF9FTkFCTEVEX0JJVAk9IDAsCiYjNDM7CU1JU0NfRk1UX01BR0lDX0JJVAk9IDEsCiB9OwogCi1lbnVtIHtFbmFibGVkLCBNYWdpY307Ci0jZGVmaW5lIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwICgxVUwgJmx0OyZsdDsgMzEpCi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fQklOQVJZICgxVUwgJmx0OyZsdDsgMzApCi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgJmx0OyZsdDsgMjkpCi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fRklMRSAoMVVMICZsdDsmbHQ7IDI4KQomIzQzOy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi8KJiM0MztlbnVtIGJpbmZtdF9taXNjX2VudHJ5X2ZsYWdzIHsKJiM0MzsJTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAJPSAoMVUgJmx0OyZsdDsgMzEpLAomIzQzOwlNSVNDX0ZNVF9PUEVOX0JJTkFSWQk9ICgxVSAmbHQ7Jmx0OyAzMCksCiYjNDM7CU1JU0NfRk1UX0NSRURFTlRJQUxTCT0gKDFVICZsdDsmbHQ7IDI5KSwKJiM0MzsJTUlTQ19GTVRfT1BFTl9GSUxFCT0gKDFVICZsdDsmbHQ7IDI4KSwKJiM0Mzt9OwogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwomIzQzO3N0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSB7CiYjNDM7CXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIHR5cGUsIHN0YXR1cywgZXRjLiAqLwogCWludCBvZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIG1hZ2ljICovCiAJaW50IHNpemU7CQkJLyogc2l6ZSBvZiBtYWdpYy9tYXNrICovCkBAIC01OSw5ICYjNDM7NjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBmaWxlICppbnRlcnBfZmlsZTsKIAlyZWZjb3VudF90IHVzZXJzOwkJLyogc3luYyByZW1vdmFsIHdpdGggbG9hZF9taXNjX2JpbmFyeSgpICovCi19IE5vZGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlOwomIzQzOwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwomIzQzOwljaGFyIGJ1ZltdOwkJCS8qIHJlZ2lzdGVyIHN0cmluZywgZmllbGRzIHBvaW50IGluIGhlcmUgKi8KJiM0Mzt9OwogCiAvKgogICogTWF4IGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc3RyaW5nLiAgRGV0ZXJtaW5lZCBieToKQEAgLTc0LDEwICYjNDM7NzUsMzYgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7CiAgKiAgLSBpbnRlcnA6IH41MCBieXRlcwogICogIC0gZmxhZ3M6ICA1IGJ5dGVzCiAgKiBSb3VuZCB0aGF0IHVwIGEgYml0LCBhbmQgdGhlbiBiYWNrIG9mZiB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhCi0gKiAobGlrZSBzdHJ1Y3QgTm9kZSkuCiYjNDM7ICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS4KICAqLwogI2RlZmluZSBNQVhfUkVHSVNURVJfTEVOR1RIIDE5MjAKIAomIzQzOy8qIFRyYWlsaW5nIGRlbGltaXRlciBwYWQgc28gZmllbGQgcGFyc2luZyBhbHdheXMgdGVybWluYXRlcyBhdCBhIGRlbGltaXRlci4gKi8KJiM0MzsjZGVmaW5lIE1JU0NfREVMSU1fUEFEIDgKJiM0MzsKJiM0MzsvKiBDaGVjayBpZiBAZSYjMzk7cyBtYWdpYyBtYXRjaGVzIEBicHJtJiMzOTtzIGJ1ZmZlciwgYXBwbHlpbmcgdGhlIG1hc2sgaWYgc2V0LiAqLwomIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLAomIzQzOwkJCQljb25zdCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQomIzQzO3sKJiM0MzsJY29uc3QgY2hhciAqcyA9IGJwcm0tJmd0O2J1ZiAmIzQzOyBlLSZndDtvZmZzZXQ7CiYjNDM7CWludCBpOwomIzQzOwomIzQzOwlpZiAoIWUtJmd0O21hc2spCiYjNDM7CQlyZXR1cm4gIW1lbWNtcChzLCBlLSZndDttYWdpYywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBlLSZndDtzaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCWlmICgoc1tpXSBeIGUtJmd0O21hZ2ljW2ldKSAmYW1wOyBlLSZndDttYXNrW2ldKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOy8qIENoZWNrIGlmIEBlJiMzOTtzIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIG1hdGNoZXMgQGV4dCwgTlVMTCBpZiB0aGVyZSBpcyBub25lLiAqLwomIzQzO3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGNvbnN0IHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwKJiM0MzsJCQkJICAgIGNvbnN0IGNoYXIgKmV4dCkKJiM0Mzt7CiYjNDM7CXJldHVybiBleHQgJmFtcDsmYW1wOyAhc3RyY21wKGUtJmd0O21hZ2ljLCBleHQpOwomIzQzO30KJiM0MzsKIC8qKgogICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybQogICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZQpAQCAtODYsNDMgJiM0MzsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7CiAgKiBTZWFyY2ggZm9yIGEgYmluYXJ5IHR5cGUgaGFuZGxlciBmb3IgQGJwcm0gaW4gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBiaW5hcnkKICAqIHR5cGUgaGFuZGxlcnMuCiAgKgomIzQzOyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBSQ1UgcmVhZCBsb2NrLgomIzQzOyAqCiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAotCQkJCSAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqCiYjNDM7c2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQljaGFyICpwID0gc3RycmNocihicHJtLSZndDtpbnRlcnAsICYjMzk7LiYjMzk7KTsKLQlOb2RlICplOwomIzQzOwljaGFyICpkb3QgPSBzdHJyY2hyKGJwcm0tJmd0O2ludGVycCwgJiMzOTsuJiMzOTspOwomIzQzOwljb25zdCBjaGFyICpleHQgPSBkb3QgPyBkb3QgJiM0MzsgMSA6IE5VTEw7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZTsKIAogCS8qIFdhbGsgYWxsIHRoZSByZWdpc3RlcmVkIGhhbmRsZXJzLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZSwgJmFtcDttaXNjLSZndDtlbnRyaWVzLCBsaXN0KSB7Ci0JCWNoYXIgKnM7Ci0JCWludCBqOwotCiYjNDM7CWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCAmYW1wO21pc2MtJmd0O2VudHJpZXMsIG5vZGUpIHsKIAkJLyogTWFrZSBzdXJlIHRoaXMgb25lIGlzIGN1cnJlbnRseSBlbmFibGVkLiAqLwotCQlpZiAoIXRlc3RfYml0KEVuYWJsZWQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKQomIzQzOwkJaWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgJmFtcDtlLSZndDtmbGFncykpCiAJCQljb250aW51ZTsKIAotCQkvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi8KLQkJaWYgKCF0ZXN0X2JpdChNYWdpYywgJmFtcDtlLSZndDtmbGFncykpIHsKLQkJCWlmIChwICZhbXA7JmFtcDsgIXN0cmNtcChlLSZndDttYWdpYywgcCAmIzQzOyAxKSkKJiM0MzsJCWlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpKSB7CiYjNDM7CQkJaWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpCiAJCQkJcmV0dXJuIGU7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIERvIG1hdGNoaW5nIGJhc2VkIG9uIG1hZ2ljICZhbXA7IG1hc2suICovCi0JCXMgPSBicHJtLSZndDtidWYgJiM0MzsgZS0mZ3Q7b2Zmc2V0OwotCQlpZiAoZS0mZ3Q7bWFzaykgewotCQkJZm9yIChqID0gMDsgaiAmbHQ7IGUtJmd0O3NpemU7IGomIzQzOyYjNDM7KQotCQkJCWlmICgoKnMmIzQzOyYjNDM7IF4gZS0mZ3Q7bWFnaWNbal0pICZhbXA7IGUtJmd0O21hc2tbal0pCi0JCQkJCWJyZWFrOwogCQl9IGVsc2UgewotCQkJZm9yIChqID0gMDsgaiAmbHQ7IGUtJmd0O3NpemU7IGomIzQzOyYjNDM7KQotCQkJCWlmICgoKnMmIzQzOyYjNDM7IF4gZS0mZ3Q7bWFnaWNbal0pKQotCQkJCQlicmVhazsKJiM0MzsJCQlpZiAoZW50cnlfbWF0Y2hlc19leHRlbnNpb24oZSwgZXh0KSkKJiM0MzsJCQkJcmV0dXJuIGU7CiAJCX0KLQkJaWYgKGogPT0gZS0mZ3Q7c2l6ZSkKLQkJCXJldHVybiBlOwogCX0KIAogCXJldHVybiBOVUxMOwpAQCAtMTM0LDY0ICYjNDM7MTQ4LDY5IEBAIHN0YXRpYyBOb2RlICpzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAogICogQGJwcm06IGJpbmFyeSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgZm9yIGEgaGFuZGxlcgogICoKICAqIFRyeSB0byBmaW5kIGEgYmluZm10IGhhbmRsZXIgZm9yIHRoZSBiaW5hcnkgdHlwZS4gSWYgb25lIGlzIGZvdW5kIHRha2UgYQotICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLgomIzQzOyAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gVGhlCiYjNDM7ICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kCiYjNDM7ICogYSByZXN0YXJ0ZWQgc2VhcmNoIGNhbm5vdCBmaW5kIGFuIHVubGlua2VkIGVudHJ5IGFnYWluIHNvIHRoZSByZXRyeSBsb29wCiYjNDM7ICogaXMgYm91bmRlZC4KICAqCiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyBOb2RlICpnZXRfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAotCQkJCXN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCiYjNDM7c3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywKJiM0MzsJCQkJCQkgICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQlOb2RlICplOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7CiAKLQlyZWFkX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwotCWUgPSBzZWFyY2hfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7Ci0JaWYgKGUpCi0JCXJlZmNvdW50X2luYygmYW1wO2UtJmd0O3VzZXJzKTsKLQlyZWFkX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CWd1YXJkKHJjdSkoKTsKJiM0MzsJZG8gewomIzQzOwkJZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTsKJiM0MzsJfSB3aGlsZSAoZSAmYW1wOyZhbXA7ICFyZWZjb3VudF9pbmNfbm90X3plcm8oJmFtcDtlLSZndDt1c2VycykpOwogCXJldHVybiBlOwogfQogCiAvKioKLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlCi0gKiBAZTogbm9kZSB0byBwdXQKJiM0MzsgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnkKJiM0MzsgKiBAZTogZW50cnkgdG8gcHV0CiAgKgotICogRnJlZSBub2RlIHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG8KJiM0MzsgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG8KICAqIGxvYWRfbWlzY19iaW5hcnkoKSBpbiBjYXNlIGl0IGlzIHVzaW5nIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIHdlIHdlcmUKICAqIHJlcXVlc3RlZCB0byByZW1vdmUuCiAgKi8KLXN0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihOb2RlICplKQomIzQzO3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpCiB7CiAJaWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdCgmYW1wO2UtJmd0O3VzZXJzKSkgewotCQlpZiAoZS0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9GSUxFKQomIzQzOwkJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fRklMRSkgewomIzQzOwkJCWV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLSZndDtpbnRlcnBfZmlsZSk7CiAJCQlmaWxwX2Nsb3NlKGUtJmd0O2ludGVycF9maWxlLCBOVUxMKTsKLQkJa2ZyZWUoZSk7CiYjNDM7CQl9CiYjNDM7CQkvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqLwomIzQzOwkJa2ZyZWVfcmN1KGUsIHJjdSk7CiAJfQogfQogCiYjNDM7REVGSU5FX0ZSRUUocHV0X2JpbmZtdF9oYW5kbGVyLCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKiwgaWYgKF9UKSBwdXRfYmluZm10X2hhbmRsZXIoX1QpKQomIzQzOwogLyoqCi0gKiBsb2FkX2JpbmZtdF9taXNjIC0gbG9hZCB0aGUgYmluZm10X21pc2Mgb2YgdGhlIGNhbGxlciYjMzk7cyB1c2VyIG5hbWVzcGFjZQomIzQzOyAqIGN1cnJlbnRfYmluZm10X21pc2MgLSBnZXQgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXImIzM5O3MgdXNlciBuYW1lc3BhY2UKICAqCi0gKiBUbyBiZSBjYWxsZWQgaW4gbG9hZF9taXNjX2JpbmFyeSgpIHRvIGxvYWQgdGhlIHJlbGV2YW50IHN0cnVjdCBiaW5mbXRfbWlzYy4KLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24mIzM5O3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IGNhbiBtYWtlIHVzZQotICogb2YgaXRzIGFuY2VzdG9yJiMzOTtzIGJpbmZtdF9taXNjIGhhbmRsZXJzLiBUaGlzIG1pbWlja3MgdGhlIGJlaGF2aW9yIG9mCi0gKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBiaW5mbXRfbWlzYyBoYW5kbGVycyB3aGVyZQotICogYXZhaWxhYmxlIHRvIGFsbCB1c2VyIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4KJiM0MzsgKiBJZiBhIHVzZXIgbmFtZXNwYWNlIGRvZXNuJiMzOTt0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCB1c2VzIHRoZQomIzQzOyAqIGhhbmRsZXJzIG9mIGl0cyBjbG9zZXN0IGFuY2VzdG9yIHdpdGggb25lLiBUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2YKJiM0MzsgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZQomIzQzOyAqIHRvIGFsbCB1c2VycyBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uIFRoZSBpbml0IHVzZXIgbmFtZXNwYWNlCiYjNDM7ICogaW5zdGFuY2UgaXMgc3RhdGljYWxseSBzZXQgdXAgc28gdGhlIGZhbGxiYWNrIGlzIG5ldmVyIHJlYWNoZWQgaW4KJiM0MzsgKiBwcmFjdGljZS4KICAqCiAgKiBSZXR1cm46IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJiMzOTtzIHVzZXIgbmFtZXNwYWNlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZCkKJiM0MztzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpjdXJyZW50X2JpbmZtdF9taXNjKHZvaWQpCiB7CiAJY29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOwogCXN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYzsKIAotCXVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTsKLQl3aGlsZSAodXNlcl9ucykgewomIzQzOwlmb3IgKHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTsgdXNlcl9uczsgdXNlcl9ucyA9IHVzZXJfbnMtJmd0O3BhcmVudCkgewogCQkvKiBQYWlycyB3aXRoIHNtcF9zdG9yZV9yZWxlYXNlKCkgaW4gYm1fZmlsbF9zdXBlcigpLiAqLwogCQltaXNjID0gc21wX2xvYWRfYWNxdWlyZSgmYW1wO3VzZXJfbnMtJmd0O2JpbmZtdF9taXNjKTsKIAkJaWYgKG1pc2MpCiAJCQlyZXR1cm4gbWlzYzsKLQotCQl1c2VyX25zID0gdXNlcl9ucy0mZ3Q7cGFyZW50OwogCX0KIAogCXJldHVybiAmYW1wO2luaXRfYmluZm10X21pc2M7CkBAIC0yMDIsMzAgJiM0MzsyMjEsMjkgQEAgc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKQogICovCiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKIHsKLQlOb2RlICpmbXQ7Ci0Jc3RydWN0IGZpbGUgKmludGVycF9maWxlID0gTlVMTDsKLQlpbnQgcmV0dmFsID0gLUVOT0VYRUM7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZm10IF9fZnJlZShwdXRfYmluZm10X2hhbmRsZXIpID0gTlVMTDsKJiM0MzsJc3RydWN0IGZpbGUgKmludGVycF9maWxlOwogCXN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYzsKJiM0MzsJaW50IHJldHZhbDsKIAotCW1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7Ci0JaWYgKCFtaXNjLSZndDtlbmFibGVkKQotCQlyZXR1cm4gcmV0dmFsOwomIzQzOwltaXNjID0gY3VycmVudF9iaW5mbXRfbWlzYygpOwomIzQzOwlpZiAoIVJFQURfT05DRShtaXNjLSZndDtlbmFibGVkKSkKJiM0MzsJCXJldHVybiAtRU5PRVhFQzsKIAogCWZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTsKIAlpZiAoIWZtdCkKLQkJcmV0dXJuIHJldHZhbDsKJiM0MzsJCXJldHVybiAtRU5PRVhFQzsKIAogCS8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi8KLQlyZXR2YWwgPSAtRU5PRU5UOwogCWlmIChicHJtLSZndDtpbnRlcnBfZmxhZ3MgJmFtcDsgQklOUFJNX0ZMQUdTX1BBVEhfSU5BQ0NFU1NJQkxFKQotCQlnb3RvIHJldDsKJiM0MzsJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKGZtdC0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApIHsKIAkJYnBybS0mZ3Q7aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19QUkVTRVJWRV9BUkdWMDsKIAl9IGVsc2UgewogCQlyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7CiAJCWlmIChyZXR2YWwpCi0JCQlnb3RvIHJldDsKJiM0MzsJCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCWlmIChmbXQtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fQklOQVJZKQpAQCAtMjM0LDU3ICYjNDM7MjUyLDQ4IEBAIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQogCS8qIG1ha2UgYXJndlsxXSBiZSB0aGUgcGF0aCB0byB0aGUgYmluYXJ5ICovCiAJcmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGJwcm0tJmd0O2ludGVycCwgYnBybSk7CiAJaWYgKHJldHZhbCAmbHQ7IDApCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIHJldHZhbDsKIAlicHJtLSZndDthcmdjJiM0MzsmIzQzOzsKIAogCS8qIGFkZCB0aGUgaW50ZXJwIGFzIGFyZ3ZbMF0gKi8KIAlyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoZm10LSZndDtpbnRlcnByZXRlciwgYnBybSk7CiAJaWYgKHJldHZhbCAmbHQ7IDApCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIHJldHZhbDsKIAlicHJtLSZndDthcmdjJiM0MzsmIzQzOzsKIAogCS8qIFVwZGF0ZSBpbnRlcnAgaW4gY2FzZSBiaW5mbXRfc2NyaXB0IG5lZWRzIGl0LiAqLwogCXJldHZhbCA9IGJwcm1fY2hhbmdlX2ludGVycChmbXQtJmd0O2ludGVycHJldGVyLCBicHJtKTsKIAlpZiAocmV0dmFsICZsdDsgMCkKLQkJZ290byByZXQ7CiYjNDM7CQlyZXR1cm4gcmV0dmFsOwogCiAJaWYgKGZtdC0mZ3Q7ZmxhZ3MgJmFtcDsgTUlTQ19GTVRfT1BFTl9GSUxFKSB7CiAJCWludGVycF9maWxlID0gZmlsZV9jbG9uZV9vcGVuKGZtdC0mZ3Q7aW50ZXJwX2ZpbGUpOwotCQlpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpCi0JCQlkZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7CiYjNDM7CQlpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHsKJiM0MzsJCQlpbnQgZXJyID0gZXhlX2ZpbGVfZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpOwomIzQzOwomIzQzOwkJCWlmIChlcnIpIHsKJiM0MzsJCQkJZnB1dChpbnRlcnBfZmlsZSk7CiYjNDM7CQkJCWludGVycF9maWxlID0gRVJSX1BUUihlcnIpOwomIzQzOwkJCX0KJiM0MzsJCX0KIAl9IGVsc2UgewogCQlpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyhmbXQtJmd0O2ludGVycHJldGVyKTsKIAl9Ci0JcmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7CiAJaWYgKElTX0VSUihpbnRlcnBfZmlsZSkpCi0JCWdvdG8gcmV0OwomIzQzOwkJcmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpOwogCiAJYnBybS0mZ3Q7aW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTsKIAlpZiAoZm10LSZndDtmbGFncyAmYW1wOyBNSVNDX0ZNVF9DUkVERU5USUFMUykKIAkJYnBybS0mZ3Q7ZXhlY2ZkX2NyZWRzID0gMTsKLQotCXJldHZhbCA9IDA7Ci1yZXQ6Ci0KLQkvKgotCSAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvCi0JICogbG9hZF9taXNjX2JpbmFyeSgpIHdpbGwgaGF2ZSBmaW5pc2hlZC4gV2UgYWxzbyBrbm93Ci0JICogdGhhdCBmb3IgdGhlIHJlZmNvdW50IHRvIGJlIHplcm8gc29tZW9uZSBtdXN0IGhhdmUgY29uY3VyZW50bHkKLQkgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0JiMzOTtzIG91ciBqb2IgdG8KLQkgKiBmcmVlIGl0LgotCSAqLwotCXB1dF9iaW5mbXRfaGFuZGxlcihmbXQpOwotCi0JcmV0dXJuIHJldHZhbDsKJiM0MzsJcmV0dXJuIDA7CiB9CiAKIC8qIENvbW1hbmQgcGFyc2VycyAqLwogCiAvKgotICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsCi0gKiByZWNvZ25pc2luZyB0aGUgXHggc3BlY2lhbC4KLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhbgotICogZXJyb3IgKGFuZCBzZXRzIGVycikgb3IgbnVsbCBhcmd1bWVudCBsZW5ndGguCiYjNDM7ICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZwomIzQzOyAqIHRoZSBceCBlc2NhcGUuIFRlcm1pbmF0ZXMgdGhlIGFyZ3VtZW50IHdpdGggYSBOVUwgYW5kIHJldHVybnMgYSBwb2ludGVyCiYjNDM7ICogcGFzdCBpdCBvciBOVUxMIG9uIGEgbWFsZm9ybWVkIGVzY2FwZS4KICAqLwogc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpCiB7CkBAIC0yOTksNDYgJiM0MzszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKQogCQkJCXJldHVybiBOVUxMOwogCQl9CiAJfQotCXNbLTFdID0mIzM5O1wwJiMzOTs7CiYjNDM7CXNbLTFdID0gJiMzOTtcMCYjMzk7OwogCXJldHVybiBzOwogfQogCi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpCiYjNDM7c3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqcCwgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKQogewotCWNoYXIgKnAgPSBzZnM7Ci0JaW50IGNvbnQgPSAxOwotCi0JLyogc3BlY2lhbCBmbGFncyAqLwotCXdoaWxlIChjb250KSB7CiYjNDM7CWZvciAoOzsgcCYjNDM7JiM0MzspIHsKIAkJc3dpdGNoICgqcCkgewogCQljYXNlICYjMzk7UCYjMzk7OgogCQkJcHJfZGVidWcoJiMzNDtyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXG4mIzM0Oyk7Ci0JCQlwJiM0MzsmIzQzOzsKIAkJCWUtJmd0O2ZsYWdzIHw9IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwOwogCQkJYnJlYWs7CiAJCWNhc2UgJiMzOTtPJiMzOTs6CiAJCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBmbGFnOiBPIChvcGVuIGJpbmFyeSlcbiYjMzQ7KTsKLQkJCXAmIzQzOyYjNDM7OwogCQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7CiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O0MmIzM5OzoKIAkJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEMgKHByZXNlcnZlIGNyZWRzKVxuJiMzNDspOwotCQkJcCYjNDM7JiM0Mzs7Ci0JCQkvKiB0aGlzIGZsYWdzIGFsc28gaW1wbGllcyB0aGUKLQkJCSAgIG9wZW4tYmluYXJ5IGZsYWcgKi8KLQkJCWUtJmd0O2ZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8Ci0JCQkJCU1JU0NfRk1UX09QRU5fQklOQVJZKTsKJiM0MzsJCQkvKiBDIGltcGxpZXMgTyAqLwomIzQzOwkJCWUtJmd0O2ZsYWdzIHw9IE1JU0NfRk1UX0NSRURFTlRJQUxTIHwgTUlTQ19GTVRfT1BFTl9CSU5BUlk7CiAJCQlicmVhazsKIAkJY2FzZSAmIzM5O0YmIzM5OzoKIAkJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcbiYjMzQ7KTsKLQkJCXAmIzQzOyYjNDM7OwogCQkJZS0mZ3Q7ZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9GSUxFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQljb250ID0gMDsKJiM0MzsJCQlyZXR1cm4gcDsKIAkJfQogCX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFyc2UgdGhlICYjMzk7b2Zmc2V0JiMzOTssICYjMzk7bWFnaWMmIzM5OyBhbmQgJiMzOTttYXNrJiMzOTsgZmllbGRzIG9mIGFuICYjMzk7TSYjMzk7IGVudHJ5LiAqLwomIzQzO3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbCkKJiM0Mzt7CiYjNDM7CWNoYXIgKnM7CiYjNDM7CiYjNDM7CS8qIFBhcnNlIHRoZSAmIzM5O29mZnNldCYjMzk7IGZpZWxkLiAqLwomIzQzOwlzID0gc3RyY2hyKHAsIGRlbCk7CiYjNDM7CWlmICghcykKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwkqcyA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJaWYgKHAgIT0gcykgewomIzQzOwkJaWYgKGtzdHJ0b2ludChwLCAxMCwgJmFtcDtlLSZndDtvZmZzZXQpIHx8IGUtJmd0O29mZnNldCAmbHQ7IDApCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiYjNDM7CX0KJiM0MzsJcCA9IHMgJiM0MzsgMTsKJiM0MzsJcHJfZGVidWcoJiMzNDtyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcbiYjMzQ7LCBlLSZndDtvZmZzZXQpOwomIzQzOwomIzQzOwkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwomIzQzOwllLSZndDttYWdpYyA9IHA7CiYjNDM7CXAgPSBzY2FuYXJnKHAsIGRlbCk7CiYjNDM7CWlmICghcCB8fCAhZS0mZ3Q7bWFnaWNbMF0pCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106ICYjMzQ7LAomIzQzOwkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtJmd0O21hZ2ljLCBwIC0gZS0mZ3Q7bWFnaWMsIHRydWUpOwomIzQzOwomIzQzOwkvKiBQYXJzZSB0aGUgJiMzOTttYXNrJiMzOTsgZmllbGQuICovCiYjNDM7CWUtJmd0O21hc2sgPSBwOwomIzQzOwlwID0gc2NhbmFyZyhwLCBkZWwpOwomIzQzOwlpZiAoIXApCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKCFlLSZndDttYXNrWzBdKSB7CiYjNDM7CQllLSZndDttYXNrID0gTlVMTDsKJiM0MzsJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcbiYjMzQ7KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCXByaW50X2hleF9kdW1wX2RlYnVnKAomIzQzOwkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogIG1hc2tbcmF3XTogJiMzNDssCiYjNDM7CQkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtJmd0O21hc2ssIHAgLSBlLSZndDttYXNrLCB0cnVlKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBEZWNvZGUgdGhlIG1hZ2ljICZhbXA7IG1hc2sgZmllbGRzLiBOb3RlOiB3aGlsZSB3ZSBtaWdodCBoYXZlIGFjY2VwdGVkCiYjNDM7CSAqIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyB3aWxsIHN0b3AgYXQKJiM0MzsJICogdGhlIGZpcnN0IG9uZSB0aGV5IGVuY291bnRlci4KJiM0MzsJICovCiYjNDM7CWUtJmd0O3NpemUgPSBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLSZndDttYWdpYywgVU5FU0NBUEVfSEVYKTsKJiM0MzsJaWYgKGUtJmd0O21hc2sgJmFtcDsmYW1wOyBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLSZndDttYXNrLCBVTkVTQ0FQRV9IRVgpICE9IGUtJmd0O3NpemUpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKGUtJmd0O3NpemUgJmd0OyBCSU5QUk1fQlVGX1NJWkUgfHwgQklOUFJNX0JVRl9TSVpFIC0gZS0mZ3Q7c2l6ZSAmbHQ7IGUtJmd0O29mZnNldCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcbiYjMzQ7LCBlLSZndDtzaXplKTsKJiM0MzsJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiAmIzM0OywKJiM0MzsJCURVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLSZndDttYWdpYywgZS0mZ3Q7c2l6ZSwgdHJ1ZSk7CiYjNDM7CWlmIChlLSZndDttYXNrKQomIzQzOwkJcHJpbnRfaGV4X2R1bXBfZGVidWcoCiYjNDM7CQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tkZWNvZGVkXTogJiMzNDssCiYjNDM7CQkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtJmd0O21hc2ssIGUtJmd0O3NpemUsIHRydWUpOwomIzQzOwlyZXR1cm4gcDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyogUGFyc2UgdGhlICYjMzk7bWFnaWMmIzM5OyBmaWVsZCBvZiBhbiAmIzM5O0UmIzM5OyBlbnRyeTogdGhlIGZpbGVuYW1lIGV4dGVuc2lvbi4gKi8KJiM0MztzdGF0aWMgY2hhciAqcGFyc2VfZXh0ZW5zaW9uX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsCiYjNDM7CQkJCSAgICBjaGFyIGRlbCkKJiM0Mzt7CiYjNDM7CS8qIFNraXAgdGhlICYjMzk7b2Zmc2V0JiMzOTsgZmllbGQuICovCiYjNDM7CXAgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFwKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKIAomIzQzOwkvKiBQYXJzZSB0aGUgJiMzOTttYWdpYyYjMzk7IGZpZWxkLiAqLwomIzQzOwllLSZndDttYWdpYyA9IHA7CiYjNDM7CXAgPSBzdHJjaHIocCwgZGVsKTsKJiM0MzsJaWYgKCFwKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CSpwJiM0MzsmIzQzOyA9ICYjMzk7XDAmIzM5OzsKJiM0MzsJaWYgKCFlLSZndDttYWdpY1swXSB8fCBzdHJjaHIoZS0mZ3Q7bWFnaWMsICYjMzk7LyYjMzk7KSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBleHRlbnNpb246IHslc31cbiYjMzQ7LCBlLSZndDttYWdpYyk7CiYjNDM7CiYjNDM7CS8qIFNraXAgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqLwomIzQzOwlwID0gc3RyY2hyKHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwkqcCYjNDM7JiM0MzsgPSAmIzM5O1wwJiMzOTs7CiAJcmV0dXJuIHA7CiB9CiAKQEAgLTM0Nyw1MCAmIzQzOzQzMyw0OCBAQCBzdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpCiAgKiAmIzM5OzpuYW1lOnR5cGU6b2Zmc2V0Om1hZ2ljOm1hc2s6aW50ZXJwcmV0ZXI6ZmxhZ3MmIzM5OwogICogd2hlcmUgdGhlICYjMzk7OiYjMzk7IGlzIHRoZSBJRlMsIHRoYXQgY2FuIGJlIGNob3NlbiB3aXRoIHRoZSBmaXJzdCBjaGFyCiAgKi8KLXN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQomIzQzO3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAomIzQzOwkJCQkJICAgICAgc2l6ZV90IGNvdW50KQogewotCU5vZGUgKmU7Ci0JaW50IG1lbXNpemUsIGVycjsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMOwogCWNoYXIgKmJ1ZiwgKnA7CiAJY2hhciBkZWw7CiAKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiByZWNlaXZlZCAlenUgYnl0ZXNcbiYjMzQ7LCBjb3VudCk7CiAKIAkvKiBzb21lIHNhbml0eSBjaGVja3MgKi8KLQllcnIgPSAtRUlOVkFMOwogCWlmICgoY291bnQgJmx0OyAxMSkgfHwgKGNvdW50ICZndDsgTUFYX1JFR0lTVEVSX0xFTkdUSCkpCi0JCWdvdG8gb3V0OwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQllcnIgPSAtRU5PTUVNOwotCW1lbXNpemUgPSBzaXplb2YoTm9kZSkgJiM0MzsgY291bnQgJiM0MzsgODsKLQllID0ga21hbGxvYyhtZW1zaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpOwomIzQzOwllID0ga21hbGxvYyhzdHJ1Y3Rfc2l6ZShlLCBidWYsIGNvdW50ICYjNDM7IE1JU0NfREVMSU1fUEFEKSwKJiM0MzsJCSAgICBHRlBfS0VSTkVMX0FDQ09VTlQpOwogCWlmICghZSkKLQkJZ290byBvdXQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXAgPSBidWYgPSAoY2hhciAqKWUgJiM0Mzsgc2l6ZW9mKE5vZGUpOwomIzQzOwlwID0gYnVmID0gZS0mZ3Q7YnVmOwogCi0JbWVtc2V0KGUsIDAsIHNpemVvZihOb2RlKSk7CiYjNDM7CW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKIAlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGNvdW50KSkKLQkJZ290byBlZmF1bHQ7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKIAotCWRlbCA9ICpwJiM0MzsmIzQzOzsJLyogZGVsaW1ldGVyICovCiYjNDM7CWRlbCA9ICpwJiM0MzsmIzQzOzsJLyogZGVsaW1pdGVyICovCiAKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cbiYjMzQ7LCBkZWwsIGRlbCk7CiAKIAkvKiBQYWQgdGhlIGJ1ZmZlciB3aXRoIHRoZSBkZWxpbSB0byBzaW1wbGlmeSBwYXJzaW5nIGJlbG93LiAqLwotCW1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgOCk7CiYjNDM7CW1lbXNldChidWYgJiM0MzsgY291bnQsIGRlbCwgTUlTQ19ERUxJTV9QQUQpOwogCiAJLyogUGFyc2UgdGhlICYjMzk7bmFtZSYjMzk7IGZpZWxkLiAqLwogCWUtJmd0O25hbWUgPSBwOwogCXAgPSBzdHJjaHIocCwgZGVsKTsKIAlpZiAoIXApCi0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwogCWlmICghZS0mZ3Q7bmFtZVswXSB8fAogCSAgICAhc3RyY21wKGUtJmd0O25hbWUsICYjMzQ7LiYjMzQ7KSB8fAogCSAgICAhc3RyY21wKGUtJmd0O25hbWUsICYjMzQ7Li4mIzM0OykgfHwKIAkgICAgc3RyY2hyKGUtJmd0O25hbWUsICYjMzk7LyYjMzk7KSkKLQkJZ290byBlaW52YWw7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IG5hbWU6IHslc31cbiYjMzQ7LCBlLSZndDtuYW1lKTsKIApAQCAtMzk4LDEzNCAmIzQzOzQ4MiwzMyBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIAlzd2l0Y2ggKCpwJiM0MzsmIzQzOykgewogCWNhc2UgJiMzOTtFJiMzOTs6CiAJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IEUgKGV4dGVuc2lvbilcbiYjMzQ7KTsKLQkJZS0mZ3Q7ZmxhZ3MgPSAxICZsdDsmbHQ7IEVuYWJsZWQ7CiYjNDM7CQllLSZndDtmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7CiAJCWJyZWFrOwogCWNhc2UgJiMzOTtNJiMzOTs6CiAJCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IHR5cGU6IE0gKG1hZ2ljKVxuJiMzNDspOwotCQllLSZndDtmbGFncyA9ICgxICZsdDsmbHQ7IEVuYWJsZWQpIHwgKDEgJmx0OyZsdDsgTWFnaWMpOwomIzQzOwkJZS0mZ3Q7ZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpIHwgQklUKE1JU0NfRk1UX01BR0lDX0JJVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWdvdG8gZWludmFsOwomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCWlmICgqcCYjNDM7JiM0MzsgIT0gZGVsKQotCQlnb3RvIGVpbnZhbDsKLQotCWlmICh0ZXN0X2JpdChNYWdpYywgJmFtcDtlLSZndDtmbGFncykpIHsKLQkJLyogSGFuZGxlIHRoZSAmIzM5O00mIzM5OyAobWFnaWMpIGZvcm1hdC4gKi8KLQkJY2hhciAqczsKLQotCQkvKiBQYXJzZSB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi8KLQkJcyA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXMpCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnMgPSAmIzM5O1wwJiMzOTs7Ci0JCWlmIChwICE9IHMpIHsKLQkJCWludCByID0ga3N0cnRvaW50KHAsIDEwLCAmYW1wO2UtJmd0O29mZnNldCk7Ci0JCQlpZiAociAhPSAwIHx8IGUtJmd0O29mZnNldCAmbHQ7IDApCi0JCQkJZ290byBlaW52YWw7Ci0JCX0KLQkJcCA9IHM7Ci0JCWlmICgqcCYjNDM7JiM0MzspCi0JCQlnb3RvIGVpbnZhbDsKLQkJcHJfZGVidWcoJiMzNDtyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcbiYjMzQ7LCBlLSZndDtvZmZzZXQpOwotCi0JCS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCi0JCWUtJmd0O21hZ2ljID0gcDsKLQkJcCA9IHNjYW5hcmcocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCWlmICghZS0mZ3Q7bWFnaWNbMF0pCi0JCQlnb3RvIGVpbnZhbDsKLQkJaWYgKFVTRV9ERUJVRykKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCUtCVUlMRF9NT0ROQU1FICYjMzQ7OiByZWdpc3RlcjogbWFnaWNbcmF3XTogJiMzNDssCi0JCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFnaWMsIHAgLSBlLSZndDttYWdpYyk7Ci0KLQkJLyogUGFyc2UgdGhlICYjMzk7bWFzayYjMzk7IGZpZWxkLiAqLwotCQllLSZndDttYXNrID0gcDsKLQkJcCA9IHNjYW5hcmcocCwgZGVsKTsKLQkJaWYgKCFwKQotCQkJZ290byBlaW52YWw7Ci0JCWlmICghZS0mZ3Q7bWFza1swXSkgewotCQkJZS0mZ3Q7bWFzayA9IE5VTEw7Ci0JCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXG4mIzM0Oyk7Ci0JCX0gZWxzZSBpZiAoVVNFX0RFQlVHKQotCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoCi0JCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFza1tyYXddOiAmIzM0OywKLQkJCQlEVU1QX1BSRUZJWF9OT05FLCBlLSZndDttYXNrLCBwIC0gZS0mZ3Q7bWFzayk7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCQkvKgotCQkgKiBEZWNvZGUgdGhlIG1hZ2ljICZhbXA7IG1hc2sgZmllbGRzLgotCQkgKiBOb3RlOiB3aGlsZSB3ZSBtaWdodCBoYXZlIGFjY2VwdGVkIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tCi0JCSAqIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyBoZXJlIHdpbGwgc3RvcCBhdCB0aGUgZmlyc3Qgb25lCi0JCSAqIGl0IGVuY291bnRlcnMuCi0JCSAqLwotCQllLSZndDtzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS0mZ3Q7bWFnaWMsIFVORVNDQVBFX0hFWCk7Ci0JCWlmIChlLSZndDttYXNrICZhbXA7JmFtcDsKLQkJICAgIHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtJmd0O21hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS0mZ3Q7c2l6ZSkKLQkJCWdvdG8gZWludmFsOwotCQlpZiAoZS0mZ3Q7c2l6ZSAmZ3Q7IEJJTlBSTV9CVUZfU0laRSB8fAotCQkgICAgQklOUFJNX0JVRl9TSVpFIC0gZS0mZ3Q7c2l6ZSAmbHQ7IGUtJmd0O29mZnNldCkKLQkJCWdvdG8gZWludmFsOwotCQlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBtYWdpYy9tYXNrIGxlbmd0aDogJWlcbiYjMzQ7LCBlLSZndDtzaXplKTsKLQkJaWYgKFVTRV9ERUJVRykgewotCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoCi0JCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogJiMzNDssCi0JCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUpOwotCi0JCQlpZiAoZS0mZ3Q7bWFzaykgewotCQkJCWludCBpOwotCQkJCWNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS0mZ3Q7c2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTsKLQotCQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCQlLQlVJTERfTU9ETkFNRSAmIzM0OzogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiAmIzM0OywKLQkJCQkJRFVNUF9QUkVGSVhfTk9ORSwgZS0mZ3Q7bWFzaywgZS0mZ3Q7c2l6ZSk7Ci0KLQkJCQlpZiAobWFza2VkKSB7Ci0JCQkJCWZvciAoaSA9IDA7IGkgJmx0OyBlLSZndDtzaXplOyAmIzQzOyYjNDM7aSkKLQkJCQkJCW1hc2tlZFtpXSA9IGUtJmd0O21hZ2ljW2ldICZhbXA7IGUtJmd0O21hc2tbaV07Ci0JCQkJCXByaW50X2hleF9kdW1wX2J5dGVzKAotCQkJCQkJS0JVSUxEX01PRE5BTUUgJiMzNDs6IHJlZ2lzdGVyOiAgbWFnaWNbbWFza2VkXTogJiMzNDssCi0JCQkJCQlEVU1QX1BSRUZJWF9OT05FLCBtYXNrZWQsIGUtJmd0O3NpemUpOwotCi0JCQkJCWtmcmVlKG1hc2tlZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogSGFuZGxlIHRoZSAmIzM5O0UmIzM5OyAoZXh0ZW5zaW9uKSBmb3JtYXQuICovCi0KLQkJLyogU2tpcCB0aGUgJiMzOTtvZmZzZXQmIzM5OyBmaWVsZC4gKi8KLQkJcCA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXApCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwotCi0JCS8qIFBhcnNlIHRoZSAmIzM5O21hZ2ljJiMzOTsgZmllbGQuICovCi0JCWUtJmd0O21hZ2ljID0gcDsKLQkJcCA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXApCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwotCQlpZiAoIWUtJmd0O21hZ2ljWzBdIHx8IHN0cmNocihlLSZndDttYWdpYywgJiMzOTsvJiMzOTspKQotCQkJZ290byBlaW52YWw7Ci0JCXByX2RlYnVnKCYjMzQ7cmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxuJiMzNDssIGUtJmd0O21hZ2ljKTsKLQotCQkvKiBTa2lwIHRoZSAmIzM5O21hc2smIzM5OyBmaWVsZC4gKi8KLQkJcCA9IHN0cmNocihwLCBkZWwpOwotCQlpZiAoIXApCi0JCQlnb3RvIGVpbnZhbDsKLQkJKnAmIzQzOyYjNDM7ID0gJiMzOTtcMCYjMzk7OwotCX0KJiM0MzsJaWYgKHRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgJmFtcDtlLSZndDtmbGFncykpCiYjNDM7CQlwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7CiYjNDM7CWVsc2UKJiM0MzsJCXAgPSBwYXJzZV9leHRlbnNpb25fZmllbGRzKGUsIHAsIGRlbCk7CiYjNDM7CWlmICghcCkKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJLyogUGFyc2UgdGhlICYjMzk7aW50ZXJwcmV0ZXImIzM5OyBmaWVsZC4gKi8KIAllLSZndDtpbnRlcnByZXRlciA9IHA7CiAJcCA9IHN0cmNocihwLCBkZWwpOwogCWlmICghcCkKLQkJZ290byBlaW52YWw7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkqcCYjNDM7JiM0MzsgPSAmIzM5O1wwJiMzOTs7CiAJaWYgKCFlLSZndDtpbnRlcnByZXRlclswXSkKLQkJZ290byBlaW52YWw7CiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAlwcl9kZWJ1ZygmIzM0O3JlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxuJiMzNDssIGUtJmd0O2ludGVycHJldGVyKTsKIAogCS8qIFBhcnNlIHRoZSAmIzM5O2ZsYWdzJiMzOTsgZmllbGQuICovCkBAIC01MzMsMjQgJiM0Mzs1MTYsMjIgQEAgc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCiAJaWYgKCpwID09ICYjMzk7XG4mIzM5OykKIAkJcCYjNDM7JiM0Mzs7CiAJaWYgKHAgIT0gYnVmICYjNDM7IGNvdW50KQotCQlnb3RvIGVpbnZhbDsKLQotCXJldHVybiBlOwotCi1vdXQ6Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCi1lZmF1bHQ6Ci0Ja2ZyZWUoZSk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci1laW52YWw6Ci0Ja2ZyZWUoZSk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiYjNDM7CXJldHVybiBub19mcmVlX3B0cihlKTsKIH0KIAomIzQzOy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvJmx0O2VudHJ5Jmd0OyBmaWxlcy4gKi8KJiM0MztlbnVtIGJtX2NvbW1hbmQgewomIzQzOwlCTV9DTURfSUdOT1JFLAkvKiBlbXB0eSB3cml0ZSAqLwomIzQzOwlCTV9DTURfRElTQUJMRSwJLyogJiMzNDswJiMzNDsgKi8KJiM0MzsJQk1fQ01EX0VOQUJMRSwJLyogJiMzNDsxJiMzNDsgKi8KJiM0MzsJQk1fQ01EX1JFTU9WRSwJLyogJiMzNDstMSYjMzQ7ICovCiYjNDM7fTsKJiM0MzsKIC8qCi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOgotICogJiMzOTsxJiMzOTsgZW5hYmxlcywgJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyBjbGVhcnMgZW50cnkvYmluZm10X21pc2MKJiM0MzsgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICYjMzk7MSYjMzk7IGVuYWJsZXMsCiYjNDM7ICogJiMzOTswJiMzOTsgZGlzYWJsZXMgYW5kICYjMzk7LTEmIzM5OyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy4KICAqLwogc3RhdGljIGludCBwYXJzZV9jb21tYW5kKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCkKIHsKQEAgLTU2MSw2MiAmIzQzOzU0Miw2NCBAQCBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KQogCWlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKCFjb3VudCkKLQkJcmV0dXJuIDA7CiYjNDM7CQlyZXR1cm4gQk1fQ01EX0lHTk9SRTsKIAlpZiAoc1tjb3VudCAtIDFdID09ICYjMzk7XG4mIzM5OykKIAkJY291bnQtLTsKIAlpZiAoY291bnQgPT0gMSAmYW1wOyZhbXA7IHNbMF0gPT0gJiMzOTswJiMzOTspCi0JCXJldHVybiAxOwomIzQzOwkJcmV0dXJuIEJNX0NNRF9ESVNBQkxFOwogCWlmIChjb3VudCA9PSAxICZhbXA7JmFtcDsgc1swXSA9PSAmIzM5OzEmIzM5OykKLQkJcmV0dXJuIDI7CiYjNDM7CQlyZXR1cm4gQk1fQ01EX0VOQUJMRTsKIAlpZiAoY291bnQgPT0gMiAmYW1wOyZhbXA7IHNbMF0gPT0gJiMzOTstJiMzOTsgJmFtcDsmYW1wOyBzWzFdID09ICYjMzk7MSYjMzk7KQotCQlyZXR1cm4gMzsKJiM0MzsJCXJldHVybiBCTV9DTURfUkVNT1ZFOwogCXJldHVybiAtRUlOVkFMOwogfQogCiAvKiBnZW5lcmljIHN0dWZmICovCiAKLXN0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKQomIzQzO3N0YXRpYyB2b2lkIGJtX3NlcV9oZXgoc3RydWN0IHNlcV9maWxlICptLCBjb25zdCB1OCAqZGF0YSwgaW50IHNpemUpCiB7Ci0JY2hhciAqZHAgPSBwYWdlOwotCWNvbnN0IGNoYXIgKnN0YXR1cyA9ICYjMzQ7ZGlzYWJsZWQmIzM0OzsKJiM0MzsJZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzaXplOyBpJiM0MzsmIzQzOykKJiM0MzsJCXNlcV9wcmludGYobSwgJiMzNDslMDJ4JiMzNDssIGRhdGFbaV0pOwomIzQzO30KIAotCWlmICh0ZXN0X2JpdChFbmFibGVkLCAmYW1wO2UtJmd0O2ZsYWdzKSkKLQkJc3RhdHVzID0gJiMzNDtlbmFibGVkJiMzNDs7CiYjNDM7c3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gbS0mZ3Q7cHJpdmF0ZTsKIAotCWlmICghVkVSQk9TRV9TVEFUVVMpIHsKLQkJc3ByaW50ZihwYWdlLCAmIzM0OyVzXG4mIzM0Oywgc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KJiM0MzsJaWYgKHRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKSkKJiM0MzsJCXNlcV9wdXRzKG0sICYjMzQ7ZW5hYmxlZFxuJiMzNDspOwomIzQzOwllbHNlCiYjNDM7CQlzZXFfcHV0cyhtLCAmIzM0O2Rpc2FibGVkXG4mIzM0Oyk7CiAKLQlkcCAmIzQzOz0gc3ByaW50ZihkcCwgJiMzNDslc1xuaW50ZXJwcmV0ZXIgJXNcbiYjMzQ7LCBzdGF0dXMsIGUtJmd0O2ludGVycHJldGVyKTsKJiM0MzsJc2VxX3ByaW50ZihtLCAmIzM0O2ludGVycHJldGVyICVzXG4mIzM0OywgZS0mZ3Q7aW50ZXJwcmV0ZXIpOwogCiAJLyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi8KLQlkcCAmIzQzOz0gc3ByaW50ZihkcCwgJiMzNDtmbGFnczogJiMzNDspOwomIzQzOwlzZXFfcHV0cyhtLCAmIzM0O2ZsYWdzOiAmIzM0Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwKQotCQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtQJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O1AmIzM5Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fQklOQVJZKQotCQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtPJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O08mIzM5Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX0NSRURFTlRJQUxTKQotCQkqZHAmIzQzOyYjNDM7ID0gJiMzOTtDJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O0MmIzM5Oyk7CiAJaWYgKGUtJmd0O2ZsYWdzICZhbXA7IE1JU0NfRk1UX09QRU5fRklMRSkKLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7RiYjMzk7OwotCSpkcCYjNDM7JiM0MzsgPSAmIzM5O1xuJiMzOTs7CiYjNDM7CQlzZXFfcHV0YyhtLCAmIzM5O0YmIzM5Oyk7CiYjNDM7CXNlcV9wdXRjKG0sICYjMzk7XG4mIzM5Oyk7CiAKLQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmYW1wO2UtJmd0O2ZsYWdzKSkgewotCQlzcHJpbnRmKGRwLCAmIzM0O2V4dGVuc2lvbiAuJXNcbiYjMzQ7LCBlLSZndDttYWdpYyk7CiYjNDM7CWlmICghdGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCAmYW1wO2UtJmd0O2ZsYWdzKSkgewomIzQzOwkJc2VxX3ByaW50ZihtLCAmIzM0O2V4dGVuc2lvbiAuJXNcbiYjMzQ7LCBlLSZndDttYWdpYyk7CiAJfSBlbHNlIHsKLQkJZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7b2Zmc2V0ICVpXG5tYWdpYyAmIzM0OywgZS0mZ3Q7b2Zmc2V0KTsKLQkJZHAgPSBiaW4yaGV4KGRwLCBlLSZndDttYWdpYywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CQlzZXFfcHJpbnRmKG0sICYjMzQ7b2Zmc2V0ICVpXG5tYWdpYyAmIzM0OywgZS0mZ3Q7b2Zmc2V0KTsKJiM0MzsJCWJtX3NlcV9oZXgobSwgZS0mZ3Q7bWFnaWMsIGUtJmd0O3NpemUpOwogCQlpZiAoZS0mZ3Q7bWFzaykgewotCQkJZHAgJiM0Mzs9IHNwcmludGYoZHAsICYjMzQ7XG5tYXNrICYjMzQ7KTsKLQkJCWRwID0gYmluMmhleChkcCwgZS0mZ3Q7bWFzaywgZS0mZ3Q7c2l6ZSk7CiYjNDM7CQkJc2VxX3B1dHMobSwgJiMzNDtcbm1hc2sgJiMzNDspOwomIzQzOwkJCWJtX3NlcV9oZXgobSwgZS0mZ3Q7bWFzaywgZS0mZ3Q7c2l6ZSk7CiAJCX0KLQkJKmRwJiM0MzsmIzQzOyA9ICYjMzk7XG4mIzM5OzsKLQkJKmRwID0gJiMzOTtcMCYjMzk7OwomIzQzOwkJc2VxX3B1dGMobSwgJiMzOTtcbiYjMzk7KTsKIAl9CiYjNDM7CXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpCiYjNDM7c3RhdGljIHN0cnVjdCBpbm9kZSAqYm1fZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKIApAQCAtNjUyLDE0ICYjNDM7NjM1LDE0IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmlfYmluZm10X21pc2Moc3RydWN0IGlub2RlICppbm9kZSkKICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXMKICAqIHNodXRkb3duLgogICoKLSAqIElmIHRoZSAtJmd0O2V2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZQotICogdG8gcmVtb3ZlIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcyB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKSB0aGUgZW50cnkKLSAqIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBXZSBrZWVwIHRoZSBsaXN0X2VtcHR5KCkgY2hlY2sKLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4KJiM0MzsgKiBJZiB0aGUgLSZndDtldmljdCBjYWxsIHdhcyBub3QgY2F1c2VkIGJ5IGEgc3VwZXIgYmxvY2sgc2h1dGRvd24gYnV0IGJ5CiYjNDM7ICogcmVtb3ZpbmcgdGhlIGVudHJ5IHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIG9yIHVubGluaygyKSB0aGUgZW50cnkKJiM0MzsgKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgaGxpc3RfdW5oYXNoZWQoKQomIzQzOyAqIGNoZWNrIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4KICovCiBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCU5vZGUgKmUgPSBpbm9kZS0mZ3Q7aV9wcml2YXRlOwomIzQzOwlzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBpbm9kZS0mZ3Q7aV9wcml2YXRlOwogCiAJY2xlYXJfaW5vZGUoaW5vZGUpOwogCkBAIC02NjcsODkgJiM0Mzs2NTAsMTMyIEBAIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiAJCXN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYzsKIAogCQltaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7Ci0JCXdyaXRlX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJmFtcDtlLSZndDtsaXN0KSkKLQkJCWxpc3RfZGVsX2luaXQoJmFtcDtlLSZndDtsaXN0KTsKLQkJd3JpdGVfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJCXNwaW5fbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CQlpZiAoIWhsaXN0X3VuaGFzaGVkKCZhbXA7ZS0mZ3Q7bm9kZSkpCiYjNDM7CQkJaGxpc3RfZGVsX2luaXRfcmN1KCZhbXA7ZS0mZ3Q7bm9kZSk7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiAJCXB1dF9iaW5mbXRfaGFuZGxlcihlKTsKIAl9CiB9CiAKJiM0MzsvKioKJiM0MzsgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyCiYjNDM7ICogQG1pc2M6IGhhbmRsZSB0byBiaW5mbXRfbWlzYyBpbnN0YW5jZQomIzQzOyAqIEBlOiBiaW5hcnkgdHlwZSBoYW5kbGVyIHRvIHVuaGFzaAomIzQzOyAqCiYjNDM7ICogQWRkaW5nIGFuZCByZW1vdmluZyBlbnRyaWVzIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGFuZAomIzQzOyAqIHVubGluaygyKSBoYXBwZW5zIHVuZGVyIHRoZSBleGNsdXNpdmVseSBoZWxkIGlub2RlIGxvY2sgb2YgdGhlIHJvb3QKJiM0MzsgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdAomIzQzOyAqIGNvbmN1cnJlbnRseSB1bmRlciBSQ1UuIFRoZSBlbnRyaWVzX2xvY2sgaXMgb25seSBoZWxkIGFyb3VuZCB0aGUgYWN0dWFsCiYjNDM7ICogdW5saW5rIHRvIHNlcmlhbGl6ZSBhZ2FpbnN0IGJtX2V2aWN0X2lub2RlKCkgd2hpY2ggdW5saW5rcyBlbnRyaWVzCiYjNDM7ICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCB1bmxpbmtfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLAomIzQzOwkJCQkgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSkKJiM0Mzt7CiYjNDM7CXNwaW5fbG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CWhsaXN0X2RlbF9pbml0X3JjdSgmYW1wO2UtJmd0O25vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7fQomIzQzOwogLyoqCiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyCiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlCiAgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byByZW1vdmUKICAqCiAgKiBSZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3Qgb2YgYmluYXJ5IHR5cGUgaGFuZGxlcnMgYW5kCi0gKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LiBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dAotICogYWRkaW5nIGEgcHJvcGVyIC0mZ3Q7dW5saW5rKCkgbWV0aG9kIHRvIGJpbmZtdF9taXNjIGluc3RlYWQgb2YgZm9yY2luZyBjYWxsZXImIzM5O3MKLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzCi0gKiB3b3JrZWQgZm9yIHNvIGxvbmcgdGhhdCBpdCYjMzk7cyBub3QgYSBwcmVzc2luZyBpc3N1ZS4KJiM0MzsgKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LgogICovCi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKQomIzQzO3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsCiYjNDM7CQkJCSAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKQogewotCXdyaXRlX2xvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwotCWxpc3RfZGVsX2luaXQoJmFtcDtlLSZndDtsaXN0KTsKLQl3cml0ZV91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwomIzQzOwl1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7CiAJbG9ja2VkX3JlY3Vyc2l2ZV9yZW1vdmFsKGUtJmd0O2RlbnRyeSwgTlVMTCk7CiB9CiAKLS8qIC8mbHQ7ZW50cnkmZ3Q7ICovCiYjNDM7LyogUmVtb3ZlIEBlIHVubGVzcyBpdCB3YXMgYWxyZWFkeSByZW1vdmVkLiAqLwomIzQzO3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLSZndDtzX3Jvb3QpOwogCi1zdGF0aWMgc3NpemVfdAotYm1fZW50cnlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQomIzQzOwlpbm9kZV9sb2NrX25lc3RlZChyb290LCBJX01VVEVYX1BBUkVOVCk7CiYjNDM7CWlmICghaGxpc3RfdW5oYXNoZWQoJmFtcDtlLSZndDtub2RlKSkKJiM0MzsJCXJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTsKJiM0MzsJaW5vZGVfdW5sb2NrKHJvb3QpOwomIzQzO30KJiM0MzsKJiM0MzsvKiBSZW1vdmUgYWxsIGVudHJpZXMgb2YgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIEBtaXNjIGJlbG9uZ2luZyB0byBAc2IuICovCiYjNDM7c3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywKJiM0MzsJCQkJICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCU5vZGUgKmUgPSBmaWxlX2lub2RlKGZpbGUpLSZndDtpX3ByaXZhdGU7Ci0Jc3NpemVfdCByZXM7Ci0JY2hhciAqcGFnZTsKJiM0MzsJc3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi0mZ3Q7c19yb290KTsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplOwomIzQzOwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbmV4dDsKJiM0MzsKJiM0MzsJaW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpOwomIzQzOwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcywgbm9kZSkKJiM0MzsJCXJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTsKJiM0MzsJaW5vZGVfdW5sb2NrKHJvb3QpOwomIzQzO30KIAotCXBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlKQotCQlyZXR1cm4gLUVOT01FTTsKJiM0MzsvKioKJiM0MzsgKiBibV91bmxpbmsgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIHZpYSB1bmxpbmsoMikKJiM0MzsgKiBAZGlyOiBpbm9kZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnkKJiM0MzsgKiBAZGVudHJ5OiBlbnRyeSBmaWxlIHRvIHJlbW92ZQomIzQzOyAqCiYjNDM7ICogUmVtb3ZpbmcgdGhlIGVudHJ5IGZpbGUgcmVtb3ZlcyBpdHMgYmluYXJ5IHR5cGUgaGFuZGxlciwgZXhhY3RseSBsaWtlCiYjNDM7ICogd3JpdGluZyAtMSB0byBpdCBkb2VzLiBUaGUgc3RhdHVzIGFuZCByZWdpc3RlciBjb250cm9sIGZpbGVzIGNhbiYjMzk7dCBiZQomIzQzOyAqIHJlbW92ZWQuIFRoZSBWRlMgY2FsbHMgdGhpcyB3aXRoIHRoZSByb290IGlub2RlIGxvY2sgaGVsZCB3aGljaAomIzQzOyAqIHNlcmlhbGl6ZXMgYWdhaW5zdCB0aGUgd3JpdGUgYmFzZWQgYWRkIGFuZCByZW1vdmUgcGF0aHMuCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBibV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGRfaW5vZGUoZGVudHJ5KS0mZ3Q7aV9wcml2YXRlOwomIzQzOwomIzQzOwlpZiAoIWUpCiYjNDM7CQlyZXR1cm4gLUVQRVJNOwomIzQzOwomIzQzOwl1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTsKJiM0MzsJcmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpOwomIzQzO30KIAotCWVudHJ5X3N0YXR1cyhlLCBwYWdlKTsKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYm1fZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CiYjNDM7CS5sb29rdXAJCT0gc2ltcGxlX2xvb2t1cCwKJiM0MzsJLnVubGluawkJPSBibV91bmxpbmssCiYjNDM7fTsKIAotCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYWdlLCBzdHJsZW4ocGFnZSkpOwomIzQzOy8qIC8mbHQ7ZW50cnkmZ3Q7ICovCiYjNDM7CiYjNDM7c3RhdGljIGludCBibV9lbnRyeV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQomIzQzO3sKJiM0MzsJaW50IHJldDsKIAotCWtmcmVlKHBhZ2UpOwotCXJldHVybiByZXM7CiYjNDM7CXJldCA9IHNpbmdsZV9vcGVuKGZpbGUsIGJtX2VudHJ5X3Nob3csIGlub2RlLSZndDtpX3ByaXZhdGUpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogc2VxX29wZW4oKSBjbGVhcnMgRk1PREVfUFdSSVRFLCBibV9lbnRyeV93cml0ZSgpIHRha2VzIGFueSBvZmZzZXQgKi8KJiM0MzsJaWYgKGZpbGUtJmd0O2ZfbW9kZSAmYW1wOyBGTU9ERV9XUklURSkKJiM0MzsJCWZpbGUtJmd0O2ZfbW9kZSB8PSBGTU9ERV9QV1JJVEU7CiYjNDM7CXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBibV9lbnRyeV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKLQlOb2RlICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtJmd0O2lfcHJpdmF0ZTsKIAlpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTsKIAogCXN3aXRjaCAocmVzKSB7Ci0JY2FzZSAxOgotCQkvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi8KLQkJY2xlYXJfYml0KEVuYWJsZWQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpOwomIzQzOwljYXNlIEJNX0NNRF9ESVNBQkxFOgomIzQzOwkJY2xlYXJfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKTsKIAkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiBFbmFibGUgdGhpcyBoYW5kbGVyLiAqLwotCQlzZXRfYml0KEVuYWJsZWQsICZhbXA7ZS0mZ3Q7ZmxhZ3MpOwomIzQzOwljYXNlIEJNX0NNRF9FTkFCTEU6CiYjNDM7CQlzZXRfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCAmYW1wO2UtJmd0O2ZsYWdzKTsKIAkJYnJlYWs7Ci0JY2FzZSAzOgotCQkvKiBEZWxldGUgdGhpcyBoYW5kbGVyLiAqLwotCQlpbm9kZSA9IGRfaW5vZGUoaW5vZGUtJmd0O2lfc2ItJmd0O3Nfcm9vdCk7Ci0JCWlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7Ci0KLQkJLyoKLQkJICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0Ci0JCSAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGUKLQkJICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuCi0JCSAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbiYjMzk7dCBiZQotCQkgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzbwotCQkgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2UKLQkJICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0LgotCQkgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZhbXA7ZS0mZ3Q7bGlzdCkpCi0JCQlyZW1vdmVfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhpbm9kZSksIGUpOwotCi0JCWlub2RlX3VubG9jayhpbm9kZSk7CiYjNDM7CWNhc2UgQk1fQ01EX1JFTU9WRToKJiM0MzsJCWJtX3JlbW92ZV9lbnRyeShlLCBpbm9kZS0mZ3Q7aV9zYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiByZXM7CkBAIC03NTksMTUgJiM0Mzs3ODUsMTcgQEAgc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJtX2VudHJ5X29wZXJhdGlvbnMgPSB7Ci0JLnJlYWQJCT0gYm1fZW50cnlfcmVhZCwKJiM0MzsJLm9wZW4JCT0gYm1fZW50cnlfb3BlbiwKJiM0MzsJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLndyaXRlCQk9IGJtX2VudHJ5X3dyaXRlLAotCS5sbHNlZWsJCT0gZGVmYXVsdF9sbHNlZWssCiYjNDM7CS5sbHNlZWsJCT0gc2VxX2xzZWVrLAomIzQzOwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAogLyogL3JlZ2lzdGVyICovCiAKIC8qIGFkZCB0byBmaWxlc3lzdGVtICovCi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3N0YXRpYyBpbnQgYWRkX2VudHJ5KHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBzaW1wbGVfc3RhcnRfY3JlYXRpbmcoc2ItJmd0O3Nfcm9vdCwgZS0mZ3Q7bmFtZSk7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTc4OSw5ICYjNDM7ODE3LDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIAogCWRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpOwogCW1pc2MgPSBpX2JpbmZtdF9taXNjKGlub2RlKTsKLQl3cml0ZV9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKLQlsaXN0X2FkZCgmYW1wO2UtJmd0O2xpc3QsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcyk7Ci0Jd3JpdGVfdW5sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKJiM0MzsJaGxpc3RfYWRkX2hlYWRfcmN1KCZhbXA7ZS0mZ3Q7bm9kZSwgJmFtcDttaXNjLSZndDtlbnRyaWVzKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDttaXNjLSZndDtlbnRyaWVzX2xvY2spOwogCXNpbXBsZV9kb25lX2NyZWF0aW5nKGRlbnRyeSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03OTksMTMgJiM0Mzs4MjcsMTIgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAogCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCU5vZGUgKmU7CiYjNDM7CXN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9zYjsKLQlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgZmlsZSAqZiA9IE5VTEw7CiYjNDM7CWludCBlcnI7CiAKIAllID0gY3JlYXRlX2VudHJ5KGJ1ZmZlciwgY291bnQpOwotCiAJaWYgKElTX0VSUihlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZSk7CiAKQEAgLTgyMiw3ICYjNDM7ODQ5LDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCWlmIChJU19FUlIoZikpIHsKIAkJCXByX25vdGljZSgmIzM0O3JlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXG4mIzM0OywKIAkJCQkgZS0mZ3Q7aW50ZXJwcmV0ZXIpOwotCQkJa2ZyZWUoZSk7CiAJCQlyZXR1cm4gUFRSX0VSUihmKTsKIAkJfQogCQllLSZndDtpbnRlcnBfZmlsZSA9IGY7CkBAIC04MzQsOSAmIzQzOzg2MCwxMSBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCWV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhmKTsKIAkJCWZpbHBfY2xvc2UoZiwgTlVMTCk7CiAJCX0KLQkJa2ZyZWUoZSk7CiAJCXJldHVybiBlcnI7CiAJfQomIzQzOwomIzQzOwkvKiBUaGUgZW50cnkgaXMgb3duZWQgYnkgaXRzIGlub2RlIG5vdy4gKi8KJiM0MzsJcmV0YWluX2FuZF9udWxsX3B0cihlKTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTg1MSwxMCAmIzQzOzg3OSwxMCBAQCBzdGF0aWMgc3NpemVfdAogYm1fc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7Ci0JY2hhciAqczsKJiM0MzsJY29uc3QgY2hhciAqczsKIAogCW1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpOwotCXMgPSBtaXNjLSZndDtlbmFibGVkID8gJiMzNDtlbmFibGVkXG4mIzM0OyA6ICYjMzQ7ZGlzYWJsZWRcbiYjMzQ7OwomIzQzOwlzID0gUkVBRF9PTkNFKG1pc2MtJmd0O2VuYWJsZWQpID8gJiMzNDtlbmFibGVkXG4mIzM0OyA6ICYjMzQ7ZGlzYWJsZWRcbiYjMzQ7OwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcywgc3RybGVuKHMpKTsKIH0KIApAQCAtODYzLDM3ICYjNDM7ODkxLDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIHsKIAlzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7CiAJaW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7Ci0JTm9kZSAqZSwgKm5leHQ7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAogCW1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpOwogCXN3aXRjaCAocmVzKSB7Ci0JY2FzZSAxOgotCQkvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi8KLQkJbWlzYy0mZ3Q7ZW5hYmxlZCA9IGZhbHNlOwomIzQzOwljYXNlIEJNX0NNRF9ESVNBQkxFOgomIzQzOwkJV1JJVEVfT05DRShtaXNjLSZndDtlbmFibGVkLCBmYWxzZSk7CiAJCWJyZWFrOwotCWNhc2UgMjoKLQkJLyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi8KLQkJbWlzYy0mZ3Q7ZW5hYmxlZCA9IHRydWU7CiYjNDM7CWNhc2UgQk1fQ01EX0VOQUJMRToKJiM0MzsJCVdSSVRFX09OQ0UobWlzYy0mZ3Q7ZW5hYmxlZCwgdHJ1ZSk7CiAJCWJyZWFrOwotCWNhc2UgMzoKLQkJLyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi8KLQkJaW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktJmd0O2lfc2ItJmd0O3Nfcm9vdCk7Ci0JCWlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7Ci0KLQkJLyoKLQkJICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0Ci0JCSAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGUKLQkJICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuCi0JCSAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbiYjMzk7dCBiZQotCQkgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzbwotCQkgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2UKLQkJICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0LgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsICZhbXA7bWlzYy0mZ3Q7ZW50cmllcywgbGlzdCkKLQkJCXJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTsKLQotCQlpbm9kZV91bmxvY2soaW5vZGUpOwomIzQzOwljYXNlIEJNX0NNRF9SRU1PVkU6CiYjNDM7CQlibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS0mZ3Q7aV9zYik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiByZXM7CkBAIC05MTgsNyAmIzQzOzkyNiw3IEBAIHN0YXRpYyB2b2lkIGJtX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogCXB1dF91c2VyX25zKHVzZXJfbnMpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7CiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGJtX3N1cGVyX29wcyA9IHsKIAkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCiAJLmV2aWN0X2lub2RlCT0gYm1fZXZpY3RfaW5vZGUsCiAJLnB1dF9zdXBlcgk9IGJtX3B1dF9zdXBlciwKQEAgLTk2NSwxMCAmIzQzOzk3MywxMCBAQCBzdGF0aWMgaW50IGJtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKQogCQlpZiAoIW1pc2MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQlJTklUX0xJU1RfSEVBRCgmYW1wO21pc2MtJmd0O2VudHJpZXMpOwotCQlyd2xvY2tfaW5pdCgmYW1wO21pc2MtJmd0O2VudHJpZXNfbG9jayk7CiYjNDM7CQlJTklUX0hMSVNUX0hFQUQoJmFtcDttaXNjLSZndDtlbnRyaWVzKTsKJiM0MzsJCXNwaW5fbG9ja19pbml0KCZhbXA7bWlzYy0mZ3Q7ZW50cmllc19sb2NrKTsKIAotCQkvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovCiYjNDM7CQkvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovCiAJCXNtcF9zdG9yZV9yZWxlYXNlKCZhbXA7dXNlcl9ucy0mZ3Q7YmluZm10X21pc2MsIG1pc2MpOwogCX0KIApAQCAtOTgzLDEyICYjNDM7OTkxLDE1IEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCiAJICogc29tZW9uZSBtb3VudHMgYmluZm10X21pc2MgZm9yIHRoZSBmaXJzdCB0aW1lIG9yIGFnYWluIHdlIHNpbXBseQogCSAqIHJlc2V0IC0mZ3Q7ZW5hYmxlZCB0byB0cnVlLgogCSAqLwotCW1pc2MtJmd0O2VuYWJsZWQgPSB0cnVlOwomIzQzOwlXUklURV9PTkNFKG1pc2MtJmd0O2VuYWJsZWQsIHRydWUpOwogCiAJZXJyID0gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIEJJTkZNVEZTX01BR0lDLCBibV9maWxlcyk7Ci0JaWYgKCFlcnIpCi0JCXNiLSZndDtzX29wID0gJmFtcDtzX29wczsKLQlyZXR1cm4gZXJyOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJc2ItJmd0O3Nfb3AgPSAmYW1wO2JtX3N1cGVyX29wczsKJiM0MzsJZF9pbm9kZShzYi0mZ3Q7c19yb290KS0mZ3Q7aV9vcCA9ICZhbXA7Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7CiYjNDM7CXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBibV9mcmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmgKaW5kZXggMmM3N2UzODNlNzM3NTcuLjdlNzMzM2I3YmIwZjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaApAQCAtMTAxLDggJiM0MzsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHsKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKQogc3RydWN0IGJpbmZtdF9taXNjIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJpZXM7Ci0Jcndsb2NrX3QgZW50cmllc19sb2NrOwomIzQzOwlzdHJ1Y3QgaGxpc3RfaGVhZCBlbnRyaWVzOwomIzQzOwlzcGlubG9ja190IGVudHJpZXNfbG9jazsKIAlib29sIGVuYWJsZWQ7CiB9IF9fcmFuZG9taXplX2xheW91dDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmMKaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NAotLS0gYS9rZXJuZWwvdXNlci5jCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC91c2VyLmMKQEAgLTIzLDkgJiM0MzsyMyw5IEBACiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykKIHN0cnVjdCBiaW5mbXRfbWlzYyBpbml0X2JpbmZtdF9taXNjID0gewotCS5lbnRyaWVzID0gTElTVF9IRUFEX0lOSVQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzKSwKJiM0MzsJLmVudHJpZXMgPSBITElTVF9IRUFEX0lOSVQsCiAJLmVuYWJsZWQgPSB0cnVlLAotCS5lbnRyaWVzX2xvY2sgPSBfX1JXX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLAomIzQzOwkuZW50cmllc19sb2NrID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpOwogI2VuZGlmCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEwIDIwOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NjIyCgkJCQkJCQlvdXRwdXQ6IDI4CgkJCQkJCQl0aG91Z2h0czogNTcyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIHRoZSBiaW5mbXRfbWlzYyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBnb3QgdGhpcyBzdWJzdGFudGlhbCBwYXRjaCB0b3VjaGluZyBgZnMvYmluZm10X21pc2MuY2AuIEl0JiMzOTtzIGEgYmlnIGludGVybmFsIHJlZmFjdG9yLCBzd2l0Y2hpbmcgZnJvbSBhIGBsaXN0X2hlYWRgIHRvIGFuIGBobGlzdF9oZWFkYCwgUkNVIGZvciBsb29rdXBzLCBgc3BpbmxvY2tfdGAgaW4gcGxhY2Ugb2YgYHJ3bG9ja190YCwgY2xlYW51cCByb3V0aW5lcywgYHNlcV9maWxlYCBmb3IgYGJtX2VudHJ5X3JlYWRgLCBhbmQgZW5hYmxpbmcgYHVubGluaygyKWAgb24gZW50cnkgZmlsZXMuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBpcyB0aGlzIHJlYWNoYWJsZSwgYW5kIGhvdyBjYW4gSSBicmVhayBpdD8KCkZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGF0IHRoaXMgaXMgYSBjcml0aWNhbCBjb2RlIHBhdGguIFllcywgYGJpbmZtdF9taXNjYCBpcyBhYnNvbHV0ZWx5IGVzc2VudGlhbC4gSXQmIzM5O3MgdGhlIGNvcmUgb2YgZXhlY3V0aW5nIGFyYml0cmFyeSBiaW5hcnkgZm9ybWF0cyB3aXRoaW4gdGhlIGtlcm5lbCwgc28gaXQmIzM5O3MgYSByaXBlIHRhcmdldCBmb3IgZnV6emluZy4gSSBjYW4gcmVhY2ggaXQgZnJvbSB1c2Vyc3BhY2UgYnkgbW91bnRpbmcgdGhlIGBiaW5mbXRfbWlzY2AgZmlsZXN5c3RlbSBhbmQgdGhlbiB3cml0aW5nIHRvIGl0cyBmaWxlcywgYW5kIGl0IHVsdGltYXRlbHkgbW9kaWZpZXMgYGxvYWRfbWlzY19iaW5hcnlgLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBgZXhlY3ZlYCBzeXN0ZW0gY2FsbCwgc28gdGhlcmUmIzM5O3MgcGxlbnR5IG9mIHVzZXIgaW50ZXJhY3Rpb24uIFRoYXQmIzM5O3MgZ29vZDsgdXNlciBpbnRlcmFjdGlvbiBpcyBjcml0aWNhbC4KCk5vdywgSSYjMzk7bSBnb2luZyB0byBtYXAgb3V0IHRoZSBhdHRhY2sgc3VyZmFjZS4gQmFzZWQgb24gdGhlIHBhdGNoLCBpdCBsb29rcyBsaWtlIHRoZXNlIGFyZSB0aGUga2V5IGZ1bmN0aW9ucyBJIHNob3VsZCBiZSBwYXlpbmcgYXR0ZW50aW9uIHRvOiBgZW50cnlfbWF0Y2hlc19tYWdpY2AsIGBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbmAsIGBzZWFyY2hfYmluZm10X2hhbmRsZXJgLCBgZ2V0X2JpbmZtdF9oYW5kbGVyYCwgYHB1dF9iaW5mbXRfaGFuZGxlcmAsIGBjdXJyZW50X2JpbmZtdF9taXNjYCwgYGxvYWRfbWlzY19iaW5hcnlgLCBgc2NhbmFyZ2AsIGBjaGVja19zcGVjaWFsX2ZsYWdzYCwgYHBhcnNlX21hZ2ljX2ZpZWxkc2AsIGBwYXJzZV9leHRlbnNpb25fZmllbGRzYCwgYGNyZWF0ZV9lbnRyeWAsIGBwYXJzZV9jb21tYW5kYCwgYGJtX3NlcV9oZXhgLCBgYm1fZW50cnlfc2hvd2AsIGBibV9nZXRfaW5vZGVgLCBgYm1fZXZpY3RfaW5vZGVgLCBgdW5saW5rX2JpbmZtdF9oYW5kbGVyYCwgYHJlbW92ZV9iaW5mbXRfaGFuZGxlcmAsIGBibV9yZW1vdmVfZW50cnlgLCBgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzYCwgYGJtX3VubGlua2AsIGBibV9lbnRyeV9vcGVuYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGFkZF9lbnRyeWAsIGBibV9yZWdpc3Rlcl93cml0ZWAsIGBibV9zdGF0dXNfcmVhZGAsIGBibV9zdGF0dXNfd3JpdGVgLCBhbmQgYGJtX2ZpbGxfc3VwZXJgLgoKR2l2ZW4gdGhhdCBtYXNzaXZlIGxpc3QsIEkgbmVlZCB0byBwcmlvcml0aXplLiBJJiMzOTttIHRoaW5raW5nIHRoZSByZWFsIG1lYXQgaXMgaW4gaG93IGl0JiMzOTtzICp1c2VkKiwgcmF0aGVyIHRoYW4gdGhlIGludGVybmFsIG1lY2hhbmljcy4gVGhlcmVmb3JlLCBJJiMzOTttIHplcm9pbmcgaW4gb246IGBsb2FkX21pc2NfYmluYXJ5YCAodGhlIHVsdGltYXRlIGVudHJ5IHBvaW50IGR1cmluZyBleGVjdXRpb24pLCBgYm1fcmVnaXN0ZXJfd3JpdGVgLCBgYm1fZW50cnlfd3JpdGVgLCBgYm1fc3RhdHVzX3dyaXRlYCwgYGJtX3VubGlua2AsIGBibV9lbnRyeV9vcGVuYCwgYW5kIGBibV9lbnRyeV9zaG93YC4gVGhvc2UgYXJlIHRoZSBlbnRyeSBwb2ludHMgdG8gcGxheSB3aXRoIGZpbGUgb3BlcmF0aW9ucy4KCkxhc3RseSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYnVpbGQgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuIGBDT05GSUdfQklORk1UX01JU0NgIGlzIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbi4gSSYjMzk7bGwgdmVyaWZ5IHRoaXMgdG8gbWFrZSBzdXJlIG15IHRlc3Rpbmcgc2V0dXAgaXMgdmFsaWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMjA6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7QklORk1UX01JU0MmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvS2NvbmZpZy5iaW5mbXQ9MTM4PWNvbmZpZyBCSU5GTVRfWkZMQVRcbi0tXG5mcy9LY29uZmlnLmJpbmZtdC0xNDQtXG5mcy9LY29uZmlnLmJpbmZtdDoxNDU6Y29uZmlnIEJJTkZNVF9NSVNDXG5mcy9LY29uZmlnLmJpbmZtdC0xNDYtXHR0cmlzdGF0ZSBcJiMzNDtLZXJuZWwgc3VwcG9ydCBmb3IgTUlTQyBiaW5hcmllc1wmIzM0O1xuLS1cbmZzL01ha2VmaWxlPTM0PW9iai0kKENPTkZJR19GSUxFX0xPQ0tJTkcpICAgICAgJiM0Mzs9IGxvY2tzLm9cbmZzL01ha2VmaWxlOjM1Om9iai0kKENPTkZJR19CSU5GTVRfTUlTQylcdCYjNDM7PSBiaW5mbXRfbWlzYy5vXG5mcy9NYWtlZmlsZS0zNi1vYmotJChDT05GSUdfQklORk1UX1NDUklQVClcdCYjNDM7PSBiaW5mbXRfc2NyaXB0Lm9cbi0tXG5mcy9maWxlX3RhYmxlLmM9MTY1PXN0YXRpYyBpbnQgX19pbml0IGluaXRfZnNfc3RhdF9zeXNjdGxzKHZvaWQpXG4tLVxuZnMvZmlsZV90YWJsZS5jLTE2Ny1cdHJlZ2lzdGVyX3N5c2N0bF9pbml0KFwmIzM0O2ZzXCYjMzQ7LCBmc19zdGF0X3N5c2N0bHMpO1xuZnMvZmlsZV90YWJsZS5jOjE2ODpcdGlmIChJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykpIHtcbmZzL2ZpbGVfdGFibGUuYy0xNjktXHRcdHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMjA6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTgxNTAKCQkJCQkJCW91dHB1dDogMTY0CgkJCQkJCQl0aG91Z2h0czogNjcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKlJlZmluaW5nIHRoZSBGb2N1cyBmb3IgQklORk1UX01JU0MgQ292ZXJhZ2UqKgoKT2theSwgc28gSSYjMzk7bSBmb2N1c2luZyBvbiBgQklORk1UX01JU0NgLCB0aGF0JiMzOTtzIHRoZSBrZXkgY29uZmlnIGhlcmUuIExldCYjMzk7cyBzaGFycGVuIHRoZSBsaXN0IG9mIEZvY3VzU3ltYm9scyBmb3IgdGhlIGZ1enplci4gTXkgaW5pdGlhbCB0aG91Z2h0cyB3ZXJlIGdvb2QsIGBsb2FkX21pc2NfYmluYXJ5YCBpcyBkZWZpbml0ZWx5IGluIHNjb3BlLCBpdCYjMzk7cyB0aGUgYGxpbnV4X2JpbmZtdGAgaGFuZGxlciwgYW5kIGNyaXRpY2FsIGZvciBleGVjdXRpb24uIFRoZSBgYm1fcmVnaXN0ZXJfd3JpdGVgLCBgYm1fZW50cnlfd3JpdGVgLCBgYm1fc3RhdHVzX3dyaXRlYCwgYW5kIGBibV91bmxpbmtgIGZ1bmN0aW9ucyBhcmUgdGhlIGhhbmRsZXJzIGZvciBmaWxlIG9wZXJhdGlvbnMgb24gdGhlIHZpcnR1YWwgZmlsZXN5c3RlbSwgc28gdGhleSBhcmUgZXNzZW50aWFsLiBgYm1fZW50cnlfb3BlbmAgc2VlbXMgaW1wb3J0YW50LCBhbmQgSSBuZWVkIHRvIG5vdGUgdGhhdCBpdCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBibV9lbnRyeV9zaG93YCBub3cgdGhhdCBpdCB1c2VzIHNlcV9maWxlLgoKTm93LCBgbG9hZF9taXNjX2JpbmFyeWAgZG9lcyBnZXQgY2FsbGVkIGJ5IGBzZWFyY2hfYmluYXJ5X2hhbmRsZXJgLCB3aGljaCBpcyBpdHNlbGYgY2FsbGVkIGJ5IGBicHJtX2V4ZWN2ZWAuIFRoYXQmIzM5O3MgYSBob3QgcGF0aCwgZXNwZWNpYWxseSBjb25zaWRlcmluZyB0aGUgZnJlcXVlbmN5IG9mIGBleGVjdmVgIGNhbGxzLCBhbmQgaXQgaXMgc3BlY2lmaWMgdG8gYGJpbmZtdF9taXNjYCwgc28gaW5jbHVkaW5nIGl0IGlzIGVzc2VudGlhbC4gVGhlIG90aGVycyBzZWVtIGxpa2UgY2xlYXIgd2lucy4KCkFscmlnaHQsIEkgY2FuIGNvbmZpcm0gdGhhdCBgQklORk1UX01JU0NgIGlzIHN1ZmZpY2llbnQgZm9yIHRoZSBjb25maWd1cmF0aW9uIHNpZGUgb2YgdGhpbmdzLgoKTGV0JiMzOTtzIGRvIGEgZmluYWwgcmV2aWV3IG9mIHRoZSBwYXRjaC4gVGhlIG5ldyBgYm1fdW5saW5rYCBpcyBhIG5ldyBmZWF0dXJlIGZvciB1bmxpbmtpbmcgZW50cnkgZmlsZXMsIHdoaWNoIG5lZWRzIHRlc3RpbmcuIEl0IGNoYW5nZXMgYGJtX2VudHJ5X3JlYWRgIHRvIGBibV9lbnRyeV9zaG93YCwgd2hpY2ggaXMgdGhlIHNlcV9maWxlLCBhbmQgaW1wb3J0YW50LiBJdCBhbHNvIHVwZGF0ZXMgYGxvYWRfbWlzY19iaW5hcnlgIHRvIHVzZSBSQ1UuIExhc3RseSwgaXQgdXBkYXRlcyBgY3JlYXRlX2VudHJ5YCB0byB1c2UgYHBhcnNlX21hZ2ljX2ZpZWxkc2AgYW5kIGBwYXJzZV9leHRlbnNpb25fZmllbGRzYC4KCkxldCYjMzk7cyByZWZpbmUgdGhlIGxpc3QuIEkgaGF2ZSBgbG9hZF9taXNjX2JpbmFyeWAsIGBibV9yZWdpc3Rlcl93cml0ZWAsIGBibV9lbnRyeV93cml0ZWAsIGBibV9zdGF0dXNfd3JpdGVgLCBgYm1fdW5saW5rYCwgYW5kIGBibV9lbnRyeV9zaG93YC4KCkkgaGFkIGBjcmVhdGVfZW50cnlgIGxpc3RlZCwgYnV0IHRoYXQmIzM5O3Mgc3RhdGljLiBCdXQgc3l6a2FsbGVyIGNhbiByZWFjaCBzdGF0aWMgZnVuY3Rpb25zIGlmIHJlYWNoYWJsZS4gQnV0LCBjb25zaWRlcmluZyBGb2N1c1N5bWJvbHMgaXMgYWJvdXQgY292ZXJhZ2UgZ3VpZGFuY2UgYW5kIGNvcnB1cyBwcmlvcml0aXphdGlvbiwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gbGlzdCB0aGUgcmVsZXZhbnQgc3lzY2FsbCBlbnRyeSBwb2ludHMgYW5kIHRoZSB0b3AtbGV2ZWwgaGFuZGxlcnMgYW5kIHRoYXQmIzM5O3MgY292ZXJlZCBpbiB0aGUgbGlzdCBhYm92ZS4gYGJtX3JlZ2lzdGVyX3dyaXRlYCBjYWxscyBgY3JlYXRlX2VudHJ5YC4KClNvIHRoZSBmaW5hbCBsaXN0IGZvciB0aGUgZnV6emVyOgoqICAgYGxvYWRfbWlzY19iaW5hcnlgCiogICBgYm1fcmVnaXN0ZXJfd3JpdGVgCiogICBgYm1fZW50cnlfd3JpdGVgCiogICBgYm1fc3RhdHVzX3dyaXRlYAoqICAgYGJtX3VubGlua2AKKiAgIGBibV9lbnRyeV9zaG93YAoKVGhlIHJlYXNvbmluZyBoZXJlIGlzIHRoYXQgdGhlIHBhdGNoIGZ1bmRhbWVudGFsbHkgcmVmYWN0b3JzIHRoZSBgYmluZm10X21pc2NgIGZpbGVzeXN0ZW0gd2l0aCBSQ1UtYmFzZWQgbG9va3Vwcywgc3BpbmxvY2sgYmFzZWQgbG9ja2luZywgYHNlcV9maWxlYCBmb3IgZW50cnkgcmVhZGluZywgYW5kIGFkZHMgZW50cnkgdW5saW5raW5nLCB3aGljaCBhcmUgYWxsIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byBpbXBvcnRhbnQga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBwcmV2ZW50IHJlZ3Jlc3Npb25zLCBtZW1vcnkgbGVha3MsIG9yIGNvbmN1cnJlbmN5IHByb2JsZW1zLiBUaW1lIHRvIHNldCB0aGVzZSByZXN1bHRzIGFuZCBwdXNoIGZvcndhcmQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTAgMjA6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JJTkZNVF9NSVNDJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bG9hZF9taXNjX2JpbmFyeSYjMzQ7LAogICAgJiMzNDtibV9yZWdpc3Rlcl93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV93cml0ZSYjMzQ7LAogICAgJiMzNDtibV9zdGF0dXNfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fdW5saW5rJiMzNDssCiAgICAmIzM0O2JtX2VudHJ5X3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2lnbmlmaWNhbnRseSByZWZhY3RvcnMgdGhlIGJpbmZtdF9taXNjIGZpbGVzeXN0ZW0sIGludHJvZHVjaW5nIFJDVS1iYXNlZCBsb29rdXBzLCBjaGFuZ2luZyBpbnRlcm5hbCBsb2NraW5nIGZyb20gcndsb2NrIHRvIHNwaW5sb2NrLCBjb252ZXJ0aW5nIGVudHJ5IHJlYWRpbmcgdG8gdXNlIHNlcV9maWxlLCBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIHJlbW92aW5nIGVudHJpZXMgdmlhIHVubGluaygyKS4gVGhlc2UgYXJlIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgdGhhdCBzaG91bGQgYmUgZnV6emVkIHRvIGVuc3VyZSBubyByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBpc3N1ZXMgd2VyZSBpbnRyb2R1Y2VkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCSU5GTVRfTUlTQyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2xvYWRfbWlzY19iaW5hcnkmIzM0OywKICAgICYjMzQ7Ym1fcmVnaXN0ZXJfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fZW50cnlfd3JpdGUmIzM0OywKICAgICYjMzQ7Ym1fc3RhdHVzX3dyaXRlJiMzNDssCiAgICAmIzM0O2JtX3VubGluayYjMzQ7LAogICAgJiMzNDtibV9lbnRyeV9zaG93JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDIwOjMyOjM4Ljc4NDYxMjIwNVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNDEwOTQ3MzE1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwiYm1fZW50cnlfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMjA6MzI6MzguNzg0NjE5MDY1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTc2MDE3MTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCBhODc3ZGIxYmZiN2QyZDhhNWJjZmVhMDNmM2ZjMTEyYzg0MDNhZDMyXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgSnVsIDEwIDIwOjMyOjM3IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG5pbmRleCBjMGEzNGZiZjgwMjJiNS4uMzA2ZWY0OGY1ZGU2ZGQgMTAwNjQ0XFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcXG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxcbkBAIC0xMzMsNyArMTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxcbiBDYXR0aW5nIHRoZSBmaWxlIHRlbGxzIHlvdSB0aGUgY3VycmVudCBzdGF0dXMgb2YgYGBiaW5mbXRfbWlzYy90aGVfZW50cnlgYC5cXG4gXFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcXG4tb3IgYGAvcHJvYy9zeXMvZnMvYmluZm10X21pc2Mvc3RhdHVzYGAuXFxuK29yIGBgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjL3N0YXR1c2BgLiBBIHNpbmdsZSBlbnRyeSBjYW4gYWxzbyBiZSByZW1vdmVkXFxuK2J5IHNpbXBseSB1bmxpbmtpbmcgKGBgcm1gYCkgYGAvcHJvYy8uLi4vdGhlX25hbWVgYC5cXG4gXFxuIFxcbiBIaW50c1xcbmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuY1xcbmluZGV4IDg0MzQ5ZmNiOTNmMTNhLi5mNTFkMjcyNjk4NjE2MCAxMDA2NDRcXG4tLS0gYS9mcy9iaW5mbXRfbWlzYy5jXFxuKysrIGIvZnMvYmluZm10X21pc2MuY1xcbkBAIC0xMCw0NSArMTAsNDYgQEBcXG4gXFxuICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgXFxcIjogXFxcIiBmbXRcXG4gXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9rZXJuZWwuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvaGV4LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9tbS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpbmZtdHMuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NsYWIuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JpdG9wcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYml0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jbGVhbnVwLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcmVkLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9jdHlwZS5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZpbGUuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BhZ2VtYXAuaFxcdTAwM2VcXG4tI2luY2x1ZGUgXFx1MDAzY2xpbnV4L25hbWVpLmhcXHUwMDNlXFxuLSNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb3VudC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvZnNfY29udGV4dC5oXFx1MDAzZVxcbi0jaW5jbHVkZSBcXHUwMDNjbGludXgvc3lzY2FsbHMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2ZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9mc19jb250ZXh0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9pbml0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9rc3RydG94LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tYWdpYy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbW9kdWxlLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9wcmludGsuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JjdWxpc3QuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3JlZmNvdW50LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zZXFfZmlsZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9zdHJpbmdfaGVscGVycy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdWFjY2Vzcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvdXNlcl9uYW1lc3BhY2UuaFxcdTAwM2VcXG4gXFxuLSNpbmNsdWRlIFxcXCJpbnRlcm5hbC5oXFxcIlxcbi1cXG4tI2lmZGVmIERFQlVHXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXFxuLSNlbHNlXFxuLSMgZGVmaW5lIFVTRV9ERUJVRyAwXFxuLSNlbmRpZlxcbi1cXG4tZW51bSB7XFxuLVxcdFZFUkJPU0VfU1RBVFVTID0gMSAvKiBtYWtlIGl0IHplcm8gdG8gc2F2ZSA0MDAgYnl0ZXMga2VybmVsIG1lbW9yeSAqL1xcbisvKiBFbnRyeSBzdGF0dXMgYW5kIG1hdGNoIHR5cGUgYml0IG51bWJlcnMuICovXFxuK2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XFxuK1xcdE1JU0NfRk1UX0VOQUJMRURfQklUXFx0PSAwLFxcbitcXHRNSVNDX0ZNVF9NQUdJQ19CSVRcXHQ9IDEsXFxuIH07XFxuIFxcbi1lbnVtIHtFbmFibGVkLCBNYWdpY307XFxuLSNkZWZpbmUgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjAgKDFVTCBcXHUwMDNjXFx1MDAzYyAzMSlcXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0JJTkFSWSAoMVVMIFxcdTAwM2NcXHUwMDNjIDMwKVxcbi0jZGVmaW5lIE1JU0NfRk1UX0NSRURFTlRJQUxTICgxVUwgXFx1MDAzY1xcdTAwM2MgMjkpXFxuLSNkZWZpbmUgTUlTQ19GTVRfT1BFTl9GSUxFICgxVUwgXFx1MDAzY1xcdTAwM2MgMjgpXFxuKy8qIEVudHJ5IGJlaGF2aW9yIGZsYWdzLCBmaXhlZCBhdCByZWdpc3RyYXRpb24gdGltZS4gKi9cXG4rZW51bSBiaW5mbXRfbWlzY19lbnRyeV9mbGFncyB7XFxuK1xcdE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwXFx0PSAoMVUgXFx1MDAzY1xcdTAwM2MgMzEpLFxcbitcXHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDMwKSxcXG4rXFx0TUlTQ19GTVRfQ1JFREVOVElBTFNcXHQ9ICgxVSBcXHUwMDNjXFx1MDAzYyAyOSksXFxuK1xcdE1JU0NfRk1UX09QRU5fRklMRVxcdD0gKDFVIFxcdTAwM2NcXHUwMDNjIDI4KSxcXG4rfTtcXG4gXFxuLXR5cGVkZWYgc3RydWN0IHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xcbitzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkge1xcbitcXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xcbiBcXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcdFxcdC8qIHR5cGUsIHN0YXR1cywgZXRjLiAqL1xcbiBcXHRpbnQgb2Zmc2V0O1xcdFxcdFxcdC8qIG9mZnNldCBvZiBtYWdpYyAqL1xcbiBcXHRpbnQgc2l6ZTtcXHRcXHRcXHQvKiBzaXplIG9mIG1hZ2ljL21hc2sgKi9cXG5AQCAtNTksOSArNjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XFxuIFxcdHN0cnVjdCBkZW50cnkgKmRlbnRyeTtcXG4gXFx0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xcbiBcXHRyZWZjb3VudF90IHVzZXJzO1xcdFxcdC8qIHN5bmMgcmVtb3ZhbCB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSAqL1xcbi19IE5vZGU7XFxuLVxcbi1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYm1fZnNfdHlwZTtcXG4rXFx0c3RydWN0IHJjdV9oZWFkIHJjdTtcXG4rXFx0Y2hhciBidWZbXTtcXHRcXHRcXHQvKiByZWdpc3RlciBzdHJpbmcsIGZpZWxkcyBwb2ludCBpbiBoZXJlICovXFxuK307XFxuIFxcbiAvKlxcbiAgKiBNYXggbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzdHJpbmcuICBEZXRlcm1pbmVkIGJ5OlxcbkBAIC03NCwxMCArNzUsMzYgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqICAtIGludGVycDogfjUwIGJ5dGVzXFxuICAqICAtIGZsYWdzOiAgNSBieXRlc1xcbiAgKiBSb3VuZCB0aGF0IHVwIGEgYml0LCBhbmQgdGhlbiBiYWNrIG9mZiB0byBob2xkIHRoZSBpbnRlcm5hbCBkYXRhXFxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cXG4rICogKGxpa2Ugc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5KS5cXG4gICovXFxuICNkZWZpbmUgTUFYX1JFR0lTVEVSX0xFTkdUSCAxOTIwXFxuIFxcbisvKiBUcmFpbGluZyBkZWxpbWl0ZXIgcGFkIHNvIGZpZWxkIHBhcnNpbmcgYWx3YXlzIHRlcm1pbmF0ZXMgYXQgYSBkZWxpbWl0ZXIuICovXFxuKyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxcbitcXG4rLyogQ2hlY2sgaWYgQGUncyBtYWdpYyBtYXRjaGVzIEBicHJtJ3MgYnVmZmVyLCBhcHBseWluZyB0aGUgbWFzayBpZiBzZXQuICovXFxuK3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxcbitcXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbit7XFxuK1xcdGNvbnN0IGNoYXIgKnMgPSBicHJtLVxcdTAwM2VidWYgKyBlLVxcdTAwM2VvZmZzZXQ7XFxuK1xcdGludCBpO1xcbitcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRyZXR1cm4gIW1lbWNtcChzLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaSsrKVxcbitcXHRcXHRpZiAoKHNbaV0gXiBlLVxcdTAwM2VtYWdpY1tpXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2ldKVxcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbisvKiBDaGVjayBpZiBAZSdzIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIG1hdGNoZXMgQGV4dCwgTlVMTCBpZiB0aGVyZSBpcyBub25lLiAqL1xcbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXFxuK1xcdFxcdFxcdFxcdCAgICBjb25zdCBjaGFyICpleHQpXFxuK3tcXG4rXFx0cmV0dXJuIGV4dCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBleHQpO1xcbit9XFxuK1xcbiAvKipcXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxcbiAgKiBAbWlzYzogaGFuZGxlIHRvIGJpbmZtdF9taXNjIGluc3RhbmNlXFxuQEAgLTg2LDQzICsxMTMsMzAgQEAgc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XFxuICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeVxcbiAgKiB0eXBlIGhhbmRsZXJzLlxcbiAgKlxcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cXG4rICpcXG4gICogUmV0dXJuOiBiaW5hcnkgdHlwZSBsaXN0IGVudHJ5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZVxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuLVxcdFxcdFxcdFxcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKlxcbitzZWFyY2hfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxcbiB7XFxuLVxcdGNoYXIgKnAgPSBzdHJyY2hyKGJwcm0tXFx1MDAzZWludGVycCwgJy4nKTtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0Y2hhciAqZG90ID0gc3RycmNocihicHJtLVxcdTAwM2VpbnRlcnAsICcuJyk7XFxuK1xcdGNvbnN0IGNoYXIgKmV4dCA9IGRvdCA/IGRvdCArIDEgOiBOVUxMO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuIFxcbiBcXHQvKiBXYWxrIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy4gKi9cXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdCkge1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXHRcXHRpbnQgajtcXG4tXFxuK1xcdGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlLCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbm9kZSkge1xcbiBcXHRcXHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXFxuLVxcdFxcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4rXFx0XFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSlcXG4gXFx0XFx0XFx0Y29udGludWU7XFxuIFxcbi1cXHRcXHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cXG4tXFx0XFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKSkge1xcbi1cXHRcXHRcXHRpZiAocCBcXHUwMDI2XFx1MDAyNiAhc3RyY21wKGUtXFx1MDAzZW1hZ2ljLCBwICsgMSkpXFxuK1xcdFxcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXFxuIFxcdFxcdFxcdFxcdHJldHVybiBlO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LyogRG8gbWF0Y2hpbmcgYmFzZWQgb24gbWFnaWMgXFx1MDAyNiBtYXNrLiAqL1xcbi1cXHRcXHRzID0gYnBybS1cXHUwMDNlYnVmICsgZS1cXHUwMDNlb2Zmc2V0O1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzaykge1xcbi1cXHRcXHRcXHRmb3IgKGogPSAwOyBqIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgaisrKVxcbi1cXHRcXHRcXHRcXHRpZiAoKCpzKysgXiBlLVxcdTAwM2VtYWdpY1tqXSkgXFx1MDAyNiBlLVxcdTAwM2VtYXNrW2pdKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0Zm9yIChqID0gMDsgaiBcXHUwMDNjIGUtXFx1MDAzZXNpemU7IGorKylcXG4tXFx0XFx0XFx0XFx0aWYgKCgqcysrIF4gZS1cXHUwMDNlbWFnaWNbal0pKVxcbi1cXHRcXHRcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0XFx0aWYgKGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uKGUsIGV4dCkpXFxuK1xcdFxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGlmIChqID09IGUtXFx1MDAzZXNpemUpXFxuLVxcdFxcdFxcdHJldHVybiBlO1xcbiBcXHR9XFxuIFxcbiBcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMTM0LDY0ICsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuICAqIEBicHJtOiBiaW5hcnkgZm9yIHdoaWNoIHdlIGFyZSBsb29raW5nIGZvciBhIGhhbmRsZXJcXG4gICpcXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXFxuLSAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS5cXG4rICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLiBUaGVcXG4rICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXFxuKyAqIGEgcmVzdGFydGVkIHNlYXJjaCBjYW5ub3QgZmluZCBhbiB1bmxpbmtlZCBlbnRyeSBhZ2FpbiBzbyB0aGUgcmV0cnkgbG9vcFxcbisgKiBpcyBib3VuZGVkLlxcbiAgKlxcbiAgKiBSZXR1cm46IGJpbmFyeSB0eXBlIGxpc3QgZW50cnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlXFxuICAqL1xcbi1zdGF0aWMgTm9kZSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4tXFx0XFx0XFx0XFx0c3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xcbiBcXG4tXFx0cmVhZF9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xcbi1cXHRpZiAoZSlcXG4tXFx0XFx0cmVmY291bnRfaW5jKFxcdTAwMjZlLVxcdTAwM2V1c2Vycyk7XFxuLVxcdHJlYWRfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRndWFyZChyY3UpKCk7XFxuK1xcdGRvIHtcXG4rXFx0XFx0ZSA9IHNlYXJjaF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4rXFx0fSB3aGlsZSAoZSBcXHUwMDI2XFx1MDAyNiAhcmVmY291bnRfaW5jX25vdF96ZXJvKFxcdTAwMjZlLVxcdTAwM2V1c2VycykpO1xcbiBcXHRyZXR1cm4gZTtcXG4gfVxcbiBcXG4gLyoqXFxuLSAqIHB1dF9iaW5mbXRfaGFuZGxlciAtIHB1dCBiaW5hcnkgaGFuZGxlciBub2RlXFxuLSAqIEBlOiBub2RlIHRvIHB1dFxcbisgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcXG4rICogQGU6IGVudHJ5IHRvIHB1dFxcbiAgKlxcbi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xcbisgKiBGcmVlIGVudHJ5IHN5bmNpbmcgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgYW5kIGRlZmVyIGZpbmFsIGZyZWUgdG9cXG4gICogbG9hZF9taXNjX2JpbmFyeSgpIGluIGNhc2UgaXQgaXMgdXNpbmcgdGhlIGJpbmFyeSB0eXBlIGhhbmRsZXIgd2Ugd2VyZVxcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxcbiAgKi9cXG4tc3RhdGljIHZvaWQgcHV0X2JpbmZtdF9oYW5kbGVyKE5vZGUgKmUpXFxuK3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXFxuIHtcXG4gXFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcXHUwMDI2ZS1cXHUwMDNldXNlcnMpKSB7XFxuLVxcdFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fRklMRSlcXG4rXFx0XFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XFxuK1xcdFxcdFxcdGV4ZV9maWxlX2FsbG93X3dyaXRlX2FjY2VzcyhlLVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZS1cXHUwMDNlaW50ZXJwX2ZpbGUsIE5VTEwpO1xcbi1cXHRcXHRrZnJlZShlKTtcXG4rXFx0XFx0fVxcbitcXHRcXHQvKiBMb2NrbGVzcyB3YWxrZXJzIG1heSBzdGlsbCBkZXJlZmVyZW5jZSB0aGlzIGVudHJ5LiAqL1xcbitcXHRcXHRrZnJlZV9yY3UoZSwgcmN1KTtcXG4gXFx0fVxcbiB9XFxuIFxcbitERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXFxuK1xcbiAvKipcXG4tICogbG9hZF9iaW5mbXRfbWlzYyAtIGxvYWQgdGhlIGJpbmZtdF9taXNjIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxcbisgKiBjdXJyZW50X2JpbmZtdF9taXNjIC0gZ2V0IHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBvZiB0aGUgY2FsbGVyJ3MgdXNlciBuYW1lc3BhY2VcXG4gICpcXG4tICogVG8gYmUgY2FsbGVkIGluIGxvYWRfbWlzY19iaW5hcnkoKSB0byBsb2FkIHRoZSByZWxldmFudCBzdHJ1Y3QgYmluZm10X21pc2MuXFxuLSAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgY2FuIG1ha2UgdXNlXFxuLSAqIG9mIGl0cyBhbmNlc3RvcidzIGJpbmZtdF9taXNjIGhhbmRsZXJzLiBUaGlzIG1pbWlja3MgdGhlIGJlaGF2aW9yIG9mXFxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXFxuLSAqIGF2YWlsYWJsZSB0byBhbGwgdXNlciBhbmQgdXNlciBuYW1lc3BhY2VzIG9uIHRoZSBzeXN0ZW0uXFxuKyAqIElmIGEgdXNlciBuYW1lc3BhY2UgZG9lc24ndCBoYXZlIGl0cyBvd24gYmluZm10X21pc2MgbW91bnQgaXQgdXNlcyB0aGVcXG4rICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxcbisgKiBwcmUtbmFtZXNwYWNlZCBiaW5mbXRfbWlzYyB3aGVyZSBhbGwgcmVnaXN0ZXJlZCBoYW5kbGVycyB3ZXJlIGF2YWlsYWJsZVxcbisgKiB0byBhbGwgdXNlcnMgYW5kIHVzZXIgbmFtZXNwYWNlcyBvbiB0aGUgc3lzdGVtLiBUaGUgaW5pdCB1c2VyIG5hbWVzcGFjZVxcbisgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxcbisgKiBwcmFjdGljZS5cXG4gICpcXG4gICogUmV0dXJuOiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlcidzIHVzZXIgbmFtZXNwYWNlXFxuICAqL1xcbi1zdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcXG4ge1xcbiBcXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4gXFxuLVxcdHVzZXJfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTtcXG4tXFx0d2hpbGUgKHVzZXJfbnMpIHtcXG4rXFx0Zm9yICh1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7IHVzZXJfbnM7IHVzZXJfbnMgPSB1c2VyX25zLVxcdTAwM2VwYXJlbnQpIHtcXG4gXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIGluIGJtX2ZpbGxfc3VwZXIoKS4gKi9cXG4gXFx0XFx0bWlzYyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNnVzZXJfbnMtXFx1MDAzZWJpbmZtdF9taXNjKTtcXG4gXFx0XFx0aWYgKG1pc2MpXFxuIFxcdFxcdFxcdHJldHVybiBtaXNjO1xcbi1cXG4tXFx0XFx0dXNlcl9ucyA9IHVzZXJfbnMtXFx1MDAzZXBhcmVudDtcXG4gXFx0fVxcbiBcXG4gXFx0cmV0dXJuIFxcdTAwMjZpbml0X2JpbmZtdF9taXNjO1xcbkBAIC0yMDIsMzAgKzIyMSwyOSBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICpsb2FkX2JpbmZtdF9taXNjKHZvaWQpXFxuICAqL1xcbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4ge1xcbi1cXHROb2RlICpmbXQ7XFxuLVxcdHN0cnVjdCBmaWxlICppbnRlcnBfZmlsZSA9IE5VTEw7XFxuLVxcdGludCByZXR2YWwgPSAtRU5PRVhFQztcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XFxuIFxcdHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYztcXG4rXFx0aW50IHJldHZhbDtcXG4gXFxuLVxcdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XFxuLVxcdGlmICghbWlzYy1cXHUwMDNlZW5hYmxlZClcXG4tXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4rXFx0bWlzYyA9IGN1cnJlbnRfYmluZm10X21pc2MoKTtcXG4rXFx0aWYgKCFSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkpXFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdGZtdCA9IGdldF9iaW5mbXRfaGFuZGxlcihtaXNjLCBicHJtKTtcXG4gXFx0aWYgKCFmbXQpXFxuLVxcdFxcdHJldHVybiByZXR2YWw7XFxuK1xcdFxcdHJldHVybiAtRU5PRVhFQztcXG4gXFxuIFxcdC8qIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIHRoZSBmaWxlIGFmdGVyIGV4ZWMgKi9cXG4tXFx0cmV0dmFsID0gLUVOT0VOVDtcXG4gXFx0aWYgKGJwcm0tXFx1MDAzZWludGVycF9mbGFncyBcXHUwMDI2IEJJTlBSTV9GTEFHU19QQVRIX0lOQUNDRVNTSUJMRSlcXG4tXFx0XFx0Z290byByZXQ7XFxuK1xcdFxcdHJldHVybiAtRU5PRU5UO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkge1xcbiBcXHRcXHRicHJtLVxcdTAwM2VpbnRlcnBfZmxhZ3MgfD0gQklOUFJNX0ZMQUdTX1BSRVNFUlZFX0FSR1YwO1xcbiBcXHR9IGVsc2Uge1xcbiBcXHRcXHRyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7XFxuIFxcdFxcdGlmIChyZXR2YWwpXFxuLVxcdFxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXHR9XFxuIFxcbiBcXHRpZiAoZm10LVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxcbkBAIC0yMzQsNTcgKzI1Miw0OCBAQCBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcXG4gXFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cXG4gXFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGJwcm0tXFx1MDAzZWludGVycCwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xcbiBcXHRyZXR2YWwgPSBjb3B5X3N0cmluZ19rZXJuZWwoZm10LVxcdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XFxuIFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0YnBybS1cXHUwMDNlYXJnYysrO1xcbiBcXG4gXFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXFxuIFxcdHJldHZhbCA9IGJwcm1fY2hhbmdlX2ludGVycChmbXQtXFx1MDAzZWludGVycHJldGVyLCBicHJtKTtcXG4gXFx0aWYgKHJldHZhbCBcXHUwMDNjIDApXFxuLVxcdFxcdGdvdG8gcmV0O1xcbitcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0ZJTEUpIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBmaWxlX2Nsb25lX29wZW4oZm10LVxcdTAwM2VpbnRlcnBfZmlsZSk7XFxuLVxcdFxcdGlmICghSVNfRVJSKGludGVycF9maWxlKSlcXG4tXFx0XFx0XFx0ZGVueV93cml0ZV9hY2Nlc3MoaW50ZXJwX2ZpbGUpO1xcbitcXHRcXHRpZiAoIUlTX0VSUihpbnRlcnBfZmlsZSkpIHtcXG4rXFx0XFx0XFx0aW50IGVyciA9IGV4ZV9maWxlX2Rlbnlfd3JpdGVfYWNjZXNzKGludGVycF9maWxlKTtcXG4rXFxuK1xcdFxcdFxcdGlmIChlcnIpIHtcXG4rXFx0XFx0XFx0XFx0ZnB1dChpbnRlcnBfZmlsZSk7XFxuK1xcdFxcdFxcdFxcdGludGVycF9maWxlID0gRVJSX1BUUihlcnIpO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdH1cXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0aW50ZXJwX2ZpbGUgPSBvcGVuX2V4ZWMoZm10LVxcdTAwM2VpbnRlcnByZXRlcik7XFxuIFxcdH1cXG4tXFx0cmV0dmFsID0gUFRSX0VSUihpbnRlcnBfZmlsZSk7XFxuIFxcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxcbi1cXHRcXHRnb3RvIHJldDtcXG4rXFx0XFx0cmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpO1xcbiBcXG4gXFx0YnBybS1cXHUwMDNlaW50ZXJwcmV0ZXIgPSBpbnRlcnBfZmlsZTtcXG4gXFx0aWYgKGZtdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcXG4gXFx0XFx0YnBybS1cXHUwMDNlZXhlY2ZkX2NyZWRzID0gMTtcXG4tXFxuLVxcdHJldHZhbCA9IDA7XFxuLXJldDpcXG4tXFxuLVxcdC8qXFxuLVxcdCAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvXFxuLVxcdCAqIGxvYWRfbWlzY19iaW5hcnkoKSB3aWxsIGhhdmUgZmluaXNoZWQuIFdlIGFsc28ga25vd1xcbi1cXHQgKiB0aGF0IGZvciB0aGUgcmVmY291bnQgdG8gYmUgemVybyBzb21lb25lIG11c3QgaGF2ZSBjb25jdXJlbnRseVxcbi1cXHQgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0J3Mgb3VyIGpvYiB0b1xcbi1cXHQgKiBmcmVlIGl0Llxcbi1cXHQgKi9cXG4tXFx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XFxuLVxcbi1cXHRyZXR1cm4gcmV0dmFsO1xcbitcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4gLyogQ29tbWFuZCBwYXJzZXJzICovXFxuIFxcbiAvKlxcbi0gKiBwYXJzZXMgYW5kIGNvcGllcyBvbmUgYXJndW1lbnQgZW5jbG9zZWQgaW4gZGVsIGZyb20gKnNwIHRvICpkcCxcXG4tICogcmVjb2duaXNpbmcgdGhlIFxcXFx4IHNwZWNpYWwuXFxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxcbi0gKiBlcnJvciAoYW5kIHNldHMgZXJyKSBvciBudWxsIGFyZ3VtZW50IGxlbmd0aC5cXG4rICogU2NhbiB0aGUgYXJndW1lbnQgc3RhcnRpbmcgYXQgQHMgdXAgdG8gdGhlIGRlbGltaXRlciBAZGVsLCByZWNvZ25pc2luZ1xcbisgKiB0aGUgXFxcXHggZXNjYXBlLiBUZXJtaW5hdGVzIHRoZSBhcmd1bWVudCB3aXRoIGEgTlVMIGFuZCByZXR1cm5zIGEgcG9pbnRlclxcbisgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxcbiAgKi9cXG4gc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpXFxuIHtcXG5AQCAtMjk5LDQ2ICszMDgsMTIzIEBAIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxcbiBcXHRcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuLVxcdHNbLTFdID0nXFxcXDAnO1xcbitcXHRzWy0xXSA9ICdcXFxcMCc7XFxuIFxcdHJldHVybiBzO1xcbiB9XFxuIFxcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXFxuK3N0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnAsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHRjaGFyICpwID0gc2ZzO1xcbi1cXHRpbnQgY29udCA9IDE7XFxuLVxcbi1cXHQvKiBzcGVjaWFsIGZsYWdzICovXFxuLVxcdHdoaWxlIChjb250KSB7XFxuK1xcdGZvciAoOzsgcCsrKSB7XFxuIFxcdFxcdHN3aXRjaCAoKnApIHtcXG4gXFx0XFx0Y2FzZSAnUCc6XFxuIFxcdFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogZmxhZzogUCAocHJlc2VydmUgYXJndjApXFxcXG5cXFwiKTtcXG4tXFx0XFx0XFx0cCsrO1xcbiBcXHRcXHRcXHRlLVxcdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMDtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ08nOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxcXFxuXFxcIik7XFxuLVxcdFxcdFxcdHArKztcXG4gXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7XFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRjYXNlICdDJzpcXG4gXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBmbGFnOiBDIChwcmVzZXJ2ZSBjcmVkcylcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuLVxcdFxcdFxcdC8qIHRoaXMgZmxhZ3MgYWxzbyBpbXBsaWVzIHRoZVxcbi1cXHRcXHRcXHQgICBvcGVuLWJpbmFyeSBmbGFnICovXFxuLVxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8XFxuLVxcdFxcdFxcdFxcdFxcdE1JU0NfRk1UX09QRU5fQklOQVJZKTtcXG4rXFx0XFx0XFx0LyogQyBpbXBsaWVzIE8gKi9cXG4rXFx0XFx0XFx0ZS1cXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfQ1JFREVOVElBTFMgfCBNSVNDX0ZNVF9PUEVOX0JJTkFSWTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGNhc2UgJ0YnOlxcbiBcXHRcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXFxcblxcXCIpO1xcbi1cXHRcXHRcXHRwKys7XFxuIFxcdFxcdFxcdGUtXFx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX09QRU5fRklMRTtcXG4gXFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdGRlZmF1bHQ6XFxuLVxcdFxcdFxcdGNvbnQgPSAwO1xcbitcXHRcXHRcXHRyZXR1cm4gcDtcXG4gXFx0XFx0fVxcbiBcXHR9XFxuK31cXG4rXFxuKy8qIFBhcnNlIHRoZSAnb2Zmc2V0JywgJ21hZ2ljJyBhbmQgJ21hc2snIGZpZWxkcyBvZiBhbiAnTScgZW50cnkuICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9tYWdpY19maWVsZHMoc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLCBjaGFyICpwLCBjaGFyIGRlbClcXG4re1xcbitcXHRjaGFyICpzO1xcbitcXG4rXFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcylcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpzID0gJ1xcXFwwJztcXG4rXFx0aWYgKHAgIT0gcykge1xcbitcXHRcXHRpZiAoa3N0cnRvaW50KHAsIDEwLCBcXHUwMDI2ZS1cXHUwMDNlb2Zmc2V0KSB8fCBlLVxcdTAwM2VvZmZzZXQgXFx1MDAzYyAwKVxcbitcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0fVxcbitcXHRwID0gcyArIDE7XFxuK1xcdHByX2RlYnVnKFxcXCJyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXFxcblxcXCIsIGUtXFx1MDAzZW9mZnNldCk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZC4gKi9cXG4rXFx0ZS1cXHUwMDNlbWFnaWMgPSBwO1xcbitcXHRwID0gc2NhbmFyZyhwLCBkZWwpO1xcbitcXHRpZiAoIXAgfHwgIWUtXFx1MDAzZW1hZ2ljWzBdKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0cHJpbnRfaGV4X2R1bXBfZGVidWcoXFxuK1xcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tyYXddOiBcXFwiLFxcbitcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFnaWMsIHAgLSBlLVxcdTAwM2VtYWdpYywgdHJ1ZSk7XFxuK1xcbitcXHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRlLVxcdTAwM2VtYXNrID0gcDtcXG4rXFx0cCA9IHNjYW5hcmcocCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYXNrWzBdKSB7XFxuK1xcdFxcdGUtXFx1MDAzZW1hc2sgPSBOVUxMO1xcbitcXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6ICBtYXNrW3Jhd106IG5vbmVcXFxcblxcXCIpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW3Jhd106IFxcXCIsXFxuK1xcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYXNrLCBwIC0gZS1cXHUwMDNlbWFzaywgdHJ1ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdC8qXFxuK1xcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy4gTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZFxcbitcXHQgKiBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbSBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgd2lsbCBzdG9wIGF0XFxuK1xcdCAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuXFxuK1xcdCAqL1xcbitcXHRlLVxcdTAwM2VzaXplID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrIFxcdTAwMjZcXHUwMDI2IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cXHUwMDNlc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChlLVxcdTAwM2VzaXplIFxcdTAwM2UgQklOUFJNX0JVRl9TSVpFIHx8IEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuK1xcdHByaW50X2hleF9kdW1wX2RlYnVnKFxcbitcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFxcXCIsXFxuK1xcdFxcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVxcdTAwM2VtYWdpYywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdGlmIChlLVxcdTAwM2VtYXNrKVxcbitcXHRcXHRwcmludF9oZXhfZHVtcF9kZWJ1ZyhcXG4rXFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcXFwiLFxcbitcXHRcXHRcXHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cXHUwMDNlbWFzaywgZS1cXHUwMDNlc2l6ZSwgdHJ1ZSk7XFxuK1xcdHJldHVybiBwO1xcbit9XFxuK1xcbisvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZCBvZiBhbiAnRScgZW50cnk6IHRoZSBmaWxlbmFtZSBleHRlbnNpb24uICovXFxuK3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcXG4rXFx0XFx0XFx0XFx0ICAgIGNoYXIgZGVsKVxcbit7XFxuK1xcdC8qIFNraXAgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbiBcXG4rXFx0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXFxuK1xcdGUtXFx1MDAzZW1hZ2ljID0gcDtcXG4rXFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbitcXHRpZiAoIXApXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHQqcCsrID0gJ1xcXFwwJztcXG4rXFx0aWYgKCFlLVxcdTAwM2VtYWdpY1swXSB8fCBzdHJjaHIoZS1cXHUwMDNlbWFnaWMsICcvJykpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IGV4dGVuc2lvbjogeyVzfVxcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbitcXG4rXFx0LyogU2tpcCB0aGUgJ21hc2snIGZpZWxkLiAqL1xcbitcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuK1xcdGlmICghcClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRyZXR1cm4gcDtcXG4gfVxcbiBcXG5AQCAtMzQ3LDUwICs0MzMsNDggQEAgc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqc2ZzLCBOb2RlICplKVxcbiAgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncydcXG4gICogd2hlcmUgdGhlICc6JyBpcyB0aGUgSUZTLCB0aGF0IGNhbiBiZSBjaG9zZW4gd2l0aCB0aGUgZmlyc3QgY2hhclxcbiAgKi9cXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBzaXplX3QgY291bnQpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4tXFx0aW50IG1lbXNpemUsIGVycjtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRjaGFyICpidWYsICpwO1xcbiBcXHRjaGFyIGRlbDtcXG4gXFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogcmVjZWl2ZWQgJXp1IGJ5dGVzXFxcXG5cXFwiLCBjb3VudCk7XFxuIFxcbiBcXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cXG4tXFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0aWYgKChjb3VudCBcXHUwMDNjIDExKSB8fCAoY291bnQgXFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tXFx0ZXJyID0gLUVOT01FTTtcXG4tXFx0bWVtc2l6ZSA9IHNpemVvZihOb2RlKSArIGNvdW50ICsgODtcXG4tXFx0ZSA9IGttYWxsb2MobWVtc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4rXFx0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCArIE1JU0NfREVMSU1fUEFEKSxcXG4rXFx0XFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuIFxcdGlmICghZSlcXG4tXFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9NRU0pO1xcbiBcXG4tXFx0cCA9IGJ1ZiA9IChjaGFyICopZSArIHNpemVvZihOb2RlKTtcXG4rXFx0cCA9IGJ1ZiA9IGUtXFx1MDAzZWJ1ZjtcXG4gXFxuLVxcdG1lbXNldChlLCAwLCBzaXplb2YoTm9kZSkpO1xcbitcXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKCplKSk7XFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxcbi1cXHRcXHRnb3RvIGVmYXVsdDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuIFxcbi1cXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltZXRlciAqL1xcbitcXHRkZWwgPSAqcCsrO1xcdC8qIGRlbGltaXRlciAqL1xcbiBcXG4gXFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cXFxcblxcXCIsIGRlbCwgZGVsKTtcXG4gXFxuIFxcdC8qIFBhZCB0aGUgYnVmZmVyIHdpdGggdGhlIGRlbGltIHRvIHNpbXBsaWZ5IHBhcnNpbmcgYmVsb3cuICovXFxuLVxcdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCA4KTtcXG4rXFx0bWVtc2V0KGJ1ZiArIGNvdW50LCBkZWwsIE1JU0NfREVMSU1fUEFEKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnbmFtZScgZmllbGQuICovXFxuIFxcdGUtXFx1MDAzZW5hbWUgPSBwO1xcbiBcXHRwID0gc3RyY2hyKHAsIGRlbCk7XFxuIFxcdGlmICghcClcXG4tXFx0XFx0Z290byBlaW52YWw7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXHQqcCsrID0gJ1xcXFwwJztcXG4gXFx0aWYgKCFlLVxcdTAwM2VuYW1lWzBdIHx8XFxuIFxcdCAgICAhc3RyY21wKGUtXFx1MDAzZW5hbWUsIFxcXCIuXFxcIikgfHxcXG4gXFx0ICAgICFzdHJjbXAoZS1cXHUwMDNlbmFtZSwgXFxcIi4uXFxcIikgfHxcXG4gXFx0ICAgIHN0cmNocihlLVxcdTAwM2VuYW1lLCAnLycpKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcbiBcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG5hbWU6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXG5AQCAtMzk4LDEzNCArNDgyLDMzIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiBcXHRzd2l0Y2ggKCpwKyspIHtcXG4gXFx0Y2FzZSAnRSc6XFxuIFxcdFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogdHlwZTogRSAoZXh0ZW5zaW9uKVxcXFxuXFxcIik7XFxuLVxcdFxcdGUtXFx1MDAzZWZsYWdzID0gMSBcXHUwMDNjXFx1MDAzYyBFbmFibGVkO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCk7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRjYXNlICdNJzpcXG4gXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXFxcblxcXCIpO1xcbi1cXHRcXHRlLVxcdTAwM2VmbGFncyA9ICgxIFxcdTAwM2NcXHUwMDNjIEVuYWJsZWQpIHwgKDEgXFx1MDAzY1xcdTAwM2MgTWFnaWMpO1xcbitcXHRcXHRlLVxcdTAwM2VmbGFncyA9IEJJVChNSVNDX0ZNVF9FTkFCTEVEX0JJVCkgfCBCSVQoTUlTQ19GTVRfTUFHSUNfQklUKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFx0fVxcbiBcXHRpZiAoKnArKyAhPSBkZWwpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0aWYgKHRlc3RfYml0KE1hZ2ljLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKSB7XFxuLVxcdFxcdC8qIEhhbmRsZSB0aGUgJ00nIChtYWdpYykgZm9ybWF0LiAqL1xcbi1cXHRcXHRjaGFyICpzO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdvZmZzZXQnIGZpZWxkLiAqL1xcbi1cXHRcXHRzID0gc3RyY2hyKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcylcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdCpzID0gJ1xcXFwwJztcXG4tXFx0XFx0aWYgKHAgIT0gcykge1xcbi1cXHRcXHRcXHRpbnQgciA9IGtzdHJ0b2ludChwLCAxMCwgXFx1MDAyNmUtXFx1MDAzZW9mZnNldCk7XFxuLVxcdFxcdFxcdGlmIChyICE9IDAgfHwgZS1cXHUwMDNlb2Zmc2V0IFxcdTAwM2MgMClcXG4tXFx0XFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdH1cXG4tXFx0XFx0cCA9IHM7XFxuLVxcdFxcdGlmICgqcCsrKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxcXFxuXFxcIiwgZS1cXHUwMDNlb2Zmc2V0KTtcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0pXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRpZiAoVVNFX0RFQlVHKVxcbi1cXHRcXHRcXHRwcmludF9oZXhfZHVtcF9ieXRlcyhcXG4tXFx0XFx0XFx0XFx0S0JVSUxEX01PRE5BTUUgXFxcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFxcXCIsXFxuLVxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hZ2ljLCBwIC0gZS1cXHUwMDNlbWFnaWMpO1xcbi1cXG4tXFx0XFx0LyogUGFyc2UgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0ZS1cXHUwMDNlbWFzayA9IHA7XFxuLVxcdFxcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XFxuLVxcdFxcdGlmICghcClcXG4tXFx0XFx0XFx0Z290byBlaW52YWw7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFza1swXSkge1xcbi1cXHRcXHRcXHRlLVxcdTAwM2VtYXNrID0gTlVMTDtcXG4tXFx0XFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxcXG5cXFwiKTtcXG4tXFx0XFx0fSBlbHNlIGlmIChVU0VfREVCVUcpXFxuLVxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFzaywgcCAtIGUtXFx1MDAzZW1hc2spO1xcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIERlY29kZSB0aGUgbWFnaWMgXFx1MDAyNiBtYXNrIGZpZWxkcy5cXG4tXFx0XFx0ICogTm90ZTogd2hpbGUgd2UgbWlnaHQgaGF2ZSBhY2NlcHRlZCBlbWJlZGRlZCBOVUwgYnl0ZXMgZnJvbVxcbi1cXHRcXHQgKiBhYm92ZSwgdGhlIHVuZXNjYXBlIGhlbHBlcnMgaGVyZSB3aWxsIHN0b3AgYXQgdGhlIGZpcnN0IG9uZVxcbi1cXHRcXHQgKiBpdCBlbmNvdW50ZXJzLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0ZS1cXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXFx1MDAzZW1hZ2ljLCBVTkVTQ0FQRV9IRVgpO1xcbi1cXHRcXHRpZiAoZS1cXHUwMDNlbWFzayBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgc3RyaW5nX3VuZXNjYXBlX2lucGxhY2UoZS1cXHUwMDNlbWFzaywgVU5FU0NBUEVfSEVYKSAhPSBlLVxcdTAwM2VzaXplKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0aWYgKGUtXFx1MDAzZXNpemUgXFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHxcXG4tXFx0XFx0ICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtXFx1MDAzZXNpemUgXFx1MDAzYyBlLVxcdTAwM2VvZmZzZXQpXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHRwcl9kZWJ1ZyhcXFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcXFxuXFxcIiwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcdFxcdGlmIChVU0VfREVCVUcpIHtcXG4tXFx0XFx0XFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXFxuLVxcdFxcdFxcdFxcdEtCVUlMRF9NT0ROQU1FIFxcXCI6IHJlZ2lzdGVyOiBtYWdpY1tkZWNvZGVkXTogXFxcIixcXG4tXFx0XFx0XFx0XFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cXHUwMDNlbWFnaWMsIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0XFx0aW50IGk7XFxuLVxcdFxcdFxcdFxcdGNoYXIgKm1hc2tlZCA9IGttYWxsb2MoZS1cXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4tXFxuLVxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIGUtXFx1MDAzZW1hc2ssIGUtXFx1MDAzZXNpemUpO1xcbi1cXG4tXFx0XFx0XFx0XFx0aWYgKG1hc2tlZCkge1xcbi1cXHRcXHRcXHRcXHRcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgZS1cXHUwMDNlc2l6ZTsgKytpKVxcbi1cXHRcXHRcXHRcXHRcXHRcXHRtYXNrZWRbaV0gPSBlLVxcdTAwM2VtYWdpY1tpXSBcXHUwMDI2IGUtXFx1MDAzZW1hc2tbaV07XFxuLVxcdFxcdFxcdFxcdFxcdHByaW50X2hleF9kdW1wX2J5dGVzKFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRLQlVJTERfTU9ETkFNRSBcXFwiOiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06IFxcXCIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cXHUwMDNlc2l6ZSk7XFxuLVxcbi1cXHRcXHRcXHRcXHRcXHRrZnJlZShtYXNrZWQpO1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0fVxcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHQvKiBIYW5kbGUgdGhlICdFJyAoZXh0ZW5zaW9uKSBmb3JtYXQuICovXFxuLVxcbi1cXHRcXHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFxuLVxcdFxcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xcbi1cXHRcXHRlLVxcdTAwM2VtYWdpYyA9IHA7XFxuLVxcdFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4tXFx0XFx0aWYgKCFwKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0KnArKyA9ICdcXFxcMCc7XFxuLVxcdFxcdGlmICghZS1cXHUwMDNlbWFnaWNbMF0gfHwgc3RyY2hyKGUtXFx1MDAzZW1hZ2ljLCAnLycpKVxcbi1cXHRcXHRcXHRnb3RvIGVpbnZhbDtcXG4tXFx0XFx0cHJfZGVidWcoXFxcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4tXFxuLVxcdFxcdC8qIFNraXAgdGhlICdtYXNrJyBmaWVsZC4gKi9cXG4tXFx0XFx0cCA9IHN0cmNocihwLCBkZWwpO1xcbi1cXHRcXHRpZiAoIXApXFxuLVxcdFxcdFxcdGdvdG8gZWludmFsO1xcbi1cXHRcXHQqcCsrID0gJ1xcXFwwJztcXG4tXFx0fVxcbitcXHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfTUFHSUNfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0cCA9IHBhcnNlX2V4dGVuc2lvbl9maWVsZHMoZSwgcCwgZGVsKTtcXG4rXFx0aWYgKCFwKVxcbitcXHRcXHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnaW50ZXJwcmV0ZXInIGZpZWxkLiAqL1xcbiBcXHRlLVxcdTAwM2VpbnRlcnByZXRlciA9IHA7XFxuIFxcdHAgPSBzdHJjaHIocCwgZGVsKTtcXG4gXFx0aWYgKCFwKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdCpwKysgPSAnXFxcXDAnO1xcbiBcXHRpZiAoIWUtXFx1MDAzZWludGVycHJldGVyWzBdKVxcbi1cXHRcXHRnb3RvIGVpbnZhbDtcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XFxuIFxcdHByX2RlYnVnKFxcXCJyZWdpc3RlcjogaW50ZXJwcmV0ZXI6IHslc31cXFxcblxcXCIsIGUtXFx1MDAzZWludGVycHJldGVyKTtcXG4gXFxuIFxcdC8qIFBhcnNlIHRoZSAnZmxhZ3MnIGZpZWxkLiAqL1xcbkBAIC01MzMsMjQgKzUxNiwyMiBAQCBzdGF0aWMgTm9kZSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudClcXG4gXFx0aWYgKCpwID09ICdcXFxcbicpXFxuIFxcdFxcdHArKztcXG4gXFx0aWYgKHAgIT0gYnVmICsgY291bnQpXFxuLVxcdFxcdGdvdG8gZWludmFsO1xcbi1cXG4tXFx0cmV0dXJuIGU7XFxuLVxcbi1vdXQ6XFxuLVxcdHJldHVybiBFUlJfUFRSKGVycik7XFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbiBcXG4tZWZhdWx0Olxcbi1cXHRrZnJlZShlKTtcXG4tXFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XFxuLWVpbnZhbDpcXG4tXFx0a2ZyZWUoZSk7XFxuLVxcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xcbitcXHRyZXR1cm4gbm9fZnJlZV9wdHIoZSk7XFxuIH1cXG4gXFxuKy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXFx1MDAzY2VudHJ5XFx1MDAzZSBmaWxlcy4gKi9cXG4rZW51bSBibV9jb21tYW5kIHtcXG4rXFx0Qk1fQ01EX0lHTk9SRSxcXHQvKiBlbXB0eSB3cml0ZSAqL1xcbitcXHRCTV9DTURfRElTQUJMRSxcXHQvKiBcXFwiMFxcXCIgKi9cXG4rXFx0Qk1fQ01EX0VOQUJMRSxcXHQvKiBcXFwiMVxcXCIgKi9cXG4rXFx0Qk1fQ01EX1JFTU9WRSxcXHQvKiBcXFwiLTFcXFwiICovXFxuK307XFxuK1xcbiAvKlxcbi0gKiBTZXQgc3RhdHVzIG9mIGVudHJ5L2JpbmZtdF9taXNjOlxcbi0gKiAnMScgZW5hYmxlcywgJzAnIGRpc2FibGVzIGFuZCAnLTEnIGNsZWFycyBlbnRyeS9iaW5mbXRfbWlzY1xcbisgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICcxJyBlbmFibGVzLFxcbisgKiAnMCcgZGlzYWJsZXMgYW5kICctMScgcmVtb3ZlcyB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMuXFxuICAqL1xcbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxcbiB7XFxuQEAgLTU2MSw2MiArNTQyLDY0IEBAIHN0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXFxuIFxcdGlmIChjb3B5X2Zyb21fdXNlcihzLCBidWZmZXIsIGNvdW50KSlcXG4gXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuIFxcdGlmICghY291bnQpXFxuLVxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0lHTk9SRTtcXG4gXFx0aWYgKHNbY291bnQgLSAxXSA9PSAnXFxcXG4nKVxcbiBcXHRcXHRjb3VudC0tO1xcbiBcXHRpZiAoY291bnQgPT0gMSBcXHUwMDI2XFx1MDAyNiBzWzBdID09ICcwJylcXG4tXFx0XFx0cmV0dXJuIDE7XFxuK1xcdFxcdHJldHVybiBCTV9DTURfRElTQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDEgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAyO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX0VOQUJMRTtcXG4gXFx0aWYgKGNvdW50ID09IDIgXFx1MDAyNlxcdTAwMjYgc1swXSA9PSAnLScgXFx1MDAyNlxcdTAwMjYgc1sxXSA9PSAnMScpXFxuLVxcdFxcdHJldHVybiAzO1xcbitcXHRcXHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcXG4gXFx0cmV0dXJuIC1FSU5WQUw7XFxuIH1cXG4gXFxuIC8qIGdlbmVyaWMgc3R1ZmYgKi9cXG4gXFxuLXN0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKVxcbitzdGF0aWMgdm9pZCBibV9zZXFfaGV4KHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgdTggKmRhdGEsIGludCBzaXplKVxcbiB7XFxuLVxcdGNoYXIgKmRwID0gcGFnZTtcXG4tXFx0Y29uc3QgY2hhciAqc3RhdHVzID0gXFxcImRpc2FibGVkXFxcIjtcXG4rXFx0Zm9yIChpbnQgaSA9IDA7IGkgXFx1MDAzYyBzaXplOyBpKyspXFxuK1xcdFxcdHNlcV9wcmludGYobSwgXFxcIiUwMnhcXFwiLCBkYXRhW2ldKTtcXG4rfVxcbiBcXG4tXFx0aWYgKHRlc3RfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpXFxuLVxcdFxcdHN0YXR1cyA9IFxcXCJlbmFibGVkXFxcIjtcXG4rc3RhdGljIGludCBibV9lbnRyeV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKVxcbit7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IG0tXFx1MDAzZXByaXZhdGU7XFxuIFxcbi1cXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XFxuLVxcdFxcdHNwcmludGYocGFnZSwgXFxcIiVzXFxcXG5cXFwiLCBzdGF0dXMpO1xcbi1cXHRcXHRyZXR1cm47XFxuLVxcdH1cXG4rXFx0aWYgKHRlc3RfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpKVxcbitcXHRcXHRzZXFfcHV0cyhtLCBcXFwiZW5hYmxlZFxcXFxuXFxcIik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c2VxX3B1dHMobSwgXFxcImRpc2FibGVkXFxcXG5cXFwiKTtcXG4gXFxuLVxcdGRwICs9IHNwcmludGYoZHAsIFxcXCIlc1xcXFxuaW50ZXJwcmV0ZXIgJXNcXFxcblxcXCIsIHN0YXR1cywgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbitcXHRzZXFfcHJpbnRmKG0sIFxcXCJpbnRlcnByZXRlciAlc1xcXFxuXFxcIiwgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbiBcXG4gXFx0LyogcHJpbnQgdGhlIHNwZWNpYWwgZmxhZ3MgKi9cXG4tXFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcImZsYWdzOiBcXFwiKTtcXG4rXFx0c2VxX3B1dHMobSwgXFxcImZsYWdzOiBcXFwiKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApXFxuLVxcdFxcdCpkcCsrID0gJ1AnO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnUCcpO1xcbiBcXHRpZiAoZS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBNSVNDX0ZNVF9PUEVOX0JJTkFSWSlcXG4tXFx0XFx0KmRwKysgPSAnTyc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdPJyk7XFxuIFxcdGlmIChlLVxcdTAwM2VmbGFncyBcXHUwMDI2IE1JU0NfRk1UX0NSRURFTlRJQUxTKVxcbi1cXHRcXHQqZHArKyA9ICdDJztcXG4rXFx0XFx0c2VxX3B1dGMobSwgJ0MnKTtcXG4gXFx0aWYgKGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxcbi1cXHRcXHQqZHArKyA9ICdGJztcXG4tXFx0KmRwKysgPSAnXFxcXG4nO1xcbitcXHRcXHRzZXFfcHV0YyhtLCAnRicpO1xcbitcXHRzZXFfcHV0YyhtLCAnXFxcXG4nKTtcXG4gXFxuLVxcdGlmICghdGVzdF9iaXQoTWFnaWMsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4tXFx0XFx0c3ByaW50ZihkcCwgXFxcImV4dGVuc2lvbiAuJXNcXFxcblxcXCIsIGUtXFx1MDAzZW1hZ2ljKTtcXG4rXFx0aWYgKCF0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncykpIHtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwiZXh0ZW5zaW9uIC4lc1xcXFxuXFxcIiwgZS1cXHUwMDNlbWFnaWMpO1xcbiBcXHR9IGVsc2Uge1xcbi1cXHRcXHRkcCArPSBzcHJpbnRmKGRwLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbi1cXHRcXHRkcCA9IGJpbjJoZXgoZHAsIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0c2VxX3ByaW50ZihtLCBcXFwib2Zmc2V0ICVpXFxcXG5tYWdpYyBcXFwiLCBlLVxcdTAwM2VvZmZzZXQpO1xcbitcXHRcXHRibV9zZXFfaGV4KG0sIGUtXFx1MDAzZW1hZ2ljLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0aWYgKGUtXFx1MDAzZW1hc2spIHtcXG4tXFx0XFx0XFx0ZHAgKz0gc3ByaW50ZihkcCwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4tXFx0XFx0XFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4rXFx0XFx0XFx0c2VxX3B1dHMobSwgXFxcIlxcXFxubWFzayBcXFwiKTtcXG4rXFx0XFx0XFx0Ym1fc2VxX2hleChtLCBlLVxcdTAwM2VtYXNrLCBlLVxcdTAwM2VzaXplKTtcXG4gXFx0XFx0fVxcbi1cXHRcXHQqZHArKyA9ICdcXFxcbic7XFxuLVxcdFxcdCpkcCA9ICdcXFxcMCc7XFxuK1xcdFxcdHNlcV9wdXRjKG0sICdcXFxcbicpO1xcbiBcXHR9XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpXFxuK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bW9kZV90IG1vZGUpXFxuIHtcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7XFxuIFxcbkBAIC02NTIsMTQgKzYzNSwxNCBAQCBzdGF0aWMgc3RydWN0IGJpbmZtdF9taXNjICppX2JpbmZtdF9taXNjKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuICAqIGVudHJ5IGlzIHJlbW92ZWQgb3IgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkIGFuZCB0aGUgc3VwZXIgYmxvY2sgaXNcXG4gICogc2h1dGRvd24uXFxuICAqXFxuLSAqIElmIHRoZSAtXFx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZVxcbi0gKiB0byByZW1vdmUgdGhlIGVudHJ5IG9yIGFsbCBlbnRyaWVzIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpIHRoZSBlbnRyeVxcbi0gKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgbGlzdF9lbXB0eSgpIGNoZWNrXFxuLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC5cXG4rICogSWYgdGhlIC1cXHUwMDNlZXZpY3QgY2FsbCB3YXMgbm90IGNhdXNlZCBieSBhIHN1cGVyIGJsb2NrIHNodXRkb3duIGJ1dCBieVxcbisgKiByZW1vdmluZyB0aGUgZW50cnkgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgb3IgdW5saW5rKDIpIHRoZSBlbnRyeVxcbisgKiB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2Uga2VlcCB0aGUgaGxpc3RfdW5oYXNoZWQoKVxcbisgKiBjaGVjayB0byBtYWtlIHRoYXQgZXhwbGljaXQuXFxuICovXFxuIHN0YXRpYyB2b2lkIGJtX2V2aWN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpXFxuIHtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcbiBcXHRjbGVhcl9pbm9kZShpbm9kZSk7XFxuIFxcbkBAIC02NjcsODkgKzY1MCwxMzIgQEAgc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcXG4gXFx0XFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXG4gXFx0XFx0bWlzYyA9IGlfYmluZm10X21pc2MoaW5vZGUpO1xcbi1cXHRcXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRcXHRpZiAoIWxpc3RfZW1wdHkoXFx1MDAyNmUtXFx1MDAzZWxpc3QpKVxcbi1cXHRcXHRcXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0XFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRcXHRzcGluX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdGlmICghaGxpc3RfdW5oYXNoZWQoXFx1MDAyNmUtXFx1MDAzZW5vZGUpKVxcbitcXHRcXHRcXHRobGlzdF9kZWxfaW5pdF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUpO1xcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4gXFx0XFx0cHV0X2JpbmZtdF9oYW5kbGVyKGUpO1xcbiBcXHR9XFxuIH1cXG4gXFxuKy8qKlxcbisgKiB1bmxpbmtfYmluZm10X2hhbmRsZXIgLSB1bmhhc2ggYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuKyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4rICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gdW5oYXNoXFxuKyAqXFxuKyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcXG4rICogdW5saW5rKDIpIGhhcHBlbnMgdW5kZXIgdGhlIGV4Y2x1c2l2ZWx5IGhlbGQgaW5vZGUgbG9jayBvZiB0aGUgcm9vdFxcbisgKiBkZW50cnkga2VlcGluZyB0aGUgbGlzdCBzdGFibGUgZm9yIHdyaXRlcnMuIGxvYWRfbWlzY19iaW5hcnkoKSB3YWxrcyBpdFxcbisgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxcbisgKiB1bmxpbmsgdG8gc2VyaWFsaXplIGFnYWluc3QgYm1fZXZpY3RfaW5vZGUoKSB3aGljaCB1bmxpbmtzIGVudHJpZXNcXG4rICogZHVyaW5nIHVtb3VudCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgaW5vZGUgbG9jay5cXG4rICovXFxuK3N0YXRpYyB2b2lkIHVubGlua19iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXFxuK1xcdFxcdFxcdFxcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxcbit7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0aGxpc3RfZGVsX2luaXRfcmN1KFxcdTAwMjZlLVxcdTAwM2Vub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK31cXG4rXFxuIC8qKlxcbiAgKiByZW1vdmVfYmluZm10X2hhbmRsZXIgLSByZW1vdmUgYSBiaW5hcnkgdHlwZSBoYW5kbGVyXFxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcXG4gICogQGU6IGJpbmFyeSB0eXBlIGhhbmRsZXIgdG8gcmVtb3ZlXFxuICAqXFxuICAqIFJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBvZiBiaW5hcnkgdHlwZSBoYW5kbGVycyBhbmRcXG4tICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS4gVGhpcyBpcyBjYWxsZWQgZnJvbVxcbi0gKiBiaW5mbXRfe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgd2FudCB0byB0aGluayBhYm91dFxcbi0gKiBhZGRpbmcgYSBwcm9wZXIgLVxcdTAwM2V1bmxpbmsoKSBtZXRob2QgdG8gYmluZm10X21pc2MgaW5zdGVhZCBvZiBmb3JjaW5nIGNhbGxlcidzXFxuLSAqIHRvIHVzZSB3cml0ZXMgdG8gZmlsZXMgaW4gb3JkZXIgdG8gZGVsZXRlIGJpbmFyeSB0eXBlIGhhbmRsZXJzLiBCdXQgaXQgaGFzXFxuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0J3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuXFxuKyAqIHJlbW92ZSBpdHMgYXNzb2NpYXRlZCBkZW50cnkuXFxuICAqL1xcbi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKVxcbitzdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcXG4ge1xcbi1cXHR3cml0ZV9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbi1cXHRsaXN0X2RlbF9pbml0KFxcdTAwMjZlLVxcdTAwM2VsaXN0KTtcXG4tXFx0d3JpdGVfdW5sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuIFxcdGxvY2tlZF9yZWN1cnNpdmVfcmVtb3ZhbChlLVxcdTAwM2VkZW50cnksIE5VTEwpO1xcbiB9XFxuIFxcbi0vKiAvXFx1MDAzY2VudHJ5XFx1MDAzZSAqL1xcbisvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXFxuK3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuK3tcXG4rXFx0c3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi1cXHUwMDNlc19yb290KTtcXG4gXFxuLXN0YXRpYyBzc2l6ZV90XFxuLWJtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRpZiAoIWhsaXN0X3VuaGFzaGVkKFxcdTAwMjZlLVxcdTAwM2Vub2RlKSlcXG4rXFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2Mocm9vdCksIGUpO1xcbitcXHRpbm9kZV91bmxvY2socm9vdCk7XFxuK31cXG4rXFxuKy8qIFJlbW92ZSBhbGwgZW50cmllcyBvZiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2UgQG1pc2MgYmVsb25naW5nIHRvIEBzYi4gKi9cXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2FsbF9lbnRyaWVzKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcXG4rXFx0XFx0XFx0XFx0ICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdE5vZGUgKmUgPSBmaWxlX2lub2RlKGZpbGUpLVxcdTAwM2VpX3ByaXZhdGU7XFxuLVxcdHNzaXplX3QgcmVzO1xcbi1cXHRjaGFyICpwYWdlO1xcbitcXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVxcdTAwM2VzX3Jvb3QpO1xcbitcXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XFxuK1xcdHN0cnVjdCBobGlzdF9ub2RlICpuZXh0O1xcbitcXG4rXFx0aW5vZGVfbG9ja19uZXN0ZWQocm9vdCwgSV9NVVRFWF9QQVJFTlQpO1xcbitcXHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzLCBub2RlKVxcbitcXHRcXHRyZW1vdmVfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XFxuK1xcdGlub2RlX3VubG9jayhyb290KTtcXG4rfVxcbiBcXG4tXFx0cGFnZSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTtcXG4tXFx0aWYgKCFwYWdlKVxcbi1cXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4rLyoqXFxuKyAqIGJtX3VubGluayAtIHJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgdmlhIHVubGluaygyKVxcbisgKiBAZGlyOiBpbm9kZSBvZiB0aGUgcm9vdCBkaXJlY3RvcnlcXG4rICogQGRlbnRyeTogZW50cnkgZmlsZSB0byByZW1vdmVcXG4rICpcXG4rICogUmVtb3ZpbmcgdGhlIGVudHJ5IGZpbGUgcmVtb3ZlcyBpdHMgYmluYXJ5IHR5cGUgaGFuZGxlciwgZXhhY3RseSBsaWtlXFxuKyAqIHdyaXRpbmcgLTEgdG8gaXQgZG9lcy4gVGhlIHN0YXR1cyBhbmQgcmVnaXN0ZXIgY29udHJvbCBmaWxlcyBjYW4ndCBiZVxcbisgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcXG4rICogc2VyaWFsaXplcyBhZ2FpbnN0IHRoZSB3cml0ZSBiYXNlZCBhZGQgYW5kIHJlbW92ZSBwYXRocy5cXG4rICovXFxuK3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXFxuK3tcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gZF9pbm9kZShkZW50cnkpLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcbitcXHRpZiAoIWUpXFxuK1xcdFxcdHJldHVybiAtRVBFUk07XFxuK1xcbitcXHR1bmxpbmtfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhkaXIpLCBlKTtcXG4rXFx0cmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpO1xcbit9XFxuIFxcbi1cXHRlbnRyeV9zdGF0dXMoZSwgcGFnZSk7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBibV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHtcXG4rXFx0Lmxvb2t1cFxcdFxcdD0gc2ltcGxlX2xvb2t1cCxcXG4rXFx0LnVubGlua1xcdFxcdD0gYm1fdW5saW5rLFxcbit9O1xcbiBcXG4tXFx0cmVzID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBhZ2UsIHN0cmxlbihwYWdlKSk7XFxuKy8qIC9cXHUwMDNjZW50cnlcXHUwMDNlICovXFxuK1xcbitzdGF0aWMgaW50IGJtX2VudHJ5X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4gXFxuLVxcdGtmcmVlKHBhZ2UpO1xcbi1cXHRyZXR1cm4gcmVzO1xcbitcXHRyZXQgPSBzaW5nbGVfb3BlbihmaWxlLCBibV9lbnRyeV9zaG93LCBpbm9kZS1cXHUwMDNlaV9wcml2YXRlKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdC8qIHNlcV9vcGVuKCkgY2xlYXJzIEZNT0RFX1BXUklURSwgYm1fZW50cnlfd3JpdGUoKSB0YWtlcyBhbnkgb2Zmc2V0ICovXFxuK1xcdGlmIChmaWxlLVxcdTAwM2VmX21vZGUgXFx1MDAyNiBGTU9ERV9XUklURSlcXG4rXFx0XFx0ZmlsZS1cXHUwMDNlZl9tb2RlIHw9IEZNT0RFX1BXUklURTtcXG4rXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRcXHRzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcXG4ge1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcXG4tXFx0Tm9kZSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuK1xcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSA9IGlub2RlLVxcdTAwM2VpX3ByaXZhdGU7XFxuIFxcdGludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpO1xcbiBcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0Y2xlYXJfYml0KEVuYWJsZWQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuK1xcdGNhc2UgQk1fQ01EX0RJU0FCTEU6XFxuK1xcdFxcdGNsZWFyX2JpdChNSVNDX0ZNVF9FTkFCTEVEX0JJVCwgXFx1MDAyNmUtXFx1MDAzZWZsYWdzKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIHRoaXMgaGFuZGxlci4gKi9cXG4tXFx0XFx0c2V0X2JpdChFbmFibGVkLCBcXHUwMDI2ZS1cXHUwMDNlZmxhZ3MpO1xcbitcXHRjYXNlIEJNX0NNRF9FTkFCTEU6XFxuK1xcdFxcdHNldF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFxcdTAwMjZlLVxcdTAwM2VmbGFncyk7XFxuIFxcdFxcdGJyZWFrO1xcbi1cXHRjYXNlIDM6XFxuLVxcdFxcdC8qIERlbGV0ZSB0aGlzIGhhbmRsZXIuICovXFxuLVxcdFxcdGlub2RlID0gZF9pbm9kZShpbm9kZS1cXHUwMDNlaV9zYi1cXHUwMDNlc19yb290KTtcXG4tXFx0XFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcXG4tXFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEluIG9yZGVyIHRvIGFkZCBuZXcgZWxlbWVudCBvciByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGUgbGlzdFxcbi1cXHRcXHQgKiB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBpbm9kZV9sb2NrKCkgb24gdGhlXFxuLVxcdFxcdCAqIHJvb3QgaW5vZGUgbXVzdCBiZSBoZWxkLlxcbi1cXHRcXHQgKiBUaGUgbG9jayBpcyBleGNsdXNpdmUgZW5zdXJpbmcgdGhhdCB0aGUgbGlzdCBjYW4ndCBiZVxcbi1cXHRcXHQgKiBtb2RpZmllZC4gT25seSBsb2FkX21pc2NfYmluYXJ5KCkgY2FuIGFjY2VzcyBidXQgZG9lcyBzb1xcbi1cXHRcXHQgKiByZWFkLW9ubHkuIFNvIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoZSB3cml0ZSBsb2NrIHdoZW4gd2VcXG4tXFx0XFx0ICogYWN0dWFsbHkgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKCFsaXN0X2VtcHR5KFxcdTAwMjZlLVxcdTAwM2VsaXN0KSlcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKGlfYmluZm10X21pc2MoaW5vZGUpLCBlKTtcXG4tXFxuLVxcdFxcdGlub2RlX3VubG9jayhpbm9kZSk7XFxuK1xcdGNhc2UgQk1fQ01EX1JFTU9WRTpcXG4rXFx0XFx0Ym1fcmVtb3ZlX2VudHJ5KGUsIGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcdGRlZmF1bHQ6XFxuIFxcdFxcdHJldHVybiByZXM7XFxuQEAgLTc1OSwxNSArNzg1LDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiB9XFxuIFxcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibV9lbnRyeV9vcGVyYXRpb25zID0ge1xcbi1cXHQucmVhZFxcdFxcdD0gYm1fZW50cnlfcmVhZCxcXG4rXFx0Lm9wZW5cXHRcXHQ9IGJtX2VudHJ5X29wZW4sXFxuK1xcdC5yZWFkXFx0XFx0PSBzZXFfcmVhZCxcXG4gXFx0LndyaXRlXFx0XFx0PSBibV9lbnRyeV93cml0ZSxcXG4tXFx0Lmxsc2Vla1xcdFxcdD0gZGVmYXVsdF9sbHNlZWssXFxuK1xcdC5sbHNlZWtcXHRcXHQ9IHNlcV9sc2VlayxcXG4rXFx0LnJlbGVhc2VcXHQ9IHNpbmdsZV9yZWxlYXNlLFxcbiB9O1xcbiBcXG4gLyogL3JlZ2lzdGVyICovXFxuIFxcbiAvKiBhZGQgdG8gZmlsZXN5c3RlbSAqL1xcbi1zdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHtcXG4gXFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLVxcdTAwM2VzX3Jvb3QsIGUtXFx1MDAzZW5hbWUpO1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbkBAIC03ODksOSArODE3LDkgQEAgc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4gXFxuIFxcdGRfbWFrZV9wZXJzaXN0ZW50KGRlbnRyeSwgaW5vZGUpO1xcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhpbm9kZSk7XFxuLVxcdHdyaXRlX2xvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuLVxcdGxpc3RfYWRkKFxcdTAwMjZlLVxcdTAwM2VsaXN0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuLVxcdHdyaXRlX3VubG9jayhcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllc19sb2NrKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbitcXHRobGlzdF9hZGRfaGVhZF9yY3UoXFx1MDAyNmUtXFx1MDAzZW5vZGUsIFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuIFxcdHNpbXBsZV9kb25lX2NyZWF0aW5nKGRlbnRyeSk7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuQEAgLTc5OSwxMyArODI3LDEyIEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHQgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4tXFx0Tm9kZSAqZTtcXG4rXFx0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xcbiBcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYjtcXG4tXFx0aW50IGVyciA9IDA7XFxuIFxcdHN0cnVjdCBmaWxlICpmID0gTlVMTDtcXG4rXFx0aW50IGVycjtcXG4gXFxuIFxcdGUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7XFxuLVxcbiBcXHRpZiAoSVNfRVJSKGUpKVxcbiBcXHRcXHRyZXR1cm4gUFRSX0VSUihlKTtcXG4gXFxuQEAgLTgyMiw3ICs4NDksNiBAQCBzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcXG4gXFx0XFx0aWYgKElTX0VSUihmKSkge1xcbiBcXHRcXHRcXHRwcl9ub3RpY2UoXFxcInJlZ2lzdGVyOiBmYWlsZWQgdG8gaW5zdGFsbCBpbnRlcnByZXRlciBmaWxlICVzXFxcXG5cXFwiLFxcbiBcXHRcXHRcXHRcXHQgZS1cXHUwMDNlaW50ZXJwcmV0ZXIpO1xcbi1cXHRcXHRcXHRrZnJlZShlKTtcXG4gXFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoZik7XFxuIFxcdFxcdH1cXG4gXFx0XFx0ZS1cXHUwMDNlaW50ZXJwX2ZpbGUgPSBmO1xcbkBAIC04MzQsOSArODYwLDExIEBAIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxcbiBcXHRcXHRcXHRleGVfZmlsZV9hbGxvd193cml0ZV9hY2Nlc3MoZik7XFxuIFxcdFxcdFxcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XFxuIFxcdFxcdH1cXG4tXFx0XFx0a2ZyZWUoZSk7XFxuIFxcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG4rXFxuK1xcdC8qIFRoZSBlbnRyeSBpcyBvd25lZCBieSBpdHMgaW5vZGUgbm93LiAqL1xcbitcXHRyZXRhaW5fYW5kX251bGxfcHRyKGUpO1xcbiBcXHRyZXR1cm4gY291bnQ7XFxuIH1cXG4gXFxuQEAgLTg1MSwxMCArODc5LDEwIEBAIHN0YXRpYyBzc2l6ZV90XFxuIGJtX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbi1cXHRjaGFyICpzO1xcbitcXHRjb25zdCBjaGFyICpzO1xcbiBcXG4gXFx0bWlzYyA9IGlfYmluZm10X21pc2MoZmlsZV9pbm9kZShmaWxlKSk7XFxuLVxcdHMgPSBtaXNjLVxcdTAwM2VlbmFibGVkID8gXFxcImVuYWJsZWRcXFxcblxcXCIgOiBcXFwiZGlzYWJsZWRcXFxcblxcXCI7XFxuK1xcdHMgPSBSRUFEX09OQ0UobWlzYy1cXHUwMDNlZW5hYmxlZCkgPyBcXFwiZW5hYmxlZFxcXFxuXFxcIiA6IFxcXCJkaXNhYmxlZFxcXFxuXFxcIjtcXG4gXFx0cmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBzLCBzdHJsZW4ocykpO1xcbiB9XFxuIFxcbkBAIC04NjMsMzcgKzg5MSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9zdGF0dXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXFxuIHtcXG4gXFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xcbiBcXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcXG4tXFx0Tm9kZSAqZSwgKm5leHQ7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcbiBcXHRtaXNjID0gaV9iaW5mbXRfbWlzYyhmaWxlX2lub2RlKGZpbGUpKTtcXG4gXFx0c3dpdGNoIChyZXMpIHtcXG4tXFx0Y2FzZSAxOlxcbi1cXHRcXHQvKiBEaXNhYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xcbitcXHRjYXNlIEJNX0NNRF9ESVNBQkxFOlxcbitcXHRcXHRXUklURV9PTkNFKG1pc2MtXFx1MDAzZWVuYWJsZWQsIGZhbHNlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMjpcXG4tXFx0XFx0LyogRW5hYmxlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0bWlzYy1cXHUwMDNlZW5hYmxlZCA9IHRydWU7XFxuK1xcdGNhc2UgQk1fQ01EX0VOQUJMRTpcXG4rXFx0XFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFx0XFx0YnJlYWs7XFxuLVxcdGNhc2UgMzpcXG4tXFx0XFx0LyogRGVsZXRlIGFsbCBoYW5kbGVycy4gKi9cXG4tXFx0XFx0aW5vZGUgPSBkX2lub2RlKGZpbGVfaW5vZGUoZmlsZSktXFx1MDAzZWlfc2ItXFx1MDAzZXNfcm9vdCk7XFxuLVxcdFxcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX1BBUkVOVCk7XFxuLVxcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBJbiBvcmRlciB0byBhZGQgbmV3IGVsZW1lbnQgb3IgcmVtb3ZlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3RcXG4tXFx0XFx0ICogdmlhIGJtX3tlbnRyeSxyZWdpc3RlcixzdGF0dXN9X3dyaXRlKCkgaW5vZGVfbG9jaygpIG9uIHRoZVxcbi1cXHRcXHQgKiByb290IGlub2RlIG11c3QgYmUgaGVsZC5cXG4tXFx0XFx0ICogVGhlIGxvY2sgaXMgZXhjbHVzaXZlIGVuc3VyaW5nIHRoYXQgdGhlIGxpc3QgY2FuJ3QgYmVcXG4tXFx0XFx0ICogbW9kaWZpZWQuIE9ubHkgbG9hZF9taXNjX2JpbmFyeSgpIGNhbiBhY2Nlc3MgYnV0IGRvZXMgc29cXG4tXFx0XFx0ICogcmVhZC1vbmx5LiBTbyB3ZSBvbmx5IG5lZWQgdG8gdGFrZSB0aGUgd3JpdGUgbG9jayB3aGVuIHdlXFxuLVxcdFxcdCAqIGFjdHVhbGx5IHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGlzdC5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCBuZXh0LCBcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcywgbGlzdClcXG4tXFx0XFx0XFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xcbi1cXG4tXFx0XFx0aW5vZGVfdW5sb2NrKGlub2RlKTtcXG4rXFx0Y2FzZSBCTV9DTURfUkVNT1ZFOlxcbitcXHRcXHRibV9yZW1vdmVfYWxsX2VudHJpZXMobWlzYywgZmlsZV9pbm9kZShmaWxlKS1cXHUwMDNlaV9zYik7XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRyZXR1cm4gcmVzO1xcbkBAIC05MTgsNyArOTI2LDcgQEAgc3RhdGljIHZvaWQgYm1fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuIFxcdHB1dF91c2VyX25zKHVzZXJfbnMpO1xcbiB9XFxuIFxcbi1zdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc19vcHMgPSB7XFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XFxuIFxcdC5zdGF0ZnNcXHRcXHQ9IHNpbXBsZV9zdGF0ZnMsXFxuIFxcdC5ldmljdF9pbm9kZVxcdD0gYm1fZXZpY3RfaW5vZGUsXFxuIFxcdC5wdXRfc3VwZXJcXHQ9IGJtX3B1dF9zdXBlcixcXG5AQCAtOTY1LDEwICs5NzMsMTAgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG4gXFx0XFx0aWYgKCFtaXNjKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFxuLVxcdFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzKTtcXG4tXFx0XFx0cndsb2NrX2luaXQoXFx1MDAyNm1pc2MtXFx1MDAzZWVudHJpZXNfbG9jayk7XFxuK1xcdFxcdElOSVRfSExJU1RfSEVBRChcXHUwMDI2bWlzYy1cXHUwMDNlZW50cmllcyk7XFxuK1xcdFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZtaXNjLVxcdTAwM2VlbnRyaWVzX2xvY2spO1xcbiBcXG4tXFx0XFx0LyogUGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgaW4gbG9hZF9iaW5mbXRfbWlzYygpLiAqL1xcbitcXHRcXHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBjdXJyZW50X2JpbmZtdF9taXNjKCkuICovXFxuIFxcdFxcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZ1c2VyX25zLVxcdTAwM2ViaW5mbXRfbWlzYywgbWlzYyk7XFxuIFxcdH1cXG4gXFxuQEAgLTk4MywxMiArOTkxLDE1IEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuIFxcdCAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHlcXG4gXFx0ICogcmVzZXQgLVxcdTAwM2VlbmFibGVkIHRvIHRydWUuXFxuIFxcdCAqL1xcbi1cXHRtaXNjLVxcdTAwM2VlbmFibGVkID0gdHJ1ZTtcXG4rXFx0V1JJVEVfT05DRShtaXNjLVxcdTAwM2VlbmFibGVkLCB0cnVlKTtcXG4gXFxuIFxcdGVyciA9IHNpbXBsZV9maWxsX3N1cGVyKHNiLCBCSU5GTVRGU19NQUdJQywgYm1fZmlsZXMpO1xcbi1cXHRpZiAoIWVycilcXG4tXFx0XFx0c2ItXFx1MDAzZXNfb3AgPSBcXHUwMDI2c19vcHM7XFxuLVxcdHJldHVybiBlcnI7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHRzYi1cXHUwMDNlc19vcCA9IFxcdTAwMjZibV9zdXBlcl9vcHM7XFxuK1xcdGRfaW5vZGUoc2ItXFx1MDAzZXNfcm9vdCktXFx1MDAzZWlfb3AgPSBcXHUwMDI2Ym1fZGlyX2lub2RlX29wZXJhdGlvbnM7XFxuK1xcdHJldHVybiAwO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBibV9mcmVlKHN0cnVjdCBmc19jb250ZXh0ICpmYylcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW5mbXRzLmggYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvYmluZm10cy5oXFxuQEAgLTEwMSw4ICsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHtcXG4gXFxuICNpZiBJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQylcXG4gc3RydWN0IGJpbmZtdF9taXNjIHtcXG4tXFx0c3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzO1xcbi1cXHRyd2xvY2tfdCBlbnRyaWVzX2xvY2s7XFxuK1xcdHN0cnVjdCBobGlzdF9oZWFkIGVudHJpZXM7XFxuK1xcdHNwaW5sb2NrX3QgZW50cmllc19sb2NrO1xcbiBcXHRib29sIGVuYWJsZWQ7XFxuIH0gX19yYW5kb21pemVfbGF5b3V0O1xcbiBcXG5kaWZmIC0tZ2l0IGEva2VybmVsL3VzZXIuYyBiL2tlcm5lbC91c2VyLmNcXG5pbmRleCA3YWVmNGU2NzlhNmEwYy4uMjFiYWZkYzExMzc5NTYgMTAwNjQ0XFxuLS0tIGEva2VybmVsL3VzZXIuY1xcbisrKyBiL2tlcm5lbC91c2VyLmNcXG5AQCAtMjMsOSArMjMsOSBAQFxcbiBcXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX0JJTkZNVF9NSVNDKVxcbiBzdHJ1Y3QgYmluZm10X21pc2MgaW5pdF9iaW5mbXRfbWlzYyA9IHtcXG4tXFx0LmVudHJpZXMgPSBMSVNUX0hFQURfSU5JVChpbml0X2JpbmZtdF9taXNjLmVudHJpZXMpLFxcbitcXHQuZW50cmllcyA9IEhMSVNUX0hFQURfSU5JVCxcXG4gXFx0LmVuYWJsZWQgPSB0cnVlLFxcbi1cXHQuZW50cmllc19sb2NrID0gX19SV19MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4rXFx0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcXG4gfTtcXG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9iaW5mbXRfbWlzYyk7XFxuICNlbmRpZlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQyMDozMjozOS40ODMwNDk2NTFaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjIwNzEyNTAxMTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwiYm1fZW50cnlfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBhODc3ZGIxYmZiN2QyZDhhNWJjZmVhMDNmM2ZjMTEyYzg0MDNhZDMyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBKdWwgMTAgMjA6MzI6MzcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvYmluZm10LW1pc2MucnN0XG5pbmRleCBjMGEzNGZiZjgwMjJiNS4uMzA2ZWY0OGY1ZGU2ZGQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2JpbmZtdC1taXNjLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9iaW5mbXQtbWlzYy5yc3RcbkBAIC0xMzMsNyArMTMzLDggQEAgb3IgMSAodG8gZW5hYmxlKSB0byBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYCBvclxuIENhdHRpbmcgdGhlIGZpbGUgdGVsbHMgeW91IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBgYGJpbmZtdF9taXNjL3RoZV9lbnRyeWBgLlxuIFxuIFlvdSBjYW4gcmVtb3ZlIG9uZSBlbnRyeSBvciBhbGwgZW50cmllcyBieSBlY2hvaW5nIC0xIHRvIGBgL3Byb2MvLi4uL3RoZV9uYW1lYGBcbi1vciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC5cbitvciBgYC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYy9zdGF0dXNgYC4gQSBzaW5nbGUgZW50cnkgY2FuIGFsc28gYmUgcmVtb3ZlZFxuK2J5IHNpbXBseSB1bmxpbmtpbmcgKGBgcm1gYCkgYGAvcHJvYy8uLi4vdGhlX25hbWVgYC5cbiBcbiBcbiBIaW50c1xuZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jXG5pbmRleCA4NDM0OWZjYjkzZjEzYS4uZjUxZDI3MjY5ODYxNjAgMTAwNjQ0XG4tLS0gYS9mcy9iaW5mbXRfbWlzYy5jXG4rKysgYi9mcy9iaW5mbXRfbWlzYy5jXG5AQCAtMTAsNDUgKzEwLDQ2IEBAXG4gXG4gI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSBcIjogXCIgZm10XG4gXG4tI2luY2x1ZGUgXHUwMDNjbGludXgva2VybmVsLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2hleC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvbW0uaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9iaW5mbXRzLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9iaXRvcHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JpdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1Zy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY2xlYW51cC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvY3R5cGUuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZ19oZWxwZXJzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9maWxlLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9wYWdlbWFwLmhcdTAwM2Vcbi0jaW5jbHVkZSBcdTAwM2NsaW51eC9uYW1laS5oXHUwMDNlXG4tI2luY2x1ZGUgXHUwMDNjbGludXgvbW91bnQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzX2NvbnRleHQuaFx1MDAzZVxuLSNpbmNsdWRlIFx1MDAzY2xpbnV4L3N5c2NhbGxzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZnNfY29udGV4dC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgva3N0cnRveC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcHJpbnRrLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9yZWZjb3VudC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2VxX2ZpbGUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3NsYWIuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N0cmluZy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc3RyaW5nX2hlbHBlcnMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3VhY2Nlc3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3VzZXJfbmFtZXNwYWNlLmhcdTAwM2VcbiBcbi0jaW5jbHVkZSBcImludGVybmFsLmhcIlxuLVxuLSNpZmRlZiBERUJVR1xuLSMgZGVmaW5lIFVTRV9ERUJVRyAxXG4tI2Vsc2Vcbi0jIGRlZmluZSBVU0VfREVCVUcgMFxuLSNlbmRpZlxuLVxuLWVudW0ge1xuLVx0VkVSQk9TRV9TVEFUVVMgPSAxIC8qIG1ha2UgaXQgemVybyB0byBzYXZlIDQwMCBieXRlcyBrZXJuZWwgbWVtb3J5ICovXG4rLyogRW50cnkgc3RhdHVzIGFuZCBtYXRjaCB0eXBlIGJpdCBudW1iZXJzLiAqL1xuK2VudW0gYmluZm10X21pc2NfZW50cnlfYml0cyB7XG4rXHRNSVNDX0ZNVF9FTkFCTEVEX0JJVFx0PSAwLFxuK1x0TUlTQ19GTVRfTUFHSUNfQklUXHQ9IDEsXG4gfTtcbiBcbi1lbnVtIHtFbmFibGVkLCBNYWdpY307XG4tI2RlZmluZSBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCAoMVVMIFx1MDAzY1x1MDAzYyAzMSlcbi0jZGVmaW5lIE1JU0NfRk1UX09QRU5fQklOQVJZICgxVUwgXHUwMDNjXHUwMDNjIDMwKVxuLSNkZWZpbmUgTUlTQ19GTVRfQ1JFREVOVElBTFMgKDFVTCBcdTAwM2NcdTAwM2MgMjkpXG4tI2RlZmluZSBNSVNDX0ZNVF9PUEVOX0ZJTEUgKDFVTCBcdTAwM2NcdTAwM2MgMjgpXG4rLyogRW50cnkgYmVoYXZpb3IgZmxhZ3MsIGZpeGVkIGF0IHJlZ2lzdHJhdGlvbiB0aW1lLiAqL1xuK2VudW0gYmluZm10X21pc2NfZW50cnlfZmxhZ3Mge1xuK1x0TUlTQ19GTVRfUFJFU0VSVkVfQVJHVjBcdD0gKDFVIFx1MDAzY1x1MDAzYyAzMSksXG4rXHRNSVNDX0ZNVF9PUEVOX0JJTkFSWVx0PSAoMVUgXHUwMDNjXHUwMDNjIDMwKSxcbitcdE1JU0NfRk1UX0NSRURFTlRJQUxTXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMjkpLFxuK1x0TUlTQ19GTVRfT1BFTl9GSUxFXHQ9ICgxVSBcdTAwM2NcdTAwM2MgMjgpLFxuK307XG4gXG4tdHlwZWRlZiBzdHJ1Y3Qge1xuLVx0c3RydWN0IGxpc3RfaGVhZCBsaXN0O1xuK3N0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSB7XG4rXHRzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlO1xuIFx0dW5zaWduZWQgbG9uZyBmbGFncztcdFx0LyogdHlwZSwgc3RhdHVzLCBldGMuICovXG4gXHRpbnQgb2Zmc2V0O1x0XHRcdC8qIG9mZnNldCBvZiBtYWdpYyAqL1xuIFx0aW50IHNpemU7XHRcdFx0Lyogc2l6ZSBvZiBtYWdpYy9tYXNrICovXG5AQCAtNTksOSArNjAsOSBAQCB0eXBlZGVmIHN0cnVjdCB7XG4gXHRzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7XG4gXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGU7XG4gXHRyZWZjb3VudF90IHVzZXJzO1x0XHQvKiBzeW5jIHJlbW92YWwgd2l0aCBsb2FkX21pc2NfYmluYXJ5KCkgKi9cbi19IE5vZGU7XG4tXG4tc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7XG4rXHRzdHJ1Y3QgcmN1X2hlYWQgcmN1O1xuK1x0Y2hhciBidWZbXTtcdFx0XHQvKiByZWdpc3RlciBzdHJpbmcsIGZpZWxkcyBwb2ludCBpbiBoZXJlICovXG4rfTtcbiBcbiAvKlxuICAqIE1heCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHN0cmluZy4gIERldGVybWluZWQgYnk6XG5AQCAtNzQsMTAgKzc1LDM2IEBAIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuICAqICAtIGludGVycDogfjUwIGJ5dGVzXG4gICogIC0gZmxhZ3M6ICA1IGJ5dGVzXG4gICogUm91bmQgdGhhdCB1cCBhIGJpdCwgYW5kIHRoZW4gYmFjayBvZmYgdG8gaG9sZCB0aGUgaW50ZXJuYWwgZGF0YVxuLSAqIChsaWtlIHN0cnVjdCBOb2RlKS5cbisgKiAobGlrZSBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkpLlxuICAqL1xuICNkZWZpbmUgTUFYX1JFR0lTVEVSX0xFTkdUSCAxOTIwXG4gXG4rLyogVHJhaWxpbmcgZGVsaW1pdGVyIHBhZCBzbyBmaWVsZCBwYXJzaW5nIGFsd2F5cyB0ZXJtaW5hdGVzIGF0IGEgZGVsaW1pdGVyLiAqL1xuKyNkZWZpbmUgTUlTQ19ERUxJTV9QQUQgOFxuK1xuKy8qIENoZWNrIGlmIEBlJ3MgbWFnaWMgbWF0Y2hlcyBAYnBybSdzIGJ1ZmZlciwgYXBwbHlpbmcgdGhlIG1hc2sgaWYgc2V0LiAqL1xuK3N0YXRpYyBib29sIGVudHJ5X21hdGNoZXNfbWFnaWMoY29uc3Qgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplLFxuK1x0XHRcdFx0Y29uc3Qgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbit7XG4rXHRjb25zdCBjaGFyICpzID0gYnBybS1cdTAwM2VidWYgKyBlLVx1MDAzZW9mZnNldDtcbitcdGludCBpO1xuK1xuK1x0aWYgKCFlLVx1MDAzZW1hc2spXG4rXHRcdHJldHVybiAhbWVtY21wKHMsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4rXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBlLVx1MDAzZXNpemU7IGkrKylcbitcdFx0aWYgKChzW2ldIF4gZS1cdTAwM2VtYWdpY1tpXSkgXHUwMDI2IGUtXHUwMDNlbWFza1tpXSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rLyogQ2hlY2sgaWYgQGUncyByZWdpc3RlcmVkIGV4dGVuc2lvbiBtYXRjaGVzIEBleHQsIE5VTEwgaWYgdGhlcmUgaXMgbm9uZS4gKi9cbitzdGF0aWMgYm9vbCBlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihjb25zdCBzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsXG4rXHRcdFx0XHQgICAgY29uc3QgY2hhciAqZXh0KVxuK3tcbitcdHJldHVybiBleHQgXHUwMDI2XHUwMDI2ICFzdHJjbXAoZS1cdTAwM2VtYWdpYywgZXh0KTtcbit9XG4rXG4gLyoqXG4gICogc2VhcmNoX2JpbmZtdF9oYW5kbGVyIC0gc2VhcmNoIGZvciBhIGJpbmFyeSBoYW5kbGVyIGZvciBAYnBybVxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbkBAIC04Niw0MyArMTEzLDMwIEBAIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlO1xuICAqIFNlYXJjaCBmb3IgYSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZvciBAYnBybSBpbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGJpbmFyeVxuICAqIHR5cGUgaGFuZGxlcnMuXG4gICpcbisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay5cbisgKlxuICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmVcbiAgKi9cbi1zdGF0aWMgTm9kZSAqc2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbi1cdFx0XHRcdCAgIHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqXG4rc2VhcmNoX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYywgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHRjaGFyICpwID0gc3RycmNocihicHJtLVx1MDAzZWludGVycCwgJy4nKTtcbi1cdE5vZGUgKmU7XG4rXHRjaGFyICpkb3QgPSBzdHJyY2hyKGJwcm0tXHUwMDNlaW50ZXJwLCAnLicpO1xuK1x0Y29uc3QgY2hhciAqZXh0ID0gZG90ID8gZG90ICsgMSA6IE5VTEw7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmU7XG4gXG4gXHQvKiBXYWxrIGFsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycy4gKi9cbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoZSwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBsaXN0KSB7XG4tXHRcdGNoYXIgKnM7XG4tXHRcdGludCBqO1xuLVxuK1x0aGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGUsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSkge1xuIFx0XHQvKiBNYWtlIHN1cmUgdGhpcyBvbmUgaXMgY3VycmVudGx5IGVuYWJsZWQuICovXG4tXHRcdGlmICghdGVzdF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4rXHRcdGlmICghdGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuIFx0XHRcdGNvbnRpbnVlO1xuIFxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBleHRlbnNpb24gaWYgYXBwbGljYWJsZS4gKi9cbi1cdFx0aWYgKCF0ZXN0X2JpdChNYWdpYywgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbi1cdFx0XHRpZiAocCBcdTAwMjZcdTAwMjYgIXN0cmNtcChlLVx1MDAzZW1hZ2ljLCBwICsgMSkpXG4rXHRcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4rXHRcdFx0aWYgKGVudHJ5X21hdGNoZXNfbWFnaWMoZSwgYnBybSkpXG4gXHRcdFx0XHRyZXR1cm4gZTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHQvKiBEbyBtYXRjaGluZyBiYXNlZCBvbiBtYWdpYyBcdTAwMjYgbWFzay4gKi9cbi1cdFx0cyA9IGJwcm0tXHUwMDNlYnVmICsgZS1cdTAwM2VvZmZzZXQ7XG4tXHRcdGlmIChlLVx1MDAzZW1hc2spIHtcbi1cdFx0XHRmb3IgKGogPSAwOyBqIFx1MDAzYyBlLVx1MDAzZXNpemU7IGorKylcbi1cdFx0XHRcdGlmICgoKnMrKyBeIGUtXHUwMDNlbWFnaWNbal0pIFx1MDAyNiBlLVx1MDAzZW1hc2tbal0pXG4tXHRcdFx0XHRcdGJyZWFrO1xuIFx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvciAoaiA9IDA7IGogXHUwMDNjIGUtXHUwMDNlc2l6ZTsgaisrKVxuLVx0XHRcdFx0aWYgKCgqcysrIF4gZS1cdTAwM2VtYWdpY1tqXSkpXG4tXHRcdFx0XHRcdGJyZWFrO1xuK1x0XHRcdGlmIChlbnRyeV9tYXRjaGVzX2V4dGVuc2lvbihlLCBleHQpKVxuK1x0XHRcdFx0cmV0dXJuIGU7XG4gXHRcdH1cbi1cdFx0aWYgKGogPT0gZS1cdTAwM2VzaXplKVxuLVx0XHRcdHJldHVybiBlO1xuIFx0fVxuIFxuIFx0cmV0dXJuIE5VTEw7XG5AQCAtMTM0LDY0ICsxNDgsNjkgQEAgc3RhdGljIE5vZGUgKnNlYXJjaF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4gICogQGJwcm06IGJpbmFyeSBmb3Igd2hpY2ggd2UgYXJlIGxvb2tpbmcgZm9yIGEgaGFuZGxlclxuICAqXG4gICogVHJ5IHRvIGZpbmQgYSBiaW5mbXQgaGFuZGxlciBmb3IgdGhlIGJpbmFyeSB0eXBlLiBJZiBvbmUgaXMgZm91bmQgdGFrZSBhXG4tICogcmVmZXJlbmNlIHRvIHByb3RlY3QgYWdhaW5zdCByZW1vdmFsIHZpYSBibV97ZW50cnksc3RhdHVzfV93cml0ZSgpLlxuKyAqIHJlZmVyZW5jZSB0byBwcm90ZWN0IGFnYWluc3QgcmVtb3ZhbCB2aWEgYm1fe2VudHJ5LHN0YXR1c31fd3JpdGUoKS4gVGhlXG4rICogcmVmY291bnQgb2YgYW4gZW50cnkgY2FuIG9ubHkgZHJvcCB0byB6ZXJvIG9uY2UgaXQgaGFzIGJlZW4gdW5saW5rZWQgYW5kXG4rICogYSByZXN0YXJ0ZWQgc2VhcmNoIGNhbm5vdCBmaW5kIGFuIHVubGlua2VkIGVudHJ5IGFnYWluIHNvIHRoZSByZXRyeSBsb29wXG4rICogaXMgYm91bmRlZC5cbiAgKlxuICAqIFJldHVybjogYmluYXJ5IHR5cGUgbGlzdCBlbnRyeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmVcbiAgKi9cbi1zdGF0aWMgTm9kZSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbi1cdFx0XHRcdHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZ2V0X2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdFx0XHQgICAgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICplO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuIFxuLVx0cmVhZF9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdGUgPSBzZWFyY2hfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4tXHRpZiAoZSlcbi1cdFx0cmVmY291bnRfaW5jKFx1MDAyNmUtXHUwMDNldXNlcnMpO1xuLVx0cmVhZF91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0Z3VhcmQocmN1KSgpO1xuK1x0ZG8ge1xuK1x0XHRlID0gc2VhcmNoX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGJwcm0pO1xuK1x0fSB3aGlsZSAoZSBcdTAwMjZcdTAwMjYgIXJlZmNvdW50X2luY19ub3RfemVybyhcdTAwMjZlLVx1MDAzZXVzZXJzKSk7XG4gXHRyZXR1cm4gZTtcbiB9XG4gXG4gLyoqXG4tICogcHV0X2JpbmZtdF9oYW5kbGVyIC0gcHV0IGJpbmFyeSBoYW5kbGVyIG5vZGVcbi0gKiBAZTogbm9kZSB0byBwdXRcbisgKiBwdXRfYmluZm10X2hhbmRsZXIgLSBwdXQgYmluYXJ5IGhhbmRsZXIgZW50cnlcbisgKiBAZTogZW50cnkgdG8gcHV0XG4gICpcbi0gKiBGcmVlIG5vZGUgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xuKyAqIEZyZWUgZW50cnkgc3luY2luZyB3aXRoIGxvYWRfbWlzY19iaW5hcnkoKSBhbmQgZGVmZXIgZmluYWwgZnJlZSB0b1xuICAqIGxvYWRfbWlzY19iaW5hcnkoKSBpbiBjYXNlIGl0IGlzIHVzaW5nIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIHdlIHdlcmVcbiAgKiByZXF1ZXN0ZWQgdG8gcmVtb3ZlLlxuICAqL1xuLXN0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihOb2RlICplKVxuK3N0YXRpYyB2b2lkIHB1dF9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUpXG4ge1xuIFx0aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdChcdTAwMjZlLVx1MDAzZXVzZXJzKSkge1xuLVx0XHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxuK1x0XHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XG4rXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGUtXHUwMDNlaW50ZXJwX2ZpbGUpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZS1cdTAwM2VpbnRlcnBfZmlsZSwgTlVMTCk7XG4tXHRcdGtmcmVlKGUpO1xuK1x0XHR9XG4rXHRcdC8qIExvY2tsZXNzIHdhbGtlcnMgbWF5IHN0aWxsIGRlcmVmZXJlbmNlIHRoaXMgZW50cnkuICovXG4rXHRcdGtmcmVlX3JjdShlLCByY3UpO1xuIFx0fVxuIH1cbiBcbitERUZJTkVfRlJFRShwdXRfYmluZm10X2hhbmRsZXIsIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqLCBpZiAoX1QpIHB1dF9iaW5mbXRfaGFuZGxlcihfVCkpXG4rXG4gLyoqXG4tICogbG9hZF9iaW5mbXRfbWlzYyAtIGxvYWQgdGhlIGJpbmZtdF9taXNjIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxuKyAqIGN1cnJlbnRfYmluZm10X21pc2MgLSBnZXQgdGhlIGJpbmZtdF9taXNjIGluc3RhbmNlIG9mIHRoZSBjYWxsZXIncyB1c2VyIG5hbWVzcGFjZVxuICAqXG4tICogVG8gYmUgY2FsbGVkIGluIGxvYWRfbWlzY19iaW5hcnkoKSB0byBsb2FkIHRoZSByZWxldmFudCBzdHJ1Y3QgYmluZm10X21pc2MuXG4tICogSWYgYSB1c2VyIG5hbWVzcGFjZSBkb2Vzbid0IGhhdmUgaXRzIG93biBiaW5mbXRfbWlzYyBtb3VudCBpdCBjYW4gbWFrZSB1c2Vcbi0gKiBvZiBpdHMgYW5jZXN0b3IncyBiaW5mbXRfbWlzYyBoYW5kbGVycy4gVGhpcyBtaW1pY2tzIHRoZSBiZWhhdmlvciBvZlxuLSAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGJpbmZtdF9taXNjIGhhbmRsZXJzIHdoZXJlXG4tICogYXZhaWxhYmxlIHRvIGFsbCB1c2VyIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS5cbisgKiBJZiBhIHVzZXIgbmFtZXNwYWNlIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGJpbmZtdF9taXNjIG1vdW50IGl0IHVzZXMgdGhlXG4rICogaGFuZGxlcnMgb2YgaXRzIGNsb3Nlc3QgYW5jZXN0b3Igd2l0aCBvbmUuIFRoaXMgbWltaWNzIHRoZSBiZWhhdmlvciBvZlxuKyAqIHByZS1uYW1lc3BhY2VkIGJpbmZtdF9taXNjIHdoZXJlIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzIHdlcmUgYXZhaWxhYmxlXG4rICogdG8gYWxsIHVzZXJzIGFuZCB1c2VyIG5hbWVzcGFjZXMgb24gdGhlIHN5c3RlbS4gVGhlIGluaXQgdXNlciBuYW1lc3BhY2VcbisgKiBpbnN0YW5jZSBpcyBzdGF0aWNhbGx5IHNldCB1cCBzbyB0aGUgZmFsbGJhY2sgaXMgbmV2ZXIgcmVhY2hlZCBpblxuKyAqIHByYWN0aWNlLlxuICAqXG4gICogUmV0dXJuOiB0aGUgYmluZm10X21pc2MgaW5zdGFuY2Ugb2YgdGhlIGNhbGxlcidzIHVzZXIgbmFtZXNwYWNlXG4gICovXG4tc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzYyAqbG9hZF9iaW5mbXRfbWlzYyh2b2lkKVxuK3N0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmN1cnJlbnRfYmluZm10X21pc2Modm9pZClcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnM7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXG4tXHR1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7XG4tXHR3aGlsZSAodXNlcl9ucykge1xuK1x0Zm9yICh1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7IHVzZXJfbnM7IHVzZXJfbnMgPSB1c2VyX25zLVx1MDAzZXBhcmVudCkge1xuIFx0XHQvKiBQYWlycyB3aXRoIHNtcF9zdG9yZV9yZWxlYXNlKCkgaW4gYm1fZmlsbF9zdXBlcigpLiAqL1xuIFx0XHRtaXNjID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZ1c2VyX25zLVx1MDAzZWJpbmZtdF9taXNjKTtcbiBcdFx0aWYgKG1pc2MpXG4gXHRcdFx0cmV0dXJuIG1pc2M7XG4tXG4tXHRcdHVzZXJfbnMgPSB1c2VyX25zLVx1MDAzZXBhcmVudDtcbiBcdH1cbiBcbiBcdHJldHVybiBcdTAwMjZpbml0X2JpbmZtdF9taXNjO1xuQEAgLTIwMiwzMCArMjIxLDI5IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmxvYWRfYmluZm10X21pc2Modm9pZClcbiAgKi9cbiBzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSlcbiB7XG4tXHROb2RlICpmbXQ7XG4tXHRzdHJ1Y3QgZmlsZSAqaW50ZXJwX2ZpbGUgPSBOVUxMO1xuLVx0aW50IHJldHZhbCA9IC1FTk9FWEVDO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICpmbXQgX19mcmVlKHB1dF9iaW5mbXRfaGFuZGxlcikgPSBOVUxMO1xuK1x0c3RydWN0IGZpbGUgKmludGVycF9maWxlO1xuIFx0c3RydWN0IGJpbmZtdF9taXNjICptaXNjO1xuK1x0aW50IHJldHZhbDtcbiBcbi1cdG1pc2MgPSBsb2FkX2JpbmZtdF9taXNjKCk7XG4tXHRpZiAoIW1pc2MtXHUwMDNlZW5hYmxlZClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbitcdG1pc2MgPSBjdXJyZW50X2JpbmZtdF9taXNjKCk7XG4rXHRpZiAoIVJFQURfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQpKVxuK1x0XHRyZXR1cm4gLUVOT0VYRUM7XG4gXG4gXHRmbXQgPSBnZXRfYmluZm10X2hhbmRsZXIobWlzYywgYnBybSk7XG4gXHRpZiAoIWZtdClcbi1cdFx0cmV0dXJuIHJldHZhbDtcbitcdFx0cmV0dXJuIC1FTk9FWEVDO1xuIFxuIFx0LyogTmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgdGhlIGZpbGUgYWZ0ZXIgZXhlYyAqL1xuLVx0cmV0dmFsID0gLUVOT0VOVDtcbiBcdGlmIChicHJtLVx1MDAzZWludGVycF9mbGFncyBcdTAwMjYgQklOUFJNX0ZMQUdTX1BBVEhfSU5BQ0NFU1NJQkxFKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIC1FTk9FTlQ7XG4gXG4gXHRpZiAoZm10LVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkge1xuIFx0XHRicHJtLVx1MDAzZWludGVycF9mbGFncyB8PSBCSU5QUk1fRkxBR1NfUFJFU0VSVkVfQVJHVjA7XG4gXHR9IGVsc2Uge1xuIFx0XHRyZXR2YWwgPSByZW1vdmVfYXJnX3plcm8oYnBybSk7XG4gXHRcdGlmIChyZXR2YWwpXG4tXHRcdFx0Z290byByZXQ7XG4rXHRcdFx0cmV0dXJuIHJldHZhbDtcbiBcdH1cbiBcbiBcdGlmIChmbXQtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxuQEAgLTIzNCw1NyArMjUyLDQ4IEBAIHN0YXRpYyBpbnQgbG9hZF9taXNjX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKVxuIFx0LyogbWFrZSBhcmd2WzFdIGJlIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgKi9cbiBcdHJldHZhbCA9IGNvcHlfc3RyaW5nX2tlcm5lbChicHJtLVx1MDAzZWludGVycCwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIHJldHZhbDtcbiBcdGJwcm0tXHUwMDNlYXJnYysrO1xuIFxuIFx0LyogYWRkIHRoZSBpbnRlcnAgYXMgYXJndlswXSAqL1xuIFx0cmV0dmFsID0gY29weV9zdHJpbmdfa2VybmVsKGZtdC1cdTAwM2VpbnRlcnByZXRlciwgYnBybSk7XG4gXHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIHJldHZhbDtcbiBcdGJwcm0tXHUwMDNlYXJnYysrO1xuIFxuIFx0LyogVXBkYXRlIGludGVycCBpbiBjYXNlIGJpbmZtdF9zY3JpcHQgbmVlZHMgaXQuICovXG4gXHRyZXR2YWwgPSBicHJtX2NoYW5nZV9pbnRlcnAoZm10LVx1MDAzZWludGVycHJldGVyLCBicHJtKTtcbiBcdGlmIChyZXR2YWwgXHUwMDNjIDApXG4tXHRcdGdvdG8gcmV0O1xuK1x0XHRyZXR1cm4gcmV0dmFsO1xuIFxuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKSB7XG4gXHRcdGludGVycF9maWxlID0gZmlsZV9jbG9uZV9vcGVuKGZtdC1cdTAwM2VpbnRlcnBfZmlsZSk7XG4tXHRcdGlmICghSVNfRVJSKGludGVycF9maWxlKSlcbi1cdFx0XHRkZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7XG4rXHRcdGlmICghSVNfRVJSKGludGVycF9maWxlKSkge1xuK1x0XHRcdGludCBlcnIgPSBleGVfZmlsZV9kZW55X3dyaXRlX2FjY2VzcyhpbnRlcnBfZmlsZSk7XG4rXG4rXHRcdFx0aWYgKGVycikge1xuK1x0XHRcdFx0ZnB1dChpbnRlcnBfZmlsZSk7XG4rXHRcdFx0XHRpbnRlcnBfZmlsZSA9IEVSUl9QVFIoZXJyKTtcbitcdFx0XHR9XG4rXHRcdH1cbiBcdH0gZWxzZSB7XG4gXHRcdGludGVycF9maWxlID0gb3Blbl9leGVjKGZtdC1cdTAwM2VpbnRlcnByZXRlcik7XG4gXHR9XG4tXHRyZXR2YWwgPSBQVFJfRVJSKGludGVycF9maWxlKTtcbiBcdGlmIChJU19FUlIoaW50ZXJwX2ZpbGUpKVxuLVx0XHRnb3RvIHJldDtcbitcdFx0cmV0dXJuIFBUUl9FUlIoaW50ZXJwX2ZpbGUpO1xuIFxuIFx0YnBybS1cdTAwM2VpbnRlcnByZXRlciA9IGludGVycF9maWxlO1xuIFx0aWYgKGZtdC1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfQ1JFREVOVElBTFMpXG4gXHRcdGJwcm0tXHUwMDNlZXhlY2ZkX2NyZWRzID0gMTtcbi1cbi1cdHJldHZhbCA9IDA7XG4tcmV0OlxuLVxuLVx0Lypcbi1cdCAqIElmIHdlIGFjdHVhbGx5IHB1dCB0aGUgbm9kZSBoZXJlIGFsbCBjb25jdXJyZW50IGNhbGxzIHRvXG4tXHQgKiBsb2FkX21pc2NfYmluYXJ5KCkgd2lsbCBoYXZlIGZpbmlzaGVkLiBXZSBhbHNvIGtub3dcbi1cdCAqIHRoYXQgZm9yIHRoZSByZWZjb3VudCB0byBiZSB6ZXJvIHNvbWVvbmUgbXVzdCBoYXZlIGNvbmN1cmVudGx5XG4tXHQgKiByZW1vdmVkIHRoZSBiaW5hcnkgdHlwZSBoYW5kbGVyIGZyb20gdGhlIGxpc3QgYW5kIGl0J3Mgb3VyIGpvYiB0b1xuLVx0ICogZnJlZSBpdC5cbi1cdCAqL1xuLVx0cHV0X2JpbmZtdF9oYW5kbGVyKGZtdCk7XG4tXG4tXHRyZXR1cm4gcmV0dmFsO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIC8qIENvbW1hbmQgcGFyc2VycyAqL1xuIFxuIC8qXG4tICogcGFyc2VzIGFuZCBjb3BpZXMgb25lIGFyZ3VtZW50IGVuY2xvc2VkIGluIGRlbCBmcm9tICpzcCB0byAqZHAsXG4tICogcmVjb2duaXNpbmcgdGhlIFxceCBzcGVjaWFsLlxuLSAqIHJldHVybnMgcG9pbnRlciB0byB0aGUgY29waWVkIGFyZ3VtZW50IG9yIE5VTEwgaW4gY2FzZSBvZiBhblxuLSAqIGVycm9yIChhbmQgc2V0cyBlcnIpIG9yIG51bGwgYXJndW1lbnQgbGVuZ3RoLlxuKyAqIFNjYW4gdGhlIGFyZ3VtZW50IHN0YXJ0aW5nIGF0IEBzIHVwIHRvIHRoZSBkZWxpbWl0ZXIgQGRlbCwgcmVjb2duaXNpbmdcbisgKiB0aGUgXFx4IGVzY2FwZS4gVGVybWluYXRlcyB0aGUgYXJndW1lbnQgd2l0aCBhIE5VTCBhbmQgcmV0dXJucyBhIHBvaW50ZXJcbisgKiBwYXN0IGl0IG9yIE5VTEwgb24gYSBtYWxmb3JtZWQgZXNjYXBlLlxuICAqL1xuIHN0YXRpYyBjaGFyICpzY2FuYXJnKGNoYXIgKnMsIGNoYXIgZGVsKVxuIHtcbkBAIC0yOTksNDYgKzMwOCwxMjMgQEAgc3RhdGljIGNoYXIgKnNjYW5hcmcoY2hhciAqcywgY2hhciBkZWwpXG4gXHRcdFx0XHRyZXR1cm4gTlVMTDtcbiBcdFx0fVxuIFx0fVxuLVx0c1stMV0gPSdcXDAnO1xuK1x0c1stMV0gPSAnXFwwJztcbiBcdHJldHVybiBzO1xuIH1cbiBcbi1zdGF0aWMgY2hhciAqY2hlY2tfc3BlY2lhbF9mbGFncyhjaGFyICpzZnMsIE5vZGUgKmUpXG4rc3RhdGljIGNoYXIgKmNoZWNrX3NwZWNpYWxfZmxhZ3MoY2hhciAqcCwgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuIHtcbi1cdGNoYXIgKnAgPSBzZnM7XG4tXHRpbnQgY29udCA9IDE7XG4tXG4tXHQvKiBzcGVjaWFsIGZsYWdzICovXG4tXHR3aGlsZSAoY29udCkge1xuK1x0Zm9yICg7OyBwKyspIHtcbiBcdFx0c3dpdGNoICgqcCkge1xuIFx0XHRjYXNlICdQJzpcbiBcdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBmbGFnOiBQIChwcmVzZXJ2ZSBhcmd2MClcXG5cIik7XG4tXHRcdFx0cCsrO1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjA7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ08nOlxuIFx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGZsYWc6IE8gKG9wZW4gYmluYXJ5KVxcblwiKTtcbi1cdFx0XHRwKys7XG4gXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSBNSVNDX0ZNVF9PUEVOX0JJTkFSWTtcbiBcdFx0XHRicmVhaztcbiBcdFx0Y2FzZSAnQyc6XG4gXHRcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogZmxhZzogQyAocHJlc2VydmUgY3JlZHMpXFxuXCIpO1xuLVx0XHRcdHArKztcbi1cdFx0XHQvKiB0aGlzIGZsYWdzIGFsc28gaW1wbGllcyB0aGVcbi1cdFx0XHQgICBvcGVuLWJpbmFyeSBmbGFnICovXG4tXHRcdFx0ZS1cdTAwM2VmbGFncyB8PSAoTUlTQ19GTVRfQ1JFREVOVElBTFMgfFxuLVx0XHRcdFx0XHRNSVNDX0ZNVF9PUEVOX0JJTkFSWSk7XG4rXHRcdFx0LyogQyBpbXBsaWVzIE8gKi9cbitcdFx0XHRlLVx1MDAzZWZsYWdzIHw9IE1JU0NfRk1UX0NSRURFTlRJQUxTIHwgTUlTQ19GTVRfT1BFTl9CSU5BUlk7XG4gXHRcdFx0YnJlYWs7XG4gXHRcdGNhc2UgJ0YnOlxuIFx0XHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IGZsYWc6IEY6IG9wZW4gaW50ZXJwcmV0ZXIgZmlsZSBub3dcXG5cIik7XG4tXHRcdFx0cCsrO1xuIFx0XHRcdGUtXHUwMDNlZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9GSUxFO1xuIFx0XHRcdGJyZWFrO1xuIFx0XHRkZWZhdWx0OlxuLVx0XHRcdGNvbnQgPSAwO1xuK1x0XHRcdHJldHVybiBwO1xuIFx0XHR9XG4gXHR9XG4rfVxuK1xuKy8qIFBhcnNlIHRoZSAnb2Zmc2V0JywgJ21hZ2ljJyBhbmQgJ21hc2snIGZpZWxkcyBvZiBhbiAnTScgZW50cnkuICovXG4rc3RhdGljIGNoYXIgKnBhcnNlX21hZ2ljX2ZpZWxkcyhzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIGNoYXIgKnAsIGNoYXIgZGVsKVxuK3tcbitcdGNoYXIgKnM7XG4rXG4rXHQvKiBQYXJzZSB0aGUgJ29mZnNldCcgZmllbGQuICovXG4rXHRzID0gc3RyY2hyKHAsIGRlbCk7XG4rXHRpZiAoIXMpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0KnMgPSAnXFwwJztcbitcdGlmIChwICE9IHMpIHtcbitcdFx0aWYgKGtzdHJ0b2ludChwLCAxMCwgXHUwMDI2ZS1cdTAwM2VvZmZzZXQpIHx8IGUtXHUwMDNlb2Zmc2V0IFx1MDAzYyAwKVxuK1x0XHRcdHJldHVybiBOVUxMO1xuK1x0fVxuK1x0cCA9IHMgKyAxO1xuK1x0cHJfZGVidWcoXCJyZWdpc3Rlcjogb2Zmc2V0OiAlI3hcXG5cIiwgZS1cdTAwM2VvZmZzZXQpO1xuK1xuK1x0LyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQuICovXG4rXHRlLVx1MDAzZW1hZ2ljID0gcDtcbitcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4rXHRpZiAoIXAgfHwgIWUtXHUwMDNlbWFnaWNbMF0pXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4rXHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbcmF3XTogXCIsXG4rXHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hZ2ljLCBwIC0gZS1cdTAwM2VtYWdpYywgdHJ1ZSk7XG4rXG4rXHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xuK1x0ZS1cdTAwM2VtYXNrID0gcDtcbitcdHAgPSBzY2FuYXJnKHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWYgKCFlLVx1MDAzZW1hc2tbMF0pIHtcbitcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbitcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogIG1hc2tbcmF3XTogbm9uZVxcblwiKTtcbitcdH0gZWxzZSB7XG4rXHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCIsXG4rXHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIGUtXHUwMDNlbWFzaywgcCAtIGUtXHUwMDNlbWFzaywgdHJ1ZSk7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogRGVjb2RlIHRoZSBtYWdpYyBcdTAwMjYgbWFzayBmaWVsZHMuIE5vdGU6IHdoaWxlIHdlIG1pZ2h0IGhhdmUgYWNjZXB0ZWRcbitcdCAqIGVtYmVkZGVkIE5VTCBieXRlcyBmcm9tIGFib3ZlLCB0aGUgdW5lc2NhcGUgaGVscGVycyB3aWxsIHN0b3AgYXRcbitcdCAqIHRoZSBmaXJzdCBvbmUgdGhleSBlbmNvdW50ZXIuXG4rXHQgKi9cbitcdGUtXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XG4rXHRpZiAoZS1cdTAwM2VtYXNrIFx1MDAyNlx1MDAyNiBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cdTAwM2VzaXplKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlmIChlLVx1MDAzZXNpemUgXHUwMDNlIEJJTlBSTV9CVUZfU0laRSB8fCBCSU5QUk1fQlVGX1NJWkUgLSBlLVx1MDAzZXNpemUgXHUwMDNjIGUtXHUwMDNlb2Zmc2V0KVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwiLCBlLVx1MDAzZXNpemUpO1xuK1x0cHJpbnRfaGV4X2R1bXBfZGVidWcoXG4rXHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogbWFnaWNbZGVjb2RlZF06IFwiLFxuK1x0XHREVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplLCB0cnVlKTtcbitcdGlmIChlLVx1MDAzZW1hc2spXG4rXHRcdHByaW50X2hleF9kdW1wX2RlYnVnKFxuK1x0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbZGVjb2RlZF06IFwiLFxuK1x0XHRcdERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSwgdHJ1ZSk7XG4rXHRyZXR1cm4gcDtcbit9XG4rXG4rLyogUGFyc2UgdGhlICdtYWdpYycgZmllbGQgb2YgYW4gJ0UnIGVudHJ5OiB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uLiAqL1xuK3N0YXRpYyBjaGFyICpwYXJzZV9leHRlbnNpb25fZmllbGRzKHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgY2hhciAqcCxcbitcdFx0XHRcdCAgICBjaGFyIGRlbClcbit7XG4rXHQvKiBTa2lwIHRoZSAnb2Zmc2V0JyBmaWVsZC4gKi9cbitcdHAgPSBzdHJjaHIocCwgZGVsKTtcbitcdGlmICghcClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHQqcCsrID0gJ1xcMCc7XG4gXG4rXHQvKiBQYXJzZSB0aGUgJ21hZ2ljJyBmaWVsZC4gKi9cbitcdGUtXHUwMDNlbWFnaWMgPSBwO1xuK1x0cCA9IHN0cmNocihwLCBkZWwpO1xuK1x0aWYgKCFwKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdCpwKysgPSAnXFwwJztcbitcdGlmICghZS1cdTAwM2VtYWdpY1swXSB8fCBzdHJjaHIoZS1cdTAwM2VtYWdpYywgJy8nKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4rXG4rXHQvKiBTa2lwIHRoZSAnbWFzaycgZmllbGQuICovXG4rXHRwID0gc3RyY2hyKHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0KnArKyA9ICdcXDAnO1xuIFx0cmV0dXJuIHA7XG4gfVxuIFxuQEAgLTM0Nyw1MCArNDMzLDQ4IEBAIHN0YXRpYyBjaGFyICpjaGVja19zcGVjaWFsX2ZsYWdzKGNoYXIgKnNmcywgTm9kZSAqZSlcbiAgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncydcbiAgKiB3aGVyZSB0aGUgJzonIGlzIHRoZSBJRlMsIHRoYXQgY2FuIGJlIGNob3NlbiB3aXRoIHRoZSBmaXJzdCBjaGFyXG4gICovXG4tc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpXG4rc3RhdGljIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqY3JlYXRlX2VudHJ5KGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4rXHRcdFx0XHRcdCAgICAgIHNpemVfdCBjb3VudClcbiB7XG4tXHROb2RlICplO1xuLVx0aW50IG1lbXNpemUsIGVycjtcbitcdHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSBfX2ZyZWUoa2ZyZWUpID0gTlVMTDtcbiBcdGNoYXIgKmJ1ZiwgKnA7XG4gXHRjaGFyIGRlbDtcbiBcbiBcdHByX2RlYnVnKFwicmVnaXN0ZXI6IHJlY2VpdmVkICV6dSBieXRlc1xcblwiLCBjb3VudCk7XG4gXG4gXHQvKiBzb21lIHNhbml0eSBjaGVja3MgKi9cbi1cdGVyciA9IC1FSU5WQUw7XG4gXHRpZiAoKGNvdW50IFx1MDAzYyAxMSkgfHwgKGNvdW50IFx1MDAzZSBNQVhfUkVHSVNURVJfTEVOR1RIKSlcbi1cdFx0Z290byBvdXQ7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuLVx0ZXJyID0gLUVOT01FTTtcbi1cdG1lbXNpemUgPSBzaXplb2YoTm9kZSkgKyBjb3VudCArIDg7XG4tXHRlID0ga21hbGxvYyhtZW1zaXplLCBHRlBfS0VSTkVMX0FDQ09VTlQpO1xuK1x0ZSA9IGttYWxsb2Moc3RydWN0X3NpemUoZSwgYnVmLCBjb3VudCArIE1JU0NfREVMSU1fUEFEKSxcbitcdFx0ICAgIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4gXHRpZiAoIWUpXG4tXHRcdGdvdG8gb3V0O1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTtcbiBcbi1cdHAgPSBidWYgPSAoY2hhciAqKWUgKyBzaXplb2YoTm9kZSk7XG4rXHRwID0gYnVmID0gZS1cdTAwM2VidWY7XG4gXG4tXHRtZW1zZXQoZSwgMCwgc2l6ZW9mKE5vZGUpKTtcbitcdG1lbXNldChlLCAwLCBzaXplb2YoKmUpKTtcbiBcdGlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKVxuLVx0XHRnb3RvIGVmYXVsdDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7XG4gXG4tXHRkZWwgPSAqcCsrO1x0LyogZGVsaW1ldGVyICovXG4rXHRkZWwgPSAqcCsrO1x0LyogZGVsaW1pdGVyICovXG4gXG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBkZWxpbTogJSN4IHslY31cXG5cIiwgZGVsLCBkZWwpO1xuIFxuIFx0LyogUGFkIHRoZSBidWZmZXIgd2l0aCB0aGUgZGVsaW0gdG8gc2ltcGxpZnkgcGFyc2luZyBiZWxvdy4gKi9cbi1cdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCA4KTtcbitcdG1lbXNldChidWYgKyBjb3VudCwgZGVsLCBNSVNDX0RFTElNX1BBRCk7XG4gXG4gXHQvKiBQYXJzZSB0aGUgJ25hbWUnIGZpZWxkLiAqL1xuIFx0ZS1cdTAwM2VuYW1lID0gcDtcbiBcdHAgPSBzdHJjaHIocCwgZGVsKTtcbiBcdGlmICghcClcbi1cdFx0Z290byBlaW52YWw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnArKyA9ICdcXDAnO1xuIFx0aWYgKCFlLVx1MDAzZW5hbWVbMF0gfHxcbiBcdCAgICAhc3RyY21wKGUtXHUwMDNlbmFtZSwgXCIuXCIpIHx8XG4gXHQgICAgIXN0cmNtcChlLVx1MDAzZW5hbWUsIFwiLi5cIikgfHxcbiBcdCAgICBzdHJjaHIoZS1cdTAwM2VuYW1lLCAnLycpKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBuYW1lOiB7JXN9XFxuXCIsIGUtXHUwMDNlbmFtZSk7XG4gXG5AQCAtMzk4LDEzNCArNDgyLDMzIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIFx0c3dpdGNoICgqcCsrKSB7XG4gXHRjYXNlICdFJzpcbiBcdFx0cHJfZGVidWcoXCJyZWdpc3RlcjogdHlwZTogRSAoZXh0ZW5zaW9uKVxcblwiKTtcbi1cdFx0ZS1cdTAwM2VmbGFncyA9IDEgXHUwMDNjXHUwMDNjIEVuYWJsZWQ7XG4rXHRcdGUtXHUwMDNlZmxhZ3MgPSBCSVQoTUlTQ19GTVRfRU5BQkxFRF9CSVQpO1xuIFx0XHRicmVhaztcbiBcdGNhc2UgJ00nOlxuIFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiB0eXBlOiBNIChtYWdpYylcXG5cIik7XG4tXHRcdGUtXHUwMDNlZmxhZ3MgPSAoMSBcdTAwM2NcdTAwM2MgRW5hYmxlZCkgfCAoMSBcdTAwM2NcdTAwM2MgTWFnaWMpO1xuK1x0XHRlLVx1MDAzZWZsYWdzID0gQklUKE1JU0NfRk1UX0VOQUJMRURfQklUKSB8IEJJVChNSVNDX0ZNVF9NQUdJQ19CSVQpO1xuIFx0XHRicmVhaztcbiBcdGRlZmF1bHQ6XG4tXHRcdGdvdG8gZWludmFsO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcdH1cbiBcdGlmICgqcCsrICE9IGRlbClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRpZiAodGVzdF9iaXQoTWFnaWMsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJ00nIChtYWdpYykgZm9ybWF0LiAqL1xuLVx0XHRjaGFyICpzO1xuLVxuLVx0XHQvKiBQYXJzZSB0aGUgJ29mZnNldCcgZmllbGQuICovXG4tXHRcdHMgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFzKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcyA9ICdcXDAnO1xuLVx0XHRpZiAocCAhPSBzKSB7XG4tXHRcdFx0aW50IHIgPSBrc3RydG9pbnQocCwgMTAsIFx1MDAyNmUtXHUwMDNlb2Zmc2V0KTtcbi1cdFx0XHRpZiAociAhPSAwIHx8IGUtXHUwMDNlb2Zmc2V0IFx1MDAzYyAwKVxuLVx0XHRcdFx0Z290byBlaW52YWw7XG4tXHRcdH1cbi1cdFx0cCA9IHM7XG4tXHRcdGlmICgqcCsrKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBvZmZzZXQ6ICUjeFxcblwiLCBlLVx1MDAzZW9mZnNldCk7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hZ2ljID0gcDtcbi1cdFx0cCA9IHNjYW5hcmcocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRpZiAoIWUtXHUwMDNlbWFnaWNbMF0pXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmIChVU0VfREVCVUcpXG4tXHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW3Jhd106IFwiLFxuLVx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYWdpYywgcCAtIGUtXHUwMDNlbWFnaWMpO1xuLVxuLVx0XHQvKiBQYXJzZSB0aGUgJ21hc2snIGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hc2sgPSBwO1xuLVx0XHRwID0gc2NhbmFyZyhwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdGlmICghZS1cdTAwM2VtYXNrWzBdKSB7XG4tXHRcdFx0ZS1cdTAwM2VtYXNrID0gTlVMTDtcbi1cdFx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiAgbWFza1tyYXddOiBub25lXFxuXCIpO1xuLVx0XHR9IGVsc2UgaWYgKFVTRV9ERUJVRylcbi1cdFx0XHRwcmludF9oZXhfZHVtcF9ieXRlcyhcbi1cdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hc2tbcmF3XTogXCIsXG4tXHRcdFx0XHREVU1QX1BSRUZJWF9OT05FLCBlLVx1MDAzZW1hc2ssIHAgLSBlLVx1MDAzZW1hc2spO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogRGVjb2RlIHRoZSBtYWdpYyBcdTAwMjYgbWFzayBmaWVsZHMuXG4tXHRcdCAqIE5vdGU6IHdoaWxlIHdlIG1pZ2h0IGhhdmUgYWNjZXB0ZWQgZW1iZWRkZWQgTlVMIGJ5dGVzIGZyb21cbi1cdFx0ICogYWJvdmUsIHRoZSB1bmVzY2FwZSBoZWxwZXJzIGhlcmUgd2lsbCBzdG9wIGF0IHRoZSBmaXJzdCBvbmVcbi1cdFx0ICogaXQgZW5jb3VudGVycy5cbi1cdFx0ICovXG4tXHRcdGUtXHUwMDNlc2l6ZSA9IHN0cmluZ191bmVzY2FwZV9pbnBsYWNlKGUtXHUwMDNlbWFnaWMsIFVORVNDQVBFX0hFWCk7XG4tXHRcdGlmIChlLVx1MDAzZW1hc2sgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBzdHJpbmdfdW5lc2NhcGVfaW5wbGFjZShlLVx1MDAzZW1hc2ssIFVORVNDQVBFX0hFWCkgIT0gZS1cdTAwM2VzaXplKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRpZiAoZS1cdTAwM2VzaXplIFx1MDAzZSBCSU5QUk1fQlVGX1NJWkUgfHxcbi1cdFx0ICAgIEJJTlBSTV9CVUZfU0laRSAtIGUtXHUwMDNlc2l6ZSBcdTAwM2MgZS1cdTAwM2VvZmZzZXQpXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdHByX2RlYnVnKFwicmVnaXN0ZXI6IG1hZ2ljL21hc2sgbGVuZ3RoOiAlaVxcblwiLCBlLVx1MDAzZXNpemUpO1xuLVx0XHRpZiAoVVNFX0RFQlVHKSB7XG4tXHRcdFx0cHJpbnRfaGV4X2R1bXBfYnl0ZXMoXG4tXHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6IG1hZ2ljW2RlY29kZWRdOiBcIixcbi1cdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIGUtXHUwMDNlbWFnaWMsIGUtXHUwMDNlc2l6ZSk7XG4tXG4tXHRcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdFx0aW50IGk7XG4tXHRcdFx0XHRjaGFyICptYXNrZWQgPSBrbWFsbG9jKGUtXHUwMDNlc2l6ZSwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbi1cbi1cdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRLQlVJTERfTU9ETkFNRSBcIjogcmVnaXN0ZXI6ICBtYXNrW2RlY29kZWRdOiBcIixcbi1cdFx0XHRcdFx0RFVNUF9QUkVGSVhfTk9ORSwgZS1cdTAwM2VtYXNrLCBlLVx1MDAzZXNpemUpO1xuLVxuLVx0XHRcdFx0aWYgKG1hc2tlZCkge1xuLVx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBlLVx1MDAzZXNpemU7ICsraSlcbi1cdFx0XHRcdFx0XHRtYXNrZWRbaV0gPSBlLVx1MDAzZW1hZ2ljW2ldIFx1MDAyNiBlLVx1MDAzZW1hc2tbaV07XG4tXHRcdFx0XHRcdHByaW50X2hleF9kdW1wX2J5dGVzKFxuLVx0XHRcdFx0XHRcdEtCVUlMRF9NT0ROQU1FIFwiOiByZWdpc3RlcjogIG1hZ2ljW21hc2tlZF06IFwiLFxuLVx0XHRcdFx0XHRcdERVTVBfUFJFRklYX05PTkUsIG1hc2tlZCwgZS1cdTAwM2VzaXplKTtcbi1cbi1cdFx0XHRcdFx0a2ZyZWUobWFza2VkKTtcbi1cdFx0XHRcdH1cbi1cdFx0XHR9XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qIEhhbmRsZSB0aGUgJ0UnIChleHRlbnNpb24pIGZvcm1hdC4gKi9cbi1cbi1cdFx0LyogU2tpcCB0aGUgJ29mZnNldCcgZmllbGQuICovXG4tXHRcdHAgPSBzdHJjaHIocCwgZGVsKTtcbi1cdFx0aWYgKCFwKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHQqcCsrID0gJ1xcMCc7XG4tXG4tXHRcdC8qIFBhcnNlIHRoZSAnbWFnaWMnIGZpZWxkLiAqL1xuLVx0XHRlLVx1MDAzZW1hZ2ljID0gcDtcbi1cdFx0cCA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpwKysgPSAnXFwwJztcbi1cdFx0aWYgKCFlLVx1MDAzZW1hZ2ljWzBdIHx8IHN0cmNocihlLVx1MDAzZW1hZ2ljLCAnLycpKVxuLVx0XHRcdGdvdG8gZWludmFsO1xuLVx0XHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBleHRlbnNpb246IHslc31cXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4tXG4tXHRcdC8qIFNraXAgdGhlICdtYXNrJyBmaWVsZC4gKi9cbi1cdFx0cCA9IHN0cmNocihwLCBkZWwpO1xuLVx0XHRpZiAoIXApXG4tXHRcdFx0Z290byBlaW52YWw7XG4tXHRcdCpwKysgPSAnXFwwJztcbi1cdH1cbitcdGlmICh0ZXN0X2JpdChNSVNDX0ZNVF9NQUdJQ19CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuK1x0XHRwID0gcGFyc2VfbWFnaWNfZmllbGRzKGUsIHAsIGRlbCk7XG4rXHRlbHNlXG4rXHRcdHAgPSBwYXJzZV9leHRlbnNpb25fZmllbGRzKGUsIHAsIGRlbCk7XG4rXHRpZiAoIXApXG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFxuIFx0LyogUGFyc2UgdGhlICdpbnRlcnByZXRlcicgZmllbGQuICovXG4gXHRlLVx1MDAzZWludGVycHJldGVyID0gcDtcbiBcdHAgPSBzdHJjaHIocCwgZGVsKTtcbiBcdGlmICghcClcbi1cdFx0Z290byBlaW52YWw7XG4rXHRcdHJldHVybiBFUlJfUFRSKC1FSU5WQUwpO1xuIFx0KnArKyA9ICdcXDAnO1xuIFx0aWYgKCFlLVx1MDAzZWludGVycHJldGVyWzBdKVxuLVx0XHRnb3RvIGVpbnZhbDtcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4gXHRwcl9kZWJ1ZyhcInJlZ2lzdGVyOiBpbnRlcnByZXRlcjogeyVzfVxcblwiLCBlLVx1MDAzZWludGVycHJldGVyKTtcbiBcbiBcdC8qIFBhcnNlIHRoZSAnZmxhZ3MnIGZpZWxkLiAqL1xuQEAgLTUzMywyNCArNTE2LDIyIEBAIHN0YXRpYyBOb2RlICpjcmVhdGVfZW50cnkoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIFx0aWYgKCpwID09ICdcXG4nKVxuIFx0XHRwKys7XG4gXHRpZiAocCAhPSBidWYgKyBjb3VudClcbi1cdFx0Z290byBlaW52YWw7XG4tXG4tXHRyZXR1cm4gZTtcbi1cbi1vdXQ6XG4tXHRyZXR1cm4gRVJSX1BUUihlcnIpO1xuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTtcbiBcbi1lZmF1bHQ6XG4tXHRrZnJlZShlKTtcbi1cdHJldHVybiBFUlJfUFRSKC1FRkFVTFQpO1xuLWVpbnZhbDpcbi1cdGtmcmVlKGUpO1xuLVx0cmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7XG4rXHRyZXR1cm4gbm9fZnJlZV9wdHIoZSk7XG4gfVxuIFxuKy8qIENvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSAvc3RhdHVzIGFuZCAvXHUwMDNjZW50cnlcdTAwM2UgZmlsZXMuICovXG4rZW51bSBibV9jb21tYW5kIHtcbitcdEJNX0NNRF9JR05PUkUsXHQvKiBlbXB0eSB3cml0ZSAqL1xuK1x0Qk1fQ01EX0RJU0FCTEUsXHQvKiBcIjBcIiAqL1xuK1x0Qk1fQ01EX0VOQUJMRSxcdC8qIFwiMVwiICovXG4rXHRCTV9DTURfUkVNT1ZFLFx0LyogXCItMVwiICovXG4rfTtcbitcbiAvKlxuLSAqIFNldCBzdGF0dXMgb2YgZW50cnkvYmluZm10X21pc2M6XG4tICogJzEnIGVuYWJsZXMsICcwJyBkaXNhYmxlcyBhbmQgJy0xJyBjbGVhcnMgZW50cnkvYmluZm10X21pc2NcbisgKiBQYXJzZSB3aGF0IHVzZXJzcGFjZSB3cm90ZSB0byAvc3RhdHVzIG9yIGFuIGVudHJ5IGZpbGU6ICcxJyBlbmFibGVzLFxuKyAqICcwJyBkaXNhYmxlcyBhbmQgJy0xJyByZW1vdmVzIHRoZSBlbnRyeSBvciBhbGwgZW50cmllcy5cbiAgKi9cbiBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIHtcbkBAIC01NjEsNjIgKzU0Miw2NCBAQCBzdGF0aWMgaW50IHBhcnNlX2NvbW1hbmQoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50KVxuIFx0aWYgKGNvcHlfZnJvbV91c2VyKHMsIGJ1ZmZlciwgY291bnQpKVxuIFx0XHRyZXR1cm4gLUVGQVVMVDtcbiBcdGlmICghY291bnQpXG4tXHRcdHJldHVybiAwO1xuK1x0XHRyZXR1cm4gQk1fQ01EX0lHTk9SRTtcbiBcdGlmIChzW2NvdW50IC0gMV0gPT0gJ1xcbicpXG4gXHRcdGNvdW50LS07XG4gXHRpZiAoY291bnQgPT0gMSBcdTAwMjZcdTAwMjYgc1swXSA9PSAnMCcpXG4tXHRcdHJldHVybiAxO1xuK1x0XHRyZXR1cm4gQk1fQ01EX0RJU0FCTEU7XG4gXHRpZiAoY291bnQgPT0gMSBcdTAwMjZcdTAwMjYgc1swXSA9PSAnMScpXG4tXHRcdHJldHVybiAyO1xuK1x0XHRyZXR1cm4gQk1fQ01EX0VOQUJMRTtcbiBcdGlmIChjb3VudCA9PSAyIFx1MDAyNlx1MDAyNiBzWzBdID09ICctJyBcdTAwMjZcdTAwMjYgc1sxXSA9PSAnMScpXG4tXHRcdHJldHVybiAzO1xuK1x0XHRyZXR1cm4gQk1fQ01EX1JFTU9WRTtcbiBcdHJldHVybiAtRUlOVkFMO1xuIH1cbiBcbiAvKiBnZW5lcmljIHN0dWZmICovXG4gXG4tc3RhdGljIHZvaWQgZW50cnlfc3RhdHVzKE5vZGUgKmUsIGNoYXIgKnBhZ2UpXG4rc3RhdGljIHZvaWQgYm1fc2VxX2hleChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IHU4ICpkYXRhLCBpbnQgc2l6ZSlcbiB7XG4tXHRjaGFyICpkcCA9IHBhZ2U7XG4tXHRjb25zdCBjaGFyICpzdGF0dXMgPSBcImRpc2FibGVkXCI7XG4rXHRmb3IgKGludCBpID0gMDsgaSBcdTAwM2Mgc2l6ZTsgaSsrKVxuK1x0XHRzZXFfcHJpbnRmKG0sIFwiJTAyeFwiLCBkYXRhW2ldKTtcbit9XG4gXG4tXHRpZiAodGVzdF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpXG4tXHRcdHN0YXR1cyA9IFwiZW5hYmxlZFwiO1xuK3N0YXRpYyBpbnQgYm1fZW50cnlfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZClcbit7XG4rXHRzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUgPSBtLVx1MDAzZXByaXZhdGU7XG4gXG4tXHRpZiAoIVZFUkJPU0VfU1RBVFVTKSB7XG4tXHRcdHNwcmludGYocGFnZSwgXCIlc1xcblwiLCBzdGF0dXMpO1xuLVx0XHRyZXR1cm47XG4tXHR9XG4rXHRpZiAodGVzdF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpKVxuK1x0XHRzZXFfcHV0cyhtLCBcImVuYWJsZWRcXG5cIik7XG4rXHRlbHNlXG4rXHRcdHNlcV9wdXRzKG0sIFwiZGlzYWJsZWRcXG5cIik7XG4gXG4tXHRkcCArPSBzcHJpbnRmKGRwLCBcIiVzXFxuaW50ZXJwcmV0ZXIgJXNcXG5cIiwgc3RhdHVzLCBlLVx1MDAzZWludGVycHJldGVyKTtcbitcdHNlcV9wcmludGYobSwgXCJpbnRlcnByZXRlciAlc1xcblwiLCBlLVx1MDAzZWludGVycHJldGVyKTtcbiBcbiBcdC8qIHByaW50IHRoZSBzcGVjaWFsIGZsYWdzICovXG4tXHRkcCArPSBzcHJpbnRmKGRwLCBcImZsYWdzOiBcIik7XG4rXHRzZXFfcHV0cyhtLCBcImZsYWdzOiBcIik7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjApXG4tXHRcdCpkcCsrID0gJ1AnO1xuK1x0XHRzZXFfcHV0YyhtLCAnUCcpO1xuIFx0aWYgKGUtXHUwMDNlZmxhZ3MgXHUwMDI2IE1JU0NfRk1UX09QRU5fQklOQVJZKVxuLVx0XHQqZHArKyA9ICdPJztcbitcdFx0c2VxX3B1dGMobSwgJ08nKTtcbiBcdGlmIChlLVx1MDAzZWZsYWdzIFx1MDAyNiBNSVNDX0ZNVF9DUkVERU5USUFMUylcbi1cdFx0KmRwKysgPSAnQyc7XG4rXHRcdHNlcV9wdXRjKG0sICdDJyk7XG4gXHRpZiAoZS1cdTAwM2VmbGFncyBcdTAwMjYgTUlTQ19GTVRfT1BFTl9GSUxFKVxuLVx0XHQqZHArKyA9ICdGJztcbi1cdCpkcCsrID0gJ1xcbic7XG4rXHRcdHNlcV9wdXRjKG0sICdGJyk7XG4rXHRzZXFfcHV0YyhtLCAnXFxuJyk7XG4gXG4tXHRpZiAoIXRlc3RfYml0KE1hZ2ljLCBcdTAwMjZlLVx1MDAzZWZsYWdzKSkge1xuLVx0XHRzcHJpbnRmKGRwLCBcImV4dGVuc2lvbiAuJXNcXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4rXHRpZiAoIXRlc3RfYml0KE1JU0NfRk1UX01BR0lDX0JJVCwgXHUwMDI2ZS1cdTAwM2VmbGFncykpIHtcbitcdFx0c2VxX3ByaW50ZihtLCBcImV4dGVuc2lvbiAuJXNcXG5cIiwgZS1cdTAwM2VtYWdpYyk7XG4gXHR9IGVsc2Uge1xuLVx0XHRkcCArPSBzcHJpbnRmKGRwLCBcIm9mZnNldCAlaVxcbm1hZ2ljIFwiLCBlLVx1MDAzZW9mZnNldCk7XG4tXHRcdGRwID0gYmluMmhleChkcCwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbitcdFx0c2VxX3ByaW50ZihtLCBcIm9mZnNldCAlaVxcbm1hZ2ljIFwiLCBlLVx1MDAzZW9mZnNldCk7XG4rXHRcdGJtX3NlcV9oZXgobSwgZS1cdTAwM2VtYWdpYywgZS1cdTAwM2VzaXplKTtcbiBcdFx0aWYgKGUtXHUwMDNlbWFzaykge1xuLVx0XHRcdGRwICs9IHNwcmludGYoZHAsIFwiXFxubWFzayBcIik7XG4tXHRcdFx0ZHAgPSBiaW4yaGV4KGRwLCBlLVx1MDAzZW1hc2ssIGUtXHUwMDNlc2l6ZSk7XG4rXHRcdFx0c2VxX3B1dHMobSwgXCJcXG5tYXNrIFwiKTtcbitcdFx0XHRibV9zZXFfaGV4KG0sIGUtXHUwMDNlbWFzaywgZS1cdTAwM2VzaXplKTtcbiBcdFx0fVxuLVx0XHQqZHArKyA9ICdcXG4nO1xuLVx0XHQqZHAgPSAnXFwwJztcbitcdFx0c2VxX3B1dGMobSwgJ1xcbicpO1xuIFx0fVxuK1x0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmJtX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSlcbitzdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW1vZGVfdCBtb2RlKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpO1xuIFxuQEAgLTY1MiwxNCArNjM1LDE0IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZm10X21pc2MgKmlfYmluZm10X21pc2Moc3RydWN0IGlub2RlICppbm9kZSlcbiAgKiBlbnRyeSBpcyByZW1vdmVkIG9yIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZCBhbmQgdGhlIHN1cGVyIGJsb2NrIGlzXG4gICogc2h1dGRvd24uXG4gICpcbi0gKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnkgYSB3cml0ZVxuLSAqIHRvIHJlbW92ZSB0aGUgZW50cnkgb3IgYWxsIGVudHJpZXMgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgdGhlIGVudHJ5XG4tICogd2lsbCBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpc3QuIFdlIGtlZXAgdGhlIGxpc3RfZW1wdHkoKSBjaGVja1xuLSAqIHRvIG1ha2UgdGhhdCBleHBsaWNpdC5cbisgKiBJZiB0aGUgLVx1MDAzZWV2aWN0IGNhbGwgd2FzIG5vdCBjYXVzZWQgYnkgYSBzdXBlciBibG9jayBzaHV0ZG93biBidXQgYnlcbisgKiByZW1vdmluZyB0aGUgZW50cnkgdmlhIGJtX3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkgb3IgdW5saW5rKDIpIHRoZSBlbnRyeVxuKyAqIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBXZSBrZWVwIHRoZSBobGlzdF91bmhhc2hlZCgpXG4rICogY2hlY2sgdG8gbWFrZSB0aGF0IGV4cGxpY2l0LlxuICovXG4gc3RhdGljIHZvaWQgYm1fZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSlcbiB7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFxuIFx0Y2xlYXJfaW5vZGUoaW5vZGUpO1xuIFxuQEAgLTY2Nyw4OSArNjUwLDEzMiBAQCBzdGF0aWMgdm9pZCBibV9ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIFx0XHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXG4gXHRcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGlub2RlKTtcbi1cdFx0d3JpdGVfbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4tXHRcdGlmICghbGlzdF9lbXB0eShcdTAwMjZlLVx1MDAzZWxpc3QpKVxuLVx0XHRcdGxpc3RfZGVsX2luaXQoXHUwMDI2ZS1cdTAwM2VsaXN0KTtcbi1cdFx0d3JpdGVfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdFx0c3Bpbl9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdFx0aWYgKCFobGlzdF91bmhhc2hlZChcdTAwMjZlLVx1MDAzZW5vZGUpKVxuK1x0XHRcdGhsaXN0X2RlbF9pbml0X3JjdShcdTAwMjZlLVx1MDAzZW5vZGUpO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4gXHRcdHB1dF9iaW5mbXRfaGFuZGxlcihlKTtcbiBcdH1cbiB9XG4gXG4rLyoqXG4rICogdW5saW5rX2JpbmZtdF9oYW5kbGVyIC0gdW5oYXNoIGEgYmluYXJ5IHR5cGUgaGFuZGxlclxuKyAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbisgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byB1bmhhc2hcbisgKlxuKyAqIEFkZGluZyBhbmQgcmVtb3ZpbmcgZW50cmllcyB2aWEgYm1fe2VudHJ5LHJlZ2lzdGVyLHN0YXR1c31fd3JpdGUoKSBhbmRcbisgKiB1bmxpbmsoMikgaGFwcGVucyB1bmRlciB0aGUgZXhjbHVzaXZlbHkgaGVsZCBpbm9kZSBsb2NrIG9mIHRoZSByb290XG4rICogZGVudHJ5IGtlZXBpbmcgdGhlIGxpc3Qgc3RhYmxlIGZvciB3cml0ZXJzLiBsb2FkX21pc2NfYmluYXJ5KCkgd2Fsa3MgaXRcbisgKiBjb25jdXJyZW50bHkgdW5kZXIgUkNVLiBUaGUgZW50cmllc19sb2NrIGlzIG9ubHkgaGVsZCBhcm91bmQgdGhlIGFjdHVhbFxuKyAqIHVubGluayB0byBzZXJpYWxpemUgYWdhaW5zdCBibV9ldmljdF9pbm9kZSgpIHdoaWNoIHVubGlua3MgZW50cmllc1xuKyAqIGR1cmluZyB1bW91bnQgd2l0aG91dCBob2xkaW5nIHRoZSByb290IGlub2RlIGxvY2suXG4rICovXG4rc3RhdGljIHZvaWQgdW5saW5rX2JpbmZtdF9oYW5kbGVyKHN0cnVjdCBiaW5mbXRfbWlzYyAqbWlzYyxcbitcdFx0XHRcdCAgc3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplKVxuK3tcbitcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHRobGlzdF9kZWxfaW5pdF9yY3UoXHUwMDI2ZS1cdTAwM2Vub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbit9XG4rXG4gLyoqXG4gICogcmVtb3ZlX2JpbmZtdF9oYW5kbGVyIC0gcmVtb3ZlIGEgYmluYXJ5IHR5cGUgaGFuZGxlclxuICAqIEBtaXNjOiBoYW5kbGUgdG8gYmluZm10X21pc2MgaW5zdGFuY2VcbiAgKiBAZTogYmluYXJ5IHR5cGUgaGFuZGxlciB0byByZW1vdmVcbiAgKlxuICAqIFJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgZnJvbSB0aGUgbGlzdCBvZiBiaW5hcnkgdHlwZSBoYW5kbGVycyBhbmRcbi0gKiByZW1vdmUgaXRzIGFzc29jaWF0ZWQgZGVudHJ5LiBUaGlzIGlzIGNhbGxlZCBmcm9tXG4tICogYmluZm10X3tlbnRyeSxzdGF0dXN9X3dyaXRlKCkuIEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IHdhbnQgdG8gdGhpbmsgYWJvdXRcbi0gKiBhZGRpbmcgYSBwcm9wZXIgLVx1MDAzZXVubGluaygpIG1ldGhvZCB0byBiaW5mbXRfbWlzYyBpbnN0ZWFkIG9mIGZvcmNpbmcgY2FsbGVyJ3Ncbi0gKiB0byB1c2Ugd3JpdGVzIHRvIGZpbGVzIGluIG9yZGVyIHRvIGRlbGV0ZSBiaW5hcnkgdHlwZSBoYW5kbGVycy4gQnV0IGl0IGhhc1xuLSAqIHdvcmtlZCBmb3Igc28gbG9uZyB0aGF0IGl0J3Mgbm90IGEgcHJlc3NpbmcgaXNzdWUuXG4rICogcmVtb3ZlIGl0cyBhc3NvY2lhdGVkIGRlbnRyeS5cbiAgKi9cbi1zdGF0aWMgdm9pZCByZW1vdmVfYmluZm10X2hhbmRsZXIoc3RydWN0IGJpbmZtdF9taXNjICptaXNjLCBOb2RlICplKVxuK3N0YXRpYyB2b2lkIHJlbW92ZV9iaW5mbXRfaGFuZGxlcihzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4rXHRcdFx0XHQgIHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSlcbiB7XG4tXHR3cml0ZV9sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbi1cdGxpc3RfZGVsX2luaXQoXHUwMDI2ZS1cdTAwM2VsaXN0KTtcbi1cdHdyaXRlX3VubG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHR1bmxpbmtfYmluZm10X2hhbmRsZXIobWlzYywgZSk7XG4gXHRsb2NrZWRfcmVjdXJzaXZlX3JlbW92YWwoZS1cdTAwM2VkZW50cnksIE5VTEwpO1xuIH1cbiBcbi0vKiAvXHUwMDNjZW50cnlcdTAwM2UgKi9cbisvKiBSZW1vdmUgQGUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQuICovXG4rc3RhdGljIHZvaWQgYm1fcmVtb3ZlX2VudHJ5KHN0cnVjdCBiaW5mbXRfbWlzY19lbnRyeSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbit7XG4rXHRzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCk7XG4gXG4tc3RhdGljIHNzaXplX3Rcbi1ibV9lbnRyeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpXG4rXHRpbm9kZV9sb2NrX25lc3RlZChyb290LCBJX01VVEVYX1BBUkVOVCk7XG4rXHRpZiAoIWhsaXN0X3VuaGFzaGVkKFx1MDAyNmUtXHUwMDNlbm9kZSkpXG4rXHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKHJvb3QpLCBlKTtcbitcdGlub2RlX3VubG9jayhyb290KTtcbit9XG4rXG4rLyogUmVtb3ZlIGFsbCBlbnRyaWVzIG9mIHRoZSBiaW5mbXRfbWlzYyBpbnN0YW5jZSBAbWlzYyBiZWxvbmdpbmcgdG8gQHNiLiAqL1xuK3N0YXRpYyB2b2lkIGJtX3JlbW92ZV9hbGxfZW50cmllcyhzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2MsXG4rXHRcdFx0XHQgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0Tm9kZSAqZSA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9wcml2YXRlO1xuLVx0c3NpemVfdCByZXM7XG4tXHRjaGFyICpwYWdlO1xuK1x0c3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYi1cdTAwM2VzX3Jvb3QpO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplO1xuK1x0c3RydWN0IGhsaXN0X25vZGUgKm5leHQ7XG4rXG4rXHRpbm9kZV9sb2NrX25lc3RlZChyb290LCBJX01VVEVYX1BBUkVOVCk7XG4rXHRobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGUsIG5leHQsIFx1MDAyNm1pc2MtXHUwMDNlZW50cmllcywgbm9kZSlcbitcdFx0cmVtb3ZlX2JpbmZtdF9oYW5kbGVyKG1pc2MsIGUpO1xuK1x0aW5vZGVfdW5sb2NrKHJvb3QpO1xuK31cbiBcbi1cdHBhZ2UgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7XG4tXHRpZiAoIXBhZ2UpXG4tXHRcdHJldHVybiAtRU5PTUVNO1xuKy8qKlxuKyAqIGJtX3VubGluayAtIHJlbW92ZSBhIGJpbmFyeSB0eXBlIGhhbmRsZXIgdmlhIHVubGluaygyKVxuKyAqIEBkaXI6IGlub2RlIG9mIHRoZSByb290IGRpcmVjdG9yeVxuKyAqIEBkZW50cnk6IGVudHJ5IGZpbGUgdG8gcmVtb3ZlXG4rICpcbisgKiBSZW1vdmluZyB0aGUgZW50cnkgZmlsZSByZW1vdmVzIGl0cyBiaW5hcnkgdHlwZSBoYW5kbGVyLCBleGFjdGx5IGxpa2VcbisgKiB3cml0aW5nIC0xIHRvIGl0IGRvZXMuIFRoZSBzdGF0dXMgYW5kIHJlZ2lzdGVyIGNvbnRyb2wgZmlsZXMgY2FuJ3QgYmVcbisgKiByZW1vdmVkLiBUaGUgVkZTIGNhbGxzIHRoaXMgd2l0aCB0aGUgcm9vdCBpbm9kZSBsb2NrIGhlbGQgd2hpY2hcbisgKiBzZXJpYWxpemVzIGFnYWluc3QgdGhlIHdyaXRlIGJhc2VkIGFkZCBhbmQgcmVtb3ZlIHBhdGhzLlxuKyAqL1xuK3N0YXRpYyBpbnQgYm1fdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4re1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gZF9pbm9kZShkZW50cnkpLVx1MDAzZWlfcHJpdmF0ZTtcbitcbitcdGlmICghZSlcbitcdFx0cmV0dXJuIC1FUEVSTTtcbitcbitcdHVubGlua19iaW5mbXRfaGFuZGxlcihpX2JpbmZtdF9taXNjKGRpciksIGUpO1xuK1x0cmV0dXJuIHNpbXBsZV91bmxpbmsoZGlyLCBkZW50cnkpO1xuK31cbiBcbi1cdGVudHJ5X3N0YXR1cyhlLCBwYWdlKTtcbitzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYm1fZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7XG4rXHQubG9va3VwXHRcdD0gc2ltcGxlX2xvb2t1cCxcbitcdC51bmxpbmtcdFx0PSBibV91bmxpbmssXG4rfTtcbiBcbi1cdHJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYWdlLCBzdHJsZW4ocGFnZSkpO1xuKy8qIC9cdTAwM2NlbnRyeVx1MDAzZSAqL1xuK1xuK3N0YXRpYyBpbnQgYm1fZW50cnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSlcbit7XG4rXHRpbnQgcmV0O1xuIFxuLVx0a2ZyZWUocGFnZSk7XG4tXHRyZXR1cm4gcmVzO1xuK1x0cmV0ID0gc2luZ2xlX29wZW4oZmlsZSwgYm1fZW50cnlfc2hvdywgaW5vZGUtXHUwMDNlaV9wcml2YXRlKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiBzZXFfb3BlbigpIGNsZWFycyBGTU9ERV9QV1JJVEUsIGJtX2VudHJ5X3dyaXRlKCkgdGFrZXMgYW55IG9mZnNldCAqL1xuK1x0aWYgKGZpbGUtXHUwMDNlZl9tb2RlIFx1MDAyNiBGTU9ERV9XUklURSlcbitcdFx0ZmlsZS1cdTAwM2VmX21vZGUgfD0gRk1PREVfUFdSSVRFO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyBzc2l6ZV90IGJtX2VudHJ5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdFx0c2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XG4tXHROb2RlICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplID0gaW5vZGUtXHUwMDNlaV9wcml2YXRlO1xuIFx0aW50IHJlcyA9IHBhcnNlX2NvbW1hbmQoYnVmZmVyLCBjb3VudCk7XG4gXG4gXHRzd2l0Y2ggKHJlcykge1xuLVx0Y2FzZSAxOlxuLVx0XHQvKiBEaXNhYmxlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0Y2xlYXJfYml0KEVuYWJsZWQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuK1x0Y2FzZSBCTV9DTURfRElTQUJMRTpcbitcdFx0Y2xlYXJfYml0KE1JU0NfRk1UX0VOQUJMRURfQklULCBcdTAwMjZlLVx1MDAzZWZsYWdzKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDI6XG4tXHRcdC8qIEVuYWJsZSB0aGlzIGhhbmRsZXIuICovXG4tXHRcdHNldF9iaXQoRW5hYmxlZCwgXHUwMDI2ZS1cdTAwM2VmbGFncyk7XG4rXHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4rXHRcdHNldF9iaXQoTUlTQ19GTVRfRU5BQkxFRF9CSVQsIFx1MDAyNmUtXHUwMDNlZmxhZ3MpO1xuIFx0XHRicmVhaztcbi1cdGNhc2UgMzpcbi1cdFx0LyogRGVsZXRlIHRoaXMgaGFuZGxlci4gKi9cbi1cdFx0aW5vZGUgPSBkX2lub2RlKGlub2RlLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KTtcbi1cdFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0XG4tXHRcdCAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGVcbi1cdFx0ICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuXG4tXHRcdCAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbid0IGJlXG4tXHRcdCAqIG1vZGlmaWVkLiBPbmx5IGxvYWRfbWlzY19iaW5hcnkoKSBjYW4gYWNjZXNzIGJ1dCBkb2VzIHNvXG4tXHRcdCAqIHJlYWQtb25seS4gU28gd2Ugb25seSBuZWVkIHRvIHRha2UgdGhlIHdyaXRlIGxvY2sgd2hlbiB3ZVxuLVx0XHQgKiBhY3R1YWxseSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGxpc3QuXG4tXHRcdCAqL1xuLVx0XHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2ZS1cdTAwM2VsaXN0KSlcbi1cdFx0XHRyZW1vdmVfYmluZm10X2hhbmRsZXIoaV9iaW5mbXRfbWlzYyhpbm9kZSksIGUpO1xuLVxuLVx0XHRpbm9kZV91bmxvY2soaW5vZGUpO1xuK1x0Y2FzZSBCTV9DTURfUkVNT1ZFOlxuK1x0XHRibV9yZW1vdmVfZW50cnkoZSwgaW5vZGUtXHUwMDNlaV9zYik7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIHJlcztcbkBAIC03NTksMTUgKzc4NSwxNyBAQCBzdGF0aWMgc3NpemVfdCBibV9lbnRyeV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB9XG4gXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fZW50cnlfb3BlcmF0aW9ucyA9IHtcbi1cdC5yZWFkXHRcdD0gYm1fZW50cnlfcmVhZCxcbitcdC5vcGVuXHRcdD0gYm1fZW50cnlfb3BlbixcbitcdC5yZWFkXHRcdD0gc2VxX3JlYWQsXG4gXHQud3JpdGVcdFx0PSBibV9lbnRyeV93cml0ZSxcbi1cdC5sbHNlZWtcdFx0PSBkZWZhdWx0X2xsc2VlayxcbitcdC5sbHNlZWtcdFx0PSBzZXFfbHNlZWssXG4rXHQucmVsZWFzZVx0PSBzaW5nbGVfcmVsZWFzZSxcbiB9O1xuIFxuIC8qIC9yZWdpc3RlciAqL1xuIFxuIC8qIGFkZCB0byBmaWxlc3lzdGVtICovXG4tc3RhdGljIGludCBhZGRfZW50cnkoTm9kZSAqZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbitzdGF0aWMgaW50IGFkZF9lbnRyeShzdHJ1Y3QgYmluZm10X21pc2NfZW50cnkgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuIFx0c3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gc2ltcGxlX3N0YXJ0X2NyZWF0aW5nKHNiLVx1MDAzZXNfcm9vdCwgZS1cdTAwM2VuYW1lKTtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG5AQCAtNzg5LDkgKzgxNyw5IEBAIHN0YXRpYyBpbnQgYWRkX2VudHJ5KE5vZGUgKmUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gXG4gXHRkX21ha2VfcGVyc2lzdGVudChkZW50cnksIGlub2RlKTtcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGlub2RlKTtcbi1cdHdyaXRlX2xvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuLVx0bGlzdF9hZGQoXHUwMDI2ZS1cdTAwM2VsaXN0LCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuLVx0d3JpdGVfdW5sb2NrKFx1MDAyNm1pc2MtXHUwMDNlZW50cmllc19sb2NrKTtcbitcdHNwaW5fbG9jayhcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXNfbG9jayk7XG4rXHRobGlzdF9hZGRfaGVhZF9yY3UoXHUwMDI2ZS1cdTAwM2Vub2RlLCBcdTAwMjZtaXNjLVx1MDAzZWVudHJpZXMpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFx0c2ltcGxlX2RvbmVfY3JlYXRpbmcoZGVudHJ5KTtcbiBcdHJldHVybiAwO1xuIH1cbkBAIC03OTksMTMgKzgyNywxMiBAQCBzdGF0aWMgaW50IGFkZF9lbnRyeShOb2RlICplLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHN0YXRpYyBzc2l6ZV90IGJtX3JlZ2lzdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLFxuIFx0XHRcdCAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcylcbiB7XG4tXHROb2RlICplO1xuK1x0c3RydWN0IGJpbmZtdF9taXNjX2VudHJ5ICplIF9fZnJlZShrZnJlZSkgPSBOVUxMO1xuIFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9zYjtcbi1cdGludCBlcnIgPSAwO1xuIFx0c3RydWN0IGZpbGUgKmYgPSBOVUxMO1xuK1x0aW50IGVycjtcbiBcbiBcdGUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7XG4tXG4gXHRpZiAoSVNfRVJSKGUpKVxuIFx0XHRyZXR1cm4gUFRSX0VSUihlKTtcbiBcbkBAIC04MjIsNyArODQ5LDYgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdGlmIChJU19FUlIoZikpIHtcbiBcdFx0XHRwcl9ub3RpY2UoXCJyZWdpc3RlcjogZmFpbGVkIHRvIGluc3RhbGwgaW50ZXJwcmV0ZXIgZmlsZSAlc1xcblwiLFxuIFx0XHRcdFx0IGUtXHUwMDNlaW50ZXJwcmV0ZXIpO1xuLVx0XHRcdGtmcmVlKGUpO1xuIFx0XHRcdHJldHVybiBQVFJfRVJSKGYpO1xuIFx0XHR9XG4gXHRcdGUtXHUwMDNlaW50ZXJwX2ZpbGUgPSBmO1xuQEAgLTgzNCw5ICs4NjAsMTEgQEAgc3RhdGljIHNzaXplX3QgYm1fcmVnaXN0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsXG4gXHRcdFx0ZXhlX2ZpbGVfYWxsb3dfd3JpdGVfYWNjZXNzKGYpO1xuIFx0XHRcdGZpbHBfY2xvc2UoZiwgTlVMTCk7XG4gXHRcdH1cbi1cdFx0a2ZyZWUoZSk7XG4gXHRcdHJldHVybiBlcnI7XG4gXHR9XG4rXG4rXHQvKiBUaGUgZW50cnkgaXMgb3duZWQgYnkgaXRzIGlub2RlIG5vdy4gKi9cbitcdHJldGFpbl9hbmRfbnVsbF9wdHIoZSk7XG4gXHRyZXR1cm4gY291bnQ7XG4gfVxuIFxuQEAgLTg1MSwxMCArODc5LDEwIEBAIHN0YXRpYyBzc2l6ZV90XG4gYm1fc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcylcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4tXHRjaGFyICpzO1xuK1x0Y29uc3QgY2hhciAqcztcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuLVx0cyA9IG1pc2MtXHUwMDNlZW5hYmxlZCA/IFwiZW5hYmxlZFxcblwiIDogXCJkaXNhYmxlZFxcblwiO1xuK1x0cyA9IFJFQURfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQpID8gXCJlbmFibGVkXFxuXCIgOiBcImRpc2FibGVkXFxuXCI7XG4gXHRyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHMsIHN0cmxlbihzKSk7XG4gfVxuIFxuQEAgLTg2MywzNyArODkxLDE3IEBAIHN0YXRpYyBzc2l6ZV90IGJtX3N0YXR1c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlcixcbiB7XG4gXHRzdHJ1Y3QgYmluZm10X21pc2MgKm1pc2M7XG4gXHRpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTtcbi1cdE5vZGUgKmUsICpuZXh0O1xuLVx0c3RydWN0IGlub2RlICppbm9kZTtcbiBcbiBcdG1pc2MgPSBpX2JpbmZtdF9taXNjKGZpbGVfaW5vZGUoZmlsZSkpO1xuIFx0c3dpdGNoIChyZXMpIHtcbi1cdGNhc2UgMTpcbi1cdFx0LyogRGlzYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IGZhbHNlO1xuK1x0Y2FzZSBCTV9DTURfRElTQUJMRTpcbitcdFx0V1JJVEVfT05DRShtaXNjLVx1MDAzZWVuYWJsZWQsIGZhbHNlKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDI6XG4tXHRcdC8qIEVuYWJsZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdG1pc2MtXHUwMDNlZW5hYmxlZCA9IHRydWU7XG4rXHRjYXNlIEJNX0NNRF9FTkFCTEU6XG4rXHRcdFdSSVRFX09OQ0UobWlzYy1cdTAwM2VlbmFibGVkLCB0cnVlKTtcbiBcdFx0YnJlYWs7XG4tXHRjYXNlIDM6XG4tXHRcdC8qIERlbGV0ZSBhbGwgaGFuZGxlcnMuICovXG4tXHRcdGlub2RlID0gZF9pbm9kZShmaWxlX2lub2RlKGZpbGUpLVx1MDAzZWlfc2ItXHUwMDNlc19yb290KTtcbi1cdFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfUEFSRU5UKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogSW4gb3JkZXIgdG8gYWRkIG5ldyBlbGVtZW50IG9yIHJlbW92ZSBlbGVtZW50cyBmcm9tIHRoZSBsaXN0XG4tXHRcdCAqIHZpYSBibV97ZW50cnkscmVnaXN0ZXIsc3RhdHVzfV93cml0ZSgpIGlub2RlX2xvY2soKSBvbiB0aGVcbi1cdFx0ICogcm9vdCBpbm9kZSBtdXN0IGJlIGhlbGQuXG4tXHRcdCAqIFRoZSBsb2NrIGlzIGV4Y2x1c2l2ZSBlbnN1cmluZyB0aGF0IHRoZSBsaXN0IGNhbid0IGJlXG4tXHRcdCAqIG1vZGlmaWVkLiBPbmx5IGxvYWRfbWlzY19iaW5hcnkoKSBjYW4gYWNjZXNzIGJ1dCBkb2VzIHNvXG4tXHRcdCAqIHJlYWQtb25seS4gU28gd2Ugb25seSBuZWVkIHRvIHRha2UgdGhlIHdyaXRlIGxvY2sgd2hlbiB3ZVxuLVx0XHQgKiBhY3R1YWxseSByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGxpc3QuXG4tXHRcdCAqL1xuLVx0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgbmV4dCwgXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzLCBsaXN0KVxuLVx0XHRcdHJlbW92ZV9iaW5mbXRfaGFuZGxlcihtaXNjLCBlKTtcbi1cbi1cdFx0aW5vZGVfdW5sb2NrKGlub2RlKTtcbitcdGNhc2UgQk1fQ01EX1JFTU9WRTpcbitcdFx0Ym1fcmVtb3ZlX2FsbF9lbnRyaWVzKG1pc2MsIGZpbGVfaW5vZGUoZmlsZSktXHUwMDNlaV9zYik7XG4gXHRcdGJyZWFrO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIHJlcztcbkBAIC05MTgsNyArOTI2LDcgQEAgc3RhdGljIHZvaWQgYm1fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gXHRwdXRfdXNlcl9ucyh1c2VyX25zKTtcbiB9XG4gXG4tc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNfb3BzID0ge1xuK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBibV9zdXBlcl9vcHMgPSB7XG4gXHQuc3RhdGZzXHRcdD0gc2ltcGxlX3N0YXRmcyxcbiBcdC5ldmljdF9pbm9kZVx0PSBibV9ldmljdF9pbm9kZSxcbiBcdC5wdXRfc3VwZXJcdD0gYm1fcHV0X3N1cGVyLFxuQEAgLTk2NSwxMCArOTczLDEwIEBAIHN0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXG4gXHRcdGlmICghbWlzYylcbiBcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcbi1cdFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbi1cdFx0cndsb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuK1x0XHRJTklUX0hMSVNUX0hFQUQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzKTtcbitcdFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2bWlzYy1cdTAwM2VlbnRyaWVzX2xvY2spO1xuIFxuLVx0XHQvKiBQYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBpbiBsb2FkX2JpbmZtdF9taXNjKCkuICovXG4rXHRcdC8qIFBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGluIGN1cnJlbnRfYmluZm10X21pc2MoKS4gKi9cbiBcdFx0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2dXNlcl9ucy1cdTAwM2ViaW5mbXRfbWlzYywgbWlzYyk7XG4gXHR9XG4gXG5AQCAtOTgzLDEyICs5OTEsMTUgQEAgc3RhdGljIGludCBibV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdCAqIHNvbWVvbmUgbW91bnRzIGJpbmZtdF9taXNjIGZvciB0aGUgZmlyc3QgdGltZSBvciBhZ2FpbiB3ZSBzaW1wbHlcbiBcdCAqIHJlc2V0IC1cdTAwM2VlbmFibGVkIHRvIHRydWUuXG4gXHQgKi9cbi1cdG1pc2MtXHUwMDNlZW5hYmxlZCA9IHRydWU7XG4rXHRXUklURV9PTkNFKG1pc2MtXHUwMDNlZW5hYmxlZCwgdHJ1ZSk7XG4gXG4gXHRlcnIgPSBzaW1wbGVfZmlsbF9zdXBlcihzYiwgQklORk1URlNfTUFHSUMsIGJtX2ZpbGVzKTtcbi1cdGlmICghZXJyKVxuLVx0XHRzYi1cdTAwM2VzX29wID0gXHUwMDI2c19vcHM7XG4tXHRyZXR1cm4gZXJyO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdHNiLVx1MDAzZXNfb3AgPSBcdTAwMjZibV9zdXBlcl9vcHM7XG4rXHRkX2lub2RlKHNiLVx1MDAzZXNfcm9vdCktXHUwMDNlaV9vcCA9IFx1MDAyNmJtX2Rpcl9pbm9kZV9vcGVyYXRpb25zO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGJtX2ZyZWUoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oIGIvaW5jbHVkZS9saW51eC9iaW5mbXRzLmhcbmluZGV4IDJjNzdlMzgzZTczNzU3Li43ZTczMzNiN2JiMGYxMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYmluZm10cy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2JpbmZtdHMuaFxuQEAgLTEwMSw4ICsxMDEsOCBAQCBzdHJ1Y3QgbGludXhfYmluZm10IHtcbiBcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpXG4gc3RydWN0IGJpbmZtdF9taXNjIHtcbi1cdHN0cnVjdCBsaXN0X2hlYWQgZW50cmllcztcbi1cdHJ3bG9ja190IGVudHJpZXNfbG9jaztcbitcdHN0cnVjdCBobGlzdF9oZWFkIGVudHJpZXM7XG4rXHRzcGlubG9ja190IGVudHJpZXNfbG9jaztcbiBcdGJvb2wgZW5hYmxlZDtcbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuY1xuaW5kZXggN2FlZjRlNjc5YTZhMGMuLjIxYmFmZGMxMTM3OTU2IDEwMDY0NFxuLS0tIGEva2VybmVsL3VzZXIuY1xuKysrIGIva2VybmVsL3VzZXIuY1xuQEAgLTIzLDkgKzIzLDkgQEBcbiBcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQklORk1UX01JU0MpXG4gc3RydWN0IGJpbmZtdF9taXNjIGluaXRfYmluZm10X21pc2MgPSB7XG4tXHQuZW50cmllcyA9IExJU1RfSEVBRF9JTklUKGluaXRfYmluZm10X21pc2MuZW50cmllcyksXG4rXHQuZW50cmllcyA9IEhMSVNUX0hFQURfSU5JVCxcbiBcdC5lbmFibGVkID0gdHJ1ZSxcbi1cdC5lbnRyaWVzX2xvY2sgPSBfX1JXX0xPQ0tfVU5MT0NLRUQoaW5pdF9iaW5mbXRfbWlzYy5lbnRyaWVzX2xvY2spLFxuK1x0LmVudHJpZXNfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGluaXRfYmluZm10X21pc2MuZW50cmllc19sb2NrKSxcbiB9O1xuIEVYUE9SVF9TWU1CT0xfR1BMKGluaXRfYmluZm10X21pc2MpO1xuICNlbmRpZlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMjA6MzI6MzkuNDgzMDUxNDZaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4NTAwMzA4Mjg3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEZ1enppbmcgU3RyYXRlZ3kgZm9yIHRoZSBiaW5mbXRfbWlzYyBQYXRjaCoqXG5cbk9rYXksIHNvIEkndmUgZ290IHRoaXMgc3Vic3RhbnRpYWwgcGF0Y2ggdG91Y2hpbmcgYGZzL2JpbmZtdF9taXNjLmNgLiBJdCdzIGEgYmlnIGludGVybmFsIHJlZmFjdG9yLCBzd2l0Y2hpbmcgZnJvbSBhIGBsaXN0X2hlYWRgIHRvIGFuIGBobGlzdF9oZWFkYCwgUkNVIGZvciBsb29rdXBzLCBgc3BpbmxvY2tfdGAgaW4gcGxhY2Ugb2YgYHJ3bG9ja190YCwgY2xlYW51cCByb3V0aW5lcywgYHNlcV9maWxlYCBmb3IgYGJtX2VudHJ5X3JlYWRgLCBhbmQgZW5hYmxpbmcgYHVubGluaygyKWAgb24gZW50cnkgZmlsZXMuIE15IGltbWVkaWF0ZSBjb25jZXJuIGlzLCBpcyB0aGlzIHJlYWNoYWJsZSwgYW5kIGhvdyBjYW4gSSBicmVhayBpdD9cblxuRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoYXQgdGhpcyBpcyBhIGNyaXRpY2FsIGNvZGUgcGF0aC4gWWVzLCBgYmluZm10X21pc2NgIGlzIGFic29sdXRlbHkgZXNzZW50aWFsLiBJdCdzIHRoZSBjb3JlIG9mIGV4ZWN1dGluZyBhcmJpdHJhcnkgYmluYXJ5IGZvcm1hdHMgd2l0aGluIHRoZSBrZXJuZWwsIHNvIGl0J3MgYSByaXBlIHRhcmdldCBmb3IgZnV6emluZy4gSSBjYW4gcmVhY2ggaXQgZnJvbSB1c2Vyc3BhY2UgYnkgbW91bnRpbmcgdGhlIGBiaW5mbXRfbWlzY2AgZmlsZXN5c3RlbSBhbmQgdGhlbiB3cml0aW5nIHRvIGl0cyBmaWxlcywgYW5kIGl0IHVsdGltYXRlbHkgbW9kaWZpZXMgYGxvYWRfbWlzY19iaW5hcnlgLCB3aGljaCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBgZXhlY3ZlYCBzeXN0ZW0gY2FsbCwgc28gdGhlcmUncyBwbGVudHkgb2YgdXNlciBpbnRlcmFjdGlvbi4gVGhhdCdzIGdvb2Q7IHVzZXIgaW50ZXJhY3Rpb24gaXMgY3JpdGljYWwuXG5cbk5vdywgSSdtIGdvaW5nIHRvIG1hcCBvdXQgdGhlIGF0dGFjayBzdXJmYWNlLiBCYXNlZCBvbiB0aGUgcGF0Y2gsIGl0IGxvb2tzIGxpa2UgdGhlc2UgYXJlIHRoZSBrZXkgZnVuY3Rpb25zIEkgc2hvdWxkIGJlIHBheWluZyBhdHRlbnRpb24gdG86IGBlbnRyeV9tYXRjaGVzX21hZ2ljYCwgYGVudHJ5X21hdGNoZXNfZXh0ZW5zaW9uYCwgYHNlYXJjaF9iaW5mbXRfaGFuZGxlcmAsIGBnZXRfYmluZm10X2hhbmRsZXJgLCBgcHV0X2JpbmZtdF9oYW5kbGVyYCwgYGN1cnJlbnRfYmluZm10X21pc2NgLCBgbG9hZF9taXNjX2JpbmFyeWAsIGBzY2FuYXJnYCwgYGNoZWNrX3NwZWNpYWxfZmxhZ3NgLCBgcGFyc2VfbWFnaWNfZmllbGRzYCwgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgLCBgY3JlYXRlX2VudHJ5YCwgYHBhcnNlX2NvbW1hbmRgLCBgYm1fc2VxX2hleGAsIGBibV9lbnRyeV9zaG93YCwgYGJtX2dldF9pbm9kZWAsIGBibV9ldmljdF9pbm9kZWAsIGB1bmxpbmtfYmluZm10X2hhbmRsZXJgLCBgcmVtb3ZlX2JpbmZtdF9oYW5kbGVyYCwgYGJtX3JlbW92ZV9lbnRyeWAsIGBibV9yZW1vdmVfYWxsX2VudHJpZXNgLCBgYm1fdW5saW5rYCwgYGJtX2VudHJ5X29wZW5gLCBgYm1fZW50cnlfd3JpdGVgLCBgYWRkX2VudHJ5YCwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX3N0YXR1c19yZWFkYCwgYGJtX3N0YXR1c193cml0ZWAsIGFuZCBgYm1fZmlsbF9zdXBlcmAuXG5cbkdpdmVuIHRoYXQgbWFzc2l2ZSBsaXN0LCBJIG5lZWQgdG8gcHJpb3JpdGl6ZS4gSSdtIHRoaW5raW5nIHRoZSByZWFsIG1lYXQgaXMgaW4gaG93IGl0J3MgKnVzZWQqLCByYXRoZXIgdGhhbiB0aGUgaW50ZXJuYWwgbWVjaGFuaWNzLiBUaGVyZWZvcmUsIEknbSB6ZXJvaW5nIGluIG9uOiBgbG9hZF9taXNjX2JpbmFyeWAgKHRoZSB1bHRpbWF0ZSBlbnRyeSBwb2ludCBkdXJpbmcgZXhlY3V0aW9uKSwgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGBibV91bmxpbmtgLCBgYm1fZW50cnlfb3BlbmAsIGFuZCBgYm1fZW50cnlfc2hvd2AuIFRob3NlIGFyZSB0aGUgZW50cnkgcG9pbnRzIHRvIHBsYXkgd2l0aCBmaWxlIG9wZXJhdGlvbnMuXG5cbkxhc3RseSwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgYnVpbGQgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuIGBDT05GSUdfQklORk1UX01JU0NgIGlzIHRoZSByZWxldmFudCBLY29uZmlnIG9wdGlvbi4gSSdsbCB2ZXJpZnkgdGhpcyB0byBtYWtlIHN1cmUgbXkgdGVzdGluZyBzZXR1cCBpcyB2YWxpZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY2MjIsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NzIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xMFQyMDozMjo0Ny45ODMzNjE0MzhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU3NTkxOTQ3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkJJTkZNVF9NSVNDXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9LY29uZmlnLmJpbmZtdD0xMzg9Y29uZmlnIEJJTkZNVF9aRkxBVFxcbi0tXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTQ0LVxcbmZzL0tjb25maWcuYmluZm10OjE0NTpjb25maWcgQklORk1UX01JU0NcXG5mcy9LY29uZmlnLmJpbmZtdC0xNDYtXFx0dHJpc3RhdGUgXFxcIktlcm5lbCBzdXBwb3J0IGZvciBNSVNDIGJpbmFyaWVzXFxcIlxcbi0tXFxuZnMvTWFrZWZpbGU9MzQ9b2JqLSQoQ09ORklHX0ZJTEVfTE9DS0lORykgICAgICArPSBsb2Nrcy5vXFxuZnMvTWFrZWZpbGU6MzU6b2JqLSQoQ09ORklHX0JJTkZNVF9NSVNDKVxcdCs9IGJpbmZtdF9taXNjLm9cXG5mcy9NYWtlZmlsZS0zNi1vYmotJChDT05GSUdfQklORk1UX1NDUklQVClcXHQrPSBiaW5mbXRfc2NyaXB0Lm9cXG4tLVxcbmZzL2ZpbGVfdGFibGUuYz0xNjU9c3RhdGljIGludCBfX2luaXQgaW5pdF9mc19zdGF0X3N5c2N0bHModm9pZClcXG4tLVxcbmZzL2ZpbGVfdGFibGUuYy0xNjctXFx0cmVnaXN0ZXJfc3lzY3RsX2luaXQoXFxcImZzXFxcIiwgZnNfc3RhdF9zeXNjdGxzKTtcXG5mcy9maWxlX3RhYmxlLmM6MTY4OlxcdGlmIChJU19FTkFCTEVEKENPTkZJR19CSU5GTVRfTUlTQykpIHtcXG5mcy9maWxlX3RhYmxlLmMtMTY5LVxcdFxcdHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZHI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEwVDIwOjMyOjQ4LjE0MDk1OTgyNVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjExOTI0NTA4Nzc4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKlJlZmluaW5nIHRoZSBGb2N1cyBmb3IgQklORk1UX01JU0MgQ292ZXJhZ2UqKlxuXG5Pa2F5LCBzbyBJJ20gZm9jdXNpbmcgb24gYEJJTkZNVF9NSVNDYCwgdGhhdCdzIHRoZSBrZXkgY29uZmlnIGhlcmUuIExldCdzIHNoYXJwZW4gdGhlIGxpc3Qgb2YgRm9jdXNTeW1ib2xzIGZvciB0aGUgZnV6emVyLiBNeSBpbml0aWFsIHRob3VnaHRzIHdlcmUgZ29vZCwgYGxvYWRfbWlzY19iaW5hcnlgIGlzIGRlZmluaXRlbHkgaW4gc2NvcGUsIGl0J3MgdGhlIGBsaW51eF9iaW5mbXRgIGhhbmRsZXIsIGFuZCBjcml0aWNhbCBmb3IgZXhlY3V0aW9uLiBUaGUgYGJtX3JlZ2lzdGVyX3dyaXRlYCwgYGJtX2VudHJ5X3dyaXRlYCwgYGJtX3N0YXR1c193cml0ZWAsIGFuZCBgYm1fdW5saW5rYCBmdW5jdGlvbnMgYXJlIHRoZSBoYW5kbGVycyBmb3IgZmlsZSBvcGVyYXRpb25zIG9uIHRoZSB2aXJ0dWFsIGZpbGVzeXN0ZW0sIHNvIHRoZXkgYXJlIGVzc2VudGlhbC4gYGJtX2VudHJ5X29wZW5gIHNlZW1zIGltcG9ydGFudCwgYW5kIEkgbmVlZCB0byBub3RlIHRoYXQgaXQgaGFzIGJlZW4gY2hhbmdlZCB0byBgYm1fZW50cnlfc2hvd2Agbm93IHRoYXQgaXQgdXNlcyBzZXFfZmlsZS5cblxuTm93LCBgbG9hZF9taXNjX2JpbmFyeWAgZG9lcyBnZXQgY2FsbGVkIGJ5IGBzZWFyY2hfYmluYXJ5X2hhbmRsZXJgLCB3aGljaCBpcyBpdHNlbGYgY2FsbGVkIGJ5IGBicHJtX2V4ZWN2ZWAuIFRoYXQncyBhIGhvdCBwYXRoLCBlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIHRoZSBmcmVxdWVuY3kgb2YgYGV4ZWN2ZWAgY2FsbHMsIGFuZCBpdCBpcyBzcGVjaWZpYyB0byBgYmluZm10X21pc2NgLCBzbyBpbmNsdWRpbmcgaXQgaXMgZXNzZW50aWFsLiBUaGUgb3RoZXJzIHNlZW0gbGlrZSBjbGVhciB3aW5zLlxuXG5BbHJpZ2h0LCBJIGNhbiBjb25maXJtIHRoYXQgYEJJTkZNVF9NSVNDYCBpcyBzdWZmaWNpZW50IGZvciB0aGUgY29uZmlndXJhdGlvbiBzaWRlIG9mIHRoaW5ncy5cblxuTGV0J3MgZG8gYSBmaW5hbCByZXZpZXcgb2YgdGhlIHBhdGNoLiBUaGUgbmV3IGBibV91bmxpbmtgIGlzIGEgbmV3IGZlYXR1cmUgZm9yIHVubGlua2luZyBlbnRyeSBmaWxlcywgd2hpY2ggbmVlZHMgdGVzdGluZy4gSXQgY2hhbmdlcyBgYm1fZW50cnlfcmVhZGAgdG8gYGJtX2VudHJ5X3Nob3dgLCB3aGljaCBpcyB0aGUgc2VxX2ZpbGUsIGFuZCBpbXBvcnRhbnQuIEl0IGFsc28gdXBkYXRlcyBgbG9hZF9taXNjX2JpbmFyeWAgdG8gdXNlIFJDVS4gTGFzdGx5LCBpdCB1cGRhdGVzIGBjcmVhdGVfZW50cnlgIHRvIHVzZSBgcGFyc2VfbWFnaWNfZmllbGRzYCBhbmQgYHBhcnNlX2V4dGVuc2lvbl9maWVsZHNgLlxuXG5MZXQncyByZWZpbmUgdGhlIGxpc3QuIEkgaGF2ZSBgbG9hZF9taXNjX2JpbmFyeWAsIGBibV9yZWdpc3Rlcl93cml0ZWAsIGBibV9lbnRyeV93cml0ZWAsIGBibV9zdGF0dXNfd3JpdGVgLCBgYm1fdW5saW5rYCwgYW5kIGBibV9lbnRyeV9zaG93YC5cblxuSSBoYWQgYGNyZWF0ZV9lbnRyeWAgbGlzdGVkLCBidXQgdGhhdCdzIHN0YXRpYy4gQnV0IHN5emthbGxlciBjYW4gcmVhY2ggc3RhdGljIGZ1bmN0aW9ucyBpZiByZWFjaGFibGUuIEJ1dCwgY29uc2lkZXJpbmcgRm9jdXNTeW1ib2xzIGlzIGFib3V0IGNvdmVyYWdlIGd1aWRhbmNlIGFuZCBjb3JwdXMgcHJpb3JpdGl6YXRpb24sIGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvIGxpc3QgdGhlIHJlbGV2YW50IHN5c2NhbGwgZW50cnkgcG9pbnRzIGFuZCB0aGUgdG9wLWxldmVsIGhhbmRsZXJzIGFuZCB0aGF0J3MgY292ZXJlZCBpbiB0aGUgbGlzdCBhYm92ZS4gYGJtX3JlZ2lzdGVyX3dyaXRlYCBjYWxscyBgY3JlYXRlX2VudHJ5YC5cblxuU28gdGhlIGZpbmFsIGxpc3QgZm9yIHRoZSBmdXp6ZXI6XG4qICAgYGxvYWRfbWlzY19iaW5hcnlgXG4qICAgYGJtX3JlZ2lzdGVyX3dyaXRlYFxuKiAgIGBibV9lbnRyeV93cml0ZWBcbiogICBgYm1fc3RhdHVzX3dyaXRlYFxuKiAgIGBibV91bmxpbmtgXG4qICAgYGJtX2VudHJ5X3Nob3dgXG5cblRoZSByZWFzb25pbmcgaGVyZSBpcyB0aGF0IHRoZSBwYXRjaCBmdW5kYW1lbnRhbGx5IHJlZmFjdG9ycyB0aGUgYGJpbmZtdF9taXNjYCBmaWxlc3lzdGVtIHdpdGggUkNVLWJhc2VkIGxvb2t1cHMsIHNwaW5sb2NrIGJhc2VkIGxvY2tpbmcsIGBzZXFfZmlsZWAgZm9yIGVudHJ5IHJlYWRpbmcsIGFuZCBhZGRzIGVudHJ5IHVubGlua2luZywgd2hpY2ggYXJlIGFsbCBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gaW1wb3J0YW50IGtlcm5lbCBsb2dpYyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gcHJldmVudCByZWdyZXNzaW9ucywgbWVtb3J5IGxlYWtzLCBvciBjb25jdXJyZW5jeSBwcm9ibGVtcy4gVGltZSB0byBzZXQgdGhlc2UgcmVzdWx0cyBhbmQgcHVzaCBmb3J3YXJkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxODE1MCwiT3V0cHV0VG9rZW5zIjoxNjQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2NzEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTBUMjA6MzM6MDAuMDY1NDcyNTUzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzAwNzQwNzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJJTkZNVF9NSVNDXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibG9hZF9taXNjX2JpbmFyeVwiLFxuICAgIFwiYm1fcmVnaXN0ZXJfd3JpdGVcIixcbiAgICBcImJtX2VudHJ5X3dyaXRlXCIsXG4gICAgXCJibV9zdGF0dXNfd3JpdGVcIixcbiAgICBcImJtX3VubGlua1wiLFxuICAgIFwiYm1fZW50cnlfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNpZ25pZmljYW50bHkgcmVmYWN0b3JzIHRoZSBiaW5mbXRfbWlzYyBmaWxlc3lzdGVtLCBpbnRyb2R1Y2luZyBSQ1UtYmFzZWQgbG9va3VwcywgY2hhbmdpbmcgaW50ZXJuYWwgbG9ja2luZyBmcm9tIHJ3bG9jayB0byBzcGlubG9jaywgY29udmVydGluZyBlbnRyeSByZWFkaW5nIHRvIHVzZSBzZXFfZmlsZSwgYW5kIGFkZGluZyBzdXBwb3J0IGZvciByZW1vdmluZyBlbnRyaWVzIHZpYSB1bmxpbmsoMikuIFRoZXNlIGFyZSBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZCB0byBlbnN1cmUgbm8gcmVncmVzc2lvbnMsIG1lbW9yeSBsZWFrcywgb3IgY29uY3VycmVuY3kgaXNzdWVzIHdlcmUgaW50cm9kdWNlZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCSU5GTVRfTUlTQ1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImxvYWRfbWlzY19iaW5hcnlcIixcbiAgICBcImJtX3JlZ2lzdGVyX3dyaXRlXCIsXG4gICAgXCJibV9lbnRyeV93cml0ZVwiLFxuICAgIFwiYm1fc3RhdHVzX3dyaXRlXCIsXG4gICAgXCJibV91bmxpbmtcIixcbiAgICBcImJtX2VudHJ5X3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzaWduaWZpY2FudGx5IHJlZmFjdG9ycyB0aGUgYmluZm10X21pc2MgZmlsZXN5c3RlbSwgaW50cm9kdWNpbmcgUkNVLWJhc2VkIGxvb2t1cHMsIGNoYW5naW5nIGludGVybmFsIGxvY2tpbmcgZnJvbSByd2xvY2sgdG8gc3BpbmxvY2ssIGNvbnZlcnRpbmcgZW50cnkgcmVhZGluZyB0byB1c2Ugc2VxX2ZpbGUsIGFuZCBhZGRpbmcgc3VwcG9ydCBmb3IgcmVtb3ZpbmcgZW50cmllcyB2aWEgdW5saW5rKDIpLiBUaGVzZSBhcmUgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQgdG8gZW5zdXJlIG5vIHJlZ3Jlc3Npb25zLCBtZW1vcnkgbGVha3MsIG9yIGNvbmN1cnJlbmN5IGlzc3VlcyB3ZXJlIGludHJvZHVjZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/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-workflowg6hzn[1] Phase: Succeeded StartedAt: 2026-07-10 20:33:11 +0000 UTC FinishedAt: 2026-07-10 20:33:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-10 20:33:11 +0000 UTC FinishedAt: 2026-07-10 20:33:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2] Phase: Succeeded StartedAt: 2026-07-10 20:33:11 +0000 UTC FinishedAt: 2026-07-11 00:38:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-10 20:33:11 +0000 UTC FinishedAt: 2026-07-11 00:38:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-10 20:33:11 +0000 UTC FinishedAt: 2026-07-10 20:33:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-10 20:33:11 +0000 UTC FinishedAt: 2026-07-10 20:33:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-3117309179/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-10 20:33:21 +0000 UTC FinishedAt: 2026-07-10 21:01:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-10 20:33:21 +0000 UTC FinishedAt: 2026-07-10 21:01:27 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*04d3d2b1-59af-425f-9587-626434fb03bb,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-3117309179/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "8205a005-2ca9-4ea7-87df-074992fc0cf2", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3453029433/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-10 20:33:21 +0000 UTC FinishedAt: 2026-07-10 21:01:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*04d3d2b1-59af-425f-9587-626434fb03bb,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-3117309179/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "8205a005-2ca9-4ea7-87df-074992fc0cf2", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3453029433/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-10 21:01:27 +0000 UTC FinishedAt: 2026-07-10 21:01:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-10 21:01:27 +0000 UTC FinishedAt: 2026-07-10 21:01:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-10 21:01:27 +0000 UTC FinishedAt: 2026-07-10 21:01:51 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-10 21:01:27 +0000 UTC FinishedAt: 2026-07-10 21:01:43 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-2384027986/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-10 21:01:51 +0000 UTC FinishedAt: 2026-07-10 21:03:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-10 21:01:51 +0000 UTC FinishedAt: 2026-07-10 21:03:40 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*8205a005-2ca9-4ea7-87df-074992fc0cf2,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3453029433/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },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-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-10 21:03:50 +0000 UTC FinishedAt: 2026-07-10 21:03:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-10 21:03:50 +0000 UTC FinishedAt: 2026-07-10 21:03:50 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-10 21:03:50 +0000 UTC FinishedAt: 2026-07-10 21:34:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-10 21:03:50 +0000 UTC FinishedAt: 2026-07-10 21:34:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*04d3d2b1-59af-425f-9587-626434fb03bb,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-2384027986/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "42842bc2-6737-4f62-bf50-685e12f94822", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3531071462/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-10 21:03:50 +0000 UTC FinishedAt: 2026-07-10 21:34:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*04d3d2b1-59af-425f-9587-626434fb03bb,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-2384027986/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "42842bc2-6737-4f62-bf50-685e12f94822", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3531071462/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-10 21:34:17 +0000 UTC FinishedAt: 2026-07-10 21:34:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-10 21:34:17 +0000 UTC FinishedAt: 2026-07-10 21:34:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-10 21:34:17 +0000 UTC FinishedAt: 2026-07-10 21:36:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-10 21:34:17 +0000 UTC FinishedAt: 2026-07-10 21:36:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*42842bc2-6737-4f62-bf50-685e12f94822,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3531071462/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },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-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-10 21:36:15 +0000 UTC FinishedAt: 2026-07-11 00:38:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-10 21:36:15 +0000 UTC FinishedAt: 2026-07-11 00:38:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*8205a005-2ca9-4ea7-87df-074992fc0cf2,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*42842bc2-6737-4f62-bf50-685e12f94822,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3453029433/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3531071462/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-10 21:36:15 +0000 UTC FinishedAt: 2026-07-10 21:36:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-10 21:36:15 +0000 UTC FinishedAt: 2026-07-10 21:36:19 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-2738918823/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-10 21:36:15 +0000 UTC FinishedAt: 2026-07-10 21:36:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-10 21:36:15 +0000 UTC FinishedAt: 2026-07-10 21:36:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-10 21:36:15 +0000 UTC FinishedAt: 2026-07-10 21:36:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-10 21:36:25 +0000 UTC FinishedAt: 2026-07-11 00:38:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowg6hzn[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["load_misc_binary","bm_register_write","bm_entry_write","bm_status_write","bm_unlink","bm_entry_show"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"dc59e4fea9d83f03bad6bddf3fa2e52491777482","config_name":"upstream-apparmor-kasan.config","enable_configs":["BINFMT_MISC"],"series_id":"47fd02d9-4de2-4cce-b651-657e4669ccd6","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-10 21:36:25 +0000 UTC FinishedAt: 2026-07-11 00:37:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*8205a005-2ca9-4ea7-87df-074992fc0cf2,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*42842bc2-6737-4f62-bf50-685e12f94822,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3453029433/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-build-action-3531071462/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowg6hzn/series-workflowg6hzn-convert-artifact-2738918823/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}