Name: series-workflowv4t2x Phase: Succeeded StartedAt: 2026-07-13 05:13:05 +0000 UTC FinishedAt: 2026-07-13 09:57:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[0] Phase: Succeeded StartedAt: 2026-07-13 05:13:05 +0000 UTC FinishedAt: 2026-07-13 05:27:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[0].run-triage Phase: Succeeded StartedAt: 2026-07-13 05:13:05 +0000 UTC FinishedAt: 2026-07-13 05:27:19 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "cd62f71468f0fc070761f18826d870d4afccac6f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HUGETLB_PAGE", "MEMORY_FAILURE", "HWPOISON_INJECT", "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "cd62f71468f0fc070761f18826d870d4afccac6f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HUGETLB_PAGE", "MEMORY_FAILURE", "HWPOISON_INJECT", "SWAP" ], "series_id": "8d0ad669-9b89-475f-80ad-e5e92bf01074" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "try_to_unmap_hugetlb_one", "ttu_anon_lazyfree_folio", "ttu_anon_swapbacked_folio", "ttu_anon_folio" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEzIDA1OjI2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7LAogICAgJiMzNDtNRU1PUllfRkFJTFVSRSYjMzQ7LAogICAgJiMzNDtIV1BPSVNPTl9JTkpFQ1QmIzM0OywKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RyeV90b191bm1hcF9odWdldGxiX29uZSYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpbyYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3JtYXAuYyBmb3IgdW5tYXBwaW5nIGZvbGlvcywgZXh0cmFjdGluZyBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLiBUaGlzIG1vZGlmaWVzIGZ1bmN0aW9uYWwgY29kZSByZWFjaGFibGUgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEzIDA1OjI2PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNDYwZmM1OGJkODBjNWU2OGEwODJhZWQzMzViZmVkYTBmNmI2ODgyOFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gSnVsIDEzIDA1OjI2OjQ1IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmhcbmluZGV4IDQxMTUwNzZlNDkyMmFlLi5iZjdlMTYzZTM3NzlkOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaFxuQEAgLTEyNzEsNiAmIzQzOzEyNzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaHVnZXRsYl9jb3VudF9zdWIobG9uZyBsLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB9XG4gXG4gcHRlX3QgaHVnZV9wdGVwX2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgaHVnZV9wdGVfZGlydHkocHRlX3QgcHRlKTtcbiBcbiBzdGF0aWMgaW5saW5lIHB0ZV90IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKVxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xuaW5kZXggMjYxNjZhNmI4Y2I5YjEuLmZlNjdjZTZjZWI1ZWIzIDEwMDY0NFxuLS0tIGEvbW0vcm1hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9ybWFwLmNcbkBAIC0xOTc4LDYgJiM0MzsxOTc4LDIyMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmb2xpb191bm1hcF9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfUkVTUEVDVF9TT0ZUX0RJUlRZKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyBib29sIHRyeV90b191bm1hcF9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0REVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIGZvbGlvLCB2bWEsIGFkZHJlc3MsIDApO1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbiYjNDM7XHRjb25zdCBlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcbiYjNDM7XHRib29sIHJldCA9IHRydWU7XG4mIzQzO1x0cHRlX3QgcHRldmFsO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2VcbiYjNDM7XHQgKiB3aGVyZSB0aGUgaHVnZXRsYiBmb2xpbyBpcyBwb2lzb25lZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRSghKGZsYWdzIFx1MDAyNiBUVFVfSFdQT0lTT04pKTtcbiYjNDM7XG4mIzQzO1x0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuJiM0MztcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFx1MDAyNnJhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtXHUwMDNldm1fbW0sXG4mIzQzO1x0XHRcdFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcbiYjNDM7XHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCwgXHUwMDI2cmFuZ2UuZW5kKTtcbiYjNDM7XHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChcdTAwMjZyYW5nZSk7XG4mIzQzO1xuJiM0MztcdC8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi9cbiYjNDM7XHRpZiAoIXBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKVxuJiM0MztcdFx0Z290byByYW5nZV9lbmQ7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRShhZGRyZXNzICE9IHB2bXcuYWRkcmVzcyk7XG4mIzQzO1xuJiM0MztcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRWTV9XQVJOX09OX09OQ0UoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRShwdGVfcGZuKHB0ZXZhbCkgIT0gZm9saW9fcGZuKGZvbGlvKSk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBubyB3YXkgb2ZcbiYjNDM7XHQgKiBrbm93aW5nIGV4YWN0bHkgd2hpY2ggUE1EcyBtYXkgYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0XG4mIzQzO1x0ICogZmx1c2ggdGhlbSBhbGwuIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xuJiM0MztcdCAqIHJhbmdlLlxuJiM0MztcdCAqL1xuJiM0MztcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZSBoZWxkIGluIHdyaXRlIG1vZGUuXG4mIzQzO1x0ICogQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuIExvY2sgb3JkZXIgZGljdGF0ZXNcbiYjNDM7XHQgKiBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS4gV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcbiYjNDM7XHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbiYjNDM7XHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbiYjNDM7XG4mIzQzO1x0XHRWTV9XQVJOX09OKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuJiM0MztcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gZmFsc2U7XG4mIzQzO1x0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHRsYl9nYXRoZXJfbW11X3ZtYShcdTAwMjZ0bGIsIHZtYSk7XG4mIzQzO1x0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4mIzQzO1x0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuJiM0MztcdFx0XHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFx1MDAyNnRsYiwgdm1hKTtcbiYjNDM7XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsIGNvbnNlcXVlbnRseSB1bm1hcHBpbmdcbiYjNDM7XHRcdFx0ICogdGhlIGZvbGlvLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0Z290byB3YWxrX2RvbmU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbiYjNDM7XHRcdHRsYl9maW5pc2hfbW11KFx1MDAyNnRsYik7XG4mIzQzO1x0fVxuJiM0MztcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRpZiAoaHVnZV9wdGVfZGlydHkocHRldmFsKSlcbiYjNDM7XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcbiYjNDM7XHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkoZm9saW9fcGFnZShmb2xpbywgMCkpKTtcbiYjNDM7XHRodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTtcbiYjNDM7XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIGhzeik7XG4mIzQzO1x0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XG4mIzQzO1x0Zm9saW9fcHV0X3JlZnMoZm9saW8sIDEpO1xuJiM0MztcbiYjNDM7d2Fsa19kb25lOlxuJiM0MztcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4mIzQzO3JhbmdlX2VuZDpcbiYjNDM7XHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQoXHUwMDI2cmFuZ2UpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTeW5jaHJvbml6ZSB3aXRoIGd1cF9wdGVfcmFuZ2UoKTpcbiYjNDM7XHQgKiAtIGNsZWFyIFBURTsgYmFycmllcjsgcmVhZCByZWZjb3VudFxuJiM0MztcdCAqIC0gaW5jIHJlZmNvdW50OyBiYXJyaWVyOyByZWFkIFBURVxuJiM0MztcdCAqL1xuJiM0MztcdHNtcF9tYigpO1xuJiM0MztcbiYjNDM7XHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xuJiM0MztcdG1hcF9jb3VudCA9IGZvbGlvX21hcGNvdW50KGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZ1xuJiM0MztcdCAqIChzZWUgY29tbWVudHMgaW4gX19yZW1vdmVfbWFwcGluZygpKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzbXBfcm1iKCk7XG4mIzQzO1xuJiM0MztcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiByZWRpcnRpZWQgZWl0aGVyIHVzaW5nIHRoZSBwYWdlIHRhYmxlIG9yIGEgcHJldmlvdXNseVxuJiM0MztcdFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Zm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBZGRpdGlvbmFsIHJlZmVyZW5jZXMgY291bGQgYmUgZHVlIHRvIEdVUCBvciBzcGVjdWxhdGl2ZSBsb29rdXBzLlxuJiM0MztcdCAqIEdVUCB1c2VycyBtdXN0IG1hcmsgdGhlIGZvbGlvIGRpcnR5IGlmIHRoZXJlIHdhcyBhIG1vZGlmaWNhdGlvbi5cbiYjNDM7XHQgKiBUaGlzIGZvbGlvIGNhbm5vdCBiZSByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0XG4mIzQzO1x0ICogbGlrZSBub3RoaW5nIGhhcHBlbmVkLiBXZSYjMzk7bGwgY29tZSBiYWNrIGhlcmUgbGF0ZXIgYW5kIGRldGVjdCBpZiB0aGVcbiYjNDM7XHQgKiBmb2xpbyB3YXMgZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChyZWZfY291bnQgIT0gMSAmIzQzOyBtYXBfY291bnQpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGFkZF9tbV9jb3VudGVyKHZtYS1cdTAwM2V2bV9tbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgcHRlX3Qgc3dwX3B0ZV9wcmVwYXJlKHN3cF9lbnRyeV90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLFxuJiM0MztcdFx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSlcbiYjNDM7e1xuJiM0MztcdHB0ZV90IHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbiYjNDM7XG4mIzQzO1x0aWYgKGFub25fZXhjbHVzaXZlKVxuJiM0MztcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7XG4mIzQzO1xuJiM0MztcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQob2xkX3B0ZSkpKSB7XG4mIzQzO1x0XHRpZiAocHRlX3NvZnRfZGlydHkob2xkX3B0ZSkpXG4mIzQzO1x0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbiYjNDM7XHRcdGlmIChwdGVfdWZmZChvbGRfcHRlKSlcbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHQvKiBEZXZpY2UtZXhjbHVzaXZlIGVudHJ5ICovXG4mIzQzO1x0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuJiM0MztcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4mIzQzO1x0XHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuJiM0MztcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gc3dwX3B0ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4mIzQzO1x0XHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgYm9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdFx0ICAgIFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuJiM0MztcdHN3cF9lbnRyeV90IGVudHJ5ID0gcGFnZV9zd2FwX2VudHJ5KHBhZ2UpO1xuJiM0MztcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHBhZ2UpIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbiYjNDM7XHQgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNvdWxkIGhhdmUgUEZOIHN3YXAgUFRFcyxcbiYjNDM7XHQgKiBzbyB3ZSYjMzk7bGwgbm90IGNoZWNrL2NhcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbiYjNDM7XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBwYWdlKSkge1xuJiM0MztcdFx0Zm9saW9fcHV0X3N3YXAoZm9saW8sIHBhZ2UpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcbiYjNDM7XHRkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTtcbiYjNDM7XHRpbmNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpO1xuJiM0MztcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZXAsXG4mIzQzO1x0XHQgICBzd3BfcHRlX3ByZXBhcmUoZW50cnksIHB0ZXZhbCwgYW5vbl9leGNsdXNpdmUpKTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgdHR1X2Fub25fZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCxcbiYjNDM7XHRcdHB0ZV90IHB0ZXZhbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU3RvcmUgdGhlIHN3YXAgbG9jYXRpb24gaW4gdGhlIHB0ZS5cbiYjNDM7XHQgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPVxuJiM0MztcdFx0XHQgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKVxuJiM0MztcdFx0cmV0dXJuIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHZtYSwgZm9saW8sIG5yX3BhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0LyogbnJfcGFnZXMgXHUwMDNlIDEgbm90IHN1cHBvcnRlZCB5ZXQgKi9cbiYjNDM7XHRyZXR1cm4gdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLCBwdGVwLFxuJiM0MztcdFx0XHRcdFx0IHB0ZXZhbCk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50XG4gICovXG5AQCAtMTk4NiwxNCAmIzQzOzIyMDAsMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcbi1cdGJvb2wgYW5vbl9leGNsdXNpdmUsIHJldCA9IHRydWU7XG4mIzQzO1x0Ym9vbCByZXQgPSB0cnVlO1xuIFx0cHRlX3QgcHRldmFsO1xuLVx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4mIzQzO1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuIFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDEsIGVuZF9hZGRyO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4gXHRpbnQgcHRlcyA9IDA7XG4gXG4gXHQvKlxuQEAgLTIwMDcsOCAmIzQzOzIyMjAsNiBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0LypcbiBcdCAqIEZvciBUSFAsIHdlIGhhdmUgdG8gYXNzdW1lIHRoZSB3b3JzZSBjYXNlIGllIHBtZCBmb3IgaW52YWxpZGF0aW9uLlxuLVx0ICogRm9yIGh1Z2V0bGIsIGl0IGNvdWxkIGJlIG11Y2ggd29yc2UgaWYgd2UgbmVlZCB0byBkbyBwdWRcbi1cdCAqIGludmFsaWRhdGlvbiBpbiB0aGUgY2FzZSBvZiBwbWQgc2hhcmluZy5cbiBcdCAqXG4gXHQgKiBOb3RlIHRoYXQgdGhlIGZvbGlvIGNhbiBub3QgYmUgZnJlZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXG4gXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGZvbGlvLlxuQEAgLTIwMTYsMTcgJiM0MzsyMjI3LDYgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcdTAwMjZwdm13KTtcbiBcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFx1MDAyNnJhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtXHUwMDNldm1fbW0sXG4gXHRcdFx0XHRhZGRyZXNzLCByYW5nZS5lbmQpO1xuLVx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0Lypcbi1cdFx0ICogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkXG4tXHRcdCAqIGFjY29yZGluZ2x5LlxuLVx0XHQgKi9cbi1cdFx0YWRqdXN0X3JhbmdlX2lmX3BtZF9zaGFyaW5nX3Bvc3NpYmxlKHZtYSwgXHUwMDI2cmFuZ2Uuc3RhcnQsXG4tXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZyYW5nZS5lbmQpO1xuLVxuLVx0XHQvKiBXZSBuZWVkIHRoZSBodWdlIHBhZ2Ugc2l6ZSBmb3Igc2V0X2h1Z2VfcHRlX2F0KCkgKi9cbi1cdFx0aHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbi1cdH1cbiBcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbiBcbiBcdHdoaWxlIChwYWdlX3ZtYV9tYXBwZWRfd2FsayhcdTAwMjZwdm13KSkge1xuQEAgLTIxMTEsNjUgJiM0MzsyMzExLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7XG4gXG4gXHRcdFx0cGZuID0gc29mdGxlYWZfdG9fcGZuKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTtcbiBcdFx0fVxuIFxuLVx0XHRzdWJwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XG4tXHRcdGFub25fZXhjbHVzaXZlID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdCBQYWdlQW5vbkV4Y2x1c2l2ZShzdWJwYWdlKTtcbi1cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRib29sIGFub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBwYWdlXG4tXHRcdFx0ICogaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGh1Z2V0bGIgcGFnZSBpcyBwb2lzb25lZC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRWTV9CVUdfT05fUEFHRSghUGFnZUhXUG9pc29uKHN1YnBhZ2UpLCBzdWJwYWdlKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS5cbi1cdFx0XHQgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5XG4tXHRcdFx0ICogYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLlxuLVx0XHRcdCAqIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xuLVx0XHRcdCAqIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4mIzQzO1x0XHRwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlXG4tXHRcdFx0ICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHlcbi1cdFx0XHQgKiBkbyB0aGlzIG91dHNpZGUgcm1hcCByb3V0aW5lcy5cbi1cdFx0XHQgKlxuLVx0XHRcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS5cbi1cdFx0XHQgKiBMb2NrIG9yZGVyIGRpY3RhdGVzIGFjcXVpcmluZyB2bWFfbG9jayBCRUZPUkVcbi1cdFx0XHQgKiBpX21tYXBfcndzZW0uICBXZSBjYW4gb25seSB0cnkgbG9jayBoZXJlIGFuZCBmYWlsXG4tXHRcdFx0ICogaWYgdW5zdWNjZXNzZnVsLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICghYW5vbikge1xuLVx0XHRcdFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xuLVxuLVx0XHRcdFx0Vk1fQlVHX09OKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuLVx0XHRcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpXG4tXHRcdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cbi1cdFx0XHRcdHRsYl9nYXRoZXJfbW11X3ZtYShcdTAwMjZ0bGIsIHZtYSk7XG4tXHRcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4tXHRcdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0XHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsXG4tXHRcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuLVx0XHRcdFx0XHQgKi9cbi1cdFx0XHRcdFx0Z290byB3YWxrX2RvbmU7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbi1cdFx0XHRcdHRsYl9maW5pc2hfbW11KFx1MDAyNnRsYik7XG4tXHRcdFx0fVxuLVx0XHRcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbi1cdFx0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbiYjNDM7XHRcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbiBcdFx0XHRucl9wYWdlcyA9IGZvbGlvX3VubWFwX3B0ZV9iYXRjaChmb2xpbywgXHUwMDI2cHZtdywgZmxhZ3MsIHB0ZXZhbCk7XG4gXHRcdFx0ZW5kX2FkZHIgPSBhZGRyZXNzICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIFx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xuQEAgLTIyMDQsMTYgJiM0MzsyMzUwLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdC8qIFVwZGF0ZSBoaWdoIHdhdGVybWFyayBiZWZvcmUgd2UgbG93ZXIgcnNzICovXG4gXHRcdHVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7XG4gXG4tXHRcdGlmIChQYWdlSFdQb2lzb24oc3VicGFnZSkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xuLVx0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShzdWJwYWdlKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuLVx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLFxuLVx0XHRcdFx0XHRcdGhzeik7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHR9XG4mIzQzO1x0XHQvKiBXaXRoIFRUVV9IV1BPSVNPTiwgd2Ugb25seSBleHBlY3Qgc21hbGwgZm9saW9zIGhlcmUuICovXG4mIzQzO1x0XHRpZiAoZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbykgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xuJiM0MztcdFx0XHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xuJiM0MztcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuJiM0MztcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiBcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuIFx0XHRcdC8qXG5AQCAtMjIyOCwxMDQgJiM0MzsyMzY5LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0ICovXG4gXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbiBcdFx0fSBlbHNlIGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4tXHRcdFx0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkoc3VicGFnZSk7XG4tXHRcdFx0cHRlX3Qgc3dwX3B0ZTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuXG4tXHRcdFx0ICogU2VlIGhhbmRsZV9wdGVfZmF1bHQoKSAuLi5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPVxuLVx0XHRcdFx0XHRmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7XG4tXHRcdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0fVxuLVxuLVx0XHRcdC8qIE1BRFZfRlJFRSBwYWdlIGNoZWNrICovXG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRpbnQgcmVmX2NvdW50LCBtYXBfY291bnQ7XG4tXG4tXHRcdFx0XHQvKlxuLVx0XHRcdFx0ICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6XG4tXHRcdFx0XHQgKiAtIGNsZWFyIFBURTsgYmFycmllcjsgcmVhZCByZWZjb3VudFxuLVx0XHRcdFx0ICogLSBpbmMgcmVmY291bnQ7IGJhcnJpZXI7IHJlYWQgUFRFXG4tXHRcdFx0XHQgKi9cbi1cdFx0XHRcdHNtcF9tYigpO1xuLVxuLVx0XHRcdFx0cmVmX2NvdW50ID0gZm9saW9fcmVmX2NvdW50KGZvbGlvKTtcbi1cdFx0XHRcdG1hcF9jb3VudCA9IGZvbGlvX21hcGNvdW50KGZvbGlvKTtcbi1cbi1cdFx0XHRcdC8qXG4tXHRcdFx0XHQgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZ1xuLVx0XHRcdFx0ICogKHNlZSBjb21tZW50cyBpbiBfX3JlbW92ZV9tYXBwaW5nKCkpLlxuLVx0XHRcdFx0ICovXG4tXHRcdFx0XHRzbXBfcm1iKCk7XG4tXG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpKSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIHJlZGlydGllZCBlaXRoZXIgdXNpbmcgdGhlIHBhZ2UgdGFibGUgb3IgYSBwcmV2aW91c2x5XG4tXHRcdFx0XHRcdCAqIG9idGFpbmVkIEdVUCByZWZlcmVuY2UuXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuLVx0XHRcdFx0XHRmb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7XG4tXHRcdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHRcdH0gZWxzZSBpZiAocmVmX2NvdW50ICE9IDEgJiM0MzsgbWFwX2NvdW50KSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIEFkZGl0aW9uYWwgcmVmZXJlbmNlLiBDb3VsZCBiZSBhIEdVUCByZWZlcmVuY2Ugb3IgYW55XG4tXHRcdFx0XHRcdCAqIHNwZWN1bGF0aXZlIHJlZmVyZW5jZS4gR1VQIHVzZXJzIG11c3QgbWFyayB0aGUgZm9saW9cbi1cdFx0XHRcdFx0ICogZGlydHkgaWYgdGhlcmUgd2FzIGEgbW9kaWZpY2F0aW9uLiBUaGlzIGZvbGlvIGNhbm5vdCBiZVxuLVx0XHRcdFx0XHQgKiByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0IGxpa2Ugbm90aGluZ1xuLVx0XHRcdFx0XHQgKiBoYXBwZW5lZC5cbi1cdFx0XHRcdFx0ICogV2UmIzM5O2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlIGZvbGlvIHdhc1xuLVx0XHRcdFx0XHQgKiBkaXJ0aWVkIHdoZW4gdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGlzIGdvbmUuXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuLVx0XHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuLVx0XHRcdFx0Z290byBkaXNjYXJkO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHN1YnBhZ2UpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiYjNDM7XHRcdFx0aWYgKCF0dHVfYW5vbl9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0ICAgIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKSkge1xuJiM0MztcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4gXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4gXHRcdFx0fVxuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvblxuLVx0XHRcdCAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLFxuLVx0XHRcdCAqIHNvIHdlJiMzOTtsbCBub3QgY2hlY2svY2FyZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSBcdTAwM2MgMCkge1xuLVx0XHRcdFx0Zm9saW9fcHV0X3N3YXAoZm9saW8sIHN1YnBhZ2UpO1xuLVx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0fVxuLVxuLVx0XHRcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbi1cdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkge1xuLVx0XHRcdFx0Zm9saW9fcHV0X3N3YXAoZm9saW8sIHN1YnBhZ2UpO1xuLVx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0fVxuLVx0XHRcdG1tX3ByZXBhcmVfZm9yX3N3YXBfZW50cmllcyhtbSk7XG4tXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7XG4tXHRcdFx0aW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTtcbi1cdFx0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7XG4tXHRcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuLVx0XHRcdFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbi1cdFx0XHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuLVx0XHRcdFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fVxuLVx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlKTtcbiYjNDM7XHRcdFx0Z290byBmaW5pc2hfdW5tYXA7XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiBUaGlzIGlzIGEgbG9ja2VkIGZpbGUtYmFja2VkIGZvbGlvLFxuQEAgLTIzNDAsMTIgJiM0MzsyMzkwLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKi9cbiBcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLW5yX3BhZ2VzKTtcbiBcdFx0fVxuLWRpc2NhcmQ6XG4tXHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSkge1xuLVx0XHRcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuLVx0XHR9XG4mIzQzO2ZpbmlzaF91bm1hcDpcbiYjNDM7XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuIFx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbiBcdFx0Zm9saW9fcHV0X3JlZnMoZm9saW8sIG5yX3BhZ2VzKTtcbkBAIC0yMzkzLDcgJiM0MzsyNDM5LDggQEAgc3RhdGljIGludCBmb2xpb19ub3RfbWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSxcbiYjNDM7XHRcdC5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgP1xuJiM0MztcdFx0XHRcdHRyeV90b191bm1hcF9odWdldGxiX29uZSA6IHRyeV90b191bm1hcF9vbmUsXG4gXHRcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxuIFx0XHQuZG9uZSA9IGZvbGlvX25vdF9tYXBwZWQsXG4gXHRcdC5hbm9uX2xvY2sgPSBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTMgMDU6MjY8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDssCiAgICAmIzM0O01FTU9SWV9GQUlMVVJFJiMzNDssCiAgICAmIzM0O0hXUE9JU09OX0lOSkVDVCYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2xhenlmcmVlX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8mIzM0OywKICAgICYjMzQ7dHR1X2Fub25fZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vcm1hcC5jIGZvciB1bm1hcHBpbmcgZm9saW9zLCBleHRyYWN0aW5nIGh1Z2V0bGIgYW5kIGFub255bW91cyBmb2xpbyB1bm1hcHBpbmcgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMuIFRoaXMgbW9kaWZpZXMgZnVuY3Rpb25hbCBjb2RlIHJlYWNoYWJsZSBkdXJpbmcgbWVtb3J5IHJlY2xhaW0sIHN3YXAsIGFuZCBoYXJkd2FyZSBwb2lzb24gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDQ2MGZjNThiZDgwYzVlNjhhMDgyYWVkMzM1YmZlZGEwZjZiNjg4MjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEp1bCAxMyAwNToyNjo0NSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKaW5kZXggNDExNTA3NmU0OTIyYWUuLmJmN2UxNjNlMzc3OWQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMTI3MSw2ICYjNDM7MTI3MSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBodWdldGxiX2NvdW50X3N1Yihsb25nIGwsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogfQogCiBwdGVfdCBodWdlX3B0ZXBfZ2V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKTsKJiM0Mzt1bnNpZ25lZCBsb25nIGh1Z2VfcHRlX2RpcnR5KHB0ZV90IHB0ZSk7CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggMjYxNjZhNmI4Y2I5YjEuLmZlNjdjZTZjZWI1ZWIzIDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vcm1hcC5jCkBAIC0xOTc4LDYgJiM0MzsxOTc4LDIyMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmb2xpb191bm1hcF9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbywKIAkJCQkgICAgIEZQQl9SRVNQRUNUX1dSSVRFIHwgRlBCX1JFU1BFQ1RfU09GVF9ESVJUWSk7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CURFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpOwomIzQzOwljb25zdCBlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKJiM0MzsJYm9vbCByZXQgPSB0cnVlOwomIzQzOwlwdGVfdCBwdGV2YWw7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2UKJiM0MzsJICogd2hlcmUgdGhlIGh1Z2V0bGIgZm9saW8gaXMgcG9pc29uZWQuCiYjNDM7CSAqLwomIzQzOwlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pOwomIzQzOwlWTV9XQVJOX09OX09OQ0UoIShmbGFncyAmYW1wOyBUVFVfSFdQT0lTT04pKTsKJiM0MzsKJiM0MzsJcmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKCZhbXA7cHZtdyk7CiYjNDM7CW1tdV9ub3RpZmllcl9yYW5nZV9pbml0KCZhbXA7cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS0mZ3Q7dm1fbW0sCiYjNDM7CQkJCWFkZHJlc3MsIHJhbmdlLmVuZCk7CiYjNDM7CWFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsICZhbXA7cmFuZ2Uuc3RhcnQsICZhbXA7cmFuZ2UuZW5kKTsKJiM0MzsJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoJmFtcDtyYW5nZSk7CiYjNDM7CiYjNDM7CS8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi8KJiM0MzsJaWYgKCFwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKQomIzQzOwkJZ290byByYW5nZV9lbmQ7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT05fT05DRShhZGRyZXNzICE9IHB2bXcuYWRkcmVzcyk7CiYjNDM7CiYjNDM7CXB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCFwdGVfcHJlc2VudChwdGV2YWwpKTsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKHB0ZV9wZm4ocHRldmFsKSAhPSBmb2xpb19wZm4oZm9saW8pKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBubyB3YXkgb2YKJiM0MzsJICoga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5IGJlIGNhY2hlZCBmb3IgdGhpcyBtbSwgc28gd2UgbXVzdAomIzQzOwkgKiBmbHVzaCB0aGVtIGFsbC4gc3RhcnQvZW5kIHdlcmUgYWxyZWFkeSBhZGp1c3RlZCBhYm92ZSB0byBjb3ZlciB0aGlzCiYjNDM7CSAqIHJhbmdlLgomIzQzOwkgKi8KJiM0MzsJZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZSBoZWxkIGluIHdyaXRlIG1vZGUuCiYjNDM7CSAqIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLgomIzQzOwkgKgomIzQzOwkgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuIExvY2sgb3JkZXIgZGljdGF0ZXMKJiM0MzsJICogYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRSBpX21tYXBfcndzZW0uIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kCiYjNDM7CSAqIGZhaWwgaWYgdW5zdWNjZXNzZnVsLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7CiYjNDM7CQlzdHJ1Y3QgbW11X2dhdGhlciB0bGI7CiYjNDM7CiYjNDM7CQlWTV9XQVJOX09OKCEoZmxhZ3MgJmFtcDsgVFRVX1JNQVBfTE9DS0VEKSk7CiYjNDM7CQlpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkgewomIzQzOwkJCXJldCA9IGZhbHNlOwomIzQzOwkJCWdvdG8gd2Fsa19kb25lOwomIzQzOwkJfQomIzQzOwomIzQzOwkJdGxiX2dhdGhlcl9tbXVfdm1hKCZhbXA7dGxiLCB2bWEpOwomIzQzOwkJaWYgKGh1Z2VfcG1kX3Vuc2hhcmUoJmFtcDt0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7CiYjNDM7CQkJaHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7CiYjNDM7CQkJaHVnZV9wbWRfdW5zaGFyZV9mbHVzaCgmYW1wO3RsYiwgdm1hKTsKJiM0MzsJCQl0bGJfZmluaXNoX21tdSgmYW1wO3RsYik7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCwgY29uc2VxdWVudGx5IHVubWFwcGluZwomIzQzOwkJCSAqIHRoZSBmb2xpby4KJiM0MzsJCQkgKi8KJiM0MzsJCQlnb3RvIHdhbGtfZG9uZTsKJiM0MzsJCX0KJiM0MzsJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwomIzQzOwkJdGxiX2ZpbmlzaF9tbXUoJmFtcDt0bGIpOwomIzQzOwl9CiYjNDM7CXB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJaWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpCiYjNDM7CQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKJiM0MzsKJiM0MzsJcHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KGZvbGlvX3BhZ2UoZm9saW8sIDApKSk7CiYjNDM7CWh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pOwomIzQzOwlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIGhzeik7CiYjNDM7CWh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pOwomIzQzOwlmb2xpb19wdXRfcmVmcyhmb2xpbywgMSk7CiYjNDM7CiYjNDM7d2Fsa19kb25lOgomIzQzOwlwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKCZhbXA7cHZtdyk7CiYjNDM7cmFuZ2VfZW5kOgomIzQzOwltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQoJmFtcDtyYW5nZSk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKJiM0Mzt7CiYjNDM7CWludCByZWZfY291bnQsIG1hcF9jb3VudDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6CiYjNDM7CSAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50CiYjNDM7CSAqIC0gaW5jIHJlZmNvdW50OyBiYXJyaWVyOyByZWFkIFBURQomIzQzOwkgKi8KJiM0MzsJc21wX21iKCk7CiYjNDM7CiYjNDM7CXJlZl9jb3VudCA9IGZvbGlvX3JlZl9jb3VudChmb2xpbyk7CiYjNDM7CW1hcF9jb3VudCA9IGZvbGlvX21hcGNvdW50KGZvbGlvKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogT3JkZXIgcmVhZHMgZm9yIHBhZ2UgcmVmY291bnQgYW5kIGRpcnR5IGZsYWcKJiM0MzsJICogKHNlZSBjb21tZW50cyBpbiBfX3JlbW92ZV9tYXBwaW5nKCkpLgomIzQzOwkgKi8KJiM0MzsJc21wX3JtYigpOwomIzQzOwomIzQzOwlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyAhKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSkgewomIzQzOwkJLyoKJiM0MzsJCSAqIHJlZGlydGllZCBlaXRoZXIgdXNpbmcgdGhlIHBhZ2UgdGFibGUgb3IgYSBwcmV2aW91c2x5CiYjNDM7CQkgKiBvYnRhaW5lZCBHVVAgcmVmZXJlbmNlLgomIzQzOwkJICovCiYjNDM7CQlmb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQWRkaXRpb25hbCByZWZlcmVuY2VzIGNvdWxkIGJlIGR1ZSB0byBHVVAgb3Igc3BlY3VsYXRpdmUgbG9va3Vwcy4KJiM0MzsJICogR1VQIHVzZXJzIG11c3QgbWFyayB0aGUgZm9saW8gZGlydHkgaWYgdGhlcmUgd2FzIGEgbW9kaWZpY2F0aW9uLgomIzQzOwkgKiBUaGlzIGZvbGlvIGNhbm5vdCBiZSByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0CiYjNDM7CSAqIGxpa2Ugbm90aGluZyBoYXBwZW5lZC4gV2UmIzM5O2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlCiYjNDM7CSAqIGZvbGlvIHdhcyBkaXJ0aWVkIHdoZW4gdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGlzIGdvbmUuCiYjNDM7CSAqLwomIzQzOwlpZiAocmVmX2NvdW50ICE9IDEgJiM0MzsgbWFwX2NvdW50KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlhZGRfbW1fY291bnRlcih2bWEtJmd0O3ZtX21tLCBNTV9BTk9OUEFHRVMsIC1ucl9wYWdlcyk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgcHRlX3Qgc3dwX3B0ZV9wcmVwYXJlKHN3cF9lbnRyeV90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLAomIzQzOwkJYm9vbCBhbm9uX2V4Y2x1c2l2ZSkKJiM0Mzt7CiYjNDM7CXB0ZV90IHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTsKJiM0MzsKJiM0MzsJaWYgKGFub25fZXhjbHVzaXZlKQomIzQzOwkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkocHRlX3ByZXNlbnQob2xkX3B0ZSkpKSB7CiYjNDM7CQlpZiAocHRlX3NvZnRfZGlydHkob2xkX3B0ZSkpCiYjNDM7CQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpOwomIzQzOwkJaWYgKHB0ZV91ZmZkKG9sZF9wdGUpKQomIzQzOwkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCS8qIERldmljZS1leGNsdXNpdmUgZW50cnkgKi8KJiM0MzsJCWlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpCiYjNDM7CQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpOwomIzQzOwkJaWYgKHB0ZV9zd3BfdWZmZChvbGRfcHRlKSkKJiM0MzsJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHN3cF9wdGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAomIzQzOwkJcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGJvb2wgYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsKJiM0MzsJCQkJICAgIFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwomIzQzOwlzd3BfZW50cnlfdCBlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShwYWdlKTsKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwomIzQzOwlpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHBhZ2UpICZsdDsgMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvbgomIzQzOwkgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNvdWxkIGhhdmUgUEZOIHN3YXAgUFRFcywKJiM0MzsJICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgJmx0OyAwKSB7CiYjNDM7CQlmb2xpb19wdXRfc3dhcChmb2xpbywgcGFnZSk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqLwomIzQzOwlpZiAoYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOyBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShmb2xpbywgcGFnZSkpIHsKJiM0MzsJCWZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwltbV9wcmVwYXJlX2Zvcl9zd2FwX2VudHJpZXMobW0pOwomIzQzOwlkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTsKJiM0MzsJaW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTsKJiM0MzsJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlcCwKJiM0MzsJCSAgIHN3cF9wdGVfcHJlcGFyZShlbnRyeSwgcHRldmFsLCBhbm9uX2V4Y2x1c2l2ZSkpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgdHR1X2Fub25fZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCwKJiM0MzsJCXB0ZV90IHB0ZXZhbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuCiYjNDM7CSAqIFNlZSBoYW5kbGVfcHRlX2ZhdWx0KCkgLi4uCiYjNDM7CSAqLwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykgIT0KJiM0MzsJCQkgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJcmV0dXJuIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHZtYSwgZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsKJiM0MzsJLyogbnJfcGFnZXMgJmd0OyAxIG5vdCBzdXBwb3J0ZWQgeWV0ICovCiYjNDM7CXJldHVybiB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvKHZtYSwgZm9saW8sIHBhZ2UsIGFkZHJlc3MsIHB0ZXAsCiYjNDM7CQkJCQkgcHRldmFsKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogQGFyZzogZW51bSB0dHVfZmxhZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBhcmd1bWVudAogICovCkBAIC0xOTg2LDE0ICYjNDM7MjIwMCwxMyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgZm9saW8sIHZtYSwgYWRkcmVzcywgMCk7Ci0JYm9vbCBhbm9uX2V4Y2x1c2l2ZSwgcmV0ID0gdHJ1ZTsKJiM0MzsJYm9vbCByZXQgPSB0cnVlOwogCXB0ZV90IHB0ZXZhbDsKLQlzdHJ1Y3QgcGFnZSAqc3VicGFnZTsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKIAllbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDEsIGVuZF9hZGRyOwogCXVuc2lnbmVkIGxvbmcgcGZuOwotCXVuc2lnbmVkIGxvbmcgaHN6ID0gMDsKIAlpbnQgcHRlcyA9IDA7CiAKIAkvKgpAQCAtMjAwNyw4ICYjNDM7MjIyMCw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAkvKgogCSAqIEZvciBUSFAsIHdlIGhhdmUgdG8gYXNzdW1lIHRoZSB3b3JzZSBjYXNlIGllIHBtZCBmb3IgaW52YWxpZGF0aW9uLgotCSAqIEZvciBodWdldGxiLCBpdCBjb3VsZCBiZSBtdWNoIHdvcnNlIGlmIHdlIG5lZWQgdG8gZG8gcHVkCi0JICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLgogCSAqCiAJICogTm90ZSB0aGF0IHRoZSBmb2xpbyBjYW4gbm90IGJlIGZyZWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgY2FsbCBvZgogCSAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZm9saW8uCkBAIC0yMDE2LDE3ICYjNDM7MjIyNyw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKCZhbXA7cHZtdyk7CiAJbW11X25vdGlmaWVyX3JhbmdlX2luaXQoJmFtcDtyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLSZndDt2bV9tbSwKIAkJCQlhZGRyZXNzLCByYW5nZS5lbmQpOwotCWlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7Ci0JCS8qCi0JCSAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZAotCQkgKiBhY2NvcmRpbmdseS4KLQkJICovCi0JCWFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsICZhbXA7cmFuZ2Uuc3RhcnQsCi0JCQkJCQkgICAgICZhbXA7cmFuZ2UuZW5kKTsKLQotCQkvKiBXZSBuZWVkIHRoZSBodWdlIHBhZ2Ugc2l6ZSBmb3Igc2V0X2h1Z2VfcHRlX2F0KCkgKi8KLQkJaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTsKLQl9CiAJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoJmFtcDtyYW5nZSk7CiAKIAl3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoJmFtcDtwdm13KSkgewpAQCAtMjExMSw2NSAmIzQzOzIzMTEsMTEgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCWNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShwdGV2YWwpOwogCiAJCQlwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpOwotCQkJVk1fV0FSTl9PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pLCBmb2xpbyk7CiAJCX0KIAotCQlzdWJwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7Ci0JCWFub25fZXhjbHVzaXZlID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkJIFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpOwotCi0JCWlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7Ci0JCQlib29sIGFub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwotCi0JCQkvKgotCQkJICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBwYWdlCi0JCQkgKiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaHVnZXRsYiBwYWdlIGlzIHBvaXNvbmVkLgotCQkJICovCi0JCQlWTV9CVUdfT05fUEFHRSghUGFnZUhXUG9pc29uKHN1YnBhZ2UpLCBzdWJwYWdlKTsKLQkJCS8qCi0JCQkgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuCi0JCQkgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5Ci0JCQkgKiBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuCi0JCQkgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXMKLQkJCSAqIHJhbmdlLgotCQkJICovCi0JCQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOwomIzQzOwkJcGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpOwogCi0JCQkvKgotCQkJICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZQotCQkJICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkKLQkJCSAqIGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLgotCQkJICoKLQkJCSAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4KLQkJCSAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRQotCQkJICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQgZmFpbAotCQkJICogaWYgdW5zdWNjZXNzZnVsLgotCQkJICovCi0JCQlpZiAoIWFub24pIHsKLQkJCQlzdHJ1Y3QgbW11X2dhdGhlciB0bGI7Ci0KLQkJCQlWTV9CVUdfT04oIShmbGFncyAmYW1wOyBUVFVfUk1BUF9MT0NLRUQpKTsKLQkJCQlpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkKLQkJCQkJZ290byB3YWxrX2Fib3J0OwotCi0JCQkJdGxiX2dhdGhlcl9tbXVfdm1hKCZhbXA7dGxiLCB2bWEpOwotCQkJCWlmIChodWdlX3BtZF91bnNoYXJlKCZhbXA7dGxiLCB2bWEsIGFkZHJlc3MsIHB2bXcucHRlKSkgewotCQkJCQlodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTsKLQkJCQkJaHVnZV9wbWRfdW5zaGFyZV9mbHVzaCgmYW1wO3RsYiwgdm1hKTsKLQkJCQkJdGxiX2ZpbmlzaF9tbXUoJmFtcDt0bGIpOwotCQkJCQkvKgotCQkJCQkgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCwKLQkJCQkJICogY29uc2VxdWVudGx5IHVubWFwcGluZyB0aGUgZm9saW8uCi0JCQkJCSAqLwotCQkJCQlnb3RvIHdhbGtfZG9uZTsKLQkJCQl9Ci0JCQkJaHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7Ci0JCQkJdGxiX2ZpbmlzaF9tbXUoJmFtcDt0bGIpOwotCQkJfQotCQkJcHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwotCQkJaWYgKHB0ZV9kaXJ0eShwdGV2YWwpKQotCQkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQl9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewomIzQzOwkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewogCQkJbnJfcGFnZXMgPSBmb2xpb191bm1hcF9wdGVfYmF0Y2goZm9saW8sICZhbXA7cHZtdywgZmxhZ3MsIHB0ZXZhbCk7CiAJCQllbmRfYWRkciA9IGFkZHJlc3MgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiAJCQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTsKQEAgLTIyMDQsMTYgJiM0MzsyMzUwLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCS8qIFVwZGF0ZSBoaWdoIHdhdGVybWFyayBiZWZvcmUgd2UgbG93ZXIgcnNzICovCiAJCXVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7CiAKLQkJaWYgKFBhZ2VIV1BvaXNvbihzdWJwYWdlKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBUVFVfSFdQT0lTT04pKSB7Ci0JCQlwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkoc3VicGFnZSkpOwotCQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJCQlodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTsKLQkJCQlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsCi0JCQkJCQloc3opOwotCQkJfSBlbHNlIHsKLQkJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpOwotCQkJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpOwotCQkJfQomIzQzOwkJLyogV2l0aCBUVFVfSFdQT0lTT04sIHdlIG9ubHkgZXhwZWN0IHNtYWxsIGZvbGlvcyBoZXJlLiAqLwomIzQzOwkJaWYgKGZvbGlvX3Rlc3RfaHdwb2lzb24oZm9saW8pICZhbXA7JmFtcDsgKGZsYWdzICZhbXA7IFRUVV9IV1BPSVNPTikpIHsKJiM0MzsJCQlwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpOwomIzQzOwkJCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7CiYjNDM7CQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7CiAJCX0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpICZhbXA7JmFtcDsgcHRlX3VudXNlZChwdGV2YWwpICZhbXA7JmFtcDsKIAkJCSAgICF1c2VyZmF1bHRmZF9hcm1lZCh2bWEpKSB7CiAJCQkvKgpAQCAtMjIyOCwxMDQgJiM0MzsyMzY5LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkgKi8KIAkJCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7CiAJCX0gZWxzZSBpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewotCQkJc3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkoc3VicGFnZSk7Ci0JCQlwdGVfdCBzd3BfcHRlOwotCQkJLyoKLQkJCSAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuCi0JCQkgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLgotCQkJICovCi0JCQlpZiAodW5saWtlbHkoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPQotCQkJCQlmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7Ci0JCQkJV0FSTl9PTl9PTkNFKDEpOwotCQkJCWdvdG8gd2Fsa19hYm9ydDsKLQkJCX0KLQotCQkJLyogTUFEVl9GUkVFIHBhZ2UgY2hlY2sgKi8KLQkJCWlmICghZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkgewotCQkJCWludCByZWZfY291bnQsIG1hcF9jb3VudDsKLQotCQkJCS8qCi0JCQkJICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6Ci0JCQkJICogLSBjbGVhciBQVEU7IGJhcnJpZXI7IHJlYWQgcmVmY291bnQKLQkJCQkgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEUKLQkJCQkgKi8KLQkJCQlzbXBfbWIoKTsKLQotCQkJCXJlZl9jb3VudCA9IGZvbGlvX3JlZl9jb3VudChmb2xpbyk7Ci0JCQkJbWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pOwotCi0JCQkJLyoKLQkJCQkgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZwotCQkJCSAqIChzZWUgY29tbWVudHMgaW4gX19yZW1vdmVfbWFwcGluZygpKS4KLQkJCQkgKi8KLQkJCQlzbXBfcm1iKCk7Ci0KLQkJCQlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyAhKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSkgewotCQkJCQkvKgotCQkJCQkgKiByZWRpcnRpZWQgZWl0aGVyIHVzaW5nIHRoZSBwYWdlIHRhYmxlIG9yIGEgcHJldmlvdXNseQotCQkJCQkgKiBvYnRhaW5lZCBHVVAgcmVmZXJlbmNlLgotCQkJCQkgKi8KLQkJCQkJc2V0X3B0ZXMobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKTsKLQkJCQkJZm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pOwotCQkJCQlnb3RvIHdhbGtfYWJvcnQ7Ci0JCQkJfSBlbHNlIGlmIChyZWZfY291bnQgIT0gMSAmIzQzOyBtYXBfY291bnQpIHsKLQkJCQkJLyoKLQkJCQkJICogQWRkaXRpb25hbCByZWZlcmVuY2UuIENvdWxkIGJlIGEgR1VQIHJlZmVyZW5jZSBvciBhbnkKLQkJCQkJICogc3BlY3VsYXRpdmUgcmVmZXJlbmNlLiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpbwotCQkJCQkgKiBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uIFRoaXMgZm9saW8gY2Fubm90IGJlCi0JCQkJCSAqIHJlY2xhaW1lZCByaWdodCBub3cgZWl0aGVyIHdheSwgc28gYWN0IGp1c3QgbGlrZSBub3RoaW5nCi0JCQkJCSAqIGhhcHBlbmVkLgotCQkJCQkgKiBXZSYjMzk7bGwgY29tZSBiYWNrIGhlcmUgbGF0ZXIgYW5kIGRldGVjdCBpZiB0aGUgZm9saW8gd2FzCi0JCQkJCSAqIGRpcnRpZWQgd2hlbiB0aGUgYWRkaXRpb25hbCByZWZlcmVuY2UgaXMgZ29uZS4KLQkJCQkJICovCi0JCQkJCXNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7Ci0JCQkJCWdvdG8gd2Fsa19hYm9ydDsKLQkJCQl9Ci0JCQkJYWRkX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUywgLW5yX3BhZ2VzKTsKLQkJCQlnb3RvIGRpc2NhcmQ7Ci0JCQl9Ci0KLQkJCWlmIChmb2xpb19kdXBfc3dhcChmb2xpbywgc3VicGFnZSkgJmx0OyAwKSB7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7CiYjNDM7CQkJaWYgKCF0dHVfYW5vbl9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLAomIzQzOwkJCQkJICAgIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKSkgewomIzQzOwkJCQlzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpOwogCQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb24KLQkJCSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLAotCQkJICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLgotCQkJICovCi0JCQlpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSAmbHQ7IDApIHsKLQkJCQlmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7Ci0JCQkJZ290byB3YWxrX2Fib3J0OwotCQkJfQotCi0JCQkvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcCgpOiBjbGVhciBQVEUgZmlyc3QuICovCi0JCQlpZiAoYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkJICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkgewotCQkJCWZvbGlvX3B1dF9zd2FwKGZvbGlvLCBzdWJwYWdlKTsKLQkJCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTsKLQkJCQlnb3RvIHdhbGtfYWJvcnQ7Ci0JCQl9Ci0JCQltbV9wcmVwYXJlX2Zvcl9zd2FwX2VudHJpZXMobW0pOwotCQkJZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7Ci0JCQlpbmNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpOwotCQkJc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpOwotCQkJaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCXN3cF9wdGUgPSBwdGVfc3dwX21rZXhjbHVzaXZlKHN3cF9wdGUpOwotCQkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewotCQkJCWlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7Ci0JCQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpCi0JCQkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7Ci0JCQkJaWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7Ci0JCQl9Ci0JCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSk7CiYjNDM7CQkJZ290byBmaW5pc2hfdW5tYXA7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIGxvY2tlZCBmaWxlLWJhY2tlZCBmb2xpbywKQEAgLTIzNDAsMTIgJiM0MzsyMzkwLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCSAqLwogCQkJYWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1ucl9wYWdlcyk7CiAJCX0KLWRpc2NhcmQ6Ci0JCWlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSkgewotCQkJaHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb2xpb19yZW1vdmVfcm1hcF9wdGVzKGZvbGlvLCBzdWJwYWdlLCBucl9wYWdlcywgdm1hKTsKLQkJfQomIzQzO2ZpbmlzaF91bm1hcDoKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCB2bWEpOwogCQlpZiAodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9MT0NLRUQpCiAJCQltbG9ja19kcmFpbl9sb2NhbCgpOwogCQlmb2xpb19wdXRfcmVmcyhmb2xpbywgbnJfcGFnZXMpOwpAQCAtMjM5Myw3ICYjNDM7MjQzOSw4IEBAIHN0YXRpYyBpbnQgZm9saW9fbm90X21hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpCiB7CiAJc3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHsKLQkJLnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSwKJiM0MzsJCS5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgPwomIzQzOwkJCQl0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLAogCQkuYXJnID0gKHZvaWQgKilmbGFncywKIAkJLmRvbmUgPSBmb2xpb19ub3RfbWFwcGVkLAogCQkuYW5vbl9sb2NrID0gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkLAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMyAwNToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MjcxCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjcwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBgcm1hcC5jYCBSZWZhY3RvcmluZyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYSBwYXRjaCB0aGF0JiMzOTtzIHJlZmFjdG9yaW5nIGB0cnlfdG9fdW5tYXBfb25lYCBpbiBgbW0vcm1hcC5jYC4gVGhpcyBpcyBhIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYXJlYSwgc28gbmF0dXJhbGx5LCBJIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbi4gSXQgbG9va3MgbGlrZSB0aGUgY2hhbmdlIGlzIGFpbWVkIGF0IGJldHRlciBvcmdhbml6YXRpb24sIHNwZWNpZmljYWxseSBleHRyYWN0aW5nIHRoZSBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGxvZ2ljIGludG8gZGVkaWNhdGVkIGZ1bmN0aW9uczogYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgYW5kIHZhcmlvdXMgYHR0dV9hbm9uX2ZvbGlvYCB2YXJpYW50cyBpbmNsdWRpbmcgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCBhbmQgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbG9uZ3NpZGUgYHN3cF9wdGVfcHJlcGFyZWAuCgpGdW5jdGlvbmFsbHksIHRoaXMgc2VlbXMgc291bmQuIFJlZmFjdG9yaW5nIGxpa2UgdGhpcyBvZnRlbiBpbXByb3ZlcyByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LCB3aGljaCBpcyBhbHdheXMgYSBnb29kIHNpZ24gaW4gYSBjb21wbGV4IGFyZWEgbGlrZSB0aGUga2VybmVsJiMzOTtzIG1lbW9yeSBtYW5hZ2VtZW50LiBHaXZlbiB0aGF0IGl0JiMzOTtzIHRvdWNoaW5nIHRoZSBybWFwIGNvZGUsIEkmIzM5O2Qgc2F5IHRoaXMgaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgbmVlZCB0byBmdXp6IHRob3JvdWdobHkgdG8gZW5zdXJlIG5vIHJlZ3Jlc3Npb25zLgoKTm93LCBsZXQmIzM5O3MgZHJpbGwgZG93biBpbnRvIHRoZSBzcGVjaWZpY3MuIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGlzIGNhbGxlZCB3aGVuIGBmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pYCByZXR1cm5zIHRydWUsIHdoaWNoIG1ha2VzIHNlbnNlLiBgdHJ5X3RvX3VubWFwX29uZWAgaGFuZGxlcyB0aGUgbm9uLWh1Z2V0bGIgY2FzZXMuIFRoYXQmIzM5O3MgYSBjbGVhbiBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLgoKTmV4dCwgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBgbW0vcm1hcC5jYCBpdHNlbGYgaXMgb25seSBjb21waWxlZCB3aXRoIGBDT05GSUdfTU1VYCwgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBUaGUgaHVnZXRsYi1zcGVjaWZpYyBsb2dpYywgYXMgZXhwZWN0ZWQsIGlzIGdhdGVkIGJ5IGBDT05GSUdfSFVHRVRMQl9QQUdFYC4gQW5kIGxvb2tpbmcgYXQgdGhlIGFub255bW91cyBmb2xpbyB1bm1hcHBpbmcsIGl0IHNlZW1zIHRoYXQgc3dhcCBzdXBwb3J0IChgQ09ORklHX1NXQVBgKSBpcyBjcnVjaWFsLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBzd2FwYmFja2VkIGZvbGlvIGNhc2VzLgoKRmluYWxseSwgSSYjMzk7bGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIHRvIGRvdWJsZS1jaGVjayBhbGwgY2FsbHMgdG8gYHRyeV90b191bm1hcGAgYW5kIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIHRvIGVuc3VyZSBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgYWxsIHRvdWNocG9pbnRzLiBUaGlzIHdpbGwgaGVscCB3aXRoIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEzIDA1OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b191bm1hcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3JtYXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ybWFwLmM9NjMzPXN0cnVjdCBhbm9uX3ZtYSAqZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8sXG4tLVxubW0vcm1hcC5jLTcxMC0gKi9cbm1tL3JtYXAuYzo3MTE6dm9pZCB0cnlfdG9fdW5tYXBfZmx1c2godm9pZClcbm1tL3JtYXAuYy03MTIte1xuLS1cbm1tL3JtYXAuYy03MjMtLyogRmx1c2ggaWZmIHRoZXJlIGFyZSBwb3RlbnRpYWxseSB3cml0YWJsZSBUTEIgZW50cmllcyB0aGF0IGNhbiByYWNlIHdpdGggSU8gKi9cbm1tL3JtYXAuYzo3MjQ6dm9pZCB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkodm9pZClcbm1tL3JtYXAuYy03MjUte1xuLS1cbm1tL3JtYXAuYy03MjgtXHRpZiAodGxiX3ViYy1cdTAwM2V3cml0YWJsZSlcbm1tL3JtYXAuYzo3Mjk6XHRcdHRyeV90b191bm1hcF9mbHVzaCgpO1xubW0vcm1hcC5jLTczMC19XG4tLVxubW0vcm1hcC5jPTc0Mj1zdGF0aWMgdm9pZCBzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCBwdGV2YWwsXG4tLVxubW0vcm1hcC5jLTc3NS1cdCAqIElmIHRoZSBQVEUgd2FzIGRpcnR5IHRoZW4gaXQmIzM5O3MgYmVzdCB0byBhc3N1bWUgaXQmIzM5O3Mgd3JpdGFibGUuIFRoZVxubW0vcm1hcC5jOjc3NjpcdCAqIGNhbGxlciBtdXN0IHVzZSB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkoKSBvciB0cnlfdG9fdW5tYXBfZmx1c2goKVxubW0vcm1hcC5jLTc3Ny1cdCAqIGJlZm9yZSB0aGUgcGFnZSBpcyBxdWV1ZWQgZm9yIElPLlxuLS1cbm1tL3JtYXAuYz0xOTQ0PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX3VubWFwX3B0ZV9iYXRjaChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuLS1cbm1tL3JtYXAuYy0xOTgwLVxubW0vcm1hcC5jOjE5ODE6c3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9ybWFwLmMtMTk4Mi1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxuLS1cbm1tL3JtYXAuYy0xOTkyLVx0Lypcbm1tL3JtYXAuYzoxOTkzOlx0ICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBmb2xpbyBpbiB0aGUgY2FzZVxubW0vcm1hcC5jLTE5OTQtXHQgKiB3aGVyZSB0aGUgaHVnZXRsYiBmb2xpbyBpcyBwb2lzb25lZC5cbi0tXG5tbS9ybWFwLmM9MjE3NT1zdGF0aWMgYm9vbCB0dHVfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZvbGlvICpmb2xpbyxcbi0tXG5tbS9ybWFwLmMtMjE5Ny0gKi9cbm1tL3JtYXAuYzoyMTk4OnN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9ybWFwLmMtMjE5OS1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbi0tXG5tbS9ybWFwLmMtMjIxNC1cdCAqIGluIGJldHdlZW4gaXRzIHB0ZXBfZ2V0X2FuZF9jbGVhcl9mdWxsKCkgYW5kIGZvbGlvX3JlbW92ZV9ybWFwXyooKSxcbm1tL3JtYXAuYzoyMjE1Olx0ICogdHJ5X3RvX3VubWFwKCkgbWF5IHJldHVybiBiZWZvcmUgZm9saW9fbWFwcGVkKCkgaGFzIGJlY29tZSBmYWxzZSxcbm1tL3JtYXAuYy0yMjE2LVx0ICogaWYgcGFnZSB0YWJsZSBsb2NraW5nIGlzIHNraXBwZWQ6IHVzZSBUVFVfU1lOQyB0byB3YWl0IGZvciB0aGF0LlxuLS1cbm1tL3JtYXAuYy0yMjI0LVx0ICogTm90ZSB0aGF0IHRoZSBmb2xpbyBjYW4gbm90IGJlIGZyZWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgY2FsbCBvZlxubW0vcm1hcC5jOjIyMjU6XHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGZvbGlvLlxubW0vcm1hcC5jLTIyMjYtXHQgKi9cbi0tXG5tbS9ybWFwLmM9MjQyMz1zdGF0aWMgaW50IGZvbGlvX25vdF9tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9ybWFwLmMtMjQyOC0vKipcbm1tL3JtYXAuYzoyNDI5OiAqIHRyeV90b191bm1hcCAtIFRyeSB0byByZW1vdmUgYWxsIHBhZ2UgdGFibGUgbWFwcGluZ3MgdG8gYSBmb2xpby5cbm1tL3JtYXAuYy0yNDMwLSAqIEBmb2xpbzogVGhlIGZvbGlvIHRvIHVubWFwLlxuLS1cbm1tL3JtYXAuYy0yNDM4LSAqL1xubW0vcm1hcC5jOjI0Mzk6dm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG5tbS9ybWFwLmMtMjQ0MC17XG4tLVxubW0vcm1hcC5jLTI0NDItXHRcdC5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgP1xubW0vcm1hcC5jOjI0NDM6XHRcdFx0XHR0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLFxubW0vcm1hcC5jLTI0NDQtXHRcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxuLS1cbm1tL3JtYXAuYz0yNDYxPXN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ybWFwLmMtMjQ4OC1cdCAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXG5tbS9ybWFwLmM6MjQ4OTpcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbm1tL3JtYXAuYy0yNDkwLVx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTMgMDU6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAxODEKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA0MDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBSZWZhY3RvcioqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGNsZWFybHkgbWFraW5nIHNvbWUgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBob3cgd2UgaGFuZGxlIG1lbW9yeSB1bm1hcHBpbmcsIHNwZWNpZmljYWxseSBieSBpbnRyb2R1Y2luZyBhIHN1aXRlIG9mIG5ldyBmdW5jdGlvbnMuIEl0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIHJlZmFjdG9yaW5nIGB0cnlfdG9fdW5tYXBfb25lYCBhbmQgYWRkaW5nIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgLCBgdHR1X2Fub25fbGF6eWZyZWVfZm9saW9gLCBgc3dwX3B0ZV9wcmVwYXJlYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYC4gVGhlc2UgYXJlIGRlZmluaXRlbHkgY29yZSBmdW5jdGlvbnMsIHRvdWNoaW5nIG9uIGhvdyB3ZSBkZWFsIHdpdGggaHVnZXRsYmZzIGFuZCBzd2FwcGVkIG1lbW9yeS4KClRoZSBrZXkgY29uZmlncyB0byBlbmFibGUgdGhlc2UgY2hhbmdlcyBhcmUgYEhVR0VUTEJfUEFHRWAgYW5kIGBTV0FQYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWVzLiBJIHNob3VsZCBmb2N1cyBvbiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYCBhcyB0aGUgcHJpbWFyeSBzeW1ib2xzIG9mIGludGVyZXN0LCBidXQgSSBhbHNvIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBgdHJ5X3RvX3VubWFwX29uZWAgaXMgYmVpbmcgbW9kaWZpZWQgYXMgd2VsbC4KCk5vdywgYmVmb3JlIEkgZGlnIGRlZXBlciwgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIHRoZXJlIGFyZW4mIzM5O3QgYW55IG90aGVyIGNydWNpYWwgY29uZmlncyB0byBiZSBhd2FyZSBvZi4gYEhVR0VUTEJfUEFHRWAgY292ZXJzIHRoZSBodWdldGxiIHVubWFwcGluZywgYW5kIGBTV0FQYCwgb2YgY291cnNlLCBjb3ZlcnMgdGhlIHN3YXAtYmFja2VkIGZvbGlvcy4gYE1NVWAgaXMgYSBnaXZlbiwgZ2l2ZW4gdGhhdCB3ZSBhcmUgd29ya2luZyBpbiBgbW0vcm1hcC5jYC4KCkFoYSEgSXQgbG9va3MgbGlrZSBgSFdQT0lTT05fSU5KRUNUYCBvciBgTUVNT1JZX0ZBSUxVUkVgIG1pZ2h0IGJlIHJlbGV2YW50IGhlcmUuIFRoZSBjb21tZW50IGluIHRoZSBjb2RlIHN1Z2dlc3RzIHRoYXQgYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgaXMgb25seSBjYWxsZWQgd2hlbiB3ZSBoYXZlIGBmbGFncyAmYW1wOyBUVFVfSFdQT0lTT05gLiBMZXQmIzM5O3MgY29uZmlybSB0aGF0IGJ5IGNoZWNraW5nIHRoZSBzb3VyY2UgY29kZSBvZiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYDoKYGBgYwoJLyoKCSAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2UKCSAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLgoJICovCglWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pOwoJVk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgJmFtcDsgVFRVX0hXUE9JU09OKSk7CmBgYApZdXAsIGNvbmZpcm1lZC4gSXQgbG9va3MgbGlrZSBgTUVNT1JZX0ZBSUxVUkVgIGlzIGluZGVlZCBhIHByZXJlcXVpc2l0ZSBzaW5jZSB0aGF0IHRyaWdnZXJzIHRoZSBgSFdQT0lTT05gIGZsYWcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTMgMDU6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TUVNT1JZX0ZBSUxVUkUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9NzQ3PWNvbmZpZyBERUZBVUxUX01NQVBfTUlOX0FERFJcbi0tXG5tbS9LY29uZmlnLTc2NS1cbm1tL0tjb25maWc6NzY2OmNvbmZpZyBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFXG5tbS9LY29uZmlnLTc2Ny1cdGJvb2xcbm1tL0tjb25maWctNzY4LVxubW0vS2NvbmZpZzo3Njk6Y29uZmlnIE1FTU9SWV9GQUlMVVJFXG5tbS9LY29uZmlnLTc3MC1cdGRlcGVuZHMgb24gTU1VXG5tbS9LY29uZmlnOjc3MTpcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19NRU1PUllfRkFJTFVSRVxubW0vS2NvbmZpZy03NzItXHRib29sIFwmIzM0O0VuYWJsZSByZWNvdmVyeSBmcm9tIGhhcmR3YXJlIG1lbW9yeSBlcnJvcnNcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTc4MD1jb25maWcgSFdQT0lTT05fSU5KRUNUXG5tbS9LY29uZmlnLTc4MS1cdHRyaXN0YXRlIFwmIzM0O0hXUG9pc29uIHBhZ2VzIGluamVjdG9yXCYjMzQ7XG5tbS9LY29uZmlnOjc4MjpcdGRlcGVuZHMgb24gTUVNT1JZX0ZBSUxVUkUgXHUwMDI2XHUwMDI2IERFQlVHX0tFUk5FTCBcdTAwMjZcdTAwMjYgUFJPQ19GU1xubW0vS2NvbmZpZy03ODMtXHRzZWxlY3QgUFJPQ19QQUdFX01PTklUT1JcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMyAwNToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTM2MQoJCQkJCQkJb3V0cHV0OiAxNTEKCQkJCQkJCXRob3VnaHRzOiA0NTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgUmVhc29uaW5nIGZvciBTZWxlY3RpbmcgUmVsZXZhbnQgU3ltYm9scyoqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBtb3N0IHJlbGV2YW50IGhlcmUuIGBNRU1PUllfRkFJTFVSRWAsIGBIV1BPSVNPTl9JTkpFQ1RgLCBgSFVHRVRMQl9QQUdFYCwgYW5kIGBTV0FQYCBhbGwgc2VlbSBsaWtlIGdvb2QgY2hvaWNlcyB0byBlbmFibGUgZm9yIHRlc3RpbmcuIE5vdywgbGV0JiMzOTtzIGRyaWxsIGRvd24gdG8gdGhlIGZ1bmN0aW9ucyB0aGVtc2VsdmVzLgoKSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSBzeW1ib2xzIHRoYXQgYXJlIGltcGFjdGVkIGJ5IHRoaXMgcGF0Y2guIEkgc2VlIHRoYXQgYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgaXMgYSBrZXkgZnVuY3Rpb247IEkganVzdCBjaGVja2VkLCBhbmQgaXQgKmlzKiBzdGF0aWMuIFRoZSByZWxhdGVkIGZ1bmN0aW9ucyBgdHR1X2Fub25fbGF6eWZyZWVfZm9saW9gLCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2AsIGB0dHVfYW5vbl9mb2xpb2AsIGFuZCBhbHNvIGB0cnlfdG9fdW5tYXBfb25lYCBhcmUgYWxsIHJlbGF0ZWQgdG8gdGhpcyBuZXcgYXJjaGl0ZWN0dXJlLgoKV2FpdCBhIHNlY29uZCwgYHRyeV90b191bm1hcF9vbmVgIGlzIHByb2JhYmx5IGEgdmVyeSBob3QgcGF0aDsgdGhhdCYjMzk7cyB0b28gZ2VuZXJpYyBhbmQgd291bGQgc2tldyB0aGUgdGVzdCByZXN1bHRzLiBMZXQmIzM5O3Mgc2VlLi4uIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGlzbiYjMzk7dCBzbyBob3QsIHdoaWNoIGlzIGdvb2QuIEhvd2V2ZXIsIGB0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb2AsIGB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvYCwgYW5kIGB0dHVfYW5vbl9mb2xpb2Agc3RpbGwgbWlnaHQgYmUgcHJldHR5IGhvdCwgYnV0IGl0JiMzOTtzIGltcG9ydGFudCB0byBjb25zaWRlciB0aGVtLiBBaCwgbm93LCBgdHR1X2Fub25fZm9saW9gIGlzIGNhbGxlZCBmb3IgKmV2ZXJ5KiBhbm9ueW1vdXMgcGFnZSB1bm1hcC4gVGhhdCYjMzk7cyAqdmVyeSogaG90LiBJIHNob3VsZCBhdm9pZCBpdC4gSG1tLCBtYXliZSBqdXN0IGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGFuZCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2A/IFdlbGwsIHRoZSBsYXp5ZnJlZSBvbmUgYW5kIHRoZSBzd2FwYmFja2VkIG9uZSBhcmUgdGhlIGtleS4KCkFuZCwganVzdCB0byBiZSBzdXJlLCBJJiMzOTtsbCBjb25maXJtIHRoYXQgYHR0dV9hbm9uX2ZvbGlvYCBpcyBzdGF0aWM7IHllcywgaXQgaXMuCgpUaGUgY29uZmlncyBJJiMzOTttIGNvbnNpZGVyaW5nIGFyZToKCiogICBgSFVHRVRMQl9QQUdFYAoqICAgYE1FTU9SWV9GQUlMVVJFYAoqICAgYEhXUE9JU09OX0lOSkVDVGAKKiAgIGBTV0FQYAoKVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIGBtbS9ybWFwLmNgIHJlbGF0ZWQgdG8gZm9saW8gdW5tYXBwaW5nLCB3aXRoIGEgZm9jdXMgb24gaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvcy4gVGhpcyBtZWFucyBpdCBhZmZlY3RzIGNvZGUgdGhhdCYjMzk7cyB1c2VkIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCBvcGVyYXRpb25zLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLiBUaGVyZWZvcmUsIEkgd2lsbCB1c2UgYHNldC1yZXN1bHRzYCB0byByZWNvcmQgdGhpcyBjaG9pY2Ugb2Ygc3ltYm9scyBhbmQgY29uZmlncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMyAwNToyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDssCiAgICAmIzM0O01FTU9SWV9GQUlMVVJFJiMzNDssCiAgICAmIzM0O0hXUE9JU09OX0lOSkVDVCYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2xhenlmcmVlX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8mIzM0OywKICAgICYjMzQ7dHR1X2Fub25fZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vcm1hcC5jIGZvciB1bm1hcHBpbmcgZm9saW9zLCBleHRyYWN0aW5nIGh1Z2V0bGIgYW5kIGFub255bW91cyBmb2xpbyB1bm1hcHBpbmcgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMuIFRoaXMgbW9kaWZpZXMgZnVuY3Rpb25hbCBjb2RlIHJlYWNoYWJsZSBkdXJpbmcgbWVtb3J5IHJlY2xhaW0sIHN3YXAsIGFuZCBoYXJkd2FyZSBwb2lzb24gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7LAogICAgJiMzNDtNRU1PUllfRkFJTFVSRSYjMzQ7LAogICAgJiMzNDtIV1BPSVNPTl9JTkpFQ1QmIzM0OywKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RyeV90b191bm1hcF9odWdldGxiX29uZSYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpbyYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3JtYXAuYyBmb3IgdW5tYXBwaW5nIGZvbGlvcywgZXh0cmFjdGluZyBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLiBUaGlzIG1vZGlmaWVzIGZ1bmN0aW9uYWwgY29kZSByZWFjaGFibGUgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NDYuODU3NzY0MTc2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA4NTUyMTE0MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJNRU1PUllfRkFJTFVSRVwiLFxuICAgIFwiSFdQT0lTT05fSU5KRUNUXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJ0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS9ybWFwLmMgZm9yIHVubWFwcGluZyBmb2xpb3MsIGV4dHJhY3RpbmcgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gVGhpcyBtb2RpZmllcyBmdW5jdGlvbmFsIGNvZGUgcmVhY2hhYmxlIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCwgYW5kIGhhcmR3YXJlIHBvaXNvbiBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NDYuODU3NzY4ODE2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzkxOTU5NzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA0NjBmYzU4YmQ4MGM1ZTY4YTA4MmFlZDMzNWJmZWRhMGY2YjY4ODI4XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gSnVsIDEzIDA1OjI2OjQ1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmhcXG5pbmRleCA0MTE1MDc2ZTQ5MjJhZS4uYmY3ZTE2M2UzNzc5ZDggMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9odWdldGxiLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaFxcbkBAIC0xMjcxLDYgKzEyNzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaHVnZXRsYl9jb3VudF9zdWIobG9uZyBsLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4gfVxcbiBcXG4gcHRlX3QgaHVnZV9wdGVwX2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7XFxuK3Vuc2lnbmVkIGxvbmcgaHVnZV9wdGVfZGlydHkocHRlX3QgcHRlKTtcXG4gXFxuIHN0YXRpYyBpbmxpbmUgcHRlX3QgaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApXFxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xcbmluZGV4IDI2MTY2YTZiOGNiOWIxLi5mZTY3Y2U2Y2ViNWViMyAxMDA2NDRcXG4tLS0gYS9tbS9ybWFwLmNcXG4rKysgYi9tbS9ybWFwLmNcXG5AQCAtMTk3OCw2ICsxOTc4LDIyMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmb2xpb191bm1hcF9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gXFx0XFx0XFx0XFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9SRVNQRUNUX1NPRlRfRElSVFkpO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxcbit7XFxuK1xcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xcbitcXHRjb25zdCBlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7XFxuK1xcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4rXFx0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcXG4rXFx0Ym9vbCByZXQgPSB0cnVlO1xcbitcXHRwdGVfdCBwdGV2YWw7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgdHJ5X3RvX3VubWFwKCkgaXMgb25seSBwYXNzZWQgYSBodWdldGxiIGZvbGlvIGluIHRoZSBjYXNlXFxuK1xcdCAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLlxcbitcXHQgKi9cXG4rXFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbyksIGZvbGlvKTtcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXFx1MDAyNiBUVFVfSFdQT0lTT04pKTtcXG4rXFxuK1xcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcXHUwMDI2cHZtdyk7XFxuK1xcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFxcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVxcdTAwM2V2bV9tbSxcXG4rXFx0XFx0XFx0XFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcXG4rXFx0YWRqdXN0X3JhbmdlX2lmX3BtZF9zaGFyaW5nX3Bvc3NpYmxlKHZtYSwgXFx1MDAyNnJhbmdlLnN0YXJ0LCBcXHUwMDI2cmFuZ2UuZW5kKTtcXG4rXFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXFx1MDAyNnJhbmdlKTtcXG4rXFxuK1xcdC8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi9cXG4rXFx0aWYgKCFwYWdlX3ZtYV9tYXBwZWRfd2FsayhcXHUwMDI2cHZtdykpXFxuK1xcdFxcdGdvdG8gcmFuZ2VfZW5kO1xcbitcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKGFkZHJlc3MgIT0gcHZtdy5hZGRyZXNzKTtcXG4rXFxuK1xcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKCFwdGVfcHJlc2VudChwdGV2YWwpKTtcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKHB0ZV9wZm4ocHRldmFsKSAhPSBmb2xpb19wZm4oZm9saW8pKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS4gVGhlcmUgaXMgbm8gd2F5IG9mXFxuK1xcdCAqIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3RcXG4rXFx0ICogZmx1c2ggdGhlbSBhbGwuIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xcbitcXHQgKiByYW5nZS5cXG4rXFx0ICovXFxuK1xcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGUgbW9kZS5cXG4rXFx0ICogQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXFxuK1xcdCAqXFxuK1xcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4gTG9jayBvcmRlciBkaWN0YXRlc1xcbitcXHQgKiBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS4gV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcXG4rXFx0ICogZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcXG4rXFx0XFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xcbitcXG4rXFx0XFx0Vk1fV0FSTl9PTighKGZsYWdzIFxcdTAwMjYgVFRVX1JNQVBfTE9DS0VEKSk7XFxuK1xcdFxcdGlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKSB7XFxuK1xcdFxcdFxcdHJldCA9IGZhbHNlO1xcbitcXHRcXHRcXHRnb3RvIHdhbGtfZG9uZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0dGxiX2dhdGhlcl9tbXVfdm1hKFxcdTAwMjZ0bGIsIHZtYSk7XFxuK1xcdFxcdGlmIChodWdlX3BtZF91bnNoYXJlKFxcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XFxuK1xcdFxcdFxcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xcbitcXHRcXHRcXHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFxcdTAwMjZ0bGIsIHZtYSk7XFxuK1xcdFxcdFxcdHRsYl9maW5pc2hfbW11KFxcdTAwMjZ0bGIpO1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCwgY29uc2VxdWVudGx5IHVubWFwcGluZ1xcbitcXHRcXHRcXHQgKiB0aGUgZm9saW8uXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRnb3RvIHdhbGtfZG9uZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcXG4rXFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuK1xcdH1cXG4rXFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xcbitcXHRpZiAoaHVnZV9wdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcbitcXHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkoZm9saW9fcGFnZShmb2xpbywgMCkpKTtcXG4rXFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XFxuK1xcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTtcXG4rXFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XFxuK1xcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCAxKTtcXG4rXFxuK3dhbGtfZG9uZTpcXG4rXFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuK3JhbmdlX2VuZDpcXG4rXFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFxcdTAwMjZyYW5nZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbit7XFxuK1xcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFN5bmNocm9uaXplIHdpdGggZ3VwX3B0ZV9yYW5nZSgpOlxcbitcXHQgKiAtIGNsZWFyIFBURTsgYmFycmllcjsgcmVhZCByZWZjb3VudFxcbitcXHQgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEVcXG4rXFx0ICovXFxuK1xcdHNtcF9tYigpO1xcbitcXG4rXFx0cmVmX2NvdW50ID0gZm9saW9fcmVmX2NvdW50KGZvbGlvKTtcXG4rXFx0bWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pO1xcbitcXG4rXFx0LypcXG4rXFx0ICogT3JkZXIgcmVhZHMgZm9yIHBhZ2UgcmVmY291bnQgYW5kIGRpcnR5IGZsYWdcXG4rXFx0ICogKHNlZSBjb21tZW50cyBpbiBfX3JlbW92ZV9tYXBwaW5nKCkpLlxcbitcXHQgKi9cXG4rXFx0c21wX3JtYigpO1xcbitcXG4rXFx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogcmVkaXJ0aWVkIGVpdGhlciB1c2luZyB0aGUgcGFnZSB0YWJsZSBvciBhIHByZXZpb3VzbHlcXG4rXFx0XFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGZvbGlvX3NldF9zd2FwYmFja2VkKGZvbGlvKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBZGRpdGlvbmFsIHJlZmVyZW5jZXMgY291bGQgYmUgZHVlIHRvIEdVUCBvciBzcGVjdWxhdGl2ZSBsb29rdXBzLlxcbitcXHQgKiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpbyBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uXFxuK1xcdCAqIFRoaXMgZm9saW8gY2Fubm90IGJlIHJlY2xhaW1lZCByaWdodCBub3cgZWl0aGVyIHdheSwgc28gYWN0IGp1c3RcXG4rXFx0ICogbGlrZSBub3RoaW5nIGhhcHBlbmVkLiBXZSdsbCBjb21lIGJhY2sgaGVyZSBsYXRlciBhbmQgZGV0ZWN0IGlmIHRoZVxcbitcXHQgKiBmb2xpbyB3YXMgZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxcbitcXHQgKi9cXG4rXFx0aWYgKHJlZl9jb3VudCAhPSAxICsgbWFwX2NvdW50KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRhZGRfbW1fY291bnRlcih2bWEtXFx1MDAzZXZtX21tLCBNTV9BTk9OUEFHRVMsIC1ucl9wYWdlcyk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgcHRlX3Qgc3dwX3B0ZV9wcmVwYXJlKHN3cF9lbnRyeV90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLFxcbitcXHRcXHRib29sIGFub25fZXhjbHVzaXZlKVxcbit7XFxuK1xcdHB0ZV90IHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcXG4rXFxuK1xcdGlmIChhbm9uX2V4Y2x1c2l2ZSlcXG4rXFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7XFxuK1xcbitcXHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KG9sZF9wdGUpKSkge1xcbitcXHRcXHRpZiAocHRlX3NvZnRfZGlydHkob2xkX3B0ZSkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4rXFx0XFx0aWYgKHB0ZV91ZmZkKG9sZF9wdGUpKVxcbitcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIERldmljZS1leGNsdXNpdmUgZW50cnkgKi9cXG4rXFx0XFx0aWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShvbGRfcHRlKSlcXG4rXFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbitcXHRcXHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxcbitcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBzd3BfcHRlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbitcXHRcXHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKVxcbit7XFxuK1xcdGNvbnN0IGJvb2wgYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdFxcdCAgICBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcXG4rXFx0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkocGFnZSk7XFxuK1xcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4rXFxuK1xcdGlmIChmb2xpb19kdXBfc3dhcChmb2xpbywgcGFnZSkgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXFxuK1xcdCAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLFxcbitcXHQgKiBzbyB3ZSdsbCBub3QgY2hlY2svY2FyZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFxcdTAwM2MgMCkge1xcbitcXHRcXHRmb2xpb19wdXRfc3dhcChmb2xpbywgcGFnZSk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbitcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjYgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHBhZ2UpKSB7XFxuK1xcdFxcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRtbV9wcmVwYXJlX2Zvcl9zd2FwX2VudHJpZXMobW0pO1xcbitcXHRkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTtcXG4rXFx0aW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTtcXG4rXFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlcCxcXG4rXFx0XFx0ICAgc3dwX3B0ZV9wcmVwYXJlKGVudHJ5LCBwdGV2YWwsIGFub25fZXhjbHVzaXZlKSk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB0dHVfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAsXFxuK1xcdFxcdHB0ZV90IHB0ZXZhbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4re1xcbitcXHQvKlxcbitcXHQgKiBTdG9yZSB0aGUgc3dhcCBsb2NhdGlvbiBpbiB0aGUgcHRlLlxcbitcXHQgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLlxcbitcXHQgKi9cXG4rXFx0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pICE9XFxuK1xcdFxcdFxcdCBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXFxuK1xcdFxcdHJldHVybiB0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpbyh2bWEsIGZvbGlvLCBucl9wYWdlcyk7XFxuK1xcbitcXHQvKiBucl9wYWdlcyBcXHUwMDNlIDEgbm90IHN1cHBvcnRlZCB5ZXQgKi9cXG4rXFx0cmV0dXJuIHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8odm1hLCBmb2xpbywgcGFnZSwgYWRkcmVzcywgcHRlcCxcXG4rXFx0XFx0XFx0XFx0XFx0IHB0ZXZhbCk7XFxuK31cXG4rXFxuIC8qXFxuICAqIEBhcmc6IGVudW0gdHR1X2ZsYWdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgYXJndW1lbnRcXG4gICovXFxuQEAgLTE5ODYsMTQgKzIyMDAsMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4ge1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuIFxcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcXG4tXFx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSwgcmV0ID0gdHJ1ZTtcXG4rXFx0Ym9vbCByZXQgPSB0cnVlO1xcbiBcXHRwdGVfdCBwdGV2YWw7XFxuLVxcdHN0cnVjdCBwYWdlICpzdWJwYWdlO1xcbitcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gXFx0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcXG4gXFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xcbiBcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMSwgZW5kX2FkZHI7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbi1cXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XFxuIFxcdGludCBwdGVzID0gMDtcXG4gXFxuIFxcdC8qXFxuQEAgLTIwMDcsOCArMjIyMCw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBGb3IgVEhQLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGUgd29yc2UgY2FzZSBpZSBwbWQgZm9yIGludmFsaWRhdGlvbi5cXG4tXFx0ICogRm9yIGh1Z2V0bGIsIGl0IGNvdWxkIGJlIG11Y2ggd29yc2UgaWYgd2UgbmVlZCB0byBkbyBwdWRcXG4tXFx0ICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLlxcbiBcXHQgKlxcbiBcXHQgKiBOb3RlIHRoYXQgdGhlIGZvbGlvIGNhbiBub3QgYmUgZnJlZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXFxuIFxcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZm9saW8uXFxuQEAgLTIwMTYsMTcgKzIyMjcsNiBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXFx1MDAyNnB2bXcpO1xcbiBcXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cXHUwMDNldm1fbW0sXFxuIFxcdFxcdFxcdFxcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XFxuLVxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZFxcbi1cXHRcXHQgKiBhY2NvcmRpbmdseS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFxcdTAwMjZyYW5nZS5zdGFydCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2cmFuZ2UuZW5kKTtcXG4tXFxuLVxcdFxcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xcbi1cXHRcXHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xcbi1cXHR9XFxuIFxcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFxcdTAwMjZyYW5nZSk7XFxuIFxcbiBcXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXFx1MDAyNnB2bXcpKSB7XFxuQEAgLTIxMTEsNjUgKzIzMTEsMTEgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0XFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7XFxuIFxcbiBcXHRcXHRcXHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpO1xcbi1cXHRcXHRcXHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTtcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0c3VicGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpO1xcbi1cXHRcXHRhbm9uX2V4Y2x1c2l2ZSA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0XFx0XFx0IFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpO1xcbi1cXG4tXFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcXG4tXFx0XFx0XFx0Ym9vbCBhbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4tXFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgcGFnZVxcbi1cXHRcXHRcXHQgKiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaHVnZXRsYiBwYWdlIGlzIHBvaXNvbmVkLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0Vk1fQlVHX09OX1BBR0UoIVBhZ2VIV1BvaXNvbihzdWJwYWdlKSwgc3VicGFnZSk7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS5cXG4tXFx0XFx0XFx0ICogVGhlcmUgaXMgbm8gd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heVxcbi1cXHRcXHRcXHQgKiBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuXFxuLVxcdFxcdFxcdCAqIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xcbi1cXHRcXHRcXHQgKiByYW5nZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XFxuK1xcdFxcdHBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcXG4gXFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRvIGNhbGwgaHVnZV9wbWRfdW5zaGFyZSwgaV9tbWFwX3J3c2VtIG11c3QgYmVcXG4tXFx0XFx0XFx0ICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHlcXG4tXFx0XFx0XFx0ICogZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXFxuLVxcdFxcdFxcdCAqXFxuLVxcdFxcdFxcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS5cXG4tXFx0XFx0XFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFXFxuLVxcdFxcdFxcdCAqIGlfbW1hcF9yd3NlbS4gIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWxcXG4tXFx0XFx0XFx0ICogaWYgdW5zdWNjZXNzZnVsLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aWYgKCFhbm9uKSB7XFxuLVxcdFxcdFxcdFxcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcXG4tXFxuLVxcdFxcdFxcdFxcdFZNX0JVR19PTighKGZsYWdzIFxcdTAwMjYgVFRVX1JNQVBfTE9DS0VEKSk7XFxuLVxcdFxcdFxcdFxcdGlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKVxcbi1cXHRcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuLVxcbi1cXHRcXHRcXHRcXHR0bGJfZ2F0aGVyX21tdV92bWEoXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0aWYgKGh1Z2VfcG1kX3Vuc2hhcmUoXFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcXG4tXFx0XFx0XFx0XFx0XFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XFxuLVxcdFxcdFxcdFxcdFxcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuLVxcdFxcdFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdFxcdFxcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby5cXG4tXFx0XFx0XFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdFxcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xcbi1cXHRcXHRcXHRcXHR0bGJfZmluaXNoX21tdShcXHUwMDI2dGxiKTtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRwdGV2YWwgPSBodWdlX3B0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyZXNzLCBwdm13LnB0ZSk7XFxuLVxcdFxcdFxcdGlmIChwdGVfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdFxcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XFxuK1xcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4gXFx0XFx0XFx0bnJfcGFnZXMgPSBmb2xpb191bm1hcF9wdGVfYmF0Y2goZm9saW8sIFxcdTAwMjZwdm13LCBmbGFncywgcHRldmFsKTtcXG4gXFx0XFx0XFx0ZW5kX2FkZHIgPSBhZGRyZXNzICsgbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIFxcdFxcdFxcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xcbkBAIC0yMjA0LDE2ICsyMzUwLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdC8qIFVwZGF0ZSBoaWdoIHdhdGVybWFyayBiZWZvcmUgd2UgbG93ZXIgcnNzICovXFxuIFxcdFxcdHVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7XFxuIFxcbi1cXHRcXHRpZiAoUGFnZUhXUG9pc29uKHN1YnBhZ2UpIFxcdTAwMjZcXHUwMDI2IChmbGFncyBcXHUwMDI2IFRUVV9IV1BPSVNPTikpIHtcXG4tXFx0XFx0XFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XFxuLVxcdFxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0aHN6KTtcXG4tXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdH1cXG4rXFx0XFx0LyogV2l0aCBUVFVfSFdQT0lTT04sIHdlIG9ubHkgZXhwZWN0IHNtYWxsIGZvbGlvcyBoZXJlLiAqL1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbykgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xcbitcXHRcXHRcXHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xcbitcXHRcXHRcXHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xcbitcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcXG4gXFx0XFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXFx1MDAyNlxcdTAwMjYgcHRlX3VudXNlZChwdGV2YWwpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdCAgICF1c2VyZmF1bHRmZF9hcm1lZCh2bWEpKSB7XFxuIFxcdFxcdFxcdC8qXFxuQEAgLTIyMjgsMTA0ICsyMzY5LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xcbiBcXHRcXHR9IGVsc2UgaWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcXG4tXFx0XFx0XFx0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkoc3VicGFnZSk7XFxuLVxcdFxcdFxcdHB0ZV90IHN3cF9wdGU7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuXFxuLVxcdFxcdFxcdCAqIFNlZSBoYW5kbGVfcHRlX2ZhdWx0KCkgLi4uXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPVxcbi1cXHRcXHRcXHRcXHRcXHRmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7XFxuLVxcdFxcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4tXFx0XFx0XFx0XFx0Z290byB3YWxrX2Fib3J0O1xcbi1cXHRcXHRcXHR9XFxuLVxcbi1cXHRcXHRcXHQvKiBNQURWX0ZSRUUgcGFnZSBjaGVjayAqL1xcbi1cXHRcXHRcXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0aW50IHJlZl9jb3VudCwgbWFwX2NvdW50O1xcbi1cXG4tXFx0XFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0XFx0ICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6XFxuLVxcdFxcdFxcdFxcdCAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50XFxuLVxcdFxcdFxcdFxcdCAqIC0gaW5jIHJlZmNvdW50OyBiYXJyaWVyOyByZWFkIFBURVxcbi1cXHRcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0XFx0c21wX21iKCk7XFxuLVxcbi1cXHRcXHRcXHRcXHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRtYXBfY291bnQgPSBmb2xpb19tYXBjb3VudChmb2xpbyk7XFxuLVxcbi1cXHRcXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHQgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZ1xcbi1cXHRcXHRcXHRcXHQgKiAoc2VlIGNvbW1lbnRzIGluIF9fcmVtb3ZlX21hcHBpbmcoKSkuXFxuLVxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRzbXBfcm1iKCk7XFxuLVxcbi1cXHRcXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXFx1MDAyNlxcdTAwMjYgISh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fRFJPUFBBQkxFKSkge1xcbi1cXHRcXHRcXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHRcXHQgKiByZWRpcnRpZWQgZWl0aGVyIHVzaW5nIHRoZSBwYWdlIHRhYmxlIG9yIGEgcHJldmlvdXNseVxcbi1cXHRcXHRcXHRcXHRcXHQgKiBvYnRhaW5lZCBHVVAgcmVmZXJlbmNlLlxcbi1cXHRcXHRcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0XFx0XFx0c2V0X3B0ZXMobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKTtcXG4tXFx0XFx0XFx0XFx0XFx0Zm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuLVxcdFxcdFxcdFxcdH0gZWxzZSBpZiAocmVmX2NvdW50ICE9IDEgKyBtYXBfY291bnQpIHtcXG4tXFx0XFx0XFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0XFx0XFx0ICogQWRkaXRpb25hbCByZWZlcmVuY2UuIENvdWxkIGJlIGEgR1VQIHJlZmVyZW5jZSBvciBhbnlcXG4tXFx0XFx0XFx0XFx0XFx0ICogc3BlY3VsYXRpdmUgcmVmZXJlbmNlLiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpb1xcbi1cXHRcXHRcXHRcXHRcXHQgKiBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uIFRoaXMgZm9saW8gY2Fubm90IGJlXFxuLVxcdFxcdFxcdFxcdFxcdCAqIHJlY2xhaW1lZCByaWdodCBub3cgZWl0aGVyIHdheSwgc28gYWN0IGp1c3QgbGlrZSBub3RoaW5nXFxuLVxcdFxcdFxcdFxcdFxcdCAqIGhhcHBlbmVkLlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBXZSdsbCBjb21lIGJhY2sgaGVyZSBsYXRlciBhbmQgZGV0ZWN0IGlmIHRoZSBmb2xpbyB3YXNcXG4tXFx0XFx0XFx0XFx0XFx0ICogZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxcbi1cXHRcXHRcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0XFx0XFx0c2V0X3B0ZXMobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKTtcXG4tXFx0XFx0XFx0XFx0XFx0Z290byB3YWxrX2Fib3J0O1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdFxcdGFkZF9tbV9jb3VudGVyKG1tLCBNTV9BTk9OUEFHRVMsIC1ucl9wYWdlcyk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gZGlzY2FyZDtcXG4tXFx0XFx0XFx0fVxcbi1cXG4tXFx0XFx0XFx0aWYgKGZvbGlvX2R1cF9zd2FwKGZvbGlvLCBzdWJwYWdlKSBcXHUwMDNjIDApIHtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuK1xcdFxcdFxcdGlmICghdHR1X2Fub25fZm9saW8odm1hLCBmb2xpbywgcGFnZSwgYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKSkge1xcbitcXHRcXHRcXHRcXHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xcbiBcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuIFxcdFxcdFxcdH1cXG4gXFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cXG4tXFx0XFx0XFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXFxuLVxcdFxcdFxcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXFx1MDAzYyAwKSB7XFxuLVxcdFxcdFxcdFxcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBzdWJwYWdlKTtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gd2Fsa19hYm9ydDtcXG4tXFx0XFx0XFx0fVxcbi1cXG4tXFx0XFx0XFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbi1cXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0XFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkge1xcbi1cXHRcXHRcXHRcXHRmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7XFxuLVxcdFxcdFxcdFxcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcXG4tXFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7XFxuLVxcdFxcdFxcdGluY19tbV9jb3VudGVyKG1tLCBNTV9TV0FQRU5UUyk7XFxuLVxcdFxcdFxcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKGFub25fZXhjbHVzaXZlKVxcbi1cXHRcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta2V4Y2x1c2l2ZShzd3BfcHRlKTtcXG4tXFx0XFx0XFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3NvZnRfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3VmZmQocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xcbi1cXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXFxuLVxcdFxcdFxcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4tXFx0XFx0XFx0XFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUpO1xcbitcXHRcXHRcXHRnb3RvIGZpbmlzaF91bm1hcDtcXG4gXFx0XFx0fSBlbHNlIHtcXG4gXFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0ICogVGhpcyBpcyBhIGxvY2tlZCBmaWxlLWJhY2tlZCBmb2xpbyxcXG5AQCAtMjM0MCwxMiArMjM5MCw4IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLW5yX3BhZ2VzKTtcXG4gXFx0XFx0fVxcbi1kaXNjYXJkOlxcbi1cXHRcXHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkpIHtcXG4tXFx0XFx0XFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xcbi1cXHRcXHR9XFxuK2ZpbmlzaF91bm1hcDpcXG4rXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgbnJfcGFnZXMsIHZtYSk7XFxuIFxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fTE9DS0VEKVxcbiBcXHRcXHRcXHRtbG9ja19kcmFpbl9sb2NhbCgpO1xcbiBcXHRcXHRmb2xpb19wdXRfcmVmcyhmb2xpbywgbnJfcGFnZXMpO1xcbkBAIC0yMzkzLDcgKzI0MzksOCBAQCBzdGF0aWMgaW50IGZvbGlvX25vdF9tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXFxuIHtcXG4gXFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcXG4tXFx0XFx0LnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSxcXG4rXFx0XFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSA/XFxuK1xcdFxcdFxcdFxcdHRyeV90b191bm1hcF9odWdldGxiX29uZSA6IHRyeV90b191bm1hcF9vbmUsXFxuIFxcdFxcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxcbiBcXHRcXHQuZG9uZSA9IGZvbGlvX25vdF9tYXBwZWQsXFxuIFxcdFxcdC5hbm9uX2xvY2sgPSBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEzVDA1OjI2OjQ3LjIzNzU4Nzk0M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjA0NzUzNzc2MzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJNRU1PUllfRkFJTFVSRVwiLFxuICAgIFwiSFdQT0lTT05fSU5KRUNUXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJ0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS9ybWFwLmMgZm9yIHVubWFwcGluZyBmb2xpb3MsIGV4dHJhY3RpbmcgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gVGhpcyBtb2RpZmllcyBmdW5jdGlvbmFsIGNvZGUgcmVhY2hhYmxlIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCwgYW5kIGhhcmR3YXJlIHBvaXNvbiBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0NjBmYzU4YmQ4MGM1ZTY4YTA4MmFlZDMzNWJmZWRhMGY2YjY4ODI4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBKdWwgMTMgMDU6MjY6NDUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oXG5pbmRleCA0MTE1MDc2ZTQ5MjJhZS4uYmY3ZTE2M2UzNzc5ZDggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaFxuKysrIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmhcbkBAIC0xMjcxLDYgKzEyNzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaHVnZXRsYl9jb3VudF9zdWIobG9uZyBsLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB9XG4gXG4gcHRlX3QgaHVnZV9wdGVwX2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7XG4rdW5zaWduZWQgbG9uZyBodWdlX3B0ZV9kaXJ0eShwdGVfdCBwdGUpO1xuIFxuIHN0YXRpYyBpbmxpbmUgcHRlX3QgaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApXG5kaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jXG5pbmRleCAyNjE2NmE2YjhjYjliMS4uZmU2N2NlNmNlYjVlYjMgMTAwNjQ0XG4tLS0gYS9tbS9ybWFwLmNcbisrKyBiL21tL3JtYXAuY1xuQEAgLTE5NzgsNiArMTk3OCwyMjAgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZm9saW9fdW5tYXBfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdFx0XHQgICAgIEZQQl9SRVNQRUNUX1dSSVRFIHwgRlBCX1JFU1BFQ1RfU09GVF9ESVJUWSk7XG4gfVxuIFxuK3N0YXRpYyBib29sIHRyeV90b191bm1hcF9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuK1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB2b2lkICphcmcpXG4re1xuK1x0REVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIGZvbGlvLCB2bWEsIGFkZHJlc3MsIDApO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xuK1x0Y29uc3QgZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuK1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4rXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuK1x0Ym9vbCByZXQgPSB0cnVlO1xuK1x0cHRlX3QgcHRldmFsO1xuK1xuK1x0LypcbitcdCAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2VcbitcdCAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLlxuK1x0ICovXG4rXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pO1xuK1x0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXHUwMDI2IFRUVV9IV1BPSVNPTikpO1xuK1xuK1x0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuK1x0bW11X25vdGlmaWVyX3JhbmdlX2luaXQoXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cdTAwM2V2bV9tbSxcbitcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4rXHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCwgXHUwMDI2cmFuZ2UuZW5kKTtcbitcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbitcbitcdC8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi9cbitcdGlmICghcGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpXG4rXHRcdGdvdG8gcmFuZ2VfZW5kO1xuK1xuK1x0Vk1fV0FSTl9PTl9PTkNFKGFkZHJlc3MgIT0gcHZtdy5hZGRyZXNzKTtcbitcbitcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFZNX1dBUk5fT05fT05DRSghcHRlX3ByZXNlbnQocHRldmFsKSk7XG4rXHRWTV9XQVJOX09OX09OQ0UocHRlX3BmbihwdGV2YWwpICE9IGZvbGlvX3Bmbihmb2xpbykpO1xuK1xuK1x0LypcbitcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS4gVGhlcmUgaXMgbm8gd2F5IG9mXG4rXHQgKiBrbm93aW5nIGV4YWN0bHkgd2hpY2ggUE1EcyBtYXkgYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0XG4rXHQgKiBmbHVzaCB0aGVtIGFsbC4gc3RhcnQvZW5kIHdlcmUgYWxyZWFkeSBhZGp1c3RlZCBhYm92ZSB0byBjb3ZlciB0aGlzXG4rXHQgKiByYW5nZS5cbitcdCAqL1xuK1x0Zmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbitcbitcdC8qXG4rXHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGUgbW9kZS5cbitcdCAqIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLlxuK1x0ICpcbitcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4gTG9jayBvcmRlciBkaWN0YXRlc1xuK1x0ICogYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRSBpX21tYXBfcndzZW0uIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kXG4rXHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbitcdCAqL1xuK1x0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4rXHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbitcbitcdFx0Vk1fV0FSTl9PTighKGZsYWdzIFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcbitcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcbitcdFx0XHRyZXQgPSBmYWxzZTtcbitcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0fVxuK1xuK1x0XHR0bGJfZ2F0aGVyX21tdV92bWEoXHUwMDI2dGxiLCB2bWEpO1xuK1x0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4rXHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4rXHRcdFx0aHVnZV9wbWRfdW5zaGFyZV9mbHVzaChcdTAwMjZ0bGIsIHZtYSk7XG4rXHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLCBjb25zZXF1ZW50bHkgdW5tYXBwaW5nXG4rXHRcdFx0ICogdGhlIGZvbGlvLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGdvdG8gd2Fsa19kb25lO1xuK1x0XHR9XG4rXHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuK1x0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuK1x0fVxuK1x0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuK1x0aWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuK1xuK1x0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KGZvbGlvX3BhZ2UoZm9saW8sIDApKSk7XG4rXHRodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTtcbitcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTtcbitcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuK1x0Zm9saW9fcHV0X3JlZnMoZm9saW8sIDEpO1xuK1xuK3dhbGtfZG9uZTpcbitcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4rcmFuZ2VfZW5kOlxuK1x0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuK3tcbitcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcbitcbitcdC8qXG4rXHQgKiBTeW5jaHJvbml6ZSB3aXRoIGd1cF9wdGVfcmFuZ2UoKTpcbitcdCAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50XG4rXHQgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEVcbitcdCAqL1xuK1x0c21wX21iKCk7XG4rXG4rXHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xuK1x0bWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pO1xuK1xuK1x0LypcbitcdCAqIE9yZGVyIHJlYWRzIGZvciBwYWdlIHJlZmNvdW50IGFuZCBkaXJ0eSBmbGFnXG4rXHQgKiAoc2VlIGNvbW1lbnRzIGluIF9fcmVtb3ZlX21hcHBpbmcoKSkuXG4rXHQgKi9cbitcdHNtcF9ybWIoKTtcbitcbitcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcbitcdFx0LypcbitcdFx0ICogcmVkaXJ0aWVkIGVpdGhlciB1c2luZyB0aGUgcGFnZSB0YWJsZSBvciBhIHByZXZpb3VzbHlcbitcdFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cbitcdFx0ICovXG4rXHRcdGZvbGlvX3NldF9zd2FwYmFja2VkKGZvbGlvKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIEFkZGl0aW9uYWwgcmVmZXJlbmNlcyBjb3VsZCBiZSBkdWUgdG8gR1VQIG9yIHNwZWN1bGF0aXZlIGxvb2t1cHMuXG4rXHQgKiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpbyBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uXG4rXHQgKiBUaGlzIGZvbGlvIGNhbm5vdCBiZSByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0XG4rXHQgKiBsaWtlIG5vdGhpbmcgaGFwcGVuZWQuIFdlJ2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlXG4rXHQgKiBmb2xpbyB3YXMgZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxuK1x0ICovXG4rXHRpZiAocmVmX2NvdW50ICE9IDEgKyBtYXBfY291bnQpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGFkZF9tbV9jb3VudGVyKHZtYS1cdTAwM2V2bV9tbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBwdGVfdCBzd3BfcHRlX3ByZXBhcmUoc3dwX2VudHJ5X3QgZW50cnksIHB0ZV90IG9sZF9wdGUsXG4rXHRcdGJvb2wgYW5vbl9leGNsdXNpdmUpXG4re1xuK1x0cHRlX3Qgc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xuK1xuK1x0aWYgKGFub25fZXhjbHVzaXZlKVxuK1x0XHRzd3BfcHRlID0gcHRlX3N3cF9ta2V4Y2x1c2l2ZShzd3BfcHRlKTtcbitcbitcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQob2xkX3B0ZSkpKSB7XG4rXHRcdGlmIChwdGVfc29mdF9kaXJ0eShvbGRfcHRlKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4rXHRcdGlmIChwdGVfdWZmZChvbGRfcHRlKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBEZXZpY2UtZXhjbHVzaXZlIGVudHJ5ICovXG4rXHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpXG4rXHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuK1x0XHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuK1x0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcbitcdH1cbitcbitcdHJldHVybiBzd3BfcHRlO1xuK31cbitcbitzdGF0aWMgYm9vbCB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuK1x0XHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKVxuK3tcbitcdGNvbnN0IGJvb2wgYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNlxuK1x0XHRcdFx0ICAgIFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuK1x0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkocGFnZSk7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcbitcdGlmIChmb2xpb19kdXBfc3dhcChmb2xpbywgcGFnZSkgXHUwMDNjIDApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdC8qXG4rXHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXG4rXHQgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNvdWxkIGhhdmUgUEZOIHN3YXAgUFRFcyxcbitcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxuK1x0ICovXG4rXHRpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSBcdTAwM2MgMCkge1xuK1x0XHRmb2xpb19wdXRfc3dhcChmb2xpbywgcGFnZSk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbitcdGlmIChhbm9uX2V4Y2x1c2l2ZSBcdTAwMjZcdTAwMjYgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHBhZ2UpKSB7XG4rXHRcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcbitcdGRlY19tbV9jb3VudGVyKG1tLCBNTV9BTk9OUEFHRVMpO1xuK1x0aW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTtcbitcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZXAsXG4rXHRcdCAgIHN3cF9wdGVfcHJlcGFyZShlbnRyeSwgcHRldmFsLCBhbm9uX2V4Y2x1c2l2ZSkpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIHR0dV9hbm9uX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCxcbitcdFx0cHRlX3QgcHRldmFsLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuK3tcbitcdC8qXG4rXHQgKiBTdG9yZSB0aGUgc3dhcCBsb2NhdGlvbiBpbiB0aGUgcHRlLlxuK1x0ICogU2VlIGhhbmRsZV9wdGVfZmF1bHQoKSAuLi5cbitcdCAqL1xuK1x0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pICE9XG4rXHRcdFx0IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGlmICghZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbitcdFx0cmV0dXJuIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHZtYSwgZm9saW8sIG5yX3BhZ2VzKTtcbitcbitcdC8qIG5yX3BhZ2VzIFx1MDAzZSAxIG5vdCBzdXBwb3J0ZWQgeWV0ICovXG4rXHRyZXR1cm4gdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLCBwdGVwLFxuK1x0XHRcdFx0XHQgcHRldmFsKTtcbit9XG4rXG4gLypcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50XG4gICovXG5AQCAtMTk4NiwxNCArMjIwMCwxMyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIHtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuIFx0REVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIGZvbGlvLCB2bWEsIGFkZHJlc3MsIDApO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSwgcmV0ID0gdHJ1ZTtcbitcdGJvb2wgcmV0ID0gdHJ1ZTtcbiBcdHB0ZV90IHB0ZXZhbDtcbi1cdHN0cnVjdCBwYWdlICpzdWJwYWdlO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuIFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDEsIGVuZF9hZGRyO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4gXHRpbnQgcHRlcyA9IDA7XG4gXG4gXHQvKlxuQEAgLTIwMDcsOCArMjIyMCw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHQvKlxuIFx0ICogRm9yIFRIUCwgd2UgaGF2ZSB0byBhc3N1bWUgdGhlIHdvcnNlIGNhc2UgaWUgcG1kIGZvciBpbnZhbGlkYXRpb24uXG4tXHQgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZFxuLVx0ICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLlxuIFx0ICpcbiBcdCAqIE5vdGUgdGhhdCB0aGUgZm9saW8gY2FuIG5vdCBiZSBmcmVlZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2ZcbiBcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZm9saW8uXG5AQCAtMjAxNiwxNyArMjIyNyw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXHUwMDI2cHZtdyk7XG4gXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuIFx0XHRcdFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcbi1cdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XG4tXHRcdC8qXG4tXHRcdCAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZFxuLVx0XHQgKiBhY2NvcmRpbmdseS5cbi1cdFx0ICovXG4tXHRcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFx1MDAyNnJhbmdlLnN0YXJ0LFxuLVx0XHRcdFx0XHRcdCAgICAgXHUwMDI2cmFuZ2UuZW5kKTtcbi1cbi1cdFx0LyogV2UgbmVlZCB0aGUgaHVnZSBwYWdlIHNpemUgZm9yIHNldF9odWdlX3B0ZV9hdCgpICovXG4tXHRcdGhzeiA9IGh1Z2VfcGFnZV9zaXplKGhzdGF0ZV92bWEodm1hKSk7XG4tXHR9XG4gXHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChcdTAwMjZyYW5nZSk7XG4gXG4gXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpIHtcbkBAIC0yMTExLDY1ICsyMzExLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7XG4gXG4gXHRcdFx0cGZuID0gc29mdGxlYWZfdG9fcGZuKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTtcbiBcdFx0fVxuIFxuLVx0XHRzdWJwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XG4tXHRcdGFub25fZXhjbHVzaXZlID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdCBQYWdlQW5vbkV4Y2x1c2l2ZShzdWJwYWdlKTtcbi1cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRib29sIGFub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBwYWdlXG4tXHRcdFx0ICogaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGh1Z2V0bGIgcGFnZSBpcyBwb2lzb25lZC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRWTV9CVUdfT05fUEFHRSghUGFnZUhXUG9pc29uKHN1YnBhZ2UpLCBzdWJwYWdlKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS5cbi1cdFx0XHQgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5XG4tXHRcdFx0ICogYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLlxuLVx0XHRcdCAqIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xuLVx0XHRcdCAqIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4rXHRcdHBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRvIGNhbGwgaHVnZV9wbWRfdW5zaGFyZSwgaV9tbWFwX3J3c2VtIG11c3QgYmVcbi1cdFx0XHQgKiBoZWxkIGluIHdyaXRlIG1vZGUuICBDYWxsZXIgbmVlZHMgdG8gZXhwbGljaXRseVxuLVx0XHRcdCAqIGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLlxuLVx0XHRcdCAqXG4tXHRcdFx0ICogV2UgYWxzbyBtdXN0IGhvbGQgaHVnZXRsYiB2bWFfbG9jayBpbiB3cml0ZSBtb2RlLlxuLVx0XHRcdCAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRVxuLVx0XHRcdCAqIGlfbW1hcF9yd3NlbS4gIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWxcbi1cdFx0XHQgKiBpZiB1bnN1Y2Nlc3NmdWwuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKCFhbm9uKSB7XG4tXHRcdFx0XHRzdHJ1Y3QgbW11X2dhdGhlciB0bGI7XG4tXG4tXHRcdFx0XHRWTV9CVUdfT04oIShmbGFncyBcdTAwMjYgVFRVX1JNQVBfTE9DS0VEKSk7XG4tXHRcdFx0XHRpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSlcbi1cdFx0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuLVxuLVx0XHRcdFx0dGxiX2dhdGhlcl9tbXVfdm1hKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdGlmIChodWdlX3BtZF91bnNoYXJlKFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcbi1cdFx0XHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4tXHRcdFx0XHRcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXHUwMDI2dGxiLCB2bWEpO1xuLVx0XHRcdFx0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuLVx0XHRcdFx0XHQvKlxuLVx0XHRcdFx0XHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCxcbi1cdFx0XHRcdFx0ICogY29uc2VxdWVudGx5IHVubWFwcGluZyB0aGUgZm9saW8uXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbi1cdFx0XHRcdH1cbi1cdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHR9XG4tXHRcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuLVx0XHRcdGlmIChwdGVfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuK1x0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4gXHRcdFx0bnJfcGFnZXMgPSBmb2xpb191bm1hcF9wdGVfYmF0Y2goZm9saW8sIFx1MDAyNnB2bXcsIGZsYWdzLCBwdGV2YWwpO1xuIFx0XHRcdGVuZF9hZGRyID0gYWRkcmVzcyArIG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIFx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xuQEAgLTIyMDQsMTYgKzIzNTAsMTEgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0LyogVXBkYXRlIGhpZ2ggd2F0ZXJtYXJrIGJlZm9yZSB3ZSBsb3dlciByc3MgKi9cbiBcdFx0dXBkYXRlX2hpd2F0ZXJfcnNzKG1tKTtcbiBcbi1cdFx0aWYgKFBhZ2VIV1BvaXNvbihzdWJwYWdlKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBUVFVfSFdQT0lTT04pKSB7XG4tXHRcdFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XG4tXHRcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsXG4tXHRcdFx0XHRcdFx0aHN6KTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdH1cbitcdFx0LyogV2l0aCBUVFVfSFdQT0lTT04sIHdlIG9ubHkgZXhwZWN0IHNtYWxsIGZvbGlvcyBoZXJlLiAqL1xuK1x0XHRpZiAoZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbykgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xuK1x0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShwYWdlKSk7XG4rXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbitcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiBcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuIFx0XHRcdC8qXG5AQCAtMjIyOCwxMDQgKzIzNjksMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKi9cbiBcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuIFx0XHR9IGVsc2UgaWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbi1cdFx0XHRzd3BfZW50cnlfdCBlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShzdWJwYWdlKTtcbi1cdFx0XHRwdGVfdCBzd3BfcHRlO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogU3RvcmUgdGhlIHN3YXAgbG9jYXRpb24gaW4gdGhlIHB0ZS5cbi1cdFx0XHQgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pICE9XG4tXHRcdFx0XHRcdGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkpIHtcbi1cdFx0XHRcdFdBUk5fT05fT05DRSgxKTtcbi1cdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHR9XG4tXG4tXHRcdFx0LyogTUFEVl9GUkVFIHBhZ2UgY2hlY2sgKi9cbi1cdFx0XHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcbi1cdFx0XHRcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcbi1cbi1cdFx0XHRcdC8qXG4tXHRcdFx0XHQgKiBTeW5jaHJvbml6ZSB3aXRoIGd1cF9wdGVfcmFuZ2UoKTpcbi1cdFx0XHRcdCAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50XG4tXHRcdFx0XHQgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEVcbi1cdFx0XHRcdCAqL1xuLVx0XHRcdFx0c21wX21iKCk7XG4tXG4tXHRcdFx0XHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xuLVx0XHRcdFx0bWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pO1xuLVxuLVx0XHRcdFx0Lypcbi1cdFx0XHRcdCAqIE9yZGVyIHJlYWRzIGZvciBwYWdlIHJlZmNvdW50IGFuZCBkaXJ0eSBmbGFnXG4tXHRcdFx0XHQgKiAoc2VlIGNvbW1lbnRzIGluIF9fcmVtb3ZlX21hcHBpbmcoKSkuXG4tXHRcdFx0XHQgKi9cbi1cdFx0XHRcdHNtcF9ybWIoKTtcbi1cbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogcmVkaXJ0aWVkIGVpdGhlciB1c2luZyB0aGUgcGFnZSB0YWJsZSBvciBhIHByZXZpb3VzbHlcbi1cdFx0XHRcdFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cbi1cdFx0XHRcdFx0ICovXG4tXHRcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4tXHRcdFx0XHRcdGZvbGlvX3NldF9zd2FwYmFja2VkKGZvbGlvKTtcbi1cdFx0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuLVx0XHRcdFx0fSBlbHNlIGlmIChyZWZfY291bnQgIT0gMSArIG1hcF9jb3VudCkge1xuLVx0XHRcdFx0XHQvKlxuLVx0XHRcdFx0XHQgKiBBZGRpdGlvbmFsIHJlZmVyZW5jZS4gQ291bGQgYmUgYSBHVVAgcmVmZXJlbmNlIG9yIGFueVxuLVx0XHRcdFx0XHQgKiBzcGVjdWxhdGl2ZSByZWZlcmVuY2UuIEdVUCB1c2VycyBtdXN0IG1hcmsgdGhlIGZvbGlvXG4tXHRcdFx0XHRcdCAqIGRpcnR5IGlmIHRoZXJlIHdhcyBhIG1vZGlmaWNhdGlvbi4gVGhpcyBmb2xpbyBjYW5ub3QgYmVcbi1cdFx0XHRcdFx0ICogcmVjbGFpbWVkIHJpZ2h0IG5vdyBlaXRoZXIgd2F5LCBzbyBhY3QganVzdCBsaWtlIG5vdGhpbmdcbi1cdFx0XHRcdFx0ICogaGFwcGVuZWQuXG4tXHRcdFx0XHRcdCAqIFdlJ2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlIGZvbGlvIHdhc1xuLVx0XHRcdFx0XHQgKiBkaXJ0aWVkIHdoZW4gdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGlzIGdvbmUuXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuLVx0XHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuLVx0XHRcdFx0Z290byBkaXNjYXJkO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHN1YnBhZ2UpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbitcdFx0XHRpZiAoIXR0dV9hbm9uX2ZvbGlvKHZtYSwgZm9saW8sIHBhZ2UsIGFkZHJlc3MsXG4rXHRcdFx0XHRcdCAgICBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcykpIHtcbitcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4gXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4gXHRcdFx0fVxuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvblxuLVx0XHRcdCAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLFxuLVx0XHRcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHR9XG4tXG4tXHRcdFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuLVx0XHRcdGlmIChhbm9uX2V4Y2x1c2l2ZSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHN1YnBhZ2UpKSB7XG4tXHRcdFx0XHRmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHR9XG4tXHRcdFx0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcbi1cdFx0XHRkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTtcbi1cdFx0XHRpbmNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpO1xuLVx0XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbi1cdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUpXG4tXHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta2V4Y2x1c2l2ZShzd3BfcHRlKTtcbi1cdFx0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4tXHRcdFx0XHRpZiAocHRlX3NvZnRfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuLVx0XHRcdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0aWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4tXHRcdFx0XHRpZiAocHRlX3N3cF91ZmZkKHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcbi1cdFx0XHR9XG4tXHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUpO1xuK1x0XHRcdGdvdG8gZmluaXNoX3VubWFwO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogVGhpcyBpcyBhIGxvY2tlZCBmaWxlLWJhY2tlZCBmb2xpbyxcbkBAIC0yMzQwLDEyICsyMzkwLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKi9cbiBcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLW5yX3BhZ2VzKTtcbiBcdFx0fVxuLWRpc2NhcmQ6XG4tXHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSkge1xuLVx0XHRcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuLVx0XHR9XG4rZmluaXNoX3VubWFwOlxuK1x0XHRmb2xpb19yZW1vdmVfcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgdm1hKTtcbiBcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxuIFx0XHRcdG1sb2NrX2RyYWluX2xvY2FsKCk7XG4gXHRcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCBucl9wYWdlcyk7XG5AQCAtMjM5Myw3ICsyNDM5LDggQEAgc3RhdGljIGludCBmb2xpb19ub3RfbWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSxcbitcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSA/XG4rXHRcdFx0XHR0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLFxuIFx0XHQuYXJnID0gKHZvaWQgKilmbGFncyxcbiBcdFx0LmRvbmUgPSBmb2xpb19ub3RfbWFwcGVkLFxuIFx0XHQuYW5vbl9sb2NrID0gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkLFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NDcuMjM3NTg5NTIzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjE4ODE0OTY1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgYHJtYXAuY2AgUmVmYWN0b3JpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQncyByZWZhY3RvcmluZyBgdHJ5X3RvX3VubWFwX29uZWAgaW4gYG1tL3JtYXAuY2AuIFRoaXMgaXMgYSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFyZWEsIHNvIG5hdHVyYWxseSwgSSBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24uIEl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZSBpcyBhaW1lZCBhdCBiZXR0ZXIgb3JnYW5pemF0aW9uLCBzcGVjaWZpY2FsbHkgZXh0cmFjdGluZyB0aGUgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBsb2dpYyBpbnRvIGRlZGljYXRlZCBmdW5jdGlvbnM6IGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGFuZCB2YXJpb3VzIGB0dHVfYW5vbl9mb2xpb2AgdmFyaWFudHMgaW5jbHVkaW5nIGB0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb2AgYW5kIGB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvYCwgYWxvbmdzaWRlIGBzd3BfcHRlX3ByZXBhcmVgLlxuXG5GdW5jdGlvbmFsbHksIHRoaXMgc2VlbXMgc291bmQuIFJlZmFjdG9yaW5nIGxpa2UgdGhpcyBvZnRlbiBpbXByb3ZlcyByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LCB3aGljaCBpcyBhbHdheXMgYSBnb29kIHNpZ24gaW4gYSBjb21wbGV4IGFyZWEgbGlrZSB0aGUga2VybmVsJ3MgbWVtb3J5IG1hbmFnZW1lbnQuIEdpdmVuIHRoYXQgaXQncyB0b3VjaGluZyB0aGUgcm1hcCBjb2RlLCBJJ2Qgc2F5IHRoaXMgaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgbmVlZCB0byBmdXp6IHRob3JvdWdobHkgdG8gZW5zdXJlIG5vIHJlZ3Jlc3Npb25zLlxuXG5Ob3csIGxldCdzIGRyaWxsIGRvd24gaW50byB0aGUgc3BlY2lmaWNzLiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCBpcyBjYWxsZWQgd2hlbiBgZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKWAgcmV0dXJucyB0cnVlLCB3aGljaCBtYWtlcyBzZW5zZS4gYHRyeV90b191bm1hcF9vbmVgIGhhbmRsZXMgdGhlIG5vbi1odWdldGxiIGNhc2VzLiBUaGF0J3MgYSBjbGVhbiBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLlxuXG5OZXh0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIGBtbS9ybWFwLmNgIGl0c2VsZiBpcyBvbmx5IGNvbXBpbGVkIHdpdGggYENPTkZJR19NTVVgLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIFRoZSBodWdldGxiLXNwZWNpZmljIGxvZ2ljLCBhcyBleHBlY3RlZCwgaXMgZ2F0ZWQgYnkgYENPTkZJR19IVUdFVExCX1BBR0VgLiBBbmQgbG9va2luZyBhdCB0aGUgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZywgaXQgc2VlbXMgdGhhdCBzd2FwIHN1cHBvcnQgKGBDT05GSUdfU1dBUGApIGlzIGNydWNpYWwsIHNwZWNpZmljYWxseSBmb3IgdGhlIHN3YXBiYWNrZWQgZm9saW8gY2FzZXMuXG5cbkZpbmFsbHksIEknbGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIHRvIGRvdWJsZS1jaGVjayBhbGwgY2FsbHMgdG8gYHRyeV90b191bm1hcGAgYW5kIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIHRvIGVuc3VyZSBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgYWxsIHRvdWNocG9pbnRzLiBUaGlzIHdpbGwgaGVscCB3aXRoIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjcxLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjcwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NTMuNDI1NzQxMDM5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMwMTUwNTcyMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnlfdG9fdW5tYXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vcm1hcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3JtYXAuYz02MzM9c3RydWN0IGFub25fdm1hICpmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4tLVxcbm1tL3JtYXAuYy03MTAtICovXFxubW0vcm1hcC5jOjcxMTp2b2lkIHRyeV90b191bm1hcF9mbHVzaCh2b2lkKVxcbm1tL3JtYXAuYy03MTIte1xcbi0tXFxubW0vcm1hcC5jLTcyMy0vKiBGbHVzaCBpZmYgdGhlcmUgYXJlIHBvdGVudGlhbGx5IHdyaXRhYmxlIFRMQiBlbnRyaWVzIHRoYXQgY2FuIHJhY2Ugd2l0aCBJTyAqL1xcbm1tL3JtYXAuYzo3MjQ6dm9pZCB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkodm9pZClcXG5tbS9ybWFwLmMtNzI1LXtcXG4tLVxcbm1tL3JtYXAuYy03MjgtXFx0aWYgKHRsYl91YmMtXFx1MDAzZXdyaXRhYmxlKVxcbm1tL3JtYXAuYzo3Mjk6XFx0XFx0dHJ5X3RvX3VubWFwX2ZsdXNoKCk7XFxubW0vcm1hcC5jLTczMC19XFxuLS1cXG5tbS9ybWFwLmM9NzQyPXN0YXRpYyB2b2lkIHNldF90bGJfdWJjX2ZsdXNoX3BlbmRpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL3JtYXAuYy03NzUtXFx0ICogSWYgdGhlIFBURSB3YXMgZGlydHkgdGhlbiBpdCdzIGJlc3QgdG8gYXNzdW1lIGl0J3Mgd3JpdGFibGUuIFRoZVxcbm1tL3JtYXAuYzo3NzY6XFx0ICogY2FsbGVyIG11c3QgdXNlIHRyeV90b191bm1hcF9mbHVzaF9kaXJ0eSgpIG9yIHRyeV90b191bm1hcF9mbHVzaCgpXFxubW0vcm1hcC5jLTc3Ny1cXHQgKiBiZWZvcmUgdGhlIHBhZ2UgaXMgcXVldWVkIGZvciBJTy5cXG4tLVxcbm1tL3JtYXAuYz0xOTQ0PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX3VubWFwX3B0ZV9iYXRjaChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbi0tXFxubW0vcm1hcC5jLTE5ODAtXFxubW0vcm1hcC5jOjE5ODE6c3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0vcm1hcC5jLTE5ODItXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxcbi0tXFxubW0vcm1hcC5jLTE5OTItXFx0LypcXG5tbS9ybWFwLmM6MTk5MzpcXHQgKiBUaGUgdHJ5X3RvX3VubWFwKCkgaXMgb25seSBwYXNzZWQgYSBodWdldGxiIGZvbGlvIGluIHRoZSBjYXNlXFxubW0vcm1hcC5jLTE5OTQtXFx0ICogd2hlcmUgdGhlIGh1Z2V0bGIgZm9saW8gaXMgcG9pc29uZWQuXFxuLS1cXG5tbS9ybWFwLmM9MjE3NT1zdGF0aWMgYm9vbCB0dHVfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4tLVxcbm1tL3JtYXAuYy0yMTk3LSAqL1xcbm1tL3JtYXAuYzoyMTk4OnN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vcm1hcC5jLTIxOTktXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG4tLVxcbm1tL3JtYXAuYy0yMjE0LVxcdCAqIGluIGJldHdlZW4gaXRzIHB0ZXBfZ2V0X2FuZF9jbGVhcl9mdWxsKCkgYW5kIGZvbGlvX3JlbW92ZV9ybWFwXyooKSxcXG5tbS9ybWFwLmM6MjIxNTpcXHQgKiB0cnlfdG9fdW5tYXAoKSBtYXkgcmV0dXJuIGJlZm9yZSBmb2xpb19tYXBwZWQoKSBoYXMgYmVjb21lIGZhbHNlLFxcbm1tL3JtYXAuYy0yMjE2LVxcdCAqIGlmIHBhZ2UgdGFibGUgbG9ja2luZyBpcyBza2lwcGVkOiB1c2UgVFRVX1NZTkMgdG8gd2FpdCBmb3IgdGhhdC5cXG4tLVxcbm1tL3JtYXAuYy0yMjI0LVxcdCAqIE5vdGUgdGhhdCB0aGUgZm9saW8gY2FuIG5vdCBiZSBmcmVlZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2ZcXG5tbS9ybWFwLmM6MjIyNTpcXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGZvbGlvLlxcbm1tL3JtYXAuYy0yMjI2LVxcdCAqL1xcbi0tXFxubW0vcm1hcC5jPTI0MjM9c3RhdGljIGludCBmb2xpb19ub3RfbWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS9ybWFwLmMtMjQyOC0vKipcXG5tbS9ybWFwLmM6MjQyOTogKiB0cnlfdG9fdW5tYXAgLSBUcnkgdG8gcmVtb3ZlIGFsbCBwYWdlIHRhYmxlIG1hcHBpbmdzIHRvIGEgZm9saW8uXFxubW0vcm1hcC5jLTI0MzAtICogQGZvbGlvOiBUaGUgZm9saW8gdG8gdW5tYXAuXFxuLS1cXG5tbS9ybWFwLmMtMjQzOC0gKi9cXG5tbS9ybWFwLmM6MjQzOTp2b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG5tbS9ybWFwLmMtMjQ0MC17XFxuLS1cXG5tbS9ybWFwLmMtMjQ0Mi1cXHRcXHQucm1hcF9vbmUgPSBmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pID9cXG5tbS9ybWFwLmM6MjQ0MzpcXHRcXHRcXHRcXHR0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLFxcbm1tL3JtYXAuYy0yNDQ0LVxcdFxcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxcbi0tXFxubW0vcm1hcC5jPTI0NjE9c3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vcm1hcC5jLTI0ODgtXFx0ICogTm90ZSB0aGF0IHRoZSBwYWdlIGNhbiBub3QgYmUgZnJlZSBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2ZcXG5tbS9ybWFwLmM6MjQ4OTpcXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIHBhZ2UuXFxubW0vcm1hcC5jLTI0OTAtXFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEzVDA1OjI2OjUzLjcyNzI1NTM1MVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYxNjkzMTU1MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBSZWZhY3RvcioqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgY2xlYXJseSBtYWtpbmcgc29tZSBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIGhvdyB3ZSBoYW5kbGUgbWVtb3J5IHVubWFwcGluZywgc3BlY2lmaWNhbGx5IGJ5IGludHJvZHVjaW5nIGEgc3VpdGUgb2YgbmV3IGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSB3ZSdyZSByZWZhY3RvcmluZyBgdHJ5X3RvX3VubWFwX29uZWAgYW5kIGFkZGluZyBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHN3cF9wdGVfcHJlcGFyZWAsIGB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvYCwgYW5kIGB0dHVfYW5vbl9mb2xpb2AuIFRoZXNlIGFyZSBkZWZpbml0ZWx5IGNvcmUgZnVuY3Rpb25zLCB0b3VjaGluZyBvbiBob3cgd2UgZGVhbCB3aXRoIGh1Z2V0bGJmcyBhbmQgc3dhcHBlZCBtZW1vcnkuXG5cblRoZSBrZXkgY29uZmlncyB0byBlbmFibGUgdGhlc2UgY2hhbmdlcyBhcmUgYEhVR0VUTEJfUEFHRWAgYW5kIGBTV0FQYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWVzLiBJIHNob3VsZCBmb2N1cyBvbiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYCBhcyB0aGUgcHJpbWFyeSBzeW1ib2xzIG9mIGludGVyZXN0LCBidXQgSSBhbHNvIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBgdHJ5X3RvX3VubWFwX29uZWAgaXMgYmVpbmcgbW9kaWZpZWQgYXMgd2VsbC5cblxuTm93LCBiZWZvcmUgSSBkaWcgZGVlcGVyLCBsZXQncyBqdXN0IG1ha2Ugc3VyZSB0aGVyZSBhcmVuJ3QgYW55IG90aGVyIGNydWNpYWwgY29uZmlncyB0byBiZSBhd2FyZSBvZi4gYEhVR0VUTEJfUEFHRWAgY292ZXJzIHRoZSBodWdldGxiIHVubWFwcGluZywgYW5kIGBTV0FQYCwgb2YgY291cnNlLCBjb3ZlcnMgdGhlIHN3YXAtYmFja2VkIGZvbGlvcy4gYE1NVWAgaXMgYSBnaXZlbiwgZ2l2ZW4gdGhhdCB3ZSBhcmUgd29ya2luZyBpbiBgbW0vcm1hcC5jYC5cblxuQWhhISBJdCBsb29rcyBsaWtlIGBIV1BPSVNPTl9JTkpFQ1RgIG9yIGBNRU1PUllfRkFJTFVSRWAgbWlnaHQgYmUgcmVsZXZhbnQgaGVyZS4gVGhlIGNvbW1lbnQgaW4gdGhlIGNvZGUgc3VnZ2VzdHMgdGhhdCBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCBpcyBvbmx5IGNhbGxlZCB3aGVuIHdlIGhhdmUgYGZsYWdzIFx1MDAyNiBUVFVfSFdQT0lTT05gLiBMZXQncyBjb25maXJtIHRoYXQgYnkgY2hlY2tpbmcgdGhlIHNvdXJjZSBjb2RlIG9mIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgOlxuYGBgY1xuXHQvKlxuXHQgKiBUaGUgdHJ5X3RvX3VubWFwKCkgaXMgb25seSBwYXNzZWQgYSBodWdldGxiIGZvbGlvIGluIHRoZSBjYXNlXG5cdCAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLlxuXHQgKi9cblx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbyksIGZvbGlvKTtcblx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXHUwMDI2IFRUVV9IV1BPSVNPTikpO1xuYGBgXG5ZdXAsIGNvbmZpcm1lZC4gSXQgbG9va3MgbGlrZSBgTUVNT1JZX0ZBSUxVUkVgIGlzIGluZGVlZCBhIHByZXJlcXVpc2l0ZSBzaW5jZSB0aGF0IHRyaWdnZXJzIHRoZSBgSFdQT0lTT05gIGZsYWcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMTgxLCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEzVDA1OjI2OjU5Ljg5NjU3MzE2OVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDc0MDg0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJNRU1PUllfRkFJTFVSRVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9NzQ3PWNvbmZpZyBERUZBVUxUX01NQVBfTUlOX0FERFJcXG4tLVxcbm1tL0tjb25maWctNzY1LVxcbm1tL0tjb25maWc6NzY2OmNvbmZpZyBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFXFxubW0vS2NvbmZpZy03NjctXFx0Ym9vbFxcbm1tL0tjb25maWctNzY4LVxcbm1tL0tjb25maWc6NzY5OmNvbmZpZyBNRU1PUllfRkFJTFVSRVxcbm1tL0tjb25maWctNzcwLVxcdGRlcGVuZHMgb24gTU1VXFxubW0vS2NvbmZpZzo3NzE6XFx0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFXFxubW0vS2NvbmZpZy03NzItXFx0Ym9vbCBcXFwiRW5hYmxlIHJlY292ZXJ5IGZyb20gaGFyZHdhcmUgbWVtb3J5IGVycm9yc1xcXCJcXG4tLVxcbm1tL0tjb25maWc9NzgwPWNvbmZpZyBIV1BPSVNPTl9JTkpFQ1RcXG5tbS9LY29uZmlnLTc4MS1cXHR0cmlzdGF0ZSBcXFwiSFdQb2lzb24gcGFnZXMgaW5qZWN0b3JcXFwiXFxubW0vS2NvbmZpZzo3ODI6XFx0ZGVwZW5kcyBvbiBNRU1PUllfRkFJTFVSRSBcXHUwMDI2XFx1MDAyNiBERUJVR19LRVJORUwgXFx1MDAyNlxcdTAwMjYgUFJPQ19GU1xcbm1tL0tjb25maWctNzgzLVxcdHNlbGVjdCBQUk9DX1BBR0VfTU9OSVRPUlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xM1QwNToyNjo1OS45NTEzMTg2MzZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NjgzNDA5ODc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IFJlYXNvbmluZyBmb3IgU2VsZWN0aW5nIFJlbGV2YW50IFN5bWJvbHMqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIG1vc3QgcmVsZXZhbnQgaGVyZS4gYE1FTU9SWV9GQUlMVVJFYCwgYEhXUE9JU09OX0lOSkVDVGAsIGBIVUdFVExCX1BBR0VgLCBhbmQgYFNXQVBgIGFsbCBzZWVtIGxpa2UgZ29vZCBjaG9pY2VzIHRvIGVuYWJsZSBmb3IgdGVzdGluZy4gTm93LCBsZXQncyBkcmlsbCBkb3duIHRvIHRoZSBmdW5jdGlvbnMgdGhlbXNlbHZlcy5cblxuSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSBzeW1ib2xzIHRoYXQgYXJlIGltcGFjdGVkIGJ5IHRoaXMgcGF0Y2guIEkgc2VlIHRoYXQgYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgaXMgYSBrZXkgZnVuY3Rpb247IEkganVzdCBjaGVja2VkLCBhbmQgaXQgKmlzKiBzdGF0aWMuIFRoZSByZWxhdGVkIGZ1bmN0aW9ucyBgdHR1X2Fub25fbGF6eWZyZWVfZm9saW9gLCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2AsIGB0dHVfYW5vbl9mb2xpb2AsIGFuZCBhbHNvIGB0cnlfdG9fdW5tYXBfb25lYCBhcmUgYWxsIHJlbGF0ZWQgdG8gdGhpcyBuZXcgYXJjaGl0ZWN0dXJlLlxuXG5XYWl0IGEgc2Vjb25kLCBgdHJ5X3RvX3VubWFwX29uZWAgaXMgcHJvYmFibHkgYSB2ZXJ5IGhvdCBwYXRoOyB0aGF0J3MgdG9vIGdlbmVyaWMgYW5kIHdvdWxkIHNrZXcgdGhlIHRlc3QgcmVzdWx0cy4gTGV0J3Mgc2VlLi4uIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGlzbid0IHNvIGhvdCwgd2hpY2ggaXMgZ29vZC4gSG93ZXZlciwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYCBzdGlsbCBtaWdodCBiZSBwcmV0dHkgaG90LCBidXQgaXQncyBpbXBvcnRhbnQgdG8gY29uc2lkZXIgdGhlbS4gQWgsIG5vdywgYHR0dV9hbm9uX2ZvbGlvYCBpcyBjYWxsZWQgZm9yICpldmVyeSogYW5vbnltb3VzIHBhZ2UgdW5tYXAuIFRoYXQncyAqdmVyeSogaG90LiBJIHNob3VsZCBhdm9pZCBpdC4gSG1tLCBtYXliZSBqdXN0IGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGFuZCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2A/IFdlbGwsIHRoZSBsYXp5ZnJlZSBvbmUgYW5kIHRoZSBzd2FwYmFja2VkIG9uZSBhcmUgdGhlIGtleS5cblxuQW5kLCBqdXN0IHRvIGJlIHN1cmUsIEknbGwgY29uZmlybSB0aGF0IGB0dHVfYW5vbl9mb2xpb2AgaXMgc3RhdGljOyB5ZXMsIGl0IGlzLlxuXG5UaGUgY29uZmlncyBJJ20gY29uc2lkZXJpbmcgYXJlOlxuXG4qICAgYEhVR0VUTEJfUEFHRWBcbiogICBgTUVNT1JZX0ZBSUxVUkVgXG4qICAgYEhXUE9JU09OX0lOSkVDVGBcbiogICBgU1dBUGBcblxuVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIGBtbS9ybWFwLmNgIHJlbGF0ZWQgdG8gZm9saW8gdW5tYXBwaW5nLCB3aXRoIGEgZm9jdXMgb24gaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvcy4gVGhpcyBtZWFucyBpdCBhZmZlY3RzIGNvZGUgdGhhdCdzIHVzZWQgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwIG9wZXJhdGlvbnMsIGFuZCBoYXJkd2FyZSBwb2lzb24gaGFuZGxpbmcuIFRoZXJlZm9yZSwgSSB3aWxsIHVzZSBgc2V0LXJlc3VsdHNgIHRvIHJlY29yZCB0aGlzIGNob2ljZSBvZiBzeW1ib2xzIGFuZCBjb25maWdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTM2MSwiT3V0cHV0VG9rZW5zIjoxNTEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6Mjc6MDcuNjM0NzMwNjgyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3ODIzMDU1NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJNRU1PUllfRkFJTFVSRVwiLFxuICAgIFwiSFdQT0lTT05fSU5KRUNUXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJ0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS9ybWFwLmMgZm9yIHVubWFwcGluZyBmb2xpb3MsIGV4dHJhY3RpbmcgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gVGhpcyBtb2RpZmllcyBmdW5jdGlvbmFsIGNvZGUgcmVhY2hhYmxlIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCwgYW5kIGhhcmR3YXJlIHBvaXNvbiBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJIVUdFVExCX1BBR0VcIixcbiAgICBcIk1FTU9SWV9GQUlMVVJFXCIsXG4gICAgXCJIV1BPSVNPTl9JTkpFQ1RcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVcIixcbiAgICBcInR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvXCIsXG4gICAgXCJ0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvXCIsXG4gICAgXCJ0dHVfYW5vbl9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3JtYXAuYyBmb3IgdW5tYXBwaW5nIGZvbGlvcywgZXh0cmFjdGluZyBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLiBUaGlzIG1vZGlmaWVzIGZ1bmN0aW9uYWwgY29kZSByZWFjaGFibGUgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowv4t2x[0].run-triage(0) Phase: Succeeded StartedAt: 2026-07-13 05:13:05 +0000 UTC FinishedAt: 2026-07-13 05:27:09 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "cd62f71468f0fc070761f18826d870d4afccac6f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HUGETLB_PAGE", "MEMORY_FAILURE", "HWPOISON_INJECT", "SWAP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "cd62f71468f0fc070761f18826d870d4afccac6f", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "HUGETLB_PAGE", "MEMORY_FAILURE", "HWPOISON_INJECT", "SWAP" ], "series_id": "8d0ad669-9b89-475f-80ad-e5e92bf01074" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "try_to_unmap_hugetlb_one", "ttu_anon_lazyfree_folio", "ttu_anon_swapbacked_folio", "ttu_anon_folio" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEzIDA1OjI2PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7LAogICAgJiMzNDtNRU1PUllfRkFJTFVSRSYjMzQ7LAogICAgJiMzNDtIV1BPSVNPTl9JTkpFQ1QmIzM0OywKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RyeV90b191bm1hcF9odWdldGxiX29uZSYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpbyYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3JtYXAuYyBmb3IgdW5tYXBwaW5nIGZvbGlvcywgZXh0cmFjdGluZyBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLiBUaGlzIG1vZGlmaWVzIGZ1bmN0aW9uYWwgY29kZSByZWFjaGFibGUgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEzIDA1OjI2PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgNDYwZmM1OGJkODBjNWU2OGEwODJhZWQzMzViZmVkYTBmNmI2ODgyOFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gSnVsIDEzIDA1OjI2OjQ1IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmhcbmluZGV4IDQxMTUwNzZlNDkyMmFlLi5iZjdlMTYzZTM3NzlkOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaFxuQEAgLTEyNzEsNiAmIzQzOzEyNzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaHVnZXRsYl9jb3VudF9zdWIobG9uZyBsLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB9XG4gXG4gcHRlX3QgaHVnZV9wdGVwX2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7XG4mIzQzO3Vuc2lnbmVkIGxvbmcgaHVnZV9wdGVfZGlydHkocHRlX3QgcHRlKTtcbiBcbiBzdGF0aWMgaW5saW5lIHB0ZV90IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKVxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xuaW5kZXggMjYxNjZhNmI4Y2I5YjEuLmZlNjdjZTZjZWI1ZWIzIDEwMDY0NFxuLS0tIGEvbW0vcm1hcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9ybWFwLmNcbkBAIC0xOTc4LDYgJiM0MzsxOTc4LDIyMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmb2xpb191bm1hcF9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbyxcbiBcdFx0XHRcdCAgICAgRlBCX1JFU1BFQ1RfV1JJVEUgfCBGUEJfUkVTUEVDVF9TT0ZUX0RJUlRZKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyBib29sIHRyeV90b191bm1hcF9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxuJiM0Mzt7XG4mIzQzO1x0REVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIGZvbGlvLCB2bWEsIGFkZHJlc3MsIDApO1xuJiM0MztcdGNvbnN0IHVuc2lnbmVkIGxvbmcgaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbiYjNDM7XHRjb25zdCBlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcbiYjNDM7XHRib29sIHJldCA9IHRydWU7XG4mIzQzO1x0cHRlX3QgcHRldmFsO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2VcbiYjNDM7XHQgKiB3aGVyZSB0aGUgaHVnZXRsYiBmb2xpbyBpcyBwb2lzb25lZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRSghKGZsYWdzIFx1MDAyNiBUVFVfSFdQT0lTT04pKTtcbiYjNDM7XG4mIzQzO1x0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuJiM0MztcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFx1MDAyNnJhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtXHUwMDNldm1fbW0sXG4mIzQzO1x0XHRcdFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcbiYjNDM7XHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCwgXHUwMDI2cmFuZ2UuZW5kKTtcbiYjNDM7XHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChcdTAwMjZyYW5nZSk7XG4mIzQzO1xuJiM0MztcdC8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi9cbiYjNDM7XHRpZiAoIXBhZ2Vfdm1hX21hcHBlZF93YWxrKFx1MDAyNnB2bXcpKVxuJiM0MztcdFx0Z290byByYW5nZV9lbmQ7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRShhZGRyZXNzICE9IHB2bXcuYWRkcmVzcyk7XG4mIzQzO1xuJiM0MztcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRWTV9XQVJOX09OX09OQ0UoIXB0ZV9wcmVzZW50KHB0ZXZhbCkpO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRShwdGVfcGZuKHB0ZXZhbCkgIT0gZm9saW9fcGZuKGZvbGlvKSk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBubyB3YXkgb2ZcbiYjNDM7XHQgKiBrbm93aW5nIGV4YWN0bHkgd2hpY2ggUE1EcyBtYXkgYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0XG4mIzQzO1x0ICogZmx1c2ggdGhlbSBhbGwuIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xuJiM0MztcdCAqIHJhbmdlLlxuJiM0MztcdCAqL1xuJiM0MztcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZSBoZWxkIGluIHdyaXRlIG1vZGUuXG4mIzQzO1x0ICogQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXG4mIzQzO1x0ICpcbiYjNDM7XHQgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuIExvY2sgb3JkZXIgZGljdGF0ZXNcbiYjNDM7XHQgKiBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS4gV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcbiYjNDM7XHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbiYjNDM7XHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbiYjNDM7XG4mIzQzO1x0XHRWTV9XQVJOX09OKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuJiM0MztcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcbiYjNDM7XHRcdFx0cmV0ID0gZmFsc2U7XG4mIzQzO1x0XHRcdGdvdG8gd2Fsa19kb25lO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdHRsYl9nYXRoZXJfbW11X3ZtYShcdTAwMjZ0bGIsIHZtYSk7XG4mIzQzO1x0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4mIzQzO1x0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuJiM0MztcdFx0XHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFx1MDAyNnRsYiwgdm1hKTtcbiYjNDM7XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbiYjNDM7XHRcdFx0LypcbiYjNDM7XHRcdFx0ICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsIGNvbnNlcXVlbnRseSB1bm1hcHBpbmdcbiYjNDM7XHRcdFx0ICogdGhlIGZvbGlvLlxuJiM0MztcdFx0XHQgKi9cbiYjNDM7XHRcdFx0Z290byB3YWxrX2RvbmU7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbiYjNDM7XHRcdHRsYl9maW5pc2hfbW11KFx1MDAyNnRsYik7XG4mIzQzO1x0fVxuJiM0MztcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbiYjNDM7XHRpZiAoaHVnZV9wdGVfZGlydHkocHRldmFsKSlcbiYjNDM7XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuJiM0MztcbiYjNDM7XHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkoZm9saW9fcGFnZShmb2xpbywgMCkpKTtcbiYjNDM7XHRodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTtcbiYjNDM7XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIGhzeik7XG4mIzQzO1x0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XG4mIzQzO1x0Zm9saW9fcHV0X3JlZnMoZm9saW8sIDEpO1xuJiM0MztcbiYjNDM7d2Fsa19kb25lOlxuJiM0MztcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4mIzQzO3JhbmdlX2VuZDpcbiYjNDM7XHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQoXHUwMDI2cmFuZ2UpO1xuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBTeW5jaHJvbml6ZSB3aXRoIGd1cF9wdGVfcmFuZ2UoKTpcbiYjNDM7XHQgKiAtIGNsZWFyIFBURTsgYmFycmllcjsgcmVhZCByZWZjb3VudFxuJiM0MztcdCAqIC0gaW5jIHJlZmNvdW50OyBiYXJyaWVyOyByZWFkIFBURVxuJiM0MztcdCAqL1xuJiM0MztcdHNtcF9tYigpO1xuJiM0MztcbiYjNDM7XHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xuJiM0MztcdG1hcF9jb3VudCA9IGZvbGlvX21hcGNvdW50KGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZ1xuJiM0MztcdCAqIChzZWUgY29tbWVudHMgaW4gX19yZW1vdmVfbWFwcGluZygpKS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzbXBfcm1iKCk7XG4mIzQzO1xuJiM0MztcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiByZWRpcnRpZWQgZWl0aGVyIHVzaW5nIHRoZSBwYWdlIHRhYmxlIG9yIGEgcHJldmlvdXNseVxuJiM0MztcdFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0Zm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBBZGRpdGlvbmFsIHJlZmVyZW5jZXMgY291bGQgYmUgZHVlIHRvIEdVUCBvciBzcGVjdWxhdGl2ZSBsb29rdXBzLlxuJiM0MztcdCAqIEdVUCB1c2VycyBtdXN0IG1hcmsgdGhlIGZvbGlvIGRpcnR5IGlmIHRoZXJlIHdhcyBhIG1vZGlmaWNhdGlvbi5cbiYjNDM7XHQgKiBUaGlzIGZvbGlvIGNhbm5vdCBiZSByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0XG4mIzQzO1x0ICogbGlrZSBub3RoaW5nIGhhcHBlbmVkLiBXZSYjMzk7bGwgY29tZSBiYWNrIGhlcmUgbGF0ZXIgYW5kIGRldGVjdCBpZiB0aGVcbiYjNDM7XHQgKiBmb2xpbyB3YXMgZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChyZWZfY291bnQgIT0gMSAmIzQzOyBtYXBfY291bnQpXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdGFkZF9tbV9jb3VudGVyKHZtYS1cdTAwM2V2bV9tbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgcHRlX3Qgc3dwX3B0ZV9wcmVwYXJlKHN3cF9lbnRyeV90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLFxuJiM0MztcdFx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSlcbiYjNDM7e1xuJiM0MztcdHB0ZV90IHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbiYjNDM7XG4mIzQzO1x0aWYgKGFub25fZXhjbHVzaXZlKVxuJiM0MztcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7XG4mIzQzO1xuJiM0MztcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQob2xkX3B0ZSkpKSB7XG4mIzQzO1x0XHRpZiAocHRlX3NvZnRfZGlydHkob2xkX3B0ZSkpXG4mIzQzO1x0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbiYjNDM7XHRcdGlmIChwdGVfdWZmZChvbGRfcHRlKSlcbiYjNDM7XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHQvKiBEZXZpY2UtZXhjbHVzaXZlIGVudHJ5ICovXG4mIzQzO1x0XHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KG9sZF9wdGUpKVxuJiM0MztcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4mIzQzO1x0XHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuJiM0MztcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gc3dwX3B0ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiYjNDM7XHRcdHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4mIzQzO1x0XHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKVxuJiM0Mzt7XG4mIzQzO1x0Y29uc3QgYm9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdFx0ICAgIFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuJiM0MztcdHN3cF9lbnRyeV90IGVudHJ5ID0gcGFnZV9zd2FwX2VudHJ5KHBhZ2UpO1xuJiM0MztcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuJiM0MztcbiYjNDM7XHRpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHBhZ2UpIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cbiYjNDM7XHQgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNvdWxkIGhhdmUgUEZOIHN3YXAgUFRFcyxcbiYjNDM7XHQgKiBzbyB3ZSYjMzk7bGwgbm90IGNoZWNrL2NhcmUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXHUwMDNjIDApIHtcbiYjNDM7XHRcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbiYjNDM7XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2IGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBwYWdlKSkge1xuJiM0MztcdFx0Zm9saW9fcHV0X3N3YXAoZm9saW8sIHBhZ2UpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcbiYjNDM7XHRkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTtcbiYjNDM7XHRpbmNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpO1xuJiM0MztcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZXAsXG4mIzQzO1x0XHQgICBzd3BfcHRlX3ByZXBhcmUoZW50cnksIHB0ZXZhbCwgYW5vbl9leGNsdXNpdmUpKTtcbiYjNDM7XHRyZXR1cm4gdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgdHR1X2Fub25fZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCxcbiYjNDM7XHRcdHB0ZV90IHB0ZXZhbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcbiYjNDM7e1xuJiM0MztcdC8qXG4mIzQzO1x0ICogU3RvcmUgdGhlIHN3YXAgbG9jYXRpb24gaW4gdGhlIHB0ZS5cbiYjNDM7XHQgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChXQVJOX09OX09OQ0UoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPVxuJiM0MztcdFx0XHQgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKVxuJiM0MztcdFx0cmV0dXJuIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHZtYSwgZm9saW8sIG5yX3BhZ2VzKTtcbiYjNDM7XG4mIzQzO1x0LyogbnJfcGFnZXMgXHUwMDNlIDEgbm90IHN1cHBvcnRlZCB5ZXQgKi9cbiYjNDM7XHRyZXR1cm4gdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLCBwdGVwLFxuJiM0MztcdFx0XHRcdFx0IHB0ZXZhbCk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50XG4gICovXG5AQCAtMTk4NiwxNCAmIzQzOzIyMDAsMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiB7XG4gXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbiBcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcbi1cdGJvb2wgYW5vbl9leGNsdXNpdmUsIHJldCA9IHRydWU7XG4mIzQzO1x0Ym9vbCByZXQgPSB0cnVlO1xuIFx0cHRlX3QgcHRldmFsO1xuLVx0c3RydWN0IHBhZ2UgKnN1YnBhZ2U7XG4mIzQzO1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuIFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDEsIGVuZF9hZGRyO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4gXHRpbnQgcHRlcyA9IDA7XG4gXG4gXHQvKlxuQEAgLTIwMDcsOCAmIzQzOzIyMjAsNiBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFxuIFx0LypcbiBcdCAqIEZvciBUSFAsIHdlIGhhdmUgdG8gYXNzdW1lIHRoZSB3b3JzZSBjYXNlIGllIHBtZCBmb3IgaW52YWxpZGF0aW9uLlxuLVx0ICogRm9yIGh1Z2V0bGIsIGl0IGNvdWxkIGJlIG11Y2ggd29yc2UgaWYgd2UgbmVlZCB0byBkbyBwdWRcbi1cdCAqIGludmFsaWRhdGlvbiBpbiB0aGUgY2FzZSBvZiBwbWQgc2hhcmluZy5cbiBcdCAqXG4gXHQgKiBOb3RlIHRoYXQgdGhlIGZvbGlvIGNhbiBub3QgYmUgZnJlZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXG4gXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGZvbGlvLlxuQEAgLTIwMTYsMTcgJiM0MzsyMjI3LDYgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcdTAwMjZwdm13KTtcbiBcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFx1MDAyNnJhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEtXHUwMDNldm1fbW0sXG4gXHRcdFx0XHRhZGRyZXNzLCByYW5nZS5lbmQpO1xuLVx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0Lypcbi1cdFx0ICogSWYgc2hhcmluZyBpcyBwb3NzaWJsZSwgc3RhcnQgYW5kIGVuZCB3aWxsIGJlIGFkanVzdGVkXG4tXHRcdCAqIGFjY29yZGluZ2x5LlxuLVx0XHQgKi9cbi1cdFx0YWRqdXN0X3JhbmdlX2lmX3BtZF9zaGFyaW5nX3Bvc3NpYmxlKHZtYSwgXHUwMDI2cmFuZ2Uuc3RhcnQsXG4tXHRcdFx0XHRcdFx0ICAgICBcdTAwMjZyYW5nZS5lbmQpO1xuLVxuLVx0XHQvKiBXZSBuZWVkIHRoZSBodWdlIHBhZ2Ugc2l6ZSBmb3Igc2V0X2h1Z2VfcHRlX2F0KCkgKi9cbi1cdFx0aHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTtcbi1cdH1cbiBcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbiBcbiBcdHdoaWxlIChwYWdlX3ZtYV9tYXBwZWRfd2FsayhcdTAwMjZwdm13KSkge1xuQEAgLTIxMTEsNjUgJiM0MzsyMzExLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7XG4gXG4gXHRcdFx0cGZuID0gc29mdGxlYWZfdG9fcGZuKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTtcbiBcdFx0fVxuIFxuLVx0XHRzdWJwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XG4tXHRcdGFub25fZXhjbHVzaXZlID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdCBQYWdlQW5vbkV4Y2x1c2l2ZShzdWJwYWdlKTtcbi1cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRib29sIGFub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBwYWdlXG4tXHRcdFx0ICogaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGh1Z2V0bGIgcGFnZSBpcyBwb2lzb25lZC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRWTV9CVUdfT05fUEFHRSghUGFnZUhXUG9pc29uKHN1YnBhZ2UpLCBzdWJwYWdlKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS5cbi1cdFx0XHQgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5XG4tXHRcdFx0ICogYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLlxuLVx0XHRcdCAqIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xuLVx0XHRcdCAqIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4mIzQzO1x0XHRwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlXG4tXHRcdFx0ICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHlcbi1cdFx0XHQgKiBkbyB0aGlzIG91dHNpZGUgcm1hcCByb3V0aW5lcy5cbi1cdFx0XHQgKlxuLVx0XHRcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS5cbi1cdFx0XHQgKiBMb2NrIG9yZGVyIGRpY3RhdGVzIGFjcXVpcmluZyB2bWFfbG9jayBCRUZPUkVcbi1cdFx0XHQgKiBpX21tYXBfcndzZW0uICBXZSBjYW4gb25seSB0cnkgbG9jayBoZXJlIGFuZCBmYWlsXG4tXHRcdFx0ICogaWYgdW5zdWNjZXNzZnVsLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICghYW5vbikge1xuLVx0XHRcdFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xuLVxuLVx0XHRcdFx0Vk1fQlVHX09OKCEoZmxhZ3MgXHUwMDI2IFRUVV9STUFQX0xPQ0tFRCkpO1xuLVx0XHRcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpXG4tXHRcdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cbi1cdFx0XHRcdHRsYl9nYXRoZXJfbW11X3ZtYShcdTAwMjZ0bGIsIHZtYSk7XG4tXHRcdFx0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4tXHRcdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0XHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogVGhlIFBNRCB0YWJsZSB3YXMgdW5tYXBwZWQsXG4tXHRcdFx0XHRcdCAqIGNvbnNlcXVlbnRseSB1bm1hcHBpbmcgdGhlIGZvbGlvLlxuLVx0XHRcdFx0XHQgKi9cbi1cdFx0XHRcdFx0Z290byB3YWxrX2RvbmU7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcbi1cdFx0XHRcdHRsYl9maW5pc2hfbW11KFx1MDAyNnRsYik7XG4tXHRcdFx0fVxuLVx0XHRcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTtcbi1cdFx0XHRpZiAocHRlX2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbi1cdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbiYjNDM7XHRcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcbiBcdFx0XHRucl9wYWdlcyA9IGZvbGlvX3VubWFwX3B0ZV9iYXRjaChmb2xpbywgXHUwMDI2cHZtdywgZmxhZ3MsIHB0ZXZhbCk7XG4gXHRcdFx0ZW5kX2FkZHIgPSBhZGRyZXNzICYjNDM7IG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIFx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xuQEAgLTIyMDQsMTYgJiM0MzsyMzUwLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdC8qIFVwZGF0ZSBoaWdoIHdhdGVybWFyayBiZWZvcmUgd2UgbG93ZXIgcnNzICovXG4gXHRcdHVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7XG4gXG4tXHRcdGlmIChQYWdlSFdQb2lzb24oc3VicGFnZSkgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xuLVx0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShzdWJwYWdlKSk7XG4tXHRcdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRcdGh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pO1xuLVx0XHRcdFx0c2V0X2h1Z2VfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLFxuLVx0XHRcdFx0XHRcdGhzeik7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHR9XG4mIzQzO1x0XHQvKiBXaXRoIFRUVV9IV1BPSVNPTiwgd2Ugb25seSBleHBlY3Qgc21hbGwgZm9saW9zIGhlcmUuICovXG4mIzQzO1x0XHRpZiAoZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbykgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xuJiM0MztcdFx0XHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xuJiM0MztcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuJiM0MztcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiBcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuIFx0XHRcdC8qXG5AQCAtMjIyOCwxMDQgJiM0MzsyMzY5LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0ICovXG4gXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbiBcdFx0fSBlbHNlIGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4tXHRcdFx0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkoc3VicGFnZSk7XG4tXHRcdFx0cHRlX3Qgc3dwX3B0ZTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuXG4tXHRcdFx0ICogU2VlIGhhbmRsZV9wdGVfZmF1bHQoKSAuLi5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPVxuLVx0XHRcdFx0XHRmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7XG4tXHRcdFx0XHRXQVJOX09OX09OQ0UoMSk7XG4tXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0fVxuLVxuLVx0XHRcdC8qIE1BRFZfRlJFRSBwYWdlIGNoZWNrICovXG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKSB7XG4tXHRcdFx0XHRpbnQgcmVmX2NvdW50LCBtYXBfY291bnQ7XG4tXG4tXHRcdFx0XHQvKlxuLVx0XHRcdFx0ICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6XG4tXHRcdFx0XHQgKiAtIGNsZWFyIFBURTsgYmFycmllcjsgcmVhZCByZWZjb3VudFxuLVx0XHRcdFx0ICogLSBpbmMgcmVmY291bnQ7IGJhcnJpZXI7IHJlYWQgUFRFXG4tXHRcdFx0XHQgKi9cbi1cdFx0XHRcdHNtcF9tYigpO1xuLVxuLVx0XHRcdFx0cmVmX2NvdW50ID0gZm9saW9fcmVmX2NvdW50KGZvbGlvKTtcbi1cdFx0XHRcdG1hcF9jb3VudCA9IGZvbGlvX21hcGNvdW50KGZvbGlvKTtcbi1cbi1cdFx0XHRcdC8qXG4tXHRcdFx0XHQgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZ1xuLVx0XHRcdFx0ICogKHNlZSBjb21tZW50cyBpbiBfX3JlbW92ZV9tYXBwaW5nKCkpLlxuLVx0XHRcdFx0ICovXG4tXHRcdFx0XHRzbXBfcm1iKCk7XG4tXG4tXHRcdFx0XHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2ICEodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9EUk9QUEFCTEUpKSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIHJlZGlydGllZCBlaXRoZXIgdXNpbmcgdGhlIHBhZ2UgdGFibGUgb3IgYSBwcmV2aW91c2x5XG4tXHRcdFx0XHRcdCAqIG9idGFpbmVkIEdVUCByZWZlcmVuY2UuXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuLVx0XHRcdFx0XHRmb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7XG4tXHRcdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHRcdH0gZWxzZSBpZiAocmVmX2NvdW50ICE9IDEgJiM0MzsgbWFwX2NvdW50KSB7XG4tXHRcdFx0XHRcdC8qXG4tXHRcdFx0XHRcdCAqIEFkZGl0aW9uYWwgcmVmZXJlbmNlLiBDb3VsZCBiZSBhIEdVUCByZWZlcmVuY2Ugb3IgYW55XG4tXHRcdFx0XHRcdCAqIHNwZWN1bGF0aXZlIHJlZmVyZW5jZS4gR1VQIHVzZXJzIG11c3QgbWFyayB0aGUgZm9saW9cbi1cdFx0XHRcdFx0ICogZGlydHkgaWYgdGhlcmUgd2FzIGEgbW9kaWZpY2F0aW9uLiBUaGlzIGZvbGlvIGNhbm5vdCBiZVxuLVx0XHRcdFx0XHQgKiByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0IGxpa2Ugbm90aGluZ1xuLVx0XHRcdFx0XHQgKiBoYXBwZW5lZC5cbi1cdFx0XHRcdFx0ICogV2UmIzM5O2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlIGZvbGlvIHdhc1xuLVx0XHRcdFx0XHQgKiBkaXJ0aWVkIHdoZW4gdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGlzIGdvbmUuXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuLVx0XHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuLVx0XHRcdFx0Z290byBkaXNjYXJkO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHN1YnBhZ2UpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiYjNDM7XHRcdFx0aWYgKCF0dHVfYW5vbl9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLFxuJiM0MztcdFx0XHRcdFx0ICAgIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKSkge1xuJiM0MztcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4gXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4gXHRcdFx0fVxuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvblxuLVx0XHRcdCAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLFxuLVx0XHRcdCAqIHNvIHdlJiMzOTtsbCBub3QgY2hlY2svY2FyZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSBcdTAwM2MgMCkge1xuLVx0XHRcdFx0Zm9saW9fcHV0X3N3YXAoZm9saW8sIHN1YnBhZ2UpO1xuLVx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0fVxuLVxuLVx0XHRcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbi1cdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkge1xuLVx0XHRcdFx0Zm9saW9fcHV0X3N3YXAoZm9saW8sIHN1YnBhZ2UpO1xuLVx0XHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XG4tXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0fVxuLVx0XHRcdG1tX3ByZXBhcmVfZm9yX3N3YXBfZW50cmllcyhtbSk7XG4tXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7XG4tXHRcdFx0aW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTtcbi1cdFx0XHRzd3BfcHRlID0gc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7XG4tXHRcdFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuLVx0XHRcdFx0aWYgKHB0ZV9zb2Z0X2RpcnR5KHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcbi1cdFx0XHRcdGlmIChwdGVfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuLVx0XHRcdFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4tXHRcdFx0fVxuLVx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBzd3BfcHRlKTtcbiYjNDM7XHRcdFx0Z290byBmaW5pc2hfdW5tYXA7XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0LypcbiBcdFx0XHQgKiBUaGlzIGlzIGEgbG9ja2VkIGZpbGUtYmFja2VkIGZvbGlvLFxuQEAgLTIzNDAsMTIgJiM0MzsyMzkwLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKi9cbiBcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLW5yX3BhZ2VzKTtcbiBcdFx0fVxuLWRpc2NhcmQ6XG4tXHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSkge1xuLVx0XHRcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuLVx0XHR9XG4mIzQzO2ZpbmlzaF91bm1hcDpcbiYjNDM7XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuIFx0XHRpZiAodm1hLVx1MDAzZXZtX2ZsYWdzIFx1MDAyNiBWTV9MT0NLRUQpXG4gXHRcdFx0bWxvY2tfZHJhaW5fbG9jYWwoKTtcbiBcdFx0Zm9saW9fcHV0X3JlZnMoZm9saW8sIG5yX3BhZ2VzKTtcbkBAIC0yMzkzLDcgJiM0MzsyNDM5LDggQEAgc3RhdGljIGludCBmb2xpb19ub3RfbWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSxcbiYjNDM7XHRcdC5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgP1xuJiM0MztcdFx0XHRcdHRyeV90b191bm1hcF9odWdldGxiX29uZSA6IHRyeV90b191bm1hcF9vbmUsXG4gXHRcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxuIFx0XHQuZG9uZSA9IGZvbGlvX25vdF9tYXBwZWQsXG4gXHRcdC5hbm9uX2xvY2sgPSBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTMgMDU6MjY8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDssCiAgICAmIzM0O01FTU9SWV9GQUlMVVJFJiMzNDssCiAgICAmIzM0O0hXUE9JU09OX0lOSkVDVCYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2xhenlmcmVlX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8mIzM0OywKICAgICYjMzQ7dHR1X2Fub25fZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vcm1hcC5jIGZvciB1bm1hcHBpbmcgZm9saW9zLCBleHRyYWN0aW5nIGh1Z2V0bGIgYW5kIGFub255bW91cyBmb2xpbyB1bm1hcHBpbmcgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMuIFRoaXMgbW9kaWZpZXMgZnVuY3Rpb25hbCBjb2RlIHJlYWNoYWJsZSBkdXJpbmcgbWVtb3J5IHJlY2xhaW0sIHN3YXAsIGFuZCBoYXJkd2FyZSBwb2lzb24gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLgoKSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaAp0b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS4KCldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOgoxLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLgogICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0CiAgIHNwZWNpZmljYWxseSBjb3ZlciB0aGUgbW9kaWZpZWQgY29kZS4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzIG91dHB1dCBhcnJheSwKICAgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDQ2MGZjNThiZDgwYzVlNjhhMDgyYWVkMzM1YmZlZGEwZjZiNjg4MjgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgTW9uIEp1bCAxMyAwNToyNjo0NSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmgKaW5kZXggNDExNTA3NmU0OTIyYWUuLmJmN2UxNjNlMzc3OWQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMTI3MSw2ICYjNDM7MTI3MSw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBodWdldGxiX2NvdW50X3N1Yihsb25nIGwsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogfQogCiBwdGVfdCBodWdlX3B0ZXBfZ2V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKTsKJiM0Mzt1bnNpZ25lZCBsb25nIGh1Z2VfcHRlX2RpcnR5KHB0ZV90IHB0ZSk7CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggMjYxNjZhNmI4Y2I5YjEuLmZlNjdjZTZjZWI1ZWIzIDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vcm1hcC5jCkBAIC0xOTc4LDYgJiM0MzsxOTc4LDIyMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmb2xpb191bm1hcF9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbywKIAkJCQkgICAgIEZQQl9SRVNQRUNUX1dSSVRFIHwgRlBCX1JFU1BFQ1RfU09GVF9ESVJUWSk7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CURFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTsKJiM0MzsJY29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpOwomIzQzOwljb25zdCBlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKJiM0MzsJYm9vbCByZXQgPSB0cnVlOwomIzQzOwlwdGVfdCBwdGV2YWw7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2UKJiM0MzsJICogd2hlcmUgdGhlIGh1Z2V0bGIgZm9saW8gaXMgcG9pc29uZWQuCiYjNDM7CSAqLwomIzQzOwlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pOwomIzQzOwlWTV9XQVJOX09OX09OQ0UoIShmbGFncyAmYW1wOyBUVFVfSFdQT0lTT04pKTsKJiM0MzsKJiM0MzsJcmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKCZhbXA7cHZtdyk7CiYjNDM7CW1tdV9ub3RpZmllcl9yYW5nZV9pbml0KCZhbXA7cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS0mZ3Q7dm1fbW0sCiYjNDM7CQkJCWFkZHJlc3MsIHJhbmdlLmVuZCk7CiYjNDM7CWFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsICZhbXA7cmFuZ2Uuc3RhcnQsICZhbXA7cmFuZ2UuZW5kKTsKJiM0MzsJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoJmFtcDtyYW5nZSk7CiYjNDM7CiYjNDM7CS8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi8KJiM0MzsJaWYgKCFwYWdlX3ZtYV9tYXBwZWRfd2FsaygmYW1wO3B2bXcpKQomIzQzOwkJZ290byByYW5nZV9lbmQ7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT05fT05DRShhZGRyZXNzICE9IHB2bXcuYWRkcmVzcyk7CiYjNDM7CiYjNDM7CXB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCFwdGVfcHJlc2VudChwdGV2YWwpKTsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKHB0ZV9wZm4ocHRldmFsKSAhPSBmb2xpb19wZm4oZm9saW8pKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogaHVnZV9wbWRfdW5zaGFyZSBtYXkgdW5tYXAgYW4gZW50aXJlIFBNRCBwYWdlLiBUaGVyZSBpcyBubyB3YXkgb2YKJiM0MzsJICoga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5IGJlIGNhY2hlZCBmb3IgdGhpcyBtbSwgc28gd2UgbXVzdAomIzQzOwkgKiBmbHVzaCB0aGVtIGFsbC4gc3RhcnQvZW5kIHdlcmUgYWxyZWFkeSBhZGp1c3RlZCBhYm92ZSB0byBjb3ZlciB0aGlzCiYjNDM7CSAqIHJhbmdlLgomIzQzOwkgKi8KJiM0MzsJZmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZSBoZWxkIGluIHdyaXRlIG1vZGUuCiYjNDM7CSAqIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLgomIzQzOwkgKgomIzQzOwkgKiBXZSBhbHNvIG11c3QgaG9sZCBodWdldGxiIHZtYV9sb2NrIGluIHdyaXRlIG1vZGUuIExvY2sgb3JkZXIgZGljdGF0ZXMKJiM0MzsJICogYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRSBpX21tYXBfcndzZW0uIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kCiYjNDM7CSAqIGZhaWwgaWYgdW5zdWNjZXNzZnVsLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7CiYjNDM7CQlzdHJ1Y3QgbW11X2dhdGhlciB0bGI7CiYjNDM7CiYjNDM7CQlWTV9XQVJOX09OKCEoZmxhZ3MgJmFtcDsgVFRVX1JNQVBfTE9DS0VEKSk7CiYjNDM7CQlpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkgewomIzQzOwkJCXJldCA9IGZhbHNlOwomIzQzOwkJCWdvdG8gd2Fsa19kb25lOwomIzQzOwkJfQomIzQzOwomIzQzOwkJdGxiX2dhdGhlcl9tbXVfdm1hKCZhbXA7dGxiLCB2bWEpOwomIzQzOwkJaWYgKGh1Z2VfcG1kX3Vuc2hhcmUoJmFtcDt0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7CiYjNDM7CQkJaHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7CiYjNDM7CQkJaHVnZV9wbWRfdW5zaGFyZV9mbHVzaCgmYW1wO3RsYiwgdm1hKTsKJiM0MzsJCQl0bGJfZmluaXNoX21tdSgmYW1wO3RsYik7CiYjNDM7CQkJLyoKJiM0MzsJCQkgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCwgY29uc2VxdWVudGx5IHVubWFwcGluZwomIzQzOwkJCSAqIHRoZSBmb2xpby4KJiM0MzsJCQkgKi8KJiM0MzsJCQlnb3RvIHdhbGtfZG9uZTsKJiM0MzsJCX0KJiM0MzsJCWh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpOwomIzQzOwkJdGxiX2ZpbmlzaF9tbXUoJmFtcDt0bGIpOwomIzQzOwl9CiYjNDM7CXB0ZXZhbCA9IGh1Z2VfcHRlcF9jbGVhcl9mbHVzaCh2bWEsIGFkZHJlc3MsIHB2bXcucHRlKTsKJiM0MzsJaWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpCiYjNDM7CQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKJiM0MzsKJiM0MzsJcHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KGZvbGlvX3BhZ2UoZm9saW8sIDApKSk7CiYjNDM7CWh1Z2V0bGJfY291bnRfc3ViKGZvbGlvX25yX3BhZ2VzKGZvbGlvKSwgbW0pOwomIzQzOwlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIGhzeik7CiYjNDM7CWh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pOwomIzQzOwlmb2xpb19wdXRfcmVmcyhmb2xpbywgMSk7CiYjNDM7CiYjNDM7d2Fsa19kb25lOgomIzQzOwlwYWdlX3ZtYV9tYXBwZWRfd2Fsa19kb25lKCZhbXA7cHZtdyk7CiYjNDM7cmFuZ2VfZW5kOgomIzQzOwltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQoJmFtcDtyYW5nZSk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJc3RydWN0IGZvbGlvICpmb2xpbywgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKJiM0Mzt7CiYjNDM7CWludCByZWZfY291bnQsIG1hcF9jb3VudDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6CiYjNDM7CSAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50CiYjNDM7CSAqIC0gaW5jIHJlZmNvdW50OyBiYXJyaWVyOyByZWFkIFBURQomIzQzOwkgKi8KJiM0MzsJc21wX21iKCk7CiYjNDM7CiYjNDM7CXJlZl9jb3VudCA9IGZvbGlvX3JlZl9jb3VudChmb2xpbyk7CiYjNDM7CW1hcF9jb3VudCA9IGZvbGlvX21hcGNvdW50KGZvbGlvKTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogT3JkZXIgcmVhZHMgZm9yIHBhZ2UgcmVmY291bnQgYW5kIGRpcnR5IGZsYWcKJiM0MzsJICogKHNlZSBjb21tZW50cyBpbiBfX3JlbW92ZV9tYXBwaW5nKCkpLgomIzQzOwkgKi8KJiM0MzsJc21wX3JtYigpOwomIzQzOwomIzQzOwlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyAhKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSkgewomIzQzOwkJLyoKJiM0MzsJCSAqIHJlZGlydGllZCBlaXRoZXIgdXNpbmcgdGhlIHBhZ2UgdGFibGUgb3IgYSBwcmV2aW91c2x5CiYjNDM7CQkgKiBvYnRhaW5lZCBHVVAgcmVmZXJlbmNlLgomIzQzOwkJICovCiYjNDM7CQlmb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogQWRkaXRpb25hbCByZWZlcmVuY2VzIGNvdWxkIGJlIGR1ZSB0byBHVVAgb3Igc3BlY3VsYXRpdmUgbG9va3Vwcy4KJiM0MzsJICogR1VQIHVzZXJzIG11c3QgbWFyayB0aGUgZm9saW8gZGlydHkgaWYgdGhlcmUgd2FzIGEgbW9kaWZpY2F0aW9uLgomIzQzOwkgKiBUaGlzIGZvbGlvIGNhbm5vdCBiZSByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0CiYjNDM7CSAqIGxpa2Ugbm90aGluZyBoYXBwZW5lZC4gV2UmIzM5O2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlCiYjNDM7CSAqIGZvbGlvIHdhcyBkaXJ0aWVkIHdoZW4gdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGlzIGdvbmUuCiYjNDM7CSAqLwomIzQzOwlpZiAocmVmX2NvdW50ICE9IDEgJiM0MzsgbWFwX2NvdW50KQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlhZGRfbW1fY291bnRlcih2bWEtJmd0O3ZtX21tLCBNTV9BTk9OUEFHRVMsIC1ucl9wYWdlcyk7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgcHRlX3Qgc3dwX3B0ZV9wcmVwYXJlKHN3cF9lbnRyeV90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLAomIzQzOwkJYm9vbCBhbm9uX2V4Y2x1c2l2ZSkKJiM0Mzt7CiYjNDM7CXB0ZV90IHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTsKJiM0MzsKJiM0MzsJaWYgKGFub25fZXhjbHVzaXZlKQomIzQzOwkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7CiYjNDM7CiYjNDM7CWlmIChsaWtlbHkocHRlX3ByZXNlbnQob2xkX3B0ZSkpKSB7CiYjNDM7CQlpZiAocHRlX3NvZnRfZGlydHkob2xkX3B0ZSkpCiYjNDM7CQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpOwomIzQzOwkJaWYgKHB0ZV91ZmZkKG9sZF9wdGUpKQomIzQzOwkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCS8qIERldmljZS1leGNsdXNpdmUgZW50cnkgKi8KJiM0MzsJCWlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpCiYjNDM7CQkJc3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpOwomIzQzOwkJaWYgKHB0ZV9zd3BfdWZmZChvbGRfcHRlKSkKJiM0MzsJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHN3cF9wdGU7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sIHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAomIzQzOwkJcHRlX3QgKnB0ZXAsIHB0ZV90IHB0ZXZhbCkKJiM0Mzt7CiYjNDM7CWNvbnN0IGJvb2wgYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pICZhbXA7JmFtcDsKJiM0MzsJCQkJICAgIFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwomIzQzOwlzd3BfZW50cnlfdCBlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShwYWdlKTsKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwomIzQzOwlpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHBhZ2UpICZsdDsgMCkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvbgomIzQzOwkgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNvdWxkIGhhdmUgUEZOIHN3YXAgUFRFcywKJiM0MzsJICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLgomIzQzOwkgKi8KJiM0MzsJaWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgJmx0OyAwKSB7CiYjNDM7CQlmb2xpb19wdXRfc3dhcChmb2xpbywgcGFnZSk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqLwomIzQzOwlpZiAoYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOyBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3B0ZShmb2xpbywgcGFnZSkpIHsKJiM0MzsJCWZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTsKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsJfQomIzQzOwomIzQzOwltbV9wcmVwYXJlX2Zvcl9zd2FwX2VudHJpZXMobW0pOwomIzQzOwlkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTsKJiM0MzsJaW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTsKJiM0MzsJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlcCwKJiM0MzsJCSAgIHN3cF9wdGVfcHJlcGFyZShlbnRyeSwgcHRldmFsLCBhbm9uX2V4Y2x1c2l2ZSkpOwomIzQzOwlyZXR1cm4gdHJ1ZTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGJvb2wgdHR1X2Fub25fZm9saW8oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCwKJiM0MzsJCXB0ZV90IHB0ZXZhbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcykKJiM0Mzt7CiYjNDM7CS8qCiYjNDM7CSAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuCiYjNDM7CSAqIFNlZSBoYW5kbGVfcHRlX2ZhdWx0KCkgLi4uCiYjNDM7CSAqLwomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKGZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykgIT0KJiM0MzsJCQkgZm9saW9fdGVzdF9zd2FwY2FjaGUoZm9saW8pKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJaWYgKCFmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pKQomIzQzOwkJcmV0dXJuIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHZtYSwgZm9saW8sIG5yX3BhZ2VzKTsKJiM0MzsKJiM0MzsJLyogbnJfcGFnZXMgJmd0OyAxIG5vdCBzdXBwb3J0ZWQgeWV0ICovCiYjNDM7CXJldHVybiB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvKHZtYSwgZm9saW8sIHBhZ2UsIGFkZHJlc3MsIHB0ZXAsCiYjNDM7CQkJCQkgcHRldmFsKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogQGFyZzogZW51bSB0dHVfZmxhZ3Mgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcyBhcmd1bWVudAogICovCkBAIC0xOTg2LDE0ICYjNDM7MjIwMCwxMyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKIAlERUZJTkVfRk9MSU9fVk1BX1dBTEsocHZtdywgZm9saW8sIHZtYSwgYWRkcmVzcywgMCk7Ci0JYm9vbCBhbm9uX2V4Y2x1c2l2ZSwgcmV0ID0gdHJ1ZTsKJiM0MzsJYm9vbCByZXQgPSB0cnVlOwogCXB0ZV90IHB0ZXZhbDsKLQlzdHJ1Y3QgcGFnZSAqc3VicGFnZTsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTsKIAllbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDEsIGVuZF9hZGRyOwogCXVuc2lnbmVkIGxvbmcgcGZuOwotCXVuc2lnbmVkIGxvbmcgaHN6ID0gMDsKIAlpbnQgcHRlcyA9IDA7CiAKIAkvKgpAQCAtMjAwNyw4ICYjNDM7MjIyMCw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAKIAkvKgogCSAqIEZvciBUSFAsIHdlIGhhdmUgdG8gYXNzdW1lIHRoZSB3b3JzZSBjYXNlIGllIHBtZCBmb3IgaW52YWxpZGF0aW9uLgotCSAqIEZvciBodWdldGxiLCBpdCBjb3VsZCBiZSBtdWNoIHdvcnNlIGlmIHdlIG5lZWQgdG8gZG8gcHVkCi0JICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLgogCSAqCiAJICogTm90ZSB0aGF0IHRoZSBmb2xpbyBjYW4gbm90IGJlIGZyZWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgY2FsbCBvZgogCSAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZm9saW8uCkBAIC0yMDE2LDE3ICYjNDM7MjIyNyw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKCZhbXA7cHZtdyk7CiAJbW11X25vdGlmaWVyX3JhbmdlX2luaXQoJmFtcDtyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLSZndDt2bV9tbSwKIAkJCQlhZGRyZXNzLCByYW5nZS5lbmQpOwotCWlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7Ci0JCS8qCi0JCSAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZAotCQkgKiBhY2NvcmRpbmdseS4KLQkJICovCi0JCWFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsICZhbXA7cmFuZ2Uuc3RhcnQsCi0JCQkJCQkgICAgICZhbXA7cmFuZ2UuZW5kKTsKLQotCQkvKiBXZSBuZWVkIHRoZSBodWdlIHBhZ2Ugc2l6ZSBmb3Igc2V0X2h1Z2VfcHRlX2F0KCkgKi8KLQkJaHN6ID0gaHVnZV9wYWdlX3NpemUoaHN0YXRlX3ZtYSh2bWEpKTsKLQl9CiAJbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoJmFtcDtyYW5nZSk7CiAKIAl3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoJmFtcDtwdm13KSkgewpAQCAtMjExMSw2NSAmIzQzOzIzMTEsMTEgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCWNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3B0ZShwdGV2YWwpOwogCiAJCQlwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpOwotCQkJVk1fV0FSTl9PTl9GT0xJTyhmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pLCBmb2xpbyk7CiAJCX0KIAotCQlzdWJwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7Ci0JCWFub25fZXhjbHVzaXZlID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSAmYW1wOyZhbXA7Ci0JCQkJIFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpOwotCi0JCWlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7Ci0JCQlib29sIGFub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pOwotCi0JCQkvKgotCQkJICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBwYWdlCi0JCQkgKiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaHVnZXRsYiBwYWdlIGlzIHBvaXNvbmVkLgotCQkJICovCi0JCQlWTV9CVUdfT05fUEFHRSghUGFnZUhXUG9pc29uKHN1YnBhZ2UpLCBzdWJwYWdlKTsKLQkJCS8qCi0JCQkgKiBodWdlX3BtZF91bnNoYXJlIG1heSB1bm1hcCBhbiBlbnRpcmUgUE1EIHBhZ2UuCi0JCQkgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5Ci0JCQkgKiBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuCi0JCQkgKiBzdGFydC9lbmQgd2VyZSBhbHJlYWR5IGFkanVzdGVkIGFib3ZlIHRvIGNvdmVyIHRoaXMKLQkJCSAqIHJhbmdlLgotCQkJICovCi0JCQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpOwomIzQzOwkJcGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpOwogCi0JCQkvKgotCQkJICogVG8gY2FsbCBodWdlX3BtZF91bnNoYXJlLCBpX21tYXBfcndzZW0gbXVzdCBiZQotCQkJICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkKLQkJCSAqIGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLgotCQkJICoKLQkJCSAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4KLQkJCSAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRQotCQkJICogaV9tbWFwX3J3c2VtLiAgV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmQgZmFpbAotCQkJICogaWYgdW5zdWNjZXNzZnVsLgotCQkJICovCi0JCQlpZiAoIWFub24pIHsKLQkJCQlzdHJ1Y3QgbW11X2dhdGhlciB0bGI7Ci0KLQkJCQlWTV9CVUdfT04oIShmbGFncyAmYW1wOyBUVFVfUk1BUF9MT0NLRUQpKTsKLQkJCQlpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSkKLQkJCQkJZ290byB3YWxrX2Fib3J0OwotCi0JCQkJdGxiX2dhdGhlcl9tbXVfdm1hKCZhbXA7dGxiLCB2bWEpOwotCQkJCWlmIChodWdlX3BtZF91bnNoYXJlKCZhbXA7dGxiLCB2bWEsIGFkZHJlc3MsIHB2bXcucHRlKSkgewotCQkJCQlodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTsKLQkJCQkJaHVnZV9wbWRfdW5zaGFyZV9mbHVzaCgmYW1wO3RsYiwgdm1hKTsKLQkJCQkJdGxiX2ZpbmlzaF9tbXUoJmFtcDt0bGIpOwotCQkJCQkvKgotCQkJCQkgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCwKLQkJCQkJICogY29uc2VxdWVudGx5IHVubWFwcGluZyB0aGUgZm9saW8uCi0JCQkJCSAqLwotCQkJCQlnb3RvIHdhbGtfZG9uZTsKLQkJCQl9Ci0JCQkJaHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7Ci0JCQkJdGxiX2ZpbmlzaF9tbXUoJmFtcDt0bGIpOwotCQkJfQotCQkJcHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpOwotCQkJaWYgKHB0ZV9kaXJ0eShwdGV2YWwpKQotCQkJCWZvbGlvX21hcmtfZGlydHkoZm9saW8pOwotCQl9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewomIzQzOwkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewogCQkJbnJfcGFnZXMgPSBmb2xpb191bm1hcF9wdGVfYmF0Y2goZm9saW8sICZhbXA7cHZtdywgZmxhZ3MsIHB0ZXZhbCk7CiAJCQllbmRfYWRkciA9IGFkZHJlc3MgJiM0MzsgbnJfcGFnZXMgKiBQQUdFX1NJWkU7CiAJCQlmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIGFkZHJlc3MsIGVuZF9hZGRyKTsKQEAgLTIyMDQsMTYgJiM0MzsyMzUwLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCS8qIFVwZGF0ZSBoaWdoIHdhdGVybWFyayBiZWZvcmUgd2UgbG93ZXIgcnNzICovCiAJCXVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7CiAKLQkJaWYgKFBhZ2VIV1BvaXNvbihzdWJwYWdlKSAmYW1wOyZhbXA7IChmbGFncyAmYW1wOyBUVFVfSFdQT0lTT04pKSB7Ci0JCQlwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkoc3VicGFnZSkpOwotCQkJaWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHsKLQkJCQlodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTsKLQkJCQlzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsCi0JCQkJCQloc3opOwotCQkJfSBlbHNlIHsKLQkJCQlkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpOwotCQkJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpOwotCQkJfQomIzQzOwkJLyogV2l0aCBUVFVfSFdQT0lTT04sIHdlIG9ubHkgZXhwZWN0IHNtYWxsIGZvbGlvcyBoZXJlLiAqLwomIzQzOwkJaWYgKGZvbGlvX3Rlc3RfaHdwb2lzb24oZm9saW8pICZhbXA7JmFtcDsgKGZsYWdzICZhbXA7IFRUVV9IV1BPSVNPTikpIHsKJiM0MzsJCQlwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpOwomIzQzOwkJCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7CiYjNDM7CQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7CiAJCX0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpICZhbXA7JmFtcDsgcHRlX3VudXNlZChwdGV2YWwpICZhbXA7JmFtcDsKIAkJCSAgICF1c2VyZmF1bHRmZF9hcm1lZCh2bWEpKSB7CiAJCQkvKgpAQCAtMjIyOCwxMDQgJiM0MzsyMzY5LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkgKi8KIAkJCWRlY19tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyKGZvbGlvKSk7CiAJCX0gZWxzZSBpZiAoZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkgewotCQkJc3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkoc3VicGFnZSk7Ci0JCQlwdGVfdCBzd3BfcHRlOwotCQkJLyoKLQkJCSAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuCi0JCQkgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLgotCQkJICovCi0JCQlpZiAodW5saWtlbHkoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPQotCQkJCQlmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7Ci0JCQkJV0FSTl9PTl9PTkNFKDEpOwotCQkJCWdvdG8gd2Fsa19hYm9ydDsKLQkJCX0KLQotCQkJLyogTUFEVl9GUkVFIHBhZ2UgY2hlY2sgKi8KLQkJCWlmICghZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSkgewotCQkJCWludCByZWZfY291bnQsIG1hcF9jb3VudDsKLQotCQkJCS8qCi0JCQkJICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6Ci0JCQkJICogLSBjbGVhciBQVEU7IGJhcnJpZXI7IHJlYWQgcmVmY291bnQKLQkJCQkgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEUKLQkJCQkgKi8KLQkJCQlzbXBfbWIoKTsKLQotCQkJCXJlZl9jb3VudCA9IGZvbGlvX3JlZl9jb3VudChmb2xpbyk7Ci0JCQkJbWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pOwotCi0JCQkJLyoKLQkJCQkgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZwotCQkJCSAqIChzZWUgY29tbWVudHMgaW4gX19yZW1vdmVfbWFwcGluZygpKS4KLQkJCQkgKi8KLQkJCQlzbXBfcm1iKCk7Ci0KLQkJCQlpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyAhKHZtYS0mZ3Q7dm1fZmxhZ3MgJmFtcDsgVk1fRFJPUFBBQkxFKSkgewotCQkJCQkvKgotCQkJCQkgKiByZWRpcnRpZWQgZWl0aGVyIHVzaW5nIHRoZSBwYWdlIHRhYmxlIG9yIGEgcHJldmlvdXNseQotCQkJCQkgKiBvYnRhaW5lZCBHVVAgcmVmZXJlbmNlLgotCQkJCQkgKi8KLQkJCQkJc2V0X3B0ZXMobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKTsKLQkJCQkJZm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pOwotCQkJCQlnb3RvIHdhbGtfYWJvcnQ7Ci0JCQkJfSBlbHNlIGlmIChyZWZfY291bnQgIT0gMSAmIzQzOyBtYXBfY291bnQpIHsKLQkJCQkJLyoKLQkJCQkJICogQWRkaXRpb25hbCByZWZlcmVuY2UuIENvdWxkIGJlIGEgR1VQIHJlZmVyZW5jZSBvciBhbnkKLQkJCQkJICogc3BlY3VsYXRpdmUgcmVmZXJlbmNlLiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpbwotCQkJCQkgKiBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uIFRoaXMgZm9saW8gY2Fubm90IGJlCi0JCQkJCSAqIHJlY2xhaW1lZCByaWdodCBub3cgZWl0aGVyIHdheSwgc28gYWN0IGp1c3QgbGlrZSBub3RoaW5nCi0JCQkJCSAqIGhhcHBlbmVkLgotCQkJCQkgKiBXZSYjMzk7bGwgY29tZSBiYWNrIGhlcmUgbGF0ZXIgYW5kIGRldGVjdCBpZiB0aGUgZm9saW8gd2FzCi0JCQkJCSAqIGRpcnRpZWQgd2hlbiB0aGUgYWRkaXRpb25hbCByZWZlcmVuY2UgaXMgZ29uZS4KLQkJCQkJICovCi0JCQkJCXNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7Ci0JCQkJCWdvdG8gd2Fsa19hYm9ydDsKLQkJCQl9Ci0JCQkJYWRkX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUywgLW5yX3BhZ2VzKTsKLQkJCQlnb3RvIGRpc2NhcmQ7Ci0JCQl9Ci0KLQkJCWlmIChmb2xpb19kdXBfc3dhcChmb2xpbywgc3VicGFnZSkgJmx0OyAwKSB7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7CiYjNDM7CQkJaWYgKCF0dHVfYW5vbl9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLAomIzQzOwkJCQkJICAgIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKSkgewomIzQzOwkJCQlzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpOwogCQkJCWdvdG8gd2Fsa19hYm9ydDsKIAkJCX0KIAotCQkJLyoKLQkJCSAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb24KLQkJCSAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLAotCQkJICogc28gd2UmIzM5O2xsIG5vdCBjaGVjay9jYXJlLgotCQkJICovCi0JCQlpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSAmbHQ7IDApIHsKLQkJCQlmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7Ci0JCQkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7Ci0JCQkJZ290byB3YWxrX2Fib3J0OwotCQkJfQotCi0JCQkvKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcCgpOiBjbGVhciBQVEUgZmlyc3QuICovCi0JCQlpZiAoYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkJICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkgewotCQkJCWZvbGlvX3B1dF9zd2FwKGZvbGlvLCBzdWJwYWdlKTsKLQkJCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTsKLQkJCQlnb3RvIHdhbGtfYWJvcnQ7Ci0JCQl9Ci0JCQltbV9wcmVwYXJlX2Zvcl9zd2FwX2VudHJpZXMobW0pOwotCQkJZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7Ci0JCQlpbmNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpOwotCQkJc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpOwotCQkJaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCXN3cF9wdGUgPSBwdGVfc3dwX21rZXhjbHVzaXZlKHN3cF9wdGUpOwotCQkJaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkgewotCQkJCWlmIChwdGVfc29mdF9kaXJ0eShwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7Ci0JCQkJaWYgKHB0ZV91ZmZkKHB0ZXZhbCkpCi0JCQkJCXN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7Ci0JCQkJaWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKQotCQkJCQlzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7Ci0JCQl9Ci0JCQlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgc3dwX3B0ZSk7CiYjNDM7CQkJZ290byBmaW5pc2hfdW5tYXA7CiAJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogVGhpcyBpcyBhIGxvY2tlZCBmaWxlLWJhY2tlZCBmb2xpbywKQEAgLTIzNDAsMTIgJiM0MzsyMzkwLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCSAqLwogCQkJYWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1ucl9wYWdlcyk7CiAJCX0KLWRpc2NhcmQ6Ci0JCWlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSkgewotCQkJaHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7Ci0JCX0gZWxzZSB7Ci0JCQlmb2xpb19yZW1vdmVfcm1hcF9wdGVzKGZvbGlvLCBzdWJwYWdlLCBucl9wYWdlcywgdm1hKTsKLQkJfQomIzQzO2ZpbmlzaF91bm1hcDoKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIG5yX3BhZ2VzLCB2bWEpOwogCQlpZiAodm1hLSZndDt2bV9mbGFncyAmYW1wOyBWTV9MT0NLRUQpCiAJCQltbG9ja19kcmFpbl9sb2NhbCgpOwogCQlmb2xpb19wdXRfcmVmcyhmb2xpbywgbnJfcGFnZXMpOwpAQCAtMjM5Myw3ICYjNDM7MjQzOSw4IEBAIHN0YXRpYyBpbnQgZm9saW9fbm90X21hcHBlZChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpCiB7CiAJc3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHsKLQkJLnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSwKJiM0MzsJCS5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgPwomIzQzOwkJCQl0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLAogCQkuYXJnID0gKHZvaWQgKilmbGFncywKIAkJLmRvbmUgPSBmb2xpb19ub3RfbWFwcGVkLAogCQkuYW5vbl9sb2NrID0gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkLAo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMyAwNToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4MjcxCgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogMjcwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIHRoZSBgcm1hcC5jYCBSZWZhY3RvcmluZyBQYXRjaCoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYSBwYXRjaCB0aGF0JiMzOTtzIHJlZmFjdG9yaW5nIGB0cnlfdG9fdW5tYXBfb25lYCBpbiBgbW0vcm1hcC5jYC4gVGhpcyBpcyBhIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYXJlYSwgc28gbmF0dXJhbGx5LCBJIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbi4gSXQgbG9va3MgbGlrZSB0aGUgY2hhbmdlIGlzIGFpbWVkIGF0IGJldHRlciBvcmdhbml6YXRpb24sIHNwZWNpZmljYWxseSBleHRyYWN0aW5nIHRoZSBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGxvZ2ljIGludG8gZGVkaWNhdGVkIGZ1bmN0aW9uczogYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgYW5kIHZhcmlvdXMgYHR0dV9hbm9uX2ZvbGlvYCB2YXJpYW50cyBpbmNsdWRpbmcgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCBhbmQgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbG9uZ3NpZGUgYHN3cF9wdGVfcHJlcGFyZWAuCgpGdW5jdGlvbmFsbHksIHRoaXMgc2VlbXMgc291bmQuIFJlZmFjdG9yaW5nIGxpa2UgdGhpcyBvZnRlbiBpbXByb3ZlcyByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LCB3aGljaCBpcyBhbHdheXMgYSBnb29kIHNpZ24gaW4gYSBjb21wbGV4IGFyZWEgbGlrZSB0aGUga2VybmVsJiMzOTtzIG1lbW9yeSBtYW5hZ2VtZW50LiBHaXZlbiB0aGF0IGl0JiMzOTtzIHRvdWNoaW5nIHRoZSBybWFwIGNvZGUsIEkmIzM5O2Qgc2F5IHRoaXMgaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgbmVlZCB0byBmdXp6IHRob3JvdWdobHkgdG8gZW5zdXJlIG5vIHJlZ3Jlc3Npb25zLgoKTm93LCBsZXQmIzM5O3MgZHJpbGwgZG93biBpbnRvIHRoZSBzcGVjaWZpY3MuIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGlzIGNhbGxlZCB3aGVuIGBmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pYCByZXR1cm5zIHRydWUsIHdoaWNoIG1ha2VzIHNlbnNlLiBgdHJ5X3RvX3VubWFwX29uZWAgaGFuZGxlcyB0aGUgbm9uLWh1Z2V0bGIgY2FzZXMuIFRoYXQmIzM5O3MgYSBjbGVhbiBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLgoKTmV4dCwgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHJlcXVpcmVkIGNvbmZpZ3VyYXRpb25zLiBgbW0vcm1hcC5jYCBpdHNlbGYgaXMgb25seSBjb21waWxlZCB3aXRoIGBDT05GSUdfTU1VYCwgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkLiBUaGUgaHVnZXRsYi1zcGVjaWZpYyBsb2dpYywgYXMgZXhwZWN0ZWQsIGlzIGdhdGVkIGJ5IGBDT05GSUdfSFVHRVRMQl9QQUdFYC4gQW5kIGxvb2tpbmcgYXQgdGhlIGFub255bW91cyBmb2xpbyB1bm1hcHBpbmcsIGl0IHNlZW1zIHRoYXQgc3dhcCBzdXBwb3J0IChgQ09ORklHX1NXQVBgKSBpcyBjcnVjaWFsLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBzd2FwYmFja2VkIGZvbGlvIGNhc2VzLgoKRmluYWxseSwgSSYjMzk7bGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIHRvIGRvdWJsZS1jaGVjayBhbGwgY2FsbHMgdG8gYHRyeV90b191bm1hcGAgYW5kIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIHRvIGVuc3VyZSBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgYWxsIHRvdWNocG9pbnRzLiBUaGlzIHdpbGwgaGVscCB3aXRoIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzEzIDA1OjI2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b191bm1hcCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tL3JtYXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9ybWFwLmM9NjMzPXN0cnVjdCBhbm9uX3ZtYSAqZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkKGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8sXG4tLVxubW0vcm1hcC5jLTcxMC0gKi9cbm1tL3JtYXAuYzo3MTE6dm9pZCB0cnlfdG9fdW5tYXBfZmx1c2godm9pZClcbm1tL3JtYXAuYy03MTIte1xuLS1cbm1tL3JtYXAuYy03MjMtLyogRmx1c2ggaWZmIHRoZXJlIGFyZSBwb3RlbnRpYWxseSB3cml0YWJsZSBUTEIgZW50cmllcyB0aGF0IGNhbiByYWNlIHdpdGggSU8gKi9cbm1tL3JtYXAuYzo3MjQ6dm9pZCB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkodm9pZClcbm1tL3JtYXAuYy03MjUte1xuLS1cbm1tL3JtYXAuYy03MjgtXHRpZiAodGxiX3ViYy1cdTAwM2V3cml0YWJsZSlcbm1tL3JtYXAuYzo3Mjk6XHRcdHRyeV90b191bm1hcF9mbHVzaCgpO1xubW0vcm1hcC5jLTczMC19XG4tLVxubW0vcm1hcC5jPTc0Mj1zdGF0aWMgdm9pZCBzZXRfdGxiX3ViY19mbHVzaF9wZW5kaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCBwdGV2YWwsXG4tLVxubW0vcm1hcC5jLTc3NS1cdCAqIElmIHRoZSBQVEUgd2FzIGRpcnR5IHRoZW4gaXQmIzM5O3MgYmVzdCB0byBhc3N1bWUgaXQmIzM5O3Mgd3JpdGFibGUuIFRoZVxubW0vcm1hcC5jOjc3NjpcdCAqIGNhbGxlciBtdXN0IHVzZSB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkoKSBvciB0cnlfdG9fdW5tYXBfZmx1c2goKVxubW0vcm1hcC5jLTc3Ny1cdCAqIGJlZm9yZSB0aGUgcGFnZSBpcyBxdWV1ZWQgZm9yIElPLlxuLS1cbm1tL3JtYXAuYz0xOTQ0PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX3VubWFwX3B0ZV9iYXRjaChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuLS1cbm1tL3JtYXAuYy0xOTgwLVxubW0vcm1hcC5jOjE5ODE6c3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sXG5tbS9ybWFwLmMtMTk4Mi1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxuLS1cbm1tL3JtYXAuYy0xOTkyLVx0Lypcbm1tL3JtYXAuYzoxOTkzOlx0ICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBmb2xpbyBpbiB0aGUgY2FzZVxubW0vcm1hcC5jLTE5OTQtXHQgKiB3aGVyZSB0aGUgaHVnZXRsYiBmb2xpbyBpcyBwb2lzb25lZC5cbi0tXG5tbS9ybWFwLmM9MjE3NT1zdGF0aWMgYm9vbCB0dHVfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZvbGlvICpmb2xpbyxcbi0tXG5tbS9ybWFwLmMtMjE5Ny0gKi9cbm1tL3JtYXAuYzoyMTk4OnN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9ybWFwLmMtMjE5OS1cdFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcbi0tXG5tbS9ybWFwLmMtMjIxNC1cdCAqIGluIGJldHdlZW4gaXRzIHB0ZXBfZ2V0X2FuZF9jbGVhcl9mdWxsKCkgYW5kIGZvbGlvX3JlbW92ZV9ybWFwXyooKSxcbm1tL3JtYXAuYzoyMjE1Olx0ICogdHJ5X3RvX3VubWFwKCkgbWF5IHJldHVybiBiZWZvcmUgZm9saW9fbWFwcGVkKCkgaGFzIGJlY29tZSBmYWxzZSxcbm1tL3JtYXAuYy0yMjE2LVx0ICogaWYgcGFnZSB0YWJsZSBsb2NraW5nIGlzIHNraXBwZWQ6IHVzZSBUVFVfU1lOQyB0byB3YWl0IGZvciB0aGF0LlxuLS1cbm1tL3JtYXAuYy0yMjI0LVx0ICogTm90ZSB0aGF0IHRoZSBmb2xpbyBjYW4gbm90IGJlIGZyZWVkIGluIHRoaXMgZnVuY3Rpb24gYXMgY2FsbCBvZlxubW0vcm1hcC5jOjIyMjU6XHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGZvbGlvLlxubW0vcm1hcC5jLTIyMjYtXHQgKi9cbi0tXG5tbS9ybWFwLmM9MjQyMz1zdGF0aWMgaW50IGZvbGlvX25vdF9tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcbi0tXG5tbS9ybWFwLmMtMjQyOC0vKipcbm1tL3JtYXAuYzoyNDI5OiAqIHRyeV90b191bm1hcCAtIFRyeSB0byByZW1vdmUgYWxsIHBhZ2UgdGFibGUgbWFwcGluZ3MgdG8gYSBmb2xpby5cbm1tL3JtYXAuYy0yNDMwLSAqIEBmb2xpbzogVGhlIGZvbGlvIHRvIHVubWFwLlxuLS1cbm1tL3JtYXAuYy0yNDM4LSAqL1xubW0vcm1hcC5jOjI0Mzk6dm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG5tbS9ybWFwLmMtMjQ0MC17XG4tLVxubW0vcm1hcC5jLTI0NDItXHRcdC5ybWFwX29uZSA9IGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykgP1xubW0vcm1hcC5jOjI0NDM6XHRcdFx0XHR0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLFxubW0vcm1hcC5jLTI0NDQtXHRcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxuLS1cbm1tL3JtYXAuYz0yNDYxPXN0YXRpYyBib29sIHRyeV90b19taWdyYXRlX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ybWFwLmMtMjQ4OC1cdCAqIE5vdGUgdGhhdCB0aGUgcGFnZSBjYW4gbm90IGJlIGZyZWUgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXG5tbS9ybWFwLmM6MjQ4OTpcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgcGFnZS5cbm1tL3JtYXAuYy0yNDkwLVx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTMgMDU6MjY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAxODEKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA0MDAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBSZWZhY3RvcioqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGNsZWFybHkgbWFraW5nIHNvbWUgc2lnbmlmaWNhbnQgY2hhbmdlcyB0byBob3cgd2UgaGFuZGxlIG1lbW9yeSB1bm1hcHBpbmcsIHNwZWNpZmljYWxseSBieSBpbnRyb2R1Y2luZyBhIHN1aXRlIG9mIG5ldyBmdW5jdGlvbnMuIEl0IGxvb2tzIGxpa2Ugd2UmIzM5O3JlIHJlZmFjdG9yaW5nIGB0cnlfdG9fdW5tYXBfb25lYCBhbmQgYWRkaW5nIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgLCBgdHR1X2Fub25fbGF6eWZyZWVfZm9saW9gLCBgc3dwX3B0ZV9wcmVwYXJlYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYC4gVGhlc2UgYXJlIGRlZmluaXRlbHkgY29yZSBmdW5jdGlvbnMsIHRvdWNoaW5nIG9uIGhvdyB3ZSBkZWFsIHdpdGggaHVnZXRsYmZzIGFuZCBzd2FwcGVkIG1lbW9yeS4KClRoZSBrZXkgY29uZmlncyB0byBlbmFibGUgdGhlc2UgY2hhbmdlcyBhcmUgYEhVR0VUTEJfUEFHRWAgYW5kIGBTV0FQYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWVzLiBJIHNob3VsZCBmb2N1cyBvbiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYCBhcyB0aGUgcHJpbWFyeSBzeW1ib2xzIG9mIGludGVyZXN0LCBidXQgSSBhbHNvIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBgdHJ5X3RvX3VubWFwX29uZWAgaXMgYmVpbmcgbW9kaWZpZWQgYXMgd2VsbC4KCk5vdywgYmVmb3JlIEkgZGlnIGRlZXBlciwgbGV0JiMzOTtzIGp1c3QgbWFrZSBzdXJlIHRoZXJlIGFyZW4mIzM5O3QgYW55IG90aGVyIGNydWNpYWwgY29uZmlncyB0byBiZSBhd2FyZSBvZi4gYEhVR0VUTEJfUEFHRWAgY292ZXJzIHRoZSBodWdldGxiIHVubWFwcGluZywgYW5kIGBTV0FQYCwgb2YgY291cnNlLCBjb3ZlcnMgdGhlIHN3YXAtYmFja2VkIGZvbGlvcy4gYE1NVWAgaXMgYSBnaXZlbiwgZ2l2ZW4gdGhhdCB3ZSBhcmUgd29ya2luZyBpbiBgbW0vcm1hcC5jYC4KCkFoYSEgSXQgbG9va3MgbGlrZSBgSFdQT0lTT05fSU5KRUNUYCBvciBgTUVNT1JZX0ZBSUxVUkVgIG1pZ2h0IGJlIHJlbGV2YW50IGhlcmUuIFRoZSBjb21tZW50IGluIHRoZSBjb2RlIHN1Z2dlc3RzIHRoYXQgYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgaXMgb25seSBjYWxsZWQgd2hlbiB3ZSBoYXZlIGBmbGFncyAmYW1wOyBUVFVfSFdQT0lTT05gLiBMZXQmIzM5O3MgY29uZmlybSB0aGF0IGJ5IGNoZWNraW5nIHRoZSBzb3VyY2UgY29kZSBvZiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYDoKYGBgYwoJLyoKCSAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2UKCSAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLgoJICovCglWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pOwoJVk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgJmFtcDsgVFRVX0hXUE9JU09OKSk7CmBgYApZdXAsIGNvbmZpcm1lZC4gSXQgbG9va3MgbGlrZSBgTUVNT1JZX0ZBSUxVUkVgIGlzIGluZGVlZCBhIHByZXJlcXVpc2l0ZSBzaW5jZSB0aGF0IHRyaWdnZXJzIHRoZSBgSFdQT0lTT05gIGZsYWcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTMgMDU6MjY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TUVNT1JZX0ZBSUxVUkUmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS9LY29uZmlnJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL0tjb25maWc9NzQ3PWNvbmZpZyBERUZBVUxUX01NQVBfTUlOX0FERFJcbi0tXG5tbS9LY29uZmlnLTc2NS1cbm1tL0tjb25maWc6NzY2OmNvbmZpZyBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFXG5tbS9LY29uZmlnLTc2Ny1cdGJvb2xcbm1tL0tjb25maWctNzY4LVxubW0vS2NvbmZpZzo3Njk6Y29uZmlnIE1FTU9SWV9GQUlMVVJFXG5tbS9LY29uZmlnLTc3MC1cdGRlcGVuZHMgb24gTU1VXG5tbS9LY29uZmlnOjc3MTpcdGRlcGVuZHMgb24gQVJDSF9TVVBQT1JUU19NRU1PUllfRkFJTFVSRVxubW0vS2NvbmZpZy03NzItXHRib29sIFwmIzM0O0VuYWJsZSByZWNvdmVyeSBmcm9tIGhhcmR3YXJlIG1lbW9yeSBlcnJvcnNcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTc4MD1jb25maWcgSFdQT0lTT05fSU5KRUNUXG5tbS9LY29uZmlnLTc4MS1cdHRyaXN0YXRlIFwmIzM0O0hXUG9pc29uIHBhZ2VzIGluamVjdG9yXCYjMzQ7XG5tbS9LY29uZmlnOjc4MjpcdGRlcGVuZHMgb24gTUVNT1JZX0ZBSUxVUkUgXHUwMDI2XHUwMDI2IERFQlVHX0tFUk5FTCBcdTAwMjZcdTAwMjYgUFJPQ19GU1xubW0vS2NvbmZpZy03ODMtXHRzZWxlY3QgUFJPQ19QQUdFX01PTklUT1JcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMyAwNToyNjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTM2MQoJCQkJCQkJb3V0cHV0OiAxNTEKCQkJCQkJCXRob3VnaHRzOiA0NTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgUmVhc29uaW5nIGZvciBTZWxlY3RpbmcgUmVsZXZhbnQgU3ltYm9scyoqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBtb3N0IHJlbGV2YW50IGhlcmUuIGBNRU1PUllfRkFJTFVSRWAsIGBIV1BPSVNPTl9JTkpFQ1RgLCBgSFVHRVRMQl9QQUdFYCwgYW5kIGBTV0FQYCBhbGwgc2VlbSBsaWtlIGdvb2QgY2hvaWNlcyB0byBlbmFibGUgZm9yIHRlc3RpbmcuIE5vdywgbGV0JiMzOTtzIGRyaWxsIGRvd24gdG8gdGhlIGZ1bmN0aW9ucyB0aGVtc2VsdmVzLgoKSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSBzeW1ib2xzIHRoYXQgYXJlIGltcGFjdGVkIGJ5IHRoaXMgcGF0Y2guIEkgc2VlIHRoYXQgYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgaXMgYSBrZXkgZnVuY3Rpb247IEkganVzdCBjaGVja2VkLCBhbmQgaXQgKmlzKiBzdGF0aWMuIFRoZSByZWxhdGVkIGZ1bmN0aW9ucyBgdHR1X2Fub25fbGF6eWZyZWVfZm9saW9gLCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2AsIGB0dHVfYW5vbl9mb2xpb2AsIGFuZCBhbHNvIGB0cnlfdG9fdW5tYXBfb25lYCBhcmUgYWxsIHJlbGF0ZWQgdG8gdGhpcyBuZXcgYXJjaGl0ZWN0dXJlLgoKV2FpdCBhIHNlY29uZCwgYHRyeV90b191bm1hcF9vbmVgIGlzIHByb2JhYmx5IGEgdmVyeSBob3QgcGF0aDsgdGhhdCYjMzk7cyB0b28gZ2VuZXJpYyBhbmQgd291bGQgc2tldyB0aGUgdGVzdCByZXN1bHRzLiBMZXQmIzM5O3Mgc2VlLi4uIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGlzbiYjMzk7dCBzbyBob3QsIHdoaWNoIGlzIGdvb2QuIEhvd2V2ZXIsIGB0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb2AsIGB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvYCwgYW5kIGB0dHVfYW5vbl9mb2xpb2Agc3RpbGwgbWlnaHQgYmUgcHJldHR5IGhvdCwgYnV0IGl0JiMzOTtzIGltcG9ydGFudCB0byBjb25zaWRlciB0aGVtLiBBaCwgbm93LCBgdHR1X2Fub25fZm9saW9gIGlzIGNhbGxlZCBmb3IgKmV2ZXJ5KiBhbm9ueW1vdXMgcGFnZSB1bm1hcC4gVGhhdCYjMzk7cyAqdmVyeSogaG90LiBJIHNob3VsZCBhdm9pZCBpdC4gSG1tLCBtYXliZSBqdXN0IGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGFuZCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2A/IFdlbGwsIHRoZSBsYXp5ZnJlZSBvbmUgYW5kIHRoZSBzd2FwYmFja2VkIG9uZSBhcmUgdGhlIGtleS4KCkFuZCwganVzdCB0byBiZSBzdXJlLCBJJiMzOTtsbCBjb25maXJtIHRoYXQgYHR0dV9hbm9uX2ZvbGlvYCBpcyBzdGF0aWM7IHllcywgaXQgaXMuCgpUaGUgY29uZmlncyBJJiMzOTttIGNvbnNpZGVyaW5nIGFyZToKCiogICBgSFVHRVRMQl9QQUdFYAoqICAgYE1FTU9SWV9GQUlMVVJFYAoqICAgYEhXUE9JU09OX0lOSkVDVGAKKiAgIGBTV0FQYAoKVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIGBtbS9ybWFwLmNgIHJlbGF0ZWQgdG8gZm9saW8gdW5tYXBwaW5nLCB3aXRoIGEgZm9jdXMgb24gaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvcy4gVGhpcyBtZWFucyBpdCBhZmZlY3RzIGNvZGUgdGhhdCYjMzk7cyB1c2VkIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCBvcGVyYXRpb25zLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLiBUaGVyZWZvcmUsIEkgd2lsbCB1c2UgYHNldC1yZXN1bHRzYCB0byByZWNvcmQgdGhpcyBjaG9pY2Ugb2Ygc3ltYm9scyBhbmQgY29uZmlncy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xMyAwNToyNzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7SFVHRVRMQl9QQUdFJiMzNDssCiAgICAmIzM0O01FTU9SWV9GQUlMVVJFJiMzNDssCiAgICAmIzM0O0hXUE9JU09OX0lOSkVDVCYjMzQ7LAogICAgJiMzNDtTV0FQJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7dHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2xhenlmcmVlX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8mIzM0OywKICAgICYjMzQ7dHR1X2Fub25fZm9saW8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgaW4gbW0vcm1hcC5jIGZvciB1bm1hcHBpbmcgZm9saW9zLCBleHRyYWN0aW5nIGh1Z2V0bGIgYW5kIGFub255bW91cyBmb2xpbyB1bm1hcHBpbmcgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMuIFRoaXMgbW9kaWZpZXMgZnVuY3Rpb25hbCBjb2RlIHJlYWNoYWJsZSBkdXJpbmcgbWVtb3J5IHJlY2xhaW0sIHN3YXAsIGFuZCBoYXJkd2FyZSBwb2lzb24gaGFuZGxpbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0hVR0VUTEJfUEFHRSYjMzQ7LAogICAgJiMzNDtNRU1PUllfRkFJTFVSRSYjMzQ7LAogICAgJiMzNDtIV1BPSVNPTl9JTkpFQ1QmIzM0OywKICAgICYjMzQ7U1dBUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3RyeV90b191bm1hcF9odWdldGxiX29uZSYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpbyYjMzQ7LAogICAgJiMzNDt0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvJiMzNDssCiAgICAmIzM0O3R0dV9hbm9uX2ZvbGlvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3JtYXAuYyBmb3IgdW5tYXBwaW5nIGZvbGlvcywgZXh0cmFjdGluZyBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLiBUaGlzIG1vZGlmaWVzIGZ1bmN0aW9uYWwgY29kZSByZWFjaGFibGUgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NDYuODU3NzY0MTc2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjA4NTUyMTE0MDIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJNRU1PUllfRkFJTFVSRVwiLFxuICAgIFwiSFdQT0lTT05fSU5KRUNUXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJ0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS9ybWFwLmMgZm9yIHVubWFwcGluZyBmb2xpb3MsIGV4dHJhY3RpbmcgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gVGhpcyBtb2RpZmllcyBmdW5jdGlvbmFsIGNvZGUgcmVhY2hhYmxlIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCwgYW5kIGhhcmR3YXJlIHBvaXNvbiBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NDYuODU3NzY4ODE2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNzkxOTU5NzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCA0NjBmYzU4YmQ4MGM1ZTY4YTA4MmFlZDMzNWJmZWRhMGY2YjY4ODI4XFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBNb24gSnVsIDEzIDA1OjI2OjQ1IDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmhcXG5pbmRleCA0MTE1MDc2ZTQ5MjJhZS4uYmY3ZTE2M2UzNzc5ZDggMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9odWdldGxiLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaFxcbkBAIC0xMjcxLDYgKzEyNzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaHVnZXRsYl9jb3VudF9zdWIobG9uZyBsLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4gfVxcbiBcXG4gcHRlX3QgaHVnZV9wdGVwX2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7XFxuK3Vuc2lnbmVkIGxvbmcgaHVnZV9wdGVfZGlydHkocHRlX3QgcHRlKTtcXG4gXFxuIHN0YXRpYyBpbmxpbmUgcHRlX3QgaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApXFxuZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuY1xcbmluZGV4IDI2MTY2YTZiOGNiOWIxLi5mZTY3Y2U2Y2ViNWViMyAxMDA2NDRcXG4tLS0gYS9tbS9ybWFwLmNcXG4rKysgYi9tbS9ybWFwLmNcXG5AQCAtMTk3OCw2ICsxOTc4LDIyMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmb2xpb191bm1hcF9wdGVfYmF0Y2goc3RydWN0IGZvbGlvICpmb2xpbyxcXG4gXFx0XFx0XFx0XFx0ICAgICBGUEJfUkVTUEVDVF9XUklURSB8IEZQQl9SRVNQRUNUX1NPRlRfRElSVFkpO1xcbiB9XFxuIFxcbitzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUoc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxcbit7XFxuK1xcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcXG4rXFx0Y29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xcbitcXHRjb25zdCBlbnVtIHR0dV9mbGFncyBmbGFncyA9IChlbnVtIHR0dV9mbGFncykobG9uZylhcmc7XFxuK1xcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4rXFx0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcXG4rXFx0Ym9vbCByZXQgPSB0cnVlO1xcbitcXHRwdGVfdCBwdGV2YWw7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgdHJ5X3RvX3VubWFwKCkgaXMgb25seSBwYXNzZWQgYSBodWdldGxiIGZvbGlvIGluIHRoZSBjYXNlXFxuK1xcdCAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLlxcbitcXHQgKi9cXG4rXFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbyksIGZvbGlvKTtcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXFx1MDAyNiBUVFVfSFdQT0lTT04pKTtcXG4rXFxuK1xcdHJhbmdlLmVuZCA9IHZtYV9hZGRyZXNzX2VuZChcXHUwMDI2cHZtdyk7XFxuK1xcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFxcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVxcdTAwM2V2bV9tbSxcXG4rXFx0XFx0XFx0XFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcXG4rXFx0YWRqdXN0X3JhbmdlX2lmX3BtZF9zaGFyaW5nX3Bvc3NpYmxlKHZtYSwgXFx1MDAyNnJhbmdlLnN0YXJ0LCBcXHUwMDI2cmFuZ2UuZW5kKTtcXG4rXFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXFx1MDAyNnJhbmdlKTtcXG4rXFxuK1xcdC8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi9cXG4rXFx0aWYgKCFwYWdlX3ZtYV9tYXBwZWRfd2FsayhcXHUwMDI2cHZtdykpXFxuK1xcdFxcdGdvdG8gcmFuZ2VfZW5kO1xcbitcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKGFkZHJlc3MgIT0gcHZtdy5hZGRyZXNzKTtcXG4rXFxuK1xcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKCFwdGVfcHJlc2VudChwdGV2YWwpKTtcXG4rXFx0Vk1fV0FSTl9PTl9PTkNFKHB0ZV9wZm4ocHRldmFsKSAhPSBmb2xpb19wZm4oZm9saW8pKTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS4gVGhlcmUgaXMgbm8gd2F5IG9mXFxuK1xcdCAqIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heSBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3RcXG4rXFx0ICogZmx1c2ggdGhlbSBhbGwuIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xcbitcXHQgKiByYW5nZS5cXG4rXFx0ICovXFxuK1xcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGUgbW9kZS5cXG4rXFx0ICogQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHkgZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXFxuK1xcdCAqXFxuK1xcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4gTG9jayBvcmRlciBkaWN0YXRlc1xcbitcXHQgKiBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFIGlfbW1hcF9yd3NlbS4gV2UgY2FuIG9ubHkgdHJ5IGxvY2sgaGVyZSBhbmRcXG4rXFx0ICogZmFpbCBpZiB1bnN1Y2Nlc3NmdWwuXFxuK1xcdCAqL1xcbitcXHRpZiAoIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcXG4rXFx0XFx0c3RydWN0IG1tdV9nYXRoZXIgdGxiO1xcbitcXG4rXFx0XFx0Vk1fV0FSTl9PTighKGZsYWdzIFxcdTAwMjYgVFRVX1JNQVBfTE9DS0VEKSk7XFxuK1xcdFxcdGlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKSB7XFxuK1xcdFxcdFxcdHJldCA9IGZhbHNlO1xcbitcXHRcXHRcXHRnb3RvIHdhbGtfZG9uZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0dGxiX2dhdGhlcl9tbXVfdm1hKFxcdTAwMjZ0bGIsIHZtYSk7XFxuK1xcdFxcdGlmIChodWdlX3BtZF91bnNoYXJlKFxcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XFxuK1xcdFxcdFxcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xcbitcXHRcXHRcXHRodWdlX3BtZF91bnNoYXJlX2ZsdXNoKFxcdTAwMjZ0bGIsIHZtYSk7XFxuK1xcdFxcdFxcdHRsYl9maW5pc2hfbW11KFxcdTAwMjZ0bGIpO1xcbitcXHRcXHRcXHQvKlxcbitcXHRcXHRcXHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCwgY29uc2VxdWVudGx5IHVubWFwcGluZ1xcbitcXHRcXHRcXHQgKiB0aGUgZm9saW8uXFxuK1xcdFxcdFxcdCAqL1xcbitcXHRcXHRcXHRnb3RvIHdhbGtfZG9uZTtcXG4rXFx0XFx0fVxcbitcXHRcXHRodWdldGxiX3ZtYV91bmxvY2tfd3JpdGUodm1hKTtcXG4rXFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuK1xcdH1cXG4rXFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xcbitcXHRpZiAoaHVnZV9wdGVfZGlydHkocHRldmFsKSlcXG4rXFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcbitcXHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkoZm9saW9fcGFnZShmb2xpbywgMCkpKTtcXG4rXFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XFxuK1xcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTtcXG4rXFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XFxuK1xcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCAxKTtcXG4rXFxuK3dhbGtfZG9uZTpcXG4rXFx0cGFnZV92bWFfbWFwcGVkX3dhbGtfZG9uZShcXHUwMDI2cHZtdyk7XFxuK3JhbmdlX2VuZDpcXG4rXFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFxcdTAwMjZyYW5nZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxcbit7XFxuK1xcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIFN5bmNocm9uaXplIHdpdGggZ3VwX3B0ZV9yYW5nZSgpOlxcbitcXHQgKiAtIGNsZWFyIFBURTsgYmFycmllcjsgcmVhZCByZWZjb3VudFxcbitcXHQgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEVcXG4rXFx0ICovXFxuK1xcdHNtcF9tYigpO1xcbitcXG4rXFx0cmVmX2NvdW50ID0gZm9saW9fcmVmX2NvdW50KGZvbGlvKTtcXG4rXFx0bWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pO1xcbitcXG4rXFx0LypcXG4rXFx0ICogT3JkZXIgcmVhZHMgZm9yIHBhZ2UgcmVmY291bnQgYW5kIGRpcnR5IGZsYWdcXG4rXFx0ICogKHNlZSBjb21tZW50cyBpbiBfX3JlbW92ZV9tYXBwaW5nKCkpLlxcbitcXHQgKi9cXG4rXFx0c21wX3JtYigpO1xcbitcXG4rXFx0aWYgKGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2ICEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogcmVkaXJ0aWVkIGVpdGhlciB1c2luZyB0aGUgcGFnZSB0YWJsZSBvciBhIHByZXZpb3VzbHlcXG4rXFx0XFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGZvbGlvX3NldF9zd2FwYmFja2VkKGZvbGlvKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBBZGRpdGlvbmFsIHJlZmVyZW5jZXMgY291bGQgYmUgZHVlIHRvIEdVUCBvciBzcGVjdWxhdGl2ZSBsb29rdXBzLlxcbitcXHQgKiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpbyBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uXFxuK1xcdCAqIFRoaXMgZm9saW8gY2Fubm90IGJlIHJlY2xhaW1lZCByaWdodCBub3cgZWl0aGVyIHdheSwgc28gYWN0IGp1c3RcXG4rXFx0ICogbGlrZSBub3RoaW5nIGhhcHBlbmVkLiBXZSdsbCBjb21lIGJhY2sgaGVyZSBsYXRlciBhbmQgZGV0ZWN0IGlmIHRoZVxcbitcXHQgKiBmb2xpbyB3YXMgZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxcbitcXHQgKi9cXG4rXFx0aWYgKHJlZl9jb3VudCAhPSAxICsgbWFwX2NvdW50KVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRhZGRfbW1fY291bnRlcih2bWEtXFx1MDAzZXZtX21tLCBNTV9BTk9OUEFHRVMsIC1ucl9wYWdlcyk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgcHRlX3Qgc3dwX3B0ZV9wcmVwYXJlKHN3cF9lbnRyeV90IGVudHJ5LCBwdGVfdCBvbGRfcHRlLFxcbitcXHRcXHRib29sIGFub25fZXhjbHVzaXZlKVxcbit7XFxuK1xcdHB0ZV90IHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcXG4rXFxuK1xcdGlmIChhbm9uX2V4Y2x1c2l2ZSlcXG4rXFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtleGNsdXNpdmUoc3dwX3B0ZSk7XFxuK1xcbitcXHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KG9sZF9wdGUpKSkge1xcbitcXHRcXHRpZiAocHRlX3NvZnRfZGlydHkob2xkX3B0ZSkpXFxuK1xcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4rXFx0XFx0aWYgKHB0ZV91ZmZkKG9sZF9wdGUpKVxcbitcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdC8qIERldmljZS1leGNsdXNpdmUgZW50cnkgKi9cXG4rXFx0XFx0aWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShvbGRfcHRlKSlcXG4rXFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbitcXHRcXHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxcbitcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiBzd3BfcHRlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbitcXHRcXHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKVxcbit7XFxuK1xcdGNvbnN0IGJvb2wgYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFxcdTAwMjZcXHUwMDI2XFxuK1xcdFxcdFxcdFxcdCAgICBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcXG4rXFx0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkocGFnZSk7XFxuK1xcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4rXFxuK1xcdGlmIChmb2xpb19kdXBfc3dhcChmb2xpbywgcGFnZSkgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXFxuK1xcdCAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLFxcbitcXHQgKiBzbyB3ZSdsbCBub3QgY2hlY2svY2FyZS5cXG4rXFx0ICovXFxuK1xcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFxcdTAwM2MgMCkge1xcbitcXHRcXHRmb2xpb19wdXRfc3dhcChmb2xpbywgcGFnZSk7XFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFx0fVxcbitcXG4rXFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbitcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjYgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHBhZ2UpKSB7XFxuK1xcdFxcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRtbV9wcmVwYXJlX2Zvcl9zd2FwX2VudHJpZXMobW0pO1xcbitcXHRkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTtcXG4rXFx0aW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTtcXG4rXFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlcCxcXG4rXFx0XFx0ICAgc3dwX3B0ZV9wcmVwYXJlKGVudHJ5LCBwdGV2YWwsIGFub25fZXhjbHVzaXZlKSk7XFxuK1xcdHJldHVybiB0cnVlO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCB0dHVfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0c3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXAsXFxuK1xcdFxcdHB0ZV90IHB0ZXZhbCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcylcXG4re1xcbitcXHQvKlxcbitcXHQgKiBTdG9yZSB0aGUgc3dhcCBsb2NhdGlvbiBpbiB0aGUgcHRlLlxcbitcXHQgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLlxcbitcXHQgKi9cXG4rXFx0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pICE9XFxuK1xcdFxcdFxcdCBmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcbitcXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpXFxuK1xcdFxcdHJldHVybiB0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpbyh2bWEsIGZvbGlvLCBucl9wYWdlcyk7XFxuK1xcbitcXHQvKiBucl9wYWdlcyBcXHUwMDNlIDEgbm90IHN1cHBvcnRlZCB5ZXQgKi9cXG4rXFx0cmV0dXJuIHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW8odm1hLCBmb2xpbywgcGFnZSwgYWRkcmVzcywgcHRlcCxcXG4rXFx0XFx0XFx0XFx0XFx0IHB0ZXZhbCk7XFxuK31cXG4rXFxuIC8qXFxuICAqIEBhcmc6IGVudW0gdHR1X2ZsYWdzIHdpbGwgYmUgcGFzc2VkIHRvIHRoaXMgYXJndW1lbnRcXG4gICovXFxuQEAgLTE5ODYsMTQgKzIyMDAsMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4ge1xcbiBcXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuIFxcdERFRklORV9GT0xJT19WTUFfV0FMSyhwdm13LCBmb2xpbywgdm1hLCBhZGRyZXNzLCAwKTtcXG4tXFx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSwgcmV0ID0gdHJ1ZTtcXG4rXFx0Ym9vbCByZXQgPSB0cnVlO1xcbiBcXHRwdGVfdCBwdGV2YWw7XFxuLVxcdHN0cnVjdCBwYWdlICpzdWJwYWdlO1xcbitcXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcXG4gXFx0c3RydWN0IG1tdV9ub3RpZmllcl9yYW5nZSByYW5nZTtcXG4gXFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xcbiBcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzID0gMSwgZW5kX2FkZHI7XFxuIFxcdHVuc2lnbmVkIGxvbmcgcGZuO1xcbi1cXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XFxuIFxcdGludCBwdGVzID0gMDtcXG4gXFxuIFxcdC8qXFxuQEAgLTIwMDcsOCArMjIyMCw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBGb3IgVEhQLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGUgd29yc2UgY2FzZSBpZSBwbWQgZm9yIGludmFsaWRhdGlvbi5cXG4tXFx0ICogRm9yIGh1Z2V0bGIsIGl0IGNvdWxkIGJlIG11Y2ggd29yc2UgaWYgd2UgbmVlZCB0byBkbyBwdWRcXG4tXFx0ICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLlxcbiBcXHQgKlxcbiBcXHQgKiBOb3RlIHRoYXQgdGhlIGZvbGlvIGNhbiBub3QgYmUgZnJlZWQgaW4gdGhpcyBmdW5jdGlvbiBhcyBjYWxsIG9mXFxuIFxcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZm9saW8uXFxuQEAgLTIwMTYsMTcgKzIyMjcsNiBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbiBcXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXFx1MDAyNnB2bXcpO1xcbiBcXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cXHUwMDNldm1fbW0sXFxuIFxcdFxcdFxcdFxcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XFxuLVxcdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZFxcbi1cXHRcXHQgKiBhY2NvcmRpbmdseS5cXG4tXFx0XFx0ICovXFxuLVxcdFxcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFxcdTAwMjZyYW5nZS5zdGFydCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgICBcXHUwMDI2cmFuZ2UuZW5kKTtcXG4tXFxuLVxcdFxcdC8qIFdlIG5lZWQgdGhlIGh1Z2UgcGFnZSBzaXplIGZvciBzZXRfaHVnZV9wdGVfYXQoKSAqL1xcbi1cXHRcXHRoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xcbi1cXHR9XFxuIFxcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFxcdTAwMjZyYW5nZSk7XFxuIFxcbiBcXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXFx1MDAyNnB2bXcpKSB7XFxuQEAgLTIxMTEsNjUgKzIzMTEsMTEgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4gXFx0XFx0XFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7XFxuIFxcbiBcXHRcXHRcXHRwZm4gPSBzb2Z0bGVhZl90b19wZm4oZW50cnkpO1xcbi1cXHRcXHRcXHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTtcXG4gXFx0XFx0fVxcbiBcXG4tXFx0XFx0c3VicGFnZSA9IGZvbGlvX3BhZ2UoZm9saW8sIHBmbiAtIGZvbGlvX3Bmbihmb2xpbykpO1xcbi1cXHRcXHRhbm9uX2V4Y2x1c2l2ZSA9IGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0XFx0XFx0IFBhZ2VBbm9uRXhjbHVzaXZlKHN1YnBhZ2UpO1xcbi1cXG4tXFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcXG4tXFx0XFx0XFx0Ym9vbCBhbm9uID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKTtcXG4tXFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgcGFnZVxcbi1cXHRcXHRcXHQgKiBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgaHVnZXRsYiBwYWdlIGlzIHBvaXNvbmVkLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0Vk1fQlVHX09OX1BBR0UoIVBhZ2VIV1BvaXNvbihzdWJwYWdlKSwgc3VicGFnZSk7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS5cXG4tXFx0XFx0XFx0ICogVGhlcmUgaXMgbm8gd2F5IG9mIGtub3dpbmcgZXhhY3RseSB3aGljaCBQTURzIG1heVxcbi1cXHRcXHRcXHQgKiBiZSBjYWNoZWQgZm9yIHRoaXMgbW0sIHNvIHdlIG11c3QgZmx1c2ggdGhlbSBhbGwuXFxuLVxcdFxcdFxcdCAqIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xcbi1cXHRcXHRcXHQgKiByYW5nZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XFxuK1xcdFxcdHBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcXG4gXFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFRvIGNhbGwgaHVnZV9wbWRfdW5zaGFyZSwgaV9tbWFwX3J3c2VtIG11c3QgYmVcXG4tXFx0XFx0XFx0ICogaGVsZCBpbiB3cml0ZSBtb2RlLiAgQ2FsbGVyIG5lZWRzIHRvIGV4cGxpY2l0bHlcXG4tXFx0XFx0XFx0ICogZG8gdGhpcyBvdXRzaWRlIHJtYXAgcm91dGluZXMuXFxuLVxcdFxcdFxcdCAqXFxuLVxcdFxcdFxcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS5cXG4tXFx0XFx0XFx0ICogTG9jayBvcmRlciBkaWN0YXRlcyBhY3F1aXJpbmcgdm1hX2xvY2sgQkVGT1JFXFxuLVxcdFxcdFxcdCAqIGlfbW1hcF9yd3NlbS4gIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWxcXG4tXFx0XFx0XFx0ICogaWYgdW5zdWNjZXNzZnVsLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aWYgKCFhbm9uKSB7XFxuLVxcdFxcdFxcdFxcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcXG4tXFxuLVxcdFxcdFxcdFxcdFZNX0JVR19PTighKGZsYWdzIFxcdTAwMjYgVFRVX1JNQVBfTE9DS0VEKSk7XFxuLVxcdFxcdFxcdFxcdGlmICghaHVnZXRsYl92bWFfdHJ5bG9ja193cml0ZSh2bWEpKVxcbi1cXHRcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuLVxcbi1cXHRcXHRcXHRcXHR0bGJfZ2F0aGVyX21tdV92bWEoXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0aWYgKGh1Z2VfcG1kX3Vuc2hhcmUoXFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcXG4tXFx0XFx0XFx0XFx0XFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XFxuLVxcdFxcdFxcdFxcdFxcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXFx1MDAyNnRsYiwgdm1hKTtcXG4tXFx0XFx0XFx0XFx0XFx0dGxiX2ZpbmlzaF9tbXUoXFx1MDAyNnRsYik7XFxuLVxcdFxcdFxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdFxcdFxcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLFxcbi1cXHRcXHRcXHRcXHRcXHQgKiBjb25zZXF1ZW50bHkgdW5tYXBwaW5nIHRoZSBmb2xpby5cXG4tXFx0XFx0XFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdFxcdFxcdGdvdG8gd2Fsa19kb25lO1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdFxcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xcbi1cXHRcXHRcXHRcXHR0bGJfZmluaXNoX21tdShcXHUwMDI2dGxiKTtcXG4tXFx0XFx0XFx0fVxcbi1cXHRcXHRcXHRwdGV2YWwgPSBodWdlX3B0ZXBfY2xlYXJfZmx1c2godm1hLCBhZGRyZXNzLCBwdm13LnB0ZSk7XFxuLVxcdFxcdFxcdGlmIChwdGVfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdFxcdH0gZWxzZSBpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XFxuK1xcdFxcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkpIHtcXG4gXFx0XFx0XFx0bnJfcGFnZXMgPSBmb2xpb191bm1hcF9wdGVfYmF0Y2goZm9saW8sIFxcdTAwMjZwdm13LCBmbGFncywgcHRldmFsKTtcXG4gXFx0XFx0XFx0ZW5kX2FkZHIgPSBhZGRyZXNzICsgbnJfcGFnZXMgKiBQQUdFX1NJWkU7XFxuIFxcdFxcdFxcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xcbkBAIC0yMjA0LDE2ICsyMzUwLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdC8qIFVwZGF0ZSBoaWdoIHdhdGVybWFyayBiZWZvcmUgd2UgbG93ZXIgcnNzICovXFxuIFxcdFxcdHVwZGF0ZV9oaXdhdGVyX3JzcyhtbSk7XFxuIFxcbi1cXHRcXHRpZiAoUGFnZUhXUG9pc29uKHN1YnBhZ2UpIFxcdTAwMjZcXHUwMDI2IChmbGFncyBcXHUwMDI2IFRUVV9IV1BPSVNPTikpIHtcXG4tXFx0XFx0XFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcXG4tXFx0XFx0XFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XFxuLVxcdFxcdFxcdFxcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCxcXG4tXFx0XFx0XFx0XFx0XFx0XFx0aHN6KTtcXG4tXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdH1cXG4rXFx0XFx0LyogV2l0aCBUVFVfSFdQT0lTT04sIHdlIG9ubHkgZXhwZWN0IHNtYWxsIGZvbGlvcyBoZXJlLiAqL1xcbitcXHRcXHRpZiAoZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbykgXFx1MDAyNlxcdTAwMjYgKGZsYWdzIFxcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xcbitcXHRcXHRcXHRwdGV2YWwgPSBzd3BfZW50cnlfdG9fcHRlKG1ha2VfaHdwb2lzb25fZW50cnkocGFnZSkpO1xcbitcXHRcXHRcXHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xcbitcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcXG4gXFx0XFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXFx1MDAyNlxcdTAwMjYgcHRlX3VudXNlZChwdGV2YWwpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdFxcdFxcdCAgICF1c2VyZmF1bHRmZF9hcm1lZCh2bWEpKSB7XFxuIFxcdFxcdFxcdC8qXFxuQEAgLTIyMjgsMTA0ICsyMzY5LDEzIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xcbiBcXHRcXHR9IGVsc2UgaWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcXG4tXFx0XFx0XFx0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkoc3VicGFnZSk7XFxuLVxcdFxcdFxcdHB0ZV90IHN3cF9wdGU7XFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIFN0b3JlIHRoZSBzd2FwIGxvY2F0aW9uIGluIHRoZSBwdGUuXFxuLVxcdFxcdFxcdCAqIFNlZSBoYW5kbGVfcHRlX2ZhdWx0KCkgLi4uXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSAhPVxcbi1cXHRcXHRcXHRcXHRcXHRmb2xpb190ZXN0X3N3YXBjYWNoZShmb2xpbykpKSB7XFxuLVxcdFxcdFxcdFxcdFdBUk5fT05fT05DRSgxKTtcXG4tXFx0XFx0XFx0XFx0Z290byB3YWxrX2Fib3J0O1xcbi1cXHRcXHRcXHR9XFxuLVxcbi1cXHRcXHRcXHQvKiBNQURWX0ZSRUUgcGFnZSBjaGVjayAqL1xcbi1cXHRcXHRcXHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcXG4tXFx0XFx0XFx0XFx0aW50IHJlZl9jb3VudCwgbWFwX2NvdW50O1xcbi1cXG4tXFx0XFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0XFx0ICogU3luY2hyb25pemUgd2l0aCBndXBfcHRlX3JhbmdlKCk6XFxuLVxcdFxcdFxcdFxcdCAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50XFxuLVxcdFxcdFxcdFxcdCAqIC0gaW5jIHJlZmNvdW50OyBiYXJyaWVyOyByZWFkIFBURVxcbi1cXHRcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0XFx0c21wX21iKCk7XFxuLVxcbi1cXHRcXHRcXHRcXHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRtYXBfY291bnQgPSBmb2xpb19tYXBjb3VudChmb2xpbyk7XFxuLVxcbi1cXHRcXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHQgKiBPcmRlciByZWFkcyBmb3IgcGFnZSByZWZjb3VudCBhbmQgZGlydHkgZmxhZ1xcbi1cXHRcXHRcXHRcXHQgKiAoc2VlIGNvbW1lbnRzIGluIF9fcmVtb3ZlX21hcHBpbmcoKSkuXFxuLVxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRzbXBfcm1iKCk7XFxuLVxcbi1cXHRcXHRcXHRcXHRpZiAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXFx1MDAyNlxcdTAwMjYgISh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fRFJPUFBBQkxFKSkge1xcbi1cXHRcXHRcXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHRcXHRcXHQgKiByZWRpcnRpZWQgZWl0aGVyIHVzaW5nIHRoZSBwYWdlIHRhYmxlIG9yIGEgcHJldmlvdXNseVxcbi1cXHRcXHRcXHRcXHRcXHQgKiBvYnRhaW5lZCBHVVAgcmVmZXJlbmNlLlxcbi1cXHRcXHRcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0XFx0XFx0c2V0X3B0ZXMobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKTtcXG4tXFx0XFx0XFx0XFx0XFx0Zm9saW9fc2V0X3N3YXBiYWNrZWQoZm9saW8pO1xcbi1cXHRcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuLVxcdFxcdFxcdFxcdH0gZWxzZSBpZiAocmVmX2NvdW50ICE9IDEgKyBtYXBfY291bnQpIHtcXG4tXFx0XFx0XFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0XFx0XFx0ICogQWRkaXRpb25hbCByZWZlcmVuY2UuIENvdWxkIGJlIGEgR1VQIHJlZmVyZW5jZSBvciBhbnlcXG4tXFx0XFx0XFx0XFx0XFx0ICogc3BlY3VsYXRpdmUgcmVmZXJlbmNlLiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpb1xcbi1cXHRcXHRcXHRcXHRcXHQgKiBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uIFRoaXMgZm9saW8gY2Fubm90IGJlXFxuLVxcdFxcdFxcdFxcdFxcdCAqIHJlY2xhaW1lZCByaWdodCBub3cgZWl0aGVyIHdheSwgc28gYWN0IGp1c3QgbGlrZSBub3RoaW5nXFxuLVxcdFxcdFxcdFxcdFxcdCAqIGhhcHBlbmVkLlxcbi1cXHRcXHRcXHRcXHRcXHQgKiBXZSdsbCBjb21lIGJhY2sgaGVyZSBsYXRlciBhbmQgZGV0ZWN0IGlmIHRoZSBmb2xpbyB3YXNcXG4tXFx0XFx0XFx0XFx0XFx0ICogZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxcbi1cXHRcXHRcXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0XFx0XFx0c2V0X3B0ZXMobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKTtcXG4tXFx0XFx0XFx0XFx0XFx0Z290byB3YWxrX2Fib3J0O1xcbi1cXHRcXHRcXHRcXHR9XFxuLVxcdFxcdFxcdFxcdGFkZF9tbV9jb3VudGVyKG1tLCBNTV9BTk9OUEFHRVMsIC1ucl9wYWdlcyk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gZGlzY2FyZDtcXG4tXFx0XFx0XFx0fVxcbi1cXG4tXFx0XFx0XFx0aWYgKGZvbGlvX2R1cF9zd2FwKGZvbGlvLCBzdWJwYWdlKSBcXHUwMDNjIDApIHtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuK1xcdFxcdFxcdGlmICghdHR1X2Fub25fZm9saW8odm1hLCBmb2xpbywgcGFnZSwgYWRkcmVzcyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgIHB2bXcucHRlLCBwdGV2YWwsIG5yX3BhZ2VzKSkge1xcbitcXHRcXHRcXHRcXHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xcbiBcXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuIFxcdFxcdFxcdH1cXG4gXFxuLVxcdFxcdFxcdC8qXFxuLVxcdFxcdFxcdCAqIGFyY2hfdW5tYXBfb25lKCkgaXMgZXhwZWN0ZWQgdG8gYmUgYSBOT1Agb25cXG4tXFx0XFx0XFx0ICogYXJjaGl0ZWN0dXJlcyB3aGVyZSB3ZSBjb3VsZCBoYXZlIFBGTiBzd2FwIFBURXMsXFxuLVxcdFxcdFxcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aWYgKGFyY2hfdW5tYXBfb25lKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZXZhbCkgXFx1MDAzYyAwKSB7XFxuLVxcdFxcdFxcdFxcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBzdWJwYWdlKTtcXG4tXFx0XFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCk7XFxuLVxcdFxcdFxcdFxcdGdvdG8gd2Fsa19hYm9ydDtcXG4tXFx0XFx0XFx0fVxcbi1cXG4tXFx0XFx0XFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xcbi1cXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUgXFx1MDAyNlxcdTAwMjZcXG4tXFx0XFx0XFx0ICAgIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcHRlKGZvbGlvLCBzdWJwYWdlKSkge1xcbi1cXHRcXHRcXHRcXHRmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7XFxuLVxcdFxcdFxcdFxcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xcbi1cXHRcXHRcXHRcXHRnb3RvIHdhbGtfYWJvcnQ7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcXG4tXFx0XFx0XFx0ZGVjX21tX2NvdW50ZXIobW0sIE1NX0FOT05QQUdFUyk7XFxuLVxcdFxcdFxcdGluY19tbV9jb3VudGVyKG1tLCBNTV9TV0FQRU5UUyk7XFxuLVxcdFxcdFxcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKGFub25fZXhjbHVzaXZlKVxcbi1cXHRcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta2V4Y2x1c2l2ZShzd3BfcHRlKTtcXG4tXFx0XFx0XFx0aWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3NvZnRfZGlydHkocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3VmZmQocHRldmFsKSlcXG4tXFx0XFx0XFx0XFx0XFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWt1ZmZkKHN3cF9wdGUpO1xcbi1cXHRcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRcXHRpZiAocHRlX3N3cF9zb2Z0X2RpcnR5KHB0ZXZhbCkpXFxuLVxcdFxcdFxcdFxcdFxcdHN3cF9wdGUgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShzd3BfcHRlKTtcXG4tXFx0XFx0XFx0XFx0aWYgKHB0ZV9zd3BfdWZmZChwdGV2YWwpKVxcbi1cXHRcXHRcXHRcXHRcXHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XFxuLVxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUpO1xcbitcXHRcXHRcXHRnb3RvIGZpbmlzaF91bm1hcDtcXG4gXFx0XFx0fSBlbHNlIHtcXG4gXFx0XFx0XFx0LypcXG4gXFx0XFx0XFx0ICogVGhpcyBpcyBhIGxvY2tlZCBmaWxlLWJhY2tlZCBmb2xpbyxcXG5AQCAtMjM0MCwxMiArMjM5MCw4IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdFxcdFxcdCAqL1xcbiBcXHRcXHRcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLW5yX3BhZ2VzKTtcXG4gXFx0XFx0fVxcbi1kaXNjYXJkOlxcbi1cXHRcXHRpZiAodW5saWtlbHkoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkpIHtcXG4tXFx0XFx0XFx0aHVnZXRsYl9yZW1vdmVfcm1hcChmb2xpbyk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xcbi1cXHRcXHR9XFxuK2ZpbmlzaF91bm1hcDpcXG4rXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgbnJfcGFnZXMsIHZtYSk7XFxuIFxcdFxcdGlmICh2bWEtXFx1MDAzZXZtX2ZsYWdzIFxcdTAwMjYgVk1fTE9DS0VEKVxcbiBcXHRcXHRcXHRtbG9ja19kcmFpbl9sb2NhbCgpO1xcbiBcXHRcXHRmb2xpb19wdXRfcmVmcyhmb2xpbywgbnJfcGFnZXMpO1xcbkBAIC0yMzkzLDcgKzI0MzksOCBAQCBzdGF0aWMgaW50IGZvbGlvX25vdF9tYXBwZWQoc3RydWN0IGZvbGlvICpmb2xpbylcXG4gdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXFxuIHtcXG4gXFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcXG4tXFx0XFx0LnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSxcXG4rXFx0XFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSA/XFxuK1xcdFxcdFxcdFxcdHRyeV90b191bm1hcF9odWdldGxiX29uZSA6IHRyeV90b191bm1hcF9vbmUsXFxuIFxcdFxcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxcbiBcXHRcXHQuZG9uZSA9IGZvbGlvX25vdF9tYXBwZWQsXFxuIFxcdFxcdC5hbm9uX2xvY2sgPSBmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEzVDA1OjI2OjQ3LjIzNzU4Nzk0M1oiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjA0NzUzNzc2MzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJNRU1PUllfRkFJTFVSRVwiLFxuICAgIFwiSFdQT0lTT05fSU5KRUNUXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJ0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS9ybWFwLmMgZm9yIHVubWFwcGluZyBmb2xpb3MsIGV4dHJhY3RpbmcgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gVGhpcyBtb2RpZmllcyBmdW5jdGlvbmFsIGNvZGUgcmVhY2hhYmxlIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCwgYW5kIGhhcmR3YXJlIHBvaXNvbiBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZVxuaWYgaXQgbWFrZXMgZnVuY3Rpb25hbCBjaGFuZ2VzIHRvIHRoZSBrZXJuZWwgdGhhdCBzaG91bGQgYmUgZnV6emVkLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiB5b3VyIGludGVybmFsIGtub3dsZWRnZSBvZiB0aGUga2VybmVsLiBZb3UgbXVzdCBhY3RpdmVseVxudXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy5cblxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBpZiB0aGUgcGF0Y2ggb25seSBjb250YWluczpcbi0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy5cbi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuXG4tIENoYW5nZXMgdG8gbnVtZXJpYyBjb25zdGFudHMgb3IgbWFjcm9zIHRoYXQgZG8gbm90IGZ1bmN0aW9uYWxseSBhbHRlciBleGVjdXRpb24gZmxvdy5cbi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLFxuZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuXG5JZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoXG50b29scyB0byB2ZXJpZnkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLCB0aGVuIHJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZS5cblxuV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086XG4xLiBFeHRyYWN0IGFueSBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGhlYXZpbHkgZnV6emVkIGludG8gRm9jdXNTeW1ib2xzLlxuICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIERvIG5vdCBsaXN0IHRvbyBnZW5lcmljIGNvbmZpZ3MgKHdlIGFscmVhZHkgaGF2ZSB0aGVtIGVuYWJsZWQpLiBPbmx5IGxpc3QgdGhvc2UgdGhhdFxuICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LFxuICAgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0NjBmYzU4YmQ4MGM1ZTY4YTA4MmFlZDMzNWJmZWRhMGY2YjY4ODI4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBKdWwgMTMgMDU6MjY6NDUgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oXG5pbmRleCA0MTE1MDc2ZTQ5MjJhZS4uYmY3ZTE2M2UzNzc5ZDggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaFxuKysrIGIvaW5jbHVkZS9saW51eC9odWdldGxiLmhcbkBAIC0xMjcxLDYgKzEyNzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgaHVnZXRsYl9jb3VudF9zdWIobG9uZyBsLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSlcbiB9XG4gXG4gcHRlX3QgaHVnZV9wdGVwX2dldChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7XG4rdW5zaWduZWQgbG9uZyBodWdlX3B0ZV9kaXJ0eShwdGVfdCBwdGUpO1xuIFxuIHN0YXRpYyBpbmxpbmUgcHRlX3QgaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIFx0XHRcdFx0XHQgIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApXG5kaWZmIC0tZ2l0IGEvbW0vcm1hcC5jIGIvbW0vcm1hcC5jXG5pbmRleCAyNjE2NmE2YjhjYjliMS4uZmU2N2NlNmNlYjVlYjMgMTAwNjQ0XG4tLS0gYS9tbS9ybWFwLmNcbisrKyBiL21tL3JtYXAuY1xuQEAgLTE5NzgsNiArMTk3OCwyMjAgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZm9saW9fdW5tYXBfcHRlX2JhdGNoKHN0cnVjdCBmb2xpbyAqZm9saW8sXG4gXHRcdFx0XHQgICAgIEZQQl9SRVNQRUNUX1dSSVRFIHwgRlBCX1JFU1BFQ1RfU09GVF9ESVJUWSk7XG4gfVxuIFxuK3N0YXRpYyBib29sIHRyeV90b191bm1hcF9odWdldGxiX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuK1x0XHRzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB2b2lkICphcmcpXG4re1xuK1x0REVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIGZvbGlvLCB2bWEsIGFkZHJlc3MsIDApO1xuK1x0Y29uc3QgdW5zaWduZWQgbG9uZyBoc3ogPSBodWdlX3BhZ2Vfc2l6ZShoc3RhdGVfdm1hKHZtYSkpO1xuK1x0Y29uc3QgZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuK1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4rXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuK1x0Ym9vbCByZXQgPSB0cnVlO1xuK1x0cHRlX3QgcHRldmFsO1xuK1xuK1x0LypcbitcdCAqIFRoZSB0cnlfdG9fdW5tYXAoKSBpcyBvbmx5IHBhc3NlZCBhIGh1Z2V0bGIgZm9saW8gaW4gdGhlIGNhc2VcbitcdCAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLlxuK1x0ICovXG4rXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2h3cG9pc29uKGZvbGlvKSwgZm9saW8pO1xuK1x0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXHUwMDI2IFRUVV9IV1BPSVNPTikpO1xuK1xuK1x0cmFuZ2UuZW5kID0gdm1hX2FkZHJlc3NfZW5kKFx1MDAyNnB2bXcpO1xuK1x0bW11X25vdGlmaWVyX3JhbmdlX2luaXQoXHUwMDI2cmFuZ2UsIE1NVV9OT1RJRllfQ0xFQVIsIDAsIHZtYS1cdTAwM2V2bV9tbSxcbitcdFx0XHRcdGFkZHJlc3MsIHJhbmdlLmVuZCk7XG4rXHRhZGp1c3RfcmFuZ2VfaWZfcG1kX3NoYXJpbmdfcG9zc2libGUodm1hLCBcdTAwMjZyYW5nZS5zdGFydCwgXHUwMDI2cmFuZ2UuZW5kKTtcbitcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbitcbitcdC8qIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgbWFwcGluZyBpbiBhIFZNQS4gKi9cbitcdGlmICghcGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpXG4rXHRcdGdvdG8gcmFuZ2VfZW5kO1xuK1xuK1x0Vk1fV0FSTl9PTl9PTkNFKGFkZHJlc3MgIT0gcHZtdy5hZGRyZXNzKTtcbitcbitcdHB0ZXZhbCA9IGh1Z2VfcHRlcF9nZXQobW0sIGFkZHJlc3MsIHB2bXcucHRlKTtcbitcdFZNX1dBUk5fT05fT05DRSghcHRlX3ByZXNlbnQocHRldmFsKSk7XG4rXHRWTV9XQVJOX09OX09OQ0UocHRlX3BmbihwdGV2YWwpICE9IGZvbGlvX3Bmbihmb2xpbykpO1xuK1xuK1x0LypcbitcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS4gVGhlcmUgaXMgbm8gd2F5IG9mXG4rXHQgKiBrbm93aW5nIGV4YWN0bHkgd2hpY2ggUE1EcyBtYXkgYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0XG4rXHQgKiBmbHVzaCB0aGVtIGFsbC4gc3RhcnQvZW5kIHdlcmUgYWxyZWFkeSBhZGp1c3RlZCBhYm92ZSB0byBjb3ZlciB0aGlzXG4rXHQgKiByYW5nZS5cbitcdCAqL1xuK1x0Zmx1c2hfY2FjaGVfcmFuZ2Uodm1hLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbitcbitcdC8qXG4rXHQgKiBUbyBjYWxsIGh1Z2VfcG1kX3Vuc2hhcmUsIGlfbW1hcF9yd3NlbSBtdXN0IGJlIGhlbGQgaW4gd3JpdGUgbW9kZS5cbitcdCAqIENhbGxlciBuZWVkcyB0byBleHBsaWNpdGx5IGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLlxuK1x0ICpcbitcdCAqIFdlIGFsc28gbXVzdCBob2xkIGh1Z2V0bGIgdm1hX2xvY2sgaW4gd3JpdGUgbW9kZS4gTG9jayBvcmRlciBkaWN0YXRlc1xuK1x0ICogYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRSBpX21tYXBfcndzZW0uIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kXG4rXHQgKiBmYWlsIGlmIHVuc3VjY2Vzc2Z1bC5cbitcdCAqL1xuK1x0aWYgKCFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XG4rXHRcdHN0cnVjdCBtbXVfZ2F0aGVyIHRsYjtcbitcbitcdFx0Vk1fV0FSTl9PTighKGZsYWdzIFx1MDAyNiBUVFVfUk1BUF9MT0NLRUQpKTtcbitcdFx0aWYgKCFodWdldGxiX3ZtYV90cnlsb2NrX3dyaXRlKHZtYSkpIHtcbitcdFx0XHRyZXQgPSBmYWxzZTtcbitcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbitcdFx0fVxuK1xuK1x0XHR0bGJfZ2F0aGVyX21tdV92bWEoXHUwMDI2dGxiLCB2bWEpO1xuK1x0XHRpZiAoaHVnZV9wbWRfdW5zaGFyZShcdTAwMjZ0bGIsIHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpKSB7XG4rXHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4rXHRcdFx0aHVnZV9wbWRfdW5zaGFyZV9mbHVzaChcdTAwMjZ0bGIsIHZtYSk7XG4rXHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbitcdFx0XHQvKlxuK1x0XHRcdCAqIFRoZSBQTUQgdGFibGUgd2FzIHVubWFwcGVkLCBjb25zZXF1ZW50bHkgdW5tYXBwaW5nXG4rXHRcdFx0ICogdGhlIGZvbGlvLlxuK1x0XHRcdCAqL1xuK1x0XHRcdGdvdG8gd2Fsa19kb25lO1xuK1x0XHR9XG4rXHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuK1x0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuK1x0fVxuK1x0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuK1x0aWYgKGh1Z2VfcHRlX2RpcnR5KHB0ZXZhbCkpXG4rXHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuK1xuK1x0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KGZvbGlvX3BhZ2UoZm9saW8sIDApKSk7XG4rXHRodWdldGxiX2NvdW50X3N1Yihmb2xpb19ucl9wYWdlcyhmb2xpbyksIG1tKTtcbitcdHNldF9odWdlX3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgaHN6KTtcbitcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuK1x0Zm9saW9fcHV0X3JlZnMoZm9saW8sIDEpO1xuK1xuK3dhbGtfZG9uZTpcbitcdHBhZ2Vfdm1hX21hcHBlZF93YWxrX2RvbmUoXHUwMDI2cHZtdyk7XG4rcmFuZ2VfZW5kOlxuK1x0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBib29sIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuK3tcbitcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcbitcbitcdC8qXG4rXHQgKiBTeW5jaHJvbml6ZSB3aXRoIGd1cF9wdGVfcmFuZ2UoKTpcbitcdCAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50XG4rXHQgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEVcbitcdCAqL1xuK1x0c21wX21iKCk7XG4rXG4rXHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xuK1x0bWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pO1xuK1xuK1x0LypcbitcdCAqIE9yZGVyIHJlYWRzIGZvciBwYWdlIHJlZmNvdW50IGFuZCBkaXJ0eSBmbGFnXG4rXHQgKiAoc2VlIGNvbW1lbnRzIGluIF9fcmVtb3ZlX21hcHBpbmcoKSkuXG4rXHQgKi9cbitcdHNtcF9ybWIoKTtcbitcbitcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcbitcdFx0LypcbitcdFx0ICogcmVkaXJ0aWVkIGVpdGhlciB1c2luZyB0aGUgcGFnZSB0YWJsZSBvciBhIHByZXZpb3VzbHlcbitcdFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cbitcdFx0ICovXG4rXHRcdGZvbGlvX3NldF9zd2FwYmFja2VkKGZvbGlvKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIEFkZGl0aW9uYWwgcmVmZXJlbmNlcyBjb3VsZCBiZSBkdWUgdG8gR1VQIG9yIHNwZWN1bGF0aXZlIGxvb2t1cHMuXG4rXHQgKiBHVVAgdXNlcnMgbXVzdCBtYXJrIHRoZSBmb2xpbyBkaXJ0eSBpZiB0aGVyZSB3YXMgYSBtb2RpZmljYXRpb24uXG4rXHQgKiBUaGlzIGZvbGlvIGNhbm5vdCBiZSByZWNsYWltZWQgcmlnaHQgbm93IGVpdGhlciB3YXksIHNvIGFjdCBqdXN0XG4rXHQgKiBsaWtlIG5vdGhpbmcgaGFwcGVuZWQuIFdlJ2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlXG4rXHQgKiBmb2xpbyB3YXMgZGlydGllZCB3aGVuIHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZSBpcyBnb25lLlxuK1x0ICovXG4rXHRpZiAocmVmX2NvdW50ICE9IDEgKyBtYXBfY291bnQpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGFkZF9tbV9jb3VudGVyKHZtYS1cdTAwM2V2bV9tbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBwdGVfdCBzd3BfcHRlX3ByZXBhcmUoc3dwX2VudHJ5X3QgZW50cnksIHB0ZV90IG9sZF9wdGUsXG4rXHRcdGJvb2wgYW5vbl9leGNsdXNpdmUpXG4re1xuK1x0cHRlX3Qgc3dwX3B0ZSA9IHN3cF9lbnRyeV90b19wdGUoZW50cnkpO1xuK1xuK1x0aWYgKGFub25fZXhjbHVzaXZlKVxuK1x0XHRzd3BfcHRlID0gcHRlX3N3cF9ta2V4Y2x1c2l2ZShzd3BfcHRlKTtcbitcbitcdGlmIChsaWtlbHkocHRlX3ByZXNlbnQob2xkX3B0ZSkpKSB7XG4rXHRcdGlmIChwdGVfc29mdF9kaXJ0eShvbGRfcHRlKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4rXHRcdGlmIChwdGVfdWZmZChvbGRfcHRlKSlcbitcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3VmZmQoc3dwX3B0ZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHQvKiBEZXZpY2UtZXhjbHVzaXZlIGVudHJ5ICovXG4rXHRcdGlmIChwdGVfc3dwX3NvZnRfZGlydHkob2xkX3B0ZSkpXG4rXHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuK1x0XHRpZiAocHRlX3N3cF91ZmZkKG9sZF9wdGUpKVxuK1x0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcbitcdH1cbitcbitcdHJldHVybiBzd3BfcHRlO1xuK31cbitcbitzdGF0aWMgYm9vbCB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuK1x0XHRwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKVxuK3tcbitcdGNvbnN0IGJvb2wgYW5vbl9leGNsdXNpdmUgPSBmb2xpb190ZXN0X2Fub24oZm9saW8pIFx1MDAyNlx1MDAyNlxuK1x0XHRcdFx0ICAgIFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuK1x0c3dwX2VudHJ5X3QgZW50cnkgPSBwYWdlX3N3YXBfZW50cnkocGFnZSk7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcbitcdGlmIChmb2xpb19kdXBfc3dhcChmb2xpbywgcGFnZSkgXHUwMDNjIDApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdC8qXG4rXHQgKiBhcmNoX3VubWFwX29uZSgpIGlzIGV4cGVjdGVkIHRvIGJlIGEgTk9QIG9uXG4rXHQgKiBhcmNoaXRlY3R1cmVzIHdoZXJlIHdlIGNvdWxkIGhhdmUgUEZOIHN3YXAgUFRFcyxcbitcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxuK1x0ICovXG4rXHRpZiAoYXJjaF91bm1hcF9vbmUobW0sIHZtYSwgYWRkcmVzcywgcHRldmFsKSBcdTAwM2MgMCkge1xuK1x0XHRmb2xpb19wdXRfc3dhcChmb2xpbywgcGFnZSk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdC8qIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwKCk6IGNsZWFyIFBURSBmaXJzdC4gKi9cbitcdGlmIChhbm9uX2V4Y2x1c2l2ZSBcdTAwMjZcdTAwMjYgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHBhZ2UpKSB7XG4rXHRcdGZvbGlvX3B1dF9zd2FwKGZvbGlvLCBwYWdlKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcbitcdGRlY19tbV9jb3VudGVyKG1tLCBNTV9BTk9OUEFHRVMpO1xuK1x0aW5jX21tX2NvdW50ZXIobW0sIE1NX1NXQVBFTlRTKTtcbitcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZXAsXG4rXHRcdCAgIHN3cF9wdGVfcHJlcGFyZShlbnRyeSwgcHRldmFsLCBhbm9uX2V4Y2x1c2l2ZSkpO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuK3N0YXRpYyBib29sIHR0dV9hbm9uX2ZvbGlvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuK1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcHRlcCxcbitcdFx0cHRlX3QgcHRldmFsLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKVxuK3tcbitcdC8qXG4rXHQgKiBTdG9yZSB0aGUgc3dhcCBsb2NhdGlvbiBpbiB0aGUgcHRlLlxuK1x0ICogU2VlIGhhbmRsZV9wdGVfZmF1bHQoKSAuLi5cbitcdCAqL1xuK1x0aWYgKFdBUk5fT05fT05DRShmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pICE9XG4rXHRcdFx0IGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkpXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdGlmICghZm9saW9fdGVzdF9zd2FwYmFja2VkKGZvbGlvKSlcbitcdFx0cmV0dXJuIHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvKHZtYSwgZm9saW8sIG5yX3BhZ2VzKTtcbitcbitcdC8qIG5yX3BhZ2VzIFx1MDAzZSAxIG5vdCBzdXBwb3J0ZWQgeWV0ICovXG4rXHRyZXR1cm4gdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpbyh2bWEsIGZvbGlvLCBwYWdlLCBhZGRyZXNzLCBwdGVwLFxuK1x0XHRcdFx0XHQgcHRldmFsKTtcbit9XG4rXG4gLypcbiAgKiBAYXJnOiBlbnVtIHR0dV9mbGFncyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzIGFyZ3VtZW50XG4gICovXG5AQCAtMTk4NiwxNCArMjIwMCwxMyBAQCBzdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuIHtcbiBcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuIFx0REVGSU5FX0ZPTElPX1ZNQV9XQUxLKHB2bXcsIGZvbGlvLCB2bWEsIGFkZHJlc3MsIDApO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSwgcmV0ID0gdHJ1ZTtcbitcdGJvb2wgcmV0ID0gdHJ1ZTtcbiBcdHB0ZV90IHB0ZXZhbDtcbi1cdHN0cnVjdCBwYWdlICpzdWJwYWdlO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4gXHRzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdlO1xuIFx0ZW51bSB0dHVfZmxhZ3MgZmxhZ3MgPSAoZW51bSB0dHVfZmxhZ3MpKGxvbmcpYXJnO1xuIFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IDEsIGVuZF9hZGRyO1xuIFx0dW5zaWduZWQgbG9uZyBwZm47XG4tXHR1bnNpZ25lZCBsb25nIGhzeiA9IDA7XG4gXHRpbnQgcHRlcyA9IDA7XG4gXG4gXHQvKlxuQEAgLTIwMDcsOCArMjIyMCw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXG4gXHQvKlxuIFx0ICogRm9yIFRIUCwgd2UgaGF2ZSB0byBhc3N1bWUgdGhlIHdvcnNlIGNhc2UgaWUgcG1kIGZvciBpbnZhbGlkYXRpb24uXG4tXHQgKiBGb3IgaHVnZXRsYiwgaXQgY291bGQgYmUgbXVjaCB3b3JzZSBpZiB3ZSBuZWVkIHRvIGRvIHB1ZFxuLVx0ICogaW52YWxpZGF0aW9uIGluIHRoZSBjYXNlIG9mIHBtZCBzaGFyaW5nLlxuIFx0ICpcbiBcdCAqIE5vdGUgdGhhdCB0aGUgZm9saW8gY2FuIG5vdCBiZSBmcmVlZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2ZcbiBcdCAqIHRyeV90b191bm1hcCgpIG11c3QgaG9sZCBhIHJlZmVyZW5jZSBvbiB0aGUgZm9saW8uXG5AQCAtMjAxNiwxNyArMjIyNyw2IEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRyYW5nZS5lbmQgPSB2bWFfYWRkcmVzc19lbmQoXHUwMDI2cHZtdyk7XG4gXHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuIFx0XHRcdFx0YWRkcmVzcywgcmFuZ2UuZW5kKTtcbi1cdGlmIChmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSB7XG4tXHRcdC8qXG4tXHRcdCAqIElmIHNoYXJpbmcgaXMgcG9zc2libGUsIHN0YXJ0IGFuZCBlbmQgd2lsbCBiZSBhZGp1c3RlZFxuLVx0XHQgKiBhY2NvcmRpbmdseS5cbi1cdFx0ICovXG4tXHRcdGFkanVzdF9yYW5nZV9pZl9wbWRfc2hhcmluZ19wb3NzaWJsZSh2bWEsIFx1MDAyNnJhbmdlLnN0YXJ0LFxuLVx0XHRcdFx0XHRcdCAgICAgXHUwMDI2cmFuZ2UuZW5kKTtcbi1cbi1cdFx0LyogV2UgbmVlZCB0aGUgaHVnZSBwYWdlIHNpemUgZm9yIHNldF9odWdlX3B0ZV9hdCgpICovXG4tXHRcdGhzeiA9IGh1Z2VfcGFnZV9zaXplKGhzdGF0ZV92bWEodm1hKSk7XG4tXHR9XG4gXHRtbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9zdGFydChcdTAwMjZyYW5nZSk7XG4gXG4gXHR3aGlsZSAocGFnZV92bWFfbWFwcGVkX3dhbGsoXHUwMDI2cHZtdykpIHtcbkBAIC0yMTExLDY1ICsyMzExLDExIEBAIHN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcHRlKHB0ZXZhbCk7XG4gXG4gXHRcdFx0cGZuID0gc29mdGxlYWZfdG9fcGZuKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OX0ZPTElPKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbyksIGZvbGlvKTtcbiBcdFx0fVxuIFxuLVx0XHRzdWJwYWdlID0gZm9saW9fcGFnZShmb2xpbywgcGZuIC0gZm9saW9fcGZuKGZvbGlvKSk7XG4tXHRcdGFub25fZXhjbHVzaXZlID0gZm9saW9fdGVzdF9hbm9uKGZvbGlvKSBcdTAwMjZcdTAwMjZcbi1cdFx0XHRcdCBQYWdlQW5vbkV4Y2x1c2l2ZShzdWJwYWdlKTtcbi1cbi1cdFx0aWYgKGZvbGlvX3Rlc3RfaHVnZXRsYihmb2xpbykpIHtcbi1cdFx0XHRib29sIGFub24gPSBmb2xpb190ZXN0X2Fub24oZm9saW8pO1xuLVxuLVx0XHRcdC8qXG4tXHRcdFx0ICogVGhlIHRyeV90b191bm1hcCgpIGlzIG9ubHkgcGFzc2VkIGEgaHVnZXRsYiBwYWdlXG4tXHRcdFx0ICogaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGh1Z2V0bGIgcGFnZSBpcyBwb2lzb25lZC5cbi1cdFx0XHQgKi9cbi1cdFx0XHRWTV9CVUdfT05fUEFHRSghUGFnZUhXUG9pc29uKHN1YnBhZ2UpLCBzdWJwYWdlKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGh1Z2VfcG1kX3Vuc2hhcmUgbWF5IHVubWFwIGFuIGVudGlyZSBQTUQgcGFnZS5cbi1cdFx0XHQgKiBUaGVyZSBpcyBubyB3YXkgb2Yga25vd2luZyBleGFjdGx5IHdoaWNoIFBNRHMgbWF5XG4tXHRcdFx0ICogYmUgY2FjaGVkIGZvciB0aGlzIG1tLCBzbyB3ZSBtdXN0IGZsdXNoIHRoZW0gYWxsLlxuLVx0XHRcdCAqIHN0YXJ0L2VuZCB3ZXJlIGFscmVhZHkgYWRqdXN0ZWQgYWJvdmUgdG8gY292ZXIgdGhpc1xuLVx0XHRcdCAqIHJhbmdlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgcmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4rXHRcdHBhZ2UgPSBmb2xpb19wYWdlKGZvbGlvLCBwZm4gLSBmb2xpb19wZm4oZm9saW8pKTtcbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFRvIGNhbGwgaHVnZV9wbWRfdW5zaGFyZSwgaV9tbWFwX3J3c2VtIG11c3QgYmVcbi1cdFx0XHQgKiBoZWxkIGluIHdyaXRlIG1vZGUuICBDYWxsZXIgbmVlZHMgdG8gZXhwbGljaXRseVxuLVx0XHRcdCAqIGRvIHRoaXMgb3V0c2lkZSBybWFwIHJvdXRpbmVzLlxuLVx0XHRcdCAqXG4tXHRcdFx0ICogV2UgYWxzbyBtdXN0IGhvbGQgaHVnZXRsYiB2bWFfbG9jayBpbiB3cml0ZSBtb2RlLlxuLVx0XHRcdCAqIExvY2sgb3JkZXIgZGljdGF0ZXMgYWNxdWlyaW5nIHZtYV9sb2NrIEJFRk9SRVxuLVx0XHRcdCAqIGlfbW1hcF9yd3NlbS4gIFdlIGNhbiBvbmx5IHRyeSBsb2NrIGhlcmUgYW5kIGZhaWxcbi1cdFx0XHQgKiBpZiB1bnN1Y2Nlc3NmdWwuXG4tXHRcdFx0ICovXG4tXHRcdFx0aWYgKCFhbm9uKSB7XG4tXHRcdFx0XHRzdHJ1Y3QgbW11X2dhdGhlciB0bGI7XG4tXG4tXHRcdFx0XHRWTV9CVUdfT04oIShmbGFncyBcdTAwMjYgVFRVX1JNQVBfTE9DS0VEKSk7XG4tXHRcdFx0XHRpZiAoIWh1Z2V0bGJfdm1hX3RyeWxvY2tfd3JpdGUodm1hKSlcbi1cdFx0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuLVxuLVx0XHRcdFx0dGxiX2dhdGhlcl9tbXVfdm1hKFx1MDAyNnRsYiwgdm1hKTtcbi1cdFx0XHRcdGlmIChodWdlX3BtZF91bnNoYXJlKFx1MDAyNnRsYiwgdm1hLCBhZGRyZXNzLCBwdm13LnB0ZSkpIHtcbi1cdFx0XHRcdFx0aHVnZXRsYl92bWFfdW5sb2NrX3dyaXRlKHZtYSk7XG4tXHRcdFx0XHRcdGh1Z2VfcG1kX3Vuc2hhcmVfZmx1c2goXHUwMDI2dGxiLCB2bWEpO1xuLVx0XHRcdFx0XHR0bGJfZmluaXNoX21tdShcdTAwMjZ0bGIpO1xuLVx0XHRcdFx0XHQvKlxuLVx0XHRcdFx0XHQgKiBUaGUgUE1EIHRhYmxlIHdhcyB1bm1hcHBlZCxcbi1cdFx0XHRcdFx0ICogY29uc2VxdWVudGx5IHVubWFwcGluZyB0aGUgZm9saW8uXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRnb3RvIHdhbGtfZG9uZTtcbi1cdFx0XHRcdH1cbi1cdFx0XHRcdGh1Z2V0bGJfdm1hX3VubG9ja193cml0ZSh2bWEpO1xuLVx0XHRcdFx0dGxiX2ZpbmlzaF9tbXUoXHUwMDI2dGxiKTtcbi1cdFx0XHR9XG4tXHRcdFx0cHRldmFsID0gaHVnZV9wdGVwX2NsZWFyX2ZsdXNoKHZtYSwgYWRkcmVzcywgcHZtdy5wdGUpO1xuLVx0XHRcdGlmIChwdGVfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHR9IGVsc2UgaWYgKGxpa2VseShwdGVfcHJlc2VudChwdGV2YWwpKSkge1xuK1x0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4gXHRcdFx0bnJfcGFnZXMgPSBmb2xpb191bm1hcF9wdGVfYmF0Y2goZm9saW8sIFx1MDAyNnB2bXcsIGZsYWdzLCBwdGV2YWwpO1xuIFx0XHRcdGVuZF9hZGRyID0gYWRkcmVzcyArIG5yX3BhZ2VzICogUEFHRV9TSVpFO1xuIFx0XHRcdGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgYWRkcmVzcywgZW5kX2FkZHIpO1xuQEAgLTIyMDQsMTYgKzIzNTAsMTEgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0LyogVXBkYXRlIGhpZ2ggd2F0ZXJtYXJrIGJlZm9yZSB3ZSBsb3dlciByc3MgKi9cbiBcdFx0dXBkYXRlX2hpd2F0ZXJfcnNzKG1tKTtcbiBcbi1cdFx0aWYgKFBhZ2VIV1BvaXNvbihzdWJwYWdlKSBcdTAwMjZcdTAwMjYgKGZsYWdzIFx1MDAyNiBUVFVfSFdQT0lTT04pKSB7XG4tXHRcdFx0cHRldmFsID0gc3dwX2VudHJ5X3RvX3B0ZShtYWtlX2h3cG9pc29uX2VudHJ5KHN1YnBhZ2UpKTtcbi1cdFx0XHRpZiAoZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSkge1xuLVx0XHRcdFx0aHVnZXRsYl9jb3VudF9zdWIoZm9saW9fbnJfcGFnZXMoZm9saW8pLCBtbSk7XG4tXHRcdFx0XHRzZXRfaHVnZV9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwsXG4tXHRcdFx0XHRcdFx0aHN6KTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbi1cdFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB2bXcucHRlLCBwdGV2YWwpO1xuLVx0XHRcdH1cbitcdFx0LyogV2l0aCBUVFVfSFdQT0lTT04sIHdlIG9ubHkgZXhwZWN0IHNtYWxsIGZvbGlvcyBoZXJlLiAqL1xuK1x0XHRpZiAoZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbykgXHUwMDI2XHUwMDI2IChmbGFncyBcdTAwMjYgVFRVX0hXUE9JU09OKSkge1xuK1x0XHRcdHB0ZXZhbCA9IHN3cF9lbnRyeV90b19wdGUobWFrZV9od3BvaXNvbl9lbnRyeShwYWdlKSk7XG4rXHRcdFx0ZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXIoZm9saW8pKTtcbitcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbiBcdFx0fSBlbHNlIGlmIChsaWtlbHkocHRlX3ByZXNlbnQocHRldmFsKSkgXHUwMDI2XHUwMDI2IHB0ZV91bnVzZWQocHRldmFsKSBcdTAwMjZcdTAwMjZcbiBcdFx0XHQgICAhdXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkge1xuIFx0XHRcdC8qXG5AQCAtMjIyOCwxMDQgKzIzNjksMTMgQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKi9cbiBcdFx0XHRkZWNfbW1fY291bnRlcihtbSwgbW1fY291bnRlcihmb2xpbykpO1xuIFx0XHR9IGVsc2UgaWYgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbi1cdFx0XHRzd3BfZW50cnlfdCBlbnRyeSA9IHBhZ2Vfc3dhcF9lbnRyeShzdWJwYWdlKTtcbi1cdFx0XHRwdGVfdCBzd3BfcHRlO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogU3RvcmUgdGhlIHN3YXAgbG9jYXRpb24gaW4gdGhlIHB0ZS5cbi1cdFx0XHQgKiBTZWUgaGFuZGxlX3B0ZV9mYXVsdCgpIC4uLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X3N3YXBiYWNrZWQoZm9saW8pICE9XG4tXHRcdFx0XHRcdGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkpIHtcbi1cdFx0XHRcdFdBUk5fT05fT05DRSgxKTtcbi1cdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHR9XG4tXG4tXHRcdFx0LyogTUFEVl9GUkVFIHBhZ2UgY2hlY2sgKi9cbi1cdFx0XHRpZiAoIWZvbGlvX3Rlc3Rfc3dhcGJhY2tlZChmb2xpbykpIHtcbi1cdFx0XHRcdGludCByZWZfY291bnQsIG1hcF9jb3VudDtcbi1cbi1cdFx0XHRcdC8qXG4tXHRcdFx0XHQgKiBTeW5jaHJvbml6ZSB3aXRoIGd1cF9wdGVfcmFuZ2UoKTpcbi1cdFx0XHRcdCAqIC0gY2xlYXIgUFRFOyBiYXJyaWVyOyByZWFkIHJlZmNvdW50XG4tXHRcdFx0XHQgKiAtIGluYyByZWZjb3VudDsgYmFycmllcjsgcmVhZCBQVEVcbi1cdFx0XHRcdCAqL1xuLVx0XHRcdFx0c21wX21iKCk7XG4tXG4tXHRcdFx0XHRyZWZfY291bnQgPSBmb2xpb19yZWZfY291bnQoZm9saW8pO1xuLVx0XHRcdFx0bWFwX2NvdW50ID0gZm9saW9fbWFwY291bnQoZm9saW8pO1xuLVxuLVx0XHRcdFx0Lypcbi1cdFx0XHRcdCAqIE9yZGVyIHJlYWRzIGZvciBwYWdlIHJlZmNvdW50IGFuZCBkaXJ0eSBmbGFnXG4tXHRcdFx0XHQgKiAoc2VlIGNvbW1lbnRzIGluIF9fcmVtb3ZlX21hcHBpbmcoKSkuXG4tXHRcdFx0XHQgKi9cbi1cdFx0XHRcdHNtcF9ybWIoKTtcbi1cbi1cdFx0XHRcdGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgISh2bWEtXHUwMDNldm1fZmxhZ3MgXHUwMDI2IFZNX0RST1BQQUJMRSkpIHtcbi1cdFx0XHRcdFx0Lypcbi1cdFx0XHRcdFx0ICogcmVkaXJ0aWVkIGVpdGhlciB1c2luZyB0aGUgcGFnZSB0YWJsZSBvciBhIHByZXZpb3VzbHlcbi1cdFx0XHRcdFx0ICogb2J0YWluZWQgR1VQIHJlZmVyZW5jZS5cbi1cdFx0XHRcdFx0ICovXG4tXHRcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4tXHRcdFx0XHRcdGZvbGlvX3NldF9zd2FwYmFja2VkKGZvbGlvKTtcbi1cdFx0XHRcdFx0Z290byB3YWxrX2Fib3J0O1xuLVx0XHRcdFx0fSBlbHNlIGlmIChyZWZfY291bnQgIT0gMSArIG1hcF9jb3VudCkge1xuLVx0XHRcdFx0XHQvKlxuLVx0XHRcdFx0XHQgKiBBZGRpdGlvbmFsIHJlZmVyZW5jZS4gQ291bGQgYmUgYSBHVVAgcmVmZXJlbmNlIG9yIGFueVxuLVx0XHRcdFx0XHQgKiBzcGVjdWxhdGl2ZSByZWZlcmVuY2UuIEdVUCB1c2VycyBtdXN0IG1hcmsgdGhlIGZvbGlvXG4tXHRcdFx0XHRcdCAqIGRpcnR5IGlmIHRoZXJlIHdhcyBhIG1vZGlmaWNhdGlvbi4gVGhpcyBmb2xpbyBjYW5ub3QgYmVcbi1cdFx0XHRcdFx0ICogcmVjbGFpbWVkIHJpZ2h0IG5vdyBlaXRoZXIgd2F5LCBzbyBhY3QganVzdCBsaWtlIG5vdGhpbmdcbi1cdFx0XHRcdFx0ICogaGFwcGVuZWQuXG4tXHRcdFx0XHRcdCAqIFdlJ2xsIGNvbWUgYmFjayBoZXJlIGxhdGVyIGFuZCBkZXRlY3QgaWYgdGhlIGZvbGlvIHdhc1xuLVx0XHRcdFx0XHQgKiBkaXJ0aWVkIHdoZW4gdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlIGlzIGdvbmUuXG4tXHRcdFx0XHRcdCAqL1xuLVx0XHRcdFx0XHRzZXRfcHRlcyhtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHB0ZXZhbCwgbnJfcGFnZXMpO1xuLVx0XHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4tXHRcdFx0XHR9XG4tXHRcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTLCAtbnJfcGFnZXMpO1xuLVx0XHRcdFx0Z290byBkaXNjYXJkO1xuLVx0XHRcdH1cbi1cbi1cdFx0XHRpZiAoZm9saW9fZHVwX3N3YXAoZm9saW8sIHN1YnBhZ2UpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbitcdFx0XHRpZiAoIXR0dV9hbm9uX2ZvbGlvKHZtYSwgZm9saW8sIHBhZ2UsIGFkZHJlc3MsXG4rXHRcdFx0XHRcdCAgICBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcykpIHtcbitcdFx0XHRcdHNldF9wdGVzKG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsLCBucl9wYWdlcyk7XG4gXHRcdFx0XHRnb3RvIHdhbGtfYWJvcnQ7XG4gXHRcdFx0fVxuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogYXJjaF91bm1hcF9vbmUoKSBpcyBleHBlY3RlZCB0byBiZSBhIE5PUCBvblxuLVx0XHRcdCAqIGFyY2hpdGVjdHVyZXMgd2hlcmUgd2UgY291bGQgaGF2ZSBQRk4gc3dhcCBQVEVzLFxuLVx0XHRcdCAqIHNvIHdlJ2xsIG5vdCBjaGVjay9jYXJlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlmIChhcmNoX3VubWFwX29uZShtbSwgdm1hLCBhZGRyZXNzLCBwdGV2YWwpIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHR9XG4tXG4tXHRcdFx0LyogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXAoKTogY2xlYXIgUFRFIGZpcnN0LiAqL1xuLVx0XHRcdGlmIChhbm9uX2V4Y2x1c2l2ZSBcdTAwMjZcdTAwMjZcbi1cdFx0XHQgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wdGUoZm9saW8sIHN1YnBhZ2UpKSB7XG4tXHRcdFx0XHRmb2xpb19wdXRfc3dhcChmb2xpbywgc3VicGFnZSk7XG4tXHRcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdm13LnB0ZSwgcHRldmFsKTtcbi1cdFx0XHRcdGdvdG8gd2Fsa19hYm9ydDtcbi1cdFx0XHR9XG4tXHRcdFx0bW1fcHJlcGFyZV9mb3Jfc3dhcF9lbnRyaWVzKG1tKTtcbi1cdFx0XHRkZWNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTtcbi1cdFx0XHRpbmNfbW1fY291bnRlcihtbSwgTU1fU1dBUEVOVFMpO1xuLVx0XHRcdHN3cF9wdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTtcbi1cdFx0XHRpZiAoYW5vbl9leGNsdXNpdmUpXG4tXHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta2V4Y2x1c2l2ZShzd3BfcHRlKTtcbi1cdFx0XHRpZiAobGlrZWx5KHB0ZV9wcmVzZW50KHB0ZXZhbCkpKSB7XG4tXHRcdFx0XHRpZiAocHRlX3NvZnRfZGlydHkocHRldmFsKSlcbi1cdFx0XHRcdFx0c3dwX3B0ZSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KHN3cF9wdGUpO1xuLVx0XHRcdFx0aWYgKHB0ZV91ZmZkKHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0aWYgKHB0ZV9zd3Bfc29mdF9kaXJ0eShwdGV2YWwpKVxuLVx0XHRcdFx0XHRzd3BfcHRlID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoc3dwX3B0ZSk7XG4tXHRcdFx0XHRpZiAocHRlX3N3cF91ZmZkKHB0ZXZhbCkpXG4tXHRcdFx0XHRcdHN3cF9wdGUgPSBwdGVfc3dwX21rdWZmZChzd3BfcHRlKTtcbi1cdFx0XHR9XG4tXHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHZtdy5wdGUsIHN3cF9wdGUpO1xuK1x0XHRcdGdvdG8gZmluaXNoX3VubWFwO1xuIFx0XHR9IGVsc2Uge1xuIFx0XHRcdC8qXG4gXHRcdFx0ICogVGhpcyBpcyBhIGxvY2tlZCBmaWxlLWJhY2tlZCBmb2xpbyxcbkBAIC0yMzQwLDEyICsyMzkwLDggQEAgc3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX29uZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdFx0XHQgKi9cbiBcdFx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLW5yX3BhZ2VzKTtcbiBcdFx0fVxuLWRpc2NhcmQ6XG4tXHRcdGlmICh1bmxpa2VseShmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pKSkge1xuLVx0XHRcdGh1Z2V0bGJfcmVtb3ZlX3JtYXAoZm9saW8pO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3B0ZXMoZm9saW8sIHN1YnBhZ2UsIG5yX3BhZ2VzLCB2bWEpO1xuLVx0XHR9XG4rZmluaXNoX3VubWFwOlxuK1x0XHRmb2xpb19yZW1vdmVfcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBucl9wYWdlcywgdm1hKTtcbiBcdFx0aWYgKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTE9DS0VEKVxuIFx0XHRcdG1sb2NrX2RyYWluX2xvY2FsKCk7XG4gXHRcdGZvbGlvX3B1dF9yZWZzKGZvbGlvLCBucl9wYWdlcyk7XG5AQCAtMjM5Myw3ICsyNDM5LDggQEAgc3RhdGljIGludCBmb2xpb19ub3RfbWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4gdm9pZCB0cnlfdG9fdW5tYXAoc3RydWN0IGZvbGlvICpmb2xpbywgZW51bSB0dHVfZmxhZ3MgZmxhZ3MpXG4ge1xuIFx0c3RydWN0IHJtYXBfd2Fsa19jb250cm9sIHJ3YyA9IHtcbi1cdFx0LnJtYXBfb25lID0gdHJ5X3RvX3VubWFwX29uZSxcbitcdFx0LnJtYXBfb25lID0gZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKSA/XG4rXHRcdFx0XHR0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLFxuIFx0XHQuYXJnID0gKHZvaWQgKilmbGFncyxcbiBcdFx0LmRvbmUgPSBmb2xpb19ub3RfbWFwcGVkLFxuIFx0XHQuYW5vbl9sb2NrID0gZm9saW9fbG9ja19hbm9uX3ZtYV9yZWFkLFxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NDcuMjM3NTg5NTIzWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjE4ODE0OTY1NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiB0aGUgYHJtYXAuY2AgUmVmYWN0b3JpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCBhIHBhdGNoIHRoYXQncyByZWZhY3RvcmluZyBgdHJ5X3RvX3VubWFwX29uZWAgaW4gYG1tL3JtYXAuY2AuIFRoaXMgaXMgYSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFyZWEsIHNvIG5hdHVyYWxseSwgSSBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24uIEl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZSBpcyBhaW1lZCBhdCBiZXR0ZXIgb3JnYW5pemF0aW9uLCBzcGVjaWZpY2FsbHkgZXh0cmFjdGluZyB0aGUgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBsb2dpYyBpbnRvIGRlZGljYXRlZCBmdW5jdGlvbnM6IGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGFuZCB2YXJpb3VzIGB0dHVfYW5vbl9mb2xpb2AgdmFyaWFudHMgaW5jbHVkaW5nIGB0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb2AgYW5kIGB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvYCwgYWxvbmdzaWRlIGBzd3BfcHRlX3ByZXBhcmVgLlxuXG5GdW5jdGlvbmFsbHksIHRoaXMgc2VlbXMgc291bmQuIFJlZmFjdG9yaW5nIGxpa2UgdGhpcyBvZnRlbiBpbXByb3ZlcyByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LCB3aGljaCBpcyBhbHdheXMgYSBnb29kIHNpZ24gaW4gYSBjb21wbGV4IGFyZWEgbGlrZSB0aGUga2VybmVsJ3MgbWVtb3J5IG1hbmFnZW1lbnQuIEdpdmVuIHRoYXQgaXQncyB0b3VjaGluZyB0aGUgcm1hcCBjb2RlLCBJJ2Qgc2F5IHRoaXMgaXMgZGVmaW5pdGVseSBzb21ldGhpbmcgd2UgbmVlZCB0byBmdXp6IHRob3JvdWdobHkgdG8gZW5zdXJlIG5vIHJlZ3Jlc3Npb25zLlxuXG5Ob3csIGxldCdzIGRyaWxsIGRvd24gaW50byB0aGUgc3BlY2lmaWNzLiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCBpcyBjYWxsZWQgd2hlbiBgZm9saW9fdGVzdF9odWdldGxiKGZvbGlvKWAgcmV0dXJucyB0cnVlLCB3aGljaCBtYWtlcyBzZW5zZS4gYHRyeV90b191bm1hcF9vbmVgIGhhbmRsZXMgdGhlIG5vbi1odWdldGxiIGNhc2VzLiBUaGF0J3MgYSBjbGVhbiBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zLlxuXG5OZXh0LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIGBtbS9ybWFwLmNgIGl0c2VsZiBpcyBvbmx5IGNvbXBpbGVkIHdpdGggYENPTkZJR19NTVVgLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQuIFRoZSBodWdldGxiLXNwZWNpZmljIGxvZ2ljLCBhcyBleHBlY3RlZCwgaXMgZ2F0ZWQgYnkgYENPTkZJR19IVUdFVExCX1BBR0VgLiBBbmQgbG9va2luZyBhdCB0aGUgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZywgaXQgc2VlbXMgdGhhdCBzd2FwIHN1cHBvcnQgKGBDT05GSUdfU1dBUGApIGlzIGNydWNpYWwsIHNwZWNpZmljYWxseSBmb3IgdGhlIHN3YXBiYWNrZWQgZm9saW8gY2FzZXMuXG5cbkZpbmFsbHksIEknbGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIHRvIGRvdWJsZS1jaGVjayBhbGwgY2FsbHMgdG8gYHRyeV90b191bm1hcGAgYW5kIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIHRvIGVuc3VyZSBhIGhvbGlzdGljIHVuZGVyc3RhbmRpbmcgb2YgYWxsIHRvdWNocG9pbnRzLiBUaGlzIHdpbGwgaGVscCB3aXRoIHRoZSBmdXp6aW5nIHN0cmF0ZWd5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjcxLCJPdXRwdXRUb2tlbnMiOjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjcwLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6MjY6NTMuNDI1NzQxMDM5WiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMwMTUwNTcyMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnlfdG9fdW5tYXBcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vcm1hcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL3JtYXAuYz02MzM9c3RydWN0IGFub25fdm1hICpmb2xpb19sb2NrX2Fub25fdm1hX3JlYWQoY29uc3Qgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4tLVxcbm1tL3JtYXAuYy03MTAtICovXFxubW0vcm1hcC5jOjcxMTp2b2lkIHRyeV90b191bm1hcF9mbHVzaCh2b2lkKVxcbm1tL3JtYXAuYy03MTIte1xcbi0tXFxubW0vcm1hcC5jLTcyMy0vKiBGbHVzaCBpZmYgdGhlcmUgYXJlIHBvdGVudGlhbGx5IHdyaXRhYmxlIFRMQiBlbnRyaWVzIHRoYXQgY2FuIHJhY2Ugd2l0aCBJTyAqL1xcbm1tL3JtYXAuYzo3MjQ6dm9pZCB0cnlfdG9fdW5tYXBfZmx1c2hfZGlydHkodm9pZClcXG5tbS9ybWFwLmMtNzI1LXtcXG4tLVxcbm1tL3JtYXAuYy03MjgtXFx0aWYgKHRsYl91YmMtXFx1MDAzZXdyaXRhYmxlKVxcbm1tL3JtYXAuYzo3Mjk6XFx0XFx0dHJ5X3RvX3VubWFwX2ZsdXNoKCk7XFxubW0vcm1hcC5jLTczMC19XFxuLS1cXG5tbS9ybWFwLmM9NzQyPXN0YXRpYyB2b2lkIHNldF90bGJfdWJjX2ZsdXNoX3BlbmRpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHB0ZV90IHB0ZXZhbCxcXG4tLVxcbm1tL3JtYXAuYy03NzUtXFx0ICogSWYgdGhlIFBURSB3YXMgZGlydHkgdGhlbiBpdCdzIGJlc3QgdG8gYXNzdW1lIGl0J3Mgd3JpdGFibGUuIFRoZVxcbm1tL3JtYXAuYzo3NzY6XFx0ICogY2FsbGVyIG11c3QgdXNlIHRyeV90b191bm1hcF9mbHVzaF9kaXJ0eSgpIG9yIHRyeV90b191bm1hcF9mbHVzaCgpXFxubW0vcm1hcC5jLTc3Ny1cXHQgKiBiZWZvcmUgdGhlIHBhZ2UgaXMgcXVldWVkIGZvciBJTy5cXG4tLVxcbm1tL3JtYXAuYz0xOTQ0PXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZvbGlvX3VubWFwX3B0ZV9iYXRjaChzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbi0tXFxubW0vcm1hcC5jLTE5ODAtXFxubW0vcm1hcC5jOjE5ODE6c3RhdGljIGJvb2wgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sXFxubW0vcm1hcC5jLTE5ODItXFx0XFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdm9pZCAqYXJnKVxcbi0tXFxubW0vcm1hcC5jLTE5OTItXFx0LypcXG5tbS9ybWFwLmM6MTk5MzpcXHQgKiBUaGUgdHJ5X3RvX3VubWFwKCkgaXMgb25seSBwYXNzZWQgYSBodWdldGxiIGZvbGlvIGluIHRoZSBjYXNlXFxubW0vcm1hcC5jLTE5OTQtXFx0ICogd2hlcmUgdGhlIGh1Z2V0bGIgZm9saW8gaXMgcG9pc29uZWQuXFxuLS1cXG5tbS9ybWFwLmM9MjE3NT1zdGF0aWMgYm9vbCB0dHVfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4tLVxcbm1tL3JtYXAuYy0yMTk3LSAqL1xcbm1tL3JtYXAuYzoyMTk4OnN0YXRpYyBib29sIHRyeV90b191bm1hcF9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxubW0vcm1hcC5jLTIxOTktXFx0XFx0ICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHZvaWQgKmFyZylcXG4tLVxcbm1tL3JtYXAuYy0yMjE0LVxcdCAqIGluIGJldHdlZW4gaXRzIHB0ZXBfZ2V0X2FuZF9jbGVhcl9mdWxsKCkgYW5kIGZvbGlvX3JlbW92ZV9ybWFwXyooKSxcXG5tbS9ybWFwLmM6MjIxNTpcXHQgKiB0cnlfdG9fdW5tYXAoKSBtYXkgcmV0dXJuIGJlZm9yZSBmb2xpb19tYXBwZWQoKSBoYXMgYmVjb21lIGZhbHNlLFxcbm1tL3JtYXAuYy0yMjE2LVxcdCAqIGlmIHBhZ2UgdGFibGUgbG9ja2luZyBpcyBza2lwcGVkOiB1c2UgVFRVX1NZTkMgdG8gd2FpdCBmb3IgdGhhdC5cXG4tLVxcbm1tL3JtYXAuYy0yMjI0LVxcdCAqIE5vdGUgdGhhdCB0aGUgZm9saW8gY2FuIG5vdCBiZSBmcmVlZCBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2ZcXG5tbS9ybWFwLmM6MjIyNTpcXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIGZvbGlvLlxcbm1tL3JtYXAuYy0yMjI2LVxcdCAqL1xcbi0tXFxubW0vcm1hcC5jPTI0MjM9c3RhdGljIGludCBmb2xpb19ub3RfbWFwcGVkKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuLS1cXG5tbS9ybWFwLmMtMjQyOC0vKipcXG5tbS9ybWFwLmM6MjQyOTogKiB0cnlfdG9fdW5tYXAgLSBUcnkgdG8gcmVtb3ZlIGFsbCBwYWdlIHRhYmxlIG1hcHBpbmdzIHRvIGEgZm9saW8uXFxubW0vcm1hcC5jLTI0MzAtICogQGZvbGlvOiBUaGUgZm9saW8gdG8gdW5tYXAuXFxuLS1cXG5tbS9ybWFwLmMtMjQzOC0gKi9cXG5tbS9ybWFwLmM6MjQzOTp2b2lkIHRyeV90b191bm1hcChzdHJ1Y3QgZm9saW8gKmZvbGlvLCBlbnVtIHR0dV9mbGFncyBmbGFncylcXG5tbS9ybWFwLmMtMjQ0MC17XFxuLS1cXG5tbS9ybWFwLmMtMjQ0Mi1cXHRcXHQucm1hcF9vbmUgPSBmb2xpb190ZXN0X2h1Z2V0bGIoZm9saW8pID9cXG5tbS9ybWFwLmM6MjQ0MzpcXHRcXHRcXHRcXHR0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmUgOiB0cnlfdG9fdW5tYXBfb25lLFxcbm1tL3JtYXAuYy0yNDQ0LVxcdFxcdC5hcmcgPSAodm9pZCAqKWZsYWdzLFxcbi0tXFxubW0vcm1hcC5jPTI0NjE9c3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vcm1hcC5jLTI0ODgtXFx0ICogTm90ZSB0aGF0IHRoZSBwYWdlIGNhbiBub3QgYmUgZnJlZSBpbiB0aGlzIGZ1bmN0aW9uIGFzIGNhbGwgb2ZcXG5tbS9ybWFwLmM6MjQ4OTpcXHQgKiB0cnlfdG9fdW5tYXAoKSBtdXN0IGhvbGQgYSByZWZlcmVuY2Ugb24gdGhlIHBhZ2UuXFxubW0vcm1hcC5jLTI0OTAtXFx0ICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEzVDA1OjI2OjUzLjcyNzI1NTM1MVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYxNjkzMTU1MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBSZWZhY3RvcioqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgY2xlYXJseSBtYWtpbmcgc29tZSBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIGhvdyB3ZSBoYW5kbGUgbWVtb3J5IHVubWFwcGluZywgc3BlY2lmaWNhbGx5IGJ5IGludHJvZHVjaW5nIGEgc3VpdGUgb2YgbmV3IGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSB3ZSdyZSByZWZhY3RvcmluZyBgdHJ5X3RvX3VubWFwX29uZWAgYW5kIGFkZGluZyBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHN3cF9wdGVfcHJlcGFyZWAsIGB0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvYCwgYW5kIGB0dHVfYW5vbl9mb2xpb2AuIFRoZXNlIGFyZSBkZWZpbml0ZWx5IGNvcmUgZnVuY3Rpb25zLCB0b3VjaGluZyBvbiBob3cgd2UgZGVhbCB3aXRoIGh1Z2V0bGJmcyBhbmQgc3dhcHBlZCBtZW1vcnkuXG5cblRoZSBrZXkgY29uZmlncyB0byBlbmFibGUgdGhlc2UgY2hhbmdlcyBhcmUgYEhVR0VUTEJfUEFHRWAgYW5kIGBTV0FQYCwgd2hpY2ggbWFrZXMgc2Vuc2UgZ2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWVzLiBJIHNob3VsZCBmb2N1cyBvbiBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYCBhcyB0aGUgcHJpbWFyeSBzeW1ib2xzIG9mIGludGVyZXN0LCBidXQgSSBhbHNvIG5lZWQgdG8gcmVtZW1iZXIgdGhhdCBgdHJ5X3RvX3VubWFwX29uZWAgaXMgYmVpbmcgbW9kaWZpZWQgYXMgd2VsbC5cblxuTm93LCBiZWZvcmUgSSBkaWcgZGVlcGVyLCBsZXQncyBqdXN0IG1ha2Ugc3VyZSB0aGVyZSBhcmVuJ3QgYW55IG90aGVyIGNydWNpYWwgY29uZmlncyB0byBiZSBhd2FyZSBvZi4gYEhVR0VUTEJfUEFHRWAgY292ZXJzIHRoZSBodWdldGxiIHVubWFwcGluZywgYW5kIGBTV0FQYCwgb2YgY291cnNlLCBjb3ZlcnMgdGhlIHN3YXAtYmFja2VkIGZvbGlvcy4gYE1NVWAgaXMgYSBnaXZlbiwgZ2l2ZW4gdGhhdCB3ZSBhcmUgd29ya2luZyBpbiBgbW0vcm1hcC5jYC5cblxuQWhhISBJdCBsb29rcyBsaWtlIGBIV1BPSVNPTl9JTkpFQ1RgIG9yIGBNRU1PUllfRkFJTFVSRWAgbWlnaHQgYmUgcmVsZXZhbnQgaGVyZS4gVGhlIGNvbW1lbnQgaW4gdGhlIGNvZGUgc3VnZ2VzdHMgdGhhdCBgdHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lYCBpcyBvbmx5IGNhbGxlZCB3aGVuIHdlIGhhdmUgYGZsYWdzIFx1MDAyNiBUVFVfSFdQT0lTT05gLiBMZXQncyBjb25maXJtIHRoYXQgYnkgY2hlY2tpbmcgdGhlIHNvdXJjZSBjb2RlIG9mIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgOlxuYGBgY1xuXHQvKlxuXHQgKiBUaGUgdHJ5X3RvX3VubWFwKCkgaXMgb25seSBwYXNzZWQgYSBodWdldGxiIGZvbGlvIGluIHRoZSBjYXNlXG5cdCAqIHdoZXJlIHRoZSBodWdldGxiIGZvbGlvIGlzIHBvaXNvbmVkLlxuXHQgKi9cblx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fdGVzdF9od3BvaXNvbihmb2xpbyksIGZvbGlvKTtcblx0Vk1fV0FSTl9PTl9PTkNFKCEoZmxhZ3MgXHUwMDI2IFRUVV9IV1BPSVNPTikpO1xuYGBgXG5ZdXAsIGNvbmZpcm1lZC4gSXQgbG9va3MgbGlrZSBgTUVNT1JZX0ZBSUxVUkVgIGlzIGluZGVlZCBhIHByZXJlcXVpc2l0ZSBzaW5jZSB0aGF0IHRyaWdnZXJzIHRoZSBgSFdQT0lTT05gIGZsYWcuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEwMTgxLCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTEzVDA1OjI2OjU5Ljg5NjU3MzE2OVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDc0MDg0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJNRU1PUllfRkFJTFVSRVwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9NzQ3PWNvbmZpZyBERUZBVUxUX01NQVBfTUlOX0FERFJcXG4tLVxcbm1tL0tjb25maWctNzY1LVxcbm1tL0tjb25maWc6NzY2OmNvbmZpZyBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFXFxubW0vS2NvbmZpZy03NjctXFx0Ym9vbFxcbm1tL0tjb25maWctNzY4LVxcbm1tL0tjb25maWc6NzY5OmNvbmZpZyBNRU1PUllfRkFJTFVSRVxcbm1tL0tjb25maWctNzcwLVxcdGRlcGVuZHMgb24gTU1VXFxubW0vS2NvbmZpZzo3NzE6XFx0ZGVwZW5kcyBvbiBBUkNIX1NVUFBPUlRTX01FTU9SWV9GQUlMVVJFXFxubW0vS2NvbmZpZy03NzItXFx0Ym9vbCBcXFwiRW5hYmxlIHJlY292ZXJ5IGZyb20gaGFyZHdhcmUgbWVtb3J5IGVycm9yc1xcXCJcXG4tLVxcbm1tL0tjb25maWc9NzgwPWNvbmZpZyBIV1BPSVNPTl9JTkpFQ1RcXG5tbS9LY29uZmlnLTc4MS1cXHR0cmlzdGF0ZSBcXFwiSFdQb2lzb24gcGFnZXMgaW5qZWN0b3JcXFwiXFxubW0vS2NvbmZpZzo3ODI6XFx0ZGVwZW5kcyBvbiBNRU1PUllfRkFJTFVSRSBcXHUwMDI2XFx1MDAyNiBERUJVR19LRVJORUwgXFx1MDAyNlxcdTAwMjYgUFJPQ19GU1xcbm1tL0tjb25maWctNzgzLVxcdHNlbGVjdCBQUk9DX1BBR0VfTU9OSVRPUlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xM1QwNToyNjo1OS45NTEzMTg2MzZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo3NjgzNDA5ODc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IFJlYXNvbmluZyBmb3IgU2VsZWN0aW5nIFJlbGV2YW50IFN5bWJvbHMqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIG1vc3QgcmVsZXZhbnQgaGVyZS4gYE1FTU9SWV9GQUlMVVJFYCwgYEhXUE9JU09OX0lOSkVDVGAsIGBIVUdFVExCX1BBR0VgLCBhbmQgYFNXQVBgIGFsbCBzZWVtIGxpa2UgZ29vZCBjaG9pY2VzIHRvIGVuYWJsZSBmb3IgdGVzdGluZy4gTm93LCBsZXQncyBkcmlsbCBkb3duIHRvIHRoZSBmdW5jdGlvbnMgdGhlbXNlbHZlcy5cblxuSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSBzeW1ib2xzIHRoYXQgYXJlIGltcGFjdGVkIGJ5IHRoaXMgcGF0Y2guIEkgc2VlIHRoYXQgYHRyeV90b191bm1hcF9odWdldGxiX29uZWAgaXMgYSBrZXkgZnVuY3Rpb247IEkganVzdCBjaGVja2VkLCBhbmQgaXQgKmlzKiBzdGF0aWMuIFRoZSByZWxhdGVkIGZ1bmN0aW9ucyBgdHR1X2Fub25fbGF6eWZyZWVfZm9saW9gLCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2AsIGB0dHVfYW5vbl9mb2xpb2AsIGFuZCBhbHNvIGB0cnlfdG9fdW5tYXBfb25lYCBhcmUgYWxsIHJlbGF0ZWQgdG8gdGhpcyBuZXcgYXJjaGl0ZWN0dXJlLlxuXG5XYWl0IGEgc2Vjb25kLCBgdHJ5X3RvX3VubWFwX29uZWAgaXMgcHJvYmFibHkgYSB2ZXJ5IGhvdCBwYXRoOyB0aGF0J3MgdG9vIGdlbmVyaWMgYW5kIHdvdWxkIHNrZXcgdGhlIHRlc3QgcmVzdWx0cy4gTGV0J3Mgc2VlLi4uIGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGlzbid0IHNvIGhvdCwgd2hpY2ggaXMgZ29vZC4gSG93ZXZlciwgYHR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvYCwgYHR0dV9hbm9uX3N3YXBiYWNrZWRfZm9saW9gLCBhbmQgYHR0dV9hbm9uX2ZvbGlvYCBzdGlsbCBtaWdodCBiZSBwcmV0dHkgaG90LCBidXQgaXQncyBpbXBvcnRhbnQgdG8gY29uc2lkZXIgdGhlbS4gQWgsIG5vdywgYHR0dV9hbm9uX2ZvbGlvYCBpcyBjYWxsZWQgZm9yICpldmVyeSogYW5vbnltb3VzIHBhZ2UgdW5tYXAuIFRoYXQncyAqdmVyeSogaG90LiBJIHNob3VsZCBhdm9pZCBpdC4gSG1tLCBtYXliZSBqdXN0IGB0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVgIGFuZCBgdHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb2A/IFdlbGwsIHRoZSBsYXp5ZnJlZSBvbmUgYW5kIHRoZSBzd2FwYmFja2VkIG9uZSBhcmUgdGhlIGtleS5cblxuQW5kLCBqdXN0IHRvIGJlIHN1cmUsIEknbGwgY29uZmlybSB0aGF0IGB0dHVfYW5vbl9mb2xpb2AgaXMgc3RhdGljOyB5ZXMsIGl0IGlzLlxuXG5UaGUgY29uZmlncyBJJ20gY29uc2lkZXJpbmcgYXJlOlxuXG4qICAgYEhVR0VUTEJfUEFHRWBcbiogICBgTUVNT1JZX0ZBSUxVUkVgXG4qICAgYEhXUE9JU09OX0lOSkVDVGBcbiogICBgU1dBUGBcblxuVGhpcyBwYXRjaCBpcyByZWZhY3RvcmluZyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIGBtbS9ybWFwLmNgIHJlbGF0ZWQgdG8gZm9saW8gdW5tYXBwaW5nLCB3aXRoIGEgZm9jdXMgb24gaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvcy4gVGhpcyBtZWFucyBpdCBhZmZlY3RzIGNvZGUgdGhhdCdzIHVzZWQgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwIG9wZXJhdGlvbnMsIGFuZCBoYXJkd2FyZSBwb2lzb24gaGFuZGxpbmcuIFRoZXJlZm9yZSwgSSB3aWxsIHVzZSBgc2V0LXJlc3VsdHNgIHRvIHJlY29yZCB0aGlzIGNob2ljZSBvZiBzeW1ib2xzIGFuZCBjb25maWdzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTM2MSwiT3V0cHV0VG9rZW5zIjoxNTEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTNUMDU6Mjc6MDcuNjM0NzMwNjgyWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3ODIzMDU1NSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiSFVHRVRMQl9QQUdFXCIsXG4gICAgXCJNRU1PUllfRkFJTFVSRVwiLFxuICAgIFwiSFdQT0lTT05fSU5KRUNUXCIsXG4gICAgXCJTV0FQXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwidHJ5X3RvX3VubWFwX2h1Z2V0bGJfb25lXCIsXG4gICAgXCJ0dHVfYW5vbl9sYXp5ZnJlZV9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fc3dhcGJhY2tlZF9mb2xpb1wiLFxuICAgIFwidHR1X2Fub25fZm9saW9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBsb2dpYyBpbiBtbS9ybWFwLmMgZm9yIHVubWFwcGluZyBmb2xpb3MsIGV4dHJhY3RpbmcgaHVnZXRsYiBhbmQgYW5vbnltb3VzIGZvbGlvIHVubWFwcGluZyBpbnRvIHNlcGFyYXRlIGZ1bmN0aW9ucy4gVGhpcyBtb2RpZmllcyBmdW5jdGlvbmFsIGNvZGUgcmVhY2hhYmxlIGR1cmluZyBtZW1vcnkgcmVjbGFpbSwgc3dhcCwgYW5kIGhhcmR3YXJlIHBvaXNvbiBoYW5kbGluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJIVUdFVExCX1BBR0VcIixcbiAgICBcIk1FTU9SWV9GQUlMVVJFXCIsXG4gICAgXCJIV1BPSVNPTl9JTkpFQ1RcIixcbiAgICBcIlNXQVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ0cnlfdG9fdW5tYXBfaHVnZXRsYl9vbmVcIixcbiAgICBcInR0dV9hbm9uX2xhenlmcmVlX2ZvbGlvXCIsXG4gICAgXCJ0dHVfYW5vbl9zd2FwYmFja2VkX2ZvbGlvXCIsXG4gICAgXCJ0dHVfYW5vbl9mb2xpb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGluIG1tL3JtYXAuYyBmb3IgdW5tYXBwaW5nIGZvbGlvcywgZXh0cmFjdGluZyBodWdldGxiIGFuZCBhbm9ueW1vdXMgZm9saW8gdW5tYXBwaW5nIGludG8gc2VwYXJhdGUgZnVuY3Rpb25zLiBUaGlzIG1vZGlmaWVzIGZ1bmN0aW9uYWwgY29kZSByZWFjaGFibGUgZHVyaW5nIG1lbW9yeSByZWNsYWltLCBzd2FwLCBhbmQgaGFyZHdhcmUgcG9pc29uIGhhbmRsaW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowv4t2x[1] Phase: Succeeded StartedAt: 2026-07-13 05:27:19 +0000 UTC FinishedAt: 2026-07-13 05:27:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-07-13 05:27:19 +0000 UTC FinishedAt: 2026-07-13 05:27:19 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2] Phase: Succeeded StartedAt: 2026-07-13 05:27:19 +0000 UTC FinishedAt: 2026-07-13 09:57:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-07-13 05:27:19 +0000 UTC FinishedAt: 2026-07-13 09:57:25 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-07-13 05:27:19 +0000 UTC FinishedAt: 2026-07-13 05:27:29 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-07-13 05:27:19 +0000 UTC FinishedAt: 2026-07-13 05:27:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowv4t2x/series-workflowv4t2x-convert-artifact-2865382377/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-07-13 05:27:29 +0000 UTC FinishedAt: 2026-07-13 06:08:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-07-13 05:27:29 +0000 UTC FinishedAt: 2026-07-13 06:08:16 +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:*c90e5f15-44cb-4176-8b34-279c059af99f,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-workflowv4t2x/series-workflowv4t2x-convert-artifact-2865382377/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": "db9ab96f-1ca8-4089-83ae-e580cb7e1f75", "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-workflowv4t2x/series-workflowv4t2x-build-action-1269700423/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-07-13 05:27:29 +0000 UTC FinishedAt: 2026-07-13 06:08:06 +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:*c90e5f15-44cb-4176-8b34-279c059af99f,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-workflowv4t2x/series-workflowv4t2x-convert-artifact-2865382377/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": "db9ab96f-1ca8-4089-83ae-e580cb7e1f75", "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-workflowv4t2x/series-workflowv4t2x-build-action-1269700423/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-07-13 06:08:16 +0000 UTC FinishedAt: 2026-07-13 06:08:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-07-13 06:08:16 +0000 UTC FinishedAt: 2026-07-13 06:08:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-07-13 06:08:16 +0000 UTC FinishedAt: 2026-07-13 06:08:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-07-13 06:08:16 +0000 UTC FinishedAt: 2026-07-13 06:08:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowv4t2x/series-workflowv4t2x-convert-artifact-1701383292/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-07-13 06:08:26 +0000 UTC FinishedAt: 2026-07-13 06:10:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-07-13 06:08:26 +0000 UTC FinishedAt: 2026-07-13 06:10:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*db9ab96f-1ca8-4089-83ae-e580cb7e1f75,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-workflowv4t2x/series-workflowv4t2x-build-action-1269700423/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-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-07-13 06:10:37 +0000 UTC FinishedAt: 2026-07-13 06:10:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-07-13 06:10:37 +0000 UTC FinishedAt: 2026-07-13 06:10:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-07-13 06:10:37 +0000 UTC FinishedAt: 2026-07-13 06:51:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-07-13 06:10:37 +0000 UTC FinishedAt: 2026-07-13 06:51:52 +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:*c90e5f15-44cb-4176-8b34-279c059af99f,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-workflowv4t2x/series-workflowv4t2x-convert-artifact-1701383292/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": "01e01bca-5d9a-4da1-b139-0f31ad63d8f5", "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-workflowv4t2x/series-workflowv4t2x-build-action-3010431192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-07-13 06:10:37 +0000 UTC FinishedAt: 2026-07-13 06:51:42 +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:*c90e5f15-44cb-4176-8b34-279c059af99f,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-workflowv4t2x/series-workflowv4t2x-convert-artifact-1701383292/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": "01e01bca-5d9a-4da1-b139-0f31ad63d8f5", "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-workflowv4t2x/series-workflowv4t2x-build-action-3010431192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-07-13 06:51:52 +0000 UTC FinishedAt: 2026-07-13 06:51:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-07-13 06:51:52 +0000 UTC FinishedAt: 2026-07-13 06:51:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-07-13 06:51:52 +0000 UTC FinishedAt: 2026-07-13 06:54:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-07-13 06:51:52 +0000 UTC FinishedAt: 2026-07-13 06:53:57 +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:*01e01bca-5d9a-4da1-b139-0f31ad63d8f5,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-workflowv4t2x/series-workflowv4t2x-build-action-3010431192/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-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-07-13 06:54:07 +0000 UTC FinishedAt: 2026-07-13 09:57:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-07-13 06:54:07 +0000 UTC FinishedAt: 2026-07-13 09:57:25 +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"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"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:*db9ab96f-1ca8-4089-83ae-e580cb7e1f75,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*01e01bca-5d9a-4da1-b139-0f31ad63d8f5,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-workflowv4t2x/series-workflowv4t2x-build-action-1269700423/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-workflowv4t2x/series-workflowv4t2x-build-action-3010431192/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-07-13 06:54:07 +0000 UTC FinishedAt: 2026-07-13 06:54:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-07-13 06:54:07 +0000 UTC FinishedAt: 2026-07-13 06:54: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"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"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-workflowv4t2x/series-workflowv4t2x-convert-artifact-390230085/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-07-13 06:54:07 +0000 UTC FinishedAt: 2026-07-13 06:54:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-07-13 06:54:07 +0000 UTC FinishedAt: 2026-07-13 06:54:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-07-13 06:54:07 +0000 UTC FinishedAt: 2026-07-13 06:54:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-07-13 06:54:27 +0000 UTC FinishedAt: 2026-07-13 09:57:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowv4t2x[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["try_to_unmap_hugetlb_one","ttu_anon_lazyfree_folio","ttu_anon_swapbacked_folio","ttu_anon_folio"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"cd62f71468f0fc070761f18826d870d4afccac6f","config_name":"upstream-apparmor-kasan.config","enable_configs":["HUGETLB_PAGE","MEMORY_FAILURE","HWPOISON_INJECT","SWAP"],"series_id":"8d0ad669-9b89-475f-80ad-e5e92bf01074","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-07-13 06:54:27 +0000 UTC FinishedAt: 2026-07-13 09:57:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*db9ab96f-1ca8-4089-83ae-e580cb7e1f75,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*01e01bca-5d9a-4da1-b139-0f31ad63d8f5,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-workflowv4t2x/series-workflowv4t2x-build-action-1269700423/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-workflowv4t2x/series-workflowv4t2x-build-action-3010431192/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-workflowv4t2x/series-workflowv4t2x-convert-artifact-390230085/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,}