Name: series-workflow8txnp Phase: Succeeded StartedAt: 2026-08-29 17:25:18 +0000 UTC FinishedAt: 2026-08-29 21:20:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[0] Phase: Succeeded StartedAt: 2026-08-29 17:25:18 +0000 UTC FinishedAt: 2026-08-29 17:40:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[0].run-triage Phase: Succeeded StartedAt: 2026-08-29 17:25:18 +0000 UTC FinishedAt: 2026-08-29 17:40:03 +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": "d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MMU" ], "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": "d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MMU" ], "series_id": "31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "vm_insert_pages", "vm_map_pages", "vm_map_pages_zero" ], "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+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjI3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNTVUmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2bV9pbnNlcnRfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3ZtX21hcF9wYWdlc196ZXJvJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXG5cbk5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIGNvcGllcyB0byB1c2VyIHNwYWNlIGFyZSBpbnRyb2R1Y2VkLiBBbGwgbG9jYWwgdmFyaWFibGVzIChgZXJyYCwgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBjdXJyX3BhZ2VfaWR4YCkgYXJlIGluaXRpYWxpemVkLCBhbmQgZXJyb3IgY29kZXMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgYmVmb3JlIGFueSBqdW1wIHRvIHRoZSBleGl0IGxhYmVsLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBmN2E4MTM0MmRiM2M2NGQ5ZTcwMzY1NWViZDNhMjFlZmVmNDA4ZjA4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMjkgMTc6Mjc6NDAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuY1xuaW5kZXggOWNiY2U1YzkwYmZmZC4uMjdmZmUxYTk5YTA4YiAxMDA2NDRcbi0tLSBhL21tL21lbW9yeS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9tZW1vcnkuY1xuQEAgLTI1NjUsMjAgJiM0MzsyNTY1LDIyIEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXHR1bnNpZ25lZCBsb25nIGN1cnJfcGFnZV9pZHggPSAwO1xuIFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7XG4tXHRpbnQgcmV0O1xuJiM0MztcdGludCBlcnIgPSAwO1xuIG1vcmU6XG4tXHRyZXQgPSAtRUZBVUxUO1xuIFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xuLVx0aWYgKCFwbWQpXG4mIzQzO1x0aWYgKCFwbWQpIHtcbiYjNDM7XHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiBcbiBcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4gXHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbiBcbiBcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4tXHRyZXQgPSAtRU5PTUVNO1xuLVx0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSlcbiYjNDM7XHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4gXG4gXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XG4gXHRcdGludCBwdGVfaWR4ID0gMDtcbkBAIC0yNTg2LDE1ICYjNDM7MjU4OCwxNCBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFxuIFx0XHRzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsIFx1MDAyNnB0ZV9sb2NrKTtcbiBcdFx0aWYgKCFzdGFydF9wdGUpIHtcbi1cdFx0XHRyZXQgPSAtRUZBVUxUO1xuJiM0MztcdFx0XHRlcnIgPSAtRUZBVUxUO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkge1xuLVx0XHRcdGludCBlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsXG4tXHRcdFx0XHRhZGRyLCBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XG4mIzQzO1x0XHRcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcbiYjNDM7XHRcdFx0XHRcdFx0XHQgIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTtcbiBcdFx0XHRpZiAodW5saWtlbHkoZXJyKSkge1xuIFx0XHRcdFx0cHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTtcbi1cdFx0XHRcdHJldCA9IGVycjtcbiBcdFx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuQEAgLTI2MDcsMTAgJiM0MzsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdH1cbiBcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4gXHRcdGdvdG8gbW9yZTtcbi1cdHJldCA9IDA7XG4gb3V0OlxuIFx0Km51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDtcbi1cdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0dXJuIGVycjtcbiB9XG4gXG4gLyoqXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01NVSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtX2luc2VydF9wYWdlcyYjMzQ7LAogICAgJiMzNDt2bV9tYXBfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzX3plcm8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgcmV0dXJuIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jIHdpdGhpbiBpbnNlcnRfcGFnZXMoKSAoYW5kIHRyYW5zaXRpdmVseSB2bV9pbnNlcnRfcGFnZXMoKSksIGNvcnJlY3RseSByZXR1cm5pbmcgLUVOT01FTSBpbnN0ZWFkIG9mIC1FRkFVTFQgd2hlbiB3YWxrX3RvX3BtZCgpIG9yIHB0ZV9hbGxvYygpIGZhaWxzLiBUaGlzIGFmZmVjdHMgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IHVzZWQgYnkgaW9fdXJpbmcsIG5ldHdvcmtpbmcgKFRDUCB6ZXJvY29weSksIGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGY3YTgxMzQyZGIzYzY0ZDllNzAzNjU1ZWJkM2EyMWVmZWY0MDhmMDgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAyOSAxNzoyNzo0MCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggOWNiY2U1YzkwYmZmZC4uMjdmZmUxYTk5YTA4YiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LmMKQEAgLTI1NjUsMjAgJiM0MzsyNTY1LDIyIEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJdW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDsKIAl1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19wYWdlc190b3RhbCA9ICpudW07CiAJdW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7Ci0JaW50IHJldDsKJiM0MzsJaW50IGVyciA9IDA7CiBtb3JlOgotCXJldCA9IC1FRkFVTFQ7CiAJcG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpOwotCWlmICghcG1kKQomIzQzOwlpZiAoIXBtZCkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiYjNDM7CX0KIAogCXBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsCiAJCXJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTsKIAogCS8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovCi0JcmV0ID0gLUVOT01FTTsKLQlpZiAocHRlX2FsbG9jKG1tLCBwbWQpKQomIzQzOwlpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7CiYjNDM7CQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKJiM0MzsJfQogCiAJd2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkgewogCQlpbnQgcHRlX2lkeCA9IDA7CkBAIC0yNTg2LDE1ICYjNDM7MjU4OCwxNCBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCiAJCXN0YXJ0X3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJmFtcDtwdGVfbG9jayk7CiAJCWlmICghc3RhcnRfcHRlKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwomIzQzOwkJCWVyciA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCQlmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCAmbHQ7IGJhdGNoX3NpemU7ICYjNDM7JiM0MztwdGUsICYjNDM7JiM0MztwdGVfaWR4KSB7Ci0JCQlpbnQgZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLAotCQkJCWFkZHIsIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTsKJiM0MzsJCQllcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsIGFkZHIsCiYjNDM7CQkJCQkJCSAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpOwogCQkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCQlwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spOwotCQkJCXJldCA9IGVycjsKIAkJCQlyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gcHRlX2lkeDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTI2MDcsMTAgJiM0MzsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl9CiAJaWYgKHJlbWFpbmluZ19wYWdlc190b3RhbCkKIAkJZ290byBtb3JlOwotCXJldCA9IDA7CiBvdXQ6CiAJKm51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gZXJyOwogfQogCiAvKioKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjYyNwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDQ3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpdmluZyBpbnRvIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBDb3JlKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGRpZmYuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgYG1tL21lbW9yeS5jYCBmaWxlIOKAkyB0aGF0JiMzOTtzIHdoZXJlIHRoZSBoZWFydCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGJlYXRzLiBJJiMzOTttIGdvaW5nIHRvIGxldmVyYWdlIG15IGZhbWlsaWFyaXR5IHdpdGggdGhlIGNvZGViYXNlLCBidXQgSSYjMzk7bGwgdXNlIGByZWFkLWZpbGVgIHRvIHplcm8gaW4gb24gdGhlIGltbWVkaWF0ZSBjb250ZXh0IGFyb3VuZCBsaW5lIDI1NjUgaW4gdGhhdCBmaWxlLiBDb250ZXh0IGlzIGtpbmcsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggc3VjaCBmdW5kYW1lbnRhbCBhc3BlY3RzLiBJIG5lZWQgdG8gc2VlICp3aGF0KiBoYXMgYmVlbiBtb2RpZmllZCAqYXJvdW5kKiB0aGUgbGluZSBpbiBxdWVzdGlvbiB0byBlZmZlY3RpdmVseSBkZXRlcm1pbmUgdGhlIHB1cnBvc2Ugb2YgdGhlIGRpZmYuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogOTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjU1MDpcdFx0aWYgKGVycilcbjI1NTE6XHRcdFx0cmV0dXJuIGVycjtcbjI1NTI6XHRcdHJldHVybiBpbnNlcnRfcGFnZV9pbnRvX3B0ZV9sb2NrZWQodm1hLCBwdGUsIGFkZHIsIHBhZ2UsIHByb3QsIGZhbHNlKTtcbjI1NTM6XHR9XG4yNTU0Olx0XG4yNTU1Olx0LyogaW5zZXJ0X3BhZ2VzKCkgYW1vcnRpemVzIHRoZSBjb3N0IG9mIHNwaW5sb2NrIG9wZXJhdGlvbnNcbjI1NTY6XHQgKiB3aGVuIGluc2VydGluZyBwYWdlcyBpbiBhIGxvb3AuXG4yNTU3Olx0ICovXG4yNTU4Olx0c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbjI1NTk6XHRcdFx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nICpudW0sIHBncHJvdF90IHByb3QpXG4yNTYwOlx0e1xuMjU2MTpcdFx0cG1kX3QgKnBtZCA9IE5VTEw7XG4yNTYyOlx0XHRwdGVfdCAqc3RhcnRfcHRlLCAqcHRlO1xuMjU2MzpcdFx0c3BpbmxvY2tfdCAqcHRlX2xvY2s7XG4yNTY0Olx0XHRzdHJ1Y3QgbW1fc3RydWN0ICpjb25zdCBtbSA9IHZtYS1cdTAwM2V2bV9tbTtcbjI1NjU6XHRcdHVuc2lnbmVkIGxvbmcgY3Vycl9wYWdlX2lkeCA9IDA7XG4yNTY2Olx0XHR1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19wYWdlc190b3RhbCA9ICpudW07XG4yNTY3Olx0XHR1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3dyaXRlX2luX3BtZDtcbjI1Njg6XHRcdGludCBlcnIgPSAwO1xuMjU2OTpcdG1vcmU6XG4yNTcwOlx0XHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4yNTcxOlx0XHRpZiAoIXBtZCkge1xuMjU3MjpcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjU3MzpcdFx0XHRnb3RvIG91dDtcbjI1NzQ6XHRcdH1cbjI1NzU6XHRcbjI1NzY6XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4yNTc3Olx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbjI1Nzg6XHRcbjI1Nzk6XHRcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4yNTgwOlx0XHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XG4yNTgxOlx0XHRcdGVyciA9IC1FTk9NRU07XG4yNTgyOlx0XHRcdGdvdG8gb3V0O1xuMjU4MzpcdFx0fVxuMjU4NDpcdFxuMjU4NTpcdFx0d2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkge1xuMjU4NjpcdFx0XHRpbnQgcHRlX2lkeCA9IDA7XG4yNTg3Olx0XHRcdGNvbnN0IGludCBiYXRjaF9zaXplID0gbWluX3QoaW50LCBwYWdlc190b193cml0ZV9pbl9wbWQsIDgpO1xuMjU4ODpcdFxuMjU4OTpcdFx0XHRzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsIFx1MDAyNnB0ZV9sb2NrKTtcbjI1OTA6XHRcdFx0aWYgKCFzdGFydF9wdGUpIHtcbjI1OTE6XHRcdFx0XHRlcnIgPSAtRUZBVUxUO1xuMjU5MjpcdFx0XHRcdGdvdG8gb3V0O1xuMjU5MzpcdFx0XHR9XG4yNTk0Olx0XHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkge1xuMjU5NTpcdFx0XHRcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcbjI1OTY6XHRcdFx0XHRcdFx0XHRcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xuMjU5NzpcdFx0XHRcdGlmICh1bmxpa2VseShlcnIpKSB7XG4yNTk4Olx0XHRcdFx0XHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xuMjU5OTpcdFx0XHRcdFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsIC09IHB0ZV9pZHg7XG4yNjAwOlx0XHRcdFx0XHRnb3RvIG91dDtcbjI2MDE6XHRcdFx0XHR9XG4yNjAyOlx0XHRcdFx0YWRkciAmIzQzOz0gUEFHRV9TSVpFO1xuMjYwMzpcdFx0XHRcdCYjNDM7JiM0MztjdXJyX3BhZ2VfaWR4O1xuMjYwNDpcdFx0XHR9XG4yNjA1Olx0XHRcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XG4yNjA2Olx0XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCAtPSBiYXRjaF9zaXplO1xuMjYwNzpcdFx0XHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gYmF0Y2hfc2l6ZTtcbjI2MDg6XHRcdH1cbjI2MDk6XHRcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4yNjEwOlx0XHRcdGdvdG8gbW9yZTtcbjI2MTE6XHRvdXQ6XG4yNjEyOlx0XHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xuMjYxMzpcdFx0cmV0dXJuIGVycjtcbjI2MTQ6XHR9XG4yNjE1Olx0XG4yNjE2Olx0LyoqXG4yNjE3Olx0ICogdm1faW5zZXJ0X3BhZ2VzIC0gaW5zZXJ0IG11bHRpcGxlIHBhZ2VzIGludG8gdXNlciB2bWEsIGJhdGNoaW5nIHRoZSBwbWQgbG9jay5cbjI2MTg6XHQgKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cbjI2MTk6XHQgKiBAYWRkcjogdGFyZ2V0IHN0YXJ0IHVzZXIgYWRkcmVzcyBvZiB0aGVzZSBwYWdlc1xuMjYyMDpcdCAqIEBwYWdlczogc291cmNlIGtlcm5lbCBwYWdlc1xuMjYyMTpcdCAqIEBudW06IGluOiBudW1iZXIgb2YgcGFnZXMgdG8gbWFwLiBvdXQ6IG51bWJlciBvZiBwYWdlcyB0aGF0IHdlcmUgKm5vdCpcbjI2MjI6XHQgKiBtYXBwZWQuICgwIG1lYW5zIGFsbCBwYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBtYXBwZWQpLlxuMjYyMzpcdCAqXG4yNjI0Olx0ICogUHJlZmVycmVkIG92ZXIgdm1faW5zZXJ0X3BhZ2UoKSB3aGVuIGluc2VydGluZyBtdWx0aXBsZSBwYWdlcy5cbjI2MjU6XHQgKlxuMjYyNjpcdCAqIEluIGNhc2Ugb2YgZXJyb3IsIHdlIG1heSBoYXZlIG1hcHBlZCBhIHN1YnNldCBvZiB0aGUgcHJvdmlkZWRcbjI2Mjc6XHQgKiBwYWdlcy4gSXQgaXMgdGhlIGNhbGxlciYjMzk7cyByZXNwb25zaWJpbGl0eSB0byBhY2NvdW50IGZvciB0aGlzIGNhc2UuXG4yNjI4Olx0ICpcbjI2Mjk6XHQgKiBUaGUgc2FtZSByZXN0cmljdGlvbnMgYXBwbHkgYXMgaW4gdm1faW5zZXJ0X3BhZ2UoKS5cbjI2MzA6XHQgKi9cbjI2MzE6XHRpbnQgdm1faW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4yNjMyOlx0XHRcdFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtKVxuMjYzMzpcdHtcbjI2MzQ6XHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAqbnVtO1xuMjYzNTpcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICYjNDM7IFBBR0VfU0laRSAqIG5yX3BhZ2VzO1xuMjYzNjpcdFxuMjYzNzpcdFx0aWYgKCFyYW5nZV9pbl92bWEodm1hLCBhZGRyLCBlbmQpKVxuMjYzODpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjI2Mzk6XHRcdGlmICghKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTUlYRURNQVApKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDI5MAoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDQzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoOiBBIE1lbW9yeSBNYW5hZ2VtZW50IEJ1ZyBGaXgqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBmaWd1cmUgb3V0IHdoYXQmIzM5O3MgY2hhbmdlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBmbG93IHdpdGhpbiBgaW5zZXJ0X3BhZ2VzYCBhbmQgaWRlbnRpZnkgdGhlIHByb2JsZW0uIFRoZSBjb3JlIGlzc3VlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIGVycm9yIGhhbmRsaW5nLCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggcGFnZSB0YWJsZSBtYW5pcHVsYXRpb24uCgpGaXJzdCwgSSBzZWUgdGhlIHByZS1wYXRjaCBiZWhhdmlvci4gSWYgYHdhbGtfdG9fcG1kYCBmYWlsZWQsIHRoZSByZXR1cm4gdmFsdWUgd2FzIC1FRkFVTFQuIFRoZW4gaWYgYHB0ZV9hbGxvY2AgZmFpbHMsIHRoZSByZXR1cm4gdmFsdWUgd2FzIC1FTk9NRU0uIEl0IHNlZW1zIHRoYXQgdGhlcmUgYXJlIGEgZmV3IHBsYWNlcyB0aGF0IGNhbiBjYXVzZSBhbiBlcnJvciBoZXJlLiBBbmQgaW4gdGhlIGxvb3AsIGlmIHdlIGZhaWxlZCB0byBnZXQgdGhlIHB0ZSwgdGhlIHJldHVybiB2YWx1ZSB3YXMgLUVGQVVMVCBhcyB3ZWxsLiBXaXRoaW4gdGhlIGxvb3AsIGBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWRgIHNldHMgdGhlIGBlcnJgIHZhcmlhYmxlLCB3aGljaCBjYW4gYmUgbm9uLXplcm8uIFRoZSBpbXBvcnRhbnQgdGhpbmcgdG8gdW5kZXJzdGFuZCBpcyB0aGF0IHRoZSBgcmV0YCB2YXJpYWJsZSBpcyBzZXQgdG8gMCBhdCB0aGUgZW5kLgoKVGhlIGJ1ZyB0aGVuLCBhcyBJIHVuZGVyc3RhbmQgaXQsIHN0ZW1zIGZyb20gdGhlIGhhbmRsaW5nIG9mIGEgTlVMTCBwbWQgcmV0dXJuZWQgYnkgYHdhbGtfdG9fcG1kYC4gUHJldmlvdXNseSwgdGhlIGNvZGUgYXNzaWduZWQgYC1FRkFVTFRgIHRvIGByZXRgLCBidXQgdGhpcyBpc24mIzM5O3QgbmVjZXNzYXJpbHkgY29ycmVjdCwgaXMgaXQ/IFdlIHNob3VsZCBiZSByZXR1cm5pbmcgYC1FTk9NRU1gIGluIHRoZXNlIGNhc2VzLCBiZWNhdXNlIHRoYXQmIzM5O3Mgd2hhdCBgcHRlX2FsbG9jYCByZXR1cm5lZC4gVGhlIHBhdGNoIGNvcnJlY3RseSBpZGVudGlmaWVzIHRoaXMgYW5kIHVwZGF0ZXMgdGhlIHJldHVybiB2YWx1ZS4gSSBhbSBub3RpbmcgdGhlIHZhcmlhYmxlIG5hbWUgY2xlYW51cCBiZXR3ZWVuIGByZXRgIGFuZCBgZXJyYC4gQm90aCBhcmUgdXNlZCBpbiBzaW1pbGFyIHBsYWNlcyB0byBtZWFuIGFuIGVycm9yIGNvZGUuCgpUaGUgbG9naWMgY2hhbmdlIGlzIGNsZWFyLiBJdCBlbnN1cmVzIHRoYXQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMsIHNwZWNpZmljYWxseSB0aG9zZSBkdXJpbmcgcGFnZSB0YWJsZSB3YWxrcywgYXJlIGNvbnNpc3RlbnRseSBzaWduYWxlZCB3aXRoIGAtRU5PTUVNYCwgcmF0aGVyIHRoYW4gdGhlIHBvdGVudGlhbGx5IG1pc2xlYWRpbmcgYC1FRkFVTFRgLiBUaGlzIGFsaWducyB3aXRoIHN0YW5kYXJkIGVycm9yIGNvZGVzIGFuZCBhaWRzIGluIG1vcmUgYWNjdXJhdGUgZGVidWdnaW5nLgoKTm93LCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QsIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGxlcnMgb2YgYHZtX2luc2VydF9wYWdlc2Agb3IgYGluc2VydF9wYWdlc2AuIENvbnRleHQgaXMga2luZywgc28gSSBuZWVkIHRvIHNlZSAqd2hlcmUqIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgdXNlZCB0byBhcHByZWNpYXRlIHRoZSBzY29wZSBvZiB0aGUgZml4LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZtX2luc2VydF9wYWdlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2FjY2VsL2FtZHhkbmEvYW1keGRuYV9nZW0uYz01Mjc9c3RhdGljIGludCBhbWR4ZG5hX2dlbV9kbWFidWZfbW1hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1Ziwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQzLVx0dm1fZmxhZ3NfbW9kKHZtYSwgVk1fTUlYRURNQVAsIFZNX1BGTk1BUCk7XG5kcml2ZXJzL2FjY2VsL2FtZHhkbmEvYW1keGRuYV9nZW0uYzo1NDQ6XHRyZXQgPSB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXHUwMDNldm1fc3RhcnQsIGFiby1cdTAwM2ViYXNlLnBhZ2VzLFxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQ1LVx0XHRcdCAgICAgIFx1MDAyNm51bV9wYWdlcyk7XG4tLVxuaW5jbHVkZS9saW51eC9tbS5oPTQ3NzI9aW50IHZtX2luc2VydF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwYWdlICopO1xuaW5jbHVkZS9saW51eC9tbS5oOjQ3NzM6aW50IHZtX2luc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuaW5jbHVkZS9saW51eC9tbS5oLTQ3NzQtXHRcdFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtKTtcbi0tXG5pb191cmluZy9tZW1tYXAuYz0zMDc9c3RhdGljIGludCBpb19yZWdpb25fbW1hcChzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCxcbi0tXG5pb191cmluZy9tZW1tYXAuYy0zMTQtXHR2bV9mbGFnc19zZXQodm1hLCBWTV9ET05URVhQQU5EKTtcbmlvX3VyaW5nL21lbW1hcC5jOjMxNTpcdHJldHVybiB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXHUwMDNldm1fc3RhcnQsIG1yLVx1MDAzZXBhZ2VzLCBcdTAwMjZucl9wYWdlcyk7XG5pb191cmluZy9tZW1tYXAuYy0zMTYtfVxuLS1cbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jPTc2Njc9c3RhdGljIGludCBfX3JiX21hcF92bWEoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsXG4tLVxua2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMtNzc1Ni1cbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jOjc3NTc6XHRlcnIgPSB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXHUwMDNldm1fc3RhcnQsIHBhZ2VzLCBcdTAwMjZucl9wYWdlcyk7XG5rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYy03NzU4LVxuLS1cbm1tL21lbW9yeS5jPTI1NTg9c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy0yNjE2LS8qKlxubW0vbWVtb3J5LmM6MjYxNzogKiB2bV9pbnNlcnRfcGFnZXMgLSBpbnNlcnQgbXVsdGlwbGUgcGFnZXMgaW50byB1c2VyIHZtYSwgYmF0Y2hpbmcgdGhlIHBtZCBsb2NrLlxubW0vbWVtb3J5LmMtMjYxOC0gKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cbi0tXG5tbS9tZW1vcnkuYy0yNjMwLSAqL1xubW0vbWVtb3J5LmM6MjYzMTppbnQgdm1faW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy0yNjMyLVx0XHRcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcbi0tXG5tbS9tZW1vcnkuYy0yNjQ2LX1cbm1tL21lbW9yeS5jOjI2NDc6RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZXMpO1xubW0vbWVtb3J5LmMtMjY0OC1cbi0tXG5tbS9tZW1vcnkuYz0yNzM5PXN0YXRpYyBpbnQgX192bV9tYXBfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4tLVxubW0vbWVtb3J5LmMtMjc1Mi1cbm1tL21lbW9yeS5jOjI3NTM6XHRyZXR1cm4gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgdWFkZHIsIHBhZ2VzICYjNDM7IG9mZnNldCwgXHUwMDI2Y291bnQpO1xubW0vbWVtb3J5LmMtMjc1NC19XG4tLVxubW0vbm9tbXUuYz0zNTA9RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZSk7XG5tbS9ub21tdS5jLTM1MS1cbm1tL25vbW11LmM6MzUyOmludCB2bV9pbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL25vbW11LmMtMzUzLVx0XHRcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcbi0tXG5tbS9ub21tdS5jLTM1Ni19XG5tbS9ub21tdS5jOjM1NzpFWFBPUlRfU1lNQk9MKHZtX2luc2VydF9wYWdlcyk7XG5tbS9ub21tdS5jLTM1OC1cbi0tXG5uZXQvaXB2NC90Y3AuYz0yMDYyPXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3ZtX2luc2VydF9iYXRjaF9lcnJvcihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5uZXQvaXB2NC90Y3AuYy0yMDg4LVx0XHQvKiBXZSBjYWxsZWQgemFwX3ZtYV9yYW5nZSwgdHJ5IHRvIHJlaW5zZXJ0LiAqL1xubmV0L2lwdjQvdGNwLmM6MjA4OTpcdFx0ZXJyID0gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgKmFkZHJlc3MsXG5uZXQvaXB2NC90Y3AuYy0yMDkwLVx0XHRcdFx0ICAgICAgcGVuZGluZ19wYWdlcyxcbi0tXG5uZXQvaXB2NC90Y3AuYz0yMTEwPXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3ZtX2luc2VydF9iYXRjaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5uZXQvaXB2NC90Y3AuYy0yMTIzLVxubmV0L2lwdjQvdGNwLmM6MjEyNDpcdGVyciA9IHZtX2luc2VydF9wYWdlcyh2bWEsICphZGRyZXNzLCBwYWdlcywgXHUwMDI2cGFnZXNfcmVtYWluaW5nKTtcbm5ldC9pcHY0L3RjcC5jLTIxMjUtXHRwYWdlc19tYXBwZWQgPSBwYWdlc190b19tYXAgLSAodW5zaWduZWQgaW50KXBhZ2VzX3JlbWFpbmluZztcbm5ldC9pcHY0L3RjcC5jLTIxMjYtXHRieXRlc19tYXBwZWQgPSBQQUdFX1NJWkUgKiBwYWdlc19tYXBwZWQ7XG5uZXQvaXB2NC90Y3AuYzoyMTI3Olx0LyogRXZlbiBpZiB2bV9pbnNlcnRfcGFnZXMgZmFpbHMsIGl0IG1heSBoYXZlIHBhcnRpYWxseSBzdWNjZWVkZWQgaW5cbm5ldC9pcHY0L3RjcC5jLTIxMjgtXHQgKiBtYXBwaW5nIChzb21lIGJ1dCBub3QgYWxsIG9mIHRoZSBwYWdlcykuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjUwMQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIEkgZGVsdmUgaW50byB0aGlzIGNvZGU6CgoqKkRpdmluZyBpbnRvIGB2bV9pbnNlcnRfcGFnZXNgIFVzYWdlKioKCk9rYXksIHNvIGB2bV9pbnNlcnRfcGFnZXNgIGlzIGEgcmVhbCB3b3JraG9yc2UuIEkga25vdyBpdCYjMzk7cyBjcnVjaWFsIGZvciBgaW9fdXJpbmdgLCB3aGljaCBtYWtlcyBzZW5zZSBnaXZlbiBpdHMgbmVlZCBmb3IgZGlyZWN0IG1lbW9yeSBhY2Nlc3MuIEkgYWxzbyByZWNhbGwgc2VlaW5nIGl0IGluIHRoZSBgdGNwYCB6ZXJvY29weSBwYXRoIOKAkyBwYXJ0aWN1bGFybHkgdGhhdCBgdGNwX3plcm9jb3B5X3JlY2VpdmVgIGZ1bmN0aW9uLiBPZiBjb3Vyc2UsIHRoZSBgcmluZ19idWZmZXJgIGNvZGUgdXNlcyBpdCB0b28sIGFuZCBpdCYjMzk7cyBlc3NlbnRpYWwgZm9yIGB2bV9tYXBfcGFnZXNgIGFuZCBvdGhlciBtZW1vcnkgbWFwcGluZyBvcGVyYXRpb25zLgoKVGhlIHJlYWwgcXVlc3Rpb24gSSBoYXZlIGlzIHVuZGVyc3RhbmRpbmcgdGhlIGlubmVyIGRldGFpbHMgb2YgdGhlIG9wZXJhdGlvbi4gSSBuZWVkIHRvIGdldCB0byB0aGUgY29yZSwgc28gbGV0JiMzOTtzIGNoZWNrIG91dCBgX192bV9tYXBfcGFnZXNgIGxvY2F0ZWQgaW4gYG1tL21lbW9yeS5jYC4gSSBoYXZlIGEgZmVlbGluZyB0aGF0IGZ1bmN0aW9uIHdpbGwgc2hlZCBzb21lIGxpZ2h0IG9uIHRoZSBsb3ctbGV2ZWwgbWVjaGFuaWNzIG9mIGFsbCB0aGVzZSB1c2VzLCBhbmQgd2hhdCB0aGUgY29yZSBiZWhhdmlvciBhbmQgc2lkZSBlZmZlY3RzIGFyZS4gVGltZSB0byBzdGFydCBkaWdnaW5nIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fdm1fbWFwX3BhZ2VzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTI3MjQ9RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZSk7XG4tLVxubW0vbWVtb3J5LmMtMjcyNi0vKlxubW0vbWVtb3J5LmM6MjcyNzogKiBfX3ZtX21hcF9wYWdlcyAtIG1hcHMgcmFuZ2Ugb2Yga2VybmVsIHBhZ2VzIGludG8gdXNlciB2bWFcbm1tL21lbW9yeS5jLTI3MjgtICogQHZtYTogdXNlciB2bWEgdG8gbWFwIHRvXG4tLVxubW0vbWVtb3J5LmMtMjczOC0gKi9cbm1tL21lbW9yeS5jOjI3Mzk6c3RhdGljIGludCBfX3ZtX21hcF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbm1tL21lbW9yeS5jLTI3NDAtXHRcdFx0XHR1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpXG4tLVxubW0vbWVtb3J5LmM9Mjc3ND1pbnQgdm1fbWFwX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL21lbW9yeS5jLTI3NzYte1xubW0vbWVtb3J5LmM6Mjc3NzpcdHJldHVybiBfX3ZtX21hcF9wYWdlcyh2bWEsIHBhZ2VzLCBudW0sIHZtYV9zdGFydF9wZ29mZih2bWEpKTtcbm1tL21lbW9yeS5jLTI3NzgtfVxuLS1cbm1tL21lbW9yeS5jPTI3OTQ9aW50IHZtX21hcF9wYWdlc196ZXJvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL21lbW9yeS5jLTI3OTYte1xubW0vbWVtb3J5LmM6Mjc5NzpcdHJldHVybiBfX3ZtX21hcF9wYWdlcyh2bWEsIHBhZ2VzLCBudW0sIDApO1xubW0vbWVtb3J5LmMtMjc5OC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE3MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYHdhbGtfdG9fcG1kYCBpbiBgbW0vbWVtb3J5LmNgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyBgd2Fsa190b19wbWRgIGZ1bmN0aW9ucyB3aXRoaW4gYG1tL21lbW9yeS5jYC4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBpdHMgcm9sZSwgdGhlIGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcywgYW5kIGhvdyBpdCBjb250cmlidXRlcyB0byB0aGUgb3ZlcmFsbCBwYWdlIHRhYmxlIHRyYXZlcnNhbCBwcm9jZXNzLiBJJiMzOTttIGFzc3VtaW5nLCBvZiBjb3Vyc2UsIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjZW50cmFsIHRvIHRoZSBoaWdoZXItbGV2ZWwgYWRkcmVzcyB0cmFuc2xhdGlvbiB0YXNrcy4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGNsb3NlbHkgYXQgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIHBhZ2UgZmF1bHRzLCB3aGF0IGxvY2tpbmcgbWVjaGFuaXNtcyBpdCBlbXBsb3lzIHRvIGVuc3VyZSBjb25jdXJyZW5jeSBzYWZldHkgKGlmIGFueSksIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgcGFnZSB0YWJsZSBzdHJ1Y3R1cmVzLiBXaGF0IGFyZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucz8gV2hhdCBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBleHBlY3RlZCwgYW5kIHdoYXQgYXJlIHRoZSByZXR1cm4gdmFsdWVzPyBBcmUgdGhlcmUgYW55IHN1YnRsZSBvcHRpbWl6YXRpb25zIGluIHBsYXksIHBlcmhhcHMgcmVsYXRlZCB0byBUTEIgbWFuYWdlbWVudCBvciBwcmVmZXRjaGluZz8gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBtYWdpYyBoYXBwZW5zLCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdCBjb21wbGV0ZWx5IHRvIHRyb3VibGVzaG9vdCBhbnkgbWVtb3J5LXJlbGF0ZWQgaXNzdWVzLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIGJ1Z3MgdGhhdCBtaWdodCBsdXJrIGluIHRoaXMgZnVuY3Rpb24sIGtub3dpbmcgaG93IGNydWNpYWwgaXQgaXMgdG8gdGhlIHdob2xlIG1lbW9yeSBzdWJzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3dhbGtfdG9fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTI0MDA9RVhQT1JUX1NZTUJPTF9HUEwoemFwX3NwZWNpYWxfdm1hX3JhbmdlKTtcbm1tL21lbW9yeS5jLTI0MDEtXG5tbS9tZW1vcnkuYzoyNDAyOnN0YXRpYyBwbWRfdCAqd2Fsa190b19wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcbm1tL21lbW9yeS5jLTI0MDMte1xuLS1cbm1tL21lbW9yeS5jPTI0MjQ9cHRlX3QgKmdldF9sb2NrZWRfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtMjQyNi17XG5tbS9tZW1vcnkuYzoyNDI3Olx0cG1kX3QgKnBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTtcbm1tL21lbW9yeS5jLTI0MjgtXG4tLVxubW0vbWVtb3J5LmM9MjU1OD1zdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTI1NjktbW9yZTpcbm1tL21lbW9yeS5jOjI1NzA6XHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG5tbS9tZW1vcnkuYy0yNTcxLVx0aWYgKCFwbWQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzc2MwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqSW52ZXN0aWdhdGluZyBgd2Fsa190b19wbWRgKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgd2Fsa190b19wbWRgIGZ1bmN0aW9uLiBJJiMzOTttIGFzc3VtaW5nIGl0JiMzOTtzIHJlbGF0ZWQgdG8gc29tZSBzb3J0IG9mIHBhdGggcGxhbm5pbmcgb3IgbW90aW9uIGNvbnRyb2wsIHByb2JhYmx5IGZvciBhIHBoeXNpY2FsIGRldmljZSBvciBhIHNpbXVsYXRlZCBlbnZpcm9ubWVudCwgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtXaGF0IGFyZSB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzPyYjMzQ7LiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIGZ1bmN0aW9uJiMzOTtzIHNpZ25hdHVyZSDigJMgZG9lcyBpdCB0YWtlIGEgdGFyZ2V0IFBNRCAocHJlc3VtYWJseSBhICYjMzQ7cG9pbnQgbWFzcyBkaXN0cmlidXRpb24sJiMzNDsgb3IgcGVyaGFwcyBzb21ldGhpbmcgbW9yZSBzcGVjaWZpYyB0byB0aGUgZG9tYWluKSBhcyBhbiBhcmd1bWVudD8gSXMgaXQgZXhwZWN0aW5nIGFuIGluaXRpYWwgc3RhdGUsIGN1cnJlbnQgcG9zaXRpb24vb3JpZW50YXRpb24sIG9yIGEgc3RhcnQgbG9jYXRpb24/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByZXR1cm4gdmFsdWUuIElzIGl0IGEgdHJhamVjdG9yeSwgYSBzaW5nbGUgY29udHJvbCBhY3Rpb24sIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MvZmFpbHVyZSwgb3IgbWF5YmUgZXZlbiBhbiBpbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmU/IFRoZSBzZW1hbnRpY3MgaGVyZSBhcmUgY3JpdGljYWwuCgpOZXh0LCBJJiMzOTtsbCB3YW50IHRvIHRyYWNlIGl0cyBleGVjdXRpb24gcGF0aC4gSSYjMzk7bGwgbWVudGFsbHkgc3RlcCB0aHJvdWdoIHRoZSBjb2RlLCBsb29raW5nIGZvciBhbnkgZWRnZSBjYXNlcywgYm91bmRhcnkgY29uZGl0aW9ucywgb3IgYXNzdW1wdGlvbnMgaXQgbWlnaHQgbWFrZS4gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3MsIG9yIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUgb3BlcmF0aW9ucyB0aGF0IHdvdWxkIGJlIGltbWVkaWF0ZWx5IGFwcGFyZW50PyBJ4oCZbGwgYmUgY2hlY2tpbmcgZm9yIGFueSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgZnVuY3Rpb25zIG9yIG1vZHVsZXMgd2l0aGluIHRoaXMgY29kZWJhc2Ug4oCTIHRob3NlIGFyZSBhbHdheXMgaW1wb3J0YW50IHRvIHRyYWNlLgoKSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgZXJyb3IgaGFuZGxpbmcuIERvZXMgaXQgdGhyb3cgZXhjZXB0aW9ucywgcmV0dXJuIGVycm9yIGNvZGVzLCBvciBzaWxlbnRseSBmYWlsPyBSb2J1c3RuZXNzIGlzIGtleSwgZXNwZWNpYWxseSBpZiB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgYSByZWFsLXdvcmxkIHN5c3RlbS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IGlmIHRoZSBjb2RlIGhhcyBhZGVxdWF0ZSB1bml0IHRlc3RzIGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cyBhc3NvY2lhdGVkIHdpdGggaXQuIElmIHRoaXMgYHdhbGtfdG9fcG1kYCBmdW5jdGlvbiBpcyBmYWlsaW5nLCBvciBJJiMzOTttIHRyeWluZyB0byBpbXByb3ZlIGl0cyBwZXJmb3JtYW5jZSwgSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBsb2dnaW5nIHN0YXRlbWVudHMgYXJlIHRvIHVuZGVyc3RhbmQgaXRzIGJlaGF2aW9yLgoKRmluYWxseSwgSSYjMzk7bGwgYmUgZm9ybWluZyBzb21lIGh5cG90aGVzZXMgYWJvdXQgaG93IHRoZSBmdW5jdGlvbiB3b3Jrcy4gSXMgaXQgdXNpbmcgYSBzdGFuZGFyZCBwYXRoIHBsYW5uaW5nIGFsZ29yaXRobSBsaWtlIEEqLCBSUlQsIG9yIHNvbWV0aGluZyBtb3JlIGJlc3Bva2U/IERvZXMgaXQgY29uc2lkZXIgY29sbGlzaW9uIGF2b2lkYW5jZSwgZHluYW1pYyBjb25zdHJhaW50cywgYW5kIGFueSBwb3RlbnRpYWwgcGh5c2ljYWwgbGltaXRhdGlvbnMgb2YgdGhlICYjMzQ7d2Fsa2VyJiMzNDs/IFRoZSBzcGVjaWZpY3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IHBvaW50IHRvIHRoZSB1bmRlcmx5aW5nIG1ldGhvZG9sb2d5IGFuZCBhbnkgcG9zc2libGUgb3B0aW1pc2F0aW9ucy4gVGhpcyBkZWVwZXIgdW5kZXJzdGFuZGluZyB3aWxsIGJlIGVzc2VudGlhbCB0byBldmFsdWF0ZSBpdHMgb3ZlcmFsbCBlZmZlY3RpdmVuZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjQwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNDAwOlx0RVhQT1JUX1NZTUJPTF9HUEwoemFwX3NwZWNpYWxfdm1hX3JhbmdlKTtcbjI0MDE6XHRcbjI0MDI6XHRzdGF0aWMgcG1kX3QgKndhbGtfdG9fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpXG4yNDAzOlx0e1xuMjQwNDpcdFx0cGdkX3QgKnBnZDtcbjI0MDU6XHRcdHA0ZF90ICpwNGQ7XG4yNDA2Olx0XHRwdWRfdCAqcHVkO1xuMjQwNzpcdFx0cG1kX3QgKnBtZDtcbjI0MDg6XHRcbjI0MDk6XHRcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpO1xuMjQxMDpcdFx0cDRkID0gcDRkX2FsbG9jKG1tLCBwZ2QsIGFkZHIpO1xuMjQxMTpcdFx0aWYgKCFwNGQpXG4yNDEyOlx0XHRcdHJldHVybiBOVUxMO1xuMjQxMzpcdFx0cHVkID0gcHVkX2FsbG9jKG1tLCBwNGQsIGFkZHIpO1xuMjQxNDpcdFx0aWYgKCFwdWQpXG4yNDE1Olx0XHRcdHJldHVybiBOVUxMO1xuMjQxNjpcdFx0cG1kID0gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpO1xuMjQxNzpcdFx0aWYgKCFwbWQpXG4yNDE4Olx0XHRcdHJldHVybiBOVUxMO1xuMjQxOTpcdFxuMjQyMDpcdFx0Vk1fQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTtcbjI0MjE6XHRcdHJldHVybiBwbWQ7XG4yNDIyOlx0fVxuMjQyMzpcdFxuMjQyNDpcdHB0ZV90ICpnZXRfbG9ja2VkX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuMjQyNTpcdFx0XHQgICAgICBzcGlubG9ja190ICoqcHRsKVxuMjQyNjpcdHtcbjI0Mjc6XHRcdHBtZF90ICpwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4yNDI4Olx0XG4yNDI5Olx0XHRpZiAoIXBtZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjdtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODcyOAoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDcxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipXb3J0aEZ1enppbmcgQXNzZXNzbWVudDogS2VybmVsIE1lbW9yeSBBbGxvY2F0aW9uIEVycm9yIEhhbmRsaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgcGF0Y2ggY2hhbmdlcyBob3cgd2UgaGFuZGxlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzIHdpdGhpbiB0aGUgY29yZSBrZXJuZWwsIHNwZWNpZmljYWxseSBpbiBgbW0vbWVtb3J5LmNgLiBJdCYjMzk7cyBhIHJlbGF0aXZlbHkgZm9jdXNlZCBjaGFuZ2U7IHRoZSBtb2RpZmljYXRpb24gaXMgaW4gYHdhbGtfdG9fcG1kYCBhbmQgaG93IGVycm9ycyBwcm9wYWdhdGUgaW4gYGluc2VydF9wYWdlcygpYC4gUHJldmlvdXNseSwgYSBudWxsIHJldHVybiBmcm9tIGB3YWxrX3RvX3BtZGAgKGluZGljYXRpbmcgcGFnZSB0YWJsZSBhbGxvY2F0aW9uIGZhaWx1cmUsIHVzaW5nIGBwNGRfYWxsb2NgLCBgcHVkX2FsbG9jYCwgb3IgYHBtZF9hbGxvY2ApIHJlc3VsdGVkIGluIGAtRUZBVUxUYC4gVGhlIHBhdGNoIGVsZWdhbnRseSBjb3JyZWN0cyB0aGlzLCBjaGFuZ2luZyB0aGUgcmV0dXJuIGNvZGUgdG8gYC1FTk9NRU1gLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hhdCB3ZSBleHBlY3Qgd2hlbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4gVGhpcyBjaGFuZ2UgYWxzbyBjbGVhbnMgdXAgc29tZSBsb2NhbCB2YXJpYWJsZSBtYW5hZ2VtZW50LgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZy4gSSBuZWVkIHRvIGFwcGx5IHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBUaGUgaW5zdHJ1Y3Rpb25zIHNwZWNpZnkgdGhhdCB3ZSBzaG91bGQgYXZvaWQgZnV6emluZyBkb2N1bWVudGF0aW9uIGNoYW5nZXMsIGxvZ2dpbmcgbW9kaWZpY2F0aW9ucywgY29zbWV0aWMgY2hhbmdlcyB0byBjb25zdGFudHMsIHVucmVhY2hhYmxlIGNvZGUgcGF0aHMgKGVzcGVjaWFsbHkgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVSksIHZlbmRvci1zcGVjaWZpYyBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLCBldGMuIEhvd2V2ZXIsIHRoaXMgY2hhbmdlICpkb2VzKiBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKGBtbS9tZW1vcnkuY2ApLiBTcGVjaWZpY2FsbHksIGl0JiMzOTtzIG1vZGlmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHJldHVybiB2YWx1ZXMgb2YgYGluc2VydF9wYWdlcygpYCBhbmQgYHZtX2luc2VydF9wYWdlcygpYC4KCk5leHQsIEkgbmVlZCB0byBjb25maXJtIGlmIHRoZSBhZmZlY3RlZCBjb2RlIGlzIHJlYWNoYWJsZSBpbiBhIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnQuIFRoZSBnb29kIG5ld3MgaXMsIGB2bV9pbnNlcnRfcGFnZXMoKWAgaXMgbm90IG9ic2N1cmU7IGl0JiMzOTtzIHJlYWNoYWJsZSB2aWEgc2V2ZXJhbCBjb21tb24ga2VybmVsIGZlYXR1cmVzLCBpbmNsdWRpbmcgYGlvX3VyaW5nYCBtbWFwLCBUQ1AgemVyb2NvcHkgKGBnZXRzb2Nrb3B0KC4uLiwgVENQX1pFUk9DT1BZX1JFQ0VJVkUsIC4uLilgKSwgYW5kIHJpbmdfYnVmZmVyIG1tYXAuIFRoaXMgY29uZmlybXMgdGhlIHJlYWNoYWJpbGl0eSBhbmQgdGhlIHBvdGVudGlhbCBmb3IgYSBmdXp6IHRhcmdldC4gVGhlIGNoYW5nZSBhbHNvIG1vZGlmaWVzIGVycm9yIGhhbmRsaW5nIHdoaWNoIGlzIGRlZmluaXRlbHkgd29ydGggZXhwbG9yaW5nLgoKRmluYWxseSwgbGV0JiMzOTtzIGV4YW1pbmUgcG90ZW50aWFsIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiBgbW0vbWVtb3J5LmNgIGlzIGNvcmUgdG8gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCBhbmQgaXMgYWx3YXlzIGJ1aWx0IGludG8gdGhlIGNvcmUuIEkgY2FuIHZlcmlmeSB0aGlzIGJ5IGNoZWNraW5nIHRoZSBgbW0vTWFrZWZpbGVgIGFuZCBgbW0vS2NvbmZpZ2AsIGJ1dCB0aGlzIGlzIHVzdWFsbHkgYSBnaXZlbi4gTm8gc3BlY2lhbCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgY2hhbmdlIG9yIHRlc3QgaXRzIGltcGxpY2F0aW9ucy4gSSB3aWxsIGFsc28gY2hlY2sgdGhlICYjMzQ7Zm9jdXMgc3ltYm9scyYjMzQ7IHdoaWNoIGluY2x1ZGUgYHZtX2luc2VydF9wYWdlc2AsIGB2bV9tYXBfcGFnZXNgLCBhbmQgYHZtX21hcF9wYWdlc196ZXJvYC4gV2hpbGUgSSBjYW4mIzM5O3QgYmUgKmNvbXBsZXRlbHkqIGNlcnRhaW4gd2l0aG91dCBhIGRlZXBlciBkaXZlLCBgdm1faW5zZXJ0X3BhZ2VzYCBpcyBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciBmdXp6aW5nLgoKVGhlcmVmb3JlLCBiZWNhdXNlIHRoaXMgcGF0Y2ggbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBhZGRyZXNzZXMgcG90ZW50aWFsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9ycyBpbiBhIGNvbW1vbiBjb2RlIHBhdGgsIG15IGFzc2Vzc21lbnQgaXMgKipXb3J0aEZ1enppbmc9dHJ1ZSoqLiBUaGUgc3dpdGNoIGZyb20gYC1FRkFVTFRgIHRvIGAtRU5PTUVNYCBpcyBhIHNlbWFudGljYWxseSBjb3JyZWN0IGNoYW5nZSwgd2hpY2ggaXMgd29ydGggZnV6emluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtb3J5XFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTM2PW1tdS15XHRcdFx0Oj0gbm9tbXUub1xubW0vTWFrZWZpbGU6Mzc6bW11LSQoQ09ORklHX01NVSlcdDo9IGhpZ2htZW0ubyBtZW1vcnkubyBtaW5jb3JlLm8gXFxcbm1tL01ha2VmaWxlLTM4LVx0XHRcdCAgIG1sb2NrLm8gbW1hcC5vIG1tdV9nYXRoZXIubyBtcHJvdGVjdC5vIG1yZW1hcC5vIFxcXG4tLVxubW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTEwOTQ9c3RhdGljIHNzaXplX3QgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC12MS5jLTExODAtXHRcdGV2ZW50LVx1MDAzZXVucmVnaXN0ZXJfZXZlbnQgPSBtZW1fY2dyb3VwX3VzYWdlX3VucmVnaXN0ZXJfZXZlbnQ7XG5tbS9tZW1jb250cm9sLXYxLmM6MTE4MTpcdH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBcJiMzNDttZW1vcnkub29tX2NvbnRyb2xcJiMzNDspKSB7XG5tbS9tZW1jb250cm9sLXYxLmMtMTE4Mi1cdFx0cHJfd2Fybl9vbmNlKFwmIzM0O29vbV9jb250cm9sIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gXCYjMzQ7XG4tLVxubW0vbWVtY29udHJvbC5jPTIwMzk9dm9pZCBtZW1fY2dyb3VwX3ByaW50X29vbV9ncm91cChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4tLVxubW0vbWVtY29udHJvbC5jLTIwNDItXHRwcl9jb250X2Nncm91cF9wYXRoKG1lbWNnLVx1MDAzZWNzcy5jZ3JvdXApO1xubW0vbWVtY29udHJvbC5jOjIwNDM6XHRwcl9jb250KFwmIzM0OyBhcmUgZ29pbmcgdG8gYmUga2lsbGVkIGR1ZSB0byBtZW1vcnkub29tLmdyb3VwIHNldFxcblwmIzM0Oyk7XG5tbS9tZW1jb250cm9sLmMtMjA0NC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTAzCgkJCQkJCQlvdXRwdXQ6IDEzOAoJCQkJCQkJdGhvdWdodHM6IDc0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqSW52ZXN0aWdhdGluZyB0aGUgYG1lbW9yeS5vYCBEZXBlbmRlbmN5KioKClJpZ2h0LCBzbyBgbWVtb3J5Lm9gIGlzIGJ1aWx0IHdpdGggYENPTkZJR19NTVVgLiBUaGF0JiMzOTtzIGEgcHJldHR5IHN0YW5kYXJkIHRoaW5nLCBlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gQnV0IEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSAqd2h5KiBiZWhpbmQgdGhpcyBkZXBlbmRlbmN5LiBBcmUgdGhlcmUgb3RoZXIgY29uZmlndXJhdGlvbnMgdGhhdCBhbHNvIGVuYWJsZSBjYWxsaW5nIGludG8gbW9kdWxlcyB0aGF0IHJlbHkgb24gdGhlIE1NVT8gSSYjMzk7bSB0aGlua2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgdGhpbmdzIGxpa2UgVENQIHplcm8tY29weSBvciBJT19VUklORywgd2hpY2ggbWlnaHQgaW5kaXJlY3RseSByZXF1aXJlIHRoaXMuIExldCYjMzk7cyBtYWtlIGEgcXVpY2sgbm90ZTogYElORVRgLCBgSU9fVVJJTkdgLCBhbmQgYE1NVWAuIE9rYXksIEkmIzM5O2xsIHN0YXJ0IGJ5IGRyaWxsaW5nIGRvd24gb24gdGhlIGBNTVVgIHVzYWdlIGZpcnN0LiBUaGF0IHNlZW1zIGxpa2UgdGhlIG1vc3Qgb2J2aW91cyBzdGFydGluZyBwb2ludCBmb3IgYW4gaW52ZXN0aWdhdGlvbi4KCkFscmlnaHQsIHRoYXQgZmVlbHMgbGlrZSBhIGdvb2QgcGxhbi4gTm93LCB0byBtYWtlIHN1cmUgSSBhbSBvbiB0cmFjayB3aXRoIG15IGludmVzdGlnYXRpb24sIGxldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNTVUmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2bV9pbnNlcnRfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3ZtX21hcF9wYWdlc196ZXJvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01NVSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtX2luc2VydF9wYWdlcyYjMzQ7LAogICAgJiMzNDt2bV9tYXBfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzX3plcm8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgcmV0dXJuIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jIHdpdGhpbiBpbnNlcnRfcGFnZXMoKSAoYW5kIHRyYW5zaXRpdmVseSB2bV9pbnNlcnRfcGFnZXMoKSksIGNvcnJlY3RseSByZXR1cm5pbmcgLUVOT01FTSBpbnN0ZWFkIG9mIC1FRkFVTFQgd2hlbiB3YWxrX3RvX3BtZCgpIG9yIHB0ZV9hbGxvYygpIGZhaWxzLiBUaGlzIGFmZmVjdHMgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IHVzZWQgYnkgaW9fdXJpbmcsIG5ldHdvcmtpbmcgKFRDUCB6ZXJvY29weSksIGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOSAxNzozODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGlzIGEgcmVmYWN0b3Jpbmcgb2YgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYzppbnNlcnRfcGFnZXMoKSwgdW5pZnlpbmcgdGhlIGxvY2FsIHJldHVybiB2YXJpYWJsZSBgZXJyYCAocHJldmlvdXNseSBgcmV0YCBhbmQgYSBzaGFkb3dlZCBgZXJyYCkgYW5kIGNoYW5naW5nIHRoZSBlcnJvciBjb2RlIHdoZW4gYHdhbGtfdG9fcG1kKClgIGZhaWxzIGZyb20gLUVGQVVMVCB0byAtRU5PTUVNLlxuXG5ObyBuZXcgYWxsb2NhdGlvbnMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBidWZmZXJzLCBvciBjb3BpZXMgdG8gdXNlciBzcGFjZSBhcmUgaW50cm9kdWNlZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyAoYGVycmAsIGByZW1haW5pbmdfcGFnZXNfdG90YWxgLCBgY3Vycl9wYWdlX2lkeGApIGFyZSBpbml0aWFsaXplZCwgYW5kIGVycm9yIGNvZGVzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkIGJlZm9yZSBhbnkganVtcCB0byB0aGUgZXhpdCBsYWJlbC4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmN2E4MTM0MmRiM2M2NGQ5ZTcwMzY1NWViZDNhMjFlZmVmNDA4ZjA4CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBBdWcgMjkgMTc6Mjc6NDAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDljYmNlNWM5MGJmZmQuLjI3ZmZlMWE5OWEwOGIgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbW9yeS5jCkBAIC0yNTY1LDIwICYjNDM7MjU2NSwyMiBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCXVuc2lnbmVkIGxvbmcgY3Vycl9wYWdlX2lkeCA9IDA7CiAJdW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtOwogCXVuc2lnbmVkIGxvbmcgcGFnZXNfdG9fd3JpdGVfaW5fcG1kOwotCWludCByZXQ7CiYjNDM7CWludCBlcnIgPSAwOwogbW9yZToKLQlyZXQgPSAtRUZBVUxUOwogCXBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTsKLQlpZiAoIXBtZCkKJiM0MzsJaWYgKCFwbWQpIHsKJiM0MzsJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwomIzQzOwl9CiAKIAlwYWdlc190b193cml0ZV9pbl9wbWQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLAogCQlyZW1haW5pbmdfcGFnZXNfdG90YWwsIFBUUlNfUEVSX1BURSAtIHB0ZV9pbmRleChhZGRyKSk7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgUFRFIGlmIG5lY2Vzc2FyeTsgdGFrZXMgUE1EIGxvY2sgb25jZSBvbmx5LiAqLwotCXJldCA9IC1FTk9NRU07Ci0JaWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkKJiM0MzsJaWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiYjNDM7CX0KIAogCXdoaWxlIChwYWdlc190b193cml0ZV9pbl9wbWQpIHsKIAkJaW50IHB0ZV9pZHggPSAwOwpAQCAtMjU4NiwxNSAmIzQzOzI1ODgsMTQgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAogCQlzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsICZhbXA7cHRlX2xvY2spOwogCQlpZiAoIXN0YXJ0X3B0ZSkgewotCQkJcmV0ID0gLUVGQVVMVDsKJiM0MzsJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJZm9yIChwdGUgPSBzdGFydF9wdGU7IHB0ZV9pZHggJmx0OyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkgewotCQkJaW50IGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwKLQkJCQlhZGRyLCBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7CiYjNDM7CQkJZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLCBhZGRyLAomIzQzOwkJCQkJCQkgIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTsKIAkJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQkJcHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTsKLQkJCQlyZXQgPSBlcnI7CiAJCQkJcmVtYWluaW5nX3BhZ2VzX3RvdGFsIC09IHB0ZV9pZHg7CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC0yNjA3LDEwICYjNDM7MjYwOCw5IEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJfQogCWlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpCiAJCWdvdG8gbW9yZTsKLQlyZXQgPSAwOwogb3V0OgogCSpudW0gPSByZW1haW5pbmdfcGFnZXNfdG90YWw7Ci0JcmV0dXJuIHJldDsKJiM0MzsJcmV0dXJuIGVycjsKIH0KIAogLyoqCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOSAxNzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjI0CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBob3cgSSYjMzk7ZCBhcHByb2FjaCB0aGlzIHRhc2ssIHRoaW5raW5nIGFzIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6CgoqKkRpdmluZyBpbnRvIGBtbS9tZW1vcnkuY2AqKgoKQWxyaWdodCwgdGhlIGluc3RydWN0aW9uIHNheXMgdG8gc3RhcnQgYnkgaW5zcGVjdGluZyB0aGUgZGlmZiBhbmQgcmVhZGluZyB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgbW0vbWVtb3J5LmNgLiBNeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gSSBrbm93IGBtbS9tZW1vcnkuY2AgaXMgdGhlIGhlYXJ0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoaXMgc3lzdGVtLCBzbyB3aGF0ZXZlciBjaGFuZ2UgaXMgcHJvcG9zZWQsIGl0JiMzOTtzIHBvdGVudGlhbGx5IGNyaXRpY2FsLiBJ4oCZbGwgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSAqd2h5KiBiZWhpbmQgdGhpcyBjaGFuZ2UsIHRoZSBpbnRlbmRlZCBlZmZlY3QsIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUtZWZmZWN0cy4gQmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UgSSYjMzk7bGwgd2FudCB0byBnZXQgYSBnb29kIHNlbnNlIG9mIHRoZSBjb250ZXh0IG9mIHRoZSBkaWZmLiBJJiMzOTtsbCByZWFkIGFyb3VuZCB0aGUgY29kZSBhdCB0aGF0IGxvY2F0aW9uIHRvIGJ1aWxkIGEgbWVudGFsIHBpY3R1cmUgb2Ygd2hhdCYjMzk7cyBnb2luZyBvbi4KClRoZSBpbnN0cnVjdGlvbiBhbHNvIHNheXMgdG8gdXNlIGByZWFkLWZpbGVgIGFyb3VuZCBsaW5lIDI1NjUgaW4gYG1tL21lbW9yeS5jYC4gUmlnaHQsIHNvIEkga25vdyBJIG5lZWQgdG8gYmUgcmVhZHkgdG8gYW5hbHl6ZSB0aGlzIHNlY3Rpb24gY2xvc2VseS4gSSB3aWxsIGV4cGVjdCB0aGlzIHRvIGdpdmUgbWUgdGhlIGluZm9ybWF0aW9uIHRvIGRvIG15IGpvYiwgYW5kIHN0YXJ0IHRvIGZvcm0gYSBjb21wcmVoZW5zaXZlIG1lbnRhbCBtb2RlbCBvZiB0aGUgY29kZS4gSSBhbSByZWFkeSB0byBkaWcgaW50byB0aGUgZGV0YWlscyBhbmQgc3RhcnQgYW5hbHl6aW5nIHRoZSBjb2RlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjU1MDpcdFx0aWYgKGVycilcbjI1NTE6XHRcdFx0cmV0dXJuIGVycjtcbjI1NTI6XHRcdHJldHVybiBpbnNlcnRfcGFnZV9pbnRvX3B0ZV9sb2NrZWQodm1hLCBwdGUsIGFkZHIsIHBhZ2UsIHByb3QsIGZhbHNlKTtcbjI1NTM6XHR9XG4yNTU0Olx0XG4yNTU1Olx0LyogaW5zZXJ0X3BhZ2VzKCkgYW1vcnRpemVzIHRoZSBjb3N0IG9mIHNwaW5sb2NrIG9wZXJhdGlvbnNcbjI1NTY6XHQgKiB3aGVuIGluc2VydGluZyBwYWdlcyBpbiBhIGxvb3AuXG4yNTU3Olx0ICovXG4yNTU4Olx0c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbjI1NTk6XHRcdFx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nICpudW0sIHBncHJvdF90IHByb3QpXG4yNTYwOlx0e1xuMjU2MTpcdFx0cG1kX3QgKnBtZCA9IE5VTEw7XG4yNTYyOlx0XHRwdGVfdCAqc3RhcnRfcHRlLCAqcHRlO1xuMjU2MzpcdFx0c3BpbmxvY2tfdCAqcHRlX2xvY2s7XG4yNTY0Olx0XHRzdHJ1Y3QgbW1fc3RydWN0ICpjb25zdCBtbSA9IHZtYS1cdTAwM2V2bV9tbTtcbjI1NjU6XHRcdHVuc2lnbmVkIGxvbmcgY3Vycl9wYWdlX2lkeCA9IDA7XG4yNTY2Olx0XHR1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19wYWdlc190b3RhbCA9ICpudW07XG4yNTY3Olx0XHR1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3dyaXRlX2luX3BtZDtcbjI1Njg6XHRcdGludCBlcnIgPSAwO1xuMjU2OTpcdG1vcmU6XG4yNTcwOlx0XHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4yNTcxOlx0XHRpZiAoIXBtZCkge1xuMjU3MjpcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjU3MzpcdFx0XHRnb3RvIG91dDtcbjI1NzQ6XHRcdH1cbjI1NzU6XHRcbjI1NzY6XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4yNTc3Olx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbjI1Nzg6XHRcbjI1Nzk6XHRcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4yNTgwOlx0XHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XG4yNTgxOlx0XHRcdGVyciA9IC1FTk9NRU07XG4yNTgyOlx0XHRcdGdvdG8gb3V0O1xuMjU4MzpcdFx0fVxuMjU4NDpcdFxuMjU4NTpcdFx0d2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkge1xuMjU4NjpcdFx0XHRpbnQgcHRlX2lkeCA9IDA7XG4yNTg3Olx0XHRcdGNvbnN0IGludCBiYXRjaF9zaXplID0gbWluX3QoaW50LCBwYWdlc190b193cml0ZV9pbl9wbWQsIDgpO1xuMjU4ODpcdFxuMjU4OTpcdFx0XHRzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsIFx1MDAyNnB0ZV9sb2NrKTtcbjI1OTA6XHRcdFx0aWYgKCFzdGFydF9wdGUpIHtcbjI1OTE6XHRcdFx0XHRlcnIgPSAtRUZBVUxUO1xuMjU5MjpcdFx0XHRcdGdvdG8gb3V0O1xuMjU5MzpcdFx0XHR9XG4yNTk0Olx0XHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkge1xuMjU5NTpcdFx0XHRcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcbjI1OTY6XHRcdFx0XHRcdFx0XHRcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xuMjU5NzpcdFx0XHRcdGlmICh1bmxpa2VseShlcnIpKSB7XG4yNTk4Olx0XHRcdFx0XHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xuMjU5OTpcdFx0XHRcdFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsIC09IHB0ZV9pZHg7XG4yNjAwOlx0XHRcdFx0XHRnb3RvIG91dDtcbjI2MDE6XHRcdFx0XHR9XG4yNjAyOlx0XHRcdFx0YWRkciAmIzQzOz0gUEFHRV9TSVpFO1xuMjYwMzpcdFx0XHRcdCYjNDM7JiM0MztjdXJyX3BhZ2VfaWR4O1xuMjYwNDpcdFx0XHR9XG4yNjA1Olx0XHRcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XG4yNjA2Olx0XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCAtPSBiYXRjaF9zaXplO1xuMjYwNzpcdFx0XHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gYmF0Y2hfc2l6ZTtcbjI2MDg6XHRcdH1cbjI2MDk6XHRcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4yNjEwOlx0XHRcdGdvdG8gbW9yZTtcbjI2MTE6XHRvdXQ6XG4yNjEyOlx0XHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xuMjYxMzpcdFx0cmV0dXJuIGVycjtcbjI2MTQ6XHR9XG4yNjE1Olx0XG4yNjE2Olx0LyoqXG4yNjE3Olx0ICogdm1faW5zZXJ0X3BhZ2VzIC0gaW5zZXJ0IG11bHRpcGxlIHBhZ2VzIGludG8gdXNlciB2bWEsIGJhdGNoaW5nIHRoZSBwbWQgbG9jay5cbjI2MTg6XHQgKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cbjI2MTk6XHQgKiBAYWRkcjogdGFyZ2V0IHN0YXJ0IHVzZXIgYWRkcmVzcyBvZiB0aGVzZSBwYWdlc1xuMjYyMDpcdCAqIEBwYWdlczogc291cmNlIGtlcm5lbCBwYWdlc1xuMjYyMTpcdCAqIEBudW06IGluOiBudW1iZXIgb2YgcGFnZXMgdG8gbWFwLiBvdXQ6IG51bWJlciBvZiBwYWdlcyB0aGF0IHdlcmUgKm5vdCpcbjI2MjI6XHQgKiBtYXBwZWQuICgwIG1lYW5zIGFsbCBwYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBtYXBwZWQpLlxuMjYyMzpcdCAqXG4yNjI0Olx0ICogUHJlZmVycmVkIG92ZXIgdm1faW5zZXJ0X3BhZ2UoKSB3aGVuIGluc2VydGluZyBtdWx0aXBsZSBwYWdlcy5cbjI2MjU6XHQgKlxuMjYyNjpcdCAqIEluIGNhc2Ugb2YgZXJyb3IsIHdlIG1heSBoYXZlIG1hcHBlZCBhIHN1YnNldCBvZiB0aGUgcHJvdmlkZWRcbjI2Mjc6XHQgKiBwYWdlcy4gSXQgaXMgdGhlIGNhbGxlciYjMzk7cyByZXNwb25zaWJpbGl0eSB0byBhY2NvdW50IGZvciB0aGlzIGNhc2UuXG4yNjI4Olx0ICpcbjI2Mjk6XHQgKiBUaGUgc2FtZSByZXN0cmljdGlvbnMgYXBwbHkgYXMgaW4gdm1faW5zZXJ0X3BhZ2UoKS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDI0NQoJCQkJCQkJb3V0cHV0OiAxNjgKCQkJCQkJCXRob3VnaHRzOiA2OTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogUmVmYWN0b3Jpbmcgb2YgRXJyb3IgSGFuZGxpbmcgaW4gYGluc2VydF9wYWdlcygpYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdHJhY2UgdGhlIGNoYW5nZXMgaW4gYGluc2VydF9wYWdlcygpYCBhbmQgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIGZvciBLTVNBTi4gVGhlIGRpZmYgaXMgcmVmYWN0b3JpbmcgdGhlIGVycm9yIGhhbmRsaW5nLCBjb25zb2xpZGF0aW5nIHRoZSByZXR1cm4gdmFyaWFibGUuIFByZXZpb3VzbHksIHRoZXJlIHdhcyBhbiBgaW50IHJldGAgYW5kIGFuIGlubmVyIGBpbnQgZXJyYCwgYnV0IG5vdyBpdCYjMzk7cyBqdXN0IGEgc2luZ2xlIGBpbnQgZXJyYCBpbml0aWFsaXplZCB0byAwLiBJdCBhbHNvIGNoYW5nZXMgdGhlIGVycm9yIHJldHVybiB3aGVuIGB3YWxrX3RvX3BtZGAgZmFpbHMgZnJvbSBgLUVGQVVMVGAgdG8gYC1FTk9NRU1gLgoKTm93LCB0aGUgY3J1eCBvZiB0aGUgS01TQU4gYW5hbHlzaXM6IGFyZSB0aGVyZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZT8gSSBpbW1lZGlhdGVseSBnbyB0aHJvdWdoIHRoZSBjb2RlLCBjaGVja2luZyBmb3IgYSBmZXcgY3J1Y2lhbCB0aGluZ3MuIEZpcnN0LCBpcyBgZXJyYCB1c2VkIGJlZm9yZSBpdCYjMzk7cyBzZXQ/IFRoZSBhbnN3ZXIgaXMgbm8sIGl0JiMzOTtzIGluaXRpYWxpemVkIHRvIDAgYW5kIGFsd2F5cyBhc3NpZ25lZCBhIHZhbHVlIG9uIGFsbCBwYXRocy4gU2Vjb25kLCBJIGxvb2sgZm9yIGFueSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgYnVmZmVycyBiZWluZyByZWFkIGluIGNvbmRpdGlvbmFsczsgdGhhdCYjMzk7cyBhIGNsYXNzaWMgS01TQU4gcGl0ZmFsbC4gTm90aGluZyBvZiB0aGF0IHNvcnQgaGVyZS4KCkkgdmVyaWZ5IHRoYXQgbm8ga2VybmVsIHN0cnVjdHVyZXMgY29udGFpbmluZyB1bmluaXRpYWxpemVkIGRhdGEgYXJlIGJlaW5nIHBhc3NlZCB0byB1c2Vyc3BhY2U7IHRoaXMgaXMgYSBwcmltZSBjb25jZXJuLiBBbHNvLCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMuIFRoZXJlJiMzOTtzIGFsc28gbm8gY29uY2VybiBvZiBwb3RlbnRpYWwgYm91bmRzLWNoZWNrIGlzc3VlcyBzaW5jZSBgcmVtYWluaW5nX3BhZ2VzX3RvdGFsYCwgYHBhZ2VzX3RvX3dyaXRlX2luX3BtZGAgYW5kIGBjdXJyX3BhZ2VfaWR4YCBhcmUgYWxsIHNjYWxhcnMgdGhhdCBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4KCkkmIzM5O20gY29uZmlkZW50IHdlJiMzOTtyZSBpbiB0aGUgY2xlYXIuIFRoZSBjaGFuZ2VzIGFyZSBwdXJlbHkgaW50ZXJuYWwgTU0gZXJyb3IgaGFuZGxpbmcsIG1vc3RseSByZWZhY3RvcmluZywgYW5kIG5vIG5ldyByaXNrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHN0YW5kYXJkIHNhbml0aXplcnMvS0FTQU4gd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgbWFwcGluZyBvciBhZGRyZXNzIGNhbGN1bGF0aW9uIGlzc3Vlcy4gVGhlcmVmb3JlLCB0aGUgTmVlZHNLTVNBTiBmbGFnIGlzIGNsZWFybHkgYGZhbHNlYC4KClNvLCB0aGUgS01TQU5SZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOgoKKiAgIFRoZSBwYXRjaCByZWZhY3RvcnMgZXJyb3IgcmV0dXJuIHZhcmlhYmxlcyBpbiBgaW5zZXJ0X3BhZ2VzKClgIChjb25zb2xpZGF0aW5nIGByZXRgIGFuZCBgZXJyYCBpbnRvIGEgc2luZ2xlIGBlcnJgIHZhcmlhYmxlKSwgYW5kIG1vZGlmaWVzIGVycm9yIGNvZGUgcmV0dXJuIHdoZW4gYHdhbGtfdG9fcG1kYCBmYWlscy4KKiAgIEtNU0FOIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMsIG5vIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCB2YXJpYWJsZXMsIGFuZCBubyBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLiBBbGwgcmVsZXZhbnQgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4KKiAgIFN0YW5kYXJkIHNhbml0aXplcnMvS0FTQU4gYXJlIHN1ZmZpY2llbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGlzIGEgcmVmYWN0b3Jpbmcgb2YgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYzppbnNlcnRfcGFnZXMoKSwgdW5pZnlpbmcgdGhlIGxvY2FsIHJldHVybiB2YXJpYWJsZSBgZXJyYCAocHJldmlvdXNseSBgcmV0YCBhbmQgYSBzaGFkb3dlZCBgZXJyYCkgYW5kIGNoYW5naW5nIHRoZSBlcnJvciBjb2RlIHdoZW4gYHdhbGtfdG9fcG1kKClgIGZhaWxzIGZyb20gLUVGQVVMVCB0byAtRU5PTUVNLlxuXG5ObyBuZXcgYWxsb2NhdGlvbnMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBidWZmZXJzLCBvciBjb3BpZXMgdG8gdXNlciBzcGFjZSBhcmUgaW50cm9kdWNlZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyAoYGVycmAsIGByZW1haW5pbmdfcGFnZXNfdG90YWxgLCBgY3Vycl9wYWdlX2lkeGApIGFyZSBpbml0aWFsaXplZCwgYW5kIGVycm9yIGNvZGVzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkIGJlZm9yZSBhbnkganVtcCB0byB0aGUgZXhpdCBsYWJlbC4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXG5cbk5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIGNvcGllcyB0byB1c2VyIHNwYWNlIGFyZSBpbnRyb2R1Y2VkLiBBbGwgbG9jYWwgdmFyaWFibGVzIChgZXJyYCwgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBjdXJyX3BhZ2VfaWR4YCkgYXJlIGluaXRpYWxpemVkLCBhbmQgZXJyb3IgY29kZXMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgYmVmb3JlIGFueSBqdW1wIHRvIHRoZSBleGl0IGxhYmVsLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI3OjQxLjk0MTY0MjYyNloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczMDE5NTU5MjgyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNTVVcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2bV9pbnNlcnRfcGFnZXNcIixcbiAgICBcInZtX21hcF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzX3plcm9cIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGlzIGEgcmVmYWN0b3Jpbmcgb2YgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYzppbnNlcnRfcGFnZXMoKSwgdW5pZnlpbmcgdGhlIGxvY2FsIHJldHVybiB2YXJpYWJsZSBgZXJyYCAocHJldmlvdXNseSBgcmV0YCBhbmQgYSBzaGFkb3dlZCBgZXJyYCkgYW5kIGNoYW5naW5nIHRoZSBlcnJvciBjb2RlIHdoZW4gYHdhbGtfdG9fcG1kKClgIGZhaWxzIGZyb20gLUVGQVVMVCB0byAtRU5PTUVNLlxcblxcbk5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIGNvcGllcyB0byB1c2VyIHNwYWNlIGFyZSBpbnRyb2R1Y2VkLiBBbGwgbG9jYWwgdmFyaWFibGVzIChgZXJyYCwgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBjdXJyX3BhZ2VfaWR4YCkgYXJlIGluaXRpYWxpemVkLCBhbmQgZXJyb3IgY29kZXMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgYmVmb3JlIGFueSBqdW1wIHRvIHRoZSBleGl0IGxhYmVsLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgcmV0dXJuIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jIHdpdGhpbiBpbnNlcnRfcGFnZXMoKSAoYW5kIHRyYW5zaXRpdmVseSB2bV9pbnNlcnRfcGFnZXMoKSksIGNvcnJlY3RseSByZXR1cm5pbmcgLUVOT01FTSBpbnN0ZWFkIG9mIC1FRkFVTFQgd2hlbiB3YWxrX3RvX3BtZCgpIG9yIHB0ZV9hbGxvYygpIGZhaWxzLiBUaGlzIGFmZmVjdHMgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IHVzZWQgYnkgaW9fdXJpbmcsIG5ldHdvcmtpbmcgKFRDUCB6ZXJvY29weSksIGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mjc6NDEuOTQxNjQ3NjA2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzU5MTA1NjU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZjdhODEzNDJkYjNjNjRkOWU3MDM2NTVlYmQzYTIxZWZlZjQwOGYwOFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IEF1ZyAyOSAxNzoyNzo0MCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXFxuaW5kZXggOWNiY2U1YzkwYmZmZC4uMjdmZmUxYTk5YTA4YiAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnkuY1xcbisrKyBiL21tL21lbW9yeS5jXFxuQEAgLTI1NjUsMjAgKzI1NjUsMjIgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gXFx0dW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDtcXG4gXFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xcbiBcXHR1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3dyaXRlX2luX3BtZDtcXG4tXFx0aW50IHJldDtcXG4rXFx0aW50IGVyciA9IDA7XFxuIG1vcmU6XFxuLVxcdHJldCA9IC1FRkFVTFQ7XFxuIFxcdHBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTtcXG4tXFx0aWYgKCFwbWQpXFxuK1xcdGlmICghcG1kKSB7XFxuK1xcdFxcdGVyciA9IC1FTk9NRU07XFxuIFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuIFxcbiBcXHRwYWdlc190b193cml0ZV9pbl9wbWQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLFxcbiBcXHRcXHRyZW1haW5pbmdfcGFnZXNfdG90YWwsIFBUUlNfUEVSX1BURSAtIHB0ZV9pbmRleChhZGRyKSk7XFxuIFxcbiBcXHQvKiBBbGxvY2F0ZSB0aGUgUFRFIGlmIG5lY2Vzc2FyeTsgdGFrZXMgUE1EIGxvY2sgb25jZSBvbmx5LiAqL1xcbi1cXHRyZXQgPSAtRU5PTUVNO1xcbi1cXHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKVxcbitcXHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XFxuK1xcdFxcdGVyciA9IC1FTk9NRU07XFxuIFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuIFxcbiBcXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XFxuIFxcdFxcdGludCBwdGVfaWR4ID0gMDtcXG5AQCAtMjU4NiwxNSArMjU4OCwxNCBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbiBcXG4gXFx0XFx0c3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCBcXHUwMDI2cHRlX2xvY2spO1xcbiBcXHRcXHRpZiAoIXN0YXJ0X3B0ZSkge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUZBVUxUO1xcbitcXHRcXHRcXHRlcnIgPSAtRUZBVUxUO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbiBcXHRcXHRmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCBcXHUwMDNjIGJhdGNoX3NpemU7ICsrcHRlLCArK3B0ZV9pZHgpIHtcXG4tXFx0XFx0XFx0aW50IGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSxcXG4tXFx0XFx0XFx0XFx0YWRkciwgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xcbitcXHRcXHRcXHRlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsIGFkZHIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xcbiBcXHRcXHRcXHRpZiAodW5saWtlbHkoZXJyKSkge1xcbiBcXHRcXHRcXHRcXHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xcbi1cXHRcXHRcXHRcXHRyZXQgPSBlcnI7XFxuIFxcdFxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0fVxcbkBAIC0yNjA3LDEwICsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gXFx0fVxcbiBcXHRpZiAocmVtYWluaW5nX3BhZ2VzX3RvdGFsKVxcbiBcXHRcXHRnb3RvIG1vcmU7XFxuLVxcdHJldCA9IDA7XFxuIG91dDpcXG4gXFx0Km51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDtcXG4tXFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG4gLyoqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI3OjQzLjMwMTY3NzE1NFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NjczMDk1MjExNzIzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1NVVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtX2luc2VydF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzXCIsXG4gICAgXCJ2bV9tYXBfcGFnZXNfemVyb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGY3YTgxMzQyZGIzYzY0ZDllNzAzNjU1ZWJkM2EyMWVmZWY0MDhmMDhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAyOSAxNzoyNzo0MCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmNcbmluZGV4IDljYmNlNWM5MGJmZmQuLjI3ZmZlMWE5OWEwOGIgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnkuY1xuKysrIGIvbW0vbWVtb3J5LmNcbkBAIC0yNTY1LDIwICsyNTY1LDIyIEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXHR1bnNpZ25lZCBsb25nIGN1cnJfcGFnZV9pZHggPSAwO1xuIFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7XG4tXHRpbnQgcmV0O1xuK1x0aW50IGVyciA9IDA7XG4gbW9yZTpcbi1cdHJldCA9IC1FRkFVTFQ7XG4gXHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4tXHRpZiAoIXBtZClcbitcdGlmICghcG1kKSB7XG4rXHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gb3V0O1xuK1x0fVxuIFxuIFx0cGFnZXNfdG9fd3JpdGVfaW5fcG1kID0gbWluX3QodW5zaWduZWQgbG9uZyxcbiBcdFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsLCBQVFJTX1BFUl9QVEUgLSBwdGVfaW5kZXgoYWRkcikpO1xuIFxuIFx0LyogQWxsb2NhdGUgdGhlIFBURSBpZiBuZWNlc3Nhcnk7IHRha2VzIFBNRCBsb2NrIG9uY2Ugb25seS4gKi9cbi1cdHJldCA9IC1FTk9NRU07XG4tXHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKVxuK1x0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dDtcbitcdH1cbiBcbiBcdHdoaWxlIChwYWdlc190b193cml0ZV9pbl9wbWQpIHtcbiBcdFx0aW50IHB0ZV9pZHggPSAwO1xuQEAgLTI1ODYsMTUgKzI1ODgsMTQgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcbiBcdFx0c3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCBcdTAwMjZwdGVfbG9jayk7XG4gXHRcdGlmICghc3RhcnRfcHRlKSB7XG4tXHRcdFx0cmV0ID0gLUVGQVVMVDtcbitcdFx0XHRlcnIgPSAtRUZBVUxUO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyArK3B0ZSwgKytwdGVfaWR4KSB7XG4tXHRcdFx0aW50IGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSxcbi1cdFx0XHRcdGFkZHIsIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTtcbitcdFx0XHRlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsIGFkZHIsXG4rXHRcdFx0XHRcdFx0XHQgIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTtcbiBcdFx0XHRpZiAodW5saWtlbHkoZXJyKSkge1xuIFx0XHRcdFx0cHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTtcbi1cdFx0XHRcdHJldCA9IGVycjtcbiBcdFx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuQEAgLTI2MDcsMTAgKzI2MDgsOSBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFx0fVxuIFx0aWYgKHJlbWFpbmluZ19wYWdlc190b3RhbClcbiBcdFx0Z290byBtb3JlO1xuLVx0cmV0ID0gMDtcbiBvdXQ6XG4gXHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBlcnI7XG4gfVxuIFxuIC8qKlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mjc6NDMuMzAxNjc5Mjg1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzkyMDU0NTQ5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgaW50byB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgQ29yZSoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgZGlmZi4gU3BlY2lmaWNhbGx5LCBJJ20gZm9jdXNpbmcgb24gdGhlIGBtbS9tZW1vcnkuY2AgZmlsZSDigJMgdGhhdCdzIHdoZXJlIHRoZSBoZWFydCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGJlYXRzLiBJJ20gZ29pbmcgdG8gbGV2ZXJhZ2UgbXkgZmFtaWxpYXJpdHkgd2l0aCB0aGUgY29kZWJhc2UsIGJ1dCBJJ2xsIHVzZSBgcmVhZC1maWxlYCB0byB6ZXJvIGluIG9uIHRoZSBpbW1lZGlhdGUgY29udGV4dCBhcm91bmQgbGluZSAyNTY1IGluIHRoYXQgZmlsZS4gQ29udGV4dCBpcyBraW5nLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIHN1Y2ggZnVuZGFtZW50YWwgYXNwZWN0cy4gSSBuZWVkIHRvIHNlZSAqd2hhdCogaGFzIGJlZW4gbW9kaWZpZWQgKmFyb3VuZCogdGhlIGxpbmUgaW4gcXVlc3Rpb24gdG8gZWZmZWN0aXZlbHkgZGV0ZXJtaW5lIHRoZSBwdXJwb3NlIG9mIHRoZSBkaWZmLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjI3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyNzo1MS4yMjIyMjY0NzlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTAyOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjU1MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjU1MDpcXHRcXHRpZiAoZXJyKVxcbjI1NTE6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4yNTUyOlxcdFxcdHJldHVybiBpbnNlcnRfcGFnZV9pbnRvX3B0ZV9sb2NrZWQodm1hLCBwdGUsIGFkZHIsIHBhZ2UsIHByb3QsIGZhbHNlKTtcXG4yNTUzOlxcdH1cXG4yNTU0OlxcdFxcbjI1NTU6XFx0LyogaW5zZXJ0X3BhZ2VzKCkgYW1vcnRpemVzIHRoZSBjb3N0IG9mIHNwaW5sb2NrIG9wZXJhdGlvbnNcXG4yNTU2OlxcdCAqIHdoZW4gaW5zZXJ0aW5nIHBhZ2VzIGluIGEgbG9vcC5cXG4yNTU3OlxcdCAqL1xcbjI1NTg6XFx0c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4yNTU5OlxcdFxcdFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSwgcGdwcm90X3QgcHJvdClcXG4yNTYwOlxcdHtcXG4yNTYxOlxcdFxcdHBtZF90ICpwbWQgPSBOVUxMO1xcbjI1NjI6XFx0XFx0cHRlX3QgKnN0YXJ0X3B0ZSwgKnB0ZTtcXG4yNTYzOlxcdFxcdHNwaW5sb2NrX3QgKnB0ZV9sb2NrO1xcbjI1NjQ6XFx0XFx0c3RydWN0IG1tX3N0cnVjdCAqY29uc3QgbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbjI1NjU6XFx0XFx0dW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDtcXG4yNTY2OlxcdFxcdHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nX3BhZ2VzX3RvdGFsID0gKm51bTtcXG4yNTY3OlxcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZXNfdG9fd3JpdGVfaW5fcG1kO1xcbjI1Njg6XFx0XFx0aW50IGVyciA9IDA7XFxuMjU2OTpcXHRtb3JlOlxcbjI1NzA6XFx0XFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xcbjI1NzE6XFx0XFx0aWYgKCFwbWQpIHtcXG4yNTcyOlxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjU3MzpcXHRcXHRcXHRnb3RvIG91dDtcXG4yNTc0OlxcdFxcdH1cXG4yNTc1OlxcdFxcbjI1NzY6XFx0XFx0cGFnZXNfdG9fd3JpdGVfaW5fcG1kID0gbWluX3QodW5zaWduZWQgbG9uZyxcXG4yNTc3OlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcXG4yNTc4OlxcdFxcbjI1Nzk6XFx0XFx0LyogQWxsb2NhdGUgdGhlIFBURSBpZiBuZWNlc3Nhcnk7IHRha2VzIFBNRCBsb2NrIG9uY2Ugb25seS4gKi9cXG4yNTgwOlxcdFxcdGlmIChwdGVfYWxsb2MobW0sIHBtZCkpIHtcXG4yNTgxOlxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjU4MjpcXHRcXHRcXHRnb3RvIG91dDtcXG4yNTgzOlxcdFxcdH1cXG4yNTg0OlxcdFxcbjI1ODU6XFx0XFx0d2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkge1xcbjI1ODY6XFx0XFx0XFx0aW50IHB0ZV9pZHggPSAwO1xcbjI1ODc6XFx0XFx0XFx0Y29uc3QgaW50IGJhdGNoX3NpemUgPSBtaW5fdChpbnQsIHBhZ2VzX3RvX3dyaXRlX2luX3BtZCwgOCk7XFxuMjU4ODpcXHRcXG4yNTg5OlxcdFxcdFxcdHN0YXJ0X3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgXFx1MDAyNnB0ZV9sb2NrKTtcXG4yNTkwOlxcdFxcdFxcdGlmICghc3RhcnRfcHRlKSB7XFxuMjU5MTpcXHRcXHRcXHRcXHRlcnIgPSAtRUZBVUxUO1xcbjI1OTI6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMjU5MzpcXHRcXHRcXHR9XFxuMjU5NDpcXHRcXHRcXHRmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCBcXHUwMDNjIGJhdGNoX3NpemU7ICsrcHRlLCArK3B0ZV9pZHgpIHtcXG4yNTk1OlxcdFxcdFxcdFxcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcXG4yNTk2OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xcbjI1OTc6XFx0XFx0XFx0XFx0aWYgKHVubGlrZWx5KGVycikpIHtcXG4yNTk4OlxcdFxcdFxcdFxcdFxcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XFxuMjU5OTpcXHRcXHRcXHRcXHRcXHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gcHRlX2lkeDtcXG4yNjAwOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjI2MDE6XFx0XFx0XFx0XFx0fVxcbjI2MDI6XFx0XFx0XFx0XFx0YWRkciArPSBQQUdFX1NJWkU7XFxuMjYwMzpcXHRcXHRcXHRcXHQrK2N1cnJfcGFnZV9pZHg7XFxuMjYwNDpcXHRcXHRcXHR9XFxuMjYwNTpcXHRcXHRcXHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xcbjI2MDY6XFx0XFx0XFx0cGFnZXNfdG9fd3JpdGVfaW5fcG1kIC09IGJhdGNoX3NpemU7XFxuMjYwNzpcXHRcXHRcXHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gYmF0Y2hfc2l6ZTtcXG4yNjA4OlxcdFxcdH1cXG4yNjA5OlxcdFxcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXFxuMjYxMDpcXHRcXHRcXHRnb3RvIG1vcmU7XFxuMjYxMTpcXHRvdXQ6XFxuMjYxMjpcXHRcXHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xcbjI2MTM6XFx0XFx0cmV0dXJuIGVycjtcXG4yNjE0OlxcdH1cXG4yNjE1OlxcdFxcbjI2MTY6XFx0LyoqXFxuMjYxNzpcXHQgKiB2bV9pbnNlcnRfcGFnZXMgLSBpbnNlcnQgbXVsdGlwbGUgcGFnZXMgaW50byB1c2VyIHZtYSwgYmF0Y2hpbmcgdGhlIHBtZCBsb2NrLlxcbjI2MTg6XFx0ICogQHZtYTogdXNlciB2bWEgdG8gbWFwIHRvXFxuMjYxOTpcXHQgKiBAYWRkcjogdGFyZ2V0IHN0YXJ0IHVzZXIgYWRkcmVzcyBvZiB0aGVzZSBwYWdlc1xcbjI2MjA6XFx0ICogQHBhZ2VzOiBzb3VyY2Uga2VybmVsIHBhZ2VzXFxuMjYyMTpcXHQgKiBAbnVtOiBpbjogbnVtYmVyIG9mIHBhZ2VzIHRvIG1hcC4gb3V0OiBudW1iZXIgb2YgcGFnZXMgdGhhdCB3ZXJlICpub3QqXFxuMjYyMjpcXHQgKiBtYXBwZWQuICgwIG1lYW5zIGFsbCBwYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBtYXBwZWQpLlxcbjI2MjM6XFx0ICpcXG4yNjI0OlxcdCAqIFByZWZlcnJlZCBvdmVyIHZtX2luc2VydF9wYWdlKCkgd2hlbiBpbnNlcnRpbmcgbXVsdGlwbGUgcGFnZXMuXFxuMjYyNTpcXHQgKlxcbjI2MjY6XFx0ICogSW4gY2FzZSBvZiBlcnJvciwgd2UgbWF5IGhhdmUgbWFwcGVkIGEgc3Vic2V0IG9mIHRoZSBwcm92aWRlZFxcbjI2Mjc6XFx0ICogcGFnZXMuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBhY2NvdW50IGZvciB0aGlzIGNhc2UuXFxuMjYyODpcXHQgKlxcbjI2Mjk6XFx0ICogVGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFwcGx5IGFzIGluIHZtX2luc2VydF9wYWdlKCkuXFxuMjYzMDpcXHQgKi9cXG4yNjMxOlxcdGludCB2bV9pbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4yNjMyOlxcdFxcdFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcXG4yNjMzOlxcdHtcXG4yNjM0OlxcdFxcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAqbnVtO1xcbjI2MzU6XFx0XFx0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgUEFHRV9TSVpFICogbnJfcGFnZXM7XFxuMjYzNjpcXHRcXG4yNjM3OlxcdFxcdGlmICghcmFuZ2VfaW5fdm1hKHZtYSwgYWRkciwgZW5kKSlcXG4yNjM4OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbjI2Mzk6XFx0XFx0aWYgKCEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX01JWEVETUFQKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyNzo1MS4yMjI1MTg4ODlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMzU5NDkyNzkzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoOiBBIE1lbW9yeSBNYW5hZ2VtZW50IEJ1ZyBGaXgqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB3aGF0J3MgY2hhbmdlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBmbG93IHdpdGhpbiBgaW5zZXJ0X3BhZ2VzYCBhbmQgaWRlbnRpZnkgdGhlIHByb2JsZW0uIFRoZSBjb3JlIGlzc3VlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIGVycm9yIGhhbmRsaW5nLCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggcGFnZSB0YWJsZSBtYW5pcHVsYXRpb24uXG5cbkZpcnN0LCBJIHNlZSB0aGUgcHJlLXBhdGNoIGJlaGF2aW9yLiBJZiBgd2Fsa190b19wbWRgIGZhaWxlZCwgdGhlIHJldHVybiB2YWx1ZSB3YXMgLUVGQVVMVC4gVGhlbiBpZiBgcHRlX2FsbG9jYCBmYWlscywgdGhlIHJldHVybiB2YWx1ZSB3YXMgLUVOT01FTS4gSXQgc2VlbXMgdGhhdCB0aGVyZSBhcmUgYSBmZXcgcGxhY2VzIHRoYXQgY2FuIGNhdXNlIGFuIGVycm9yIGhlcmUuIEFuZCBpbiB0aGUgbG9vcCwgaWYgd2UgZmFpbGVkIHRvIGdldCB0aGUgcHRlLCB0aGUgcmV0dXJuIHZhbHVlIHdhcyAtRUZBVUxUIGFzIHdlbGwuIFdpdGhpbiB0aGUgbG9vcCwgYGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZGAgc2V0cyB0aGUgYGVycmAgdmFyaWFibGUsIHdoaWNoIGNhbiBiZSBub24temVyby4gVGhlIGltcG9ydGFudCB0aGluZyB0byB1bmRlcnN0YW5kIGlzIHRoYXQgdGhlIGByZXRgIHZhcmlhYmxlIGlzIHNldCB0byAwIGF0IHRoZSBlbmQuXG5cblRoZSBidWcgdGhlbiwgYXMgSSB1bmRlcnN0YW5kIGl0LCBzdGVtcyBmcm9tIHRoZSBoYW5kbGluZyBvZiBhIE5VTEwgcG1kIHJldHVybmVkIGJ5IGB3YWxrX3RvX3BtZGAuIFByZXZpb3VzbHksIHRoZSBjb2RlIGFzc2lnbmVkIGAtRUZBVUxUYCB0byBgcmV0YCwgYnV0IHRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgY29ycmVjdCwgaXMgaXQ/IFdlIHNob3VsZCBiZSByZXR1cm5pbmcgYC1FTk9NRU1gIGluIHRoZXNlIGNhc2VzLCBiZWNhdXNlIHRoYXQncyB3aGF0IGBwdGVfYWxsb2NgIHJldHVybmVkLiBUaGUgcGF0Y2ggY29ycmVjdGx5IGlkZW50aWZpZXMgdGhpcyBhbmQgdXBkYXRlcyB0aGUgcmV0dXJuIHZhbHVlLiBJIGFtIG5vdGluZyB0aGUgdmFyaWFibGUgbmFtZSBjbGVhbnVwIGJldHdlZW4gYHJldGAgYW5kIGBlcnJgLiBCb3RoIGFyZSB1c2VkIGluIHNpbWlsYXIgcGxhY2VzIHRvIG1lYW4gYW4gZXJyb3IgY29kZS5cblxuVGhlIGxvZ2ljIGNoYW5nZSBpcyBjbGVhci4gSXQgZW5zdXJlcyB0aGF0IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLCBzcGVjaWZpY2FsbHkgdGhvc2UgZHVyaW5nIHBhZ2UgdGFibGUgd2Fsa3MsIGFyZSBjb25zaXN0ZW50bHkgc2lnbmFsZWQgd2l0aCBgLUVOT01FTWAsIHJhdGhlciB0aGFuIHRoZSBwb3RlbnRpYWxseSBtaXNsZWFkaW5nIGAtRUZBVUxUYC4gVGhpcyBhbGlnbnMgd2l0aCBzdGFuZGFyZCBlcnJvciBjb2RlcyBhbmQgYWlkcyBpbiBtb3JlIGFjY3VyYXRlIGRlYnVnZ2luZy5cblxuTm93LCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QsIEknbGwgbmVlZCB0byBjaGVjayB0aGUgY2FsbGVycyBvZiBgdm1faW5zZXJ0X3BhZ2VzYCBvciBgaW5zZXJ0X3BhZ2VzYC4gQ29udGV4dCBpcyBraW5nLCBzbyBJIG5lZWQgdG8gc2VlICp3aGVyZSogdGhpcyBmdW5jdGlvbiBpcyBiZWluZyB1c2VkIHRvIGFwcHJlY2lhdGUgdGhlIHNjb3BlIG9mIHRoZSBmaXguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyOTAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyODowNC44MTc0NDkwMDNaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc3ODg2MjI2MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2bV9pbnNlcnRfcGFnZXNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmM9NTI3PXN0YXRpYyBpbnQgYW1keGRuYV9nZW1fZG1hYnVmX21tYXAoc3RydWN0IGRtYV9idWYgKmRtYV9idWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQzLVxcdHZtX2ZsYWdzX21vZCh2bWEsIFZNX01JWEVETUFQLCBWTV9QRk5NQVApO1xcbmRyaXZlcnMvYWNjZWwvYW1keGRuYS9hbWR4ZG5hX2dlbS5jOjU0NDpcXHRyZXQgPSB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXFx1MDAzZXZtX3N0YXJ0LCBhYm8tXFx1MDAzZWJhc2UucGFnZXMsXFxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQ1LVxcdFxcdFxcdCAgICAgIFxcdTAwMjZudW1fcGFnZXMpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTQ3NzI9aW50IHZtX2luc2VydF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwYWdlICopO1xcbmluY2x1ZGUvbGludXgvbW0uaDo0NzczOmludCB2bV9pbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5pbmNsdWRlL2xpbnV4L21tLmgtNDc3NC1cXHRcXHRcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nICpudW0pO1xcbi0tXFxuaW9fdXJpbmcvbWVtbWFwLmM9MzA3PXN0YXRpYyBpbnQgaW9fcmVnaW9uX21tYXAoc3RydWN0IGlvX3JpbmdfY3R4ICpjdHgsXFxuLS1cXG5pb191cmluZy9tZW1tYXAuYy0zMTQtXFx0dm1fZmxhZ3Nfc2V0KHZtYSwgVk1fRE9OVEVYUEFORCk7XFxuaW9fdXJpbmcvbWVtbWFwLmM6MzE1OlxcdHJldHVybiB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXFx1MDAzZXZtX3N0YXJ0LCBtci1cXHUwMDNlcGFnZXMsIFxcdTAwMjZucl9wYWdlcyk7XFxuaW9fdXJpbmcvbWVtbWFwLmMtMzE2LX1cXG4tLVxcbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jPTc2Njc9c3RhdGljIGludCBfX3JiX21hcF92bWEoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsXFxuLS1cXG5rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYy03NzU2LVxcbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jOjc3NTc6XFx0ZXJyID0gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgdm1hLVxcdTAwM2V2bV9zdGFydCwgcGFnZXMsIFxcdTAwMjZucl9wYWdlcyk7XFxua2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMtNzc1OC1cXG4tLVxcbm1tL21lbW9yeS5jPTI1NTg9c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTI2MTYtLyoqXFxubW0vbWVtb3J5LmM6MjYxNzogKiB2bV9pbnNlcnRfcGFnZXMgLSBpbnNlcnQgbXVsdGlwbGUgcGFnZXMgaW50byB1c2VyIHZtYSwgYmF0Y2hpbmcgdGhlIHBtZCBsb2NrLlxcbm1tL21lbW9yeS5jLTI2MTgtICogQHZtYTogdXNlciB2bWEgdG8gbWFwIHRvXFxuLS1cXG5tbS9tZW1vcnkuYy0yNjMwLSAqL1xcbm1tL21lbW9yeS5jOjI2MzE6aW50IHZtX2luc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTI2MzItXFx0XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtKVxcbi0tXFxubW0vbWVtb3J5LmMtMjY0Ni19XFxubW0vbWVtb3J5LmM6MjY0NzpFWFBPUlRfU1lNQk9MKHZtX2luc2VydF9wYWdlcyk7XFxubW0vbWVtb3J5LmMtMjY0OC1cXG4tLVxcbm1tL21lbW9yeS5jPTI3Mzk9c3RhdGljIGludCBfX3ZtX21hcF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4tLVxcbm1tL21lbW9yeS5jLTI3NTItXFxubW0vbWVtb3J5LmM6Mjc1MzpcXHRyZXR1cm4gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgdWFkZHIsIHBhZ2VzICsgb2Zmc2V0LCBcXHUwMDI2Y291bnQpO1xcbm1tL21lbW9yeS5jLTI3NTQtfVxcbi0tXFxubW0vbm9tbXUuYz0zNTA9RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZSk7XFxubW0vbm9tbXUuYy0zNTEtXFxubW0vbm9tbXUuYzozNTI6aW50IHZtX2luc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL25vbW11LmMtMzUzLVxcdFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcXG4tLVxcbm1tL25vbW11LmMtMzU2LX1cXG5tbS9ub21tdS5jOjM1NzpFWFBPUlRfU1lNQk9MKHZtX2luc2VydF9wYWdlcyk7XFxubW0vbm9tbXUuYy0zNTgtXFxuLS1cXG5uZXQvaXB2NC90Y3AuYz0yMDYyPXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3ZtX2luc2VydF9iYXRjaF9lcnJvcihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm5ldC9pcHY0L3RjcC5jLTIwODgtXFx0XFx0LyogV2UgY2FsbGVkIHphcF92bWFfcmFuZ2UsIHRyeSB0byByZWluc2VydC4gKi9cXG5uZXQvaXB2NC90Y3AuYzoyMDg5OlxcdFxcdGVyciA9IHZtX2luc2VydF9wYWdlcyh2bWEsICphZGRyZXNzLFxcbm5ldC9pcHY0L3RjcC5jLTIwOTAtXFx0XFx0XFx0XFx0ICAgICAgcGVuZGluZ19wYWdlcyxcXG4tLVxcbm5ldC9pcHY0L3RjcC5jPTIxMTA9c3RhdGljIGludCB0Y3BfemVyb2NvcHlfdm1faW5zZXJ0X2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubmV0L2lwdjQvdGNwLmMtMjEyMy1cXG5uZXQvaXB2NC90Y3AuYzoyMTI0OlxcdGVyciA9IHZtX2luc2VydF9wYWdlcyh2bWEsICphZGRyZXNzLCBwYWdlcywgXFx1MDAyNnBhZ2VzX3JlbWFpbmluZyk7XFxubmV0L2lwdjQvdGNwLmMtMjEyNS1cXHRwYWdlc19tYXBwZWQgPSBwYWdlc190b19tYXAgLSAodW5zaWduZWQgaW50KXBhZ2VzX3JlbWFpbmluZztcXG5uZXQvaXB2NC90Y3AuYy0yMTI2LVxcdGJ5dGVzX21hcHBlZCA9IFBBR0VfU0laRSAqIHBhZ2VzX21hcHBlZDtcXG5uZXQvaXB2NC90Y3AuYzoyMTI3OlxcdC8qIEV2ZW4gaWYgdm1faW5zZXJ0X3BhZ2VzIGZhaWxzLCBpdCBtYXkgaGF2ZSBwYXJ0aWFsbHkgc3VjY2VlZGVkIGluXFxubmV0L2lwdjQvdGNwLmMtMjEyOC1cXHQgKiBtYXBwaW5nIChzb21lIGJ1dCBub3QgYWxsIG9mIHRoZSBwYWdlcykuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI4OjA2LjU5NjMxNTkzNVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjk4MTM0MTA3NTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgSSBkZWx2ZSBpbnRvIHRoaXMgY29kZTpcblxuKipEaXZpbmcgaW50byBgdm1faW5zZXJ0X3BhZ2VzYCBVc2FnZSoqXG5cbk9rYXksIHNvIGB2bV9pbnNlcnRfcGFnZXNgIGlzIGEgcmVhbCB3b3JraG9yc2UuIEkga25vdyBpdCdzIGNydWNpYWwgZm9yIGBpb191cmluZ2AsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIGl0cyBuZWVkIGZvciBkaXJlY3QgbWVtb3J5IGFjY2Vzcy4gSSBhbHNvIHJlY2FsbCBzZWVpbmcgaXQgaW4gdGhlIGB0Y3BgIHplcm9jb3B5IHBhdGgg4oCTIHBhcnRpY3VsYXJseSB0aGF0IGB0Y3BfemVyb2NvcHlfcmVjZWl2ZWAgZnVuY3Rpb24uIE9mIGNvdXJzZSwgdGhlIGByaW5nX2J1ZmZlcmAgY29kZSB1c2VzIGl0IHRvbywgYW5kIGl0J3MgZXNzZW50aWFsIGZvciBgdm1fbWFwX3BhZ2VzYCBhbmQgb3RoZXIgbWVtb3J5IG1hcHBpbmcgb3BlcmF0aW9ucy5cblxuVGhlIHJlYWwgcXVlc3Rpb24gSSBoYXZlIGlzIHVuZGVyc3RhbmRpbmcgdGhlIGlubmVyIGRldGFpbHMgb2YgdGhlIG9wZXJhdGlvbi4gSSBuZWVkIHRvIGdldCB0byB0aGUgY29yZSwgc28gbGV0J3MgY2hlY2sgb3V0IGBfX3ZtX21hcF9wYWdlc2AgbG9jYXRlZCBpbiBgbW0vbWVtb3J5LmNgLiBJIGhhdmUgYSBmZWVsaW5nIHRoYXQgZnVuY3Rpb24gd2lsbCBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIGxvdy1sZXZlbCBtZWNoYW5pY3Mgb2YgYWxsIHRoZXNlIHVzZXMsIGFuZCB3aGF0IHRoZSBjb3JlIGJlaGF2aW9yIGFuZCBzaWRlIGVmZmVjdHMgYXJlLiBUaW1lIHRvIHN0YXJ0IGRpZ2dpbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY1MDEsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyOTo0NC43MzA0MjU3MzhaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5NTczMjY4NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3ZtX21hcF9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnkuYz0yNzI0PUVYUE9SVF9TWU1CT0wodm1faW5zZXJ0X3BhZ2UpO1xcbi0tXFxubW0vbWVtb3J5LmMtMjcyNi0vKlxcbm1tL21lbW9yeS5jOjI3Mjc6ICogX192bV9tYXBfcGFnZXMgLSBtYXBzIHJhbmdlIG9mIGtlcm5lbCBwYWdlcyBpbnRvIHVzZXIgdm1hXFxubW0vbWVtb3J5LmMtMjcyOC0gKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cXG4tLVxcbm1tL21lbW9yeS5jLTI3MzgtICovXFxubW0vbWVtb3J5LmM6MjczOTpzdGF0aWMgaW50IF9fdm1fbWFwX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL21lbW9yeS5jLTI3NDAtXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KVxcbi0tXFxubW0vbWVtb3J5LmM9Mjc3ND1pbnQgdm1fbWFwX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vbWVtb3J5LmMtMjc3Ni17XFxubW0vbWVtb3J5LmM6Mjc3NzpcXHRyZXR1cm4gX192bV9tYXBfcGFnZXModm1hLCBwYWdlcywgbnVtLCB2bWFfc3RhcnRfcGdvZmYodm1hKSk7XFxubW0vbWVtb3J5LmMtMjc3OC19XFxuLS1cXG5tbS9tZW1vcnkuYz0yNzk0PWludCB2bV9tYXBfcGFnZXNfemVybyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4tLVxcbm1tL21lbW9yeS5jLTI3OTYte1xcbm1tL21lbW9yeS5jOjI3OTc6XFx0cmV0dXJuIF9fdm1fbWFwX3BhZ2VzKHZtYSwgcGFnZXMsIG51bSwgMCk7XFxubW0vbWVtb3J5LmMtMjc5OC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI5OjQ2LjMyNjE2Mjg2MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwMDM5NzgzMjU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGB3YWxrX3RvX3BtZGAgaW4gYG1tL21lbW9yeS5jYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IGB3YWxrX3RvX3BtZGAgZnVuY3Rpb25zIHdpdGhpbiBgbW0vbWVtb3J5LmNgLiBJJ20gc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gaXRzIHJvbGUsIHRoZSBkYXRhIHN0cnVjdHVyZXMgaXQgbWFuaXB1bGF0ZXMsIGFuZCBob3cgaXQgY29udHJpYnV0ZXMgdG8gdGhlIG92ZXJhbGwgcGFnZSB0YWJsZSB0cmF2ZXJzYWwgcHJvY2Vzcy4gSSdtIGFzc3VtaW5nLCBvZiBjb3Vyc2UsIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjZW50cmFsIHRvIHRoZSBoaWdoZXItbGV2ZWwgYWRkcmVzcyB0cmFuc2xhdGlvbiB0YXNrcy4gSSdsbCBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCBob3cgaXQgaGFuZGxlcyBwb3RlbnRpYWwgcGFnZSBmYXVsdHMsIHdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGl0IGVtcGxveXMgdG8gZW5zdXJlIGNvbmN1cnJlbmN5IHNhZmV0eSAoaWYgYW55KSwgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBwYWdlIHRhYmxlIHN0cnVjdHVyZXMuIFdoYXQgYXJlIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zPyBXaGF0IGlucHV0IHBhcmFtZXRlcnMgYXJlIGV4cGVjdGVkLCBhbmQgd2hhdCBhcmUgdGhlIHJldHVybiB2YWx1ZXM/IEFyZSB0aGVyZSBhbnkgc3VidGxlIG9wdGltaXphdGlvbnMgaW4gcGxheSwgcGVyaGFwcyByZWxhdGVkIHRvIFRMQiBtYW5hZ2VtZW50IG9yIHByZWZldGNoaW5nPyBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IG1hZ2ljIGhhcHBlbnMsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0IGNvbXBsZXRlbHkgdG8gdHJvdWJsZXNob290IGFueSBtZW1vcnktcmVsYXRlZCBpc3N1ZXMuIEknbGwgYmUgbG9va2luZyBmb3IgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIHN1YnRsZSBidWdzIHRoYXQgbWlnaHQgbHVyayBpbiB0aGlzIGZ1bmN0aW9uLCBrbm93aW5nIGhvdyBjcnVjaWFsIGl0IGlzIHRvIHRoZSB3aG9sZSBtZW1vcnkgc3Vic3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTcxLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6MzA6MzYuMzY1OTQ3Nzg2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDMyNzc4MDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIndhbGtfdG9fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTI0MDA9RVhQT1JUX1NZTUJPTF9HUEwoemFwX3NwZWNpYWxfdm1hX3JhbmdlKTtcXG5tbS9tZW1vcnkuYy0yNDAxLVxcbm1tL21lbW9yeS5jOjI0MDI6c3RhdGljIHBtZF90ICp3YWxrX3RvX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxcbm1tL21lbW9yeS5jLTI0MDMte1xcbi0tXFxubW0vbWVtb3J5LmM9MjQyND1wdGVfdCAqZ2V0X2xvY2tlZF9wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTI0MjYte1xcbm1tL21lbW9yeS5jOjI0Mjc6XFx0cG1kX3QgKnBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTtcXG5tbS9tZW1vcnkuYy0yNDI4LVxcbi0tXFxubW0vbWVtb3J5LmM9MjU1OD1zdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtMjU2OS1tb3JlOlxcbm1tL21lbW9yeS5jOjI1NzA6XFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xcbm1tL21lbW9yeS5jLTI1NzEtXFx0aWYgKCFwbWQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6MzA6MzcuNzk4NzMyMDkzWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE1ODc4MzM2MzE0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkludmVzdGlnYXRpbmcgYHdhbGtfdG9fcG1kYCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIGB3YWxrX3RvX3BtZGAgZnVuY3Rpb24uIEknbSBhc3N1bWluZyBpdCdzIHJlbGF0ZWQgdG8gc29tZSBzb3J0IG9mIHBhdGggcGxhbm5pbmcgb3IgbW90aW9uIGNvbnRyb2wsIHByb2JhYmx5IGZvciBhIHBoeXNpY2FsIGRldmljZSBvciBhIHNpbXVsYXRlZCBlbnZpcm9ubWVudCwgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJXaGF0IGFyZSB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzP1wiLiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlIOKAkyBkb2VzIGl0IHRha2UgYSB0YXJnZXQgUE1EIChwcmVzdW1hYmx5IGEgXCJwb2ludCBtYXNzIGRpc3RyaWJ1dGlvbixcIiBvciBwZXJoYXBzIHNvbWV0aGluZyBtb3JlIHNwZWNpZmljIHRvIHRoZSBkb21haW4pIGFzIGFuIGFyZ3VtZW50PyBJcyBpdCBleHBlY3RpbmcgYW4gaW5pdGlhbCBzdGF0ZSwgY3VycmVudCBwb3NpdGlvbi9vcmllbnRhdGlvbiwgb3IgYSBzdGFydCBsb2NhdGlvbj8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJldHVybiB2YWx1ZS4gSXMgaXQgYSB0cmFqZWN0b3J5LCBhIHNpbmdsZSBjb250cm9sIGFjdGlvbiwgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy9mYWlsdXJlLCBvciBtYXliZSBldmVuIGFuIGludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZT8gVGhlIHNlbWFudGljcyBoZXJlIGFyZSBjcml0aWNhbC5cblxuTmV4dCwgSSdsbCB3YW50IHRvIHRyYWNlIGl0cyBleGVjdXRpb24gcGF0aC4gSSdsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIGNvZGUsIGxvb2tpbmcgZm9yIGFueSBlZGdlIGNhc2VzLCBib3VuZGFyeSBjb25kaXRpb25zLCBvciBhc3N1bXB0aW9ucyBpdCBtaWdodCBtYWtlLiBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcywgb3IgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSBvcGVyYXRpb25zIHRoYXQgd291bGQgYmUgaW1tZWRpYXRlbHkgYXBwYXJlbnQ/IEnigJlsbCBiZSBjaGVja2luZyBmb3IgYW55IGRlcGVuZGVuY2llcyBvbiBvdGhlciBmdW5jdGlvbnMgb3IgbW9kdWxlcyB3aXRoaW4gdGhpcyBjb2RlYmFzZSDigJMgdGhvc2UgYXJlIGFsd2F5cyBpbXBvcnRhbnQgdG8gdHJhY2UuXG5cbkknbSBhbHNvIGN1cmlvdXMgYWJvdXQgZXJyb3IgaGFuZGxpbmcuIERvZXMgaXQgdGhyb3cgZXhjZXB0aW9ucywgcmV0dXJuIGVycm9yIGNvZGVzLCBvciBzaWxlbnRseSBmYWlsPyBSb2J1c3RuZXNzIGlzIGtleSwgZXNwZWNpYWxseSBpZiB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgYSByZWFsLXdvcmxkIHN5c3RlbS4gSSdsbCBuZWVkIHRvIGtub3cgaWYgdGhlIGNvZGUgaGFzIGFkZXF1YXRlIHVuaXQgdGVzdHMgYW5kIGludGVncmF0aW9uIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCBpdC4gSWYgdGhpcyBgd2Fsa190b19wbWRgIGZ1bmN0aW9uIGlzIGZhaWxpbmcsIG9yIEknbSB0cnlpbmcgdG8gaW1wcm92ZSBpdHMgcGVyZm9ybWFuY2UsIEknbGwgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBsb2dnaW5nIHN0YXRlbWVudHMgYXJlIHRvIHVuZGVyc3RhbmQgaXRzIGJlaGF2aW9yLlxuXG5GaW5hbGx5LCBJJ2xsIGJlIGZvcm1pbmcgc29tZSBoeXBvdGhlc2VzIGFib3V0IGhvdyB0aGUgZnVuY3Rpb24gd29ya3MuIElzIGl0IHVzaW5nIGEgc3RhbmRhcmQgcGF0aCBwbGFubmluZyBhbGdvcml0aG0gbGlrZSBBKiwgUlJULCBvciBzb21ldGhpbmcgbW9yZSBiZXNwb2tlPyBEb2VzIGl0IGNvbnNpZGVyIGNvbGxpc2lvbiBhdm9pZGFuY2UsIGR5bmFtaWMgY29uc3RyYWludHMsIGFuZCBhbnkgcG90ZW50aWFsIHBoeXNpY2FsIGxpbWl0YXRpb25zIG9mIHRoZSBcIndhbGtlclwiPyBUaGUgc3BlY2lmaWNzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGxpa2VseSBwb2ludCB0byB0aGUgdW5kZXJseWluZyBtZXRob2RvbG9neSBhbmQgYW55IHBvc3NpYmxlIG9wdGltaXNhdGlvbnMuIFRoaXMgZGVlcGVyIHVuZGVyc3RhbmRpbmcgd2lsbCBiZSBlc3NlbnRpYWwgdG8gZXZhbHVhdGUgaXRzIG92ZXJhbGwgZWZmZWN0aXZlbmVzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc2MywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjMwOjUzLjY3NzA3MTEzN1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTc5MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjQwMCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjQwMDpcXHRFWFBPUlRfU1lNQk9MX0dQTCh6YXBfc3BlY2lhbF92bWFfcmFuZ2UpO1xcbjI0MDE6XFx0XFxuMjQwMjpcXHRzdGF0aWMgcG1kX3QgKndhbGtfdG9fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpXFxuMjQwMzpcXHR7XFxuMjQwNDpcXHRcXHRwZ2RfdCAqcGdkO1xcbjI0MDU6XFx0XFx0cDRkX3QgKnA0ZDtcXG4yNDA2OlxcdFxcdHB1ZF90ICpwdWQ7XFxuMjQwNzpcXHRcXHRwbWRfdCAqcG1kO1xcbjI0MDg6XFx0XFxuMjQwOTpcXHRcXHRwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTtcXG4yNDEwOlxcdFxcdHA0ZCA9IHA0ZF9hbGxvYyhtbSwgcGdkLCBhZGRyKTtcXG4yNDExOlxcdFxcdGlmICghcDRkKVxcbjI0MTI6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMjQxMzpcXHRcXHRwdWQgPSBwdWRfYWxsb2MobW0sIHA0ZCwgYWRkcik7XFxuMjQxNDpcXHRcXHRpZiAoIXB1ZClcXG4yNDE1OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbjI0MTY6XFx0XFx0cG1kID0gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpO1xcbjI0MTc6XFx0XFx0aWYgKCFwbWQpXFxuMjQxODpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4yNDE5OlxcdFxcbjI0MjA6XFx0XFx0Vk1fQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTtcXG4yNDIxOlxcdFxcdHJldHVybiBwbWQ7XFxuMjQyMjpcXHR9XFxuMjQyMzpcXHRcXG4yNDI0OlxcdHB0ZV90ICpnZXRfbG9ja2VkX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbjI0MjU6XFx0XFx0XFx0ICAgICAgc3BpbmxvY2tfdCAqKnB0bClcXG4yNDI2OlxcdHtcXG4yNDI3OlxcdFxcdHBtZF90ICpwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XFxuMjQyODpcXHRcXG4yNDI5OlxcdFxcdGlmICghcG1kKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzozMDo1My42NzczMzA3NzdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDQ1ODIyNTE4MzU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKldvcnRoRnV6emluZyBBc3Nlc3NtZW50OiBLZXJuZWwgTWVtb3J5IEFsbG9jYXRpb24gRXJyb3IgSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgcGF0Y2ggY2hhbmdlcyBob3cgd2UgaGFuZGxlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzIHdpdGhpbiB0aGUgY29yZSBrZXJuZWwsIHNwZWNpZmljYWxseSBpbiBgbW0vbWVtb3J5LmNgLiBJdCdzIGEgcmVsYXRpdmVseSBmb2N1c2VkIGNoYW5nZTsgdGhlIG1vZGlmaWNhdGlvbiBpcyBpbiBgd2Fsa190b19wbWRgIGFuZCBob3cgZXJyb3JzIHByb3BhZ2F0ZSBpbiBgaW5zZXJ0X3BhZ2VzKClgLiBQcmV2aW91c2x5LCBhIG51bGwgcmV0dXJuIGZyb20gYHdhbGtfdG9fcG1kYCAoaW5kaWNhdGluZyBwYWdlIHRhYmxlIGFsbG9jYXRpb24gZmFpbHVyZSwgdXNpbmcgYHA0ZF9hbGxvY2AsIGBwdWRfYWxsb2NgLCBvciBgcG1kX2FsbG9jYCkgcmVzdWx0ZWQgaW4gYC1FRkFVTFRgLiBUaGUgcGF0Y2ggZWxlZ2FudGx5IGNvcnJlY3RzIHRoaXMsIGNoYW5naW5nIHRoZSByZXR1cm4gY29kZSB0byBgLUVOT01FTWAsIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IHdlIGV4cGVjdCB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLiBUaGlzIGNoYW5nZSBhbHNvIGNsZWFucyB1cCBzb21lIGxvY2FsIHZhcmlhYmxlIG1hbmFnZW1lbnQuXG5cbk5vdywgdGhlIGNydWNpYWwgcXVlc3Rpb24gaXMgd2hldGhlciB0aGlzIHdhcnJhbnRzIGZ1enppbmcuIEkgbmVlZCB0byBhcHBseSB0aGUgZnV6emluZyBjcml0ZXJpYS4gVGhlIGluc3RydWN0aW9ucyBzcGVjaWZ5IHRoYXQgd2Ugc2hvdWxkIGF2b2lkIGZ1enppbmcgZG9jdW1lbnRhdGlvbiBjaGFuZ2VzLCBsb2dnaW5nIG1vZGlmaWNhdGlvbnMsIGNvc21ldGljIGNoYW5nZXMgdG8gY29uc3RhbnRzLCB1bnJlYWNoYWJsZSBjb2RlIHBhdGhzIChlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUpLCB2ZW5kb3Itc3BlY2lmaWMgZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcywgZXRjLiBIb3dldmVyLCB0aGlzIGNoYW5nZSAqZG9lcyogbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIChgbW0vbWVtb3J5LmNgKS4gU3BlY2lmaWNhbGx5LCBpdCdzIG1vZGlmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHJldHVybiB2YWx1ZXMgb2YgYGluc2VydF9wYWdlcygpYCBhbmQgYHZtX2luc2VydF9wYWdlcygpYC5cblxuTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gaWYgdGhlIGFmZmVjdGVkIGNvZGUgaXMgcmVhY2hhYmxlIGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudC4gVGhlIGdvb2QgbmV3cyBpcywgYHZtX2luc2VydF9wYWdlcygpYCBpcyBub3Qgb2JzY3VyZTsgaXQncyByZWFjaGFibGUgdmlhIHNldmVyYWwgY29tbW9uIGtlcm5lbCBmZWF0dXJlcywgaW5jbHVkaW5nIGBpb191cmluZ2AgbW1hcCwgVENQIHplcm9jb3B5IChgZ2V0c29ja29wdCguLi4sIFRDUF9aRVJPQ09QWV9SRUNFSVZFLCAuLi4pYCksIGFuZCByaW5nX2J1ZmZlciBtbWFwLiBUaGlzIGNvbmZpcm1zIHRoZSByZWFjaGFiaWxpdHkgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgZnV6eiB0YXJnZXQuIFRoZSBjaGFuZ2UgYWxzbyBtb2RpZmllcyBlcnJvciBoYW5kbGluZyB3aGljaCBpcyBkZWZpbml0ZWx5IHdvcnRoIGV4cGxvcmluZy5cblxuRmluYWxseSwgbGV0J3MgZXhhbWluZSBwb3RlbnRpYWwgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMuIGBtbS9tZW1vcnkuY2AgaXMgY29yZSB0byB0aGUga2VybmVsJ3MgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGlzIGFsd2F5cyBidWlsdCBpbnRvIHRoZSBjb3JlLiBJIGNhbiB2ZXJpZnkgdGhpcyBieSBjaGVja2luZyB0aGUgYG1tL01ha2VmaWxlYCBhbmQgYG1tL0tjb25maWdgLCBidXQgdGhpcyBpcyB1c3VhbGx5IGEgZ2l2ZW4uIE5vIHNwZWNpYWwgY29uZmlndXJhdGlvbnMgc2hvdWxkIGJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIGNoYW5nZSBvciB0ZXN0IGl0cyBpbXBsaWNhdGlvbnMuIEkgd2lsbCBhbHNvIGNoZWNrIHRoZSBcImZvY3VzIHN5bWJvbHNcIiB3aGljaCBpbmNsdWRlIGB2bV9pbnNlcnRfcGFnZXNgLCBgdm1fbWFwX3BhZ2VzYCwgYW5kIGB2bV9tYXBfcGFnZXNfemVyb2AuIFdoaWxlIEkgY2FuJ3QgYmUgKmNvbXBsZXRlbHkqIGNlcnRhaW4gd2l0aG91dCBhIGRlZXBlciBkaXZlLCBgdm1faW5zZXJ0X3BhZ2VzYCBpcyBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciBmdXp6aW5nLlxuXG5UaGVyZWZvcmUsIGJlY2F1c2UgdGhpcyBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIGFkZHJlc3NlcyBwb3RlbnRpYWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3JzIGluIGEgY29tbW9uIGNvZGUgcGF0aCwgbXkgYXNzZXNzbWVudCBpcyAqKldvcnRoRnV6emluZz10cnVlKiouIFRoZSBzd2l0Y2ggZnJvbSBgLUVGQVVMVGAgdG8gYC1FTk9NRU1gIGlzIGEgc2VtYW50aWNhbGx5IGNvcnJlY3QgY2hhbmdlLCB3aGljaCBpcyB3b3J0aCBmdXp6aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NzI4LCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mzg6MTkuNDk5ODUxNDkyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NjgxMDU0OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9MzY9bW11LXlcXHRcXHRcXHQ6PSBub21tdS5vXFxubW0vTWFrZWZpbGU6Mzc6bW11LSQoQ09ORklHX01NVSlcXHQ6PSBoaWdobWVtLm8gbWVtb3J5Lm8gbWluY29yZS5vIFxcXFxcXG5tbS9NYWtlZmlsZS0zOC1cXHRcXHRcXHQgICBtbG9jay5vIG1tYXAubyBtbXVfZ2F0aGVyLm8gbXByb3RlY3QubyBtcmVtYXAubyBcXFxcXFxuLS1cXG5tbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTEwOTQ9c3RhdGljIHNzaXplX3QgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmMtMTE4MC1cXHRcXHRldmVudC1cXHUwMDNldW5yZWdpc3Rlcl9ldmVudCA9IG1lbV9jZ3JvdXBfdXNhZ2VfdW5yZWdpc3Rlcl9ldmVudDtcXG5tbS9tZW1jb250cm9sLXYxLmM6MTE4MTpcXHR9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgXFxcIm1lbW9yeS5vb21fY29udHJvbFxcXCIpKSB7XFxubW0vbWVtY29udHJvbC12MS5jLTExODItXFx0XFx0cHJfd2Fybl9vbmNlKFxcXCJvb21fY29udHJvbCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuIFxcXCJcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yMDM5PXZvaWQgbWVtX2Nncm91cF9wcmludF9vb21fZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIwNDItXFx0cHJfY29udF9jZ3JvdXBfcGF0aChtZW1jZy1cXHUwMDNlY3NzLmNncm91cCk7XFxubW0vbWVtY29udHJvbC5jOjIwNDM6XFx0cHJfY29udChcXFwiIGFyZSBnb2luZyB0byBiZSBraWxsZWQgZHVlIHRvIG1lbW9yeS5vb20uZ3JvdXAgc2V0XFxcXG5cXFwiKTtcXG5tbS9tZW1jb250cm9sLmMtMjA0NC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM4OjE5LjU5NjY2NzQ5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM2Njc5ODA3NDI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgYG1lbW9yeS5vYCBEZXBlbmRlbmN5KipcblxuUmlnaHQsIHNvIGBtZW1vcnkub2AgaXMgYnVpbHQgd2l0aCBgQ09ORklHX01NVWAuIFRoYXQncyBhIHByZXR0eSBzdGFuZGFyZCB0aGluZywgZXNwZWNpYWxseSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIEJ1dCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgKndoeSogYmVoaW5kIHRoaXMgZGVwZW5kZW5jeS4gQXJlIHRoZXJlIG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoYXQgYWxzbyBlbmFibGUgY2FsbGluZyBpbnRvIG1vZHVsZXMgdGhhdCByZWx5IG9uIHRoZSBNTVU/IEknbSB0aGlua2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgdGhpbmdzIGxpa2UgVENQIHplcm8tY29weSBvciBJT19VUklORywgd2hpY2ggbWlnaHQgaW5kaXJlY3RseSByZXF1aXJlIHRoaXMuIExldCdzIG1ha2UgYSBxdWljayBub3RlOiBgSU5FVGAsIGBJT19VUklOR2AsIGFuZCBgTU1VYC4gT2theSwgSSdsbCBzdGFydCBieSBkcmlsbGluZyBkb3duIG9uIHRoZSBgTU1VYCB1c2FnZSBmaXJzdC4gVGhhdCBzZWVtcyBsaWtlIHRoZSBtb3N0IG9idmlvdXMgc3RhcnRpbmcgcG9pbnQgZm9yIGFuIGludmVzdGlnYXRpb24uXG5cbkFscmlnaHQsIHRoYXQgZmVlbHMgbGlrZSBhIGdvb2QgcGxhbi4gTm93LCB0byBtYWtlIHN1cmUgSSBhbSBvbiB0cmFjayB3aXRoIG15IGludmVzdGlnYXRpb24sIGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA1MDMsIk91dHB1dFRva2VucyI6MTM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mzg6NTYuMjc2NDc3MzA5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIwNDA3ODE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNTVVcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2bV9pbnNlcnRfcGFnZXNcIixcbiAgICBcInZtX21hcF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzX3plcm9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBlcnJvciByZXR1cm4gaGFuZGxpbmcgaW4gbW0vbWVtb3J5LmMgd2l0aGluIGluc2VydF9wYWdlcygpIChhbmQgdHJhbnNpdGl2ZWx5IHZtX2luc2VydF9wYWdlcygpKSwgY29ycmVjdGx5IHJldHVybmluZyAtRU5PTUVNIGluc3RlYWQgb2YgLUVGQVVMVCB3aGVuIHdhbGtfdG9fcG1kKCkgb3IgcHRlX2FsbG9jKCkgZmFpbHMuIFRoaXMgYWZmZWN0cyBjb3JlIHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQgdXNlZCBieSBpb191cmluZywgbmV0d29ya2luZyAoVENQIHplcm9jb3B5KSwgYW5kIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1NVVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtX2luc2VydF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzXCIsXG4gICAgXCJ2bV9tYXBfcGFnZXNfemVyb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM4OjU2LjM5Njg5MjQzN1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU3NDAzMzAzODIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzozODo1Ni4zOTczNzg4MTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1NTczOTgzODA3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXFxuXFxuTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgYnVmZmVycywgb3IgY29waWVzIHRvIHVzZXIgc3BhY2UgYXJlIGludHJvZHVjZWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgKGBlcnJgLCBgcmVtYWluaW5nX3BhZ2VzX3RvdGFsYCwgYGN1cnJfcGFnZV9pZHhgKSBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBlcnJvciBjb2RlcyBhcmUgZXhwbGljaXRseSBhc3NpZ25lZCBiZWZvcmUgYW55IGp1bXAgdG8gdGhlIGV4aXQgbGFiZWwuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBmN2E4MTM0MmRiM2M2NGQ5ZTcwMzY1NWViZDNhMjFlZmVmNDA4ZjA4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMjkgMTc6Mjc6NDAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXG5pbmRleCA5Y2JjZTVjOTBiZmZkLi4yN2ZmZTFhOTlhMDhiIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5LmNcbisrKyBiL21tL21lbW9yeS5jXG5AQCAtMjU2NSwyMCArMjU2NSwyMiBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFx0dW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDtcbiBcdHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nX3BhZ2VzX3RvdGFsID0gKm51bTtcbiBcdHVuc2lnbmVkIGxvbmcgcGFnZXNfdG9fd3JpdGVfaW5fcG1kO1xuLVx0aW50IHJldDtcbitcdGludCBlcnIgPSAwO1xuIG1vcmU6XG4tXHRyZXQgPSAtRUZBVUxUO1xuIFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xuLVx0aWYgKCFwbWQpXG4rXHRpZiAoIXBtZCkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dDtcbitcdH1cbiBcbiBcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4gXHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbiBcbiBcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4tXHRyZXQgPSAtRU5PTUVNO1xuLVx0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSlcbitcdGlmIChwdGVfYWxsb2MobW0sIHBtZCkpIHtcbitcdFx0ZXJyID0gLUVOT01FTTtcbiBcdFx0Z290byBvdXQ7XG4rXHR9XG4gXG4gXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XG4gXHRcdGludCBwdGVfaWR4ID0gMDtcbkBAIC0yNTg2LDE1ICsyNTg4LDE0IEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXG4gXHRcdHN0YXJ0X3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgXHUwMDI2cHRlX2xvY2spO1xuIFx0XHRpZiAoIXN0YXJ0X3B0ZSkge1xuLVx0XHRcdHJldCA9IC1FRkFVTFQ7XG4rXHRcdFx0ZXJyID0gLUVGQVVMVDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFx0XHRmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCBcdTAwM2MgYmF0Y2hfc2l6ZTsgKytwdGUsICsrcHRlX2lkeCkge1xuLVx0XHRcdGludCBlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsXG4tXHRcdFx0XHRhZGRyLCBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XG4rXHRcdFx0ZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLCBhZGRyLFxuK1x0XHRcdFx0XHRcdFx0ICBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XG4gXHRcdFx0aWYgKHVubGlrZWx5KGVycikpIHtcbiBcdFx0XHRcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XG4tXHRcdFx0XHRyZXQgPSBlcnI7XG4gXHRcdFx0XHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gcHRlX2lkeDtcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbkBAIC0yNjA3LDEwICsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdH1cbiBcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4gXHRcdGdvdG8gbW9yZTtcbi1cdHJldCA9IDA7XG4gb3V0OlxuIFx0Km51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDtcbi1cdHJldHVybiByZXQ7XG4rXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiAvKipcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM4OjU2LjM5NzM4MDAwN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozOTgxNDAxNzkzOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgdGhpbmtpbmcgYXMgYW4gZXhwZXJ0IGluIHRoZSBmaWVsZDpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5LmNgKipcblxuQWxyaWdodCwgdGhlIGluc3RydWN0aW9uIHNheXMgdG8gc3RhcnQgYnkgaW5zcGVjdGluZyB0aGUgZGlmZiBhbmQgcmVhZGluZyB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgbW0vbWVtb3J5LmNgLiBNeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gSSBrbm93IGBtbS9tZW1vcnkuY2AgaXMgdGhlIGhlYXJ0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoaXMgc3lzdGVtLCBzbyB3aGF0ZXZlciBjaGFuZ2UgaXMgcHJvcG9zZWQsIGl0J3MgcG90ZW50aWFsbHkgY3JpdGljYWwuIEnigJlsbCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqIGJlaGluZCB0aGlzIGNoYW5nZSwgdGhlIGludGVuZGVkIGVmZmVjdCwgYW5kIGFueSBwb3RlbnRpYWwgc2lkZS1lZmZlY3RzLiBCZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSBJJ2xsIHdhbnQgdG8gZ2V0IGEgZ29vZCBzZW5zZSBvZiB0aGUgY29udGV4dCBvZiB0aGUgZGlmZi4gSSdsbCByZWFkIGFyb3VuZCB0aGUgY29kZSBhdCB0aGF0IGxvY2F0aW9uIHRvIGJ1aWxkIGEgbWVudGFsIHBpY3R1cmUgb2Ygd2hhdCdzIGdvaW5nIG9uLlxuXG5UaGUgaW5zdHJ1Y3Rpb24gYWxzbyBzYXlzIHRvIHVzZSBgcmVhZC1maWxlYCBhcm91bmQgbGluZSAyNTY1IGluIGBtbS9tZW1vcnkuY2AuIFJpZ2h0LCBzbyBJIGtub3cgSSBuZWVkIHRvIGJlIHJlYWR5IHRvIGFuYWx5emUgdGhpcyBzZWN0aW9uIGNsb3NlbHkuIEkgd2lsbCBleHBlY3QgdGhpcyB0byBnaXZlIG1lIHRoZSBpbmZvcm1hdGlvbiB0byBkbyBteSBqb2IsIGFuZCBzdGFydCB0byBmb3JtIGEgY29tcHJlaGVuc2l2ZSBtZW50YWwgbW9kZWwgb2YgdGhlIGNvZGUuIEkgYW0gcmVhZHkgdG8gZGlnIGludG8gdGhlIGRldGFpbHMgYW5kIHN0YXJ0IGFuYWx5emluZyB0aGUgY29kZS4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjI0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzozOTozNi4yMTE0MDA5NjZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzIzNDA0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnkuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTUwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNTUwOlxcdFxcdGlmIChlcnIpXFxuMjU1MTpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjI1NTI6XFx0XFx0cmV0dXJuIGluc2VydF9wYWdlX2ludG9fcHRlX2xvY2tlZCh2bWEsIHB0ZSwgYWRkciwgcGFnZSwgcHJvdCwgZmFsc2UpO1xcbjI1NTM6XFx0fVxcbjI1NTQ6XFx0XFxuMjU1NTpcXHQvKiBpbnNlcnRfcGFnZXMoKSBhbW9ydGl6ZXMgdGhlIGNvc3Qgb2Ygc3BpbmxvY2sgb3BlcmF0aW9uc1xcbjI1NTY6XFx0ICogd2hlbiBpbnNlcnRpbmcgcGFnZXMgaW4gYSBsb29wLlxcbjI1NTc6XFx0ICovXFxuMjU1ODpcXHRzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbjI1NTk6XFx0XFx0XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtLCBwZ3Byb3RfdCBwcm90KVxcbjI1NjA6XFx0e1xcbjI1NjE6XFx0XFx0cG1kX3QgKnBtZCA9IE5VTEw7XFxuMjU2MjpcXHRcXHRwdGVfdCAqc3RhcnRfcHRlLCAqcHRlO1xcbjI1NjM6XFx0XFx0c3BpbmxvY2tfdCAqcHRlX2xvY2s7XFxuMjU2NDpcXHRcXHRzdHJ1Y3QgbW1fc3RydWN0ICpjb25zdCBtbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuMjU2NTpcXHRcXHR1bnNpZ25lZCBsb25nIGN1cnJfcGFnZV9pZHggPSAwO1xcbjI1NjY6XFx0XFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xcbjI1Njc6XFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7XFxuMjU2ODpcXHRcXHRpbnQgZXJyID0gMDtcXG4yNTY5OlxcdG1vcmU6XFxuMjU3MDpcXHRcXHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XFxuMjU3MTpcXHRcXHRpZiAoIXBtZCkge1xcbjI1NzI6XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4yNTczOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjI1NzQ6XFx0XFx0fVxcbjI1NzU6XFx0XFxuMjU3NjpcXHRcXHRwYWdlc190b193cml0ZV9pbl9wbWQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLFxcbjI1Nzc6XFx0XFx0XFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsLCBQVFJTX1BFUl9QVEUgLSBwdGVfaW5kZXgoYWRkcikpO1xcbjI1Nzg6XFx0XFxuMjU3OTpcXHRcXHQvKiBBbGxvY2F0ZSB0aGUgUFRFIGlmIG5lY2Vzc2FyeTsgdGFrZXMgUE1EIGxvY2sgb25jZSBvbmx5LiAqL1xcbjI1ODA6XFx0XFx0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkge1xcbjI1ODE6XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4yNTgyOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjI1ODM6XFx0XFx0fVxcbjI1ODQ6XFx0XFxuMjU4NTpcXHRcXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XFxuMjU4NjpcXHRcXHRcXHRpbnQgcHRlX2lkeCA9IDA7XFxuMjU4NzpcXHRcXHRcXHRjb25zdCBpbnQgYmF0Y2hfc2l6ZSA9IG1pbl90KGludCwgcGFnZXNfdG9fd3JpdGVfaW5fcG1kLCA4KTtcXG4yNTg4OlxcdFxcbjI1ODk6XFx0XFx0XFx0c3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCBcXHUwMDI2cHRlX2xvY2spO1xcbjI1OTA6XFx0XFx0XFx0aWYgKCFzdGFydF9wdGUpIHtcXG4yNTkxOlxcdFxcdFxcdFxcdGVyciA9IC1FRkFVTFQ7XFxuMjU5MjpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4yNTkzOlxcdFxcdFxcdH1cXG4yNTk0OlxcdFxcdFxcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFxcdTAwM2MgYmF0Y2hfc2l6ZTsgKytwdGUsICsrcHRlX2lkeCkge1xcbjI1OTU6XFx0XFx0XFx0XFx0ZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLCBhZGRyLFxcbjI1OTY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XFxuMjU5NzpcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkoZXJyKSkge1xcbjI1OTg6XFx0XFx0XFx0XFx0XFx0cHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTtcXG4yNTk5OlxcdFxcdFxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xcbjI2MDA6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMjYwMTpcXHRcXHRcXHRcXHR9XFxuMjYwMjpcXHRcXHRcXHRcXHRhZGRyICs9IFBBR0VfU0laRTtcXG4yNjAzOlxcdFxcdFxcdFxcdCsrY3Vycl9wYWdlX2lkeDtcXG4yNjA0OlxcdFxcdFxcdH1cXG4yNjA1OlxcdFxcdFxcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XFxuMjYwNjpcXHRcXHRcXHRwYWdlc190b193cml0ZV9pbl9wbWQgLT0gYmF0Y2hfc2l6ZTtcXG4yNjA3OlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBiYXRjaF9zaXplO1xcbjI2MDg6XFx0XFx0fVxcbjI2MDk6XFx0XFx0aWYgKHJlbWFpbmluZ19wYWdlc190b3RhbClcXG4yNjEwOlxcdFxcdFxcdGdvdG8gbW9yZTtcXG4yNjExOlxcdG91dDpcXG4yNjEyOlxcdFxcdCpudW0gPSByZW1haW5pbmdfcGFnZXNfdG90YWw7XFxuMjYxMzpcXHRcXHRyZXR1cm4gZXJyO1xcbjI2MTQ6XFx0fVxcbjI2MTU6XFx0XFxuMjYxNjpcXHQvKipcXG4yNjE3OlxcdCAqIHZtX2luc2VydF9wYWdlcyAtIGluc2VydCBtdWx0aXBsZSBwYWdlcyBpbnRvIHVzZXIgdm1hLCBiYXRjaGluZyB0aGUgcG1kIGxvY2suXFxuMjYxODpcXHQgKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cXG4yNjE5OlxcdCAqIEBhZGRyOiB0YXJnZXQgc3RhcnQgdXNlciBhZGRyZXNzIG9mIHRoZXNlIHBhZ2VzXFxuMjYyMDpcXHQgKiBAcGFnZXM6IHNvdXJjZSBrZXJuZWwgcGFnZXNcXG4yNjIxOlxcdCAqIEBudW06IGluOiBudW1iZXIgb2YgcGFnZXMgdG8gbWFwLiBvdXQ6IG51bWJlciBvZiBwYWdlcyB0aGF0IHdlcmUgKm5vdCpcXG4yNjIyOlxcdCAqIG1hcHBlZC4gKDAgbWVhbnMgYWxsIHBhZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IG1hcHBlZCkuXFxuMjYyMzpcXHQgKlxcbjI2MjQ6XFx0ICogUHJlZmVycmVkIG92ZXIgdm1faW5zZXJ0X3BhZ2UoKSB3aGVuIGluc2VydGluZyBtdWx0aXBsZSBwYWdlcy5cXG4yNjI1OlxcdCAqXFxuMjYyNjpcXHQgKiBJbiBjYXNlIG9mIGVycm9yLCB3ZSBtYXkgaGF2ZSBtYXBwZWQgYSBzdWJzZXQgb2YgdGhlIHByb3ZpZGVkXFxuMjYyNzpcXHQgKiBwYWdlcy4gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGFjY291bnQgZm9yIHRoaXMgY2FzZS5cXG4yNjI4OlxcdCAqXFxuMjYyOTpcXHQgKiBUaGUgc2FtZSByZXN0cmljdGlvbnMgYXBwbHkgYXMgaW4gdm1faW5zZXJ0X3BhZ2UoKS5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mzk6MzYuMjE4NjQyMTU2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE1OTE4NTQ4NTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFJlZmFjdG9yaW5nIG9mIEVycm9yIEhhbmRsaW5nIGluIGBpbnNlcnRfcGFnZXMoKWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB0cmFjZSB0aGUgY2hhbmdlcyBpbiBgaW5zZXJ0X3BhZ2VzKClgIGFuZCB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgZm9yIEtNU0FOLiBUaGUgZGlmZiBpcyByZWZhY3RvcmluZyB0aGUgZXJyb3IgaGFuZGxpbmcsIGNvbnNvbGlkYXRpbmcgdGhlIHJldHVybiB2YXJpYWJsZS4gUHJldmlvdXNseSwgdGhlcmUgd2FzIGFuIGBpbnQgcmV0YCBhbmQgYW4gaW5uZXIgYGludCBlcnJgLCBidXQgbm93IGl0J3MganVzdCBhIHNpbmdsZSBgaW50IGVycmAgaW5pdGlhbGl6ZWQgdG8gMC4gSXQgYWxzbyBjaGFuZ2VzIHRoZSBlcnJvciByZXR1cm4gd2hlbiBgd2Fsa190b19wbWRgIGZhaWxzIGZyb20gYC1FRkFVTFRgIHRvIGAtRU5PTUVNYC5cblxuTm93LCB0aGUgY3J1eCBvZiB0aGUgS01TQU4gYW5hbHlzaXM6IGFyZSB0aGVyZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZT8gSSBpbW1lZGlhdGVseSBnbyB0aHJvdWdoIHRoZSBjb2RlLCBjaGVja2luZyBmb3IgYSBmZXcgY3J1Y2lhbCB0aGluZ3MuIEZpcnN0LCBpcyBgZXJyYCB1c2VkIGJlZm9yZSBpdCdzIHNldD8gVGhlIGFuc3dlciBpcyBubywgaXQncyBpbml0aWFsaXplZCB0byAwIGFuZCBhbHdheXMgYXNzaWduZWQgYSB2YWx1ZSBvbiBhbGwgcGF0aHMuIFNlY29uZCwgSSBsb29rIGZvciBhbnkgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIGJ1ZmZlcnMgYmVpbmcgcmVhZCBpbiBjb25kaXRpb25hbHM7IHRoYXQncyBhIGNsYXNzaWMgS01TQU4gcGl0ZmFsbC4gTm90aGluZyBvZiB0aGF0IHNvcnQgaGVyZS5cblxuSSB2ZXJpZnkgdGhhdCBubyBrZXJuZWwgc3RydWN0dXJlcyBjb250YWluaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmUgYmVpbmcgcGFzc2VkIHRvIHVzZXJzcGFjZTsgdGhpcyBpcyBhIHByaW1lIGNvbmNlcm4uIEFsc28sIG5vIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcy4gVGhlcmUncyBhbHNvIG5vIGNvbmNlcm4gb2YgcG90ZW50aWFsIGJvdW5kcy1jaGVjayBpc3N1ZXMgc2luY2UgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBwYWdlc190b193cml0ZV9pbl9wbWRgIGFuZCBgY3Vycl9wYWdlX2lkeGAgYXJlIGFsbCBzY2FsYXJzIHRoYXQgYXJlIGluaXRpYWxpemVkIHRvIHplcm8uXG5cbkknbSBjb25maWRlbnQgd2UncmUgaW4gdGhlIGNsZWFyLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IGludGVybmFsIE1NIGVycm9yIGhhbmRsaW5nLCBtb3N0bHkgcmVmYWN0b3JpbmcsIGFuZCBubyBuZXcgcmlza3MgYXJlIGludHJvZHVjZWQuIFRoZSBzdGFuZGFyZCBzYW5pdGl6ZXJzL0tBU0FOIHdpbGwgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgbWVtb3J5IG1hcHBpbmcgb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiBpc3N1ZXMuIFRoZXJlZm9yZSwgdGhlIE5lZWRzS01TQU4gZmxhZyBpcyBjbGVhcmx5IGBmYWxzZWAuXG5cblNvLCB0aGUgS01TQU5SZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOlxuXG4qICAgVGhlIHBhdGNoIHJlZmFjdG9ycyBlcnJvciByZXR1cm4gdmFyaWFibGVzIGluIGBpbnNlcnRfcGFnZXMoKWAgKGNvbnNvbGlkYXRpbmcgYHJldGAgYW5kIGBlcnJgIGludG8gYSBzaW5nbGUgYGVycmAgdmFyaWFibGUpLCBhbmQgbW9kaWZpZXMgZXJyb3IgY29kZSByZXR1cm4gd2hlbiBgd2Fsa190b19wbWRgIGZhaWxzLlxuKiAgIEtNU0FOIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMsIG5vIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCB2YXJpYWJsZXMsIGFuZCBubyBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLiBBbGwgcmVsZXZhbnQgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbiogICBTdGFuZGFyZCBzYW5pdGl6ZXJzL0tBU0FOIGFyZSBzdWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjQ1LCJPdXRwdXRUb2tlbnMiOjE2OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY5NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM5OjUyLjEzNzE5NDI0OVoiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXFxuXFxuTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgYnVmZmVycywgb3IgY29waWVzIHRvIHVzZXIgc3BhY2UgYXJlIGludHJvZHVjZWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgKGBlcnJgLCBgcmVtYWluaW5nX3BhZ2VzX3RvdGFsYCwgYGN1cnJfcGFnZV9pZHhgKSBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBlcnJvciBjb2RlcyBhcmUgZXhwbGljaXRseSBhc3NpZ25lZCBiZWZvcmUgYW55IGp1bXAgdG8gdGhlIGV4aXQgbGFiZWwuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpcyBhIHJlZmFjdG9yaW5nIG9mIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gbW0vbWVtb3J5LmM6aW5zZXJ0X3BhZ2VzKCksIHVuaWZ5aW5nIHRoZSBsb2NhbCByZXR1cm4gdmFyaWFibGUgYGVycmAgKHByZXZpb3VzbHkgYHJldGAgYW5kIGEgc2hhZG93ZWQgYGVycmApIGFuZCBjaGFuZ2luZyB0aGUgZXJyb3IgY29kZSB3aGVuIGB3YWxrX3RvX3BtZCgpYCBmYWlscyBmcm9tIC1FRkFVTFQgdG8gLUVOT01FTS5cXG5cXG5ObyBuZXcgYWxsb2NhdGlvbnMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBidWZmZXJzLCBvciBjb3BpZXMgdG8gdXNlciBzcGFjZSBhcmUgaW50cm9kdWNlZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyAoYGVycmAsIGByZW1haW5pbmdfcGFnZXNfdG90YWxgLCBgY3Vycl9wYWdlX2lkeGApIGFyZSBpbml0aWFsaXplZCwgYW5kIGVycm9yIGNvZGVzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkIGJlZm9yZSBhbnkganVtcCB0byB0aGUgZXhpdCBsYWJlbC4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-29 17:25:18 +0000 UTC FinishedAt: 2026-08-29 17:39:53 +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": "d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MMU" ], "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": "d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "MMU" ], "series_id": "31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "vm_insert_pages", "vm_map_pages", "vm_map_pages_zero" ], "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+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjI3PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTJtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNTVUmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2bV9pbnNlcnRfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3ZtX21hcF9wYWdlc196ZXJvJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXG5cbk5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIGNvcGllcyB0byB1c2VyIHNwYWNlIGFyZSBpbnRyb2R1Y2VkLiBBbGwgbG9jYWwgdmFyaWFibGVzIChgZXJyYCwgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBjdXJyX3BhZ2VfaWR4YCkgYXJlIGluaXRpYWxpemVkLCBhbmQgZXJyb3IgY29kZXMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgYmVmb3JlIGFueSBqdW1wIHRvIHRoZSBleGl0IGxhYmVsLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBmN2E4MTM0MmRiM2M2NGQ5ZTcwMzY1NWViZDNhMjFlZmVmNDA4ZjA4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMjkgMTc6Mjc6NDAgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vbWVtb3J5LmMgYi9tbS9tZW1vcnkuY1xuaW5kZXggOWNiY2U1YzkwYmZmZC4uMjdmZmUxYTk5YTA4YiAxMDA2NDRcbi0tLSBhL21tL21lbW9yeS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9tZW1vcnkuY1xuQEAgLTI1NjUsMjAgJiM0MzsyNTY1LDIyIEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXHR1bnNpZ25lZCBsb25nIGN1cnJfcGFnZV9pZHggPSAwO1xuIFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7XG4tXHRpbnQgcmV0O1xuJiM0MztcdGludCBlcnIgPSAwO1xuIG1vcmU6XG4tXHRyZXQgPSAtRUZBVUxUO1xuIFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xuLVx0aWYgKCFwbWQpXG4mIzQzO1x0aWYgKCFwbWQpIHtcbiYjNDM7XHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiBcbiBcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4gXHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbiBcbiBcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4tXHRyZXQgPSAtRU5PTUVNO1xuLVx0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSlcbiYjNDM7XHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XG4mIzQzO1x0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dDtcbiYjNDM7XHR9XG4gXG4gXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XG4gXHRcdGludCBwdGVfaWR4ID0gMDtcbkBAIC0yNTg2LDE1ICYjNDM7MjU4OCwxNCBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFxuIFx0XHRzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsIFx1MDAyNnB0ZV9sb2NrKTtcbiBcdFx0aWYgKCFzdGFydF9wdGUpIHtcbi1cdFx0XHRyZXQgPSAtRUZBVUxUO1xuJiM0MztcdFx0XHRlcnIgPSAtRUZBVUxUO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkge1xuLVx0XHRcdGludCBlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsXG4tXHRcdFx0XHRhZGRyLCBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XG4mIzQzO1x0XHRcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcbiYjNDM7XHRcdFx0XHRcdFx0XHQgIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTtcbiBcdFx0XHRpZiAodW5saWtlbHkoZXJyKSkge1xuIFx0XHRcdFx0cHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTtcbi1cdFx0XHRcdHJldCA9IGVycjtcbiBcdFx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuQEAgLTI2MDcsMTAgJiM0MzsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdH1cbiBcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4gXHRcdGdvdG8gbW9yZTtcbi1cdHJldCA9IDA7XG4gb3V0OlxuIFx0Km51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDtcbi1cdHJldHVybiByZXQ7XG4mIzQzO1x0cmV0dXJuIGVycjtcbiB9XG4gXG4gLyoqXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01NVSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtX2luc2VydF9wYWdlcyYjMzQ7LAogICAgJiMzNDt2bV9tYXBfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzX3plcm8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgcmV0dXJuIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jIHdpdGhpbiBpbnNlcnRfcGFnZXMoKSAoYW5kIHRyYW5zaXRpdmVseSB2bV9pbnNlcnRfcGFnZXMoKSksIGNvcnJlY3RseSByZXR1cm5pbmcgLUVOT01FTSBpbnN0ZWFkIG9mIC1FRkFVTFQgd2hlbiB3YWxrX3RvX3BtZCgpIG9yIHB0ZV9hbGxvYygpIGZhaWxzLiBUaGlzIGFmZmVjdHMgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IHVzZWQgYnkgaW9fdXJpbmcsIG5ldHdvcmtpbmcgKFRDUCB6ZXJvY29weSksIGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGY3YTgxMzQyZGIzYzY0ZDllNzAzNjU1ZWJkM2EyMWVmZWY0MDhmMDgKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgU2F0IEF1ZyAyOSAxNzoyNzo0MCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggOWNiY2U1YzkwYmZmZC4uMjdmZmUxYTk5YTA4YiAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vbWVtb3J5LmMKQEAgLTI1NjUsMjAgJiM0MzsyNTY1LDIyIEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJdW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDsKIAl1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19wYWdlc190b3RhbCA9ICpudW07CiAJdW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7Ci0JaW50IHJldDsKJiM0MzsJaW50IGVyciA9IDA7CiBtb3JlOgotCXJldCA9IC1FRkFVTFQ7CiAJcG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpOwotCWlmICghcG1kKQomIzQzOwlpZiAoIXBtZCkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiYjNDM7CX0KIAogCXBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsCiAJCXJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTsKIAogCS8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovCi0JcmV0ID0gLUVOT01FTTsKLQlpZiAocHRlX2FsbG9jKG1tLCBwbWQpKQomIzQzOwlpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7CiYjNDM7CQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKJiM0MzsJfQogCiAJd2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkgewogCQlpbnQgcHRlX2lkeCA9IDA7CkBAIC0yNTg2LDE1ICYjNDM7MjU4OCwxNCBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCiAJCXN0YXJ0X3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJmFtcDtwdGVfbG9jayk7CiAJCWlmICghc3RhcnRfcHRlKSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwomIzQzOwkJCWVyciA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCQlmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCAmbHQ7IGJhdGNoX3NpemU7ICYjNDM7JiM0MztwdGUsICYjNDM7JiM0MztwdGVfaWR4KSB7Ci0JCQlpbnQgZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLAotCQkJCWFkZHIsIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTsKJiM0MzsJCQllcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsIGFkZHIsCiYjNDM7CQkJCQkJCSAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpOwogCQkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCQlwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spOwotCQkJCXJldCA9IGVycjsKIAkJCQlyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gcHRlX2lkeDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTI2MDcsMTAgJiM0MzsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl9CiAJaWYgKHJlbWFpbmluZ19wYWdlc190b3RhbCkKIAkJZ290byBtb3JlOwotCXJldCA9IDA7CiBvdXQ6CiAJKm51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDsKLQlyZXR1cm4gcmV0OwomIzQzOwlyZXR1cm4gZXJyOwogfQogCiAvKioKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjYyNwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDQ3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpdmluZyBpbnRvIHRoZSBNZW1vcnkgTWFuYWdlbWVudCBDb3JlKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIGRpZmYuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgYG1tL21lbW9yeS5jYCBmaWxlIOKAkyB0aGF0JiMzOTtzIHdoZXJlIHRoZSBoZWFydCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGJlYXRzLiBJJiMzOTttIGdvaW5nIHRvIGxldmVyYWdlIG15IGZhbWlsaWFyaXR5IHdpdGggdGhlIGNvZGViYXNlLCBidXQgSSYjMzk7bGwgdXNlIGByZWFkLWZpbGVgIHRvIHplcm8gaW4gb24gdGhlIGltbWVkaWF0ZSBjb250ZXh0IGFyb3VuZCBsaW5lIDI1NjUgaW4gdGhhdCBmaWxlLiBDb250ZXh0IGlzIGtpbmcsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggc3VjaCBmdW5kYW1lbnRhbCBhc3BlY3RzLiBJIG5lZWQgdG8gc2VlICp3aGF0KiBoYXMgYmVlbiBtb2RpZmllZCAqYXJvdW5kKiB0aGUgbGluZSBpbiBxdWVzdGlvbiB0byBlZmZlY3RpdmVseSBkZXRlcm1pbmUgdGhlIHB1cnBvc2Ugb2YgdGhlIGRpZmYuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogOTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjU1MDpcdFx0aWYgKGVycilcbjI1NTE6XHRcdFx0cmV0dXJuIGVycjtcbjI1NTI6XHRcdHJldHVybiBpbnNlcnRfcGFnZV9pbnRvX3B0ZV9sb2NrZWQodm1hLCBwdGUsIGFkZHIsIHBhZ2UsIHByb3QsIGZhbHNlKTtcbjI1NTM6XHR9XG4yNTU0Olx0XG4yNTU1Olx0LyogaW5zZXJ0X3BhZ2VzKCkgYW1vcnRpemVzIHRoZSBjb3N0IG9mIHNwaW5sb2NrIG9wZXJhdGlvbnNcbjI1NTY6XHQgKiB3aGVuIGluc2VydGluZyBwYWdlcyBpbiBhIGxvb3AuXG4yNTU3Olx0ICovXG4yNTU4Olx0c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbjI1NTk6XHRcdFx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nICpudW0sIHBncHJvdF90IHByb3QpXG4yNTYwOlx0e1xuMjU2MTpcdFx0cG1kX3QgKnBtZCA9IE5VTEw7XG4yNTYyOlx0XHRwdGVfdCAqc3RhcnRfcHRlLCAqcHRlO1xuMjU2MzpcdFx0c3BpbmxvY2tfdCAqcHRlX2xvY2s7XG4yNTY0Olx0XHRzdHJ1Y3QgbW1fc3RydWN0ICpjb25zdCBtbSA9IHZtYS1cdTAwM2V2bV9tbTtcbjI1NjU6XHRcdHVuc2lnbmVkIGxvbmcgY3Vycl9wYWdlX2lkeCA9IDA7XG4yNTY2Olx0XHR1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19wYWdlc190b3RhbCA9ICpudW07XG4yNTY3Olx0XHR1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3dyaXRlX2luX3BtZDtcbjI1Njg6XHRcdGludCBlcnIgPSAwO1xuMjU2OTpcdG1vcmU6XG4yNTcwOlx0XHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4yNTcxOlx0XHRpZiAoIXBtZCkge1xuMjU3MjpcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjU3MzpcdFx0XHRnb3RvIG91dDtcbjI1NzQ6XHRcdH1cbjI1NzU6XHRcbjI1NzY6XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4yNTc3Olx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbjI1Nzg6XHRcbjI1Nzk6XHRcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4yNTgwOlx0XHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XG4yNTgxOlx0XHRcdGVyciA9IC1FTk9NRU07XG4yNTgyOlx0XHRcdGdvdG8gb3V0O1xuMjU4MzpcdFx0fVxuMjU4NDpcdFxuMjU4NTpcdFx0d2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkge1xuMjU4NjpcdFx0XHRpbnQgcHRlX2lkeCA9IDA7XG4yNTg3Olx0XHRcdGNvbnN0IGludCBiYXRjaF9zaXplID0gbWluX3QoaW50LCBwYWdlc190b193cml0ZV9pbl9wbWQsIDgpO1xuMjU4ODpcdFxuMjU4OTpcdFx0XHRzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsIFx1MDAyNnB0ZV9sb2NrKTtcbjI1OTA6XHRcdFx0aWYgKCFzdGFydF9wdGUpIHtcbjI1OTE6XHRcdFx0XHRlcnIgPSAtRUZBVUxUO1xuMjU5MjpcdFx0XHRcdGdvdG8gb3V0O1xuMjU5MzpcdFx0XHR9XG4yNTk0Olx0XHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkge1xuMjU5NTpcdFx0XHRcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcbjI1OTY6XHRcdFx0XHRcdFx0XHRcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xuMjU5NzpcdFx0XHRcdGlmICh1bmxpa2VseShlcnIpKSB7XG4yNTk4Olx0XHRcdFx0XHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xuMjU5OTpcdFx0XHRcdFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsIC09IHB0ZV9pZHg7XG4yNjAwOlx0XHRcdFx0XHRnb3RvIG91dDtcbjI2MDE6XHRcdFx0XHR9XG4yNjAyOlx0XHRcdFx0YWRkciAmIzQzOz0gUEFHRV9TSVpFO1xuMjYwMzpcdFx0XHRcdCYjNDM7JiM0MztjdXJyX3BhZ2VfaWR4O1xuMjYwNDpcdFx0XHR9XG4yNjA1Olx0XHRcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XG4yNjA2Olx0XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCAtPSBiYXRjaF9zaXplO1xuMjYwNzpcdFx0XHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gYmF0Y2hfc2l6ZTtcbjI2MDg6XHRcdH1cbjI2MDk6XHRcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4yNjEwOlx0XHRcdGdvdG8gbW9yZTtcbjI2MTE6XHRvdXQ6XG4yNjEyOlx0XHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xuMjYxMzpcdFx0cmV0dXJuIGVycjtcbjI2MTQ6XHR9XG4yNjE1Olx0XG4yNjE2Olx0LyoqXG4yNjE3Olx0ICogdm1faW5zZXJ0X3BhZ2VzIC0gaW5zZXJ0IG11bHRpcGxlIHBhZ2VzIGludG8gdXNlciB2bWEsIGJhdGNoaW5nIHRoZSBwbWQgbG9jay5cbjI2MTg6XHQgKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cbjI2MTk6XHQgKiBAYWRkcjogdGFyZ2V0IHN0YXJ0IHVzZXIgYWRkcmVzcyBvZiB0aGVzZSBwYWdlc1xuMjYyMDpcdCAqIEBwYWdlczogc291cmNlIGtlcm5lbCBwYWdlc1xuMjYyMTpcdCAqIEBudW06IGluOiBudW1iZXIgb2YgcGFnZXMgdG8gbWFwLiBvdXQ6IG51bWJlciBvZiBwYWdlcyB0aGF0IHdlcmUgKm5vdCpcbjI2MjI6XHQgKiBtYXBwZWQuICgwIG1lYW5zIGFsbCBwYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBtYXBwZWQpLlxuMjYyMzpcdCAqXG4yNjI0Olx0ICogUHJlZmVycmVkIG92ZXIgdm1faW5zZXJ0X3BhZ2UoKSB3aGVuIGluc2VydGluZyBtdWx0aXBsZSBwYWdlcy5cbjI2MjU6XHQgKlxuMjYyNjpcdCAqIEluIGNhc2Ugb2YgZXJyb3IsIHdlIG1heSBoYXZlIG1hcHBlZCBhIHN1YnNldCBvZiB0aGUgcHJvdmlkZWRcbjI2Mjc6XHQgKiBwYWdlcy4gSXQgaXMgdGhlIGNhbGxlciYjMzk7cyByZXNwb25zaWJpbGl0eSB0byBhY2NvdW50IGZvciB0aGlzIGNhc2UuXG4yNjI4Olx0ICpcbjI2Mjk6XHQgKiBUaGUgc2FtZSByZXN0cmljdGlvbnMgYXBwbHkgYXMgaW4gdm1faW5zZXJ0X3BhZ2UoKS5cbjI2MzA6XHQgKi9cbjI2MzE6XHRpbnQgdm1faW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4yNjMyOlx0XHRcdFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtKVxuMjYzMzpcdHtcbjI2MzQ6XHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAqbnVtO1xuMjYzNTpcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICYjNDM7IFBBR0VfU0laRSAqIG5yX3BhZ2VzO1xuMjYzNjpcdFxuMjYzNzpcdFx0aWYgKCFyYW5nZV9pbl92bWEodm1hLCBhZGRyLCBlbmQpKVxuMjYzODpcdFx0XHRyZXR1cm4gLUVGQVVMVDtcbjI2Mzk6XHRcdGlmICghKHZtYS1cdTAwM2V2bV9mbGFncyBcdTAwMjYgVk1fTUlYRURNQVApKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjc8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDI5MAoJCQkJCQkJb3V0cHV0OiAxOQoJCQkJCQkJdGhvdWdodHM6IDQzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIFBhdGNoOiBBIE1lbW9yeSBNYW5hZ2VtZW50IEJ1ZyBGaXgqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBmaWd1cmUgb3V0IHdoYXQmIzM5O3MgY2hhbmdlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBmbG93IHdpdGhpbiBgaW5zZXJ0X3BhZ2VzYCBhbmQgaWRlbnRpZnkgdGhlIHByb2JsZW0uIFRoZSBjb3JlIGlzc3VlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIGVycm9yIGhhbmRsaW5nLCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggcGFnZSB0YWJsZSBtYW5pcHVsYXRpb24uCgpGaXJzdCwgSSBzZWUgdGhlIHByZS1wYXRjaCBiZWhhdmlvci4gSWYgYHdhbGtfdG9fcG1kYCBmYWlsZWQsIHRoZSByZXR1cm4gdmFsdWUgd2FzIC1FRkFVTFQuIFRoZW4gaWYgYHB0ZV9hbGxvY2AgZmFpbHMsIHRoZSByZXR1cm4gdmFsdWUgd2FzIC1FTk9NRU0uIEl0IHNlZW1zIHRoYXQgdGhlcmUgYXJlIGEgZmV3IHBsYWNlcyB0aGF0IGNhbiBjYXVzZSBhbiBlcnJvciBoZXJlLiBBbmQgaW4gdGhlIGxvb3AsIGlmIHdlIGZhaWxlZCB0byBnZXQgdGhlIHB0ZSwgdGhlIHJldHVybiB2YWx1ZSB3YXMgLUVGQVVMVCBhcyB3ZWxsLiBXaXRoaW4gdGhlIGxvb3AsIGBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWRgIHNldHMgdGhlIGBlcnJgIHZhcmlhYmxlLCB3aGljaCBjYW4gYmUgbm9uLXplcm8uIFRoZSBpbXBvcnRhbnQgdGhpbmcgdG8gdW5kZXJzdGFuZCBpcyB0aGF0IHRoZSBgcmV0YCB2YXJpYWJsZSBpcyBzZXQgdG8gMCBhdCB0aGUgZW5kLgoKVGhlIGJ1ZyB0aGVuLCBhcyBJIHVuZGVyc3RhbmQgaXQsIHN0ZW1zIGZyb20gdGhlIGhhbmRsaW5nIG9mIGEgTlVMTCBwbWQgcmV0dXJuZWQgYnkgYHdhbGtfdG9fcG1kYC4gUHJldmlvdXNseSwgdGhlIGNvZGUgYXNzaWduZWQgYC1FRkFVTFRgIHRvIGByZXRgLCBidXQgdGhpcyBpc24mIzM5O3QgbmVjZXNzYXJpbHkgY29ycmVjdCwgaXMgaXQ/IFdlIHNob3VsZCBiZSByZXR1cm5pbmcgYC1FTk9NRU1gIGluIHRoZXNlIGNhc2VzLCBiZWNhdXNlIHRoYXQmIzM5O3Mgd2hhdCBgcHRlX2FsbG9jYCByZXR1cm5lZC4gVGhlIHBhdGNoIGNvcnJlY3RseSBpZGVudGlmaWVzIHRoaXMgYW5kIHVwZGF0ZXMgdGhlIHJldHVybiB2YWx1ZS4gSSBhbSBub3RpbmcgdGhlIHZhcmlhYmxlIG5hbWUgY2xlYW51cCBiZXR3ZWVuIGByZXRgIGFuZCBgZXJyYC4gQm90aCBhcmUgdXNlZCBpbiBzaW1pbGFyIHBsYWNlcyB0byBtZWFuIGFuIGVycm9yIGNvZGUuCgpUaGUgbG9naWMgY2hhbmdlIGlzIGNsZWFyLiBJdCBlbnN1cmVzIHRoYXQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZXMsIHNwZWNpZmljYWxseSB0aG9zZSBkdXJpbmcgcGFnZSB0YWJsZSB3YWxrcywgYXJlIGNvbnNpc3RlbnRseSBzaWduYWxlZCB3aXRoIGAtRU5PTUVNYCwgcmF0aGVyIHRoYW4gdGhlIHBvdGVudGlhbGx5IG1pc2xlYWRpbmcgYC1FRkFVTFRgLiBUaGlzIGFsaWducyB3aXRoIHN0YW5kYXJkIGVycm9yIGNvZGVzIGFuZCBhaWRzIGluIG1vcmUgYWNjdXJhdGUgZGVidWdnaW5nLgoKTm93LCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QsIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGNhbGxlcnMgb2YgYHZtX2luc2VydF9wYWdlc2Agb3IgYGluc2VydF9wYWdlc2AuIENvbnRleHQgaXMga2luZywgc28gSSBuZWVkIHRvIHNlZSAqd2hlcmUqIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgdXNlZCB0byBhcHByZWNpYXRlIHRoZSBzY29wZSBvZiB0aGUgZml4LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjI4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ZtX2luc2VydF9wYWdlcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtkcml2ZXJzL2FjY2VsL2FtZHhkbmEvYW1keGRuYV9nZW0uYz01Mjc9c3RhdGljIGludCBhbWR4ZG5hX2dlbV9kbWFidWZfbW1hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1Ziwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpXG4tLVxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQzLVx0dm1fZmxhZ3NfbW9kKHZtYSwgVk1fTUlYRURNQVAsIFZNX1BGTk1BUCk7XG5kcml2ZXJzL2FjY2VsL2FtZHhkbmEvYW1keGRuYV9nZW0uYzo1NDQ6XHRyZXQgPSB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXHUwMDNldm1fc3RhcnQsIGFiby1cdTAwM2ViYXNlLnBhZ2VzLFxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQ1LVx0XHRcdCAgICAgIFx1MDAyNm51bV9wYWdlcyk7XG4tLVxuaW5jbHVkZS9saW51eC9tbS5oPTQ3NzI9aW50IHZtX2luc2VydF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwYWdlICopO1xuaW5jbHVkZS9saW51eC9tbS5oOjQ3NzM6aW50IHZtX2luc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuaW5jbHVkZS9saW51eC9tbS5oLTQ3NzQtXHRcdFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtKTtcbi0tXG5pb191cmluZy9tZW1tYXAuYz0zMDc9c3RhdGljIGludCBpb19yZWdpb25fbW1hcChzdHJ1Y3QgaW9fcmluZ19jdHggKmN0eCxcbi0tXG5pb191cmluZy9tZW1tYXAuYy0zMTQtXHR2bV9mbGFnc19zZXQodm1hLCBWTV9ET05URVhQQU5EKTtcbmlvX3VyaW5nL21lbW1hcC5jOjMxNTpcdHJldHVybiB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXHUwMDNldm1fc3RhcnQsIG1yLVx1MDAzZXBhZ2VzLCBcdTAwMjZucl9wYWdlcyk7XG5pb191cmluZy9tZW1tYXAuYy0zMTYtfVxuLS1cbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jPTc2Njc9c3RhdGljIGludCBfX3JiX21hcF92bWEoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsXG4tLVxua2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMtNzc1Ni1cbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jOjc3NTc6XHRlcnIgPSB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXHUwMDNldm1fc3RhcnQsIHBhZ2VzLCBcdTAwMjZucl9wYWdlcyk7XG5rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYy03NzU4LVxuLS1cbm1tL21lbW9yeS5jPTI1NTg9c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbi0tXG5tbS9tZW1vcnkuYy0yNjE2LS8qKlxubW0vbWVtb3J5LmM6MjYxNzogKiB2bV9pbnNlcnRfcGFnZXMgLSBpbnNlcnQgbXVsdGlwbGUgcGFnZXMgaW50byB1c2VyIHZtYSwgYmF0Y2hpbmcgdGhlIHBtZCBsb2NrLlxubW0vbWVtb3J5LmMtMjYxOC0gKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cbi0tXG5tbS9tZW1vcnkuYy0yNjMwLSAqL1xubW0vbWVtb3J5LmM6MjYzMTppbnQgdm1faW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG5tbS9tZW1vcnkuYy0yNjMyLVx0XHRcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcbi0tXG5tbS9tZW1vcnkuYy0yNjQ2LX1cbm1tL21lbW9yeS5jOjI2NDc6RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZXMpO1xubW0vbWVtb3J5LmMtMjY0OC1cbi0tXG5tbS9tZW1vcnkuYz0yNzM5PXN0YXRpYyBpbnQgX192bV9tYXBfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICoqcGFnZXMsXG4tLVxubW0vbWVtb3J5LmMtMjc1Mi1cbm1tL21lbW9yeS5jOjI3NTM6XHRyZXR1cm4gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgdWFkZHIsIHBhZ2VzICYjNDM7IG9mZnNldCwgXHUwMDI2Y291bnQpO1xubW0vbWVtb3J5LmMtMjc1NC19XG4tLVxubW0vbm9tbXUuYz0zNTA9RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZSk7XG5tbS9ub21tdS5jLTM1MS1cbm1tL25vbW11LmM6MzUyOmludCB2bV9pbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbm1tL25vbW11LmMtMzUzLVx0XHRcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcbi0tXG5tbS9ub21tdS5jLTM1Ni19XG5tbS9ub21tdS5jOjM1NzpFWFBPUlRfU1lNQk9MKHZtX2luc2VydF9wYWdlcyk7XG5tbS9ub21tdS5jLTM1OC1cbi0tXG5uZXQvaXB2NC90Y3AuYz0yMDYyPXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3ZtX2luc2VydF9iYXRjaF9lcnJvcihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5uZXQvaXB2NC90Y3AuYy0yMDg4LVx0XHQvKiBXZSBjYWxsZWQgemFwX3ZtYV9yYW5nZSwgdHJ5IHRvIHJlaW5zZXJ0LiAqL1xubmV0L2lwdjQvdGNwLmM6MjA4OTpcdFx0ZXJyID0gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgKmFkZHJlc3MsXG5uZXQvaXB2NC90Y3AuYy0yMDkwLVx0XHRcdFx0ICAgICAgcGVuZGluZ19wYWdlcyxcbi0tXG5uZXQvaXB2NC90Y3AuYz0yMTEwPXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3ZtX2luc2VydF9iYXRjaChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5uZXQvaXB2NC90Y3AuYy0yMTIzLVxubmV0L2lwdjQvdGNwLmM6MjEyNDpcdGVyciA9IHZtX2luc2VydF9wYWdlcyh2bWEsICphZGRyZXNzLCBwYWdlcywgXHUwMDI2cGFnZXNfcmVtYWluaW5nKTtcbm5ldC9pcHY0L3RjcC5jLTIxMjUtXHRwYWdlc19tYXBwZWQgPSBwYWdlc190b19tYXAgLSAodW5zaWduZWQgaW50KXBhZ2VzX3JlbWFpbmluZztcbm5ldC9pcHY0L3RjcC5jLTIxMjYtXHRieXRlc19tYXBwZWQgPSBQQUdFX1NJWkUgKiBwYWdlc19tYXBwZWQ7XG5uZXQvaXB2NC90Y3AuYzoyMTI3Olx0LyogRXZlbiBpZiB2bV9pbnNlcnRfcGFnZXMgZmFpbHMsIGl0IG1heSBoYXZlIHBhcnRpYWxseSBzdWNjZWVkZWQgaW5cbm5ldC9pcHY0L3RjcC5jLTIxMjgtXHQgKiBtYXBwaW5nIChzb21lIGJ1dCBub3QgYWxsIG9mIHRoZSBwYWdlcykuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjUwMQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIEkgZGVsdmUgaW50byB0aGlzIGNvZGU6CgoqKkRpdmluZyBpbnRvIGB2bV9pbnNlcnRfcGFnZXNgIFVzYWdlKioKCk9rYXksIHNvIGB2bV9pbnNlcnRfcGFnZXNgIGlzIGEgcmVhbCB3b3JraG9yc2UuIEkga25vdyBpdCYjMzk7cyBjcnVjaWFsIGZvciBgaW9fdXJpbmdgLCB3aGljaCBtYWtlcyBzZW5zZSBnaXZlbiBpdHMgbmVlZCBmb3IgZGlyZWN0IG1lbW9yeSBhY2Nlc3MuIEkgYWxzbyByZWNhbGwgc2VlaW5nIGl0IGluIHRoZSBgdGNwYCB6ZXJvY29weSBwYXRoIOKAkyBwYXJ0aWN1bGFybHkgdGhhdCBgdGNwX3plcm9jb3B5X3JlY2VpdmVgIGZ1bmN0aW9uLiBPZiBjb3Vyc2UsIHRoZSBgcmluZ19idWZmZXJgIGNvZGUgdXNlcyBpdCB0b28sIGFuZCBpdCYjMzk7cyBlc3NlbnRpYWwgZm9yIGB2bV9tYXBfcGFnZXNgIGFuZCBvdGhlciBtZW1vcnkgbWFwcGluZyBvcGVyYXRpb25zLgoKVGhlIHJlYWwgcXVlc3Rpb24gSSBoYXZlIGlzIHVuZGVyc3RhbmRpbmcgdGhlIGlubmVyIGRldGFpbHMgb2YgdGhlIG9wZXJhdGlvbi4gSSBuZWVkIHRvIGdldCB0byB0aGUgY29yZSwgc28gbGV0JiMzOTtzIGNoZWNrIG91dCBgX192bV9tYXBfcGFnZXNgIGxvY2F0ZWQgaW4gYG1tL21lbW9yeS5jYC4gSSBoYXZlIGEgZmVlbGluZyB0aGF0IGZ1bmN0aW9uIHdpbGwgc2hlZCBzb21lIGxpZ2h0IG9uIHRoZSBsb3ctbGV2ZWwgbWVjaGFuaWNzIG9mIGFsbCB0aGVzZSB1c2VzLCBhbmQgd2hhdCB0aGUgY29yZSBiZWhhdmlvciBhbmQgc2lkZSBlZmZlY3RzIGFyZS4gVGltZSB0byBzdGFydCBkaWdnaW5nIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fdm1fbWFwX3BhZ2VzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTI3MjQ9RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZSk7XG4tLVxubW0vbWVtb3J5LmMtMjcyNi0vKlxubW0vbWVtb3J5LmM6MjcyNzogKiBfX3ZtX21hcF9wYWdlcyAtIG1hcHMgcmFuZ2Ugb2Yga2VybmVsIHBhZ2VzIGludG8gdXNlciB2bWFcbm1tL21lbW9yeS5jLTI3MjgtICogQHZtYTogdXNlciB2bWEgdG8gbWFwIHRvXG4tLVxubW0vbWVtb3J5LmMtMjczOC0gKi9cbm1tL21lbW9yeS5jOjI3Mzk6c3RhdGljIGludCBfX3ZtX21hcF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKipwYWdlcyxcbm1tL21lbW9yeS5jLTI3NDAtXHRcdFx0XHR1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpXG4tLVxubW0vbWVtb3J5LmM9Mjc3ND1pbnQgdm1fbWFwX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL21lbW9yeS5jLTI3NzYte1xubW0vbWVtb3J5LmM6Mjc3NzpcdHJldHVybiBfX3ZtX21hcF9wYWdlcyh2bWEsIHBhZ2VzLCBudW0sIHZtYV9zdGFydF9wZ29mZih2bWEpKTtcbm1tL21lbW9yeS5jLTI3NzgtfVxuLS1cbm1tL21lbW9yeS5jPTI3OTQ9aW50IHZtX21hcF9wYWdlc196ZXJvKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxuLS1cbm1tL21lbW9yeS5jLTI3OTYte1xubW0vbWVtb3J5LmM6Mjc5NzpcdHJldHVybiBfX3ZtX21hcF9wYWdlcyh2bWEsIHBhZ2VzLCBudW0sIDApO1xubW0vbWVtb3J5LmMtMjc5OC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mjk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE3MQoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDIyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYHdhbGtfdG9fcG1kYCBpbiBgbW0vbWVtb3J5LmNgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyBgd2Fsa190b19wbWRgIGZ1bmN0aW9ucyB3aXRoaW4gYG1tL21lbW9yeS5jYC4gSSYjMzk7bSBzcGVjaWZpY2FsbHkgaW50ZXJlc3RlZCBpbiBpdHMgcm9sZSwgdGhlIGRhdGEgc3RydWN0dXJlcyBpdCBtYW5pcHVsYXRlcywgYW5kIGhvdyBpdCBjb250cmlidXRlcyB0byB0aGUgb3ZlcmFsbCBwYWdlIHRhYmxlIHRyYXZlcnNhbCBwcm9jZXNzLiBJJiMzOTttIGFzc3VtaW5nLCBvZiBjb3Vyc2UsIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjZW50cmFsIHRvIHRoZSBoaWdoZXItbGV2ZWwgYWRkcmVzcyB0cmFuc2xhdGlvbiB0YXNrcy4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGNsb3NlbHkgYXQgaG93IGl0IGhhbmRsZXMgcG90ZW50aWFsIHBhZ2UgZmF1bHRzLCB3aGF0IGxvY2tpbmcgbWVjaGFuaXNtcyBpdCBlbXBsb3lzIHRvIGVuc3VyZSBjb25jdXJyZW5jeSBzYWZldHkgKGlmIGFueSksIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIHVuZGVybHlpbmcgaGFyZHdhcmUgcGFnZSB0YWJsZSBzdHJ1Y3R1cmVzLiBXaGF0IGFyZSB0aGUgY2FsbGluZyBjb252ZW50aW9ucz8gV2hhdCBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBleHBlY3RlZCwgYW5kIHdoYXQgYXJlIHRoZSByZXR1cm4gdmFsdWVzPyBBcmUgdGhlcmUgYW55IHN1YnRsZSBvcHRpbWl6YXRpb25zIGluIHBsYXksIHBlcmhhcHMgcmVsYXRlZCB0byBUTEIgbWFuYWdlbWVudCBvciBwcmVmZXRjaGluZz8gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBtYWdpYyBoYXBwZW5zLCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdCBjb21wbGV0ZWx5IHRvIHRyb3VibGVzaG9vdCBhbnkgbWVtb3J5LXJlbGF0ZWQgaXNzdWVzLiBJJiMzOTtsbCBiZSBsb29raW5nIGZvciBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgYm90dGxlbmVja3Mgb3Igc3VidGxlIGJ1Z3MgdGhhdCBtaWdodCBsdXJrIGluIHRoaXMgZnVuY3Rpb24sIGtub3dpbmcgaG93IGNydWNpYWwgaXQgaXMgdG8gdGhlIHdob2xlIG1lbW9yeSBzdWJzeXN0ZW0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3dhbGtfdG9fcG1kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL21lbW9yeS5jPTI0MDA9RVhQT1JUX1NZTUJPTF9HUEwoemFwX3NwZWNpYWxfdm1hX3JhbmdlKTtcbm1tL21lbW9yeS5jLTI0MDEtXG5tbS9tZW1vcnkuYzoyNDAyOnN0YXRpYyBwbWRfdCAqd2Fsa190b19wbWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcilcbm1tL21lbW9yeS5jLTI0MDMte1xuLS1cbm1tL21lbW9yeS5jPTI0MjQ9cHRlX3QgKmdldF9sb2NrZWRfcHRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4tLVxubW0vbWVtb3J5LmMtMjQyNi17XG5tbS9tZW1vcnkuYzoyNDI3Olx0cG1kX3QgKnBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTtcbm1tL21lbW9yeS5jLTI0MjgtXG4tLVxubW0vbWVtb3J5LmM9MjU1OD1zdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuLS1cbm1tL21lbW9yeS5jLTI1NjktbW9yZTpcbm1tL21lbW9yeS5jOjI1NzA6XHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG5tbS9tZW1vcnkuYy0yNTcxLVx0aWYgKCFwbWQpIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzc2MwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqSW52ZXN0aWdhdGluZyBgd2Fsa190b19wbWRgKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBgd2Fsa190b19wbWRgIGZ1bmN0aW9uLiBJJiMzOTttIGFzc3VtaW5nIGl0JiMzOTtzIHJlbGF0ZWQgdG8gc29tZSBzb3J0IG9mIHBhdGggcGxhbm5pbmcgb3IgbW90aW9uIGNvbnRyb2wsIHByb2JhYmx5IGZvciBhIHBoeXNpY2FsIGRldmljZSBvciBhIHNpbXVsYXRlZCBlbnZpcm9ubWVudCwgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgJiMzNDtXaGF0IGFyZSB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzPyYjMzQ7LiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIGZ1bmN0aW9uJiMzOTtzIHNpZ25hdHVyZSDigJMgZG9lcyBpdCB0YWtlIGEgdGFyZ2V0IFBNRCAocHJlc3VtYWJseSBhICYjMzQ7cG9pbnQgbWFzcyBkaXN0cmlidXRpb24sJiMzNDsgb3IgcGVyaGFwcyBzb21ldGhpbmcgbW9yZSBzcGVjaWZpYyB0byB0aGUgZG9tYWluKSBhcyBhbiBhcmd1bWVudD8gSXMgaXQgZXhwZWN0aW5nIGFuIGluaXRpYWwgc3RhdGUsIGN1cnJlbnQgcG9zaXRpb24vb3JpZW50YXRpb24sIG9yIGEgc3RhcnQgbG9jYXRpb24/IEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByZXR1cm4gdmFsdWUuIElzIGl0IGEgdHJhamVjdG9yeSwgYSBzaW5nbGUgY29udHJvbCBhY3Rpb24sIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3MvZmFpbHVyZSwgb3IgbWF5YmUgZXZlbiBhbiBpbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmU/IFRoZSBzZW1hbnRpY3MgaGVyZSBhcmUgY3JpdGljYWwuCgpOZXh0LCBJJiMzOTtsbCB3YW50IHRvIHRyYWNlIGl0cyBleGVjdXRpb24gcGF0aC4gSSYjMzk7bGwgbWVudGFsbHkgc3RlcCB0aHJvdWdoIHRoZSBjb2RlLCBsb29raW5nIGZvciBhbnkgZWRnZSBjYXNlcywgYm91bmRhcnkgY29uZGl0aW9ucywgb3IgYXNzdW1wdGlvbnMgaXQgbWlnaHQgbWFrZS4gQXJlIHRoZXJlIGFueSBwb3RlbnRpYWwgYm90dGxlbmVja3MsIG9yIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUgb3BlcmF0aW9ucyB0aGF0IHdvdWxkIGJlIGltbWVkaWF0ZWx5IGFwcGFyZW50PyBJ4oCZbGwgYmUgY2hlY2tpbmcgZm9yIGFueSBkZXBlbmRlbmNpZXMgb24gb3RoZXIgZnVuY3Rpb25zIG9yIG1vZHVsZXMgd2l0aGluIHRoaXMgY29kZWJhc2Ug4oCTIHRob3NlIGFyZSBhbHdheXMgaW1wb3J0YW50IHRvIHRyYWNlLgoKSSYjMzk7bSBhbHNvIGN1cmlvdXMgYWJvdXQgZXJyb3IgaGFuZGxpbmcuIERvZXMgaXQgdGhyb3cgZXhjZXB0aW9ucywgcmV0dXJuIGVycm9yIGNvZGVzLCBvciBzaWxlbnRseSBmYWlsPyBSb2J1c3RuZXNzIGlzIGtleSwgZXNwZWNpYWxseSBpZiB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgYSByZWFsLXdvcmxkIHN5c3RlbS4gSSYjMzk7bGwgbmVlZCB0byBrbm93IGlmIHRoZSBjb2RlIGhhcyBhZGVxdWF0ZSB1bml0IHRlc3RzIGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cyBhc3NvY2lhdGVkIHdpdGggaXQuIElmIHRoaXMgYHdhbGtfdG9fcG1kYCBmdW5jdGlvbiBpcyBmYWlsaW5nLCBvciBJJiMzOTttIHRyeWluZyB0byBpbXByb3ZlIGl0cyBwZXJmb3JtYW5jZSwgSSYjMzk7bGwgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBsb2dnaW5nIHN0YXRlbWVudHMgYXJlIHRvIHVuZGVyc3RhbmQgaXRzIGJlaGF2aW9yLgoKRmluYWxseSwgSSYjMzk7bGwgYmUgZm9ybWluZyBzb21lIGh5cG90aGVzZXMgYWJvdXQgaG93IHRoZSBmdW5jdGlvbiB3b3Jrcy4gSXMgaXQgdXNpbmcgYSBzdGFuZGFyZCBwYXRoIHBsYW5uaW5nIGFsZ29yaXRobSBsaWtlIEEqLCBSUlQsIG9yIHNvbWV0aGluZyBtb3JlIGJlc3Bva2U/IERvZXMgaXQgY29uc2lkZXIgY29sbGlzaW9uIGF2b2lkYW5jZSwgZHluYW1pYyBjb25zdHJhaW50cywgYW5kIGFueSBwb3RlbnRpYWwgcGh5c2ljYWwgbGltaXRhdGlvbnMgb2YgdGhlICYjMzQ7d2Fsa2VyJiMzNDs/IFRoZSBzcGVjaWZpY3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IHBvaW50IHRvIHRoZSB1bmRlcmx5aW5nIG1ldGhvZG9sb2d5IGFuZCBhbnkgcG9zc2libGUgb3B0aW1pc2F0aW9ucy4gVGhpcyBkZWVwZXIgdW5kZXJzdGFuZGluZyB3aWxsIGJlIGVzc2VudGlhbCB0byBldmFsdWF0ZSBpdHMgb3ZlcmFsbCBlZmZlY3RpdmVuZXNzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL21lbW9yeS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjQwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNDAwOlx0RVhQT1JUX1NZTUJPTF9HUEwoemFwX3NwZWNpYWxfdm1hX3JhbmdlKTtcbjI0MDE6XHRcbjI0MDI6XHRzdGF0aWMgcG1kX3QgKndhbGtfdG9fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpXG4yNDAzOlx0e1xuMjQwNDpcdFx0cGdkX3QgKnBnZDtcbjI0MDU6XHRcdHA0ZF90ICpwNGQ7XG4yNDA2Olx0XHRwdWRfdCAqcHVkO1xuMjQwNzpcdFx0cG1kX3QgKnBtZDtcbjI0MDg6XHRcbjI0MDk6XHRcdHBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpO1xuMjQxMDpcdFx0cDRkID0gcDRkX2FsbG9jKG1tLCBwZ2QsIGFkZHIpO1xuMjQxMTpcdFx0aWYgKCFwNGQpXG4yNDEyOlx0XHRcdHJldHVybiBOVUxMO1xuMjQxMzpcdFx0cHVkID0gcHVkX2FsbG9jKG1tLCBwNGQsIGFkZHIpO1xuMjQxNDpcdFx0aWYgKCFwdWQpXG4yNDE1Olx0XHRcdHJldHVybiBOVUxMO1xuMjQxNjpcdFx0cG1kID0gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpO1xuMjQxNzpcdFx0aWYgKCFwbWQpXG4yNDE4Olx0XHRcdHJldHVybiBOVUxMO1xuMjQxOTpcdFxuMjQyMDpcdFx0Vk1fQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTtcbjI0MjE6XHRcdHJldHVybiBwbWQ7XG4yNDIyOlx0fVxuMjQyMzpcdFxuMjQyNDpcdHB0ZV90ICpnZXRfbG9ja2VkX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuMjQyNTpcdFx0XHQgICAgICBzcGlubG9ja190ICoqcHRsKVxuMjQyNjpcdHtcbjI0Mjc6XHRcdHBtZF90ICpwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4yNDI4Olx0XG4yNDI5Olx0XHRpZiAoIXBtZClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjdtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogODcyOAoJCQkJCQkJb3V0cHV0OiAyNAoJCQkJCQkJdGhvdWdodHM6IDcxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipXb3J0aEZ1enppbmcgQXNzZXNzbWVudDogS2VybmVsIE1lbW9yeSBBbGxvY2F0aW9uIEVycm9yIEhhbmRsaW5nKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgcGF0Y2ggY2hhbmdlcyBob3cgd2UgaGFuZGxlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzIHdpdGhpbiB0aGUgY29yZSBrZXJuZWwsIHNwZWNpZmljYWxseSBpbiBgbW0vbWVtb3J5LmNgLiBJdCYjMzk7cyBhIHJlbGF0aXZlbHkgZm9jdXNlZCBjaGFuZ2U7IHRoZSBtb2RpZmljYXRpb24gaXMgaW4gYHdhbGtfdG9fcG1kYCBhbmQgaG93IGVycm9ycyBwcm9wYWdhdGUgaW4gYGluc2VydF9wYWdlcygpYC4gUHJldmlvdXNseSwgYSBudWxsIHJldHVybiBmcm9tIGB3YWxrX3RvX3BtZGAgKGluZGljYXRpbmcgcGFnZSB0YWJsZSBhbGxvY2F0aW9uIGZhaWx1cmUsIHVzaW5nIGBwNGRfYWxsb2NgLCBgcHVkX2FsbG9jYCwgb3IgYHBtZF9hbGxvY2ApIHJlc3VsdGVkIGluIGAtRUZBVUxUYC4gVGhlIHBhdGNoIGVsZWdhbnRseSBjb3JyZWN0cyB0aGlzLCBjaGFuZ2luZyB0aGUgcmV0dXJuIGNvZGUgdG8gYC1FTk9NRU1gLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hhdCB3ZSBleHBlY3Qgd2hlbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4gVGhpcyBjaGFuZ2UgYWxzbyBjbGVhbnMgdXAgc29tZSBsb2NhbCB2YXJpYWJsZSBtYW5hZ2VtZW50LgoKTm93LCB0aGUgY3J1Y2lhbCBxdWVzdGlvbiBpcyB3aGV0aGVyIHRoaXMgd2FycmFudHMgZnV6emluZy4gSSBuZWVkIHRvIGFwcGx5IHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBUaGUgaW5zdHJ1Y3Rpb25zIHNwZWNpZnkgdGhhdCB3ZSBzaG91bGQgYXZvaWQgZnV6emluZyBkb2N1bWVudGF0aW9uIGNoYW5nZXMsIGxvZ2dpbmcgbW9kaWZpY2F0aW9ucywgY29zbWV0aWMgY2hhbmdlcyB0byBjb25zdGFudHMsIHVucmVhY2hhYmxlIGNvZGUgcGF0aHMgKGVzcGVjaWFsbHkgaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgUUVNVSksIHZlbmRvci1zcGVjaWZpYyBkcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzLCBldGMuIEhvd2V2ZXIsIHRoaXMgY2hhbmdlICpkb2VzKiBtb2RpZnkgY29yZSBrZXJuZWwgbG9naWMgKGBtbS9tZW1vcnkuY2ApLiBTcGVjaWZpY2FsbHksIGl0JiMzOTtzIG1vZGlmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHJldHVybiB2YWx1ZXMgb2YgYGluc2VydF9wYWdlcygpYCBhbmQgYHZtX2luc2VydF9wYWdlcygpYC4KCk5leHQsIEkgbmVlZCB0byBjb25maXJtIGlmIHRoZSBhZmZlY3RlZCBjb2RlIGlzIHJlYWNoYWJsZSBpbiBhIHN0YW5kYXJkIFFFTVUgZW52aXJvbm1lbnQuIFRoZSBnb29kIG5ld3MgaXMsIGB2bV9pbnNlcnRfcGFnZXMoKWAgaXMgbm90IG9ic2N1cmU7IGl0JiMzOTtzIHJlYWNoYWJsZSB2aWEgc2V2ZXJhbCBjb21tb24ga2VybmVsIGZlYXR1cmVzLCBpbmNsdWRpbmcgYGlvX3VyaW5nYCBtbWFwLCBUQ1AgemVyb2NvcHkgKGBnZXRzb2Nrb3B0KC4uLiwgVENQX1pFUk9DT1BZX1JFQ0VJVkUsIC4uLilgKSwgYW5kIHJpbmdfYnVmZmVyIG1tYXAuIFRoaXMgY29uZmlybXMgdGhlIHJlYWNoYWJpbGl0eSBhbmQgdGhlIHBvdGVudGlhbCBmb3IgYSBmdXp6IHRhcmdldC4gVGhlIGNoYW5nZSBhbHNvIG1vZGlmaWVzIGVycm9yIGhhbmRsaW5nIHdoaWNoIGlzIGRlZmluaXRlbHkgd29ydGggZXhwbG9yaW5nLgoKRmluYWxseSwgbGV0JiMzOTtzIGV4YW1pbmUgcG90ZW50aWFsIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiBgbW0vbWVtb3J5LmNgIGlzIGNvcmUgdG8gdGhlIGtlcm5lbCYjMzk7cyBtZW1vcnkgbWFuYWdlbWVudCBhbmQgaXMgYWx3YXlzIGJ1aWx0IGludG8gdGhlIGNvcmUuIEkgY2FuIHZlcmlmeSB0aGlzIGJ5IGNoZWNraW5nIHRoZSBgbW0vTWFrZWZpbGVgIGFuZCBgbW0vS2NvbmZpZ2AsIGJ1dCB0aGlzIGlzIHVzdWFsbHkgYSBnaXZlbi4gTm8gc3BlY2lhbCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgbmVjZXNzYXJ5IHRvIGFjdGl2YXRlIHRoaXMgY2hhbmdlIG9yIHRlc3QgaXRzIGltcGxpY2F0aW9ucy4gSSB3aWxsIGFsc28gY2hlY2sgdGhlICYjMzQ7Zm9jdXMgc3ltYm9scyYjMzQ7IHdoaWNoIGluY2x1ZGUgYHZtX2luc2VydF9wYWdlc2AsIGB2bV9tYXBfcGFnZXNgLCBhbmQgYHZtX21hcF9wYWdlc196ZXJvYC4gV2hpbGUgSSBjYW4mIzM5O3QgYmUgKmNvbXBsZXRlbHkqIGNlcnRhaW4gd2l0aG91dCBhIGRlZXBlciBkaXZlLCBgdm1faW5zZXJ0X3BhZ2VzYCBpcyBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciBmdXp6aW5nLgoKVGhlcmVmb3JlLCBiZWNhdXNlIHRoaXMgcGF0Y2ggbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljIGFuZCBhZGRyZXNzZXMgcG90ZW50aWFsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9ycyBpbiBhIGNvbW1vbiBjb2RlIHBhdGgsIG15IGFzc2Vzc21lbnQgaXMgKipXb3J0aEZ1enppbmc9dHJ1ZSoqLiBUaGUgc3dpdGNoIGZyb20gYC1FRkFVTFRgIHRvIGAtRU5PTUVNYCBpcyBhIHNlbWFudGljYWxseSBjb3JyZWN0IGNoYW5nZSwgd2hpY2ggaXMgd29ydGggZnV6emluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bWVtb3J5XFwubyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL01ha2VmaWxlPTM2PW1tdS15XHRcdFx0Oj0gbm9tbXUub1xubW0vTWFrZWZpbGU6Mzc6bW11LSQoQ09ORklHX01NVSlcdDo9IGhpZ2htZW0ubyBtZW1vcnkubyBtaW5jb3JlLm8gXFxcbm1tL01ha2VmaWxlLTM4LVx0XHRcdCAgIG1sb2NrLm8gbW1hcC5vIG1tdV9nYXRoZXIubyBtcHJvdGVjdC5vIG1yZW1hcC5vIFxcXG4tLVxubW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTEwOTQ9c3RhdGljIHNzaXplX3QgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC12MS5jLTExODAtXHRcdGV2ZW50LVx1MDAzZXVucmVnaXN0ZXJfZXZlbnQgPSBtZW1fY2dyb3VwX3VzYWdlX3VucmVnaXN0ZXJfZXZlbnQ7XG5tbS9tZW1jb250cm9sLXYxLmM6MTE4MTpcdH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCBcJiMzNDttZW1vcnkub29tX2NvbnRyb2xcJiMzNDspKSB7XG5tbS9tZW1jb250cm9sLXYxLmMtMTE4Mi1cdFx0cHJfd2Fybl9vbmNlKFwmIzM0O29vbV9jb250cm9sIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gXCYjMzQ7XG4tLVxubW0vbWVtY29udHJvbC5jPTIwMzk9dm9pZCBtZW1fY2dyb3VwX3ByaW50X29vbV9ncm91cChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4tLVxubW0vbWVtY29udHJvbC5jLTIwNDItXHRwcl9jb250X2Nncm91cF9wYXRoKG1lbWNnLVx1MDAzZWNzcy5jZ3JvdXApO1xubW0vbWVtY29udHJvbC5jOjIwNDM6XHRwcl9jb250KFwmIzM0OyBhcmUgZ29pbmcgdG8gYmUga2lsbGVkIGR1ZSB0byBtZW1vcnkub29tLmdyb3VwIHNldFxcblwmIzM0Oyk7XG5tbS9tZW1jb250cm9sLmMtMjA0NC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEwNTAzCgkJCQkJCQlvdXRwdXQ6IDEzOAoJCQkJCQkJdGhvdWdodHM6IDc0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCBmcm9tIGFuIGV4cGVydCYjMzk7cyBwZXJzcGVjdGl2ZToKCioqSW52ZXN0aWdhdGluZyB0aGUgYG1lbW9yeS5vYCBEZXBlbmRlbmN5KioKClJpZ2h0LCBzbyBgbWVtb3J5Lm9gIGlzIGJ1aWx0IHdpdGggYENPTkZJR19NTVVgLiBUaGF0JiMzOTtzIGEgcHJldHR5IHN0YW5kYXJkIHRoaW5nLCBlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cy4gQnV0IEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSAqd2h5KiBiZWhpbmQgdGhpcyBkZXBlbmRlbmN5LiBBcmUgdGhlcmUgb3RoZXIgY29uZmlndXJhdGlvbnMgdGhhdCBhbHNvIGVuYWJsZSBjYWxsaW5nIGludG8gbW9kdWxlcyB0aGF0IHJlbHkgb24gdGhlIE1NVT8gSSYjMzk7bSB0aGlua2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgdGhpbmdzIGxpa2UgVENQIHplcm8tY29weSBvciBJT19VUklORywgd2hpY2ggbWlnaHQgaW5kaXJlY3RseSByZXF1aXJlIHRoaXMuIExldCYjMzk7cyBtYWtlIGEgcXVpY2sgbm90ZTogYElORVRgLCBgSU9fVVJJTkdgLCBhbmQgYE1NVWAuIE9rYXksIEkmIzM5O2xsIHN0YXJ0IGJ5IGRyaWxsaW5nIGRvd24gb24gdGhlIGBNTVVgIHVzYWdlIGZpcnN0LiBUaGF0IHNlZW1zIGxpa2UgdGhlIG1vc3Qgb2J2aW91cyBzdGFydGluZyBwb2ludCBmb3IgYW4gaW52ZXN0aWdhdGlvbi4KCkFscmlnaHQsIHRoYXQgZmVlbHMgbGlrZSBhIGdvb2QgcGxhbi4gTm93LCB0byBtYWtlIHN1cmUgSSBhbSBvbiB0cmFjayB3aXRoIG15IGludmVzdGlnYXRpb24sIGxldCYjMzk7cyBjYWxsIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtNTVUmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDt2bV9pbnNlcnRfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzJiMzNDssCiAgICAmIzM0O3ZtX21hcF9wYWdlc196ZXJvJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O01NVSYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3ZtX2luc2VydF9wYWdlcyYjMzQ7LAogICAgJiMzNDt2bV9tYXBfcGFnZXMmIzM0OywKICAgICYjMzQ7dm1fbWFwX3BhZ2VzX3plcm8mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgcmV0dXJuIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jIHdpdGhpbiBpbnNlcnRfcGFnZXMoKSAoYW5kIHRyYW5zaXRpdmVseSB2bV9pbnNlcnRfcGFnZXMoKSksIGNvcnJlY3RseSByZXR1cm5pbmcgLUVOT01FTSBpbnN0ZWFkIG9mIC1FRkFVTFQgd2hlbiB3YWxrX3RvX3BtZCgpIG9yIHB0ZV9hbGxvYygpIGZhaWxzLiBUaGlzIGFmZmVjdHMgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IHVzZWQgYnkgaW9fdXJpbmcsIG5ldHdvcmtpbmcgKFRDUCB6ZXJvY29weSksIGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOSAxNzozODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGlzIGEgcmVmYWN0b3Jpbmcgb2YgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYzppbnNlcnRfcGFnZXMoKSwgdW5pZnlpbmcgdGhlIGxvY2FsIHJldHVybiB2YXJpYWJsZSBgZXJyYCAocHJldmlvdXNseSBgcmV0YCBhbmQgYSBzaGFkb3dlZCBgZXJyYCkgYW5kIGNoYW5naW5nIHRoZSBlcnJvciBjb2RlIHdoZW4gYHdhbGtfdG9fcG1kKClgIGZhaWxzIGZyb20gLUVGQVVMVCB0byAtRU5PTUVNLlxuXG5ObyBuZXcgYWxsb2NhdGlvbnMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBidWZmZXJzLCBvciBjb3BpZXMgdG8gdXNlciBzcGFjZSBhcmUgaW50cm9kdWNlZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyAoYGVycmAsIGByZW1haW5pbmdfcGFnZXNfdG90YWxgLCBgY3Vycl9wYWdlX2lkeGApIGFyZSBpbml0aWFsaXplZCwgYW5kIGVycm9yIGNvZGVzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkIGJlZm9yZSBhbnkganVtcCB0byB0aGUgZXhpdCBsYWJlbC4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBmN2E4MTM0MmRiM2M2NGQ5ZTcwMzY1NWViZDNhMjFlZmVmNDA4ZjA4CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFNhdCBBdWcgMjkgMTc6Mjc6NDAgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDljYmNlNWM5MGJmZmQuLjI3ZmZlMWE5OWEwOGIgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL21lbW9yeS5jCkBAIC0yNTY1LDIwICYjNDM7MjU2NSwyMiBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAogCXVuc2lnbmVkIGxvbmcgY3Vycl9wYWdlX2lkeCA9IDA7CiAJdW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtOwogCXVuc2lnbmVkIGxvbmcgcGFnZXNfdG9fd3JpdGVfaW5fcG1kOwotCWludCByZXQ7CiYjNDM7CWludCBlcnIgPSAwOwogbW9yZToKLQlyZXQgPSAtRUZBVUxUOwogCXBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTsKLQlpZiAoIXBtZCkKJiM0MzsJaWYgKCFwbWQpIHsKJiM0MzsJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwomIzQzOwl9CiAKIAlwYWdlc190b193cml0ZV9pbl9wbWQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLAogCQlyZW1haW5pbmdfcGFnZXNfdG90YWwsIFBUUlNfUEVSX1BURSAtIHB0ZV9pbmRleChhZGRyKSk7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgUFRFIGlmIG5lY2Vzc2FyeTsgdGFrZXMgUE1EIGxvY2sgb25jZSBvbmx5LiAqLwotCXJldCA9IC1FTk9NRU07Ci0JaWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkKJiM0MzsJaWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkgewomIzQzOwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiYjNDM7CX0KIAogCXdoaWxlIChwYWdlc190b193cml0ZV9pbl9wbWQpIHsKIAkJaW50IHB0ZV9pZHggPSAwOwpAQCAtMjU4NiwxNSAmIzQzOzI1ODgsMTQgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAogCQlzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsICZhbXA7cHRlX2xvY2spOwogCQlpZiAoIXN0YXJ0X3B0ZSkgewotCQkJcmV0ID0gLUVGQVVMVDsKJiM0MzsJCQllcnIgPSAtRUZBVUxUOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJZm9yIChwdGUgPSBzdGFydF9wdGU7IHB0ZV9pZHggJmx0OyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkgewotCQkJaW50IGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwKLQkJCQlhZGRyLCBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7CiYjNDM7CQkJZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLCBhZGRyLAomIzQzOwkJCQkJCQkgIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTsKIAkJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQkJcHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTsKLQkJCQlyZXQgPSBlcnI7CiAJCQkJcmVtYWluaW5nX3BhZ2VzX3RvdGFsIC09IHB0ZV9pZHg7CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC0yNjA3LDEwICYjNDM7MjYwOCw5IEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJfQogCWlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpCiAJCWdvdG8gbW9yZTsKLQlyZXQgPSAwOwogb3V0OgogCSpudW0gPSByZW1haW5pbmdfcGFnZXNfdG90YWw7Ci0JcmV0dXJuIHJldDsKJiM0MzsJcmV0dXJuIGVycjsKIH0KIAogLyoqCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOSAxNzozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjI0CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBob3cgSSYjMzk7ZCBhcHByb2FjaCB0aGlzIHRhc2ssIHRoaW5raW5nIGFzIGFuIGV4cGVydCBpbiB0aGUgZmllbGQ6CgoqKkRpdmluZyBpbnRvIGBtbS9tZW1vcnkuY2AqKgoKQWxyaWdodCwgdGhlIGluc3RydWN0aW9uIHNheXMgdG8gc3RhcnQgYnkgaW5zcGVjdGluZyB0aGUgZGlmZiBhbmQgcmVhZGluZyB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgbW0vbWVtb3J5LmNgLiBNeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gSSBrbm93IGBtbS9tZW1vcnkuY2AgaXMgdGhlIGhlYXJ0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoaXMgc3lzdGVtLCBzbyB3aGF0ZXZlciBjaGFuZ2UgaXMgcHJvcG9zZWQsIGl0JiMzOTtzIHBvdGVudGlhbGx5IGNyaXRpY2FsLiBJ4oCZbGwgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSAqd2h5KiBiZWhpbmQgdGhpcyBjaGFuZ2UsIHRoZSBpbnRlbmRlZCBlZmZlY3QsIGFuZCBhbnkgcG90ZW50aWFsIHNpZGUtZWZmZWN0cy4gQmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UgSSYjMzk7bGwgd2FudCB0byBnZXQgYSBnb29kIHNlbnNlIG9mIHRoZSBjb250ZXh0IG9mIHRoZSBkaWZmLiBJJiMzOTtsbCByZWFkIGFyb3VuZCB0aGUgY29kZSBhdCB0aGF0IGxvY2F0aW9uIHRvIGJ1aWxkIGEgbWVudGFsIHBpY3R1cmUgb2Ygd2hhdCYjMzk7cyBnb2luZyBvbi4KClRoZSBpbnN0cnVjdGlvbiBhbHNvIHNheXMgdG8gdXNlIGByZWFkLWZpbGVgIGFyb3VuZCBsaW5lIDI1NjUgaW4gYG1tL21lbW9yeS5jYC4gUmlnaHQsIHNvIEkga25vdyBJIG5lZWQgdG8gYmUgcmVhZHkgdG8gYW5hbHl6ZSB0aGlzIHNlY3Rpb24gY2xvc2VseS4gSSB3aWxsIGV4cGVjdCB0aGlzIHRvIGdpdmUgbWUgdGhlIGluZm9ybWF0aW9uIHRvIGRvIG15IGpvYiwgYW5kIHN0YXJ0IHRvIGZvcm0gYSBjb21wcmVoZW5zaXZlIG1lbnRhbCBtb2RlbCBvZiB0aGUgY29kZS4gSSBhbSByZWFkeSB0byBkaWcgaW50byB0aGUgZGV0YWlscyBhbmQgc3RhcnQgYW5hbHl6aW5nIHRoZSBjb2RlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UmIzM5O3ZlIGdvdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9tZW1vcnkuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI1NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjU1MDpcdFx0aWYgKGVycilcbjI1NTE6XHRcdFx0cmV0dXJuIGVycjtcbjI1NTI6XHRcdHJldHVybiBpbnNlcnRfcGFnZV9pbnRvX3B0ZV9sb2NrZWQodm1hLCBwdGUsIGFkZHIsIHBhZ2UsIHByb3QsIGZhbHNlKTtcbjI1NTM6XHR9XG4yNTU0Olx0XG4yNTU1Olx0LyogaW5zZXJ0X3BhZ2VzKCkgYW1vcnRpemVzIHRoZSBjb3N0IG9mIHNwaW5sb2NrIG9wZXJhdGlvbnNcbjI1NTY6XHQgKiB3aGVuIGluc2VydGluZyBwYWdlcyBpbiBhIGxvb3AuXG4yNTU3Olx0ICovXG4yNTU4Olx0c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbjI1NTk6XHRcdFx0XHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nICpudW0sIHBncHJvdF90IHByb3QpXG4yNTYwOlx0e1xuMjU2MTpcdFx0cG1kX3QgKnBtZCA9IE5VTEw7XG4yNTYyOlx0XHRwdGVfdCAqc3RhcnRfcHRlLCAqcHRlO1xuMjU2MzpcdFx0c3BpbmxvY2tfdCAqcHRlX2xvY2s7XG4yNTY0Olx0XHRzdHJ1Y3QgbW1fc3RydWN0ICpjb25zdCBtbSA9IHZtYS1cdTAwM2V2bV9tbTtcbjI1NjU6XHRcdHVuc2lnbmVkIGxvbmcgY3Vycl9wYWdlX2lkeCA9IDA7XG4yNTY2Olx0XHR1bnNpZ25lZCBsb25nIHJlbWFpbmluZ19wYWdlc190b3RhbCA9ICpudW07XG4yNTY3Olx0XHR1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3dyaXRlX2luX3BtZDtcbjI1Njg6XHRcdGludCBlcnIgPSAwO1xuMjU2OTpcdG1vcmU6XG4yNTcwOlx0XHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4yNTcxOlx0XHRpZiAoIXBtZCkge1xuMjU3MjpcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjU3MzpcdFx0XHRnb3RvIG91dDtcbjI1NzQ6XHRcdH1cbjI1NzU6XHRcbjI1NzY6XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4yNTc3Olx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbjI1Nzg6XHRcbjI1Nzk6XHRcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4yNTgwOlx0XHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XG4yNTgxOlx0XHRcdGVyciA9IC1FTk9NRU07XG4yNTgyOlx0XHRcdGdvdG8gb3V0O1xuMjU4MzpcdFx0fVxuMjU4NDpcdFxuMjU4NTpcdFx0d2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkge1xuMjU4NjpcdFx0XHRpbnQgcHRlX2lkeCA9IDA7XG4yNTg3Olx0XHRcdGNvbnN0IGludCBiYXRjaF9zaXplID0gbWluX3QoaW50LCBwYWdlc190b193cml0ZV9pbl9wbWQsIDgpO1xuMjU4ODpcdFxuMjU4OTpcdFx0XHRzdGFydF9wdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHIsIFx1MDAyNnB0ZV9sb2NrKTtcbjI1OTA6XHRcdFx0aWYgKCFzdGFydF9wdGUpIHtcbjI1OTE6XHRcdFx0XHRlcnIgPSAtRUZBVUxUO1xuMjU5MjpcdFx0XHRcdGdvdG8gb3V0O1xuMjU5MzpcdFx0XHR9XG4yNTk0Olx0XHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyAmIzQzOyYjNDM7cHRlLCAmIzQzOyYjNDM7cHRlX2lkeCkge1xuMjU5NTpcdFx0XHRcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcbjI1OTY6XHRcdFx0XHRcdFx0XHRcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xuMjU5NzpcdFx0XHRcdGlmICh1bmxpa2VseShlcnIpKSB7XG4yNTk4Olx0XHRcdFx0XHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xuMjU5OTpcdFx0XHRcdFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsIC09IHB0ZV9pZHg7XG4yNjAwOlx0XHRcdFx0XHRnb3RvIG91dDtcbjI2MDE6XHRcdFx0XHR9XG4yNjAyOlx0XHRcdFx0YWRkciAmIzQzOz0gUEFHRV9TSVpFO1xuMjYwMzpcdFx0XHRcdCYjNDM7JiM0MztjdXJyX3BhZ2VfaWR4O1xuMjYwNDpcdFx0XHR9XG4yNjA1Olx0XHRcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XG4yNjA2Olx0XHRcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCAtPSBiYXRjaF9zaXplO1xuMjYwNzpcdFx0XHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gYmF0Y2hfc2l6ZTtcbjI2MDg6XHRcdH1cbjI2MDk6XHRcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4yNjEwOlx0XHRcdGdvdG8gbW9yZTtcbjI2MTE6XHRvdXQ6XG4yNjEyOlx0XHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xuMjYxMzpcdFx0cmV0dXJuIGVycjtcbjI2MTQ6XHR9XG4yNjE1Olx0XG4yNjE2Olx0LyoqXG4yNjE3Olx0ICogdm1faW5zZXJ0X3BhZ2VzIC0gaW5zZXJ0IG11bHRpcGxlIHBhZ2VzIGludG8gdXNlciB2bWEsIGJhdGNoaW5nIHRoZSBwbWQgbG9jay5cbjI2MTg6XHQgKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cbjI2MTk6XHQgKiBAYWRkcjogdGFyZ2V0IHN0YXJ0IHVzZXIgYWRkcmVzcyBvZiB0aGVzZSBwYWdlc1xuMjYyMDpcdCAqIEBwYWdlczogc291cmNlIGtlcm5lbCBwYWdlc1xuMjYyMTpcdCAqIEBudW06IGluOiBudW1iZXIgb2YgcGFnZXMgdG8gbWFwLiBvdXQ6IG51bWJlciBvZiBwYWdlcyB0aGF0IHdlcmUgKm5vdCpcbjI2MjI6XHQgKiBtYXBwZWQuICgwIG1lYW5zIGFsbCBwYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBtYXBwZWQpLlxuMjYyMzpcdCAqXG4yNjI0Olx0ICogUHJlZmVycmVkIG92ZXIgdm1faW5zZXJ0X3BhZ2UoKSB3aGVuIGluc2VydGluZyBtdWx0aXBsZSBwYWdlcy5cbjI2MjU6XHQgKlxuMjYyNjpcdCAqIEluIGNhc2Ugb2YgZXJyb3IsIHdlIG1heSBoYXZlIG1hcHBlZCBhIHN1YnNldCBvZiB0aGUgcHJvdmlkZWRcbjI2Mjc6XHQgKiBwYWdlcy4gSXQgaXMgdGhlIGNhbGxlciYjMzk7cyByZXNwb25zaWJpbGl0eSB0byBhY2NvdW50IGZvciB0aGlzIGNhc2UuXG4yNjI4Olx0ICpcbjI2Mjk6XHQgKiBUaGUgc2FtZSByZXN0cmljdGlvbnMgYXBwbHkgYXMgaW4gdm1faW5zZXJ0X3BhZ2UoKS5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjkgMTc6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDI0NQoJCQkJCQkJb3V0cHV0OiAxNjgKCQkJCQkJCXRob3VnaHRzOiA2OTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudDogUmVmYWN0b3Jpbmcgb2YgRXJyb3IgSGFuZGxpbmcgaW4gYGluc2VydF9wYWdlcygpYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gdHJhY2UgdGhlIGNoYW5nZXMgaW4gYGluc2VydF9wYWdlcygpYCBhbmQgdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIGZvciBLTVNBTi4gVGhlIGRpZmYgaXMgcmVmYWN0b3JpbmcgdGhlIGVycm9yIGhhbmRsaW5nLCBjb25zb2xpZGF0aW5nIHRoZSByZXR1cm4gdmFyaWFibGUuIFByZXZpb3VzbHksIHRoZXJlIHdhcyBhbiBgaW50IHJldGAgYW5kIGFuIGlubmVyIGBpbnQgZXJyYCwgYnV0IG5vdyBpdCYjMzk7cyBqdXN0IGEgc2luZ2xlIGBpbnQgZXJyYCBpbml0aWFsaXplZCB0byAwLiBJdCBhbHNvIGNoYW5nZXMgdGhlIGVycm9yIHJldHVybiB3aGVuIGB3YWxrX3RvX3BtZGAgZmFpbHMgZnJvbSBgLUVGQVVMVGAgdG8gYC1FTk9NRU1gLgoKTm93LCB0aGUgY3J1eCBvZiB0aGUgS01TQU4gYW5hbHlzaXM6IGFyZSB0aGVyZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZT8gSSBpbW1lZGlhdGVseSBnbyB0aHJvdWdoIHRoZSBjb2RlLCBjaGVja2luZyBmb3IgYSBmZXcgY3J1Y2lhbCB0aGluZ3MuIEZpcnN0LCBpcyBgZXJyYCB1c2VkIGJlZm9yZSBpdCYjMzk7cyBzZXQ/IFRoZSBhbnN3ZXIgaXMgbm8sIGl0JiMzOTtzIGluaXRpYWxpemVkIHRvIDAgYW5kIGFsd2F5cyBhc3NpZ25lZCBhIHZhbHVlIG9uIGFsbCBwYXRocy4gU2Vjb25kLCBJIGxvb2sgZm9yIGFueSB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgYnVmZmVycyBiZWluZyByZWFkIGluIGNvbmRpdGlvbmFsczsgdGhhdCYjMzk7cyBhIGNsYXNzaWMgS01TQU4gcGl0ZmFsbC4gTm90aGluZyBvZiB0aGF0IHNvcnQgaGVyZS4KCkkgdmVyaWZ5IHRoYXQgbm8ga2VybmVsIHN0cnVjdHVyZXMgY29udGFpbmluZyB1bmluaXRpYWxpemVkIGRhdGEgYXJlIGJlaW5nIHBhc3NlZCB0byB1c2Vyc3BhY2U7IHRoaXMgaXMgYSBwcmltZSBjb25jZXJuLiBBbHNvLCBubyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMuIFRoZXJlJiMzOTtzIGFsc28gbm8gY29uY2VybiBvZiBwb3RlbnRpYWwgYm91bmRzLWNoZWNrIGlzc3VlcyBzaW5jZSBgcmVtYWluaW5nX3BhZ2VzX3RvdGFsYCwgYHBhZ2VzX3RvX3dyaXRlX2luX3BtZGAgYW5kIGBjdXJyX3BhZ2VfaWR4YCBhcmUgYWxsIHNjYWxhcnMgdGhhdCBhcmUgaW5pdGlhbGl6ZWQgdG8gemVyby4KCkkmIzM5O20gY29uZmlkZW50IHdlJiMzOTtyZSBpbiB0aGUgY2xlYXIuIFRoZSBjaGFuZ2VzIGFyZSBwdXJlbHkgaW50ZXJuYWwgTU0gZXJyb3IgaGFuZGxpbmcsIG1vc3RseSByZWZhY3RvcmluZywgYW5kIG5vIG5ldyByaXNrcyBhcmUgaW50cm9kdWNlZC4gVGhlIHN0YW5kYXJkIHNhbml0aXplcnMvS0FTQU4gd2lsbCBiZSBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBtZW1vcnkgbWFwcGluZyBvciBhZGRyZXNzIGNhbGN1bGF0aW9uIGlzc3Vlcy4gVGhlcmVmb3JlLCB0aGUgTmVlZHNLTVNBTiBmbGFnIGlzIGNsZWFybHkgYGZhbHNlYC4KClNvLCB0aGUgS01TQU5SZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOgoKKiAgIFRoZSBwYXRjaCByZWZhY3RvcnMgZXJyb3IgcmV0dXJuIHZhcmlhYmxlcyBpbiBgaW5zZXJ0X3BhZ2VzKClgIChjb25zb2xpZGF0aW5nIGByZXRgIGFuZCBgZXJyYCBpbnRvIGEgc2luZ2xlIGBlcnJgIHZhcmlhYmxlKSwgYW5kIG1vZGlmaWVzIGVycm9yIGNvZGUgcmV0dXJuIHdoZW4gYHdhbGtfdG9fcG1kYCBmYWlscy4KKiAgIEtNU0FOIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMsIG5vIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCB2YXJpYWJsZXMsIGFuZCBubyBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLiBBbGwgcmVsZXZhbnQgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4KKiAgIFN0YW5kYXJkIHNhbml0aXplcnMvS0FTQU4gYXJlIHN1ZmZpY2llbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI5IDE3OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGlzIGEgcmVmYWN0b3Jpbmcgb2YgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYzppbnNlcnRfcGFnZXMoKSwgdW5pZnlpbmcgdGhlIGxvY2FsIHJldHVybiB2YXJpYWJsZSBgZXJyYCAocHJldmlvdXNseSBgcmV0YCBhbmQgYSBzaGFkb3dlZCBgZXJyYCkgYW5kIGNoYW5naW5nIHRoZSBlcnJvciBjb2RlIHdoZW4gYHdhbGtfdG9fcG1kKClgIGZhaWxzIGZyb20gLUVGQVVMVCB0byAtRU5PTUVNLlxuXG5ObyBuZXcgYWxsb2NhdGlvbnMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBidWZmZXJzLCBvciBjb3BpZXMgdG8gdXNlciBzcGFjZSBhcmUgaW50cm9kdWNlZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyAoYGVycmAsIGByZW1haW5pbmdfcGFnZXNfdG90YWxgLCBgY3Vycl9wYWdlX2lkeGApIGFyZSBpbml0aWFsaXplZCwgYW5kIGVycm9yIGNvZGVzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkIGJlZm9yZSBhbnkganVtcCB0byB0aGUgZXhpdCBsYWJlbC4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXG5cbk5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIGNvcGllcyB0byB1c2VyIHNwYWNlIGFyZSBpbnRyb2R1Y2VkLiBBbGwgbG9jYWwgdmFyaWFibGVzIChgZXJyYCwgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBjdXJyX3BhZ2VfaWR4YCkgYXJlIGluaXRpYWxpemVkLCBhbmQgZXJyb3IgY29kZXMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgYmVmb3JlIGFueSBqdW1wIHRvIHRoZSBleGl0IGxhYmVsLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI3OjQxLjk0MTY0MjYyNloiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczMDE5NTU5MjgyMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNTVVcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2bV9pbnNlcnRfcGFnZXNcIixcbiAgICBcInZtX21hcF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzX3plcm9cIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGlzIGEgcmVmYWN0b3Jpbmcgb2YgZXJyb3IgY29kZSBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYzppbnNlcnRfcGFnZXMoKSwgdW5pZnlpbmcgdGhlIGxvY2FsIHJldHVybiB2YXJpYWJsZSBgZXJyYCAocHJldmlvdXNseSBgcmV0YCBhbmQgYSBzaGFkb3dlZCBgZXJyYCkgYW5kIGNoYW5naW5nIHRoZSBlcnJvciBjb2RlIHdoZW4gYHdhbGtfdG9fcG1kKClgIGZhaWxzIGZyb20gLUVGQVVMVCB0byAtRU5PTUVNLlxcblxcbk5vIG5ldyBhbGxvY2F0aW9ucywgdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIGJ1ZmZlcnMsIG9yIGNvcGllcyB0byB1c2VyIHNwYWNlIGFyZSBpbnRyb2R1Y2VkLiBBbGwgbG9jYWwgdmFyaWFibGVzIChgZXJyYCwgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBjdXJyX3BhZ2VfaWR4YCkgYXJlIGluaXRpYWxpemVkLCBhbmQgZXJyb3IgY29kZXMgYXJlIGV4cGxpY2l0bHkgYXNzaWduZWQgYmVmb3JlIGFueSBqdW1wIHRvIHRoZSBleGl0IGxhYmVsLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVhayByaXNrcyB0aGF0IHdvdWxkIHJlcXVpcmUgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgZXJyb3IgcmV0dXJuIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jIHdpdGhpbiBpbnNlcnRfcGFnZXMoKSAoYW5kIHRyYW5zaXRpdmVseSB2bV9pbnNlcnRfcGFnZXMoKSksIGNvcnJlY3RseSByZXR1cm5pbmcgLUVOT01FTSBpbnN0ZWFkIG9mIC1FRkFVTFQgd2hlbiB3YWxrX3RvX3BtZCgpIG9yIHB0ZV9hbGxvYygpIGZhaWxzLiBUaGlzIGFmZmVjdHMgY29yZSB2aXJ0dWFsIG1lbW9yeSBtYW5hZ2VtZW50IHVzZWQgYnkgaW9fdXJpbmcsIG5ldHdvcmtpbmcgKFRDUCB6ZXJvY29weSksIGFuZCBvdGhlciBrZXJuZWwgc3Vic3lzdGVtcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mjc6NDEuOTQxNjQ3NjA2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzU5MTA1NjU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgZjdhODEzNDJkYjNjNjRkOWU3MDM2NTVlYmQzYTIxZWZlZjQwOGYwOFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgU2F0IEF1ZyAyOSAxNzoyNzo0MCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXFxuaW5kZXggOWNiY2U1YzkwYmZmZC4uMjdmZmUxYTk5YTA4YiAxMDA2NDRcXG4tLS0gYS9tbS9tZW1vcnkuY1xcbisrKyBiL21tL21lbW9yeS5jXFxuQEAgLTI1NjUsMjAgKzI1NjUsMjIgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gXFx0dW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDtcXG4gXFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xcbiBcXHR1bnNpZ25lZCBsb25nIHBhZ2VzX3RvX3dyaXRlX2luX3BtZDtcXG4tXFx0aW50IHJldDtcXG4rXFx0aW50IGVyciA9IDA7XFxuIG1vcmU6XFxuLVxcdHJldCA9IC1FRkFVTFQ7XFxuIFxcdHBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTtcXG4tXFx0aWYgKCFwbWQpXFxuK1xcdGlmICghcG1kKSB7XFxuK1xcdFxcdGVyciA9IC1FTk9NRU07XFxuIFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuIFxcbiBcXHRwYWdlc190b193cml0ZV9pbl9wbWQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLFxcbiBcXHRcXHRyZW1haW5pbmdfcGFnZXNfdG90YWwsIFBUUlNfUEVSX1BURSAtIHB0ZV9pbmRleChhZGRyKSk7XFxuIFxcbiBcXHQvKiBBbGxvY2F0ZSB0aGUgUFRFIGlmIG5lY2Vzc2FyeTsgdGFrZXMgUE1EIGxvY2sgb25jZSBvbmx5LiAqL1xcbi1cXHRyZXQgPSAtRU5PTUVNO1xcbi1cXHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKVxcbitcXHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKSB7XFxuK1xcdFxcdGVyciA9IC1FTk9NRU07XFxuIFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuIFxcbiBcXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XFxuIFxcdFxcdGludCBwdGVfaWR4ID0gMDtcXG5AQCAtMjU4NiwxNSArMjU4OCwxNCBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbiBcXG4gXFx0XFx0c3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCBcXHUwMDI2cHRlX2xvY2spO1xcbiBcXHRcXHRpZiAoIXN0YXJ0X3B0ZSkge1xcbi1cXHRcXHRcXHRyZXQgPSAtRUZBVUxUO1xcbitcXHRcXHRcXHRlcnIgPSAtRUZBVUxUO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0fVxcbiBcXHRcXHRmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCBcXHUwMDNjIGJhdGNoX3NpemU7ICsrcHRlLCArK3B0ZV9pZHgpIHtcXG4tXFx0XFx0XFx0aW50IGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSxcXG4tXFx0XFx0XFx0XFx0YWRkciwgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xcbitcXHRcXHRcXHRlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsIGFkZHIsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xcbiBcXHRcXHRcXHRpZiAodW5saWtlbHkoZXJyKSkge1xcbiBcXHRcXHRcXHRcXHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xcbi1cXHRcXHRcXHRcXHRyZXQgPSBlcnI7XFxuIFxcdFxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xcbiBcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4gXFx0XFx0XFx0fVxcbkBAIC0yNjA3LDEwICsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4gXFx0fVxcbiBcXHRpZiAocmVtYWluaW5nX3BhZ2VzX3RvdGFsKVxcbiBcXHRcXHRnb3RvIG1vcmU7XFxuLVxcdHJldCA9IDA7XFxuIG91dDpcXG4gXFx0Km51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDtcXG4tXFx0cmV0dXJuIHJldDtcXG4rXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG4gLyoqXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI3OjQzLjMwMTY3NzE1NFoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6NjczMDk1MjExNzIzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1NVVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtX2luc2VydF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzXCIsXG4gICAgXCJ2bV9tYXBfcGFnZXNfemVyb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGY3YTgxMzQyZGIzYzY0ZDllNzAzNjU1ZWJkM2EyMWVmZWY0MDhmMDhcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgU2F0IEF1ZyAyOSAxNzoyNzo0MCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmNcbmluZGV4IDljYmNlNWM5MGJmZmQuLjI3ZmZlMWE5OWEwOGIgMTAwNjQ0XG4tLS0gYS9tbS9tZW1vcnkuY1xuKysrIGIvbW0vbWVtb3J5LmNcbkBAIC0yNTY1LDIwICsyNTY1LDIyIEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXHR1bnNpZ25lZCBsb25nIGN1cnJfcGFnZV9pZHggPSAwO1xuIFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xuIFx0dW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7XG4tXHRpbnQgcmV0O1xuK1x0aW50IGVyciA9IDA7XG4gbW9yZTpcbi1cdHJldCA9IC1FRkFVTFQ7XG4gXHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XG4tXHRpZiAoIXBtZClcbitcdGlmICghcG1kKSB7XG4rXHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gb3V0O1xuK1x0fVxuIFxuIFx0cGFnZXNfdG9fd3JpdGVfaW5fcG1kID0gbWluX3QodW5zaWduZWQgbG9uZyxcbiBcdFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsLCBQVFJTX1BFUl9QVEUgLSBwdGVfaW5kZXgoYWRkcikpO1xuIFxuIFx0LyogQWxsb2NhdGUgdGhlIFBURSBpZiBuZWNlc3Nhcnk7IHRha2VzIFBNRCBsb2NrIG9uY2Ugb25seS4gKi9cbi1cdHJldCA9IC1FTk9NRU07XG4tXHRpZiAocHRlX2FsbG9jKG1tLCBwbWQpKVxuK1x0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dDtcbitcdH1cbiBcbiBcdHdoaWxlIChwYWdlc190b193cml0ZV9pbl9wbWQpIHtcbiBcdFx0aW50IHB0ZV9pZHggPSAwO1xuQEAgLTI1ODYsMTUgKzI1ODgsMTQgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcbiBcdFx0c3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCBcdTAwMjZwdGVfbG9jayk7XG4gXHRcdGlmICghc3RhcnRfcHRlKSB7XG4tXHRcdFx0cmV0ID0gLUVGQVVMVDtcbitcdFx0XHRlcnIgPSAtRUZBVUxUO1xuIFx0XHRcdGdvdG8gb3V0O1xuIFx0XHR9XG4gXHRcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFx1MDAzYyBiYXRjaF9zaXplOyArK3B0ZSwgKytwdGVfaWR4KSB7XG4tXHRcdFx0aW50IGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSxcbi1cdFx0XHRcdGFkZHIsIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTtcbitcdFx0XHRlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsIGFkZHIsXG4rXHRcdFx0XHRcdFx0XHQgIHBhZ2VzW2N1cnJfcGFnZV9pZHhdLCBwcm90KTtcbiBcdFx0XHRpZiAodW5saWtlbHkoZXJyKSkge1xuIFx0XHRcdFx0cHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTtcbi1cdFx0XHRcdHJldCA9IGVycjtcbiBcdFx0XHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuQEAgLTI2MDcsMTAgKzI2MDgsOSBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFx0fVxuIFx0aWYgKHJlbWFpbmluZ19wYWdlc190b3RhbClcbiBcdFx0Z290byBtb3JlO1xuLVx0cmV0ID0gMDtcbiBvdXQ6XG4gXHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xuLVx0cmV0dXJuIHJldDtcbitcdHJldHVybiBlcnI7XG4gfVxuIFxuIC8qKlxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mjc6NDMuMzAxNjc5Mjg1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NzkyMDU0NTQ5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgaW50byB0aGUgTWVtb3J5IE1hbmFnZW1lbnQgQ29yZSoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHRoaXMgZGlmZi4gU3BlY2lmaWNhbGx5LCBJJ20gZm9jdXNpbmcgb24gdGhlIGBtbS9tZW1vcnkuY2AgZmlsZSDigJMgdGhhdCdzIHdoZXJlIHRoZSBoZWFydCBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGJlYXRzLiBJJ20gZ29pbmcgdG8gbGV2ZXJhZ2UgbXkgZmFtaWxpYXJpdHkgd2l0aCB0aGUgY29kZWJhc2UsIGJ1dCBJJ2xsIHVzZSBgcmVhZC1maWxlYCB0byB6ZXJvIGluIG9uIHRoZSBpbW1lZGlhdGUgY29udGV4dCBhcm91bmQgbGluZSAyNTY1IGluIHRoYXQgZmlsZS4gQ29udGV4dCBpcyBraW5nLCBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIHN1Y2ggZnVuZGFtZW50YWwgYXNwZWN0cy4gSSBuZWVkIHRvIHNlZSAqd2hhdCogaGFzIGJlZW4gbW9kaWZpZWQgKmFyb3VuZCogdGhlIGxpbmUgaW4gcXVlc3Rpb24gdG8gZWZmZWN0aXZlbHkgZGV0ZXJtaW5lIHRoZSBwdXJwb3NlIG9mIHRoZSBkaWZmLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjI3LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyNzo1MS4yMjIyMjY0NzlaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTAyOTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjU1MCxcbiAgXCJMaW5lQ291bnRcIjogOTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjU1MDpcXHRcXHRpZiAoZXJyKVxcbjI1NTE6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4yNTUyOlxcdFxcdHJldHVybiBpbnNlcnRfcGFnZV9pbnRvX3B0ZV9sb2NrZWQodm1hLCBwdGUsIGFkZHIsIHBhZ2UsIHByb3QsIGZhbHNlKTtcXG4yNTUzOlxcdH1cXG4yNTU0OlxcdFxcbjI1NTU6XFx0LyogaW5zZXJ0X3BhZ2VzKCkgYW1vcnRpemVzIHRoZSBjb3N0IG9mIHNwaW5sb2NrIG9wZXJhdGlvbnNcXG4yNTU2OlxcdCAqIHdoZW4gaW5zZXJ0aW5nIHBhZ2VzIGluIGEgbG9vcC5cXG4yNTU3OlxcdCAqL1xcbjI1NTg6XFx0c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4yNTU5OlxcdFxcdFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSwgcGdwcm90X3QgcHJvdClcXG4yNTYwOlxcdHtcXG4yNTYxOlxcdFxcdHBtZF90ICpwbWQgPSBOVUxMO1xcbjI1NjI6XFx0XFx0cHRlX3QgKnN0YXJ0X3B0ZSwgKnB0ZTtcXG4yNTYzOlxcdFxcdHNwaW5sb2NrX3QgKnB0ZV9sb2NrO1xcbjI1NjQ6XFx0XFx0c3RydWN0IG1tX3N0cnVjdCAqY29uc3QgbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbjI1NjU6XFx0XFx0dW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDtcXG4yNTY2OlxcdFxcdHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nX3BhZ2VzX3RvdGFsID0gKm51bTtcXG4yNTY3OlxcdFxcdHVuc2lnbmVkIGxvbmcgcGFnZXNfdG9fd3JpdGVfaW5fcG1kO1xcbjI1Njg6XFx0XFx0aW50IGVyciA9IDA7XFxuMjU2OTpcXHRtb3JlOlxcbjI1NzA6XFx0XFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xcbjI1NzE6XFx0XFx0aWYgKCFwbWQpIHtcXG4yNTcyOlxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjU3MzpcXHRcXHRcXHRnb3RvIG91dDtcXG4yNTc0OlxcdFxcdH1cXG4yNTc1OlxcdFxcbjI1NzY6XFx0XFx0cGFnZXNfdG9fd3JpdGVfaW5fcG1kID0gbWluX3QodW5zaWduZWQgbG9uZyxcXG4yNTc3OlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcXG4yNTc4OlxcdFxcbjI1Nzk6XFx0XFx0LyogQWxsb2NhdGUgdGhlIFBURSBpZiBuZWNlc3Nhcnk7IHRha2VzIFBNRCBsb2NrIG9uY2Ugb25seS4gKi9cXG4yNTgwOlxcdFxcdGlmIChwdGVfYWxsb2MobW0sIHBtZCkpIHtcXG4yNTgxOlxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjU4MjpcXHRcXHRcXHRnb3RvIG91dDtcXG4yNTgzOlxcdFxcdH1cXG4yNTg0OlxcdFxcbjI1ODU6XFx0XFx0d2hpbGUgKHBhZ2VzX3RvX3dyaXRlX2luX3BtZCkge1xcbjI1ODY6XFx0XFx0XFx0aW50IHB0ZV9pZHggPSAwO1xcbjI1ODc6XFx0XFx0XFx0Y29uc3QgaW50IGJhdGNoX3NpemUgPSBtaW5fdChpbnQsIHBhZ2VzX3RvX3dyaXRlX2luX3BtZCwgOCk7XFxuMjU4ODpcXHRcXG4yNTg5OlxcdFxcdFxcdHN0YXJ0X3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgXFx1MDAyNnB0ZV9sb2NrKTtcXG4yNTkwOlxcdFxcdFxcdGlmICghc3RhcnRfcHRlKSB7XFxuMjU5MTpcXHRcXHRcXHRcXHRlcnIgPSAtRUZBVUxUO1xcbjI1OTI6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMjU5MzpcXHRcXHRcXHR9XFxuMjU5NDpcXHRcXHRcXHRmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCBcXHUwMDNjIGJhdGNoX3NpemU7ICsrcHRlLCArK3B0ZV9pZHgpIHtcXG4yNTk1OlxcdFxcdFxcdFxcdGVyciA9IGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZCh2bWEsIHB0ZSwgYWRkcixcXG4yNTk2OlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgcGFnZXNbY3Vycl9wYWdlX2lkeF0sIHByb3QpO1xcbjI1OTc6XFx0XFx0XFx0XFx0aWYgKHVubGlrZWx5KGVycikpIHtcXG4yNTk4OlxcdFxcdFxcdFxcdFxcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XFxuMjU5OTpcXHRcXHRcXHRcXHRcXHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gcHRlX2lkeDtcXG4yNjAwOlxcdFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjI2MDE6XFx0XFx0XFx0XFx0fVxcbjI2MDI6XFx0XFx0XFx0XFx0YWRkciArPSBQQUdFX1NJWkU7XFxuMjYwMzpcXHRcXHRcXHRcXHQrK2N1cnJfcGFnZV9pZHg7XFxuMjYwNDpcXHRcXHRcXHR9XFxuMjYwNTpcXHRcXHRcXHRwdGVfdW5tYXBfdW5sb2NrKHN0YXJ0X3B0ZSwgcHRlX2xvY2spO1xcbjI2MDY6XFx0XFx0XFx0cGFnZXNfdG9fd3JpdGVfaW5fcG1kIC09IGJhdGNoX3NpemU7XFxuMjYwNzpcXHRcXHRcXHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gYmF0Y2hfc2l6ZTtcXG4yNjA4OlxcdFxcdH1cXG4yNjA5OlxcdFxcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXFxuMjYxMDpcXHRcXHRcXHRnb3RvIG1vcmU7XFxuMjYxMTpcXHRvdXQ6XFxuMjYxMjpcXHRcXHQqbnVtID0gcmVtYWluaW5nX3BhZ2VzX3RvdGFsO1xcbjI2MTM6XFx0XFx0cmV0dXJuIGVycjtcXG4yNjE0OlxcdH1cXG4yNjE1OlxcdFxcbjI2MTY6XFx0LyoqXFxuMjYxNzpcXHQgKiB2bV9pbnNlcnRfcGFnZXMgLSBpbnNlcnQgbXVsdGlwbGUgcGFnZXMgaW50byB1c2VyIHZtYSwgYmF0Y2hpbmcgdGhlIHBtZCBsb2NrLlxcbjI2MTg6XFx0ICogQHZtYTogdXNlciB2bWEgdG8gbWFwIHRvXFxuMjYxOTpcXHQgKiBAYWRkcjogdGFyZ2V0IHN0YXJ0IHVzZXIgYWRkcmVzcyBvZiB0aGVzZSBwYWdlc1xcbjI2MjA6XFx0ICogQHBhZ2VzOiBzb3VyY2Uga2VybmVsIHBhZ2VzXFxuMjYyMTpcXHQgKiBAbnVtOiBpbjogbnVtYmVyIG9mIHBhZ2VzIHRvIG1hcC4gb3V0OiBudW1iZXIgb2YgcGFnZXMgdGhhdCB3ZXJlICpub3QqXFxuMjYyMjpcXHQgKiBtYXBwZWQuICgwIG1lYW5zIGFsbCBwYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBtYXBwZWQpLlxcbjI2MjM6XFx0ICpcXG4yNjI0OlxcdCAqIFByZWZlcnJlZCBvdmVyIHZtX2luc2VydF9wYWdlKCkgd2hlbiBpbnNlcnRpbmcgbXVsdGlwbGUgcGFnZXMuXFxuMjYyNTpcXHQgKlxcbjI2MjY6XFx0ICogSW4gY2FzZSBvZiBlcnJvciwgd2UgbWF5IGhhdmUgbWFwcGVkIGEgc3Vic2V0IG9mIHRoZSBwcm92aWRlZFxcbjI2Mjc6XFx0ICogcGFnZXMuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBhY2NvdW50IGZvciB0aGlzIGNhc2UuXFxuMjYyODpcXHQgKlxcbjI2Mjk6XFx0ICogVGhlIHNhbWUgcmVzdHJpY3Rpb25zIGFwcGx5IGFzIGluIHZtX2luc2VydF9wYWdlKCkuXFxuMjYzMDpcXHQgKi9cXG4yNjMxOlxcdGludCB2bV9pbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4yNjMyOlxcdFxcdFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcXG4yNjMzOlxcdHtcXG4yNjM0OlxcdFxcdGNvbnN0IHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSAqbnVtO1xcbjI2MzU6XFx0XFx0Y29uc3QgdW5zaWduZWQgbG9uZyBlbmQgPSBhZGRyICsgUEFHRV9TSVpFICogbnJfcGFnZXM7XFxuMjYzNjpcXHRcXG4yNjM3OlxcdFxcdGlmICghcmFuZ2VfaW5fdm1hKHZtYSwgYWRkciwgZW5kKSlcXG4yNjM4OlxcdFxcdFxcdHJldHVybiAtRUZBVUxUO1xcbjI2Mzk6XFx0XFx0aWYgKCEodm1hLVxcdTAwM2V2bV9mbGFncyBcXHUwMDI2IFZNX01JWEVETUFQKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyNzo1MS4yMjI1MTg4ODlaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMzU5NDkyNzkzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoOiBBIE1lbW9yeSBNYW5hZ2VtZW50IEJ1ZyBGaXgqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB3aGF0J3MgY2hhbmdlZC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBmbG93IHdpdGhpbiBgaW5zZXJ0X3BhZ2VzYCBhbmQgaWRlbnRpZnkgdGhlIHByb2JsZW0uIFRoZSBjb3JlIGlzc3VlIHNlZW1zIHRvIHJldm9sdmUgYXJvdW5kIGVycm9yIGhhbmRsaW5nLCBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggcGFnZSB0YWJsZSBtYW5pcHVsYXRpb24uXG5cbkZpcnN0LCBJIHNlZSB0aGUgcHJlLXBhdGNoIGJlaGF2aW9yLiBJZiBgd2Fsa190b19wbWRgIGZhaWxlZCwgdGhlIHJldHVybiB2YWx1ZSB3YXMgLUVGQVVMVC4gVGhlbiBpZiBgcHRlX2FsbG9jYCBmYWlscywgdGhlIHJldHVybiB2YWx1ZSB3YXMgLUVOT01FTS4gSXQgc2VlbXMgdGhhdCB0aGVyZSBhcmUgYSBmZXcgcGxhY2VzIHRoYXQgY2FuIGNhdXNlIGFuIGVycm9yIGhlcmUuIEFuZCBpbiB0aGUgbG9vcCwgaWYgd2UgZmFpbGVkIHRvIGdldCB0aGUgcHRlLCB0aGUgcmV0dXJuIHZhbHVlIHdhcyAtRUZBVUxUIGFzIHdlbGwuIFdpdGhpbiB0aGUgbG9vcCwgYGluc2VydF9wYWdlX2luX2JhdGNoX2xvY2tlZGAgc2V0cyB0aGUgYGVycmAgdmFyaWFibGUsIHdoaWNoIGNhbiBiZSBub24temVyby4gVGhlIGltcG9ydGFudCB0aGluZyB0byB1bmRlcnN0YW5kIGlzIHRoYXQgdGhlIGByZXRgIHZhcmlhYmxlIGlzIHNldCB0byAwIGF0IHRoZSBlbmQuXG5cblRoZSBidWcgdGhlbiwgYXMgSSB1bmRlcnN0YW5kIGl0LCBzdGVtcyBmcm9tIHRoZSBoYW5kbGluZyBvZiBhIE5VTEwgcG1kIHJldHVybmVkIGJ5IGB3YWxrX3RvX3BtZGAuIFByZXZpb3VzbHksIHRoZSBjb2RlIGFzc2lnbmVkIGAtRUZBVUxUYCB0byBgcmV0YCwgYnV0IHRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgY29ycmVjdCwgaXMgaXQ/IFdlIHNob3VsZCBiZSByZXR1cm5pbmcgYC1FTk9NRU1gIGluIHRoZXNlIGNhc2VzLCBiZWNhdXNlIHRoYXQncyB3aGF0IGBwdGVfYWxsb2NgIHJldHVybmVkLiBUaGUgcGF0Y2ggY29ycmVjdGx5IGlkZW50aWZpZXMgdGhpcyBhbmQgdXBkYXRlcyB0aGUgcmV0dXJuIHZhbHVlLiBJIGFtIG5vdGluZyB0aGUgdmFyaWFibGUgbmFtZSBjbGVhbnVwIGJldHdlZW4gYHJldGAgYW5kIGBlcnJgLiBCb3RoIGFyZSB1c2VkIGluIHNpbWlsYXIgcGxhY2VzIHRvIG1lYW4gYW4gZXJyb3IgY29kZS5cblxuVGhlIGxvZ2ljIGNoYW5nZSBpcyBjbGVhci4gSXQgZW5zdXJlcyB0aGF0IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzLCBzcGVjaWZpY2FsbHkgdGhvc2UgZHVyaW5nIHBhZ2UgdGFibGUgd2Fsa3MsIGFyZSBjb25zaXN0ZW50bHkgc2lnbmFsZWQgd2l0aCBgLUVOT01FTWAsIHJhdGhlciB0aGFuIHRoZSBwb3RlbnRpYWxseSBtaXNsZWFkaW5nIGAtRUZBVUxUYC4gVGhpcyBhbGlnbnMgd2l0aCBzdGFuZGFyZCBlcnJvciBjb2RlcyBhbmQgYWlkcyBpbiBtb3JlIGFjY3VyYXRlIGRlYnVnZ2luZy5cblxuTm93LCB0byBmdWxseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3QsIEknbGwgbmVlZCB0byBjaGVjayB0aGUgY2FsbGVycyBvZiBgdm1faW5zZXJ0X3BhZ2VzYCBvciBgaW5zZXJ0X3BhZ2VzYC4gQ29udGV4dCBpcyBraW5nLCBzbyBJIG5lZWQgdG8gc2VlICp3aGVyZSogdGhpcyBmdW5jdGlvbiBpcyBiZWluZyB1c2VkIHRvIGFwcHJlY2lhdGUgdGhlIHNjb3BlIG9mIHRoZSBmaXguXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyOTAsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyODowNC44MTc0NDkwMDNaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc3ODg2MjI2MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2bV9pbnNlcnRfcGFnZXNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmM9NTI3PXN0YXRpYyBpbnQgYW1keGRuYV9nZW1fZG1hYnVmX21tYXAoc3RydWN0IGRtYV9idWYgKmRtYV9idWYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKVxcbi0tXFxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQzLVxcdHZtX2ZsYWdzX21vZCh2bWEsIFZNX01JWEVETUFQLCBWTV9QRk5NQVApO1xcbmRyaXZlcnMvYWNjZWwvYW1keGRuYS9hbWR4ZG5hX2dlbS5jOjU0NDpcXHRyZXQgPSB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXFx1MDAzZXZtX3N0YXJ0LCBhYm8tXFx1MDAzZWJhc2UucGFnZXMsXFxuZHJpdmVycy9hY2NlbC9hbWR4ZG5hL2FtZHhkbmFfZ2VtLmMtNTQ1LVxcdFxcdFxcdCAgICAgIFxcdTAwMjZudW1fcGFnZXMpO1xcbi0tXFxuaW5jbHVkZS9saW51eC9tbS5oPTQ3NzI9aW50IHZtX2luc2VydF9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1bnNpZ25lZCBsb25nIGFkZHIsIHN0cnVjdCBwYWdlICopO1xcbmluY2x1ZGUvbGludXgvbW0uaDo0NzczOmludCB2bV9pbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG5pbmNsdWRlL2xpbnV4L21tLmgtNDc3NC1cXHRcXHRcXHRzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBsb25nICpudW0pO1xcbi0tXFxuaW9fdXJpbmcvbWVtbWFwLmM9MzA3PXN0YXRpYyBpbnQgaW9fcmVnaW9uX21tYXAoc3RydWN0IGlvX3JpbmdfY3R4ICpjdHgsXFxuLS1cXG5pb191cmluZy9tZW1tYXAuYy0zMTQtXFx0dm1fZmxhZ3Nfc2V0KHZtYSwgVk1fRE9OVEVYUEFORCk7XFxuaW9fdXJpbmcvbWVtbWFwLmM6MzE1OlxcdHJldHVybiB2bV9pbnNlcnRfcGFnZXModm1hLCB2bWEtXFx1MDAzZXZtX3N0YXJ0LCBtci1cXHUwMDNlcGFnZXMsIFxcdTAwMjZucl9wYWdlcyk7XFxuaW9fdXJpbmcvbWVtbWFwLmMtMzE2LX1cXG4tLVxcbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jPTc2Njc9c3RhdGljIGludCBfX3JiX21hcF92bWEoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsXFxuLS1cXG5rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYy03NzU2LVxcbmtlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jOjc3NTc6XFx0ZXJyID0gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgdm1hLVxcdTAwM2V2bV9zdGFydCwgcGFnZXMsIFxcdTAwMjZucl9wYWdlcyk7XFxua2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMtNzc1OC1cXG4tLVxcbm1tL21lbW9yeS5jPTI1NTg9c3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTI2MTYtLyoqXFxubW0vbWVtb3J5LmM6MjYxNzogKiB2bV9pbnNlcnRfcGFnZXMgLSBpbnNlcnQgbXVsdGlwbGUgcGFnZXMgaW50byB1c2VyIHZtYSwgYmF0Y2hpbmcgdGhlIHBtZCBsb2NrLlxcbm1tL21lbW9yeS5jLTI2MTgtICogQHZtYTogdXNlciB2bWEgdG8gbWFwIHRvXFxuLS1cXG5tbS9tZW1vcnkuYy0yNjMwLSAqL1xcbm1tL21lbW9yeS5jOjI2MzE6aW50IHZtX2luc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL21lbW9yeS5jLTI2MzItXFx0XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtKVxcbi0tXFxubW0vbWVtb3J5LmMtMjY0Ni19XFxubW0vbWVtb3J5LmM6MjY0NzpFWFBPUlRfU1lNQk9MKHZtX2luc2VydF9wYWdlcyk7XFxubW0vbWVtb3J5LmMtMjY0OC1cXG4tLVxcbm1tL21lbW9yeS5jPTI3Mzk9c3RhdGljIGludCBfX3ZtX21hcF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4tLVxcbm1tL21lbW9yeS5jLTI3NTItXFxubW0vbWVtb3J5LmM6Mjc1MzpcXHRyZXR1cm4gdm1faW5zZXJ0X3BhZ2VzKHZtYSwgdWFkZHIsIHBhZ2VzICsgb2Zmc2V0LCBcXHUwMDI2Y291bnQpO1xcbm1tL21lbW9yeS5jLTI3NTQtfVxcbi0tXFxubW0vbm9tbXUuYz0zNTA9RVhQT1JUX1NZTUJPTCh2bV9pbnNlcnRfcGFnZSk7XFxubW0vbm9tbXUuYy0zNTEtXFxubW0vbm9tbXUuYzozNTI6aW50IHZtX2luc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbm1tL25vbW11LmMtMzUzLVxcdFxcdFxcdHN0cnVjdCBwYWdlICoqcGFnZXMsIHVuc2lnbmVkIGxvbmcgKm51bSlcXG4tLVxcbm1tL25vbW11LmMtMzU2LX1cXG5tbS9ub21tdS5jOjM1NzpFWFBPUlRfU1lNQk9MKHZtX2luc2VydF9wYWdlcyk7XFxubW0vbm9tbXUuYy0zNTgtXFxuLS1cXG5uZXQvaXB2NC90Y3AuYz0yMDYyPXN0YXRpYyBpbnQgdGNwX3plcm9jb3B5X3ZtX2luc2VydF9iYXRjaF9lcnJvcihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm5ldC9pcHY0L3RjcC5jLTIwODgtXFx0XFx0LyogV2UgY2FsbGVkIHphcF92bWFfcmFuZ2UsIHRyeSB0byByZWluc2VydC4gKi9cXG5uZXQvaXB2NC90Y3AuYzoyMDg5OlxcdFxcdGVyciA9IHZtX2luc2VydF9wYWdlcyh2bWEsICphZGRyZXNzLFxcbm5ldC9pcHY0L3RjcC5jLTIwOTAtXFx0XFx0XFx0XFx0ICAgICAgcGVuZGluZ19wYWdlcyxcXG4tLVxcbm5ldC9pcHY0L3RjcC5jPTIxMTA9c3RhdGljIGludCB0Y3BfemVyb2NvcHlfdm1faW5zZXJ0X2JhdGNoKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubmV0L2lwdjQvdGNwLmMtMjEyMy1cXG5uZXQvaXB2NC90Y3AuYzoyMTI0OlxcdGVyciA9IHZtX2luc2VydF9wYWdlcyh2bWEsICphZGRyZXNzLCBwYWdlcywgXFx1MDAyNnBhZ2VzX3JlbWFpbmluZyk7XFxubmV0L2lwdjQvdGNwLmMtMjEyNS1cXHRwYWdlc19tYXBwZWQgPSBwYWdlc190b19tYXAgLSAodW5zaWduZWQgaW50KXBhZ2VzX3JlbWFpbmluZztcXG5uZXQvaXB2NC90Y3AuYy0yMTI2LVxcdGJ5dGVzX21hcHBlZCA9IFBBR0VfU0laRSAqIHBhZ2VzX21hcHBlZDtcXG5uZXQvaXB2NC90Y3AuYzoyMTI3OlxcdC8qIEV2ZW4gaWYgdm1faW5zZXJ0X3BhZ2VzIGZhaWxzLCBpdCBtYXkgaGF2ZSBwYXJ0aWFsbHkgc3VjY2VlZGVkIGluXFxubmV0L2lwdjQvdGNwLmMtMjEyOC1cXHQgKiBtYXBwaW5nIChzb21lIGJ1dCBub3QgYWxsIG9mIHRoZSBwYWdlcykuXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI4OjA2LjU5NjMxNTkzNVoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjk4MTM0MTA3NTEzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgc3VtbWFyeSwgYXMgSSBkZWx2ZSBpbnRvIHRoaXMgY29kZTpcblxuKipEaXZpbmcgaW50byBgdm1faW5zZXJ0X3BhZ2VzYCBVc2FnZSoqXG5cbk9rYXksIHNvIGB2bV9pbnNlcnRfcGFnZXNgIGlzIGEgcmVhbCB3b3JraG9yc2UuIEkga25vdyBpdCdzIGNydWNpYWwgZm9yIGBpb191cmluZ2AsIHdoaWNoIG1ha2VzIHNlbnNlIGdpdmVuIGl0cyBuZWVkIGZvciBkaXJlY3QgbWVtb3J5IGFjY2Vzcy4gSSBhbHNvIHJlY2FsbCBzZWVpbmcgaXQgaW4gdGhlIGB0Y3BgIHplcm9jb3B5IHBhdGgg4oCTIHBhcnRpY3VsYXJseSB0aGF0IGB0Y3BfemVyb2NvcHlfcmVjZWl2ZWAgZnVuY3Rpb24uIE9mIGNvdXJzZSwgdGhlIGByaW5nX2J1ZmZlcmAgY29kZSB1c2VzIGl0IHRvbywgYW5kIGl0J3MgZXNzZW50aWFsIGZvciBgdm1fbWFwX3BhZ2VzYCBhbmQgb3RoZXIgbWVtb3J5IG1hcHBpbmcgb3BlcmF0aW9ucy5cblxuVGhlIHJlYWwgcXVlc3Rpb24gSSBoYXZlIGlzIHVuZGVyc3RhbmRpbmcgdGhlIGlubmVyIGRldGFpbHMgb2YgdGhlIG9wZXJhdGlvbi4gSSBuZWVkIHRvIGdldCB0byB0aGUgY29yZSwgc28gbGV0J3MgY2hlY2sgb3V0IGBfX3ZtX21hcF9wYWdlc2AgbG9jYXRlZCBpbiBgbW0vbWVtb3J5LmNgLiBJIGhhdmUgYSBmZWVsaW5nIHRoYXQgZnVuY3Rpb24gd2lsbCBzaGVkIHNvbWUgbGlnaHQgb24gdGhlIGxvdy1sZXZlbCBtZWNoYW5pY3Mgb2YgYWxsIHRoZXNlIHVzZXMsIGFuZCB3aGF0IHRoZSBjb3JlIGJlaGF2aW9yIGFuZCBzaWRlIGVmZmVjdHMgYXJlLiBUaW1lIHRvIHN0YXJ0IGRpZ2dpbmchXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY1MDEsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo2OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzoyOTo0NC43MzA0MjU3MzhaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5NTczMjY4NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3ZtX21hcF9wYWdlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9tZW1vcnkuYz0yNzI0PUVYUE9SVF9TWU1CT0wodm1faW5zZXJ0X3BhZ2UpO1xcbi0tXFxubW0vbWVtb3J5LmMtMjcyNi0vKlxcbm1tL21lbW9yeS5jOjI3Mjc6ICogX192bV9tYXBfcGFnZXMgLSBtYXBzIHJhbmdlIG9mIGtlcm5lbCBwYWdlcyBpbnRvIHVzZXIgdm1hXFxubW0vbWVtb3J5LmMtMjcyOC0gKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cXG4tLVxcbm1tL21lbW9yeS5jLTI3MzgtICovXFxubW0vbWVtb3J5LmM6MjczOTpzdGF0aWMgaW50IF9fdm1fbWFwX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbm1tL21lbW9yeS5jLTI3NDAtXFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KVxcbi0tXFxubW0vbWVtb3J5LmM9Mjc3ND1pbnQgdm1fbWFwX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLFxcbi0tXFxubW0vbWVtb3J5LmMtMjc3Ni17XFxubW0vbWVtb3J5LmM6Mjc3NzpcXHRyZXR1cm4gX192bV9tYXBfcGFnZXModm1hLCBwYWdlcywgbnVtLCB2bWFfc3RhcnRfcGdvZmYodm1hKSk7XFxubW0vbWVtb3J5LmMtMjc3OC19XFxuLS1cXG5tbS9tZW1vcnkuYz0yNzk0PWludCB2bV9tYXBfcGFnZXNfemVybyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKipwYWdlcyxcXG4tLVxcbm1tL21lbW9yeS5jLTI3OTYte1xcbm1tL21lbW9yeS5jOjI3OTc6XFx0cmV0dXJuIF9fdm1fbWFwX3BhZ2VzKHZtYSwgcGFnZXMsIG51bSwgMCk7XFxubW0vbWVtb3J5LmMtMjc5OC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjI5OjQ2LjMyNjE2Mjg2MloiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUwMDM5NzgzMjU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGB3YWxrX3RvX3BtZGAgaW4gYG1tL21lbW9yeS5jYCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGV4YWN0bHkgaG93IGB3YWxrX3RvX3BtZGAgZnVuY3Rpb25zIHdpdGhpbiBgbW0vbWVtb3J5LmNgLiBJJ20gc3BlY2lmaWNhbGx5IGludGVyZXN0ZWQgaW4gaXRzIHJvbGUsIHRoZSBkYXRhIHN0cnVjdHVyZXMgaXQgbWFuaXB1bGF0ZXMsIGFuZCBob3cgaXQgY29udHJpYnV0ZXMgdG8gdGhlIG92ZXJhbGwgcGFnZSB0YWJsZSB0cmF2ZXJzYWwgcHJvY2Vzcy4gSSdtIGFzc3VtaW5nLCBvZiBjb3Vyc2UsIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjZW50cmFsIHRvIHRoZSBoaWdoZXItbGV2ZWwgYWRkcmVzcyB0cmFuc2xhdGlvbiB0YXNrcy4gSSdsbCBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCBob3cgaXQgaGFuZGxlcyBwb3RlbnRpYWwgcGFnZSBmYXVsdHMsIHdoYXQgbG9ja2luZyBtZWNoYW5pc21zIGl0IGVtcGxveXMgdG8gZW5zdXJlIGNvbmN1cnJlbmN5IHNhZmV0eSAoaWYgYW55KSwgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSBwYWdlIHRhYmxlIHN0cnVjdHVyZXMuIFdoYXQgYXJlIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zPyBXaGF0IGlucHV0IHBhcmFtZXRlcnMgYXJlIGV4cGVjdGVkLCBhbmQgd2hhdCBhcmUgdGhlIHJldHVybiB2YWx1ZXM/IEFyZSB0aGVyZSBhbnkgc3VidGxlIG9wdGltaXphdGlvbnMgaW4gcGxheSwgcGVyaGFwcyByZWxhdGVkIHRvIFRMQiBtYW5hZ2VtZW50IG9yIHByZWZldGNoaW5nPyBUaGlzIGlzIHdoZXJlIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IG1hZ2ljIGhhcHBlbnMsIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0IGNvbXBsZXRlbHkgdG8gdHJvdWJsZXNob290IGFueSBtZW1vcnktcmVsYXRlZCBpc3N1ZXMuIEknbGwgYmUgbG9va2luZyBmb3IgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIG9yIHN1YnRsZSBidWdzIHRoYXQgbWlnaHQgbHVyayBpbiB0aGlzIGZ1bmN0aW9uLCBrbm93aW5nIGhvdyBjcnVjaWFsIGl0IGlzIHRvIHRoZSB3aG9sZSBtZW1vcnkgc3Vic3lzdGVtLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTcxLCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6MzA6MzYuMzY1OTQ3Nzg2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDMyNzc4MDY3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIndhbGtfdG9fcG1kXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL21lbW9yeS5jPTI0MDA9RVhQT1JUX1NZTUJPTF9HUEwoemFwX3NwZWNpYWxfdm1hX3JhbmdlKTtcXG5tbS9tZW1vcnkuYy0yNDAxLVxcbm1tL21lbW9yeS5jOjI0MDI6c3RhdGljIHBtZF90ICp3YWxrX3RvX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKVxcbm1tL21lbW9yeS5jLTI0MDMte1xcbi0tXFxubW0vbWVtb3J5LmM9MjQyND1wdGVfdCAqZ2V0X2xvY2tlZF9wdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcixcXG4tLVxcbm1tL21lbW9yeS5jLTI0MjYte1xcbm1tL21lbW9yeS5jOjI0Mjc6XFx0cG1kX3QgKnBtZCA9IHdhbGtfdG9fcG1kKG1tLCBhZGRyKTtcXG5tbS9tZW1vcnkuYy0yNDI4LVxcbi0tXFxubW0vbWVtb3J5LmM9MjU1OD1zdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbi0tXFxubW0vbWVtb3J5LmMtMjU2OS1tb3JlOlxcbm1tL21lbW9yeS5jOjI1NzA6XFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xcbm1tL21lbW9yeS5jLTI1NzEtXFx0aWYgKCFwbWQpIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6MzA6MzcuNzk4NzMyMDkzWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE1ODc4MzM2MzE0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkludmVzdGlnYXRpbmcgYHdhbGtfdG9fcG1kYCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIGB3YWxrX3RvX3BtZGAgZnVuY3Rpb24uIEknbSBhc3N1bWluZyBpdCdzIHJlbGF0ZWQgdG8gc29tZSBzb3J0IG9mIHBhdGggcGxhbm5pbmcgb3IgbW90aW9uIGNvbnRyb2wsIHByb2JhYmx5IGZvciBhIHBoeXNpY2FsIGRldmljZSBvciBhIHNpbXVsYXRlZCBlbnZpcm9ubWVudCwgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgXCJXaGF0IGFyZSB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzP1wiLiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIGZ1bmN0aW9uJ3Mgc2lnbmF0dXJlIOKAkyBkb2VzIGl0IHRha2UgYSB0YXJnZXQgUE1EIChwcmVzdW1hYmx5IGEgXCJwb2ludCBtYXNzIGRpc3RyaWJ1dGlvbixcIiBvciBwZXJoYXBzIHNvbWV0aGluZyBtb3JlIHNwZWNpZmljIHRvIHRoZSBkb21haW4pIGFzIGFuIGFyZ3VtZW50PyBJcyBpdCBleHBlY3RpbmcgYW4gaW5pdGlhbCBzdGF0ZSwgY3VycmVudCBwb3NpdGlvbi9vcmllbnRhdGlvbiwgb3IgYSBzdGFydCBsb2NhdGlvbj8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIHJldHVybiB2YWx1ZS4gSXMgaXQgYSB0cmFqZWN0b3J5LCBhIHNpbmdsZSBjb250cm9sIGFjdGlvbiwgYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2Vzcy9mYWlsdXJlLCBvciBtYXliZSBldmVuIGFuIGludGVybWVkaWF0ZSBkYXRhIHN0cnVjdHVyZT8gVGhlIHNlbWFudGljcyBoZXJlIGFyZSBjcml0aWNhbC5cblxuTmV4dCwgSSdsbCB3YW50IHRvIHRyYWNlIGl0cyBleGVjdXRpb24gcGF0aC4gSSdsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIGNvZGUsIGxvb2tpbmcgZm9yIGFueSBlZGdlIGNhc2VzLCBib3VuZGFyeSBjb25kaXRpb25zLCBvciBhc3N1bXB0aW9ucyBpdCBtaWdodCBtYWtlLiBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBib3R0bGVuZWNrcywgb3IgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZSBvcGVyYXRpb25zIHRoYXQgd291bGQgYmUgaW1tZWRpYXRlbHkgYXBwYXJlbnQ/IEnigJlsbCBiZSBjaGVja2luZyBmb3IgYW55IGRlcGVuZGVuY2llcyBvbiBvdGhlciBmdW5jdGlvbnMgb3IgbW9kdWxlcyB3aXRoaW4gdGhpcyBjb2RlYmFzZSDigJMgdGhvc2UgYXJlIGFsd2F5cyBpbXBvcnRhbnQgdG8gdHJhY2UuXG5cbkknbSBhbHNvIGN1cmlvdXMgYWJvdXQgZXJyb3IgaGFuZGxpbmcuIERvZXMgaXQgdGhyb3cgZXhjZXB0aW9ucywgcmV0dXJuIGVycm9yIGNvZGVzLCBvciBzaWxlbnRseSBmYWlsPyBSb2J1c3RuZXNzIGlzIGtleSwgZXNwZWNpYWxseSBpZiB0aGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgYSByZWFsLXdvcmxkIHN5c3RlbS4gSSdsbCBuZWVkIHRvIGtub3cgaWYgdGhlIGNvZGUgaGFzIGFkZXF1YXRlIHVuaXQgdGVzdHMgYW5kIGludGVncmF0aW9uIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCBpdC4gSWYgdGhpcyBgd2Fsa190b19wbWRgIGZ1bmN0aW9uIGlzIGZhaWxpbmcsIG9yIEknbSB0cnlpbmcgdG8gaW1wcm92ZSBpdHMgcGVyZm9ybWFuY2UsIEknbGwgbmVlZCB0byBrbm93IHdoZXJlIHRoZSBsb2dnaW5nIHN0YXRlbWVudHMgYXJlIHRvIHVuZGVyc3RhbmQgaXRzIGJlaGF2aW9yLlxuXG5GaW5hbGx5LCBJJ2xsIGJlIGZvcm1pbmcgc29tZSBoeXBvdGhlc2VzIGFib3V0IGhvdyB0aGUgZnVuY3Rpb24gd29ya3MuIElzIGl0IHVzaW5nIGEgc3RhbmRhcmQgcGF0aCBwbGFubmluZyBhbGdvcml0aG0gbGlrZSBBKiwgUlJULCBvciBzb21ldGhpbmcgbW9yZSBiZXNwb2tlPyBEb2VzIGl0IGNvbnNpZGVyIGNvbGxpc2lvbiBhdm9pZGFuY2UsIGR5bmFtaWMgY29uc3RyYWludHMsIGFuZCBhbnkgcG90ZW50aWFsIHBoeXNpY2FsIGxpbWl0YXRpb25zIG9mIHRoZSBcIndhbGtlclwiPyBUaGUgc3BlY2lmaWNzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGxpa2VseSBwb2ludCB0byB0aGUgdW5kZXJseWluZyBtZXRob2RvbG9neSBhbmQgYW55IHBvc3NpYmxlIG9wdGltaXNhdGlvbnMuIFRoaXMgZGVlcGVyIHVuZGVyc3RhbmRpbmcgd2lsbCBiZSBlc3NlbnRpYWwgdG8gZXZhbHVhdGUgaXRzIG92ZXJhbGwgZWZmZWN0aXZlbmVzcy5cblxuXG4iLCJJbnB1dFRva2VucyI6Nzc2MywiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjMwOjUzLjY3NzA3MTEzN1oiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNTc5MDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vbWVtb3J5LmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjQwMCxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjQwMDpcXHRFWFBPUlRfU1lNQk9MX0dQTCh6YXBfc3BlY2lhbF92bWFfcmFuZ2UpO1xcbjI0MDE6XFx0XFxuMjQwMjpcXHRzdGF0aWMgcG1kX3QgKndhbGtfdG9fcG1kKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpXFxuMjQwMzpcXHR7XFxuMjQwNDpcXHRcXHRwZ2RfdCAqcGdkO1xcbjI0MDU6XFx0XFx0cDRkX3QgKnA0ZDtcXG4yNDA2OlxcdFxcdHB1ZF90ICpwdWQ7XFxuMjQwNzpcXHRcXHRwbWRfdCAqcG1kO1xcbjI0MDg6XFx0XFxuMjQwOTpcXHRcXHRwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTtcXG4yNDEwOlxcdFxcdHA0ZCA9IHA0ZF9hbGxvYyhtbSwgcGdkLCBhZGRyKTtcXG4yNDExOlxcdFxcdGlmICghcDRkKVxcbjI0MTI6XFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuMjQxMzpcXHRcXHRwdWQgPSBwdWRfYWxsb2MobW0sIHA0ZCwgYWRkcik7XFxuMjQxNDpcXHRcXHRpZiAoIXB1ZClcXG4yNDE1OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbjI0MTY6XFx0XFx0cG1kID0gcG1kX2FsbG9jKG1tLCBwdWQsIGFkZHIpO1xcbjI0MTc6XFx0XFx0aWYgKCFwbWQpXFxuMjQxODpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4yNDE5OlxcdFxcbjI0MjA6XFx0XFx0Vk1fQlVHX09OKHBtZF90cmFuc19odWdlKCpwbWQpKTtcXG4yNDIxOlxcdFxcdHJldHVybiBwbWQ7XFxuMjQyMjpcXHR9XFxuMjQyMzpcXHRcXG4yNDI0OlxcdHB0ZV90ICpnZXRfbG9ja2VkX3B0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbjI0MjU6XFx0XFx0XFx0ICAgICAgc3BpbmxvY2tfdCAqKnB0bClcXG4yNDI2OlxcdHtcXG4yNDI3OlxcdFxcdHBtZF90ICpwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XFxuMjQyODpcXHRcXG4yNDI5OlxcdFxcdGlmICghcG1kKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzozMDo1My42NzczMzA3NzdaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDQ1ODIyNTE4MzU1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKldvcnRoRnV6emluZyBBc3Nlc3NtZW50OiBLZXJuZWwgTWVtb3J5IEFsbG9jYXRpb24gRXJyb3IgSGFuZGxpbmcqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGF0IHRoaXMgcGF0Y2ggY2hhbmdlcyBob3cgd2UgaGFuZGxlIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVzIHdpdGhpbiB0aGUgY29yZSBrZXJuZWwsIHNwZWNpZmljYWxseSBpbiBgbW0vbWVtb3J5LmNgLiBJdCdzIGEgcmVsYXRpdmVseSBmb2N1c2VkIGNoYW5nZTsgdGhlIG1vZGlmaWNhdGlvbiBpcyBpbiBgd2Fsa190b19wbWRgIGFuZCBob3cgZXJyb3JzIHByb3BhZ2F0ZSBpbiBgaW5zZXJ0X3BhZ2VzKClgLiBQcmV2aW91c2x5LCBhIG51bGwgcmV0dXJuIGZyb20gYHdhbGtfdG9fcG1kYCAoaW5kaWNhdGluZyBwYWdlIHRhYmxlIGFsbG9jYXRpb24gZmFpbHVyZSwgdXNpbmcgYHA0ZF9hbGxvY2AsIGBwdWRfYWxsb2NgLCBvciBgcG1kX2FsbG9jYCkgcmVzdWx0ZWQgaW4gYC1FRkFVTFRgLiBUaGUgcGF0Y2ggZWxlZ2FudGx5IGNvcnJlY3RzIHRoaXMsIGNoYW5naW5nIHRoZSByZXR1cm4gY29kZSB0byBgLUVOT01FTWAsIHdoaWNoIGlzIHByZWNpc2VseSB3aGF0IHdlIGV4cGVjdCB3aGVuIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLiBUaGlzIGNoYW5nZSBhbHNvIGNsZWFucyB1cCBzb21lIGxvY2FsIHZhcmlhYmxlIG1hbmFnZW1lbnQuXG5cbk5vdywgdGhlIGNydWNpYWwgcXVlc3Rpb24gaXMgd2hldGhlciB0aGlzIHdhcnJhbnRzIGZ1enppbmcuIEkgbmVlZCB0byBhcHBseSB0aGUgZnV6emluZyBjcml0ZXJpYS4gVGhlIGluc3RydWN0aW9ucyBzcGVjaWZ5IHRoYXQgd2Ugc2hvdWxkIGF2b2lkIGZ1enppbmcgZG9jdW1lbnRhdGlvbiBjaGFuZ2VzLCBsb2dnaW5nIG1vZGlmaWNhdGlvbnMsIGNvc21ldGljIGNoYW5nZXMgdG8gY29uc3RhbnRzLCB1bnJlYWNoYWJsZSBjb2RlIHBhdGhzIChlc3BlY2lhbGx5IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIFFFTVUpLCB2ZW5kb3Itc3BlY2lmaWMgZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcywgZXRjLiBIb3dldmVyLCB0aGlzIGNoYW5nZSAqZG9lcyogbW9kaWZ5IGNvcmUga2VybmVsIGxvZ2ljIChgbW0vbWVtb3J5LmNgKS4gU3BlY2lmaWNhbGx5LCBpdCdzIG1vZGlmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHJldHVybiB2YWx1ZXMgb2YgYGluc2VydF9wYWdlcygpYCBhbmQgYHZtX2luc2VydF9wYWdlcygpYC5cblxuTmV4dCwgSSBuZWVkIHRvIGNvbmZpcm0gaWYgdGhlIGFmZmVjdGVkIGNvZGUgaXMgcmVhY2hhYmxlIGluIGEgc3RhbmRhcmQgUUVNVSBlbnZpcm9ubWVudC4gVGhlIGdvb2QgbmV3cyBpcywgYHZtX2luc2VydF9wYWdlcygpYCBpcyBub3Qgb2JzY3VyZTsgaXQncyByZWFjaGFibGUgdmlhIHNldmVyYWwgY29tbW9uIGtlcm5lbCBmZWF0dXJlcywgaW5jbHVkaW5nIGBpb191cmluZ2AgbW1hcCwgVENQIHplcm9jb3B5IChgZ2V0c29ja29wdCguLi4sIFRDUF9aRVJPQ09QWV9SRUNFSVZFLCAuLi4pYCksIGFuZCByaW5nX2J1ZmZlciBtbWFwLiBUaGlzIGNvbmZpcm1zIHRoZSByZWFjaGFiaWxpdHkgYW5kIHRoZSBwb3RlbnRpYWwgZm9yIGEgZnV6eiB0YXJnZXQuIFRoZSBjaGFuZ2UgYWxzbyBtb2RpZmllcyBlcnJvciBoYW5kbGluZyB3aGljaCBpcyBkZWZpbml0ZWx5IHdvcnRoIGV4cGxvcmluZy5cblxuRmluYWxseSwgbGV0J3MgZXhhbWluZSBwb3RlbnRpYWwgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMuIGBtbS9tZW1vcnkuY2AgaXMgY29yZSB0byB0aGUga2VybmVsJ3MgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGlzIGFsd2F5cyBidWlsdCBpbnRvIHRoZSBjb3JlLiBJIGNhbiB2ZXJpZnkgdGhpcyBieSBjaGVja2luZyB0aGUgYG1tL01ha2VmaWxlYCBhbmQgYG1tL0tjb25maWdgLCBidXQgdGhpcyBpcyB1c3VhbGx5IGEgZ2l2ZW4uIE5vIHNwZWNpYWwgY29uZmlndXJhdGlvbnMgc2hvdWxkIGJlIG5lY2Vzc2FyeSB0byBhY3RpdmF0ZSB0aGlzIGNoYW5nZSBvciB0ZXN0IGl0cyBpbXBsaWNhdGlvbnMuIEkgd2lsbCBhbHNvIGNoZWNrIHRoZSBcImZvY3VzIHN5bWJvbHNcIiB3aGljaCBpbmNsdWRlIGB2bV9pbnNlcnRfcGFnZXNgLCBgdm1fbWFwX3BhZ2VzYCwgYW5kIGB2bV9tYXBfcGFnZXNfemVyb2AuIFdoaWxlIEkgY2FuJ3QgYmUgKmNvbXBsZXRlbHkqIGNlcnRhaW4gd2l0aG91dCBhIGRlZXBlciBkaXZlLCBgdm1faW5zZXJ0X3BhZ2VzYCBpcyBleHBvcnRlZCBhbmQgbm9uLXN0YXRpYywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciBmdXp6aW5nLlxuXG5UaGVyZWZvcmUsIGJlY2F1c2UgdGhpcyBwYXRjaCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMgYW5kIGFkZHJlc3NlcyBwb3RlbnRpYWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3JzIGluIGEgY29tbW9uIGNvZGUgcGF0aCwgbXkgYXNzZXNzbWVudCBpcyAqKldvcnRoRnV6emluZz10cnVlKiouIFRoZSBzd2l0Y2ggZnJvbSBgLUVGQVVMVGAgdG8gYC1FTk9NRU1gIGlzIGEgc2VtYW50aWNhbGx5IGNvcnJlY3QgY2hhbmdlLCB3aGljaCBpcyB3b3J0aCBmdXp6aW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NzI4LCJPdXRwdXRUb2tlbnMiOjI0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzE0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mzg6MTkuNDk5ODUxNDkyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5NjgxMDU0OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJtZW1vcnlcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW1cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vTWFrZWZpbGU9MzY9bW11LXlcXHRcXHRcXHQ6PSBub21tdS5vXFxubW0vTWFrZWZpbGU6Mzc6bW11LSQoQ09ORklHX01NVSlcXHQ6PSBoaWdobWVtLm8gbWVtb3J5Lm8gbWluY29yZS5vIFxcXFxcXG5tbS9NYWtlZmlsZS0zOC1cXHRcXHRcXHQgICBtbG9jay5vIG1tYXAubyBtbXVfZ2F0aGVyLm8gbXByb3RlY3QubyBtcmVtYXAubyBcXFxcXFxuLS1cXG5tbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTEwOTQ9c3RhdGljIHNzaXplX3QgbWVtY2dfd3JpdGVfZXZlbnRfY29udHJvbChzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmMtMTE4MC1cXHRcXHRldmVudC1cXHUwMDNldW5yZWdpc3Rlcl9ldmVudCA9IG1lbV9jZ3JvdXBfdXNhZ2VfdW5yZWdpc3Rlcl9ldmVudDtcXG5tbS9tZW1jb250cm9sLXYxLmM6MTE4MTpcXHR9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgXFxcIm1lbW9yeS5vb21fY29udHJvbFxcXCIpKSB7XFxubW0vbWVtY29udHJvbC12MS5jLTExODItXFx0XFx0cHJfd2Fybl9vbmNlKFxcXCJvb21fY29udHJvbCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQuIFxcXCJcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yMDM5PXZvaWQgbWVtX2Nncm91cF9wcmludF9vb21fZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIwNDItXFx0cHJfY29udF9jZ3JvdXBfcGF0aChtZW1jZy1cXHUwMDNlY3NzLmNncm91cCk7XFxubW0vbWVtY29udHJvbC5jOjIwNDM6XFx0cHJfY29udChcXFwiIGFyZSBnb2luZyB0byBiZSBraWxsZWQgZHVlIHRvIG1lbW9yeS5vb20uZ3JvdXAgc2V0XFxcXG5cXFwiKTtcXG5tbS9tZW1jb250cm9sLmMtMjA0NC19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM4OjE5LjU5NjY2NzQ5WiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM2Njc5ODA3NDI5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIGZyb20gYW4gZXhwZXJ0J3MgcGVyc3BlY3RpdmU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgYG1lbW9yeS5vYCBEZXBlbmRlbmN5KipcblxuUmlnaHQsIHNvIGBtZW1vcnkub2AgaXMgYnVpbHQgd2l0aCBgQ09ORklHX01NVWAuIFRoYXQncyBhIHByZXR0eSBzdGFuZGFyZCB0aGluZywgZXNwZWNpYWxseSBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMuIEJ1dCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgKndoeSogYmVoaW5kIHRoaXMgZGVwZW5kZW5jeS4gQXJlIHRoZXJlIG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoYXQgYWxzbyBlbmFibGUgY2FsbGluZyBpbnRvIG1vZHVsZXMgdGhhdCByZWx5IG9uIHRoZSBNTVU/IEknbSB0aGlua2luZyBzcGVjaWZpY2FsbHkgYWJvdXQgdGhpbmdzIGxpa2UgVENQIHplcm8tY29weSBvciBJT19VUklORywgd2hpY2ggbWlnaHQgaW5kaXJlY3RseSByZXF1aXJlIHRoaXMuIExldCdzIG1ha2UgYSBxdWljayBub3RlOiBgSU5FVGAsIGBJT19VUklOR2AsIGFuZCBgTU1VYC4gT2theSwgSSdsbCBzdGFydCBieSBkcmlsbGluZyBkb3duIG9uIHRoZSBgTU1VYCB1c2FnZSBmaXJzdC4gVGhhdCBzZWVtcyBsaWtlIHRoZSBtb3N0IG9idmlvdXMgc3RhcnRpbmcgcG9pbnQgZm9yIGFuIGludmVzdGlnYXRpb24uXG5cbkFscmlnaHQsIHRoYXQgZmVlbHMgbGlrZSBhIGdvb2QgcGxhbi4gTm93LCB0byBtYWtlIHN1cmUgSSBhbSBvbiB0cmFjayB3aXRoIG15IGludmVzdGlnYXRpb24sIGxldCdzIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTA1MDMsIk91dHB1dFRva2VucyI6MTM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mzg6NTYuMjc2NDc3MzA5WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTIwNDA3ODE4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJNTVVcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJ2bV9pbnNlcnRfcGFnZXNcIixcbiAgICBcInZtX21hcF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzX3plcm9cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBlcnJvciByZXR1cm4gaGFuZGxpbmcgaW4gbW0vbWVtb3J5LmMgd2l0aGluIGluc2VydF9wYWdlcygpIChhbmQgdHJhbnNpdGl2ZWx5IHZtX2luc2VydF9wYWdlcygpKSwgY29ycmVjdGx5IHJldHVybmluZyAtRU5PTUVNIGluc3RlYWQgb2YgLUVGQVVMVCB3aGVuIHdhbGtfdG9fcG1kKCkgb3IgcHRlX2FsbG9jKCkgZmFpbHMuIFRoaXMgYWZmZWN0cyBjb3JlIHZpcnR1YWwgbWVtb3J5IG1hbmFnZW1lbnQgdXNlZCBieSBpb191cmluZywgbmV0d29ya2luZyAoVENQIHplcm9jb3B5KSwgYW5kIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk1NVVwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInZtX2luc2VydF9wYWdlc1wiLFxuICAgIFwidm1fbWFwX3BhZ2VzXCIsXG4gICAgXCJ2bV9tYXBfcGFnZXNfemVyb1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIGVycm9yIHJldHVybiBoYW5kbGluZyBpbiBtbS9tZW1vcnkuYyB3aXRoaW4gaW5zZXJ0X3BhZ2VzKCkgKGFuZCB0cmFuc2l0aXZlbHkgdm1faW5zZXJ0X3BhZ2VzKCkpLCBjb3JyZWN0bHkgcmV0dXJuaW5nIC1FTk9NRU0gaW5zdGVhZCBvZiAtRUZBVUxUIHdoZW4gd2Fsa190b19wbWQoKSBvciBwdGVfYWxsb2MoKSBmYWlscy4gVGhpcyBhZmZlY3RzIGNvcmUgdmlydHVhbCBtZW1vcnkgbWFuYWdlbWVudCB1c2VkIGJ5IGlvX3VyaW5nLCBuZXR3b3JraW5nIChUQ1AgemVyb2NvcHkpLCBhbmQgb3RoZXIga2VybmVsIHN1YnN5c3RlbXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM4OjU2LjM5Njg5MjQzN1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU3NDAzMzAzODIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzozODo1Ni4zOTczNzg4MTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1NTczOTgzODA3MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXFxuXFxuTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgYnVmZmVycywgb3IgY29waWVzIHRvIHVzZXIgc3BhY2UgYXJlIGludHJvZHVjZWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgKGBlcnJgLCBgcmVtYWluaW5nX3BhZ2VzX3RvdGFsYCwgYGN1cnJfcGFnZV9pZHhgKSBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBlcnJvciBjb2RlcyBhcmUgZXhwbGljaXRseSBhc3NpZ25lZCBiZWZvcmUgYW55IGp1bXAgdG8gdGhlIGV4aXQgbGFiZWwuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBmN2E4MTM0MmRiM2M2NGQ5ZTcwMzY1NWViZDNhMjFlZmVmNDA4ZjA4XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFNhdCBBdWcgMjkgMTc6Mjc6NDAgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jXG5pbmRleCA5Y2JjZTVjOTBiZmZkLi4yN2ZmZTFhOTlhMDhiIDEwMDY0NFxuLS0tIGEvbW0vbWVtb3J5LmNcbisrKyBiL21tL21lbW9yeS5jXG5AQCAtMjU2NSwyMCArMjU2NSwyMiBAQCBzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxuIFx0dW5zaWduZWQgbG9uZyBjdXJyX3BhZ2VfaWR4ID0gMDtcbiBcdHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nX3BhZ2VzX3RvdGFsID0gKm51bTtcbiBcdHVuc2lnbmVkIGxvbmcgcGFnZXNfdG9fd3JpdGVfaW5fcG1kO1xuLVx0aW50IHJldDtcbitcdGludCBlcnIgPSAwO1xuIG1vcmU6XG4tXHRyZXQgPSAtRUZBVUxUO1xuIFx0cG1kID0gd2Fsa190b19wbWQobW0sIGFkZHIpO1xuLVx0aWYgKCFwbWQpXG4rXHRpZiAoIXBtZCkge1xuK1x0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dDtcbitcdH1cbiBcbiBcdHBhZ2VzX3RvX3dyaXRlX2luX3BtZCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsXG4gXHRcdHJlbWFpbmluZ19wYWdlc190b3RhbCwgUFRSU19QRVJfUFRFIC0gcHRlX2luZGV4KGFkZHIpKTtcbiBcbiBcdC8qIEFsbG9jYXRlIHRoZSBQVEUgaWYgbmVjZXNzYXJ5OyB0YWtlcyBQTUQgbG9jayBvbmNlIG9ubHkuICovXG4tXHRyZXQgPSAtRU5PTUVNO1xuLVx0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSlcbitcdGlmIChwdGVfYWxsb2MobW0sIHBtZCkpIHtcbitcdFx0ZXJyID0gLUVOT01FTTtcbiBcdFx0Z290byBvdXQ7XG4rXHR9XG4gXG4gXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XG4gXHRcdGludCBwdGVfaWR4ID0gMDtcbkBAIC0yNTg2LDE1ICsyNTg4LDE0IEBAIHN0YXRpYyBpbnQgaW5zZXJ0X3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsXG4gXG4gXHRcdHN0YXJ0X3B0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgXHUwMDI2cHRlX2xvY2spO1xuIFx0XHRpZiAoIXN0YXJ0X3B0ZSkge1xuLVx0XHRcdHJldCA9IC1FRkFVTFQ7XG4rXHRcdFx0ZXJyID0gLUVGQVVMVDtcbiBcdFx0XHRnb3RvIG91dDtcbiBcdFx0fVxuIFx0XHRmb3IgKHB0ZSA9IHN0YXJ0X3B0ZTsgcHRlX2lkeCBcdTAwM2MgYmF0Y2hfc2l6ZTsgKytwdGUsICsrcHRlX2lkeCkge1xuLVx0XHRcdGludCBlcnIgPSBpbnNlcnRfcGFnZV9pbl9iYXRjaF9sb2NrZWQodm1hLCBwdGUsXG4tXHRcdFx0XHRhZGRyLCBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XG4rXHRcdFx0ZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLCBhZGRyLFxuK1x0XHRcdFx0XHRcdFx0ICBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XG4gXHRcdFx0aWYgKHVubGlrZWx5KGVycikpIHtcbiBcdFx0XHRcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XG4tXHRcdFx0XHRyZXQgPSBlcnI7XG4gXHRcdFx0XHRyZW1haW5pbmdfcGFnZXNfdG90YWwgLT0gcHRlX2lkeDtcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbkBAIC0yNjA3LDEwICsyNjA4LDkgQEAgc3RhdGljIGludCBpbnNlcnRfcGFnZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcixcbiBcdH1cbiBcdGlmIChyZW1haW5pbmdfcGFnZXNfdG90YWwpXG4gXHRcdGdvdG8gbW9yZTtcbi1cdHJldCA9IDA7XG4gb3V0OlxuIFx0Km51bSA9IHJlbWFpbmluZ19wYWdlc190b3RhbDtcbi1cdHJldHVybiByZXQ7XG4rXHRyZXR1cm4gZXJyO1xuIH1cbiBcbiAvKipcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM4OjU2LjM5NzM4MDAwN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozOTgxNDAxNzkzOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgdGhpbmtpbmcgYXMgYW4gZXhwZXJ0IGluIHRoZSBmaWVsZDpcblxuKipEaXZpbmcgaW50byBgbW0vbWVtb3J5LmNgKipcblxuQWxyaWdodCwgdGhlIGluc3RydWN0aW9uIHNheXMgdG8gc3RhcnQgYnkgaW5zcGVjdGluZyB0aGUgZGlmZiBhbmQgcmVhZGluZyB0aGUgc3Vycm91bmRpbmcgY29kZSBpbiBgbW0vbWVtb3J5LmNgLiBNeSBtaW5kIGltbWVkaWF0ZWx5IHN0YXJ0cyBydW5uaW5nIHRocm91Z2ggdGhlIGltcGxpY2F0aW9ucy4gSSBrbm93IGBtbS9tZW1vcnkuY2AgaXMgdGhlIGhlYXJ0IG9mIG1lbW9yeSBtYW5hZ2VtZW50IGluIHRoaXMgc3lzdGVtLCBzbyB3aGF0ZXZlciBjaGFuZ2UgaXMgcHJvcG9zZWQsIGl0J3MgcG90ZW50aWFsbHkgY3JpdGljYWwuIEnigJlsbCBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlICp3aHkqIGJlaGluZCB0aGlzIGNoYW5nZSwgdGhlIGludGVuZGVkIGVmZmVjdCwgYW5kIGFueSBwb3RlbnRpYWwgc2lkZS1lZmZlY3RzLiBCZWZvcmUgZG9pbmcgYW55dGhpbmcgZWxzZSBJJ2xsIHdhbnQgdG8gZ2V0IGEgZ29vZCBzZW5zZSBvZiB0aGUgY29udGV4dCBvZiB0aGUgZGlmZi4gSSdsbCByZWFkIGFyb3VuZCB0aGUgY29kZSBhdCB0aGF0IGxvY2F0aW9uIHRvIGJ1aWxkIGEgbWVudGFsIHBpY3R1cmUgb2Ygd2hhdCdzIGdvaW5nIG9uLlxuXG5UaGUgaW5zdHJ1Y3Rpb24gYWxzbyBzYXlzIHRvIHVzZSBgcmVhZC1maWxlYCBhcm91bmQgbGluZSAyNTY1IGluIGBtbS9tZW1vcnkuY2AuIFJpZ2h0LCBzbyBJIGtub3cgSSBuZWVkIHRvIGJlIHJlYWR5IHRvIGFuYWx5emUgdGhpcyBzZWN0aW9uIGNsb3NlbHkuIEkgd2lsbCBleHBlY3QgdGhpcyB0byBnaXZlIG1lIHRoZSBpbmZvcm1hdGlvbiB0byBkbyBteSBqb2IsIGFuZCBzdGFydCB0byBmb3JtIGEgY29tcHJlaGVuc2l2ZSBtZW50YWwgbW9kZWwgb2YgdGhlIGNvZGUuIEkgYW0gcmVhZHkgdG8gZGlnIGludG8gdGhlIGRldGFpbHMgYW5kIHN0YXJ0IGFuYWx5emluZyB0aGUgY29kZS4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjI0LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOVQxNzozOTozNi4yMTE0MDA5NjZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzIzNDA0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9tZW1vcnkuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTUwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNTUwOlxcdFxcdGlmIChlcnIpXFxuMjU1MTpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjI1NTI6XFx0XFx0cmV0dXJuIGluc2VydF9wYWdlX2ludG9fcHRlX2xvY2tlZCh2bWEsIHB0ZSwgYWRkciwgcGFnZSwgcHJvdCwgZmFsc2UpO1xcbjI1NTM6XFx0fVxcbjI1NTQ6XFx0XFxuMjU1NTpcXHQvKiBpbnNlcnRfcGFnZXMoKSBhbW9ydGl6ZXMgdGhlIGNvc3Qgb2Ygc3BpbmxvY2sgb3BlcmF0aW9uc1xcbjI1NTY6XFx0ICogd2hlbiBpbnNlcnRpbmcgcGFnZXMgaW4gYSBsb29wLlxcbjI1NTc6XFx0ICovXFxuMjU1ODpcXHRzdGF0aWMgaW50IGluc2VydF9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLFxcbjI1NTk6XFx0XFx0XFx0XFx0c3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgbG9uZyAqbnVtLCBwZ3Byb3RfdCBwcm90KVxcbjI1NjA6XFx0e1xcbjI1NjE6XFx0XFx0cG1kX3QgKnBtZCA9IE5VTEw7XFxuMjU2MjpcXHRcXHRwdGVfdCAqc3RhcnRfcHRlLCAqcHRlO1xcbjI1NjM6XFx0XFx0c3BpbmxvY2tfdCAqcHRlX2xvY2s7XFxuMjU2NDpcXHRcXHRzdHJ1Y3QgbW1fc3RydWN0ICpjb25zdCBtbSA9IHZtYS1cXHUwMDNldm1fbW07XFxuMjU2NTpcXHRcXHR1bnNpZ25lZCBsb25nIGN1cnJfcGFnZV9pZHggPSAwO1xcbjI1NjY6XFx0XFx0dW5zaWduZWQgbG9uZyByZW1haW5pbmdfcGFnZXNfdG90YWwgPSAqbnVtO1xcbjI1Njc6XFx0XFx0dW5zaWduZWQgbG9uZyBwYWdlc190b193cml0ZV9pbl9wbWQ7XFxuMjU2ODpcXHRcXHRpbnQgZXJyID0gMDtcXG4yNTY5OlxcdG1vcmU6XFxuMjU3MDpcXHRcXHRwbWQgPSB3YWxrX3RvX3BtZChtbSwgYWRkcik7XFxuMjU3MTpcXHRcXHRpZiAoIXBtZCkge1xcbjI1NzI6XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4yNTczOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjI1NzQ6XFx0XFx0fVxcbjI1NzU6XFx0XFxuMjU3NjpcXHRcXHRwYWdlc190b193cml0ZV9pbl9wbWQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLFxcbjI1Nzc6XFx0XFx0XFx0cmVtYWluaW5nX3BhZ2VzX3RvdGFsLCBQVFJTX1BFUl9QVEUgLSBwdGVfaW5kZXgoYWRkcikpO1xcbjI1Nzg6XFx0XFxuMjU3OTpcXHRcXHQvKiBBbGxvY2F0ZSB0aGUgUFRFIGlmIG5lY2Vzc2FyeTsgdGFrZXMgUE1EIGxvY2sgb25jZSBvbmx5LiAqL1xcbjI1ODA6XFx0XFx0aWYgKHB0ZV9hbGxvYyhtbSwgcG1kKSkge1xcbjI1ODE6XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4yNTgyOlxcdFxcdFxcdGdvdG8gb3V0O1xcbjI1ODM6XFx0XFx0fVxcbjI1ODQ6XFx0XFxuMjU4NTpcXHRcXHR3aGlsZSAocGFnZXNfdG9fd3JpdGVfaW5fcG1kKSB7XFxuMjU4NjpcXHRcXHRcXHRpbnQgcHRlX2lkeCA9IDA7XFxuMjU4NzpcXHRcXHRcXHRjb25zdCBpbnQgYmF0Y2hfc2l6ZSA9IG1pbl90KGludCwgcGFnZXNfdG9fd3JpdGVfaW5fcG1kLCA4KTtcXG4yNTg4OlxcdFxcbjI1ODk6XFx0XFx0XFx0c3RhcnRfcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyLCBcXHUwMDI2cHRlX2xvY2spO1xcbjI1OTA6XFx0XFx0XFx0aWYgKCFzdGFydF9wdGUpIHtcXG4yNTkxOlxcdFxcdFxcdFxcdGVyciA9IC1FRkFVTFQ7XFxuMjU5MjpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4yNTkzOlxcdFxcdFxcdH1cXG4yNTk0OlxcdFxcdFxcdGZvciAocHRlID0gc3RhcnRfcHRlOyBwdGVfaWR4IFxcdTAwM2MgYmF0Y2hfc2l6ZTsgKytwdGUsICsrcHRlX2lkeCkge1xcbjI1OTU6XFx0XFx0XFx0XFx0ZXJyID0gaW5zZXJ0X3BhZ2VfaW5fYmF0Y2hfbG9ja2VkKHZtYSwgcHRlLCBhZGRyLFxcbjI1OTY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICBwYWdlc1tjdXJyX3BhZ2VfaWR4XSwgcHJvdCk7XFxuMjU5NzpcXHRcXHRcXHRcXHRpZiAodW5saWtlbHkoZXJyKSkge1xcbjI1OTg6XFx0XFx0XFx0XFx0XFx0cHRlX3VubWFwX3VubG9jayhzdGFydF9wdGUsIHB0ZV9sb2NrKTtcXG4yNTk5OlxcdFxcdFxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBwdGVfaWR4O1xcbjI2MDA6XFx0XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMjYwMTpcXHRcXHRcXHRcXHR9XFxuMjYwMjpcXHRcXHRcXHRcXHRhZGRyICs9IFBBR0VfU0laRTtcXG4yNjAzOlxcdFxcdFxcdFxcdCsrY3Vycl9wYWdlX2lkeDtcXG4yNjA0OlxcdFxcdFxcdH1cXG4yNjA1OlxcdFxcdFxcdHB0ZV91bm1hcF91bmxvY2soc3RhcnRfcHRlLCBwdGVfbG9jayk7XFxuMjYwNjpcXHRcXHRcXHRwYWdlc190b193cml0ZV9pbl9wbWQgLT0gYmF0Y2hfc2l6ZTtcXG4yNjA3OlxcdFxcdFxcdHJlbWFpbmluZ19wYWdlc190b3RhbCAtPSBiYXRjaF9zaXplO1xcbjI2MDg6XFx0XFx0fVxcbjI2MDk6XFx0XFx0aWYgKHJlbWFpbmluZ19wYWdlc190b3RhbClcXG4yNjEwOlxcdFxcdFxcdGdvdG8gbW9yZTtcXG4yNjExOlxcdG91dDpcXG4yNjEyOlxcdFxcdCpudW0gPSByZW1haW5pbmdfcGFnZXNfdG90YWw7XFxuMjYxMzpcXHRcXHRyZXR1cm4gZXJyO1xcbjI2MTQ6XFx0fVxcbjI2MTU6XFx0XFxuMjYxNjpcXHQvKipcXG4yNjE3OlxcdCAqIHZtX2luc2VydF9wYWdlcyAtIGluc2VydCBtdWx0aXBsZSBwYWdlcyBpbnRvIHVzZXIgdm1hLCBiYXRjaGluZyB0aGUgcG1kIGxvY2suXFxuMjYxODpcXHQgKiBAdm1hOiB1c2VyIHZtYSB0byBtYXAgdG9cXG4yNjE5OlxcdCAqIEBhZGRyOiB0YXJnZXQgc3RhcnQgdXNlciBhZGRyZXNzIG9mIHRoZXNlIHBhZ2VzXFxuMjYyMDpcXHQgKiBAcGFnZXM6IHNvdXJjZSBrZXJuZWwgcGFnZXNcXG4yNjIxOlxcdCAqIEBudW06IGluOiBudW1iZXIgb2YgcGFnZXMgdG8gbWFwLiBvdXQ6IG51bWJlciBvZiBwYWdlcyB0aGF0IHdlcmUgKm5vdCpcXG4yNjIyOlxcdCAqIG1hcHBlZC4gKDAgbWVhbnMgYWxsIHBhZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IG1hcHBlZCkuXFxuMjYyMzpcXHQgKlxcbjI2MjQ6XFx0ICogUHJlZmVycmVkIG92ZXIgdm1faW5zZXJ0X3BhZ2UoKSB3aGVuIGluc2VydGluZyBtdWx0aXBsZSBwYWdlcy5cXG4yNjI1OlxcdCAqXFxuMjYyNjpcXHQgKiBJbiBjYXNlIG9mIGVycm9yLCB3ZSBtYXkgaGF2ZSBtYXBwZWQgYSBzdWJzZXQgb2YgdGhlIHByb3ZpZGVkXFxuMjYyNzpcXHQgKiBwYWdlcy4gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGFjY291bnQgZm9yIHRoaXMgY2FzZS5cXG4yNjI4OlxcdCAqXFxuMjYyOTpcXHQgKiBUaGUgc2FtZSByZXN0cmljdGlvbnMgYXBwbHkgYXMgaW4gdm1faW5zZXJ0X3BhZ2UoKS5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjlUMTc6Mzk6MzYuMjE4NjQyMTU2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE1OTE4NTQ4NTkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFJlZmFjdG9yaW5nIG9mIEVycm9yIEhhbmRsaW5nIGluIGBpbnNlcnRfcGFnZXMoKWAqKlxuXG5BbHJpZ2h0LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB0cmFjZSB0aGUgY2hhbmdlcyBpbiBgaW5zZXJ0X3BhZ2VzKClgIGFuZCB1bmRlcnN0YW5kIHRoZSBpbXBsaWNhdGlvbnMgZm9yIEtNU0FOLiBUaGUgZGlmZiBpcyByZWZhY3RvcmluZyB0aGUgZXJyb3IgaGFuZGxpbmcsIGNvbnNvbGlkYXRpbmcgdGhlIHJldHVybiB2YXJpYWJsZS4gUHJldmlvdXNseSwgdGhlcmUgd2FzIGFuIGBpbnQgcmV0YCBhbmQgYW4gaW5uZXIgYGludCBlcnJgLCBidXQgbm93IGl0J3MganVzdCBhIHNpbmdsZSBgaW50IGVycmAgaW5pdGlhbGl6ZWQgdG8gMC4gSXQgYWxzbyBjaGFuZ2VzIHRoZSBlcnJvciByZXR1cm4gd2hlbiBgd2Fsa190b19wbWRgIGZhaWxzIGZyb20gYC1FRkFVTFRgIHRvIGAtRU5PTUVNYC5cblxuTm93LCB0aGUgY3J1eCBvZiB0aGUgS01TQU4gYW5hbHlzaXM6IGFyZSB0aGVyZSBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMgb3IgaW5mb3JtYXRpb24gbGVha3MgaW50cm9kdWNlZCBieSB0aGlzIGNoYW5nZT8gSSBpbW1lZGlhdGVseSBnbyB0aHJvdWdoIHRoZSBjb2RlLCBjaGVja2luZyBmb3IgYSBmZXcgY3J1Y2lhbCB0aGluZ3MuIEZpcnN0LCBpcyBgZXJyYCB1c2VkIGJlZm9yZSBpdCdzIHNldD8gVGhlIGFuc3dlciBpcyBubywgaXQncyBpbml0aWFsaXplZCB0byAwIGFuZCBhbHdheXMgYXNzaWduZWQgYSB2YWx1ZSBvbiBhbGwgcGF0aHMuIFNlY29uZCwgSSBsb29rIGZvciBhbnkgdW5pbml0aWFsaXplZCBzdGFjayBvciBoZWFwIGJ1ZmZlcnMgYmVpbmcgcmVhZCBpbiBjb25kaXRpb25hbHM7IHRoYXQncyBhIGNsYXNzaWMgS01TQU4gcGl0ZmFsbC4gTm90aGluZyBvZiB0aGF0IHNvcnQgaGVyZS5cblxuSSB2ZXJpZnkgdGhhdCBubyBrZXJuZWwgc3RydWN0dXJlcyBjb250YWluaW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmUgYmVpbmcgcGFzc2VkIHRvIHVzZXJzcGFjZTsgdGhpcyBpcyBhIHByaW1lIGNvbmNlcm4uIEFsc28sIG5vIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcy4gVGhlcmUncyBhbHNvIG5vIGNvbmNlcm4gb2YgcG90ZW50aWFsIGJvdW5kcy1jaGVjayBpc3N1ZXMgc2luY2UgYHJlbWFpbmluZ19wYWdlc190b3RhbGAsIGBwYWdlc190b193cml0ZV9pbl9wbWRgIGFuZCBgY3Vycl9wYWdlX2lkeGAgYXJlIGFsbCBzY2FsYXJzIHRoYXQgYXJlIGluaXRpYWxpemVkIHRvIHplcm8uXG5cbkknbSBjb25maWRlbnQgd2UncmUgaW4gdGhlIGNsZWFyLiBUaGUgY2hhbmdlcyBhcmUgcHVyZWx5IGludGVybmFsIE1NIGVycm9yIGhhbmRsaW5nLCBtb3N0bHkgcmVmYWN0b3JpbmcsIGFuZCBubyBuZXcgcmlza3MgYXJlIGludHJvZHVjZWQuIFRoZSBzdGFuZGFyZCBzYW5pdGl6ZXJzL0tBU0FOIHdpbGwgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgbWVtb3J5IG1hcHBpbmcgb3IgYWRkcmVzcyBjYWxjdWxhdGlvbiBpc3N1ZXMuIFRoZXJlZm9yZSwgdGhlIE5lZWRzS01TQU4gZmxhZyBpcyBjbGVhcmx5IGBmYWxzZWAuXG5cblNvLCB0aGUgS01TQU5SZWFzb25pbmcgaXMgc3RyYWlnaHRmb3J3YXJkOlxuXG4qICAgVGhlIHBhdGNoIHJlZmFjdG9ycyBlcnJvciByZXR1cm4gdmFyaWFibGVzIGluIGBpbnNlcnRfcGFnZXMoKWAgKGNvbnNvbGlkYXRpbmcgYHJldGAgYW5kIGBlcnJgIGludG8gYSBzaW5nbGUgYGVycmAgdmFyaWFibGUpLCBhbmQgbW9kaWZpZXMgZXJyb3IgY29kZSByZXR1cm4gd2hlbiBgd2Fsa190b19wbWRgIGZhaWxzLlxuKiAgIEtNU0FOIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzZXMsIG5vIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCB2YXJpYWJsZXMsIGFuZCBubyBpbmZvcm1hdGlvbiBsZWFrcyB0byB1c2VyIHNwYWNlLiBBbGwgcmVsZXZhbnQgdmFyaWFibGVzIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC5cbiogICBTdGFuZGFyZCBzYW5pdGl6ZXJzL0tBU0FOIGFyZSBzdWZmaWNpZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjQ1LCJPdXRwdXRUb2tlbnMiOjE2OCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY5NCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI5VDE3OjM5OjUyLjEzNzE5NDI0OVoiLCJTZXEiOjIyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIwNDEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaXMgYSByZWZhY3RvcmluZyBvZiBlcnJvciBjb2RlIGhhbmRsaW5nIGluIG1tL21lbW9yeS5jOmluc2VydF9wYWdlcygpLCB1bmlmeWluZyB0aGUgbG9jYWwgcmV0dXJuIHZhcmlhYmxlIGBlcnJgIChwcmV2aW91c2x5IGByZXRgIGFuZCBhIHNoYWRvd2VkIGBlcnJgKSBhbmQgY2hhbmdpbmcgdGhlIGVycm9yIGNvZGUgd2hlbiBgd2Fsa190b19wbWQoKWAgZmFpbHMgZnJvbSAtRUZBVUxUIHRvIC1FTk9NRU0uXFxuXFxuTm8gbmV3IGFsbG9jYXRpb25zLCB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgYnVmZmVycywgb3IgY29waWVzIHRvIHVzZXIgc3BhY2UgYXJlIGludHJvZHVjZWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgKGBlcnJgLCBgcmVtYWluaW5nX3BhZ2VzX3RvdGFsYCwgYGN1cnJfcGFnZV9pZHhgKSBhcmUgaW5pdGlhbGl6ZWQsIGFuZCBlcnJvciBjb2RlcyBhcmUgZXhwbGljaXRseSBhc3NpZ25lZCBiZWZvcmUgYW55IGp1bXAgdG8gdGhlIGV4aXQgbGFiZWwuIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBpbmZvcm1hdGlvbiBsZWFrIHJpc2tzIHRoYXQgd291bGQgcmVxdWlyZSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZy5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpcyBhIHJlZmFjdG9yaW5nIG9mIGVycm9yIGNvZGUgaGFuZGxpbmcgaW4gbW0vbWVtb3J5LmM6aW5zZXJ0X3BhZ2VzKCksIHVuaWZ5aW5nIHRoZSBsb2NhbCByZXR1cm4gdmFyaWFibGUgYGVycmAgKHByZXZpb3VzbHkgYHJldGAgYW5kIGEgc2hhZG93ZWQgYGVycmApIGFuZCBjaGFuZ2luZyB0aGUgZXJyb3IgY29kZSB3aGVuIGB3YWxrX3RvX3BtZCgpYCBmYWlscyBmcm9tIC1FRkFVTFQgdG8gLUVOT01FTS5cXG5cXG5ObyBuZXcgYWxsb2NhdGlvbnMsIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBidWZmZXJzLCBvciBjb3BpZXMgdG8gdXNlciBzcGFjZSBhcmUgaW50cm9kdWNlZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyAoYGVycmAsIGByZW1haW5pbmdfcGFnZXNfdG90YWxgLCBgY3Vycl9wYWdlX2lkeGApIGFyZSBpbml0aWFsaXplZCwgYW5kIGVycm9yIGNvZGVzIGFyZSBleHBsaWNpdGx5IGFzc2lnbmVkIGJlZm9yZSBhbnkganVtcCB0byB0aGUgZXhpdCBsYWJlbC4gVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGluZm9ybWF0aW9uIGxlYWsgcmlza3MgdGhhdCB3b3VsZCByZXF1aXJlIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[1] Phase: Succeeded StartedAt: 2026-08-29 17:40:03 +0000 UTC FinishedAt: 2026-08-29 17:40:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-29 17:40:03 +0000 UTC FinishedAt: 2026-08-29 17:40:03 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2] Phase: Succeeded StartedAt: 2026-08-29 17:40:03 +0000 UTC FinishedAt: 2026-08-29 21:20:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:40:03 +0000 UTC FinishedAt: 2026-08-29 21:20:57 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:40:03 +0000 UTC FinishedAt: 2026-08-29 17:40:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:40:03 +0000 UTC FinishedAt: 2026-08-29 17:40:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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-workflow8txnp/series-workflow8txnp-convert-artifact-4061637599/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:40:13 +0000 UTC FinishedAt: 2026-08-29 17:56:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:40:13 +0000 UTC FinishedAt: 2026-08-29 17:56:14 +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:*8d4b6290-4912-4de3-8b5f-1d0c99ae0644,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-workflow8txnp/series-workflow8txnp-convert-artifact-4061637599/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": "077ef8c3-488c-4efb-84d3-0ef1b2550753", "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-workflow8txnp/series-workflow8txnp-build-action-2133496037/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:40:13 +0000 UTC FinishedAt: 2026-08-29 17:56:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*8d4b6290-4912-4de3-8b5f-1d0c99ae0644,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-workflow8txnp/series-workflow8txnp-convert-artifact-4061637599/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": "077ef8c3-488c-4efb-84d3-0ef1b2550753", "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-workflow8txnp/series-workflow8txnp-build-action-2133496037/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:56:14 +0000 UTC FinishedAt: 2026-08-29 17:56:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:56:14 +0000 UTC FinishedAt: 2026-08-29 17:56:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:56:14 +0000 UTC FinishedAt: 2026-08-29 17:56:24 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:56:14 +0000 UTC FinishedAt: 2026-08-29 17:56:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-workflow8txnp/series-workflow8txnp-convert-artifact-2830694254/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:56:24 +0000 UTC FinishedAt: 2026-08-29 17:58:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:56:24 +0000 UTC FinishedAt: 2026-08-29 17:58:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*077ef8c3-488c-4efb-84d3-0ef1b2550753,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-workflow8txnp/series-workflow8txnp-build-action-2133496037/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-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:58:38 +0000 UTC FinishedAt: 2026-08-29 17:58:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:58:38 +0000 UTC FinishedAt: 2026-08-29 17:58:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:58:38 +0000 UTC FinishedAt: 2026-08-29 18:14:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:58:38 +0000 UTC FinishedAt: 2026-08-29 18:14:31 +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:*8d4b6290-4912-4de3-8b5f-1d0c99ae0644,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-workflow8txnp/series-workflow8txnp-convert-artifact-2830694254/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": "c1f0e076-5fe7-4a44-b09d-ffc7d8269928", "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-workflow8txnp/series-workflow8txnp-build-action-2665662594/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 17:58:38 +0000 UTC FinishedAt: 2026-08-29 18:14:21 +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:*8d4b6290-4912-4de3-8b5f-1d0c99ae0644,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-workflow8txnp/series-workflow8txnp-convert-artifact-2830694254/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": "c1f0e076-5fe7-4a44-b09d-ffc7d8269928", "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-workflow8txnp/series-workflow8txnp-build-action-2665662594/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:14:31 +0000 UTC FinishedAt: 2026-08-29 18:14:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:14:31 +0000 UTC FinishedAt: 2026-08-29 18:14:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:14:31 +0000 UTC FinishedAt: 2026-08-29 18:16:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:14:31 +0000 UTC FinishedAt: 2026-08-29 18:16:16 +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:*c1f0e076-5fe7-4a44-b09d-ffc7d8269928,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-workflow8txnp/series-workflow8txnp-build-action-2665662594/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-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:26 +0000 UTC FinishedAt: 2026-08-29 21:20:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:26 +0000 UTC FinishedAt: 2026-08-29 21:20:57 +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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"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:*077ef8c3-488c-4efb-84d3-0ef1b2550753,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*c1f0e076-5fe7-4a44-b09d-ffc7d8269928,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-workflow8txnp/series-workflow8txnp-build-action-2133496037/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-workflow8txnp/series-workflow8txnp-build-action-2665662594/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:26 +0000 UTC FinishedAt: 2026-08-29 18:16:37 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:26 +0000 UTC FinishedAt: 2026-08-29 18:16:31 +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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"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-workflow8txnp/series-workflow8txnp-convert-artifact-1395531027/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:26 +0000 UTC FinishedAt: 2026-08-29 18:16:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:26 +0000 UTC FinishedAt: 2026-08-29 18:16:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:27 +0000 UTC FinishedAt: 2026-08-29 18:16:27 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:37 +0000 UTC FinishedAt: 2026-08-29 21:20:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflow8txnp[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"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":["vm_insert_pages","vm_map_pages","vm_map_pages_zero"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"d2aad7fdcda7ae8a726926f2d6de7fe9e8ee7563","config_name":"upstream-apparmor-kasan.config","enable_configs":["MMU"],"series_id":"31bd6de3-cdbd-4337-bc8d-89fe8f5a1ab0","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-08-29 18:16:37 +0000 UTC FinishedAt: 2026-08-29 21:20:47 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*077ef8c3-488c-4efb-84d3-0ef1b2550753,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*c1f0e076-5fe7-4a44-b09d-ffc7d8269928,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-workflow8txnp/series-workflow8txnp-build-action-2133496037/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-workflow8txnp/series-workflow8txnp-build-action-2665662594/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-workflow8txnp/series-workflow8txnp-convert-artifact-1395531027/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,}