Name: series-workflow66rl2 Phase: Running StartedAt: 2026-07-14 19:24:53 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow66rl2[0] Phase: Running StartedAt: 2026-07-14 19:24:53 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow66rl2[0].run-triage Phase: Running StartedAt: 2026-07-14 19:24:53 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflow66rl2[0].run-triage(0) Phase: Running StartedAt: 2026-07-14 19:24:53 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "3b029c035b34bbc693405ddf759f0e9b920c27f1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "torvalds", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux", "commit_hash": "3b029c035b34bbc693405ddf759f0e9b920c27f1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "EXT4_FS" ], "series_id": "ba7224be-1b24-4155-b280-a66e67928293" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "ext4_ioctl_set_lufid", "ext4_dirdata_set_lufid", "ext4_dirdata_get", "ext4_dirdata_set", "ext4_lufid_snapshot", "ext4_insert_dentry_data", "ext4_init_new_dir_data", "dx_get_dx_info", "ext4_check_dx_root", "ext4_setent", "__ext4_add_entry" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": { "findings": [ "ec557d64-7b60-46c9-a0eb-feaa7a3eb2cd", "bb78d414-4cff-400b-aaf6-76d450b12cda", "f322e293-7a3f-469a-ae1f-677c84eb4c0f", "b1e2a550-a6c3-410a-ae53-ca1e5366cc94", "07c4f835-36f6-4535-a165-aa25c5af571c", "560b0247-7e29-4a4c-91b8-c73d275cb34f", "4f985230-30a8-4121-a401-377eb9ed5025" ] } } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQyPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0VYVDRfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtleHQ0X2lvY3RsX3NldF9sdWZpZCYjMzQ7LAogICAgJiMzNDtleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkJiMzNDssCiAgICAmIzM0O2V4dDRfZGlyZGF0YV9nZXQmIzM0OywKICAgICYjMzQ7ZXh0NF9kaXJkYXRhX3NldCYjMzQ7LAogICAgJiMzNDtleHQ0X2x1ZmlkX3NuYXBzaG90JiMzNDssCiAgICAmIzM0O2V4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhJiMzNDssCiAgICAmIzM0O2V4dDRfaW5pdF9uZXdfZGlyX2RhdGEmIzM0OywKICAgICYjMzQ7ZHhfZ2V0X2R4X2luZm8mIzM0OywKICAgICYjMzQ7ZXh0NF9jaGVja19keF9yb290JiMzNDssCiAgICAmIzM0O2V4dDRfc2V0ZW50JiMzNDssCiAgICAmIzM0O19fZXh0NF9hZGRfZW50cnkmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBleHQ0IGZlYXR1cmUgYGRpcmRhdGFgIChFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQSkgYW5kIGEgbmV3IGlvY3RsIGBFWFQ0X0lPQ19TRVRfTFVGSURgIHRvIGF0dGFjaCBMVUZJRCBkYXRhIHRvIGRpcmVjdG9yeSBlbnRyaWVzLiBJdCBtb2RpZmllcyBjb3JlIGRpcmVjdG9yeSBlbnRyeSBwYXJzaW5nLCBpbnNlcnRpb24sIHNwbGl0dGluZywgYW5kIHJlbmFtaW5nIGxvZ2ljIHRvIGhhbmRsZSB2YXJpYWJsZS1sZW5ndGggZGF0YSBhcHBlbmRlZCB0byBkaXJlY3RvcnkgZW50cmllcy4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBzaG91bGQgYmUgZnV6emVkLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQyPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgYjQ0MTU4ODE4Y2RiYmY4ZTIyODFhYjI4N2YxN2Q5NzFhNzZiYmZkZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgSnVsIDE0IDE5OjQyOjA1IDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZGlyLmMgYi9mcy9leHQ0L2Rpci5jXG5pbmRleCAxN2VkZDY3OGZhODdiOC4uNTBjNDhjNTBhMjlkODggMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2Rpci5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2Rpci5jXG5AQCAtODksMTYgJiM0Mzs4OSwxNSBAQCBpbnQgX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGxpbmUsXG4gXHRib29sIGZha2UgPSBpc19mYWtlX2Rpcl9lbnRyeShkZSk7XG4gXHRib29sIGhhc19jc3VtID0gZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGRpci1cdTAwM2VpX3NiKTtcbiBcbi1cdGlmICh1bmxpa2VseShybGVuIFx1MDAzYyBleHQ0X2Rpcl9yZWNfbGVuKDEsIGZha2UgPyBOVUxMIDogZGlyKSkpXG4mIzQzO1x0aWYgKHVubGlrZWx5KHJsZW4gXHUwMDNjIGV4dDRfZGlyZW50X3JlY19sZW4oMSwgZmFrZSA/IE5VTEwgOiBkaXIpKSlcbiBcdFx0ZXJyb3JfbXNnID0gXCYjMzQ7cmVjX2xlbiBpcyBzbWFsbGVyIHRoYW4gbWluaW1hbFwmIzM0OztcbiBcdGVsc2UgaWYgKHVubGlrZWx5KHJsZW4gJSA0ICE9IDApKVxuIFx0XHRlcnJvcl9tc2cgPSBcJiMzNDtyZWNfbGVuICUgNCAhPSAwXCYjMzQ7O1xuLVx0ZWxzZSBpZiAodW5saWtlbHkocmxlbiBcdTAwM2MgZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbixcbi1cdFx0XHRcdFx0XHRcdGZha2UgPyBOVUxMIDogZGlyKSkpXG4tXHRcdGVycm9yX21zZyA9IFwmIzM0O3JlY19sZW4gaXMgdG9vIHNtYWxsIGZvciBuYW1lX2xlblwmIzM0OztcbiBcdGVsc2UgaWYgKHVubGlrZWx5KG5leHRfb2Zmc2V0IFx1MDAzZSBzaXplKSlcbiBcdFx0ZXJyb3JfbXNnID0gXCYjMzQ7ZGlyZWN0b3J5IGVudHJ5IG92ZXJydW5cJiMzNDs7XG4tXHRlbHNlIGlmICh1bmxpa2VseShuZXh0X29mZnNldCBcdTAwM2Ugc2l6ZSAtIGV4dDRfZGlyX3JlY19sZW4oMSxcbiYjNDM7XHRlbHNlIGlmICh1bmxpa2VseShybGVuIFx1MDAzYyBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIHNpemUsIGZha2UgPyBOVUxMIDogZGlyKSkpXG4mIzQzO1x0XHRlcnJvcl9tc2cgPSBcJiMzNDtyZWNfbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtZV9sZW5cJiMzNDs7XG4mIzQzO1x0ZWxzZSBpZiAodW5saWtlbHkobmV4dF9vZmZzZXQgXHUwMDNlIHNpemUgLSBleHQ0X2RpcmVudF9yZWNfbGVuKDEsXG4gXHRcdFx0XHRcdFx0ICBoYXNfY3N1bSA/IE5VTEwgOiBkaXIpIFx1MDAyNlx1MDAyNlxuIFx0XHRcdCAgbmV4dF9vZmZzZXQgIT0gc2l6ZSkpXG4gXHRcdGVycm9yX21zZyA9IFwmIzM0O2RpcmVjdG9yeSBlbnRyeSB0b28gY2xvc2UgdG8gYmxvY2sgZW5kXCYjMzQ7O1xuQEAgLTI0NSw3ICYjNDM7MjQ0LDcgQEAgc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuIFx0XHRcdFx0ICogZmFpbHVyZSB3aWxsIGJlIGRldGVjdGVkIGluIHRoZVxuIFx0XHRcdFx0ICogZGlyZW50IHRlc3QgYmVsb3cuICovXG4gXHRcdFx0XHRpZiAoZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLFxuLVx0XHRcdFx0XHRzYi1cdTAwM2VzX2Jsb2Nrc2l6ZSkgXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSxcbiYjNDM7XHRcdFx0XHRcdHNiLVx1MDAzZXNfYmxvY2tzaXplKSBcdTAwM2MgZXh0NF9kaXJlbnRfcmVjX2xlbigxLFxuIFx0XHRcdFx0XHRcdFx0XHRcdGlub2RlKSlcbiBcdFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0XHRpICYjNDM7PSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sXG5AQCAtNDY4LDI3ICYjNDM7NDY3LDQzIEBAIHZvaWQgZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpwKVxuICAqIFRoZSBkZWNyeXB0ZWQgZmlsZW5hbWUgaXMgcGFzc2VkIGluIHZpYSBlbnRfbmFtZS4gIHBhcmFtZXRlci5cbiAgKi9cbiBpbnQgZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBoYXNoLFxuLVx0XHRcdCAgICAgX191MzIgbWlub3JfaGFzaCxcbiYjNDM7XHRcdFx0ICAgICBfX3UzMiBtaW5vcl9oYXNoLCBpbnQgYnVmX3NpemUsXG4gXHRcdFx0ICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQsXG4gXHRcdFx0ICAgIHN0cnVjdCBmc2NyeXB0X3N0ciAqZW50X25hbWUpXG4ge1xuIFx0c3RydWN0IHJiX25vZGUgKipwLCAqcGFyZW50ID0gTlVMTDtcbiBcdHN0cnVjdCBmbmFtZSAqZm5hbWUsICpuZXdfZm47XG4gXHRzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbztcbiYjNDM7XHRpbnQgZXh0cmFfZGF0YSA9IDA7XG4gXG4gXHRpbmZvID0gZGlyX2ZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIFx0cCA9IFx1MDAyNmluZm8tXHUwMDNlcm9vdC5yYl9ub2RlO1xuIFxuIFx0LyogQ3JlYXRlIGFuZCBhbGxvY2F0ZSB0aGUgZm5hbWUgc3RydWN0dXJlICovXG4tXHRuZXdfZm4gPSBremFsbG9jX2ZsZXgoKm5ld19mbiwgbmFtZSwgZW50X25hbWUtXHUwMDNlbGVuICYjNDM7IDEpO1xuJiM0MztcdGlmIChkaXJlbnQtXHUwMDNlZmlsZV90eXBlIFx1MDAyNiB+RVhUNF9GVF9NQVNLKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9XG4mIzQzO1x0XHRcdGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGlyZW50LVx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcbiYjNDM7XHRcdGV4dHJhX2RhdGEgPSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oZGlyZW50LCByZWNfbGVuKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIGV4dGFfZGF0YSBjb250YWlucyAmIzQzOzEgYnl0ZSBmb3IgTlVMTCAqL1xuJiM0MztcdG5ld19mbiA9IGt6YWxsb2NfZmxleCgqbmV3X2ZuLCBuYW1lLCBlbnRfbmFtZS1cdTAwM2VsZW4gJiM0MztcbiYjNDM7XHRcdFx0ICAgICAgKGV4dHJhX2RhdGEgPyBleHRyYV9kYXRhIDogMSkpO1xuIFx0aWYgKCFuZXdfZm4pXG4gXHRcdHJldHVybiAtRU5PTUVNO1xuIFx0bmV3X2ZuLVx1MDAzZWhhc2ggPSBoYXNoO1xuIFx0bmV3X2ZuLVx1MDAzZW1pbm9yX2hhc2ggPSBtaW5vcl9oYXNoO1xuIFx0bmV3X2ZuLVx1MDAzZWlub2RlID0gbGUzMl90b19jcHUoZGlyZW50LVx1MDAzZWlub2RlKTtcbi1cdG5ld19mbi1cdTAwM2VuYW1lX2xlbiA9IGVudF9uYW1lLVx1MDAzZWxlbjtcbiBcdG5ld19mbi1cdTAwM2VmaWxlX3R5cGUgPSBkaXJlbnQtXHUwMDNlZmlsZV90eXBlO1xuJiM0MztcdG5ld19mbi1cdTAwM2VuYW1lX2xlbiA9IGVudF9uYW1lLVx1MDAzZWxlbjtcbiBcdG1lbWNweShuZXdfZm4tXHUwMDNlbmFtZSwgZW50X25hbWUtXHUwMDNlbmFtZSwgZW50X25hbWUtXHUwMDNlbGVuKTtcbiYjNDM7XHRpZiAoZXh0cmFfZGF0YSlcbiYjNDM7XHRcdC8qIERpcmRhdGEgYnl0ZXMgbGllIHBhc3QgdGhlIF9fY291bnRlZF9ieShuYW1lX2xlbikgYm91bmQgYnV0XG4mIzQzO1x0XHQgKiB3aXRoaW4gdGhlIGt6YWxsb2NfZmxleCBhbGxvY2F0aW9uOyB1c2UgdW5zYWZlX21lbWNweSB0b1xuJiM0MztcdFx0ICogYXZvaWQgYSBGT1JUSUZZX1NPVVJDRSBmYWxzZSBwb3NpdGl2ZS4gKi9cbiYjNDM7XHRcdHVuc2FmZV9tZW1jcHkobmV3X2ZuLVx1MDAzZW5hbWUgJiM0MzsgZW50X25hbWUtXHUwMDNlbGVuLFxuJiM0MztcdFx0XHQgICAgICBkaXJlbnQtXHUwMDNlbmFtZSAmIzQzOyBkaXJlbnQtXHUwMDNlbmFtZV9sZW4sIGV4dHJhX2RhdGEsXG4mIzQzO1x0XHRcdCAgICAgIC8qIHdpdGhpbiBremFsbG9jX2ZsZXggYWxsb2NhdGlvbiAqLyk7XG4gXG4gXHR3aGlsZSAoKnApIHtcbiBcdFx0cGFyZW50ID0gKnA7XG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaFxuaW5kZXggYjM3YzEzNmVhM2FiMzMuLjE1ZDg4NWNmM2JkMDI1IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9leHQ0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvZXh0NC5oXG5AQCAtMTIyNyw2ICYjNDM7MTIyNyw3IEBAIHN0cnVjdCBleHQ0X2lub2RlX2luZm8ge1xuICNpZmRlZiBDT05GSUdfRlNfRU5DUllQVElPTlxuIFx0c3RydWN0IGZzY3J5cHRfaW5vZGVfaW5mbyAqaV9jcnlwdF9pbmZvO1xuICNlbmRpZlxuJiM0MztcdHZvaWQgKmlfZGlyZGF0YTtcbiB9O1xuIFxuIC8qXG5AQCAtMjMzNCw2ICYjNDM7MjMzNSw3IEBAIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GVU5DUyhjYXNlZm9sZCxcdFx0Q0FTRUZPTEQpXG4gXHRcdFx0XHRcdCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRkxFWF9CR3wgXFxcbiBcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FQV9JTk9ERXwgXFxcbiBcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9NTVAgfCBcXFxuJiM0MztcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBIHwgXFxcbiBcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9JTkxJTkVfREFUQSB8IFxcXG4gXHRcdFx0XHRcdCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRU5DUllQVCB8IFxcXG4gXHRcdFx0XHRcdCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfQ0FTRUZPTEQgfCBcXFxuQEAgLTI0NzIsMTAgJiM0MzsyNDc0LDggQEAgc3RhdGljIGlubGluZSBpbnQgZXh0NF9lbWVyZ2VuY3lfc3RhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiAgKiBTdHJ1Y3R1cmUgb2YgYSBkaXJlY3RvcnkgZW50cnlcbiAgKi9cbiAjZGVmaW5lIEVYVDRfTkFNRV9MRU4gMjU1XG4tLypcbi0gKiBCYXNlIGxlbmd0aCBvZiB0aGUgZXh0NCBkaXJlY3RvcnkgZW50cnkgZXhjbHVkaW5nIHRoZSBuYW1lIGxlbmd0aFxuLSAqL1xuLSNkZWZpbmUgRVhUNF9CQVNFX0RJUl9MRU4gKHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMikgLSBFWFQ0X05BTUVfTEVOKVxuJiM0MzsvKiBvZmZzZXRvZiBhdm9pZHMgc2l6ZW9mKCkmIzQzO3BhZGRpbmcgZ2l2aW5nIDkgaW5zdGVhZCBvZiB0aGUgY29ycmVjdCBvbi1kaXNrIDggKi9cbiYjNDM7I2RlZmluZSBFWFQ0X0JBU0VfRElSX0xFTiBvZmZzZXRvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiwgbmFtZSlcbiBcbiBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkge1xuIFx0X19sZTMyXHRpbm9kZTtcdFx0XHQvKiBJbm9kZSBudW1iZXIgKi9cbkBAIC0yNTU2LDYgJiM0MzsyNTU2LDYxIEBAIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsIHtcbiAjZGVmaW5lIEVYVDRfRlRfU1lNTElOS1x0XHQ3XG4gXG4gI2RlZmluZSBFWFQ0X0ZUX01BWFx0XHQ4XG4mIzQzOyNkZWZpbmUgRVhUNF9GVF9NQVNLXHRcdDB4ZlxuJiM0MztcbiYjNDM7I2lmIEVYVDRfRlRfTUFYIFx1MDAzZSBFWFQ0X0ZUX01BU0tcbiYjNDM7I2Vycm9yIFwmIzM0O2NvbmZsaWN0aW5nIEVYVDRfRlRfTUFYIGFuZCBFWFQ0X0ZUX01BU0tcJiMzNDtcbiYjNDM7I2VuZGlmXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBkX3R5cGUgaGFzIDQgdW51c2VkIGJpdHMsIHNvIGl0IGNhbiBob2xkIGZvdXIgdHlwZXMgb2YgZGF0YS4gVGhlc2UgZGlmZmVyZW50XG4mIzQzOyAqIHR5cGVzIG9mIGRhdGEgKGUuZy4gZnNjeXB0IGhhc2gsIGhpZ2ggMzIgYml0cyBvZiA2NC1iaXQgaW5vZGUgbnVtYmVyKSBjYW4gYmVcbiYjNDM7ICogc3RvcmVkLCBpbiBmbGFnIG9yZGVyLCBhZnRlciBmaWxlLW5hbWUgaW4gZXh0NCBkaXJlbnQuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZXNlIGZsYWdzIGFyZSBhZGRlZCB0byBkX3R5cGUgaWYgZXh0NCBkaXJlbnQgaGFzIGV4dHJhIGRhdGEgYWZ0ZXJcbiYjNDM7ICogZmlsZW5hbWUuIFRoaXMgZGF0YSBsZW5ndGggaXMgdmFyaWFibGUgYW5kIGxlbmd0aCBpcyBzdG9yZWQgaW4gZmlyc3QgYnl0ZVxuJiM0MzsgKiBvZiBkYXRhLiBEYXRhIHN0YXJ0cyBhZnRlciBmaWxlbmFtZSBOVUwgYnl0ZS5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgRVhUNF9ESVJFTlRfTFVGSURcdFx0MHgxMFxuJiM0MzsjZGVmaW5lIEVYVDRfRElSRU5UX0lOTzY0XHRcdDB4MjBcbiYjNDM7I2RlZmluZSBFWFQ0X0RJUkVOVF9DRkhBU0hcdFx0MHg0MFxuJiM0MztcbiYjNDM7c3RydWN0IGV4dDRfZmlkIHtcbiYjNDM7XHRjaGFyICAgIGZpZFsxNl07ICAgICAvKiAxMjgtYml0IHVuaXF1ZSBmaWxlIGlkZW50aWZpZXIgKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciB7XG4mIzQzO1x0LyogbGVuZ3RoIG9mIHRoaXMgaGVhZGVyICYjNDM7IHRoZSB3aG9sZSBkYXRhIGJsb2IgKi9cbiYjNDM7XHRfX3U4XHRkZGhfbGVuZ3RoO1xuJiM0Mzt9IF9fcGFja2VkO1xuJiM0MztcbiYjNDM7c3RydWN0IGV4dDRfZGlyZW50X2ZpZCB7XG4mIzQzO1x0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyIGRmX2hlYWRlcjtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9maWQgICAgICAgICAgICAgICAgZGZfZmlkW107XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEVYVDRfTFVGSURfTUFHSUMgICAgMHhBRDIwMDkwN1VMXG4mIzQzO3N0cnVjdCBleHQ0X2RlbnRyeV9wYXJhbSB7XG4mIzQzO1x0X191MzJcdFx0XHRlZHBfbWFnaWM7XHQvKiBFWFQ0X0xVRklEX01BR0lDICovXG4mIzQzO1x0c3RydWN0IGV4dDRfZGlyZW50X2ZpZFx0ZWRwX2RmaWQ7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCB7XG4mIzQzO1x0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyXHRkaF9oZWFkZXI7XG4mIzQzO1x0c3RydWN0IGV4dDRfZGlyX2VudHJ5X2hhc2hcdGRoX2hhc2g7XG4mIzQzO30gX19wYWNrZWQ7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lXG4mIzQzO3N0cnVjdCBleHQ0X2RpcmVudF9maWQgKmV4dDRfZGVudHJ5X2dldF9maWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcbiYjNDM7XHRcdFx0XHRcdCAgICBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKnApXG4mIzQzO3tcbiYjNDM7XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShzYikpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAocCBcdTAwMjZcdTAwMjYgcC1cdTAwM2VlZHBfbWFnaWMgPT0gRVhUNF9MVUZJRF9NQUdJQylcbiYjNDM7XHRcdHJldHVybiBcdTAwMjZwLVx1MDAzZWVkcF9kZmlkO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuIFxuICNkZWZpbmUgRVhUNF9GVF9ESVJfQ1NVTVx0MHhERVxuIFxuQEAgLTI1NzMsMTMgJiM0MzsyNjI4LDI2IEBAIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsIHtcbiAgKiBjYXNlZm9sZGVkIGFuZCBlbmNyeXB0ZWQgbmVlZCB0byBzdG9yZSB0aGUgaGFzaCBhcyB3ZWxsLCBzbyB3ZSBhZGQgcm9vbSBmb3JcbiAgKiBleHQ0X2V4dGVuZGVkX2Rpcl9lbnRyeV8yLiBGb3IgYWxsIGVudHJpZXMgcmVsYXRlZCB0byAmIzM5Oy4mIzM5OyBvciAmIzM5Oy4uJiMzOTsgeW91IHNob3VsZFxuICAqIHBhc3MgTlVMTCBmb3IgZGlyLCBhcyB0aG9zZSBlbnRyaWVzIGRvIG5vdCB1c2UgdGhlIGV4dHJhIGZpZWxkcy5cbiYjNDM7ICpcbiYjNDM7ICogRm9yIGRpcmVjdG9yaWVzIHdpdGggdGhlIGRpcmRhdGEgZmVhdHVyZSwgZXh0cmEgZGF0YSBtYXkgZm9sbG93IHRoZSBmaWxlbmFtZS5cbiYjNDM7ICogVXNlIGV4dDRfZGlyX2VudHJ5X2xlbigpIHRvIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeVxuJiM0MzsgKiBpbmNsdWRpbmcgYW55IGRpcmRhdGEsIG9yIGV4dDRfZGlyZW50X3JlY19sZW4oKSBkaXJlY3RseSB3aGVuIHRoZSB0b3RhbFxuJiM0MzsgKiBuYW1lX2xlbiAoaW5jbHVkaW5nIGRpcmRhdGEgbGVuZ3RoKSBpcyBhbHJlYWR5IGtub3duLlxuICAqL1xuLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV4dDRfZGlyX3JlY19sZW4oX191OCBuYW1lX2xlbixcbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXh0NF9kaXJlbnRfcmVjX2xlbih1bnNpZ25lZCBpbnQgbmFtZV9sZW4sXG4gXHRcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IGlub2RlICpkaXIpXG4ge1xuLVx0aW50IHJlY19sZW4gPSAobmFtZV9sZW4gJiM0MzsgOCAmIzQzOyBFWFQ0X0RJUl9ST1VORCk7XG4mIzQzO1x0dW5zaWduZWQgaW50IHJlY19sZW4gPSAobmFtZV9sZW4gJiM0MzsgOCAmIzQzOyBFWFQ0X0RJUl9ST1VORCk7XG4gXG4tXHRpZiAoZGlyIFx1MDAyNlx1MDAyNiBleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpXG4mIzQzO1x0LypcbiYjNDM7XHQgKiBXaXRob3V0IGRpcmRhdGEsIHRoZSBjYXNlZm9sZCYjNDM7ZnNjcnlwdCBoYXNoIGxpdmVzIGF0IGEgZml4ZWQgcG9zaXRpb25cbiYjNDM7XHQgKiBhZnRlciB0aGUgZmlsZW5hbWUgYW5kIG11c3QgYmUgcmVzZXJ2ZWQgZXhwbGljaXRseS4gIFdpdGggZGlyZGF0YSB0aGVcbiYjNDM7XHQgKiBoYXNoIGlzIHN0b3JlZCBhcyBhIENGSEFTSCBleHRlbnNpb24gYW5kIGlzIGFscmVhZHkgY291bnRlZCBpbiB0aGVcbiYjNDM7XHQgKiBuYW1lX2xlbiBhcmd1bWVudCAodmlhIGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbiksIHNvIGFkZGluZyBpdCBhZ2FpblxuJiM0MztcdCAqIHdvdWxkIGRvdWJsZS1jb3VudC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoZGlyIFx1MDAyNlx1MDAyNiBleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgICFleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVx1MDAzZWlfc2IpKVxuIFx0XHRyZWNfbGVuICYjNDM7PSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X2hhc2gpO1xuIFx0cmV0dXJuIChyZWNfbGVuIFx1MDAyNiB+RVhUNF9ESVJfUk9VTkQpO1xuIH1cbkBAIC0yNjY3LDYgJiM0MzsyNzM1LDggQEAgc3RydWN0IGV4dDRfZmlsZW5hbWUge1xuICNpZiBJU19FTkFCTEVEKENPTkZJR19VTklDT0RFKVxuIFx0c3RydWN0IHFzdHIgY2ZfbmFtZTtcbiAjZW5kaWZcbiYjNDM7XHQvKiBMVUZJRC9kaXJkYXRhIHBheWxvYWQgdG8gZW1iZWQgaW4gdGhlIG5ldyBkaXJlY3RvcnkgZW50cnksIG9yIE5VTEwgKi9cbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkZmlkO1xuIH07XG4gXG4gI2RlZmluZSBmbmFtZV9uYW1lKHApICgocCktXHUwMDNlZGlza19uYW1lLm5hbWUpXG5AQCAtMjk3OCwxOCAmIzQzOzMwNDgsMjcgQEAgZXh0ZXJuIGludCBfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3QgaW5vZGUgKixcbiBcdHVubGlrZWx5KF9fZXh0NF9jaGVja19kaXJfZW50cnkoX19mdW5jX18sIF9fTElORV9fLCAoZGlyKSwgKGZpbHApLCBcXFxuIFx0XHRcdFx0KGRlKSwgKGJoKSwgKGJ1ZiksIChzaXplKSwgKG9mZnNldCkpKVxuIGV4dGVybiBpbnQgZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBoYXNoLFxuLVx0XHRcdFx0X191MzIgbWlub3JfaGFzaCxcbiYjNDM7XHRcdFx0XHRfX3UzMiBtaW5vcl9oYXNoLCBpbnQgYnVmX3NpemUsXG4gXHRcdFx0XHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlyZW50LFxuIFx0XHRcdFx0c3RydWN0IGZzY3J5cHRfc3RyICplbnRfbmFtZSk7XG4gZXh0ZXJuIHZvaWQgZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpwKTtcbiBleHRlcm4gaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuIFx0XHRcdCAgICAgdm9pZCAqYnVmLCBpbnQgYnVmX3NpemUsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tXHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmRlc3RfZGUpO1xuLXZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcbi1cdFx0XHRpbnQgYnVmX3NpemUsXG4tXHRcdFx0c3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lKTtcbiYjNDM7XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmRlc3RfZGUsXG4mIzQzO1x0XHRcdCAgICAgaW50IGRsZW4pO1xuJiM0Mzt2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuJiM0MztcdFx0XHQgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcbiYjNDM7XHRcdFx0ICAgICBpbnQgYnVmX3NpemUsXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuJiM0MztcdFx0XHQgICAgIHZvaWQgKmRhdGEpO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuJiM0MztcdFx0XHRcdCAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcbiYjNDM7XHRcdFx0XHQgICAgICBpbnQgYnVmX3NpemUsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lKVxuJiM0Mzt7XG4mIzQzO1x0ZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEoZGlyLCBpbm9kZSwgZGUsIGJ1Zl9zaXplLCBmbmFtZSwgTlVMTCk7XG4mIzQzO31cbiBzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF91cGRhdGVfZHhfZmxhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIHtcbiBcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9kaXJfaW5kZXgoaW5vZGUtXHUwMDNlaV9zYikgXHUwMDI2XHUwMDI2XG5AQCAtMzAwMywxMiAmIzQzOzMwODIsMTQgQEAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXh0NF9maWxldHlwZV90YWJsZVtdID0ge1xuIFx0RFRfVU5LTk9XTiwgRFRfUkVHLCBEVF9ESVIsIERUX0NIUiwgRFRfQkxLLCBEVF9GSUZPLCBEVF9TT0NLLCBEVF9MTktcbiB9O1xuIFxuLXN0YXRpYyBpbmxpbmUgIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSlcbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGdldF9kdHlwZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmlsZXR5cGUpXG4ge1xuLVx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2ZpbGV0eXBlKHNiKSB8fCBmaWxldHlwZSBcdTAwM2U9IEVYVDRfRlRfTUFYKVxuJiM0MztcdHVuc2lnbmVkIGNoYXIgZmxfaW5kZXggPSBmaWxldHlwZSBcdTAwMjYgRVhUNF9GVF9NQVNLO1xuJiM0MztcbiYjNDM7XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoc2IpIHx8IGZsX2luZGV4IFx1MDAzZT0gRVhUNF9GVF9NQVgpXG4gXHRcdHJldHVybiBEVF9VTktOT1dOO1xuIFxuLVx0cmV0dXJuIGV4dDRfZmlsZXR5cGVfdGFibGVbZmlsZXR5cGVdO1xuJiM0MztcdHJldHVybiBleHQ0X2ZpbGV0eXBlX3RhYmxlW2ZsX2luZGV4XTtcbiB9XG4gZXh0ZXJuIGludCBleHQ0X2NoZWNrX2FsbF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbiBcdFx0XHQgICAgIHZvaWQgKmJ1ZiwgaW50IGJ1Zl9zaXplKTtcbkBAIC0zMjMxLDEwICYjNDM7MzMxMiwxOCBAQCBleHRlcm4gaW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICopO1xuIGV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcbiBcbiAvKiBuYW1laS5jICovXG4tZXh0ZXJuIGludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbi1cdFx0XHQgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuJiM0MztleHRlcm4gaW50IGV4dDRfaW5pdF9uZXdfZGlyX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4mIzQzO1x0XHRcdFx0ICBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuJiM0MztcdFx0XHRcdCAgY29uc3Qgdm9pZCAqZGF0YTEsIGNvbnN0IHZvaWQgKmRhdGEyKTtcbiYjNDM7c3RhdGljIGlubGluZSBpbnQgZXh0NF9pbml0X25ld19kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4mIzQzO1x0XHRcdFx0ICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gZXh0NF9pbml0X25ld19kaXJfZGF0YShoYW5kbGUsIGRpciwgaW5vZGUsIE5VTEwsIE5VTEwpO1xuJiM0Mzt9XG4gZXh0ZXJuIGludCBleHQ0X2RpcmJsb2NrX2NzdW1fdmVyaWZ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRcdFx0XHQgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpO1xuJiM0MztleHRlcm4gaW50IGV4dDRfZGlyZGF0YV9zZXRfbHVmaWQoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLFxuJiM0MztcdFx0XHQgICBpbnQgbmFtZWxlbiwgc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICplZHApO1xuIGV4dGVybiBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLFxuIFx0XHRcdFx0X191MzIgc3RhcnRfbWlub3JfaGFzaCwgX191MzIgKm5leHRfaGFzaCk7XG4gZXh0ZXJuIGludCBleHQ0X3NlYXJjaF9kaXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbkBAIC0zODA3LDYgJiM0MzszODk2LDEwIEBAIGV4dGVybiBpbnQgX19leHQ0X3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKmRfbmFtZSxcbiBcdFx0XHQgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTtcbiBleHRlcm4gaW50IF9fZXh0NF9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHQgICAgICAgY29uc3Qgc3RydWN0IHFzdHIgKmRfbmFtZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTtcbiYjNDM7ZXh0ZXJuIHVuc2lnbmVkIGNoYXIgZXh0NF9kaXJkYXRhX2dldChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIGludCBidWZfc2l6ZSxcbiYjNDM7XHRcdFx0XHQgICAgICBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICAqbHVmaWQsXG4mIzQzO1x0XHRcdFx0ICAgICAgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8pO1xuIFxuICNkZWZpbmUgU19TSElGVCAxMlxuIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGV4dDRfdHlwZV9ieV9tb2RlWyhTX0lGTVQgXHUwMDNlXHUwMDNlIFNfU0hJRlQpICYjNDM7IDFdID0ge1xuQEAgLTQwMDQsNiAmIzQzOzQwOTcsMTA5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2NsZWFyX2lvX3Vud3JpdHRlbl9mbGFnKGV4dDRfaW9fZW5kX3QgKmlvX2VuZClcbiBcdFx0aW9fZW5kLVx1MDAzZWZsYWcgXHUwMDI2PSB+RVhUNF9JT19FTkRfVU5XUklUVEVOO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogQWR2YW5jZSB0byB0aGUgbmV4dCBkaXJkYXRhIHJlY29yZCBoZWFkZXIgc3RhcnRpbmcgZnJvbSBAZGRoLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBleHQ0X2RpcmRhdGFfbmV4dChkZGgpIFxcXG4mIzQzO1x0KChzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIgKikoKGNoYXIgKikoZGRoKSAmIzQzOyAoZGRoKS1cdTAwM2VkZGhfbGVuZ3RoKSlcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIGV4dDRfZGlyX2VudHJ5X2lzX3RhaWwoKSAtIENoZWNrIGlmIGEgZGlyZWN0b3J5IGVudHJ5IGlzIGEgdGFpbCBlbnRyeS5cbiYjNDM7ICogQGRlOiBkaXJlY3RvcnkgZW50cnkgdG8gY2hlY2tcbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJucyB0cnVlIGlmIEBkZSBpcyBhIGRpcmVjdG9yeSBibG9jayB0YWlsIGVudHJ5IChjaGVja3N1bSByZWNvcmQpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIGV4dDRfZGlyX2VudHJ5X2lzX3RhaWwoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKnQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKilkZTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuICF0LVx1MDAzZWRldF9yZXNlcnZlZF96ZXJvMSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgbGUxNl90b19jcHUodC1cdTAwM2VkZXRfcmVjX2xlbikgPT0gc2l6ZW9mKCp0KSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgICAgIXQtXHUwMDNlZGV0X3Jlc2VydmVkX3plcm8yIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAgICB0LVx1MDAzZWRldF9yZXNlcnZlZF9mdCA9PSBFWFQ0X0ZUX0RJUl9DU1VNO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oKSAtIENvbXB1dGUgdGhlIHRvdGFsIGRpcmRhdGEgbGVuZ3RoIGZvciBhbiBlbnRyeS5cbiYjNDM7ICogQGRlOiBkaXJlY3RvcnkgZW50cnlcbiYjNDM7ICogQHJlY19sZW46IHRoZSByZWNvcmQgbGVuZ3RoIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkgKGRlY29kZWQpXG4mIzQzOyAqXG4mIzQzOyAqIENvbXB1dGVzIHRoZSBsZW5ndGggb2Ygb3B0aW9uYWwgZGF0YSBzdG9yZWQgYWZ0ZXIgdGhlIGZpbGVuYW1lIChhbmQgaXRzXG4mIzQzOyAqIGltcGxpY2l0IE5VTCB0ZXJtaW5hdG9yKS4gIEVhY2ggZXh0ZW5zaW9uIGlzIGluZGljYXRlZCBieSBhIGJpdCBpbiB0aGVcbiYjNDM7ICogaGlnaCA0IGJpdHMgb2YgZGUtXHUwMDNlZmlsZV90eXBlOyB0aGUgZmlyc3QgYnl0ZSBvZiBlYWNoIGV4dGVuc2lvbiBpcyBpdHNcbiYjNDM7ICogbGVuZ3RoIChpbmNsdWRpbmcgdGhhdCBsZW5ndGggYnl0ZSBpdHNlbGYpLlxuJiM0MzsgKlxuJiM0MzsgKiBSZXR1cm5zIDAgZm9yIHRhaWwgZW50cmllcyBhbmQgZm9yIGVudHJpZXMgd2l0aCBubyBkaXJkYXRhLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSBpbnQgZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcbiYjNDM7XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGludCByZWNfbGVuKVxuJiM0Mzt7XG4mIzQzO1x0X191OCBleHRyYV9kYXRhX2ZsYWdzO1xuJiM0MztcdHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqZGRoO1xuJiM0MztcdGludCBkbGVuID0gMDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgb2Zmc2V0O1xuJiM0MztcbiYjNDM7XHRpZiAoZXh0NF9kaXJfZW50cnlfaXNfdGFpbChkZSkpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0ZXh0cmFfZGF0YV9mbGFncyA9IChkZS1cdTAwM2VmaWxlX3R5cGUgXHUwMDI2IH5FWFQ0X0ZUX01BU0spIFx1MDAzZVx1MDAzZSA0O1xuJiM0MztcdC8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGVudHJ5IHRvIGFmdGVyIGZpbGVuYW1lICYjNDM7IE5VTCAqL1xuJiM0MztcdG9mZnNldCA9IEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRlLVx1MDAzZW5hbWVfbGVuICYjNDM7IDE7XG4mIzQzO1xuJiM0MztcdC8qIGJvdW5kcyBjaGVjazogZW5zdXJlIHdlIHN0YXJ0IHJlYWRpbmcgd2l0aGluIHRoZSBlbnRyeSAqL1xuJiM0MztcdGlmIChvZmZzZXQgXHUwMDNlPSByZWNfbGVuKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdGRkaCA9IChzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIgKikoKGNoYXIgKilkZSAmIzQzOyBvZmZzZXQpO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZXh0cmFfZGF0YV9mbGFncykge1xuJiM0MztcdFx0aWYgKGV4dHJhX2RhdGFfZmxhZ3MgXHUwMDI2IDEpIHtcbiYjNDM7XHRcdFx0LyogYm91bmRzIGNoZWNrIGJlZm9yZSByZWFkaW5nIGRkaF9sZW5ndGggKi9cbiYjNDM7XHRcdFx0aWYgKG9mZnNldCAmIzQzOyBzaXplb2YoKmRkaCkgXHUwMDNlIHJlY19sZW4pXG4mIzQzO1x0XHRcdFx0cmV0dXJuIGRsZW47XG4mIzQzO1xuJiM0MztcdFx0XHQvKiB2YWxpZGF0ZSBkZGhfbGVuZ3RoIGlzIHJlYXNvbmFibGUg4oCUIHJlYWQgb25jZSB0b1xuJiM0MztcdFx0XHQgKiBhdm9pZCBhIFRPQ1RPVSBkb3VibGUtZmV0Y2ggb24gdGhlIGRpc2sgZmllbGQgKi9cbiYjNDM7XHRcdFx0e1xuJiM0MztcdFx0XHRcdHU4IGRkaF9sZW4gPSBkZGgtXHUwMDNlZGRoX2xlbmd0aDtcbiYjNDM7XG4mIzQzO1x0XHRcdFx0aWYgKGRkaF9sZW4gPT0gMCB8fCBkZGhfbGVuIFx1MDAzZSByZWNfbGVuIC0gb2Zmc2V0KVxuJiM0MztcdFx0XHRcdFx0cmV0dXJuIGRsZW47XG4mIzQzO1x0XHRcdFx0ZGxlbiAmIzQzOz0gZGRoX2xlbiAmIzQzOyAoZGxlbiA9PSAwKTtcbiYjNDM7XHRcdFx0XHRvZmZzZXQgJiM0Mzs9IGRkaF9sZW47XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdFx0ZGRoID0gZXh0NF9kaXJkYXRhX25leHQoZGRoKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGV4dHJhX2RhdGFfZmxhZ3MgXHUwMDNlXHUwMDNlPSAxO1xuJiM0MztcdH1cbiYjNDM7XHRyZXR1cm4gZGxlbjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogZXh0NF9kaXJfZW50cnlfbGVuKCkgLSBDb21wdXRlIHRoZSByZXF1aXJlZCByZWNfbGVuIGZvciBhIGRpcmVjdG9yeSBlbnRyeS5cbiYjNDM7ICogQGRlOiAgICAgICAgZGlyZWN0b3J5IGVudHJ5ICh1c2VkIHRvIHJlYWQgbmFtZV9sZW4gYW5kIGFueSBkaXJkYXRhIGxlbmd0aClcbiYjNDM7ICogQGJsb2Nrc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIEBkZSBsaXZlcyBpbiAodGhlIHJlYWwgZGlyZWN0b3J5IGJsb2NrXG4mIzQzOyAqICAgICAgICAgICAgIHNpemUsIG9yIHRoZSBzbWFsbGVyIGlubGluZS1kYXRhIGJ1ZmZlciBzaXplIGZvciBpbmxpbmVcbiYjNDM7ICogICAgICAgICAgICAgZGlyZWN0b3JpZXMpIC0tIHVzZWQgb25seSB0byBkZWNvZGUgQGRlLVx1MDAzZXJlY19sZW4mIzM5O3MgXCYjMzQ7MC82NTUzNVxuJiM0MzsgKiAgICAgICAgICAgICBtZWFucyByZXN0IG9mIGJ1ZmZlclwmIzM0OyBzZW50aW5lbCBjb3JyZWN0bHkuXG4mIzQzOyAqIEBkaXI6ICAgICAgIGRpcmVjdG9yeSBpbm9kZSAobWF5IGJlIE5VTEwgZm9yICYjMzk7LiYjMzk7IGFuZCAmIzM5Oy4uJiMzOTsgZW50cmllcywgd2hpY2hcbiYjNDM7ICogICAgICAgICAgICAgbmV2ZXIgY2FycnkgdGhlIGNhc2Vmb2xkJiM0Mztmc2NyeXB0IGhhc2ggcmVnYXJkbGVzcyBvZiB0aGVcbiYjNDM7ICogICAgICAgICAgICAgZGlyZWN0b3J5JiMzOTtzIGZlYXR1cmUgZmxhZ3MpXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgdGhlIG1pbmltdW0gcmVjb3JkIGxlbmd0aCBuZWVkZWQgdG8gaG9sZCBAZGUsIHJvdW5kZWQgdXAgdG8gdGhlXG4mIzQzOyAqIGRpcmVjdG9yeSBhbGlnbm1lbnQgYW5kIGluY2x1ZGluZyByb29tIGZvciB0aGUgY2FzZWZvbGQmIzQzO2ZzY3J5cHQgaGFzaCBpZlxuJiM0MzsgKiB0aGUgZGlyZWN0b3J5IHJlcXVpcmVzIGl0LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXh0NF9kaXJfZW50cnlfbGVuKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIHVuc2lnbmVkIGludCBibG9ja3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpcilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpO1xuJiM0MztcdHVuc2lnbmVkIGludCBkaXJkYXRhID0gZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKGRlLCByZWNfbGVuKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGV4dDRfZGlyZW50X3JlY19sZW4oZGUtXHUwMDNlbmFtZV9sZW4gJiM0MzsgZGlyZGF0YSwgZGlyKTtcbiYjNDM7fVxuJiM0MztcbiBleHRlcm4gY29uc3Qgc3RydWN0IGlvbWFwX29wcyBleHQ0X2lvbWFwX29wcztcbiBleHRlcm4gY29uc3Qgc3RydWN0IGlvbWFwX29wcyBleHQ0X2lvbWFwX3JlcG9ydF9vcHM7XG4gXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG5pbmRleCA4ZTIyNTk3OTk2MTRlOS4uMDA2ZDQ1ZTljZTg3OTggMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuQEAgLTI2OTcsNiAmIzQzOzI2OTcsNyBAQCBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZjX2luZWxpZ2libGVfcmVhc29uc1tdID0ge1xuIFx0W0VYVDRfRkNfUkVBU09OX01JR1JBVEVdID0gXCYjMzQ7SW5vZGUgZm9ybWF0IG1pZ3JhdGlvblwmIzM0OyxcbiBcdFtFWFQ0X0ZDX1JFQVNPTl9WRVJJVFldID0gXCYjMzQ7ZnMtdmVyaXR5IGVuYWJsZVwmIzM0OyxcbiBcdFtFWFQ0X0ZDX1JFQVNPTl9NT1ZFX0VYVF0gPSBcJiMzNDtNb3ZlIGV4dGVudHNcJiMzNDssXG4mIzQzO1x0W0VYVDRfRkNfUkVBU09OX0RJUkRBVEFdID0gXCYjMzQ7RGlyZGF0YSBMVUZJRCAobm90IHJlY29yZGVkIGJ5IGZhc3QtY29tbWl0KVwmIzM0OyxcbiB9O1xuIFxuIGludCBleHQ0X2ZjX2luZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmggYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmhcbmluZGV4IDJmNzdhMzdmYjEwMTgwLi44OTlmYWViNGU2ZTA2NCAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5oXG5AQCAtMTAwLDYgJiM0MzsxMDAsNyBAQCBlbnVtIHtcbiBcdEVYVDRfRkNfUkVBU09OX01JR1JBVEUsXG4gXHRFWFQ0X0ZDX1JFQVNPTl9WRVJJVFksXG4gXHRFWFQ0X0ZDX1JFQVNPTl9NT1ZFX0VYVCxcbiYjNDM7XHRFWFQ0X0ZDX1JFQVNPTl9ESVJEQVRBLFxuIFx0RVhUNF9GQ19SRUFTT05fTUFYXG4gfTtcbiBcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuY1xuaW5kZXggODA0NWU0ZmYyNzBjN2YuLjFiYmY4OWUxODA3NmY0IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9pbmxpbmUuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuY1xuQEAgLTk3MywxMSAmIzQzOzk3MywyMCBAQCBzdGF0aWMgaW50IGV4dDRfYWRkX2RpcmVudF90b19pbmxpbmUoaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRcdCAgICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYyxcbiBcdFx0XHRcdCAgICAgdm9pZCAqaW5saW5lX3N0YXJ0LCBpbnQgaW5saW5lX3NpemUpXG4ge1xuLVx0aW50XHRcdGVycjtcbiYjNDM7XHRpbnRcdFx0ZXJyLCBkbGVuID0gMDtcbiBcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkZmlkID0gTlVMTDtcbiYjNDM7XG4mIzQzO1x0LyogZm5hbWUtXHUwMDNlZGZpZCB3YXMgc2V0IGluIGV4dDRfYWRkX2VudHJ5KCkgKi9cbiYjNDM7XHRkZmlkID0gZm5hbWUtXHUwMDNlZGZpZDtcbiYjNDM7XHRpZiAoZGZpZClcbiYjNDM7XHRcdGRsZW4gPSBkZmlkLVx1MDAzZWRmX2hlYWRlci5kZGhfbGVuZ3RoO1xuJiM0MztcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShkaXItXHUwMDNlaV9zYikpXG4mIzQzO1x0XHRkbGVuICYjNDM7PSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyZW50X2hhc2gpO1xuIFxuIFx0ZXJyID0gZXh0NF9maW5kX2Rlc3RfZGUoZGlyLCBpbG9jLVx1MDAzZWJoLCBpbmxpbmVfc3RhcnQsXG4tXHRcdFx0XHRpbmxpbmVfc2l6ZSwgZm5hbWUsIFx1MDAyNmRlKTtcbiYjNDM7XHRcdFx0XHRpbmxpbmVfc2l6ZSwgZm5hbWUsIFx1MDAyNmRlLCBkbGVuKTtcbiBcdGlmIChlcnIpXG4gXHRcdHJldHVybiBlcnI7XG4gXG5AQCAtOTg2LDcgJiM0Mzs5OTUsNyBAQCBzdGF0aWMgaW50IGV4dDRfYWRkX2RpcmVudF90b19pbmxpbmUoaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRcdFx0ICAgIEVYVDRfSlRSX05PTkUpO1xuIFx0aWYgKGVycilcbiBcdFx0cmV0dXJuIGVycjtcbi1cdGV4dDRfaW5zZXJ0X2RlbnRyeShkaXIsIGlub2RlLCBkZSwgaW5saW5lX3NpemUsIGZuYW1lKTtcbiYjNDM7XHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgaW5saW5lX3NpemUsIGZuYW1lLCBkZmlkKTtcbiBcbiBcdGV4dDRfc2hvd19pbmxpbmVfZGlyKGRpciwgaWxvYy1cdTAwM2ViaCwgaW5saW5lX3N0YXJ0LCBpbmxpbmVfc2l6ZSk7XG4gXG5AQCAtMTA1NSw3ICYjNDM7MTA2NCw3IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdGludCBvbGRfc2l6ZSA9IEVYVDRfSShkaXIpLVx1MDAzZWlfaW5saW5lX3NpemUgLSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xuIFx0aW50IG5ld19zaXplID0gZ2V0X21heF9pbmxpbmVfeGF0dHJfdmFsdWVfc2l6ZShkaXIsIGlsb2MpO1xuIFxuLVx0aWYgKG5ld19zaXplIC0gb2xkX3NpemUgXHUwMDNjPSBleHQ0X2Rpcl9yZWNfbGVuKDEsIE5VTEwpKVxuJiM0MztcdGlmIChuZXdfc2l6ZSAtIG9sZF9zaXplIFx1MDAzYz0gZXh0NF9kaXJlbnRfcmVjX2xlbigxLCBOVUxMKSlcbiBcdFx0cmV0dXJuIC1FTk9TUEM7XG4gXG4gXHRyZXQgPSBleHQ0X3VwZGF0ZV9pbmxpbmVfZGF0YShoYW5kbGUsIGRpcixcbkBAIC0xMjY0LDYgJiM0MzsxMjczLDcgQEAgaW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxuIFx0aW50IGVyciA9IDAsIGNvdW50ID0gMDtcbiBcdHVuc2lnbmVkIGludCBwYXJlbnRfaW5vO1xuIFx0aW50IHBvcztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgZGVfbGVuO1xuIFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlO1xuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZGlyX2ZpbGUpO1xuIFx0aW50IHJldCwgaW5saW5lX3NpemUgPSAwO1xuQEAgLTEzMDksNyAmIzQzOzEzMTksNyBAQCBpbnQgZXh0NF9pbmxpbmVkaXJfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXG4gXHRcdFx0ZmFrZS5uYW1lX2xlbiA9IDE7XG4gXHRcdFx0bWVtY3B5KGZha2UubmFtZSwgXCYjMzQ7LlwmIzM0OywgMik7XG4gXHRcdFx0ZmFrZS5yZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soXG4tXHRcdFx0XHRcdCAgZXh0NF9kaXJfcmVjX2xlbihmYWtlLm5hbWVfbGVuLCBOVUxMKSxcbiYjNDM7XHRcdFx0XHRcdCAgZXh0NF9kaXJlbnRfcmVjX2xlbihmYWtlLm5hbWVfbGVuLCBOVUxMKSxcbiBcdFx0XHRcdFx0ICBpbmxpbmVfc2l6ZSk7XG4gXHRcdFx0ZXh0NF9zZXRfZGVfdHlwZShpbm9kZS1cdTAwM2VpX3NiLCBcdTAwMjZmYWtlLCBTX0lGRElSKTtcbiBcdFx0XHRkZSA9IFx1MDAyNmZha2U7XG5AQCAtMTMxOSwyNiAmIzQzOzEzMjksMzQgQEAgaW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxuIFx0XHRcdGZha2UubmFtZV9sZW4gPSAyO1xuIFx0XHRcdG1lbWNweShmYWtlLm5hbWUsIFwmIzM0Oy4uXCYjMzQ7LCAzKTtcbiBcdFx0XHRmYWtlLnJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhcbi1cdFx0XHRcdFx0ICBleHQ0X2Rpcl9yZWNfbGVuKGZha2UubmFtZV9sZW4sIE5VTEwpLFxuJiM0MztcdFx0XHRcdFx0ICBleHQ0X2RpcmVudF9yZWNfbGVuKGZha2UubmFtZV9sZW4sIE5VTEwpLFxuIFx0XHRcdFx0XHQgIGlubGluZV9zaXplKTtcbiBcdFx0XHRleHQ0X3NldF9kZV90eXBlKGlub2RlLVx1MDAzZWlfc2IsIFx1MDAyNmZha2UsIFNfSUZESVIpO1xuIFx0XHRcdGRlID0gXHUwMDI2ZmFrZTtcbiBcdFx0XHRwb3MgPSBFWFQ0X0lOTElORV9ET1RET1RfU0laRTtcbiBcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0aWYgKHBvcyAmIzQzOyBFWFQ0X0JBU0VfRElSX0xFTiBcdTAwM2UgaW5saW5lX3NpemUpIHtcbiYjNDM7XHRcdFx0XHRyZXQgPSBjb3VudDtcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdFx0fVxuIFx0XHRcdGRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKGRpcl9idWYgJiM0MzsgcG9zKTtcbi1cdFx0XHRwb3MgJiM0Mzs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbiwgaW5saW5lX3NpemUpO1xuJiM0MztcdFx0XHRkZV9sZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sIGlubGluZV9zaXplKTtcbiYjNDM7XHRcdFx0aWYgKGRlX2xlbiBcdTAwM2MgRVhUNF9CQVNFX0RJUl9MRU4gfHxcbiYjNDM7XHRcdFx0ICAgIHBvcyAmIzQzOyBkZV9sZW4gXHUwMDNlICh1bnNpZ25lZCBpbnQpaW5saW5lX3NpemUpIHtcbiYjNDM7XHRcdFx0XHRyZXQgPSBjb3VudDtcbiYjNDM7XHRcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdFx0fVxuIFx0XHRcdGlmIChleHQ0X2NoZWNrX2Rpcl9lbnRyeShpbm9kZSwgZGlyX2ZpbGUsIGRlLFxuIFx0XHRcdFx0XHQgaWxvYy5iaCwgZGlyX2J1ZixcbiBcdFx0XHRcdFx0IGlubGluZV9zaXplLCBwb3MpKSB7XG4gXHRcdFx0XHRyZXQgPSBjb3VudDtcbiBcdFx0XHRcdGdvdG8gb3V0O1xuIFx0XHRcdH1cbiYjNDM7XHRcdFx0cG9zICYjNDM7PSBkZV9sZW47XG4gXHRcdH1cbiBcbi1cdFx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkge1xuLVx0XHRcdGhpbmZvLVx1MDAzZWhhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTtcbi1cdFx0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gRVhUNF9ESVJFTlRfTUlOT1JfSEFTSChkZSk7XG4tXHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRpZiAoIShleHQ0X2RpcmRhdGFfZ2V0KGRlLCBkaXIsIGlubGluZV9zaXplLCBOVUxMLCBoaW5mbykgXHUwMDI2XG4mIzQzO1x0XHRcdFx0XHRcdFx0RVhUNF9ESVJFTlRfQ0ZIQVNIKSkge1xuIFx0XHRcdGVyciA9IGV4dDRmc19kaXJoYXNoKGRpciwgZGUtXHUwMDNlbmFtZSwgZGUtXHUwMDNlbmFtZV9sZW4sIGhpbmZvKTtcbiBcdFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0XHRyZXQgPSBlcnI7XG5AQCAtMTM1NCw3ICYjNDM7MTM3Miw4IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdFx0dG1wX3N0ci5uYW1lID0gZGUtXHUwMDNlbmFtZTtcbiBcdFx0dG1wX3N0ci5sZW4gPSBkZS1cdTAwM2VuYW1lX2xlbjtcbiBcdFx0ZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsIGhpbmZvLVx1MDAzZWhhc2gsXG4tXHRcdFx0XHRcdCAgICAgIGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gsIGRlLCBcdTAwMjZ0bXBfc3RyKTtcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gsIGlubGluZV9zaXplLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgZGUsIFx1MDAyNnRtcF9zdHIpO1xuIFx0XHRpZiAoZXJyKSB7XG4gXHRcdFx0cmV0ID0gZXJyO1xuIFx0XHRcdGdvdG8gb3V0O1xuQEAgLTE0MjcsOCAmIzQzOzE0NDYsOCBAQCBpbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsXG4gXHQgKiBTbyB3ZSB3aWxsIHVzZSBleHRyYV9vZmZzZXQgYW5kIGV4dHJhX3NpemUgdG8gaW5kaWNhdGUgdGhlbVxuIFx0ICogZHVyaW5nIHRoZSBpbmxpbmUgZGlyIGl0ZXJhdGlvbi5cbiBcdCAqL1xuLVx0ZG90ZG90X29mZnNldCA9IGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCk7XG4tXHRkb3Rkb3Rfc2l6ZSA9IGRvdGRvdF9vZmZzZXQgJiM0MzsgZXh0NF9kaXJfcmVjX2xlbigyLCBOVUxMKTtcbiYjNDM7XHRkb3Rkb3Rfb2Zmc2V0ID0gZXh0NF9kaXJlbnRfcmVjX2xlbigxLCBOVUxMKTtcbiYjNDM7XHRkb3Rkb3Rfc2l6ZSA9IGRvdGRvdF9vZmZzZXQgJiM0MzsgZXh0NF9kaXJlbnRfcmVjX2xlbigyLCBOVUxMKTtcbiBcdGV4dHJhX29mZnNldCA9IGRvdGRvdF9zaXplIC0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkU7XG4gXHRleHRyYV9zaXplID0gZXh0cmFfb2Zmc2V0ICYjNDM7IGlubGluZV9zaXplO1xuIFxuQEAgLTE0NjMsNyAmIzQzOzE0ODIsNyBAQCBpbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsXG4gXHRcdFx0ICogZmFpbHVyZSB3aWxsIGJlIGRldGVjdGVkIGluIHRoZVxuIFx0XHRcdCAqIGRpcmVudCB0ZXN0IGJlbG93LiAqL1xuIFx0XHRcdGlmIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sIGV4dHJhX3NpemUpXG4tXHRcdFx0XHRcdTAwM2MgZXh0NF9kaXJfcmVjX2xlbigxLCBOVUxMKSlcbiYjNDM7XHRcdFx0XHRcdTAwM2MgZXh0NF9kaXJlbnRfcmVjX2xlbigxLCBOVUxMKSlcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHRcdGkgJiM0Mzs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbixcbiBcdFx0XHRcdFx0XHQgICAgZXh0cmFfc2l6ZSk7XG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jXG5pbmRleCBjODM4N2U2YTJjNmU5MC4uYjU0MjFkNTlmN2EwMzIgMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2lvY3RsLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvaW9jdGwuY1xuQEAgLTE1MzUsNiAmIzQzOzE1MzUsODcgQEAgc3RhdGljIGludCBleHQ0X2lvY3RsX3NldF90dW5lX3NiKHN0cnVjdCBmaWxlICpmaWxwLFxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4mIzQzOy8qXG4mIzQzOyAqIGV4dDRfaW9jdGxfc2V0X2x1ZmlkKCkgLSBTZXQgTFVGSUQgb24gYSBkaXJlY3RvcnkgZW50cnlcbiYjNDM7ICogQGZpbHA6XHRmaWxlIHBvaW50ZXIgKHBhcmVudCBkaXJlY3RvcnkpXG4mIzQzOyAqIEBhcmc6XHRwb2ludGVyIHRvIGV4dDRfc2V0X2x1ZmlkIHN0cnVjdHVyZSB3aXRoIGZpbGVuYW1lIGFuZCBMVUZJRCBkYXRhXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgaW9jdGwgYWxsb3dzIHNldHRpbmcgTFVGSUQgZGF0YSBvbiBhbiBleGlzdGluZ1xuJiM0MzsgKiBkaXJlY3RvcnkgZW50cnkuIEl0IGlzIGNhbGxlZCBvbiB0aGUgcGFyZW50IGRpcmVjdG9yeSB3aXRoIGEgZmlsZW5hbWUgYW5kXG4mIzQzOyAqIExVRklEIGRhdGEuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgbG9uZyBleHQ0X2lvY3RsX3NldF9sdWZpZChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgaW5vZGUgKmRpciA9IGZpbGVfaW5vZGUoZmlscCk7XG4mIzQzO1x0c3RydWN0IG1udF9pZG1hcCAqaWRtYXAgPSBmaWxlX21udF9pZG1hcChmaWxwKTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9zZXRfbHVmaWQgbHVmaWRfYXJncztcbiYjNDM7XHRzdHJ1Y3Qge1xuJiM0MztcdFx0X191MzIgZWRwX21hZ2ljO1xuJiM0MztcdFx0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyIGRmX2hlYWRlcjtcbiYjNDM7XHRcdGNoYXIgZGZfZmlkWzI1NV07XG4mIzQzO1x0fSBlZHA7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XG4mIzQzO1x0LyogQ2hlY2sgaWYgcGFyZW50IGlzIGEgZGlyZWN0b3J5ICovXG4mIzQzO1x0aWYgKCFTX0lTRElSKGRpci1cdTAwM2VpX21vZGUpKVxuJiM0MztcdFx0cmV0dXJuIC1FTk9URElSO1xuJiM0MztcbiYjNDM7XHQvKiBUaGlzIGlvY3RsIG11dGF0ZXMgZGlyZWN0b3J5IGVudHJpZXM7IG1lcmVseSBoYXZpbmcgdGhlIGRpcmVjdG9yeVxuJiM0MztcdCAqIG9wZW4gKHdoaWNoIG9ubHkgZXZlciByZXF1aXJlcyByZWFkIGFjY2VzcykgaXMgbm90IGVub3VnaCAqL1xuJiM0MztcdGVyciA9IGlub2RlX3Blcm1pc3Npb24oaWRtYXAsIGRpciwgTUFZX1dSSVRFKTtcbiYjNDM7XHRpZiAoZXJyKVxuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0LyogQ29weSBhcmd1bWVudHMgZnJvbSB1c2VyIHNwYWNlICovXG4mIzQzO1x0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmx1ZmlkX2FyZ3MsIChzdHJ1Y3QgZXh0NF9zZXRfbHVmaWQgX191c2VyICopYXJnLFxuJiM0MztcdFx0XHQgICBzaXplb2YobHVmaWRfYXJncykpKVxuJiM0MztcdFx0cmV0dXJuIC1FRkFVTFQ7XG4mIzQzO1xuJiM0MztcdC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMuICBlc2xfbmFtZV9sZW4gaXMgTlVMLWV4Y2x1ZGVkIGxlbmd0aCAoMS0yNTUpLiAqL1xuJiM0MztcdGlmIChsdWZpZF9hcmdzLmVzbF9uYW1lX2xlbiA9PSAwIHx8IGx1ZmlkX2FyZ3MuZXNsX25hbWVfbGVuIFx1MDAzZSBFWFQ0X05BTUVfTEVOKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdC8qIGRkaF9sZW5ndGggKGVzbF9kYXRhX2xlbiAmIzQzOyB0aGUgaGVhZGVyIGJ5dGUgYmVsb3cpIG11c3QgaXRzZWxmIGZpdFxuJiM0MztcdCAqIGluIHRoZSBfX3U4IGRkaF9sZW5ndGggZmllbGQgd2l0aG91dCB3cmFwcGluZyAqL1xuJiM0MztcdGlmIChsdWZpZF9hcmdzLmVzbF9kYXRhX2xlbiA9PSAwIHx8XG4mIzQzO1x0ICAgIGx1ZmlkX2FyZ3MuZXNsX2RhdGFfbGVuIFx1MDAzZSAyNTUgLSBzaXplb2YoZWRwLmRmX2hlYWRlcikpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0LyogRW5zdXJlIGZpbGVuYW1lIGlzIE5VTC10ZXJtaW5hdGVkIGF0IGV4YWN0bHkgZXNsX25hbWVfbGVuICovXG4mIzQzO1x0aWYgKGx1ZmlkX2FyZ3MuZXNsX25hbWVbbHVmaWRfYXJncy5lc2xfbmFtZV9sZW5dICE9ICYjMzk7XFwwJiMzOTspXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0LyogJiMzOTsuJiMzOTsgYW5kICYjMzk7Li4mIzM5OyBhcmUgbm90IG9yZGluYXJ5IGVudHJpZXMgLS0gdGhleSBtdXN0IHN0YXkgdGhlIGZpcnN0XG4mIzQzO1x0ICogdHdvIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSYjMzk7cyBmaXJzdCBibG9jaywgc28gdGhleSBjYW4mIzM5O3QgZ29cbiYjNDM7XHQgKiB0aHJvdWdoIHRoZSBnZW5lcmFsIGRlbGV0ZSYjNDM7cmUtYWRkIHBhdGggdGhpcyBpb2N0bCB1c2VzICovXG4mIzQzO1x0aWYgKCFzdHJjbXAobHVmaWRfYXJncy5lc2xfbmFtZSwgXCYjMzQ7LlwmIzM0OykgfHwgIXN0cmNtcChsdWZpZF9hcmdzLmVzbF9uYW1lLCBcJiMzNDsuLlwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XG4mIzQzO1x0LyogUHJlcGFyZSB0aGUgZGVudHJ5IHBhcmFtIHN0cnVjdCB3aXRoIExVRklEIGRhdGEuIGRkaF9sZW5ndGggaXNcbiYjNDM7XHQgKiBkb2N1bWVudGVkIChzZWUgc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyKSBhcyB0aGUgbGVuZ3RoIG9mXG4mIzQzO1x0ICogdGhlIGhlYWRlciBwbHVzIHRoZSB3aG9sZSBkYXRhIGJsb2IgLS0gaW5jbHVkZSB0aGUgaGVhZGVyIGhlcmUgc29cbiYjNDM7XHQgKiBldmVyeSBkaXJkYXRhIHJlYWRlci93cml0ZXIgdGhhdCB0YWtlcyBkZGhfbGVuZ3RoIGF0IGZhY2UgdmFsdWVcbiYjNDM7XHQgKiAoZS5nLiBleHQ0X2RpcmRhdGFfc2V0KCkmIzM5O3MgbWVtY3B5KSBjb3BpZXMgdGhlIGZ1bGwgTFVGSUQgcGF5bG9hZFxuJiM0MztcdCAqIGluc3RlYWQgb2Ygc2lsZW50bHkgZHJvcHBpbmcgaXRzIGxhc3QgYnl0ZS4gKi9cbiYjNDM7XHRlZHAuZWRwX21hZ2ljID0gRVhUNF9MVUZJRF9NQUdJQztcbiYjNDM7XHRlZHAuZGZfaGVhZGVyLmRkaF9sZW5ndGggPSBsdWZpZF9hcmdzLmVzbF9kYXRhX2xlbiAmIzQzO1xuJiM0MztcdFx0XHRcdCAgICBzaXplb2YoZWRwLmRmX2hlYWRlcik7XG4mIzQzO1x0bWVtY3B5KGVkcC5kZl9maWQsIGx1ZmlkX2FyZ3MuZXNsX2RhdGEsIGx1ZmlkX2FyZ3MuZXNsX2RhdGFfbGVuKTtcbiYjNDM7XG4mIzQzO1x0LyogV2FudCB3cml0ZSBhY2Nlc3MgKi9cbiYjNDM7XHRlcnIgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbHApO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcbiYjNDM7XHQvKiBDYWxsIHRoZSBoZWxwZXIgZnVuY3Rpb24gdG8gZG8gdGhlIGFjdHVhbCB3b3JrICovXG4mIzQzO1x0ZXJyID0gZXh0NF9kaXJkYXRhX3NldF9sdWZpZChkaXIsIGx1ZmlkX2FyZ3MuZXNsX25hbWUsXG4mIzQzO1x0XHRcdFx0ICAgIGx1ZmlkX2FyZ3MuZXNsX25hbWVfbGVuLFxuJiM0MztcdFx0XHRcdCAgICAoc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICopXHUwMDI2ZWRwKTtcbiYjNDM7XG4mIzQzO1x0bW50X2Ryb3Bfd3JpdGVfZmlsZShmaWxwKTtcbiYjNDM7XHRyZXR1cm4gZXJyO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBsb25nIF9fZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlscCk7XG5AQCAtMTkyMSw2ICYjNDM7MjAwMiw4IEBAIHN0YXRpYyBsb25nIF9fZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gXHRcdFx0XHRcdCAgICAgICh2b2lkIF9fdXNlciAqKWFyZyk7XG4gXHRjYXNlIEVYVDRfSU9DX1NFVF9UVU5FX1NCX1BBUkFNOlxuIFx0XHRyZXR1cm4gZXh0NF9pb2N0bF9zZXRfdHVuZV9zYihmaWxwLCAodm9pZCBfX3VzZXIgKilhcmcpO1xuJiM0MztcdGNhc2UgRVhUNF9JT0NfU0VUX0xVRklEOlxuJiM0MztcdFx0cmV0dXJuIGV4dDRfaW9jdGxfc2V0X2x1ZmlkKGZpbHAsIGFyZyk7XG4gXHRkZWZhdWx0OlxuIFx0XHRyZXR1cm4gLUVOT1RUWTtcbiBcdH1cbkBAIC0yMDAwLDYgJiM0MzsyMDgzLDcgQEAgbG9uZyBleHQ0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4gXHRjYXNlIEZTX0lPQ19TRVRGU0xBQkVMOlxuIFx0Y2FzZSBFWFQ0X0lPQ19HRVRGU1VVSUQ6XG4gXHRjYXNlIEVYVDRfSU9DX1NFVEZTVVVJRDpcbiYjNDM7XHRjYXNlIEVYVDRfSU9DX1NFVF9MVUZJRDpcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuY1xuaW5kZXggY2M0OWFlMDRhNmY2NDkuLmJhMzllY2M2OTBiYzJkIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9uYW1laS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L25hbWVpLmNcbkBAIC0xMDIsNyAmIzQzOzEwMiw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfYXBwZW5kKGhhbmRsZV90ICpoYW5kbGUsXG4gfVxuIFxuIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCk7XG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlyZW50KTtcbiBcbiAvKlxuICAqIEhpbnRzIHRvIGV4dDRfcmVhZF9kaXJibG9jayByZWdhcmRpbmcgd2hldGhlciB3ZSBleHBlY3QgYSBkaXJlY3RvcnlcbkBAIC0xMjgsNyAmIzQzOzEyOCw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fZXh0NF9yZWFkX2RpcmJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRcdFx0XHRcdFx0dW5zaWduZWQgaW50IGxpbmUpXG4ge1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbi1cdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50O1xuJiM0MztcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQ7XG4gXHRpbnQgaXNfZHhfYmxvY2sgPSAwO1xuIFxuIFx0aWYgKGJsb2NrIFx1MDAzZT0gaW5vZGUtXHUwMDNlaV9zaXplIFx1MDAzZVx1MDAzZSBpbm9kZS1cdTAwM2VpX2Jsa2JpdHMpIHtcbkBAIC0xNjAsNyAmIzQzOzE2MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fZXh0NF9yZWFkX2RpcmJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHR9XG4gXHRpZiAoIWJoKVxuIFx0XHRyZXR1cm4gTlVMTDtcbi1cdGRpcmVudCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikgYmgtXHUwMDNlYl9kYXRhO1xuJiM0MztcdGRpcmVudCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC1cdTAwM2ViX2RhdGE7XG4gXHQvKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhbiBpbmRleCBibG9jayAqL1xuIFx0aWYgKGlzX2R4KGlub2RlKSkge1xuIFx0XHRpZiAoYmxvY2sgPT0gMClcbkBAIC0yNDQsMjIgJiM0MzsyNDQsMTMgQEAgc3RydWN0IGR4X2VudHJ5XG4gICogaGFzaCB2ZXJzaW9uIG1vZCA0IHNob3VsZCBuZXZlciBiZSAwLiAgU2luY2VyZWx5LCB0aGUgcGFyYW5vaWEgZGVwYXJ0bWVudC5cbiAgKi9cbiBcbi1zdHJ1Y3QgZHhfcm9vdFxuJiM0MztzdHJ1Y3QgZHhfcm9vdF9pbmZvXG4ge1xuLVx0c3RydWN0IGZha2VfZGlyZW50IGRvdDtcbi1cdGNoYXIgZG90X25hbWVbNF07XG4tXHRzdHJ1Y3QgZmFrZV9kaXJlbnQgZG90ZG90O1xuLVx0Y2hhciBkb3Rkb3RfbmFtZVs0XTtcbi1cdHN0cnVjdCBkeF9yb290X2luZm9cbi1cdHtcbi1cdFx0X19sZTMyIHJlc2VydmVkX3plcm87XG4tXHRcdHU4IGhhc2hfdmVyc2lvbjtcbi1cdFx0dTggaW5mb19sZW5ndGg7IC8qIDggKi9cbi1cdFx0dTggaW5kaXJlY3RfbGV2ZWxzO1xuLVx0XHR1OCB1bnVzZWRfZmxhZ3M7XG4tXHR9XG4tXHRpbmZvO1xuLVx0c3RydWN0IGR4X2VudHJ5XHRlbnRyaWVzW107XG4mIzQzO1x0X19sZTMyIHJlc2VydmVkX3plcm87XG4mIzQzO1x0dTggaGFzaF92ZXJzaW9uO1xuJiM0MztcdHU4IGluZm9fbGVuZ3RoOyAvKiA4ICovXG4mIzQzO1x0dTggaW5kaXJlY3RfbGV2ZWxzO1xuJiM0MztcdHU4IHVudXNlZF9mbGFncztcbiB9O1xuIFxuIHN0cnVjdCBkeF9ub2RlXG5AQCAtMzE0LDE3ICYjNDM7MzA1LDE2IEBAIHN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCAqZ2V0X2RpcmVudF90YWlsKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRcdFx0XHRcdFx0ICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaClcbiB7XG4gXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCAqdDtcbi1cdGludCBibG9ja3NpemUgPSBFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtXHUwMDNlaV9zYik7XG4gXG4gI2lmZGVmIFBBUkFOT0lEXG4tXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmQsICp0b3A7XG4mIzQzO1x0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmQsICp0b3A7XG4gXG4tXHRkID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqKWJoLVx1MDAzZWJfZGF0YTtcbi1cdHRvcCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikoYmgtXHUwMDNlYl9kYXRhICYjNDM7XG4tXHRcdChibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpKSk7XG4tXHR3aGlsZSAoZCBcdTAwM2MgdG9wIFx1MDAyNlx1MDAyNiBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGQtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKSlcbi1cdFx0ZCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikoKCh2b2lkICopZCkgJiM0Mztcbi1cdFx0ICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZC1cdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpKTtcbiYjNDM7XHRkID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtXHUwMDNlYl9kYXRhO1xuJiM0MztcdHRvcCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKShiaC1cdTAwM2ViX2RhdGEgJiM0MztcbiYjNDM7XHRcdChFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtXHUwMDNlaV9zYikgLSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpKSk7XG4mIzQzO1x0d2hpbGUgKGQgXHUwMDNjIHRvcCBcdTAwMjZcdTAwMjYgZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkLVx1MDAzZXJlY19sZW4sIEVYVDRfQkxPQ0tfU0laRShpbm9kZS1cdTAwM2VpX3NiKSkpXG4mIzQzO1x0XHRkID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKCgodm9pZCAqKWQpICYjNDM7XG4mIzQzO1x0XHQgICAgZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkLVx1MDAzZXJlY19sZW4sIEVYVDRfQkxPQ0tfU0laRShpbm9kZS1cdTAwM2VpX3NiKSkpO1xuIFxuIFx0aWYgKGQgIT0gdG9wKVxuIFx0XHRyZXR1cm4gTlVMTDtcbkBAIC0zMzQsMTEgJiM0MzszMjQsNyBAQCBzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKmdldF9kaXJlbnRfdGFpbChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0dCA9IEVYVDRfRElSRU5UX1RBSUwoYmgtXHUwMDNlYl9kYXRhLCBFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtXHUwMDNlaV9zYikpO1xuICNlbmRpZlxuIFxuLVx0aWYgKHQtXHUwMDNlZGV0X3Jlc2VydmVkX3plcm8xIHx8XG4tXHQgICAgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2sodC1cdTAwM2VkZXRfcmVjX2xlbiwgYmxvY2tzaXplKSAhPVxuLVx0ICAgICBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpKSB8fFxuLVx0ICAgIHQtXHUwMDNlZGV0X3Jlc2VydmVkX3plcm8yIHx8XG4tXHQgICAgdC1cdTAwM2VkZXRfcmVzZXJ2ZWRfZnQgIT0gRVhUNF9GVF9ESVJfQ1NVTSlcbiYjNDM7XHRpZiAoIWV4dDRfZGlyX2VudHJ5X2lzX3RhaWwoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopdCkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuIFx0cmV0dXJuIHQ7XG5AQCAtNDEwLDM1ICYjNDM7Mzk2LDQzIEBAIGludCBleHQ0X2hhbmRsZV9kaXJ0eV9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLFxuIH1cbiBcbiBzdGF0aWMgc3RydWN0IGR4X2NvdW50bGltaXQgKmdldF9keF9jb3VudGxpbWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tXHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCxcbiYjNDM7XHRcdFx0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlyZW50LFxuIFx0XHRcdFx0XHQgICAgICAgaW50ICpvZmZzZXQpXG4ge1xuLVx0c3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkcDtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7XG4gXHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICpyb290O1xuLVx0aW50IGNvdW50X29mZnNldDtcbiYjNDM7XHRpbnQgY291bnRfb2Zmc2V0LCBkb3Rkb3RfcmVjX2xlbjtcbiBcdGludCBibG9ja3NpemUgPSBFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtXHUwMDNlaV9zYik7XG4gXHR1bnNpZ25lZCBpbnQgcmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGlyZW50LVx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSk7XG4gXG4tXHRpZiAocmxlbiA9PSBibG9ja3NpemUpXG4tXHRcdGNvdW50X29mZnNldCA9IDg7XG4tXHRlbHNlIGlmIChybGVuID09IDEyKSB7XG4tXHRcdGRwID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqKSgoKHZvaWQgKilkaXJlbnQpICYjNDM7IDEyKTtcbi1cdFx0aWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZHAtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKSAhPSBibG9ja3NpemUgLSAxMilcbiYjNDM7XHRpZiAocmxlbiA9PSBibG9ja3NpemUpIHtcbiYjNDM7XHRcdGNvdW50X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgZHhfbm9kZSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGlmIChybGVuIFx1MDAzYyBFWFQ0X0JBU0VfRElSX0xFTiB8fFxuJiM0MztcdFx0ICAgIHJsZW4gJiM0MzsgRVhUNF9CQVNFX0RJUl9MRU4gXHUwMDNlIGJsb2Nrc2l6ZSlcbiYjNDM7XHRcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0XHRkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSgoKGNoYXIgKilkaXJlbnQpICYjNDM7IHJsZW4pO1xuJiM0MztcdFx0aWYgKGxlMTZfdG9fY3B1KGRlLVx1MDAzZXJlY19sZW4pICE9IChibG9ja3NpemUgLSBybGVuKSlcbiBcdFx0XHRyZXR1cm4gTlVMTDtcbi1cdFx0cm9vdCA9IChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopKCgodm9pZCAqKWRwICYjNDM7IDEyKSk7XG4mIzQzO1x0XHQvKiBkZS1cdTAwM2VyZWNfbGVuIGNvdmVycyB3aG9sZSBkeF9yb290IGJsb2NrLCBjYWxjdWxhdGUgYWN0dWFsIGxlbmd0aC5cbiYjNDM7XHRcdCAqIFRoaXMgaXMgdGhlICYjMzk7Li4mIzM5OyBlbnRyeSwgd2hpY2ggbmV2ZXIgY2FycmllcyB0aGUgY2FzZWZvbGQmIzQzO2ZzY3J5cHRcbiYjNDM7XHRcdCAqIGhhc2gsIHNvIHBhc3MgTlVMTCBmb3IgZGlyIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpcmVjdG9yeSYjMzk7cyBmbGFncyAqL1xuJiM0MztcdFx0ZG90ZG90X3JlY19sZW4gPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIGJsb2Nrc2l6ZSwgTlVMTCk7XG4mIzQzO1x0XHRpZiAocmxlbiAmIzQzOyBkb3Rkb3RfcmVjX2xlbiAmIzQzOyBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykgXHUwMDNlIGJsb2Nrc2l6ZSlcbiYjNDM7XHRcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0XHRyb290ID0gKHN0cnVjdCBkeF9yb290X2luZm8gKikoKChjaGFyICopZGUgJiM0MzsgZG90ZG90X3JlY19sZW4pKTtcbiBcdFx0aWYgKHJvb3QtXHUwMDNlcmVzZXJ2ZWRfemVybyB8fFxuIFx0XHQgICAgcm9vdC1cdTAwM2VpbmZvX2xlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykpXG4gXHRcdFx0cmV0dXJuIE5VTEw7XG4tXHRcdGNvdW50X29mZnNldCA9IDMyO1xuLVx0fSBlbHNlXG4tXHRcdHJldHVybiBOVUxMO1xuJiM0MztcdFx0Y291bnRfb2Zmc2V0ID0gcm9vdC1cdTAwM2VpbmZvX2xlbmd0aCAmIzQzOyBybGVuICYjNDM7IGRvdGRvdF9yZWNfbGVuO1xuJiM0MztcdH1cbiBcbiBcdGlmIChvZmZzZXQpXG4gXHRcdCpvZmZzZXQgPSBjb3VudF9vZmZzZXQ7XG4gXHRyZXR1cm4gKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopKCgodm9pZCAqKWRpcmVudCkgJiM0MzsgY291bnRfb2Zmc2V0KTtcbiB9XG4gXG4tc3RhdGljIF9fbGUzMiBleHQ0X2R4X2NzdW0oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQsXG4mIzQzO3N0YXRpYyBfX2xlMzIgZXh0NF9keF9jc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQsXG4gXHRcdFx0ICAgaW50IGNvdW50X29mZnNldCwgaW50IGNvdW50LCBzdHJ1Y3QgZHhfdGFpbCAqdClcbiB7XG4gXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7XG5AQCAtNDU2LDcgJiM0Mzs0NTAsNyBAQCBzdGF0aWMgX19sZTMyIGV4dDRfZHhfY3N1bShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCxcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2R4X2NzdW1fdmVyaWZ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50KVxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudClcbiB7XG4gXHRzdHJ1Y3QgZHhfY291bnRsaW1pdCAqYztcbiBcdHN0cnVjdCBkeF90YWlsICp0O1xuQEAgLTQ3Nyw2ICYjNDM7NDcxLDEwIEBAIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHR3YXJuX25vX3NwYWNlX2Zvcl9jc3VtKGlub2RlKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzZSBsaW1pdCkge1xuJiM0MztcdFx0RVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgXCYjMzQ7ZGlyIHNlZW1zIGNvcnJ1cHQ/ICBSdW4gZTJmc2NrIC1ELlwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4gXHR0ID0gKHN0cnVjdCBkeF90YWlsICopKCgoc3RydWN0IGR4X2VudHJ5ICopYykgJiM0MzsgbGltaXQpO1xuIFxuIFx0aWYgKHQtXHUwMDNlZHRfY2hlY2tzdW0gIT0gZXh0NF9keF9jc3VtKGlub2RlLCBkaXJlbnQsIGNvdW50X29mZnNldCxcbkBAIC00ODUsNyAmIzQzOzQ4Myw3IEBAIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0cmV0dXJuIDE7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQpXG4mIzQzO3N0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudClcbiB7XG4gXHRzdHJ1Y3QgZHhfY291bnRsaW1pdCAqYztcbiBcdHN0cnVjdCBkeF90YWlsICp0O1xuQEAgLTUwNiw2ICYjNDM7NTA0LDEwIEBAIHN0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQpXG4gXHRcdHdhcm5fbm9fc3BhY2VfZm9yX2NzdW0oaW5vZGUpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG4mIzQzO1x0aWYgKGNvdW50IFx1MDAzZSBsaW1pdCkge1xuJiM0MztcdFx0RVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgXCYjMzQ7ZGlyIHNlZW1zIGNvcnJ1cHQ/ICBSdW4gZTJmc2NrIC1ELlwmIzM0Oyk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuIFx0dCA9IChzdHJ1Y3QgZHhfdGFpbCAqKSgoKHN0cnVjdCBkeF9lbnRyeSAqKWMpICYjNDM7IGxpbWl0KTtcbiBcbiBcdHQtXHUwMDNlZHRfY2hlY2tzdW0gPSBleHQ0X2R4X2NzdW0oaW5vZGUsIGRpcmVudCwgY291bnRfb2Zmc2V0LCBjb3VudCwgdCk7XG5AQCAtNTE1LDcgJiM0Mzs1MTcsNyBAQCBzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9kaXJ0eV9keF9ub2RlKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHRcdFx0XHQgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaClcbiB7XG4tXHRleHQ0X2R4X2NzdW1fc2V0KGlub2RlLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopYmgtXHUwMDNlYl9kYXRhKTtcbiYjNDM7XHRleHQ0X2R4X2NzdW1fc2V0KGlub2RlLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiliaC1cdTAwM2ViX2RhdGEpO1xuIFx0cmV0dXJuIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTtcbiB9XG4gXG5AQCAtNTMzLDYgJiM0Mzs1MzUsMzAgQEAgZXh0NF9uZXh0X2VudHJ5KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpwLCB1bnNpZ25lZCBsb25nIGJsb2Nrc2l6ZSlcbiAgKiBGdXR1cmU6IHVzZSBoaWdoIGZvdXIgYml0cyBvZiBibG9jayBmb3IgY29hbGVzY2Utb24tZGVsZXRlIGZsYWdzXG4gICogTWFzayB0aGVtIG9mZiBmb3Igbm93LlxuICAqL1xuJiM0MztzdGF0aWMgc3RydWN0IGR4X3Jvb3RfaW5mbyAqZHhfZ2V0X2R4X2luZm8oc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmRlX2J1ZilcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBibG9ja3NpemUgPSBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbiYjNDM7XHR2b2lkICpiYXNlID0gZGVfYnVmO1xuJiM0MztcbiYjNDM7XHQvKiAmIzM5Oy4mIzM5OyBhbmQgJiMzOTsuLiYjMzk7IG5ldmVyIGNhcnJ5IHRoZSBjYXNlZm9sZCYjNDM7ZnNjcnlwdCBoYXNoLCBzbyBwYXNzIE5VTExcbiYjNDM7XHQgKiBmb3IgZGlyIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpcmVjdG9yeSYjMzk7cyBmbGFncyAqL1xuJiM0MztcdGlmIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilkZV9idWYpLVx1MDAzZXJlY19sZW4sXG4mIzQzO1x0XHRcdFx0ICAgYmxvY2tzaXplKSBcdTAwM2MgRVhUNF9CQVNFX0RJUl9MRU4pXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUZTQ09SUlVQVEVEKTtcbiYjNDM7XHRkZV9idWYgJiM0Mzs9IGV4dDRfZGlyX2VudHJ5X2xlbihkZV9idWYsIGJsb2Nrc2l6ZSwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdC8qIGR4IHJvb3QgaW5mbyBpcyBhZnRlciBkb3Rkb3QgZW50cnkgKi9cbiYjNDM7XHRpZiAoZGVfYnVmIFx1MDAzYyBiYXNlIHx8IChjaGFyICopZGVfYnVmIC0gKGNoYXIgKiliYXNlICYjNDM7XG4mIzQzO1x0ICAgIEVYVDRfQkFTRV9ESVJfTEVOIFx1MDAzZSBibG9ja3NpemUpXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUZTQ09SUlVQVEVEKTtcbiYjNDM7XHRkZV9idWYgJiM0Mzs9IGV4dDRfZGlyX2VudHJ5X2xlbihkZV9idWYsIGJsb2Nrc2l6ZSwgTlVMTCk7XG4mIzQzO1xuJiM0MztcdGlmIChkZV9idWYgXHUwMDNjIGJhc2UgfHwgKGNoYXIgKilkZV9idWYgLSAoY2hhciAqKWJhc2UgJiM0MztcbiYjNDM7XHRcdFx0ICAgICAgc2l6ZW9mKHN0cnVjdCBkeF9yb290X2luZm8pIFx1MDAzZSBibG9ja3NpemUpXG4mIzQzO1x0XHRyZXR1cm4gRVJSX1BUUigtRUZTQ09SUlVQVEVEKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopZGVfYnVmO1xuJiM0Mzt9XG4gXG4gc3RhdGljIGlubGluZSBleHQ0X2xibGtfdCBkeF9nZXRfYmxvY2soc3RydWN0IGR4X2VudHJ5ICplbnRyeSlcbiB7XG5AQCAtNTc0LDExICYjNDM7NjAwLDE3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBkeF9zZXRfbGltaXQoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSlcbiBcdCgoc3RydWN0IGR4X2NvdW50bGltaXQgKikgZW50cmllcyktXHUwMDNlbGltaXQgPSBjcHVfdG9fbGUxNih2YWx1ZSk7XG4gfVxuIFxuLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfcm9vdF9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgaW5mb3NpemUpXG4mIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfcm9vdF9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpcixcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG90X2RlKVxuIHtcbi1cdHVuc2lnbmVkIGludCBlbnRyeV9zcGFjZSA9IGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIC1cbi1cdFx0XHRleHQ0X2Rpcl9yZWNfbGVuKDEsIE5VTEwpIC1cbi1cdFx0XHRleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpIC0gaW5mb3NpemU7XG4mIzQzO1x0c3RydWN0IGR4X3Jvb3RfaW5mbyAqaW5mbztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgZW50cnlfc3BhY2U7XG4mIzQzO1xuJiM0MztcdGluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIGRvdF9kZSk7XG4mIzQzO1x0aWYgKElTX0VSUihpbmZvKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdGVudHJ5X3NwYWNlID0gZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgLSAoKGNoYXIgKilpbmZvIC0gKGNoYXIgKilkb3RfZGUpIC1cbiYjNDM7XHRcdGluZm8tXHUwMDNlaW5mb19sZW5ndGg7XG4gXG4gXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGRpci1cdTAwM2VpX3NiKSlcbiBcdFx0ZW50cnlfc3BhY2UgLT0gc2l6ZW9mKHN0cnVjdCBkeF90YWlsKTtcbkBAIC01ODcsOCAmIzQzOzYxOSwxMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGluZm9zaXplKVxuIFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfbm9kZV9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpcilcbiB7XG4mIzQzO1x0LyogZHhfbm9kZSBmYWtlX2RpcmVudCBpcyBhbHdheXMgOCBieXRlcyDigJQgaXQgbmV2ZXIgY2FycmllcyBhIGNhc2Vmb2xkXG4mIzQzO1x0ICogaGFzaCwgc28gcGFzcyBOVUxMIHRvIHN1cHByZXNzIHRoZSBoYXNoLXNpemUgdGVybS4gKi9cbiBcdHVuc2lnbmVkIGludCBlbnRyeV9zcGFjZSA9IGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIC1cbi1cdFx0XHRleHQ0X2Rpcl9yZWNfbGVuKDAsIGRpcik7XG4mIzQzO1x0XHRcdGV4dDRfZGlyZW50X3JlY19sZW4oMCwgTlVMTCk7XG4gXG4gXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGRpci1cdTAwM2VpX3NiKSlcbiBcdFx0ZW50cnlfc3BhY2UgLT0gc2l6ZW9mKHN0cnVjdCBkeF90YWlsKTtcbkBAIC02OTgsNyAmIzQzOzczMiw5IEBAIHN0YXRpYyBzdHJ1Y3Qgc3RhdHMgZHhfc2hvd19sZWFmKHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0XHRcdFx0ICAgICAgICh1bnNpZ25lZCkgKChjaGFyICopIGRlIC0gYmFzZSkpO1xuICNlbmRpZlxuIFx0XHRcdH1cbi1cdFx0XHRzcGFjZSAmIzQzOz0gZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbiwgZGlyKTtcbiYjNDM7XHRcdFx0aWYgKChjaGFyICopZGUgJiM0MzsgRVhUNF9CQVNFX0RJUl9MRU4gXHUwMDNlIGJhc2UgJiM0Mzsgc2l6ZSlcbiYjNDM7XHRcdFx0XHRicmVhaztcbiYjNDM7XHRcdFx0c3BhY2UgJiM0Mzs9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgc2l6ZSwgZGlyKTtcbiBcdFx0XHRuYW1lcyYjNDM7JiM0Mzs7XG4gXHRcdH1cbiBcdFx0ZGUgPSBleHQ0X25leHRfZW50cnkoZGUsIHNpemUpO1xuQEAgLTc4MCw3ICYjNDM7ODE2LDcgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiB7XG4gXHR1bnNpZ25lZCBjb3VudCwgaW5kaXJlY3QsIGxldmVsLCBpO1xuIFx0c3RydWN0IGR4X2VudHJ5ICphdCwgKmVudHJpZXMsICpwLCAqcSwgKm07XG4tXHRzdHJ1Y3QgZHhfcm9vdCAqcm9vdDtcbiYjNDM7XHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICppbmZvO1xuIFx0c3RydWN0IGR4X2ZyYW1lICpmcmFtZSA9IGZyYW1lX2luO1xuIFx0c3RydWN0IGR4X2ZyYW1lICpyZXRfZXJyID0gRVJSX1BUUihFUlJfQkFEX0RYX0RJUik7XG4gXHR1MzIgaGFzaDtcbkBAIC03OTIsMjMgJiM0Mzs4MjgsMzEgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdGlmIChJU19FUlIoZnJhbWUtXHUwMDNlYmgpKVxuIFx0XHRyZXR1cm4gKHN0cnVjdCBkeF9mcmFtZSAqKSBmcmFtZS1cdTAwM2ViaDtcbiBcbi1cdHJvb3QgPSAoc3RydWN0IGR4X3Jvb3QgKikgZnJhbWUtXHUwMDNlYmgtXHUwMDNlYl9kYXRhO1xuLVx0aWYgKHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9URUEgXHUwMDI2XHUwMDI2XG4tXHQgICAgcm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0hBTEZfTUQ0IFx1MDAyNlx1MDAyNlxuLVx0ICAgIHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9MRUdBQ1kgXHUwMDI2XHUwMDI2XG4tXHQgICAgcm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHtcbi1cdFx0ZXh0NF93YXJuaW5nX2lub2RlKGRpciwgXCYjMzQ7VW5yZWNvZ25pc2VkIGlub2RlIGhhc2ggY29kZSAldVwmIzM0Oyxcbi1cdFx0XHRcdCAgIHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24pO1xuJiM0MztcdGluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWZyYW1lLVx1MDAzZWJoLVx1MDAzZWJfZGF0YSk7XG4mIzQzO1x0aWYgKElTX0VSUihpbmZvKSlcbiYjNDM7XHRcdGdvdG8gZmFpbDtcbiYjNDM7XHRpZiAoaW5mby1cdTAwM2VpbmZvX2xlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykpIHtcbiYjNDM7XHRcdGV4dDRfd2FybmluZ19pbm9kZShkaXIsIFwmIzM0O2NvcnJ1cHRlZCBodHJlZTogaW5mb19sZW5ndGggJXVcJiMzNDssXG4mIzQzO1x0XHRcdFx0ICAgaW5mby1cdTAwM2VpbmZvX2xlbmd0aCk7XG4mIzQzO1x0XHRnb3RvIGZhaWw7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChpbmZvLVx1MDAzZWhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1RFQSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9IQUxGX01ENCBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9MRUdBQ1kgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIGluZm8tXHUwMDNlaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfU0lQSEFTSCkge1xuJiM0MztcdFx0ZXh0NF93YXJuaW5nKGRpci1cdTAwM2VpX3NiLFxuJiM0MztcdFx0XHRcJiMzNDtVbnJlY29nbmlzZWQgaW5vZGUgaGFzaCBjb2RlICVkIGZvciBkaXJlY3RvcnkgIyVsbHVcJiMzNDssXG4mIzQzO1x0XHRcdGluZm8tXHUwMDNlaGFzaF92ZXJzaW9uLCBkaXItXHUwMDNlaV9pbm8pO1xuIFx0XHRnb3RvIGZhaWw7XG4gXHR9XG4gXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7XG4tXHRcdGlmIChyb290LVx1MDAzZWluZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfU0lQSEFTSCkge1xuJiM0MztcdFx0aWYgKGluZm8tXHUwMDNlaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfU0lQSEFTSCkge1xuIFx0XHRcdGV4dDRfd2FybmluZ19pbm9kZShkaXIsXG4gXHRcdFx0XHRcJiMzNDtIYXNoIGluIGRpcmVudCwgYnV0IGhhc2ggaXMgbm90IFNJUEhBU0hcJiMzNDspO1xuIFx0XHRcdGdvdG8gZmFpbDtcbiBcdFx0fVxuIFx0fSBlbHNlIHtcbi1cdFx0aWYgKHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24gPT0gRFhfSEFTSF9TSVBIQVNIKSB7XG4mIzQzO1x0XHRpZiAoaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gPT0gRFhfSEFTSF9TSVBIQVNIKSB7XG4gXHRcdFx0ZXh0NF93YXJuaW5nX2lub2RlKGRpcixcbiBcdFx0XHRcdFwmIzM0O0hhc2ggY29kZSBpcyBTSVBIQVNILCBidXQgaGFzaCBub3QgaW4gZGlyZW50XCYjMzQ7KTtcbiBcdFx0XHRnb3RvIGZhaWw7XG5AQCAtODE2LDcgJiM0Mzs4NjAsNyBAQCBkeF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0fVxuIFx0aWYgKGZuYW1lKVxuIFx0XHRoaW5mbyA9IFx1MDAyNmZuYW1lLVx1MDAzZWhpbmZvO1xuLVx0aGluZm8tXHUwMDNlaGFzaF92ZXJzaW9uID0gcm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbjtcbiYjNDM7XHRoaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gPSBpbmZvLVx1MDAzZWhhc2hfdmVyc2lvbjtcbiBcdGlmIChoaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gXHUwMDNjPSBEWF9IQVNIX1RFQSlcbiBcdFx0aGluZm8tXHUwMDNlaGFzaF92ZXJzaW9uICYjNDM7PSBFWFQ0X1NCKGRpci1cdTAwM2VpX3NiKS1cdTAwM2VzX2hhc2hfdW5zaWduZWQ7XG4gXHRoaW5mby1cdTAwM2VzZWVkID0gRVhUNF9TQihkaXItXHUwMDNlaV9zYiktXHUwMDNlc19oYXNoX3NlZWQ7XG5AQCAtODMyLDEzICYjNDM7ODc2LDEzIEBAIGR4X3Byb2JlKHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwgc3RydWN0IGlub2RlICpkaXIsXG4gXHR9XG4gXHRoYXNoID0gaGluZm8tXHUwMDNlaGFzaDtcbiBcbi1cdGlmIChyb290LVx1MDAzZWluZm8udW51c2VkX2ZsYWdzIFx1MDAyNiAxKSB7XG4mIzQzO1x0aWYgKGluZm8tXHUwMDNldW51c2VkX2ZsYWdzIFx1MDAyNiAxKSB7XG4gXHRcdGV4dDRfd2FybmluZ19pbm9kZShkaXIsIFwmIzM0O1VuaW1wbGVtZW50ZWQgaGFzaCBmbGFnczogJSMwNnhcJiMzNDssXG4tXHRcdFx0XHQgICByb290LVx1MDAzZWluZm8udW51c2VkX2ZsYWdzKTtcbiYjNDM7XHRcdFx0XHQgICBpbmZvLVx1MDAzZXVudXNlZF9mbGFncyk7XG4gXHRcdGdvdG8gZmFpbDtcbiBcdH1cbiBcbi1cdGluZGlyZWN0ID0gcm9vdC1cdTAwM2VpbmZvLmluZGlyZWN0X2xldmVscztcbiYjNDM7XHRpbmRpcmVjdCA9IGluZm8tXHUwMDNlaW5kaXJlY3RfbGV2ZWxzO1xuIFx0aWYgKGluZGlyZWN0IFx1MDAzZT0gZXh0NF9kaXJfaHRyZWVfbGV2ZWwoZGlyLVx1MDAzZWlfc2IpKSB7XG4gXHRcdGV4dDRfd2FybmluZyhkaXItXHUwMDNlaV9zYixcbiBcdFx0XHQgICAgIFwmIzM0O0RpcmVjdG9yeSAoaW5vOiAlbGx1KSBodHJlZSBkZXB0aCAlIzA2eCBleGNlZWRcJiMzNDtcbkBAIC04NTEsMTQgJiM0Mzs4OTUsMTUgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdFx0Z290byBmYWlsO1xuIFx0fVxuIFxuLVx0ZW50cmllcyA9IChzdHJ1Y3QgZHhfZW50cnkgKikoKChjaGFyICopXHUwMDI2cm9vdC1cdTAwM2VpbmZvKSAmIzQzO1xuLVx0XHRcdFx0ICAgICAgcm9vdC1cdTAwM2VpbmZvLmluZm9fbGVuZ3RoKTtcbiYjNDM7XHRlbnRyaWVzID0gKHN0cnVjdCBkeF9lbnRyeSAqKSgoKGNoYXIgKilpbmZvKSAmIzQzOyBpbmZvLVx1MDAzZWluZm9fbGVuZ3RoKTtcbiBcbi1cdGlmIChkeF9nZXRfbGltaXQoZW50cmllcykgIT0gZHhfcm9vdF9saW1pdChkaXIsXG4tXHRcdFx0XHRcdFx0ICAgcm9vdC1cdTAwM2VpbmZvLmluZm9fbGVuZ3RoKSkge1xuJiM0MztcdGlmIChkeF9nZXRfbGltaXQoZW50cmllcykgIT1cbiYjNDM7XHQgICAgZHhfcm9vdF9saW1pdChkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWZyYW1lLVx1MDAzZWJoLVx1MDAzZWJfZGF0YSkpIHtcbiBcdFx0ZXh0NF93YXJuaW5nX2lub2RlKGRpciwgXCYjMzQ7ZHggZW50cnk6IGxpbWl0ICV1ICE9IHJvb3QgbGltaXQgJXVcJiMzNDssXG4gXHRcdFx0XHQgICBkeF9nZXRfbGltaXQoZW50cmllcyksXG4tXHRcdFx0XHQgICBkeF9yb290X2xpbWl0KGRpciwgcm9vdC1cdTAwM2VpbmZvLmluZm9fbGVuZ3RoKSk7XG4mIzQzO1x0XHRcdFx0ICAgZHhfcm9vdF9saW1pdChkaXIsXG4mIzQzO1x0XHRcdFx0ICAgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopZnJhbWUtXHUwMDNlYmgtXHUwMDNlYl9kYXRhXG4mIzQzO1x0XHRcdFx0ICAgKSk7XG4gXHRcdGdvdG8gZmFpbDtcbiBcdH1cbiBcbkBAIC05MzUsNyAmIzQzOzk4MCw3IEBAIGR4X3Byb2JlKHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwgc3RydWN0IGlub2RlICpkaXIsXG4gXHRyZXR1cm4gcmV0X2VycjtcbiB9XG4gXG4tc3RhdGljIHZvaWQgZHhfcmVsZWFzZShzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcylcbiYjNDM7c3RhdGljIHZvaWQgZHhfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMpXG4ge1xuIFx0c3RydWN0IGR4X3Jvb3RfaW5mbyAqaW5mbztcbiBcdGludCBpO1xuQEAgLTk0NCw3ICYjNDM7OTg5LDkgQEAgc3RhdGljIHZvaWQgZHhfcmVsZWFzZShzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcylcbiBcdGlmIChmcmFtZXNbMF0uYmggPT0gTlVMTClcbiBcdFx0cmV0dXJuO1xuIFxuLVx0aW5mbyA9IFx1MDAyNigoc3RydWN0IGR4X3Jvb3QgKilmcmFtZXNbMF0uYmgtXHUwMDNlYl9kYXRhKS1cdTAwM2VpbmZvO1xuJiM0MztcdGluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWZyYW1lc1swXS5iaC1cdTAwM2ViX2RhdGEpO1xuJiM0MztcdGlmIChJU19FUlIoaW5mbykpXG4mIzQzO1x0XHRyZXR1cm47XG4gXHQvKiBzYXZlIGxvY2FsIGNvcHksIFwmIzM0O2luZm9cJiMzNDsgbWF5IGJlIGZyZWVkIGFmdGVyIGJyZWxzZSgpICovXG4gXHRpbmRpcmVjdF9sZXZlbHMgPSBpbmZvLVx1MDAzZWluZGlyZWN0X2xldmVscztcbiBcdGZvciAoaSA9IDA7IGkgXHUwMDNjPSBpbmRpcmVjdF9sZXZlbHM7IGkmIzQzOyYjNDM7KSB7XG5AQCAtMTA1Niw3ICYjNDM7MTEwMyw3IEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXG4gXHQvKiBjc3VtIGVudHJpZXMgYXJlIG5vdCBsYXJnZXIgaW4gdGhlIGNhc2Vmb2xkZWQgZW5jcnlwdGVkIGNhc2UgKi9cbiBcdHRvcCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgJiM0MztcbiBcdFx0XHRcdFx0ICAgZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUgLVxuLVx0XHRcdFx0XHQgICBleHQ0X2Rpcl9yZWNfbGVuKDAsXG4mIzQzO1x0XHRcdFx0XHQgICBleHQ0X2RpcmVudF9yZWNfbGVuKDAsXG4gXHRcdFx0XHRcdFx0XHQgICBjc3VtID8gTlVMTCA6IGRpcikpO1xuIFx0LyogQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBlbmNyeXB0ZWQgKi9cbiBcdGlmIChJU19FTkNSWVBURUQoZGlyKSkge1xuQEAgLTEwODEsMjIgJiM0MzsxMTI4LDIzIEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXG4gXHRcdFx0Lyogc2lsZW50bHkgaWdub3JlIHRoZSByZXN0IG9mIHRoZSBibG9jayAqL1xuIFx0XHRcdGJyZWFrO1xuIFx0XHR9XG4tXHRcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpIHtcbi1cdFx0XHRpZiAoZGUtXHUwMDNlbmFtZV9sZW4gXHUwMDI2XHUwMDI2IGRlLVx1MDAzZWlub2RlKSB7XG4tXHRcdFx0XHRoaW5mby1cdTAwM2VoYXNoID0gRVhUNF9ESVJFTlRfSEFTSChkZSk7XG4tXHRcdFx0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gRVhUNF9ESVJFTlRfTUlOT1JfSEFTSChkZSk7XG4tXHRcdFx0fSBlbHNlIHtcbi1cdFx0XHRcdGhpbmZvLVx1MDAzZWhhc2ggPSAwO1xuLVx0XHRcdFx0aGluZm8tXHUwMDNlbWlub3JfaGFzaCA9IDA7XG4tXHRcdFx0fVxuJiM0MztcdFx0aWYgKGRlLVx1MDAzZW5hbWVfbGVuIFx1MDAyNlx1MDAyNiBkZS1cdTAwM2Vpbm9kZSkge1xuJiM0MztcdFx0XHQvKiBjaGVjayBmb3Igc2F2ZWQgaGFzaCBmaXJzdCwgb3IgZ2VuZXJhdGUgaXQgZnJvbSBuYW1lICovXG4mIzQzO1x0XHRcdGlmICghKGV4dDRfZGlyZGF0YV9nZXQoZGUsIGRpciwgZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUsXG4mIzQzO1x0XHRcdFx0XHQgICAgICAgTlVMTCwgaGluZm8pIFx1MDAyNlxuJiM0MztcdFx0XHQgICAgICBFWFQ0X0RJUkVOVF9DRkhBU0gpKSB7XG4mIzQzO1x0XHRcdFx0ZXJyID0gZXh0NGZzX2Rpcmhhc2goZGlyLCBkZS1cdTAwM2VuYW1lLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgIGRlLVx1MDAzZW5hbWVfbGVuLCBoaW5mbyk7XG4mIzQzO1x0XHRcdFx0aWYgKGVyciBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRcdFx0Y291bnQgPSBlcnI7XG4mIzQzO1x0XHRcdFx0XHRnb3RvIGVycm91dDtcbiYjNDM7XHRcdFx0XHR9XG4mIzQzO1x0XHRcdCB9XG4gXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZXJyID0gZXh0NGZzX2Rpcmhhc2goZGlyLCBkZS1cdTAwM2VuYW1lLFxuLVx0XHRcdFx0XHQgICAgIGRlLVx1MDAzZW5hbWVfbGVuLCBoaW5mbyk7XG4tXHRcdFx0aWYgKGVyciBcdTAwM2MgMCkge1xuLVx0XHRcdFx0Y291bnQgPSBlcnI7XG4tXHRcdFx0XHRnb3RvIGVycm91dDtcbi1cdFx0XHR9XG4mIzQzO1x0XHRcdGhpbmZvLVx1MDAzZWhhc2ggPSAwO1xuJiM0MztcdFx0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gMDtcbiBcdFx0fVxuJiM0MztcbiBcdFx0aWYgKChoaW5mby1cdTAwM2VoYXNoIFx1MDAzYyBzdGFydF9oYXNoKSB8fFxuIFx0XHQgICAgKChoaW5mby1cdTAwM2VoYXNoID09IHN0YXJ0X2hhc2gpIFx1MDAyNlx1MDAyNlxuIFx0XHQgICAgIChoaW5mby1cdTAwM2VtaW5vcl9oYXNoIFx1MDAzYyBzdGFydF9taW5vcl9oYXNoKSkpXG5AQCAtMTEwNyw4ICYjNDM7MTE1NSw4IEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXG4gXHRcdFx0dG1wX3N0ci5uYW1lID0gZGUtXHUwMDNlbmFtZTtcbiBcdFx0XHR0bXBfc3RyLmxlbiA9IGRlLVx1MDAzZW5hbWVfbGVuO1xuIFx0XHRcdGVyciA9IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLFxuLVx0XHRcdFx0ICAgaGluZm8tXHUwMDNlaGFzaCwgaGluZm8tXHUwMDNlbWlub3JfaGFzaCwgZGUsXG4tXHRcdFx0XHQgICBcdTAwMjZ0bXBfc3RyKTtcbiYjNDM7XHRcdFx0XHQgICBoaW5mby1cdTAwM2VoYXNoLCBoaW5mby1cdTAwM2VtaW5vcl9oYXNoLFxuJiM0MztcdFx0XHRcdCAgIGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplLCBkZSwgXHUwMDI2dG1wX3N0cik7XG4gXHRcdH0gZWxzZSB7XG4gXHRcdFx0aW50IHNhdmVfbGVuID0gZm5hbWVfY3J5cHRvX3N0ci5sZW47XG4gXHRcdFx0c3RydWN0IGZzY3J5cHRfc3RyIGRlX25hbWUgPSBGU1RSX0lOSVQoZGUtXHUwMDNlbmFtZSxcbkBAIC0xMTIzLDggJiM0MzsxMTcxLDkgQEAgc3RhdGljIGludCBodHJlZV9kaXJibG9ja190b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdFx0XHRcdGdvdG8gZXJyb3V0O1xuIFx0XHRcdH1cbiBcdFx0XHRlcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSxcbi1cdFx0XHRcdCAgIGhpbmZvLVx1MDAzZWhhc2gsIGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gsIGRlLFxuLVx0XHRcdFx0XHRcdTAwMjZmbmFtZV9jcnlwdG9fc3RyKTtcbiYjNDM7XHRcdFx0XHRcdFx0aGluZm8tXHUwMDNlaGFzaCwgaGluZm8tXHUwMDNlbWlub3JfaGFzaCxcbiYjNDM7XHRcdFx0XHRcdFx0ZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUsIGRlLFxuJiM0MztcdFx0XHRcdFx0XHRcdTAwMjZmbmFtZV9jcnlwdG9fc3RyKTtcbiBcdFx0XHRmbmFtZV9jcnlwdG9fc3RyLmxlbiA9IHNhdmVfbGVuO1xuIFx0XHR9XG4gXHRcdGlmIChlcnIgIT0gMCkge1xuQEAgLTEyMDIsNiAmIzQzOzEyNTEsNyBAQCBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLFxuIFx0XHR0bXBfc3RyLm5hbWUgPSBkZS1cdTAwM2VuYW1lO1xuIFx0XHR0bXBfc3RyLmxlbiA9IGRlLVx1MDAzZW5hbWVfbGVuO1xuIFx0XHRlcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwgMCwgMCxcbiYjNDM7XHRcdFx0XHRcdCAgICAgIGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplLFxuIFx0XHRcdFx0XHQgICAgICBkZSwgXHUwMDI2dG1wX3N0cik7XG4gXHRcdGlmIChlcnIgIT0gMClcbiBcdFx0XHRnb3RvIGVycm91dDtcbkBAIC0xMjEzLDYgJiM0MzsxMjYzLDcgQEAgaW50IGV4dDRfaHRyZWVfZmlsbF90cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgc3RhcnRfaGFzaCxcbiBcdFx0dG1wX3N0ci5uYW1lID0gZGUtXHUwMDNlbmFtZTtcbiBcdFx0dG1wX3N0ci5sZW4gPSBkZS1cdTAwM2VuYW1lX2xlbjtcbiBcdFx0ZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsIDIsIDAsXG4mIzQzO1x0XHRcdFx0XHQgICAgICBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSxcbiBcdFx0XHRcdFx0ICAgICAgZGUsIFx1MDAyNnRtcF9zdHIpO1xuIFx0XHRpZiAoZXJyICE9IDApXG4gXHRcdFx0Z290byBlcnJvdXQ7XG5AQCAtMTI1MCwxMiAmIzQzOzEzMDEsMTIgQEAgaW50IGV4dDRfaHRyZWVfZmlsbF90cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgc3RhcnRfaGFzaCxcbiBcdFx0ICAgIChjb3VudCBcdTAwMjZcdTAwMjYgKChoYXNodmFsIFx1MDAyNiAxKSA9PSAwKSkpXG4gXHRcdFx0YnJlYWs7XG4gXHR9XG4tXHRkeF9yZWxlYXNlKGZyYW1lcyk7XG4mIzQzO1x0ZHhfcmVsZWFzZShkaXIsIGZyYW1lcyk7XG4gXHRkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHIFwmIzM0O0ZpbGwgdHJlZTogcmV0dXJuZWQgJWQgZW50cmllcywgXCYjMzQ7XG4gXHRcdCAgICAgICBcJiMzNDtuZXh0IGhhc2g6ICV4XFxuXCYjMzQ7LCBjb3VudCwgKm5leHRfaGFzaCkpO1xuIFx0cmV0dXJuIGNvdW50O1xuIGVycm91dDpcbi1cdGR4X3JlbGVhc2UoZnJhbWVzKTtcbiYjNDM7XHRkeF9yZWxlYXNlKGRpciwgZnJhbWVzKTtcbiBcdHJldHVybiAoZXJyKTtcbiB9XG4gXG5AQCAtMTI3Myw2ICYjNDM7MTMyNCwyMDcgQEAgc3RhdGljIGlubGluZSBpbnQgc2VhcmNoX2RpcmJsb2NrKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXG4gICogRGlyZWN0b3J5IGJsb2NrIHNwbGl0dGluZywgY29tcGFjdGluZ1xuICAqL1xuIFxuJiM0MzsvKlxuJiM0MzsgKiBleHQ0X2RpcmRhdGFfZ2V0KCkgLSBSZWFkIGRpcmRhdGEgZmllbGRzIGZyb20gYSBkaXJlY3RvcnkgZW50cnkuXG4mIzQzOyAqIEBkZTogICAgICAgICBkaXJlY3RvcnkgZW50cnlcbiYjNDM7ICogQGRpcjogICAgICAgIGRpcmVjdG9yeSBpbm9kZSAodXNlZCBmb3IgZnNjcnlwdCYjNDM7Y2FzZWZvbGQgaGFzaCBmYWxsYmFjaylcbiYjNDM7ICogQGRmaWQ6ICAgICAgaWYgbm9uLU5VTEwgYW5kIEVYVDRfRElSRU5UX0xVRklEIGlzIHNldCwgTFVGSUQgZGF0YSBpcyBjb3BpZWRcbiYjNDM7ICogXHRcdGhlcmVcbiYjNDM7ICogQGhpbmZvOlx0aWYgbm9uLU5VTEwsIHJlY2VpdmVzIHRoZSBjYXNlZm9sZCBoYXNoIGFuZCBtaW5vciBoYXNoXG4mIzQzOyAqXG4mIzQzOyAqIFJlYWRzIGFueSBkaXJkYXRhIHN0b3JlZCBpbiBAZGUuICBJZiB0aGUgZGlyZGF0YSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLFxuJiM0MzsgKiBmYWxscyBiYWNrIHRvIHJlYWRpbmcgdGhlIGhhc2ggc3RvcmVkIGlubGluZSBhZnRlciB0aGUgZmlsZW5hbWUgKGZvclxuJiM0MzsgKiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIGNhc2Vmb2xkJiM0Mztmc2NyeXB0IGZvcm1hdCkuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnMgYSBiaXRtYXNrIG9mIEVYVDRfRElSRU5UXyogZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBmaWVsZHMgd2VyZSByZWFkLlxuJiM0MzsgKlxuJiM0MzsgKiBDb21wYXRpYmlsaXR5IG5vdGU6IGVuYWJsaW5nIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBIG9uIGEgZmlsZXN5c3RlbVxuJiM0MzsgKiB0aGF0IGFscmVhZHkgaGFzIGNhc2Vmb2xkZWQmIzQzO2VuY3J5cHRlZCBkaXJlY3RvcmllcyBpcyBOT1Qgc2FmZSB3aXRob3V0IGFcbiYjNDM7ICogcHJpb3IgbWlncmF0aW9uIHBhc3MuICBCZWZvcmUgZGlyZGF0YSwgdGhlIGNhc2Vmb2xkJiM0Mztmc2NyeXB0IGhhc2ggd2FzIHN0b3JlZFxuJiM0MzsgKiBhcyBhIHJhdyA4IGJ5dGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlbmFtZSB3aXRoIG5vIGZsYWcgaW4gZmlsZV90eXBlLlxuJiM0MzsgKiBBZnRlciBkaXJkYXRhIGlzIGVuYWJsZWQsIHRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGUgaGFzaCB0byBiZSBwcmVzZW50IG9ubHlcbiYjNDM7ICogd2hlbiBFWFQ0X0RJUkVOVF9DRkhBU0ggKDB4NDApIGlzIHNldCBpbiBmaWxlX3R5cGU7IGV4aXN0aW5nIGVudHJpZXMgdGhhdFxuJiM0MzsgKiBjYXJyeSB0aGUgcmF3IGhhc2ggYXJlIHNpbGVudGx5IG1pc3JlYWQgYXMgaGF2aW5nIG5vIGhhc2ggYXQgYWxsLCBicmVha2luZ1xuJiM0MzsgKiBkaXJlY3RvcnkgbG9va3Vwcy4gIGUyZnNjayBtdXN0IGJlIHJ1biB0byBjb252ZXJ0IGFsbCBhZmZlY3RlZCBlbnRyaWVzIHRvXG4mIzQzOyAqIHRoZSBFWFQ0X0RJUkVOVF9DRkhBU0ggZXh0ZW5zaW9uIGZvcm1hdCBiZWZvcmUgdGhlIGZlYXR1cmUgZmxhZyBpcyBzZXQgd2l0aFxuJiM0MzsgKiB0dW5lMmZzLiAgRGV0ZWN0aW9uIGhldXJpc3RpYzogaW4gYSBjYXNlZm9sZCYjNDM7ZW5jcnlwdGVkIGRpcmVjdG9yeSwgYW4gZW50cnlcbiYjNDM7ICogd2l0aCByZWNfbGVuIFx1MDAzZT0gcm91bmRfdXAobmFtZV9sZW4sIDQpICYjNDM7IDggYW5kIG5vIEVYVDRfRElSRU5UX0NGSEFTSCBiaXRcbiYjNDM7ICogY2FycmllcyBhIHJhdyBwcmUtZGlyZGF0YSBoYXNoIHRoYXQgbXVzdCBiZSBtaWdyYXRlZC5cbiYjNDM7ICovXG4mIzQzO3Vuc2lnbmVkIGNoYXIgZXh0NF9kaXJkYXRhX2dldChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuJiM0MztcdFx0XHQgICAgICAgaW50IGJ1Zl9zaXplLFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZCxcbiYjNDM7XHRcdFx0ICAgICAgIHN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgY2hhciByZXQgPSAwO1xuJiM0MztcdHVuc2lnbmVkIGludCBkYXRhX29mZnNldCA9IGRlLVx1MDAzZW5hbWVfbGVuICYjNDM7IDE7XG4mIzQzO1x0dW5zaWduZWQgaW50IHJlY19sZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcbiYjNDM7XG4mIzQzO1x0LyogZGF0YV9vZmZzZXQgaXMgcmVsYXRpdmUgdG8gZGUtXHUwMDNlbmFtZSwgd2hpY2ggaXRzZWxmIHN0YXJ0c1xuJiM0MztcdCAqIEVYVDRfQkFTRV9ESVJfTEVOIGJ5dGVzIGludG8gdGhlIGVudHJ5IC0tIHJlY19sZW4gaXMgcmVsYXRpdmUgdG9cbiYjNDM7XHQgKiB0aGUgc3RhcnQgb2YgdGhlIGVudHJ5LCBzbyBhZGQgdGhlIGhlYWRlciBzaXplIGJlZm9yZSBjb21wYXJpbmcsXG4mIzQzO1x0ICogb3IgdGhpcyBsZXRzIHJlYWRzIHJ1biBFWFQ0X0JBU0VfRElSX0xFTiBieXRlcyBwYXN0IHRoZSBlbnRyeS4gKi9cbiYjNDM7XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgXHUwMDNlIHJlY19sZW4pXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHQvKiBjb21wYXRpYmlsaXR5OiBoYXNoIHN0b3JlZCBpbmxpbmUgYWZ0ZXIgZmlsZW5hbWUgKG5vIGRpcmRhdGEpICovXG4mIzQzO1x0aWYgKGhpbmZvIFx1MDAyNlx1MDAyNiAhZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci1cdTAwM2VpX3NiKSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7XG4mIzQzO1x0XHRoaW5mby1cdTAwM2VoYXNoID0gRVhUNF9ESVJFTlRfSEFTSChkZSk7XG4mIzQzO1x0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gRVhUNF9ESVJFTlRfTUlOT1JfSEFTSChkZSk7XG4mIzQzO1x0XHRyZXQgfD0gRVhUNF9ESVJFTlRfQ0ZIQVNIO1xuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIEVYVDRfRElSRU5UXyogYml0cyBhcmUgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCAqL1xuJiM0MztcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci1cdTAwM2VpX3NiKSlcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGlmIChkZS1cdTAwM2VmaWxlX3R5cGUgXHUwMDI2IEVYVDRfRElSRU5UX0xVRklEKSB7XG4mIzQzO1x0XHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkaXNrX2ZpZCA9XG4mIzQzO1x0XHRcdChzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICopKChjaGFyICopZGUgJiM0MztcbiYjNDM7XHRcdFx0RVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQpO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IGRsZW47XG4mIzQzO1x0XHQvKiBzdHJ1Y3QgZXh0NF9maWQgZGZfZmlkW10gZG9lcyBub3QgcHJvdmlkZSB0aGUgYXJyYXkgc2l6ZS5cbiYjNDM7XHRcdCAqIEZpcnN0LCB2ZXJpZnkgdGhhdCB0aGUgaGVhZGVyIGxpZXMgd2l0aGluIHRoZSB2YWxpZCBhcmVhLCB0aGVuXG4mIzQzOyBcdFx0ICogdmVyaWZ5IHRoYXQgdGhlIGVudGlyZSByZWNvcmQgZml0cyB3aXRoaW4gaXQuICovXG4mIzQzO1x0XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0MztcbiYjNDM7XHRcdCAgICBzaXplb2YoZGlza19maWQtXHUwMDNlZGZfaGVhZGVyKSBcdTAwM2UgcmVjX2xlbilcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0XHRkbGVuID0gZGlza19maWQtXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XG4mIzQzO1x0XHRpZiAoZGxlbiA9PSAwIHx8XG4mIzQzO1x0XHQgICAgRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0MzsgZGxlbiBcdTAwM2UgcmVjX2xlbilcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoZGZpZCkge1xuJiM0MztcdFx0XHQvKiBUaGUgc2l6ZSBjYXAgYmVsb3cgZW5zdXJlcyB0aGUgcmVjb3JkIGhvbGRzIGF0IGxlYXN0XG4mIzQzO1x0XHRcdCAqIG9uZSBjb21wbGV0ZSBzdHJ1Y3QgZXh0NF9maWQuICovXG4mIzQzO1x0XHRcdGlmIChkbGVuIFx1MDAzZSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyKSAmIzQzO1xuJiM0MztcdFx0XHRcdCAgICBzaXplb2Yoc3RydWN0IGV4dDRfZmlkKSlcbiYjNDM7XHRcdFx0XHRyZXR1cm4gcmV0O1xuJiM0MztcdFx0XHRtZW1jcHkoZGZpZCwgZGlza19maWQsIGRsZW4pO1xuJiM0MztcdFx0XHRyZXQgfD0gRVhUNF9ESVJFTlRfTFVGSUQ7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRkYXRhX29mZnNldCAmIzQzOz0gZGxlbjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIFNraXAgSU5PNjQgZm9yIG5vdyovXG4mIzQzO1x0aWYgKGRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjYgRVhUNF9ESVJFTlRfSU5PNjQpIHtcbiYjNDM7XHRcdHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqZGRoID1cbiYjNDM7XHRcdCAgICAgICAoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopKChjaGFyICopZGUgJiM0MzsgRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQpO1xuJiM0MztcdFx0dW5zaWduZWQgaW50IGRsZW47XG4mIzQzO1xuJiM0MztcdFx0aWYgKEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICYjNDM7IHNpemVvZigqZGRoKSBcdTAwM2UgcmVjX2xlbilcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0XHRkbGVuID0gZGRoLVx1MDAzZWRkaF9sZW5ndGg7XG4mIzQzO1x0XHRpZiAoZGxlbiBcdTAwM2Mgc2l6ZW9mKCpkZGgpIHx8XG4mIzQzO1x0XHQgICAgRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0MzsgZGxlbiBcdTAwM2UgcmVjX2xlbilcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0XHRkYXRhX29mZnNldCAmIzQzOz0gZGxlbjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghaGluZm8pXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRpZiAoZGUtXHUwMDNlZmlsZV90eXBlIFx1MDAyNiBFWFQ0X0RJUkVOVF9DRkhBU0gpIHtcbiYjNDM7XHRcdHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICpkaCA9XG4mIzQzO1x0XHRcdChzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCAqKSgoY2hhciAqKWRlICYjNDM7IEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0KTtcbiYjNDM7XHRcdHVuc2lnbmVkIGludCBkbGVuO1xuJiM0MztcbiYjNDM7XHRcdGlmIChFWFQ0X0JBU0VfRElSX0xFTiAmIzQzOyBkYXRhX29mZnNldCAmIzQzOyBzaXplb2YoKmRoKSBcdTAwM2UgcmVjX2xlbilcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHRcdGRsZW4gPSBkaC1cdTAwM2VkaF9oZWFkZXIuZGRoX2xlbmd0aDtcbiYjNDM7XHRcdGlmIChkbGVuIFx1MDAzYyBzaXplb2YoKmRoKSB8fFxuJiM0MztcdFx0ICAgIEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICYjNDM7IGRsZW4gXHUwMDNlIHJlY19sZW4pXG4mIzQzO1x0XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdFx0aGluZm8tXHUwMDNlaGFzaCA9IGxlMzJfdG9fY3B1KGRoLVx1MDAzZWRoX2hhc2guaGFzaCk7XG4mIzQzO1x0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gbGUzMl90b19jcHUoZGgtXHUwMDNlZGhfaGFzaC5taW5vcl9oYXNoKTtcbiYjNDM7XHRcdHJldCB8PSBFWFQ0X0RJUkVOVF9DRkhBU0g7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBleHQ0X2RpcmRhdGFfc2V0KCkgLSBXcml0ZSBkaXJkYXRhIGZpZWxkcyBpbnRvIGEgZGlyZWN0b3J5IGVudHJ5LlxuJiM0MzsgKiBAZGU6ICAgIGRpcmVjdG9yeSBlbnRyeSAobmFtZSBtdXN0IGFscmVhZHkgYmUgc2V0KVxuJiM0MzsgKiBAZGlyOiAgIGRpcmVjdG9yeSBpbm9kZVxuJiM0MzsgKiBAZGF0YTogIExVRklEIGRhdGEgdG8gc3RvcmUgKG9yIE5VTEwpXG4mIzQzOyAqIEBmbmFtZTogZmlsZW5hbWUgaW5mbyBjYXJyeWluZyB0aGUgY2FzZWZvbGQgaGFzaFxuJiM0MzsgKlxuJiM0MzsgKiBXcml0ZXMgYW55IHJlcXVpcmVkIGRpcmRhdGEgaW50byBAZGUgYWZ0ZXIgdGhlIGZpbGVuYW1lLiAgSWYgdGhlIGRpcmRhdGFcbiYjNDM7ICogZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmFsbHMgYmFjayB0byB3cml0aW5nIHRoZSBoYXNoIGlubGluZSBhZnRlciB0aGVcbiYjNDM7ICogZmlsZW5hbWUgKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIGNhc2Vmb2xkJiM0Mztmc2NyeXB0IGZvcm1hdCkuXG4mIzQzOyAqXG4mIzQzOyAqIFNlZSBleHQ0X2RpcmRhdGFfZ2V0KCkgZm9yIHRoZSBjb21wYXRpYmlsaXR5IGNvbnN0cmFpbnQ6IGVuYWJsaW5nIHRoZVxuJiM0MzsgKiBkaXJkYXRhIGZlYXR1cmUgb24gYSBmaWxlc3lzdGVtIHdpdGggZXhpc3RpbmcgY2FzZWZvbGRlZCYjNDM7ZW5jcnlwdGVkXG4mIzQzOyAqIGRpcmVjdG9yaWVzIHJlcXVpcmVzIGFuIGUyZnNjayBtaWdyYXRpb24gcGFzcyBiZWZvcmUgdHVuZTJmcyBzZXRzIHRoZVxuJiM0MzsgKiBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQSBzdXBlcmJsb2NrIGZsYWcuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBleHQ0X2RpcmRhdGFfc2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZCxcbiYjNDM7XHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbyA9IFx1MDAyNmZuYW1lLVx1MDAzZWhpbmZvO1xuJiM0MztcdHVuc2lnbmVkIGludCBkYXRhX29mZnNldCA9IGRlLVx1MDAzZW5hbWVfbGVuICYjNDM7IDE7XG4mIzQzO1x0dW5zaWduZWQgaW50IHJlY19sZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sXG4mIzQzO1x0XHRcdFx0XHRcdCAgICAgICBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4mIzQzO1xuJiM0MztcdC8qIENsZWFyIHRoZSBnYXAgYnl0ZSBiZXR3ZWVuIHRoZSBmaWxlbmFtZSBhbmQgdGhlIGZpcnN0IGRpcmRhdGFcbiYjNDM7XHQgKiBleHRlbnNpb24gdG8gYXZvaWQgbGVha2luZyBzdGFsZSBtZW1vcnkgdG8gZGlzay4gIFVzZSBwb2ludGVyXG4mIzQzO1x0ICogYXJpdGhtZXRpYyByYXRoZXIgdGhhbiBkZS1cdTAwM2VuYW1lW25hbWVfbGVuXSB0byBzdGF5IHdpdGhpbiB0aGVcbiYjNDM7XHQgKiBkZWNsYXJlZCBuYW1lW10gYXJyYXkgYm91bmRzIHVuZGVyIEZPUlRJRllfU09VUkNFLiAgT25seSB3cml0ZSBpdFxuJiM0MztcdCAqIHdoZW4gdGhlcmUgaXMgYWN0dWFsbHkgcm9vbSAoZW50cmllcyB0aGF0IGV4YWN0bHkgZmlsbCB0aGVpciBzbG90XG4mIzQzO1x0ICogaGF2ZSByZWNfbGVuID09IEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IG5hbWVfbGVuIHdpdGggbm8gZ2FwKS4gKi9cbiYjNDM7XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgXHUwMDNjPSByZWNfbGVuKVxuJiM0MztcdFx0KigoY2hhciAqKWRlICYjNDM7IEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRlLVx1MDAzZW5hbWVfbGVuKSA9IDA7XG4mIzQzO1xuJiM0MztcdGlmIChkZmlkKSB7XG4mIzQzO1x0XHR1bnNpZ25lZCBpbnQgZGxlbiA9IGRmaWQtXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XG4mIzQzO1xuJiM0MztcdFx0aWYgKEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICYjNDM7IGRsZW4gXHUwMDNlIHJlY19sZW4pIHtcbiYjNDM7XHRcdFx0RVhUNF9FUlJPUl9JTk9ERShkaXIsIFwmIzM0O0NhbiBub3QgaW5zZXJ0IEZJRFwmIzM0Oyk7XG4mIzQzO1x0XHRcdHJldHVybjtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRtZW1jcHkoKGNoYXIgKilkZSAmIzQzOyBFWFQ0X0JBU0VfRElSX0xFTiAmIzQzOyBkYXRhX29mZnNldCwgZGZpZCwgZGxlbik7XG4mIzQzO1x0XHRkZS1cdTAwM2VmaWxlX3R5cGUgfD0gRVhUNF9ESVJFTlRfTFVGSUQ7XG4mIzQzO1x0XHRkYXRhX29mZnNldCAmIzQzOz0gZGxlbjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpIHtcbiYjNDM7XHRcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVx1MDAzZWlfc2IpKSB7XG4mIzQzO1x0XHRcdHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICpkaCA9XG4mIzQzO1x0XHRcdCAgICAoc3RydWN0IGV4dDRfZGlyZW50X2hhc2ggKikoKGNoYXIgKilkZSAmIzQzOyBFWFQ0X0JBU0VfRElSX0xFTiAmIzQzOyBkYXRhX29mZnNldCk7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0Mzsgc2l6ZW9mKCpkaCkgXHUwMDNlIHJlY19sZW4pIHtcbiYjNDM7XHRcdFx0XHRFWFQ0X0VSUk9SX0lOT0RFKGRpciwgXCYjMzQ7Q2FuIG5vdCBpbnNlcnQgZGhhc2ggZGlyZGF0YVwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0cmV0dXJuO1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHRkaC1cdTAwM2VkaF9oZWFkZXIuZGRoX2xlbmd0aCA9IHNpemVvZigqZGgpO1xuJiM0MztcdFx0XHRkaC1cdTAwM2VkaF9oYXNoLmhhc2ggPSBjcHVfdG9fbGUzMihoaW5mby1cdTAwM2VoYXNoKTtcbiYjNDM7XHRcdFx0ZGgtXHUwMDNlZGhfaGFzaC5taW5vcl9oYXNoID0gY3B1X3RvX2xlMzIoaGluZm8tXHUwMDNlbWlub3JfaGFzaCk7XG4mIzQzO1x0XHRcdGRlLVx1MDAzZWZpbGVfdHlwZSB8PSBFWFQ0X0RJUkVOVF9DRkhBU0g7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHQvKiBDb21wYXRpYmlsaXR5OiBzdG9yZSBoYXNoIGlubGluZSBhZnRlciBmaWxlbmFtZSAqL1xuJiM0MztcdFx0XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0MztcbiYjNDM7XHRcdFx0ICAgIHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfaGFzaCkgXHUwMDNlIHJlY19sZW4pIHtcbiYjNDM7XHRcdFx0XHRFWFQ0X0VSUk9SX0lOT0RFKGRpciwgXCYjMzQ7Q2FuIG5vdCBpbnNlcnQgZGhhc2hcJiMzNDspO1xuJiM0MztcdFx0XHRcdHJldHVybjtcbiYjNDM7XHRcdFx0fVxuJiM0MztcbiYjNDM7XHRcdFx0RVhUNF9ESVJFTlRfSEFTSEVTKGRlKS1cdTAwM2VoYXNoID0gY3B1X3RvX2xlMzIoaGluZm8tXHUwMDNlaGFzaCk7XG4mIzQzO1x0XHRcdEVYVDRfRElSRU5UX0hBU0hFUyhkZSktXHUwMDNlbWlub3JfaGFzaCA9XG4mIzQzO1x0XHRcdFx0XHRcdGNwdV90b19sZTMyKGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gpO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIENyZWF0ZSBtYXAgb2YgaGFzaCB2YWx1ZXMsIG9mZnNldHMsIGFuZCBzaXplcywgc3RvcmVkIGF0IGVuZCBvZiBibG9jay5cbiAgKiBSZXR1cm5zIG51bWJlciBvZiBlbnRyaWVzIG1hcHBlZC5cbkBAIC0xMjk2LDkgJiM0MzsxNTQ4LDkgQEAgc3RhdGljIGludCBkeF9tYWtlX21hcChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbiBcdFx0XHRcdFx0ICgoY2hhciAqKWRlKSAtIGJhc2UpKVxuIFx0XHRcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xuIFx0XHRpZiAoZGUtXHUwMDNlbmFtZV9sZW4gXHUwMDI2XHUwMDI2IGRlLVx1MDAzZWlub2RlKSB7XG4tXHRcdFx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSlcbi1cdFx0XHRcdGguaGFzaCA9IEVYVDRfRElSRU5UX0hBU0goZGUpO1xuLVx0XHRcdGVsc2Uge1xuJiM0MztcdFx0XHRpZiAoIShleHQ0X2RpcmRhdGFfZ2V0KGRlLCBkaXIsIGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplLFxuJiM0MztcdFx0XHRcdFx0ICAgICAgIE5VTEwsIFx1MDAyNmgpIFx1MDAyNlxuJiM0MztcdFx0XHRcdFx0XHRFWFQ0X0RJUkVOVF9DRkhBU0gpKSB7XG4gXHRcdFx0XHRpbnQgZXJyID0gZXh0NGZzX2Rpcmhhc2goZGlyLCBkZS1cdTAwM2VuYW1lLFxuIFx0XHRcdFx0XHRcdCAgICAgZGUtXHUwMDNlbmFtZV9sZW4sIFx1MDAyNmgpO1xuIFx0XHRcdFx0aWYgKGVyciBcdTAwM2MgMClcbkBAIC0xNDg4LDcgJiM0MzsxNzQwLDcgQEAgaW50IGV4dDRfc2VhcmNoX2RpcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBjaGFyICpzZWFyY2hfYnVmLCBpbnQgYnVmX3NpemUsXG4gfVxuIFxuIHN0YXRpYyBpbnQgaXNfZHhfaW50ZXJuYWxfbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgZXh0NF9sYmxrX3QgYmxvY2ssXG4tXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGUpXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUpXG4ge1xuIFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci1cdTAwM2VpX3NiO1xuIFxuQEAgLTE2MTksNyAmIzQzOzE4NzEsNyBAQCBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpfX2V4dDRfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdFx0fVxuIFx0XHRpZiAoIWJ1ZmZlcl92ZXJpZmllZChiaCkgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICAhaXNfZHhfaW50ZXJuYWxfbm9kZShkaXIsIGJsb2NrLFxuLVx0XHRcdFx0XHQgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqKWJoLVx1MDAzZWJfZGF0YSkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHRcdFx0XHQgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtXHUwMDNlYl9kYXRhKSBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgICFleHQ0X2RpcmJsb2NrX2NzdW1fdmVyaWZ5KGRpciwgYmgpKSB7XG4gXHRcdFx0RVhUNF9FUlJPUl9JTk9ERV9FUlIoZGlyLCBFRlNCQURDUkMsXG4gXHRcdFx0XHRcdCAgICAgXCYjMzQ7Y2hlY2tzdW1taW5nIGRpcmVjdG9yeSBcJiMzNDtcbkBAIC0xNzUzLDcgJiM0MzsyMDA1LDcgQEAgc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDRfZHhfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpcixcbiBlcnJvdXQ6XG4gXHRkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHIFwmIzM0OyVzIG5vdCBmb3VuZFxcblwmIzM0OywgZm5hbWUtXHUwMDNldXNyX2ZuYW1lLVx1MDAzZW5hbWUpKTtcbiBzdWNjZXNzOlxuLVx0ZHhfcmVsZWFzZShmcmFtZXMpO1xuJiM0MztcdGR4X3JlbGVhc2UoZGlyLCBmcmFtZXMpO1xuIFx0cmV0dXJuIGJoO1xuIH1cbiBcbkBAIC0xODUwLDcgJiM0MzsyMTAyLDcgQEAgZHhfbW92ZV9kaXJlbnRzKHN0cnVjdCBpbm9kZSAqZGlyLCBjaGFyICpmcm9tLCBjaGFyICp0byxcbiBcdHdoaWxlIChjb3VudC0tKSB7XG4gXHRcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKVxuIFx0XHRcdFx0XHRcdChmcm9tICYjNDM7IChtYXAtXHUwMDNlb2Zmc1x1MDAzY1x1MDAzYzIpKTtcbi1cdFx0cmVjX2xlbiA9IGV4dDRfZGlyX3JlY19sZW4oZGUtXHUwMDNlbmFtZV9sZW4sIGRpcik7XG4mIzQzO1x0XHRyZWNfbGVuID0gZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBibG9ja3NpemUsIGRpcik7XG4gXG4gXHRcdG1lbWNweSAodG8sIGRlLCByZWNfbGVuKTtcbiBcdFx0KChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSB0byktXHUwMDNlcmVjX2xlbiA9XG5AQCAtMTg4Myw3ICYjNDM7MjEzNSw3IEBAIHN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZHhfcGFja19kaXJlbnRzKHN0cnVjdCBpbm9kZSAqZGlyLCBjaGFyICpiYXNlLFxuIFx0d2hpbGUgKChjaGFyKilkZSBcdTAwM2MgYmFzZSAmIzQzOyBibG9ja3NpemUpIHtcbiBcdFx0bmV4dCA9IGV4dDRfbmV4dF9lbnRyeShkZSwgYmxvY2tzaXplKTtcbiBcdFx0aWYgKGRlLVx1MDAzZWlub2RlIFx1MDAyNlx1MDAyNiBkZS1cdTAwM2VuYW1lX2xlbikge1xuLVx0XHRcdHJlY19sZW4gPSBleHQ0X2Rpcl9yZWNfbGVuKGRlLVx1MDAzZW5hbWVfbGVuLCBkaXIpO1xuJiM0MztcdFx0XHRyZWNfbGVuID0gZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBibG9ja3NpemUsIGRpcik7XG4gXHRcdFx0aWYgKGRlIFx1MDAzZSB0bylcbiBcdFx0XHRcdG1lbW1vdmUodG8sIGRlLCByZWNfbGVuKTtcbiBcdFx0XHR0by1cdTAwM2VyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2socmVjX2xlbiwgYmxvY2tzaXplKTtcbkBAIC0yMDM1LDEwICYjNDM7MjI4NywxNSBAQCBzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRvX3NwbGl0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIGludCBleHQ0X2ZpbmRfZGVzdF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbiBcdFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgYnVmX3NpemUsXG4gXHRcdCAgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbi1cdFx0ICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipkZXN0X2RlKVxuJiM0MztcdFx0ICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipkZXN0X2RlLFxuJiM0MztcdFx0ICAgICAgaW50IGRsZW4pXG4ge1xuIFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlO1xuLVx0dW5zaWduZWQgc2hvcnQgcmVjbGVuID0gZXh0NF9kaXJfcmVjX2xlbihmbmFtZV9sZW4oZm5hbWUpLCBkaXIpO1xuJiM0MztcdC8qIFdoZW4gZGlyZGF0YSBleHRlbnNpb25zIGFyZSBwcmVzZW50LCBhIE5VTCBnYXAgYnl0ZSBzaXRzIGJldHdlZW5cbiYjNDM7XHQgKiB0aGUgZmlsZW5hbWUgYW5kIHRoZSBmaXJzdCBleHRlbnNpb247IGFjY291bnQgZm9yIGl0IHNvIHRoZSBmb3VuZFxuJiM0MztcdCAqIHNsb3QgaXMgYWx3YXlzIGxhcmdlIGVub3VnaCBmb3IgZXh0NF9kaXJkYXRhX3NldCgpIHRvIHdyaXRlIGludG8uICovXG4mIzQzO1x0dW5zaWduZWQgc2hvcnQgcmVjbGVuID0gZXh0NF9kaXJlbnRfcmVjX2xlbihmbmFtZV9sZW4oZm5hbWUpICYjNDM7IGRsZW4gJiM0MztcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIChkbGVuID8gMSA6IDApLCBkaXIpO1xuIFx0aW50IG5sZW4sIHJsZW47XG4gXHR1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDtcbiBcdGNoYXIgKnRvcDtcbkBAIC0yMDUxLDcgJiM0MzsyMzA4LDcgQEAgaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuIFx0XHRcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xuIFx0XHRpZiAoZXh0NF9tYXRjaChkaXIsIGZuYW1lLCBkZSkpXG4gXHRcdFx0cmV0dXJuIC1FRVhJU1Q7XG4tXHRcdG5sZW4gPSBleHQ0X2Rpcl9yZWNfbGVuKGRlLVx1MDAzZW5hbWVfbGVuLCBkaXIpO1xuJiM0MztcdFx0bmxlbiA9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgYnVmX3NpemUsIGRpcik7XG4gXHRcdHJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcbiBcdFx0aWYgKChkZS1cdTAwM2Vpbm9kZSA/IHJsZW4gLSBubGVuIDogcmxlbikgXHUwMDNlPSByZWNsZW4pXG4gXHRcdFx0YnJlYWs7XG5AQCAtMjA2NSwxNiAmIzQzOzIzMjIsMTMgQEAgaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLFxuLVx0XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tXHRcdFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxuLVx0XHRcdGludCBidWZfc2l6ZSxcbi1cdFx0XHRzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUpXG4mIzQzO3ZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCBpbnQgYnVmX3NpemUsXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCB2b2lkICpkYXRhKVxuIHtcbi1cbiBcdGludCBubGVuLCBybGVuO1xuIFxuLVx0bmxlbiA9IGV4dDRfZGlyX3JlY19sZW4oZGUtXHUwMDNlbmFtZV9sZW4sIGRpcik7XG4mIzQzO1x0bmxlbiA9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgYnVmX3NpemUsIGRpcik7XG4gXHRybGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLCBidWZfc2l6ZSk7XG4gXHRpZiAoZGUtXHUwMDNlaW5vZGUpIHtcbiBcdFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlMSA9XG5AQCAtMjA4OCwxMyAmIzQzOzIzNDIsNyBAQCB2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdGV4dDRfc2V0X2RlX3R5cGUoaW5vZGUtXHUwMDNlaV9zYiwgZGUsIGlub2RlLVx1MDAzZWlfbW9kZSk7XG4gXHRkZS1cdTAwM2VuYW1lX2xlbiA9IGZuYW1lX2xlbihmbmFtZSk7XG4gXHRtZW1jcHkoZGUtXHUwMDNlbmFtZSwgZm5hbWVfbmFtZShmbmFtZSksIGZuYW1lX2xlbihmbmFtZSkpO1xuLVx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkge1xuLVx0XHRzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbyA9IFx1MDAyNmZuYW1lLVx1MDAzZWhpbmZvO1xuLVxuLVx0XHRFWFQ0X0RJUkVOVF9IQVNIRVMoZGUpLVx1MDAzZWhhc2ggPSBjcHVfdG9fbGUzMihoaW5mby1cdTAwM2VoYXNoKTtcbi1cdFx0RVhUNF9ESVJFTlRfSEFTSEVTKGRlKS1cdTAwM2VtaW5vcl9oYXNoID1cbi1cdFx0XHRcdFx0XHRjcHVfdG9fbGUzMihoaW5mby1cdTAwM2VtaW5vcl9oYXNoKTtcbi1cdH1cbiYjNDM7XHRleHQ0X2RpcmRhdGFfc2V0KGRlLCBkaXIsIGRhdGEsIGZuYW1lKTtcbiB9XG4gXG4gLypcbkBAIC0yMTEyLDE0ICYjNDM7MjM2MCwyOCBAQCBzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbiB7XG4gXHR1bnNpZ25lZCBpbnRcdGJsb2Nrc2l6ZSA9IGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuIFx0aW50XHRcdGNzdW1fc2l6ZSA9IDA7XG4tXHRpbnRcdFx0ZXJyLCBlcnIyO1xuJiM0MztcdGludFx0XHRlcnIsIGVycjIsIGRsZW4gPSAwO1xuJiM0MztcdHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRmaWQ7XG4gXG4gXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGlub2RlLVx1MDAzZWlfc2IpKVxuIFx0XHRjc3VtX3NpemUgPSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpO1xuIFxuJiM0MztcdC8qIGRmaWQgaXMgcmVzb2x2ZWQgb25jZSBieSBleHQ0X2FkZF9lbnRyeSgpIGFuZCBzdG9yZWQgaW4gZm5hbWUgc29cbiYjNDM7XHQgKiB0aGF0IGFsbCBhZGRfZGlyZW50X3RvX2J1ZigpIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSBhZGQgb3BlcmF0aW9uXG4mIzQzO1x0ICogdXNlIGEgY29uc2lzdGVudCB2YWx1ZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBzaGFyZWQgaV9kaXJkYXRhIGZpZWxkLiAqL1xuJiM0MztcdGRmaWQgPSBmbmFtZS1cdTAwM2VkZmlkO1xuIFx0aWYgKCFkZSkge1xuJiM0MztcdFx0aWYgKGRmaWQpXG4mIzQzO1x0XHRcdGRsZW4gPSBkZmlkLVx1MDAzZWRmX2hlYWRlci5kZGhfbGVuZ3RoO1xuJiM0MztcdFx0LyogZXh0NF9kaXJlbnRfcmVjX2xlbigpIGRvZXMgbm90IGFkZCBDRkhBU0ggc2l6ZSB3aGVuIGRpcmRhdGEgaXNcbiYjNDM7XHRcdCAqIGVuYWJsZWQgKGl0IGFzc3VtZXMgdGhlIGNhbGxlciBpbmNsdWRlZCBpdCBpbiBuYW1lX2xlbikuICBBZGRcbiYjNDM7XHRcdCAqIGl0IGhlcmUgc28gZXh0NF9maW5kX2Rlc3RfZGUoKSBhbGxvY2F0ZXMgYSBzbG90IGxhcmdlIGVub3VnaFxuJiM0MztcdFx0ICogZm9yIGV4dDRfZGlyZGF0YV9zZXQoKSB0byB3cml0ZSB0aGUgaGFzaCBleHRlbnNpb24uICovXG4mIzQzO1x0XHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0ICAgIGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShkaXItXHUwMDNlaV9zYikpXG4mIzQzO1x0XHRcdGRsZW4gJiM0Mzs9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCk7XG4gXHRcdGVyciA9IGV4dDRfZmluZF9kZXN0X2RlKGRpciwgYmgsIGJoLVx1MDAzZWJfZGF0YSxcbi1cdFx0XHRcdFx0YmxvY2tzaXplIC0gY3N1bV9zaXplLCBmbmFtZSwgXHUwMDI2ZGUpO1xuJiM0MztcdFx0XHRcdFx0YmxvY2tzaXplIC0gY3N1bV9zaXplLCBmbmFtZSwgXHUwMDI2ZGUsIGRsZW4pO1xuIFx0XHRpZiAoZXJyKVxuIFx0XHRcdHJldHVybiBlcnI7XG4gXHR9XG5AQCAtMjEzMiw3ICYjNDM7MjM5NCw3IEBAIHN0YXRpYyBpbnQgYWRkX2RpcmVudF90b19idWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuIFx0fVxuIFxuIFx0LyogQnkgbm93IHRoZSBidWZmZXIgaXMgbWFya2VkIGZvciBqb3VybmFsaW5nICovXG4tXHRleHQ0X2luc2VydF9kZW50cnkoZGlyLCBpbm9kZSwgZGUsIGJsb2Nrc2l6ZSwgZm5hbWUpO1xuJiM0MztcdGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKGRpciwgaW5vZGUsIGRlLCBibG9ja3NpemUsIGZuYW1lLCBkZmlkKTtcbiBcbiBcdC8qXG4gXHQgKiBYWFggc2hvdWxkbiYjMzk7dCB1cGRhdGUgYW55IHRpbWVzIHVudGlsIHN1Y2Nlc3NmdWxcbkBAIC0yMTU2LDQ0ICYjNDM7MjQxOCwzOCBAQCBzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbiBcdHJldHVybiBlcnIgPyBlcnIgOiBlcnIyO1xuIH1cbiBcbi1zdGF0aWMgYm9vbCBleHQ0X2NoZWNrX2R4X3Jvb3Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkeF9yb290ICpyb290KVxuJiM0MztzdGF0aWMgYm9vbCBleHQ0X2NoZWNrX2R4X3Jvb3Qoc3RydWN0IGlub2RlICpkaXIsXG4mIzQzO1x0XHRcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG90X2RlLFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRvdGRvdF9kZSxcbiYjNDM7XHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqZW50cnkpXG4ge1xuLVx0c3RydWN0IGZha2VfZGlyZW50ICpmZGU7XG4gXHRjb25zdCBjaGFyICplcnJvcl9tc2c7XG4tXHR1bnNpZ25lZCBpbnQgcmxlbjtcbiBcdHVuc2lnbmVkIGludCBibG9ja3NpemUgPSBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGNoYXIgKmJsb2NrZW5kID0gKGNoYXIgKilyb290ICYjNDM7IGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplO1xuJiM0MztcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSA9IE5VTEw7XG4gXG4tXHRmZGUgPSBcdTAwMjZyb290LVx1MDAzZWRvdDtcbi1cdGlmICh1bmxpa2VseShmZGUtXHUwMDNlbmFtZV9sZW4gIT0gMSkpIHtcbiYjNDM7XHRpZiAodW5saWtlbHkoZG90X2RlLVx1MDAzZW5hbWVfbGVuICE9IDEpKSB7XG4gXHRcdGVycm9yX21zZyA9IFwmIzM0O2ludmFsaWQgbmFtZV9sZW4gZm9yICYjMzk7LiYjMzk7XCYjMzQ7O1xuIFx0XHRnb3RvIGNvcnJ1cHRlZDtcbiBcdH1cbi1cdGlmICh1bmxpa2VseShzdHJuY21wKHJvb3QtXHUwMDNlZG90X25hbWUsIFwmIzM0Oy5cJiMzNDssIGZkZS1cdTAwM2VuYW1lX2xlbikpKSB7XG4mIzQzO1x0aWYgKHVubGlrZWx5KHN0cm5jbXAoZG90X2RlLVx1MDAzZW5hbWUsIFwmIzM0Oy5cJiMzNDssIGRvdF9kZS1cdTAwM2VuYW1lX2xlbikpKSB7XG4gXHRcdGVycm9yX21zZyA9IFwmIzM0O2ludmFsaWQgbmFtZSBmb3IgJiMzOTsuJiMzOTtcJiMzNDs7XG4gXHRcdGdvdG8gY29ycnVwdGVkO1xuIFx0fVxuLVx0cmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZmRlLVx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSk7XG4tXHRpZiAodW5saWtlbHkoKGNoYXIgKilmZGUgJiM0MzsgcmxlbiBcdTAwM2U9IGJsb2NrZW5kKSkge1xuLVx0XHRlcnJvcl9tc2cgPSBcJiMzNDtpbnZhbGlkIHJlY19sZW4gZm9yICYjMzk7LiYjMzk7XCYjMzQ7O1xuLVx0XHRnb3RvIGNvcnJ1cHRlZDtcbi1cdH1cbiBcbi1cdGZkZSA9IFx1MDAyNnJvb3QtXHUwMDNlZG90ZG90O1xuLVx0aWYgKHVubGlrZWx5KGZkZS1cdTAwM2VuYW1lX2xlbiAhPSAyKSkge1xuJiM0MztcdGlmICh1bmxpa2VseShkb3Rkb3RfZGUtXHUwMDNlbmFtZV9sZW4gIT0gMikpIHtcbiBcdFx0ZXJyb3JfbXNnID0gXCYjMzQ7aW52YWxpZCBuYW1lX2xlbiBmb3IgJiMzOTsuLiYjMzk7XCYjMzQ7O1xuIFx0XHRnb3RvIGNvcnJ1cHRlZDtcbiBcdH1cbi1cdGlmICh1bmxpa2VseShzdHJuY21wKHJvb3QtXHUwMDNlZG90ZG90X25hbWUsIFwmIzM0Oy4uXCYjMzQ7LCBmZGUtXHUwMDNlbmFtZV9sZW4pKSkge1xuJiM0MztcdGlmICh1bmxpa2VseShzdHJuY21wKGRvdGRvdF9kZS1cdTAwM2VuYW1lLCBcJiMzNDsuLlwmIzM0OywgZG90ZG90X2RlLVx1MDAzZW5hbWVfbGVuKSkpIHtcbiBcdFx0ZXJyb3JfbXNnID0gXCYjMzQ7aW52YWxpZCBuYW1lIGZvciAmIzM5Oy4uJiMzOTtcJiMzNDs7XG4gXHRcdGdvdG8gY29ycnVwdGVkO1xuIFx0fVxuLVx0cmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZmRlLVx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSk7XG4tXHRpZiAodW5saWtlbHkoKGNoYXIgKilmZGUgJiM0MzsgcmxlbiBcdTAwM2U9IGJsb2NrZW5kKSkge1xuJiM0MztcdGRlID0gZXh0NF9uZXh0X2VudHJ5KGRvdGRvdF9kZSwgYmxvY2tzaXplKTtcbiYjNDM7XHRpZiAoKGNoYXIgKilkZSBcdTAwM2U9ICgoKGNoYXIgKilkb3RfZGUpICYjNDM7IGJsb2Nrc2l6ZSkpIHtcbiBcdFx0ZXJyb3JfbXNnID0gXCYjMzQ7aW52YWxpZCByZWNfbGVuIGZvciAmIzM5Oy4uJiMzOTtcJiMzNDs7XG4gXHRcdGdvdG8gY29ycnVwdGVkO1xuIFx0fVxuLVxuJiM0MztcdCplbnRyeSA9IGRlO1xuIFx0cmV0dXJuIHRydWU7XG4gXG4gY29ycnVwdGVkOlxuQEAgLTIyMTEsMTYgJiM0MzsyNDY3LDE1IEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRcdFx0ICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpXG4ge1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7XG4tXHRzdHJ1Y3QgZHhfcm9vdFx0KnJvb3Q7XG4gXHRzdHJ1Y3QgZHhfZnJhbWVcdGZyYW1lc1tFWFQ0X0hUUkVFX0xFVkVMXSwgKmZyYW1lO1xuIFx0c3RydWN0IGR4X2VudHJ5ICplbnRyaWVzO1xuLVx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzJcdCpkZSwgKmRlMjtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMlx0KmRlLCAqZGUyLCAqZG90X2RlLCAqZG90ZG90X2RlO1xuIFx0Y2hhclx0XHQqZGF0YTIsICp0b3A7XG4gXHR1bnNpZ25lZFx0bGVuO1xuIFx0aW50XHRcdHJldHZhbDtcbiBcdHVuc2lnbmVkXHRibG9ja3NpemU7XG4gXHRleHQ0X2xibGtfdCAgYmxvY2s7XG4tXHRzdHJ1Y3QgZmFrZV9kaXJlbnQgKmZkZTtcbiYjNDM7XHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICpkeF9pbmZvO1xuIFx0aW50IGNzdW1fc2l6ZSA9IDA7XG4gXG4gXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGlub2RlLVx1MDAzZWlfc2IpKVxuQEAgLTIyMzcsMTcgJiM0MzsyNDkyLDIwIEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRcdHJldHVybiByZXR2YWw7XG4gXHR9XG4gXG4tXHRyb290ID0gKHN0cnVjdCBkeF9yb290ICopIGJoLVx1MDAzZWJfZGF0YTtcbi1cdGlmICghZXh0NF9jaGVja19keF9yb290KGRpciwgcm9vdCkpIHtcbiYjNDM7XHRkb3RfZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiliaC1cdTAwM2ViX2RhdGE7XG4mIzQzO1x0aWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZG90X2RlLVx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSkgXHUwMDNjIEVYVDRfQkFTRV9ESVJfTEVOIHx8XG4mIzQzO1x0ICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZG90X2RlLVx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSkgXHUwMDNlPSBibG9ja3NpemUgLSBFWFQ0X0JBU0VfRElSX0xFTikge1xuJiM0MztcdFx0YnJlbHNlKGJoKTtcbiYjNDM7XHRcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xuJiM0MztcdH1cbiYjNDM7XHRkb3Rkb3RfZGUgPSBleHQ0X25leHRfZW50cnkoZG90X2RlLCBibG9ja3NpemUpO1xuJiM0MztcdGlmICghZXh0NF9jaGVja19keF9yb290KGRpciwgZG90X2RlLCBkb3Rkb3RfZGUsIFx1MDAyNmRlKSkge1xuIFx0XHRicmVsc2UoYmgpO1xuIFx0XHRyZXR1cm4gLUVGU0NPUlJVUFRFRDtcbiBcdH1cbiBcbiBcdC8qIFRoZSAwdGggYmxvY2sgYmVjb21lcyB0aGUgcm9vdCwgbW92ZSB0aGUgZGlyZW50cyBvdXQgKi9cbi1cdGZkZSA9IFx1MDAyNnJvb3QtXHUwMDNlZG90ZG90O1xuLVx0ZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoKGNoYXIgKilmZGUgJiM0Mztcbi1cdFx0ZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhmZGUtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKSk7XG4tXHRsZW4gPSAoKGNoYXIgKikgcm9vdCkgJiM0MzsgKGJsb2Nrc2l6ZSAtIGNzdW1fc2l6ZSkgLSAoY2hhciAqKSBkZTtcbiYjNDM7XHRsZW4gPSAoKGNoYXIgKilkb3RfZGUpICYjNDM7IChibG9ja3NpemUgLSBjc3VtX3NpemUpIC0gKGNoYXIgKilkZTtcbiBcbiBcdC8qIEFsbG9jYXRlIG5ldyBibG9jayBmb3IgdGhlIDB0aCBibG9jayYjMzk7cyBkaXJlbnRzICovXG4gXHRiaDIgPSBleHQ0X2FwcGVuZChoYW5kbGUsIGRpciwgXHUwMDI2YmxvY2spO1xuQEAgLTIyNzgsMjQgJiM0MzsyNTM2LDMyIEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRcdGV4dDRfaW5pdGlhbGl6ZV9kaXJlbnRfdGFpbChiaDIsIGJsb2Nrc2l6ZSk7XG4gXG4gXHQvKiBJbml0aWFsaXplIHRoZSByb290OyB0aGUgZG90IGRpcmVudHMgYWxyZWFkeSBleGlzdCAqL1xuLVx0ZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgKFx1MDAyNnJvb3QtXHUwMDNlZG90ZG90KTtcbi1cdGRlLVx1MDAzZXJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhcbi1cdFx0XHRibG9ja3NpemUgLSBleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpLCBibG9ja3NpemUpO1xuLVx0bWVtc2V0IChcdTAwMjZyb290LVx1MDAzZWluZm8sIDAsIHNpemVvZihyb290LVx1MDAzZWluZm8pKTtcbi1cdHJvb3QtXHUwMDNlaW5mby5pbmZvX2xlbmd0aCA9IHNpemVvZihyb290LVx1MDAzZWluZm8pO1xuJiM0MztcdGRvdGRvdF9kZS1cdTAwM2VyZWNfbGVuID1cbiYjNDM7XHRcdGV4dDRfcmVjX2xlbl90b19kaXNrKGJsb2Nrc2l6ZSAtIGxlMTZfdG9fY3B1KGRvdF9kZS1cdTAwM2VyZWNfbGVuKSxcbiYjNDM7XHRcdFx0XHQgICAgIGJsb2Nrc2l6ZSk7XG4mIzQzO1xuJiM0MztcdC8qIGluaXRpYWxpemUgaGFzaGluZyBpbmZvICovXG4mIzQzO1x0ZHhfaW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgZG90X2RlKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGR4X2luZm8pKSB7XG4mIzQzO1x0XHRicmVsc2UoYmgyKTtcbiYjNDM7XHRcdGJyZWxzZShiaCk7XG4mIzQzO1x0XHRyZXR1cm4gUFRSX0VSUihkeF9pbmZvKTtcbiYjNDM7XHR9XG4mIzQzO1x0bWVtc2V0KGR4X2luZm8sIDAsIHNpemVvZigqZHhfaW5mbykpO1xuJiM0MztcdGR4X2luZm8tXHUwMDNlaW5mb19sZW5ndGggPSBzaXplb2YoKmR4X2luZm8pO1xuIFx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSlcbi1cdFx0cm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiA9IERYX0hBU0hfU0lQSEFTSDtcbiYjNDM7XHRcdGR4X2luZm8tXHUwMDNlaGFzaF92ZXJzaW9uID0gRFhfSEFTSF9TSVBIQVNIO1xuIFx0ZWxzZVxuLVx0XHRyb290LVx1MDAzZWluZm8uaGFzaF92ZXJzaW9uID1cbiYjNDM7XHRcdGR4X2luZm8tXHUwMDNlaGFzaF92ZXJzaW9uID1cbiBcdFx0XHRcdEVYVDRfU0IoZGlyLVx1MDAzZWlfc2IpLVx1MDAzZXNfZGVmX2hhc2hfdmVyc2lvbjtcbiBcbi1cdGVudHJpZXMgPSByb290LVx1MDAzZWVudHJpZXM7XG4mIzQzO1x0ZW50cmllcyA9ICh2b2lkICopZHhfaW5mbyAmIzQzOyBkeF9pbmZvLVx1MDAzZWluZm9fbGVuZ3RoO1xuIFx0ZHhfc2V0X2Jsb2NrKGVudHJpZXMsIDEpO1xuIFx0ZHhfc2V0X2NvdW50KGVudHJpZXMsIDEpO1xuLVx0ZHhfc2V0X2xpbWl0KGVudHJpZXMsIGR4X3Jvb3RfbGltaXQoZGlyLCBzaXplb2Yocm9vdC1cdTAwM2VpbmZvKSkpO1xuJiM0MztcdGR4X3NldF9saW1pdChlbnRyaWVzLCBkeF9yb290X2xpbWl0KGRpciwgZG90X2RlKSk7XG4gXG4gXHQvKiBJbml0aWFsaXplIGFzIGZvciBkeF9wcm9iZSAqL1xuLVx0Zm5hbWUtXHUwMDNlaGluZm8uaGFzaF92ZXJzaW9uID0gcm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbjtcbiYjNDM7XHRmbmFtZS1cdTAwM2VoaW5mby5oYXNoX3ZlcnNpb24gPSBkeF9pbmZvLVx1MDAzZWhhc2hfdmVyc2lvbjtcbiBcdGlmIChmbmFtZS1cdTAwM2VoaW5mby5oYXNoX3ZlcnNpb24gXHUwMDNjPSBEWF9IQVNIX1RFQSlcbiBcdFx0Zm5hbWUtXHUwMDNlaGluZm8uaGFzaF92ZXJzaW9uICYjNDM7PSBFWFQ0X1NCKGRpci1cdTAwM2VpX3NiKS1cdTAwM2VzX2hhc2hfdW5zaWduZWQ7XG4gXHRmbmFtZS1cdTAwM2VoaW5mby5zZWVkID0gRVhUNF9TQihkaXItXHUwMDNlaV9zYiktXHUwMDNlc19oYXNoX3NlZWQ7XG5AQCAtMjMzOCw3ICYjNDM7MjYwNCw3IEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHQgKi9cbiBcdGlmIChyZXR2YWwpXG4gXHRcdGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7XG4tXHRkeF9yZWxlYXNlKGZyYW1lcyk7XG4mIzQzO1x0ZHhfcmVsZWFzZShkaXIsIGZyYW1lcyk7XG4gXHRicmVsc2UoYmgyKTtcbiBcdHJldHVybiByZXR2YWw7XG4gfVxuQEAgLTIzNTUsNyAmIzQzOzI2MjEsOCBAQCBzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuICAqL1xuIHN0YXRpYyBpbnQgX19leHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdFx0XHQgIGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsXG4tXHRcdFx0ICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuJiM0MztcdFx0XHQgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4mIzQzO1x0XHRcdCAgc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICplZHApXG4ge1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7XG4gXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7XG5AQCAtMjM4MCw2ICYjNDM7MjY0NywxMyBAQCBzdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4gXHRpZiAocmV0dmFsKVxuIFx0XHRyZXR1cm4gcmV0dmFsO1xuIFxuJiM0MztcdC8qIFJlc29sdmUgdGhlIExVRklEIHBheWxvYWQgb25jZSBoZXJlIGFuZCBzdG9yZSBpdCBpbiBmbmFtZSBzbyBldmVyeVxuJiM0MztcdCAqIGFkZF9kaXJlbnRfdG9fYnVmKCkgY2FsbCBpbiB0aGlzIGFkZCBvcGVyYXRpb24gdXNlcyB0aGUgc2FtZSB2YWx1ZVxuJiM0MztcdCAqIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHNoYXJlZCBFWFQ0X0koaW5vZGUpLVx1MDAzZWlfZGlyZGF0YSBmaWVsZC4gKi9cbiYjNDM7XHRmbmFtZS5kZmlkID0gZXh0NF9kZW50cnlfZ2V0X2ZpZChzYiwgZWRwKTtcbiYjNDM7XHRpZiAoZm5hbWUuZGZpZClcbiYjNDM7XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKHNiLCBFWFQ0X0ZDX1JFQVNPTl9ESVJEQVRBLCBoYW5kbGUpO1xuJiM0MztcbiBcdGlmIChleHQ0X2hhc19pbmxpbmVfZGF0YShkaXIpKSB7XG4gXHRcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcdTAwMjZmbmFtZSwgZGlyLCBpbm9kZSk7XG4gXHRcdGlmIChyZXR2YWwgXHUwMDNjIDApXG5AQCAtMjQ2NCw3ICYjNDM7MjczOCw4IEBAIHN0YXRpYyBpbnQgZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuIFxuIFx0aWYgKGZzY3J5cHRfaXNfbm9rZXlfbmFtZShkZW50cnkpKVxuIFx0XHRyZXR1cm4gLUVOT0tFWTtcbi1cdHJldHVybiBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGlyLCBcdTAwMjZkZW50cnktXHUwMDNlZF9uYW1lLCBpbm9kZSk7XG4mIzQzO1x0cmV0dXJuIF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsIFx1MDAyNmRlbnRyeS1cdTAwM2VkX25hbWUsIGlub2RlLFxuJiM0MztcdFx0XHRcdGRlbnRyeS1cdTAwM2VkX2ZzZGF0YSk7XG4gfVxuIFxuIC8qXG5AQCAtMjYwNSw3ICYjNDM7Mjg4MCw3IEBAIHN0YXRpYyBpbnQgZXh0NF9keF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuIFx0XHRcdGlmIChyZXN0YXJ0IHx8IGVycilcbiBcdFx0XHRcdGdvdG8gam91cm5hbF9lcnJvcjtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRzdHJ1Y3QgZHhfcm9vdCAqZHhyb290O1xuJiM0MztcdFx0XHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICppbmZvO1xuIFx0XHRcdG1lbWNweSgoY2hhciAqKSBlbnRyaWVzMiwgKGNoYXIgKikgZW50cmllcyxcbiBcdFx0XHQgICAgICAgaWNvdW50ICogc2l6ZW9mKHN0cnVjdCBkeF9lbnRyeSkpO1xuIFx0XHRcdGR4X3NldF9saW1pdChlbnRyaWVzMiwgZHhfbm9kZV9saW1pdChkaXIpKTtcbkBAIC0yNjEzLDExICYjNDM7Mjg4OCwxNyBAQCBzdGF0aWMgaW50IGV4dDRfZHhfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbiBcdFx0XHQvKiBTZXQgdXAgcm9vdCAqL1xuIFx0XHRcdGR4X3NldF9jb3VudChlbnRyaWVzLCAxKTtcbiBcdFx0XHRkeF9zZXRfYmxvY2soZW50cmllcyAmIzQzOyAwLCBuZXdibG9jayk7XG4tXHRcdFx0ZHhyb290ID0gKHN0cnVjdCBkeF9yb290ICopZnJhbWVzWzBdLmJoLVx1MDAzZWJfZGF0YTtcbi1cdFx0XHRkeHJvb3QtXHUwMDNlaW5mby5pbmRpcmVjdF9sZXZlbHMgJiM0Mzs9IDE7XG4mIzQzO1x0XHRcdGluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKVxuJiM0MztcdFx0XHRcdFx0ICAgICAgZnJhbWVzWzBdLmJoLVx1MDAzZWJfZGF0YSk7XG4mIzQzO1x0XHRcdGlmIChJU19FUlIoaW5mbykpIHtcbiYjNDM7XHRcdFx0XHRlcnIgPSBQVFJfRVJSKGluZm8pO1xuJiM0MztcdFx0XHRcdGJyZWxzZShiaDIpO1xuJiM0MztcdFx0XHRcdGdvdG8gam91cm5hbF9lcnJvcjtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRpbmZvLVx1MDAzZWluZGlyZWN0X2xldmVscyAmIzQzOz0gMTtcbiBcdFx0XHRkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHXG4gXHRcdFx0XHQgICAgICAgXCYjMzQ7Q3JlYXRpbmcgJWQgbGV2ZWwgaW5kZXguLi5cXG5cJiMzNDssXG4tXHRcdFx0XHQgICAgICAgZHhyb290LVx1MDAzZWluZm8uaW5kaXJlY3RfbGV2ZWxzKSk7XG4mIzQzO1x0XHRcdFx0ICAgICAgIGluZm8tXHUwMDNlaW5kaXJlY3RfbGV2ZWxzKSk7XG4gXHRcdFx0ZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfZHhfbm9kZShoYW5kbGUsIGRpciwgZnJhbWUtXHUwMDNlYmgpO1xuIFx0XHRcdGlmIChlcnIpIHtcbiBcdFx0XHRcdGJyZWxzZShiaDIpO1xuQEAgLTI2NDEsNyAmIzQzOzI5MjIsNyBAQCBzdGF0aWMgaW50IGV4dDRfZHhfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbiBcdGV4dDRfc3RkX2Vycm9yKGRpci1cdTAwM2VpX3NiLCBlcnIpOyAvKiB0aGlzIGlzIGEgbm8tb3AgaWYgZXJyID09IDAgKi9cbiBjbGVhbnVwOlxuIFx0YnJlbHNlKGJoKTtcbi1cdGR4X3JlbGVhc2UoZnJhbWVzKTtcbiYjNDM7XHRkeF9yZWxlYXNlKGRpciwgZnJhbWVzKTtcbiBcdC8qIEByZXN0YXJ0IGlzIHRydWUgbWVhbnMgaHRyZWUtcGF0aCBoYXMgYmVlbiBjaGFuZ2VkLCB3ZSBuZWVkIHRvXG4gXHQgKiByZXBlYXQgZHhfcHJvYmUoKSB0byBmaW5kIG91dCB2YWxpZCBodHJlZS1wYXRoXG4gXHQgKi9cbkBAIC0yOTMzLDcgJiM0MzszMjE0LDcgQEAgaW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFxuIFx0ZGUtXHUwMDNlaW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS1cdTAwM2VpX2lubyk7XG4gXHRkZS1cdTAwM2VuYW1lX2xlbiA9IDE7XG4tXHRkZS1cdTAwM2VyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbiwgTlVMTCksXG4mIzQzO1x0ZGUtXHUwMDNlcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKGV4dDRfZGlyZW50X3JlY19sZW4oZGUtXHUwMDNlbmFtZV9sZW4sIE5VTEwpLFxuIFx0XHRcdFx0XHQgICBibG9ja3NpemUpO1xuIFx0bWVtY3B5KGRlLVx1MDAzZW5hbWUsIFwmIzM0Oy5cJiMzNDssIDIpO1xuIFx0ZXh0NF9zZXRfZGVfdHlwZShpbm9kZS1cdTAwM2VpX3NiLCBkZSwgU19JRkRJUik7XG5AQCAtMjk0NSw3ICYjNDM7MzIyNiw3IEBAIGludCBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdGV4dDRfc2V0X2RlX3R5cGUoaW5vZGUtXHUwMDNlaV9zYiwgZGUsIFNfSUZESVIpO1xuIFx0aWYgKGlubGluZV9idWYpIHtcbiBcdFx0ZGUtXHUwMDNlcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKFxuLVx0XHRcdFx0XHRleHQ0X2Rpcl9yZWNfbGVuKGRlLVx1MDAzZW5hbWVfbGVuLCBOVUxMKSxcbiYjNDM7XHRcdFx0XHRcdGV4dDRfZGlyZW50X3JlY19sZW4oZGUtXHUwMDNlbmFtZV9sZW4sIE5VTEwpLFxuIFx0XHRcdFx0XHRibG9ja3NpemUpO1xuIFx0XHRkZSA9IGV4dDRfbmV4dF9lbnRyeShkZSwgYmxvY2tzaXplKTtcbiBcdFx0aGVhZGVyX3NpemUgPSAoY2hhciAqKWRlIC0gYmgtXHUwMDNlYl9kYXRhO1xuQEAgLTI5NTQsNyAmIzQzOzMyMzUsNyBAQCBpbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRcdFx0YmxvY2tzaXplIC0gY3N1bV9zaXplKTtcbiBcdH0gZWxzZSB7XG4gXHRcdGRlLVx1MDAzZXJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhibG9ja3NpemUgLVxuLVx0XHRcdFx0XHQoY3N1bV9zaXplICYjNDM7IGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkpLFxuJiM0MztcdFx0XHRcdFx0KGNzdW1fc2l6ZSAmIzQzOyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIE5VTEwpKSxcbiBcdFx0XHRcdFx0YmxvY2tzaXplKTtcbiBcdH1cbiBcbkBAIC0yOTY2LDggJiM0MzszMjQ3LDkgQEAgaW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0cmV0dXJuIGV4dDRfaGFuZGxlX2RpcnR5X2RpcmJsb2NrKGhhbmRsZSwgaW5vZGUsIGJoKTtcbiB9XG4gXG4taW50IGV4dDRfaW5pdF9uZXdfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuLVx0XHRcdCAgICAgc3RydWN0IGlub2RlICppbm9kZSlcbiYjNDM7aW50IGV4dDRfaW5pdF9uZXdfZGlyX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4mIzQzO1x0XHRcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4mIzQzO1x0XHRcdCAgIGNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCB2b2lkICpkYXRhMilcbiB7XG4gXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcl9ibG9jayA9IE5VTEw7XG4gXHRleHQ0X2xibGtfdCBibG9jayA9IDA7XG5AQCAtMzA3Nyw4ICYjNDM7MzM1OSw4IEBAIGJvb2wgZXh0NF9lbXB0eV9kaXIoc3RydWN0IGlub2RlICppbm9kZSlcbiBcdH1cbiBcbiBcdHNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbi1cdGlmIChpbm9kZS1cdTAwM2VpX3NpemUgXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkgJiM0Mztcbi1cdFx0XHRcdFx0ZXh0NF9kaXJfcmVjX2xlbigyLCBOVUxMKSkge1xuJiM0MztcdGlmIChpbm9kZS1cdTAwM2VpX3NpemUgXHUwMDNjIGV4dDRfZGlyZW50X3JlY19sZW4oMSwgTlVMTCkgJiM0MztcbiYjNDM7XHRcdFx0XHRcdGV4dDRfZGlyZW50X3JlY19sZW4oMiwgTlVMTCkpIHtcbiBcdFx0RVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgXCYjMzQ7aW52YWxpZCBzaXplXCYjMzQ7KTtcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFx0fVxuQEAgLTM0NjcsMTAgJiM0MzszNzQ5LDE2IEBAIGludCBfX2V4dDRfbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdGlmIChJU19ESVJTWU5DKGRpcikpXG4gXHRcdGV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTtcbiBcbiYjNDM7XHQvKiBGYXN0LWNvbW1pdCBkb2VzIG5vdCByZWNvcmQgZGlyZGF0YSBpbiBpdHMgam91cm5hbCBmb3JtYXQ7IGZvcmNlIGFcbiYjNDM7XHQgKiBmdWxsIGpvdXJuYWwgY29tbWl0IHNvIHRoZSBMVUZJRCBzdXJ2aXZlcyBjcmFzaCYjNDM7cmVwbGF5LiAqL1xuJiM0MztcdGlmIChleHQ0X2RlbnRyeV9nZXRfZmlkKGRpci1cdTAwM2VpX3NiLCBkZW50cnkgPyBkZW50cnktXHUwMDNlZF9mc2RhdGEgOiBOVUxMKSlcbiYjNDM7XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGRpci1cdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9ESVJEQVRBLCBoYW5kbGUpO1xuJiM0MztcbiBcdGlub2RlX3NldF9jdGltZV9jdXJyZW50KGlub2RlKTtcbiBcdGV4dDRfaW5jX2NvdW50KGlub2RlKTtcbiBcbi1cdGVyciA9IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsIGRfbmFtZSwgaW5vZGUpO1xuJiM0MztcdGVyciA9IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsIGRfbmFtZSwgaW5vZGUsXG4mIzQzO1x0XHRcdCAgICAgICBkZW50cnkgPyBkZW50cnktXHUwMDNlZF9mc2RhdGEgOiBOVUxMKTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdGVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdFx0LyogdGhpcyBjYW4gaGFwcGVuIG9ubHkgZm9yIHRtcGZpbGUgYmVpbmdcbkBAIC0zNjM5LDcgJiM0MzszOTI3LDggQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZV9kaXJfZmluaXNoKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsXG4gfVxuIFxuIHN0YXRpYyBpbnQgZXh0NF9zZXRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCxcbi1cdFx0ICAgICAgIHVuc2lnbmVkIGlubywgdW5zaWduZWQgZmlsZV90eXBlKVxuJiM0MztcdFx0ICAgICAgIHVuc2lnbmVkIGlubywgdW5zaWduZWQgZmlsZV90eXBlLFxuJiM0MztcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKnNyY19maWQpXG4ge1xuIFx0aW50IHJldHZhbCwgcmV0dmFsMjtcbiBcbkBAIC0zNjQ5LDggJiM0MzszOTM4LDU3IEBAIHN0YXRpYyBpbnQgZXh0NF9zZXRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCxcbiBcdGlmIChyZXR2YWwpXG4gXHRcdHJldHVybiByZXR2YWw7XG4gXHRlbnQtXHUwMDNlZGUtXHUwMDNlaW5vZGUgPSBjcHVfdG9fbGUzMihpbm8pO1xuLVx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoZW50LVx1MDAzZWRpci1cdTAwM2VpX3NiKSlcbi1cdFx0ZW50LVx1MDAzZWRlLVx1MDAzZWZpbGVfdHlwZSA9IGZpbGVfdHlwZTtcbiYjNDM7XHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9maWxldHlwZShlbnQtXHUwMDNlZGlyLVx1MDAzZWlfc2IpKSB7XG4mIzQzO1x0XHQvKiBDb3B5IHRoZSBzb3VyY2UgTFVGSUQgcGF5bG9hZCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBzbG90IHdoZW5cbiYjNDM7XHRcdCAqIGJvdGggY2FycnkgYSBMVUZJRCBvZiB0aGUgc2FtZSBvbi1kaXNrIHNpemUuICBMVUZJRCBpc1xuJiM0MztcdFx0ICogaW5vZGUtc3BlY2lmaWMgYW5kIG11c3QgdHJhdmVsIHdpdGggdGhlIGlub2RlIHRocm91Z2ggcmVuYW1lLlxuJiM0MztcdFx0ICogQ0ZIQVNIIGJ5dGVzIGFyZSBsZWZ0IGluLXBsYWNlOiBDRkhBU0ggaXMgYSBmdW5jdGlvbiBvZiB0aGVcbiYjNDM7XHRcdCAqIGRlc3RpbmF0aW9uIGZpbGVuYW1lLCBhbmQgaXRzIGJ5dGVzIHNpdCBhdCB0aGUgY29ycmVjdCBvZmZzZXRcbiYjNDM7XHRcdCAqIGJlY2F1c2UgTFVGSUQgYWx3YXlzIHByZWNlZGVzIENGSEFTSCBpbiB0aGUgZXh0ZW5zaW9uIGxheW91dC5cbiYjNDM7XHRcdCAqIFdoZW4gc3JjX2ZpZCBpcyBOVUxMLCB0aGUgTFVGSUQgZmxhZyBpcyBzeW5jZWQgdG8gdGhlIExVRklEXG4mIzQzO1x0XHQgKiBiaXQgYWxyZWFkeSBwcmVzZW50IGluIGZpbGVfdHlwZTogY2FsbGVycyB0aGF0IGNsZWFyIExVRklEXG4mIzQzO1x0XHQgKiAocmVuYW1lIG9mIGEgbm9uLUxVRklEIGlub2RlLCB3aGl0ZW91dCkgcGFzcyBmaWxlX3R5cGUgd2l0aFxuJiM0MztcdFx0ICogTFVGSUQ9MDsgZXh0NF9yZXNldGVudCBwYXNzZXMgdGhlIG9yaWdpbmFsIGZpbGVfdHlwZSBzbyB0aGVcbiYjNDM7XHRcdCAqIGZsYWcgaXMgcmVzdG9yZWQgZm9yIGVycm9yIHJlY292ZXJ5IHdpdGhvdXQgb3ZlcndyaXRpbmcgdGhlXG4mIzQzO1x0XHQgKiBMVUZJRCBieXRlcyB0aGF0IGFyZSBzdGlsbCBpbnRhY3Qgb24gZGlzay4gKi9cbiYjNDM7XHRcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZW50LVx1MDAzZWRpci1cdTAwM2VpX3NiKSkge1xuJiM0MztcdFx0XHRpZiAoc3JjX2ZpZCBcdTAwMjZcdTAwMjYgKGVudC1cdTAwM2VkZS1cdTAwM2VmaWxlX3R5cGUgXHUwMDI2IEVYVDRfRElSRU5UX0xVRklEKSkge1xuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGludCByZWNfbGVuID1cbiYjNDM7XHRcdFx0XHRcdGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZW50LVx1MDAzZWRlLVx1MDAzZXJlY19sZW4sXG4mIzQzO1x0XHRcdFx0XHRcdGVudC1cdTAwM2VkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4mIzQzO1x0XHRcdFx0dW5zaWduZWQgaW50IGRkaF9vZmYgPVxuJiM0MztcdFx0XHRcdFx0RVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZW50LVx1MDAzZWRlLVx1MDAzZW5hbWVfbGVuICYjNDM7IDE7XG4mIzQzO1x0XHRcdFx0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICpkZGggPVxuJiM0MztcdFx0XHRcdFx0KHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqKVxuJiM0MztcdFx0XHRcdFx0KChjaGFyICopZW50LVx1MDAzZWRlICYjNDM7IGRkaF9vZmYpO1xuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGludCBjb3B5X2xlbiA9IHNyY19maWQtXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XG4mIzQzO1xuJiM0MztcdFx0XHRcdGlmIChkZGhfb2ZmICYjNDM7IHNpemVvZigqZGRoKSBcdTAwM2UgcmVjX2xlbiB8fFxuJiM0MztcdFx0XHRcdCAgICBkZGgtXHUwMDNlZGRoX2xlbmd0aCAhPSBjb3B5X2xlbiB8fFxuJiM0MztcdFx0XHRcdCAgICBkZGhfb2ZmICYjNDM7IGNvcHlfbGVuIFx1MDAzZSByZWNfbGVuKSB7XG4mIzQzO1x0XHRcdFx0XHQvKiBDYW5ub3QgY29weTogY2xlYXIgdGhlIGZsYWcgc28gdGhlXG4mIzQzO1x0XHRcdFx0XHQgKiBzbG90IGRvZXMgbm90IGFkdmVydGlzZSBhIHN0YWxlIExVRklEXG4mIzQzO1x0XHRcdFx0XHQgKiBmcm9tIHRoZSBvbGQgaW5vZGUuICovXG4mIzQzO1x0XHRcdFx0XHRlbnQtXHUwMDNlZGUtXHUwMDNlZmlsZV90eXBlIFx1MDAyNj0gfkVYVDRfRElSRU5UX0xVRklEO1xuJiM0MztcdFx0XHRcdH0gZWxzZSB7XG4mIzQzO1x0XHRcdFx0XHRtZW1jcHkoZGRoLCBzcmNfZmlkLCBjb3B5X2xlbik7XG4mIzQzO1x0XHRcdFx0fVxuJiM0MztcdFx0XHR9IGVsc2UgaWYgKCFzcmNfZmlkKSB7XG4mIzQzO1x0XHRcdFx0LyogU3luYyB0aGUgTFVGSUQgZmxhZyB3aXRoIHdoYXQgZmlsZV90eXBlIHJlcXVlc3RzLlxuJiM0MztcdFx0XHRcdCAqIEZvciBub3JtYWwgcmVuYW1lIChzb3VyY2UgaGFzIG5vIExVRklEKSBhbmQgZm9yXG4mIzQzO1x0XHRcdFx0ICogdGhlIHdoaXRlb3V0IHNldGVudCwgZmlsZV90eXBlIGNhcnJpZXMgTFVGSUQ9MCxcbiYjNDM7XHRcdFx0XHQgKiBzbyB3ZSBjbGVhciB0aGUgc3RhbGUgZmxhZy4gIEZvciBleHQ0X3Jlc2V0ZW50XG4mIzQzO1x0XHRcdFx0ICogKGVycm9yIHJlY292ZXJ5KSwgZmlsZV90eXBlIGlzIHRoZSBvcmlnaW5hbFxuJiM0MztcdFx0XHRcdCAqIGZpbGVfdHlwZSB3aXRoIExVRklEPTEsIHNvIHdlIHJlc3RvcmUgdGhlIGZsYWcg4oCUXG4mIzQzO1x0XHRcdFx0ICogdGhlIExVRklEIGJ5dGVzIGFyZSBzdGlsbCBvbiBkaXNrIHVudG91Y2hlZC4gKi9cbiYjNDM7XHRcdFx0XHRlbnQtXHUwMDNlZGUtXHUwMDNlZmlsZV90eXBlID1cbiYjNDM7XHRcdFx0XHRcdChlbnQtXHUwMDNlZGUtXHUwMDNlZmlsZV90eXBlIFx1MDAyNiB+RVhUNF9ESVJFTlRfTFVGSUQpIHxcbiYjNDM7XHRcdFx0XHRcdChmaWxlX3R5cGUgXHUwMDI2IEVYVDRfRElSRU5UX0xVRklEKTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0fVxuJiM0MztcdFx0ZW50LVx1MDAzZWRlLVx1MDAzZWZpbGVfdHlwZSA9IChmaWxlX3R5cGUgXHUwMDI2IEVYVDRfRlRfTUFTSykgfFxuJiM0MztcdFx0XHRcdCAgICAgKGVudC1cdTAwM2VkZS1cdTAwM2VmaWxlX3R5cGUgXHUwMDI2IH5FWFQ0X0ZUX01BU0spO1xuJiM0MztcdH1cbiBcdGlub2RlX2luY19pdmVyc2lvbihlbnQtXHUwMDNlZGlyKTtcbiBcdGlub2RlX3NldF9tdGltZV90b190cyhlbnQtXHUwMDNlZGlyLCBpbm9kZV9zZXRfY3RpbWVfY3VycmVudChlbnQtXHUwMDNlZGlyKSk7XG4gXHRyZXR2YWwgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBlbnQtXHUwMDNlZGlyKTtcbkBAIC0zNjg3LDcgJiM0Mzs0MDI1LDcgQEAgc3RhdGljIHZvaWQgZXh0NF9yZXNldGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9yZW5hbWVudCAqZW50LFxuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHRleHQ0X3NldGVudChoYW5kbGUsIFx1MDAyNm9sZCwgaW5vLCBmaWxlX3R5cGUpO1xuJiM0MztcdGV4dDRfc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLCBpbm8sIGZpbGVfdHlwZSwgTlVMTCk7XG4gXHRicmVsc2Uob2xkLmJoKTtcbiB9XG4gXG5AQCAtMzc4Niw2ICYjNDM7NDEyNCwzMiBAQCBzdGF0aWMgc3RydWN0IGlub2RlICpleHQ0X3doaXRlb3V0X2Zvcl9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsXG4gXHRyZXR1cm4gd2g7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBleHQ0X2x1ZmlkX3NuYXBzaG90IC0gY29weSB0aGUgTFVGSUQgcmVjb3JkIGZyb20gYSBkaXJlY3RvcnkgZW50cnlcbiYjNDM7ICpcbiYjNDM7ICogQWxsb2NhdGVzIGFuZCByZXR1cm5zIGEga21lbWR1cCYjMzk7ZCBjb3B5IG9mIHRoZSBmdWxsIG9uLWRpc2sgTFVGSUQgcmVjb3JkXG4mIzQzOyAqIChoZWFkZXIgJiM0MzsgRklEIHBheWxvYWQgb2YgYXJiaXRyYXJ5IGxlbmd0aCkuICBSZXR1cm5zIE5VTEwgaWYgbm8gTFVGSUQgaXNcbiYjNDM7ICogcHJlc2VudCwgdGhlIHJlY29yZCBpcyBtYWxmb3JtZWQsIG9yIGFsbG9jYXRpb24gZmFpbHMuICBDYWxsZXIgbXVzdCBrZnJlZSgpLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKlxuJiM0MztleHQ0X2x1ZmlkX3NuYXBzaG90KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBkZGhfb2ZmID0gRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGUtXHUwMDNlbmFtZV9sZW4gJiM0MzsgMTtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkaXNrX2ZpZDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgZGxlbjtcbiYjNDM7XG4mIzQzO1x0aWYgKCEoZGUtXHUwMDNlZmlsZV90eXBlIFx1MDAyNiBFWFQ0X0RJUkVOVF9MVUZJRCkpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRpZiAoZGRoX29mZiAmIzQzOyBzaXplb2YoZGlza19maWQtXHUwMDNlZGZfaGVhZGVyKSBcdTAwM2UgcmVjX2xlbilcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdGRpc2tfZmlkID0gKHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKikoKGNoYXIgKilkZSAmIzQzOyBkZGhfb2ZmKTtcbiYjNDM7XHRkbGVuID0gZGlza19maWQtXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XG4mIzQzO1x0aWYgKGRsZW4gXHUwMDNjIHNpemVvZihkaXNrX2ZpZC1cdTAwM2VkZl9oZWFkZXIpIHx8IGRkaF9vZmYgJiM0MzsgZGxlbiBcdTAwM2UgcmVjX2xlbilcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcdHJldHVybiBrbWVtZHVwKGRpc2tfZmlkLCBkbGVuLCBHRlBfTk9GUyk7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBBbnlib2R5IGNhbiByZW5hbWUgYW55dGhpbmcgd2l0aCB0aGlzOiB0aGUgcGVybWlzc2lvbiBjaGVja3MgYXJlIGxlZnQgdG8gdGhlXG4gICogaGlnaGVyLWxldmVsIHJvdXRpbmVzLlxuQEAgLTM4MTQsNiAmIzQzOzQxNzgsNyBAQCBzdGF0aWMgaW50IGV4dDRfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsXG4gXHRzdHJ1Y3QgaW5vZGUgKndoaXRlb3V0ID0gTlVMTDtcbiBcdGludCBjcmVkaXRzO1xuIFx0dTggb2xkX2ZpbGVfdHlwZTtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpvbGRfZmlkID0gTlVMTDtcbiBcbiBcdGlmIChuZXcuaW5vZGUgXHUwMDI2XHUwMDI2IG5ldy5pbm9kZS1cdTAwM2VpX25saW5rID09IDApIHtcbiBcdFx0RVhUNF9FUlJPUl9JTk9ERShuZXcuaW5vZGUsXG5AQCAtMzkyNSw3ICYjNDM7NDI5MCw3IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpcixcbiBcdFx0ICogdG8gYmUgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIHZhbGlkIG9sZCBlbnRyeS5cbiBcdFx0ICovXG4gXHRcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLCB3aGl0ZW91dC1cdTAwM2VpX2lubyxcbi1cdFx0XHRcdCAgICAgRVhUNF9GVF9DSFJERVYpO1xuJiM0MztcdFx0XHRcdCAgICAgRVhUNF9GVF9DSFJERVYsIE5VTEwpO1xuIFx0XHRpZiAocmV0dmFsKVxuIFx0XHRcdGdvdG8gZW5kX3JlbmFtZTtcbiBcdFx0cmV0dmFsID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgd2hpdGVvdXQpO1xuQEAgLTM5MzgsOCAmIzQzOzQzMDMsMTggQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLFxuIFx0XHRpZiAocmV0dmFsKVxuIFx0XHRcdGdvdG8gZW5kX3JlbmFtZTtcbiBcdH0gZWxzZSB7XG4mIzQzO1x0XHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKG9sZC5kaXItXHUwMDNlaV9zYikpIHtcbiYjNDM7XHRcdFx0b2xkX2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3Qob2xkLmRlLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgICBvbGQuZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuJiM0MztcdFx0XHRpZiAob2xkX2ZpZClcbiYjNDM7XHRcdFx0XHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShvbGQuZGlyLVx1MDAzZWlfc2IsXG4mIzQzO1x0XHRcdFx0XHRcdFx0RVhUNF9GQ19SRUFTT05fRElSREFUQSxcbiYjNDM7XHRcdFx0XHRcdFx0XHRoYW5kbGUpO1xuJiM0MztcdFx0XHRlbHNlXG4mIzQzO1x0XHRcdFx0b2xkX2ZpbGVfdHlwZSBcdTAwMjY9IH5FWFQ0X0RJUkVOVF9MVUZJRDtcbiYjNDM7XHRcdH1cbiBcdFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZuZXcsXG4tXHRcdFx0XHQgICAgIG9sZC5pbm9kZS1cdTAwM2VpX2lubywgb2xkX2ZpbGVfdHlwZSk7XG4mIzQzO1x0XHRcdFx0ICAgICBvbGQuaW5vZGUtXHUwMDNlaV9pbm8sIG9sZF9maWxlX3R5cGUsIG9sZF9maWQpO1xuIFx0XHRpZiAocmV0dmFsKVxuIFx0XHRcdGdvdG8gZW5kX3JlbmFtZTtcbiBcdH1cbkBAIC00MDI2LDYgJiM0Mzs0NDAxLDcgQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLFxuIFx0cmV0dmFsID0gMDtcbiBcbiBlbmRfcmVuYW1lOlxuJiM0MztcdGtmcmVlKG9sZF9maWQpO1xuIFx0aWYgKHdoaXRlb3V0KSB7XG4gXHRcdGlmIChyZXR2YWwpIHtcbiBcdFx0XHRleHQ0X3Jlc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLFxuQEAgLTQwNjIsOCAmIzQzOzQ0MzgsOSBAQCBzdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSxcbiBcdFx0LmRlbnRyeSA9IG5ld19kZW50cnksXG4gXHRcdC5pbm9kZSA9IGRfaW5vZGUobmV3X2RlbnRyeSksXG4gXHR9O1xuLVx0dTggbmV3X2ZpbGVfdHlwZTtcbiYjNDM7XHR1OCBuZXdfZmlsZV90eXBlLCBvbGRfZGVfZmlsZV90eXBlO1xuIFx0aW50IHJldHZhbDtcbiYjNDM7XHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpvbGRfZmlkID0gTlVMTCwgKm5ld19maWQgPSBOVUxMO1xuIFxuIFx0aWYgKChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhuZXdfZGlyLCBFWFQ0X0lOT0RFX1BST0pJTkhFUklUKSBcdTAwMjZcdTAwMjZcbiBcdCAgICAgIXByb2ppZF9lcShFWFQ0X0kobmV3X2RpciktXHUwMDNlaV9wcm9qaWQsXG5AQCAtNDE0MiwxMiAmIzQzOzQ1MTksMjcgQEAgc3RhdGljIGludCBleHQ0X2Nyb3NzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksXG4gXHRcdFx0Z290byBlbmRfcmVuYW1lO1xuIFx0fVxuIFxuJiM0MztcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEob2xkLmRpci1cdTAwM2VpX3NiKSkge1xuJiM0MztcdFx0b2xkX2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3Qob2xkLmRlLCBvbGQuZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuJiM0MztcdFx0bmV3X2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3QobmV3LmRlLCBuZXcuZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuJiM0MztcdFx0aWYgKG9sZF9maWQgfHwgbmV3X2ZpZClcbiYjNDM7XHRcdFx0ZXh0NF9mY19tYXJrX2luZWxpZ2libGUob2xkLmRpci1cdTAwM2VpX3NiLFxuJiM0MztcdFx0XHRcdFx0XHRFWFQ0X0ZDX1JFQVNPTl9ESVJEQVRBLCBoYW5kbGUpO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0b2xkX2RlX2ZpbGVfdHlwZSA9IG9sZC5kZS1cdTAwM2VmaWxlX3R5cGU7XG4mIzQzO1x0aWYgKCFvbGRfZmlkKVxuJiM0MztcdFx0b2xkX2RlX2ZpbGVfdHlwZSBcdTAwMjY9IH5FWFQ0X0RJUkVOVF9MVUZJRDtcbiBcdG5ld19maWxlX3R5cGUgPSBuZXcuZGUtXHUwMDNlZmlsZV90eXBlO1xuLVx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZuZXcsIG9sZC5pbm9kZS1cdTAwM2VpX2lubywgb2xkLmRlLVx1MDAzZWZpbGVfdHlwZSk7XG4mIzQzO1x0aWYgKCFuZXdfZmlkKVxuJiM0MztcdFx0bmV3X2ZpbGVfdHlwZSBcdTAwMjY9IH5FWFQ0X0RJUkVOVF9MVUZJRDtcbiYjNDM7XHRyZXR2YWwgPSBleHQ0X3NldGVudChoYW5kbGUsIFx1MDAyNm5ldywgb2xkLmlub2RlLVx1MDAzZWlfaW5vLCBvbGRfZGVfZmlsZV90eXBlLFxuJiM0MztcdFx0XHQgICAgIG9sZF9maWQpO1xuIFx0aWYgKHJldHZhbClcbiBcdFx0Z290byBlbmRfcmVuYW1lO1xuIFxuLVx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZvbGQsIG5ldy5pbm9kZS1cdTAwM2VpX2lubywgbmV3X2ZpbGVfdHlwZSk7XG4mIzQzO1x0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZvbGQsIG5ldy5pbm9kZS1cdTAwM2VpX2lubywgbmV3X2ZpbGVfdHlwZSxcbiYjNDM7XHRcdFx0ICAgICBuZXdfZmlkKTtcbiBcdGlmIChyZXR2YWwpXG4gXHRcdGdvdG8gZW5kX3JlbmFtZTtcbiBcbkBAIC00MTgwLDYgJiM0Mzs0NTcyLDggQEAgc3RhdGljIGludCBleHQ0X2Nyb3NzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksXG4gXHRyZXR2YWwgPSAwO1xuIFxuIGVuZF9yZW5hbWU6XG4mIzQzO1x0a2ZyZWUob2xkX2ZpZCk7XG4mIzQzO1x0a2ZyZWUobmV3X2ZpZCk7XG4gXHRicmVsc2Uob2xkLmRpcl9iaCk7XG4gXHRicmVsc2UobmV3LmRpcl9iaCk7XG4gXHRicmVsc2Uob2xkLmJoKTtcbkBAIC00MjE2LDYgJiM0Mzs0NjEwLDE1NCBAQCBzdGF0aWMgaW50IGV4dDRfcmVuYW1lMihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcbiBcdHJldHVybiBleHQ0X3JlbmFtZShpZG1hcCwgb2xkX2Rpciwgb2xkX2RlbnRyeSwgbmV3X2RpciwgbmV3X2RlbnRyeSwgZmxhZ3MpO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogZXh0NF9kaXJkYXRhX3NldF9sdWZpZCgpIC0gU2V0IExVRklEIGRhdGEgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJ5XG4mIzQzOyAqIEBkaXI6ICAgICAgICBwYXJlbnQgZGlyZWN0b3J5IGlub2RlXG4mIzQzOyAqIEBmaWxlbmFtZTogICBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSBkaXJlY3RvcnlcbiYjNDM7ICogQG5hbWVsZW46ICAgIGxlbmd0aCBvZiBmaWxlbmFtZVxuJiM0MzsgKiBAZWRwOiAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBkZW50cnkgcGFyYW0gd2l0aCBMVUZJRCBkYXRhXG4mIzQzOyAqXG4mIzQzOyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJ5LCBkZWxldGVzIGl0LCBhbmQgcmUtY3JlYXRlcyBpdFxuJiM0MzsgKiB3aXRoIExVRklEIGRhdGEgYXR0YWNoZWQuIFVzZWQgYnkgdGhlIEVYVDRfSU9DX1NFVF9MVUZJRCBpb2N0bC5cbiYjNDM7ICpcbiYjNDM7ICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbiYjNDM7ICovXG4mIzQzO2ludCBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpmaWxlbmFtZSxcbiYjNDM7XHRcdFx0ICAgIGludCBuYW1lbGVuLCBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKmVkcClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItXHUwMDNlaV9zYjtcbiYjNDM7XHQgLyogemVyby1pbml0OiBzYWZlIHRvIGZyZWUgb24gYW55IHBhdGggKi9cbiYjNDM7XHRzdHJ1Y3QgZXh0NF9maWxlbmFtZSBmbmFtZSA9IHt9O1xuJiM0MztcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XG4mIzQzO1x0aGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHFzdHIgZF9uYW1lO1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcbiYjNDM7XHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShzYikpXG4mIzQzO1x0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4mIzQzO1xuJiM0MztcdGlmIChuYW1lbGVuIFx1MDAzZSBFWFQ0X05BTUVfTEVOKVxuJiM0MztcdFx0cmV0dXJuIC1FTkFNRVRPT0xPTkc7XG4mIzQzO1x0aWYgKG5hbWVsZW4gIT0gc3RybmxlbihmaWxlbmFtZSwgbmFtZWxlbiAmIzQzOyAxKSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcbiYjNDM7XHRkX25hbWUubmFtZSA9IGZpbGVuYW1lO1xuJiM0MztcdGRfbmFtZS5sZW4gPSBuYW1lbGVuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBleHQ0X2ZuYW1lX3NldHVwX2ZpbGVuYW1lKGRpciwgXHUwMDI2ZF9uYW1lLCAwLCBcdTAwMjZmbmFtZSk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdGdvdG8gb3V0X2ZyZWU7XG4mIzQzO1xuJiM0MztcdC8qIExvY2sgZGlyIHdpdGggdGhlIFZGUyBwYXJlbnQtbXV0YXRpb24gc3ViY2xhc3MgYmVmb3JlIHN0YXJ0aW5nIHRoZVxuJiM0MztcdCAqIGpvdXJuYWwuICBIb2xkaW5nIGlfcndzZW0gd2hpbGUgY2FsbGluZyBleHQ0X2pvdXJuYWxfc3RhcnQoKSBpcyBzYWZlXG4mIzQzO1x0ICogKGV4dDRfc2V0YXR0ciwgZXh0NF9mYWxsb2NhdGUgZXRjLiBkbyB0aGUgc2FtZSkuICBUaGUgbG9va3VwIG11c3QgYmVcbiYjNDM7XHQgKiBpbnNpZGUgdGhlIGxvY2sgdG8gcHJldmVudCBUT0NUT1U6IHRoZSBiaC9kZSBwb2ludGVycyBtdXN0IGJlIHN0YWJsZVxuJiM0MztcdCAqIGZyb20gZmluZF9lbnRyeSB0aHJvdWdoIGRlbGV0ZV9lbnRyeS4gKi9cbiYjNDM7XHRpbm9kZV9sb2NrX25lc3RlZChkaXIsIElfTVVURVhfUEFSRU5UKTtcbiYjNDM7XG4mIzQzO1x0aGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9IVF9ESVIsXG4mIzQzO1x0XHRcdFx0ICAgIDMgKiBFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKHNiKSAmIzQzO1xuJiM0MztcdFx0XHRcdCAgICAyICogRVhUNF9JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MpO1xuJiM0MztcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuJiM0MztcdFx0ZXJyID0gUFRSX0VSUihoYW5kbGUpO1xuJiM0MztcdFx0aGFuZGxlID0gTlVMTDtcbiYjNDM7XHRcdGdvdG8gb3V0X3VubG9ja19kaXI7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRiaCA9IGV4dDRfZmluZF9lbnRyeShkaXIsIFx1MDAyNmRfbmFtZSwgXHUwMDI2ZGUsIE5VTEwpO1xuJiM0MztcdGlmIChJU19FUlIoYmgpKSB7XG4mIzQzO1x0XHRlcnIgPSBQVFJfRVJSKGJoKTtcbiYjNDM7XHRcdGJoID0gTlVMTDtcbiYjNDM7XHRcdGdvdG8gb3V0X2pvdXJuYWw7XG4mIzQzO1x0fVxuJiM0MztcdGlmICghYmgpIHtcbiYjNDM7XHRcdGVyciA9IC1FTk9FTlQ7XG4mIzQzO1x0XHRnb3RvIG91dF9qb3VybmFsO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aW5vZGUgPSBleHQ0X2lnZXQoc2IsIGxlMzJfdG9fY3B1KGRlLVx1MDAzZWlub2RlKSwgRVhUNF9JR0VUX05PUk1BTCk7XG4mIzQzO1x0aWYgKElTX0VSUihpbm9kZSkpIHtcbiYjNDM7XHRcdGVyciA9IFBUUl9FUlIoaW5vZGUpO1xuJiM0MztcdFx0aW5vZGUgPSBOVUxMO1xuJiM0MztcdFx0Z290byBvdXRfYnJlbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogTG9jayB0aGUgdGFyZ2V0IGlub2RlIGFmdGVyIHRoZSBkaXJlY3RvcnkgKGRpci10aGVuLWNoaWxkIG9yZGVyaW5nKVxuJiM0MztcdCAqIHRvIHNlcmlhbGl6ZSBjb25jdXJyZW50IEVYVDRfSU9DX1NFVF9MVUZJRCBjYWxscyBvbiBkaWZmZXJlbnRcbiYjNDM7XHQgKiBoYXJkbGlua3Mgb2YgdGhlIHNhbWUgaW5vZGUuICBVc2UgSV9NVVRFWF9DSElMRCBmb3IgZGlyZWN0b3J5IGlub2Rlc1xuJiM0MztcdCAqIChjb25zaXN0ZW50IHdpdGggVkZTIHJlbmFtZS9ybWRpcikgYW5kIElfTVVURVhfTk9ORElSMiBmb3IgYWxsXG4mIzQzO1x0ICogb3RoZXJzOyBtaXhpbmcgc3ViY2xhc3NlcyBvbiB0aGUgc2FtZSBpbm9kZSB0cmlnZ2VycyBsb2NrZGVwIGN5Y2xlc1xuJiM0MztcdCAqIHdpdGggY29uY3VycmVudCByZW5hbWUuICovXG4mIzQzO1x0aWYgKGlub2RlICE9IGRpcikge1xuJiM0MztcdFx0aWYgKFNfSVNESVIoaW5vZGUtXHUwMDNlaV9tb2RlKSlcbiYjNDM7XHRcdFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfQ0hJTEQpO1xuJiM0MztcdFx0ZWxzZVxuJiM0MztcdFx0XHRpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9OT05ESVIyKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGVyciA9IGV4dDRfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRnb3RvIG91dF91bmxvY2s7XG4mIzQzO1xuJiM0MztcdGJyZWxzZShiaCk7XG4mIzQzO1x0YmggPSBOVUxMO1xuJiM0MztcbiYjNDM7XHQvKiBSZS1hZGQgd2l0aCBMVUZJRCB2aWEgZGVudHJ5LVx1MDAzZWRfZnNkYXRhLiAgZXh0NF9hZGRfZW50cnkoKSByZXNvbHZlc1xuJiM0MztcdCAqIGRmaWQgZnJvbSBkX2ZzZGF0YSBpbnRvIGZuYW1lLmRmaWQgYW5kIHBhc3NlcyBpdCB0aHJvdWdoIHRvXG4mIzQzO1x0ICogYWRkX2RpcmVudF90b19idWYoKSB3aXRob3V0IHRvdWNoaW5nIHRoZSBzaGFyZWQgaV9kaXJkYXRhIGZpZWxkLFxuJiM0MztcdCAqIGVsaW1pbmF0aW5nIHRoZSByYWNlIHdpdGggY29uY3VycmVudCBsaW5rKCkgY2FsbHMuICovXG4mIzQzO1x0e1xuJiM0MztcdFx0c3RydWN0IGRlbnRyeSBwYXJlbnRfZGVudHJ5ID0geyAuZF9pbm9kZSA9IGRpciB9O1xuJiM0MztcdFx0c3RydWN0IGRlbnRyeSBuZXdfZGVudHJ5ID0ge1xuJiM0MztcdFx0XHQuZF9uYW1lID0gZF9uYW1lLFxuJiM0MztcdFx0XHQuZF9wYXJlbnQgPSBcdTAwMjZwYXJlbnRfZGVudHJ5LFxuJiM0MztcdFx0XHQuZF9pbm9kZSA9IGlub2RlLFxuJiM0MztcdFx0XHQuZF9mc2RhdGEgPSBlZHAsXG4mIzQzO1x0XHR9O1xuJiM0MztcdFx0ZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBcdTAwMjZuZXdfZGVudHJ5LCBpbm9kZSk7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZXJyKSB7XG4mIzQzO1x0XHQvKiBEZWxldGUgc3VjY2VlZGVkIGJ1dCByZS1hZGQgZmFpbGVkOyB0cnkgdG8gcmVzdG9yZSBzbyB0aGVcbiYjNDM7XHRcdCAqIGlub2RlIGlzIG5vdCBsZWZ0IHdpdGhvdXQgYSBkaXJlY3RvcnkgZW50cnkuICovXG4mIzQzO1x0XHRzdHJ1Y3QgZGVudHJ5IHBhcmVudF9kZW50cnkgPSB7IC5kX2lub2RlID0gZGlyIH07XG4mIzQzO1x0XHRzdHJ1Y3QgZGVudHJ5IG9yaWdfZGVudHJ5ID0ge1xuJiM0MztcdFx0XHQuZF9uYW1lID0gZF9uYW1lLFxuJiM0MztcdFx0XHQuZF9wYXJlbnQgPSBcdTAwMjZwYXJlbnRfZGVudHJ5LFxuJiM0MztcdFx0XHQuZF9pbm9kZSA9IGlub2RlLFxuJiM0MztcdFx0fTtcbiYjNDM7XHRcdGludCByb2xsYmFja19lcnIgPSBleHQ0X2FkZF9lbnRyeShoYW5kbGUsIFx1MDAyNm9yaWdfZGVudHJ5LCBpbm9kZSk7XG4mIzQzO1xuJiM0MztcdFx0aWYgKHJvbGxiYWNrX2VycilcbiYjNDM7XHRcdFx0RVhUNF9FUlJPUl9JTk9ERShkaXIsXG4mIzQzO1x0XHRcdFx0XCYjMzQ7RmFpbGVkIHRvIHNldCBMVUZJRCBvbiAmIzM5OyUuKnMmIzM5OyAoZXJyPSVkKSBhbmQgZmFpbGVkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpcmVjdG9yeSBlbnRyeSAoZXJyPSVkKTsgaW5vZGUgJWxsdSBtYXkgYmUgb3JwaGFuZWRcJiMzNDssXG4mIzQzO1x0XHRcdFx0bmFtZWxlbiwgZmlsZW5hbWUsIGVyciwgcm9sbGJhY2tfZXJyLFxuJiM0MztcdFx0XHRcdGlub2RlLVx1MDAzZWlfaW5vKTtcbiYjNDM7XHRcdGdvdG8gb3V0X3VubG9jaztcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlub2RlX3NldF9jdGltZV9jdXJyZW50KGRpcik7XG4mIzQzO1x0aW5vZGVfaW5jX2l2ZXJzaW9uKGRpcik7XG4mIzQzO1x0ZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTtcbiYjNDM7XG4mIzQzO291dF91bmxvY2s6XG4mIzQzO1x0aWYgKGlub2RlICE9IGRpcilcbiYjNDM7XHRcdGlub2RlX3VubG9jayhpbm9kZSk7XG4mIzQzO291dF9icmVsc2U6XG4mIzQzO1x0YnJlbHNlKGJoKTtcbiYjNDM7b3V0X2pvdXJuYWw6XG4mIzQzO1x0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcbiYjNDM7b3V0X3VubG9ja19kaXI6XG4mIzQzO1x0aW5vZGVfdW5sb2NrKGRpcik7XG4mIzQzO1x0aXB1dChpbm9kZSk7XG4mIzQzO291dF9mcmVlOlxuJiM0MztcdGV4dDRfZm5hbWVfZnJlZV9maWxlbmFtZShcdTAwMjZmbmFtZSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBlcnI7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLlxuICAqL1xuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3lzZnMuYyBiL2ZzL2V4dDQvc3lzZnMuY1xuaW5kZXggOTIzYjM3NWUwMTdmYWEuLjgwMDc0ZmIxNWVlOWI3IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9zeXNmcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L3N5c2ZzLmNcbkBAIC0zNjIsNiAmIzQzOzM2Miw3IEBAIEVYVDRfQVRUUl9GRUFUVVJFKHZlcml0eSk7XG4gI2VuZGlmXG4gRVhUNF9BVFRSX0ZFQVRVUkUobWV0YWRhdGFfY3N1bV9zZWVkKTtcbiBFWFQ0X0FUVFJfRkVBVFVSRShmYXN0X2NvbW1pdCk7XG4mIzQzO0VYVDRfQVRUUl9GRUFUVVJFKGRpcmRhdGEpO1xuICNpZiBJU19FTkFCTEVEKENPTkZJR19VTklDT0RFKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfRlNfRU5DUllQVElPTilcbiBFWFQ0X0FUVFJfRkVBVFVSRShlbmNyeXB0ZWRfY2FzZWZvbGQpO1xuICNlbmRpZlxuQEAgLTM4NSw2ICYjNDM7Mzg2LDcgQEAgc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmV4dDRfZmVhdF9hdHRyc1tdID0ge1xuICNlbmRpZlxuIFx0QVRUUl9MSVNUKG1ldGFkYXRhX2NzdW1fc2VlZCksXG4gXHRBVFRSX0xJU1QoZmFzdF9jb21taXQpLFxuJiM0MztcdEFUVFJfTElTVChkaXJkYXRhKSxcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVU5JQ09ERSkgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXG4gXHRBVFRSX0xJU1QoZW5jcnlwdGVkX2Nhc2Vmb2xkKSxcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZXh0NC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxuaW5kZXggOWM2ODM5OTFjMzJmOTYuLjkxMzRmZTY0OTQ3YTkzIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxuQEAgLTM1LDYgJiM0MzszNSw3IEBAXG4gI2RlZmluZSBFWFQ0X0lPQ19TRVRGU1VVSURcdFx0X0lPVygmIzM5O2YmIzM5OywgNDQsIHN0cnVjdCBmc3V1aWQpXG4gI2RlZmluZSBFWFQ0X0lPQ19HRVRfVFVORV9TQl9QQVJBTVx0X0lPUigmIzM5O2YmIzM5OywgNDUsIHN0cnVjdCBleHQ0X3R1bmVfc2JfcGFyYW1zKVxuICNkZWZpbmUgRVhUNF9JT0NfU0VUX1RVTkVfU0JfUEFSQU1cdF9JT1coJiMzOTtmJiMzOTssIDQ2LCBzdHJ1Y3QgZXh0NF90dW5lX3NiX3BhcmFtcylcbiYjNDM7I2RlZmluZSBFWFQ0X0lPQ19TRVRfTFVGSURcdFx0X0lPVygmIzM5O2YmIzM5OywgNDcsIHN0cnVjdCBleHQ0X3NldF9sdWZpZClcbiBcbiAjZGVmaW5lIEVYVDRfSU9DX1NIVVRET1dOIF9JT1IoJiMzOTtYJiMzOTssIDEyNSwgX191MzIpXG4gXG5AQCAtOTIsNiAmIzQzOzkzLDE5IEBAIHN0cnVjdCBtb3ZlX2V4dGVudCB7XG4gXHRfX3U2NCBtb3ZlZF9sZW47XHQvKiBtb3ZlZCBibG9jayBsZW5ndGggKi9cbiB9O1xuIFxuJiM0MzsvKlxuJiM0MzsgKiBTdHJ1Y3R1cmUgZm9yIEVYVDRfSU9DX1NFVF9MVUZJRFxuJiM0MzsgKiBTZXRzIExVRklEIG9uIGEgZGlyZWN0b3J5IGVudHJ5XG4mIzQzOyAqIENhbGxlZCBvbiBwYXJlbnQgZGlyZWN0b3J5IHdpdGggZmlsZW5hbWUgYW5kIExVRklEIGRhdGEgYXMgYXJndW1lbnRzXG4mIzQzOyAqL1xuJiM0MztzdHJ1Y3QgZXh0NF9zZXRfbHVmaWQge1xuJiM0MztcdF9fdTggZXNsX25hbWVfbGVuO1x0LyogbGVuZ3RoIG9mIGZpbGVuYW1lLCBOT1QgaW5jbHVkaW5nIE5VTCB0ZXJtaW5hdG9yXG4mIzQzO1x0XHRcdFx0ICogKHZhbGlkIHJhbmdlOiAxLTI1NSwgbWF0Y2hpbmcgRVhUNF9OQU1FX0xFTikgKi9cbiYjNDM7XHRjaGFyICBlc2xfbmFtZVsyNTUgJiM0MzsgMV07IC8qIGZpbGVuYW1lIChOVUwtdGVybWluYXRlZCkgKi9cbiYjNDM7XHRfX3U4IGVzbF9kYXRhX2xlbjtcdC8qIGxlbmd0aCBvZiBMVUZJRCBkYXRhICovXG4mIzQzO1x0Y2hhciAgZXNsX2RhdGFbMjU1XTsgLyogTFVGSUQgZGF0YSAocmF3IGJ5dGVzKSAqL1xuJiM0Mzt9O1xuJiM0MztcbiAvKlxuICAqIEZsYWdzIHVzZWQgYnkgRVhUNF9JT0NfU0hVVERPV05cbiAgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4ybTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9pb2N0bF9zZXRfbHVmaWQmIzM0OywKICAgICYjMzQ7ZXh0NF9kaXJkYXRhX3NldF9sdWZpZCYjMzQ7LAogICAgJiMzNDtleHQ0X2RpcmRhdGFfZ2V0JiMzNDssCiAgICAmIzM0O2V4dDRfZGlyZGF0YV9zZXQmIzM0OywKICAgICYjMzQ7ZXh0NF9sdWZpZF9zbmFwc2hvdCYjMzQ7LAogICAgJiMzNDtleHQ0X2luc2VydF9kZW50cnlfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X2luaXRfbmV3X2Rpcl9kYXRhJiMzNDssCiAgICAmIzM0O2R4X2dldF9keF9pbmZvJiMzNDssCiAgICAmIzM0O2V4dDRfY2hlY2tfZHhfcm9vdCYjMzQ7LAogICAgJiMzNDtleHQ0X3NldGVudCYjMzQ7LAogICAgJiMzNDtfX2V4dDRfYWRkX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0NCBmZWF0dXJlIGBkaXJkYXRhYCAoRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEpIGFuZCBhIG5ldyBpb2N0bCBgRVhUNF9JT0NfU0VUX0xVRklEYCB0byBhdHRhY2ggTFVGSUQgZGF0YSB0byBkaXJlY3RvcnkgZW50cmllcy4gSXQgbW9kaWZpZXMgY29yZSBkaXJlY3RvcnkgZW50cnkgcGFyc2luZywgaW5zZXJ0aW9uLCBzcGxpdHRpbmcsIGFuZCByZW5hbWluZyBsb2dpYyB0byBoYW5kbGUgdmFyaWFibGUtbGVuZ3RoIGRhdGEgYXBwZW5kZWQgdG8gZGlyZWN0b3J5IGVudHJpZXMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLApldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgoyLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS4KICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgogICBEbyBub3QgbGlzdCB0b28gZ2VuZXJpYyBjb25maWdzICh3ZSBhbHJlYWR5IGhhdmUgdGhlbSBlbmFibGVkKS4gT25seSBsaXN0IHRob3NlIHRoYXQKICAgc3BlY2lmaWNhbGx5IGNvdmVyIHRoZSBtb2RpZmllZCBjb2RlLiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3Mgb3V0cHV0IGFycmF5LAogICBhbmQgRE8gTk9UIGFkZCBhICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgYjQ0MTU4ODE4Y2RiYmY4ZTIyODFhYjI4N2YxN2Q5NzFhNzZiYmZkZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUdWUgSnVsIDE0IDE5OjQyOjA1IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9kaXIuYyBiL2ZzL2V4dDQvZGlyLmMKaW5kZXggMTdlZGQ2NzhmYTg3YjguLjUwYzQ4YzUwYTI5ZDg4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2Rpci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvZGlyLmMKQEAgLTg5LDE2ICYjNDM7ODksMTUgQEAgaW50IF9fZXh0NF9jaGVja19kaXJfZW50cnkoY29uc3QgY2hhciAqZnVuY3Rpb24sIHVuc2lnbmVkIGludCBsaW5lLAogCWJvb2wgZmFrZSA9IGlzX2Zha2VfZGlyX2VudHJ5KGRlKTsKIAlib29sIGhhc19jc3VtID0gZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGRpci0mZ3Q7aV9zYik7CiAKLQlpZiAodW5saWtlbHkocmxlbiAmbHQ7IGV4dDRfZGlyX3JlY19sZW4oMSwgZmFrZSA/IE5VTEwgOiBkaXIpKSkKJiM0MzsJaWYgKHVubGlrZWx5KHJsZW4gJmx0OyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIGZha2UgPyBOVUxMIDogZGlyKSkpCiAJCWVycm9yX21zZyA9ICYjMzQ7cmVjX2xlbiBpcyBzbWFsbGVyIHRoYW4gbWluaW1hbCYjMzQ7OwogCWVsc2UgaWYgKHVubGlrZWx5KHJsZW4gJSA0ICE9IDApKQogCQllcnJvcl9tc2cgPSAmIzM0O3JlY19sZW4gJSA0ICE9IDAmIzM0OzsKLQllbHNlIGlmICh1bmxpa2VseShybGVuICZsdDsgZXh0NF9kaXJfcmVjX2xlbihkZS0mZ3Q7bmFtZV9sZW4sCi0JCQkJCQkJZmFrZSA/IE5VTEwgOiBkaXIpKSkKLQkJZXJyb3JfbXNnID0gJiMzNDtyZWNfbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtZV9sZW4mIzM0OzsKIAllbHNlIGlmICh1bmxpa2VseShuZXh0X29mZnNldCAmZ3Q7IHNpemUpKQogCQllcnJvcl9tc2cgPSAmIzM0O2RpcmVjdG9yeSBlbnRyeSBvdmVycnVuJiMzNDs7Ci0JZWxzZSBpZiAodW5saWtlbHkobmV4dF9vZmZzZXQgJmd0OyBzaXplIC0gZXh0NF9kaXJfcmVjX2xlbigxLAomIzQzOwllbHNlIGlmICh1bmxpa2VseShybGVuICZsdDsgZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBzaXplLCBmYWtlID8gTlVMTCA6IGRpcikpKQomIzQzOwkJZXJyb3JfbXNnID0gJiMzNDtyZWNfbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtZV9sZW4mIzM0OzsKJiM0MzsJZWxzZSBpZiAodW5saWtlbHkobmV4dF9vZmZzZXQgJmd0OyBzaXplIC0gZXh0NF9kaXJlbnRfcmVjX2xlbigxLAogCQkJCQkJICBoYXNfY3N1bSA/IE5VTEwgOiBkaXIpICZhbXA7JmFtcDsKIAkJCSAgbmV4dF9vZmZzZXQgIT0gc2l6ZSkpCiAJCWVycm9yX21zZyA9ICYjMzQ7ZGlyZWN0b3J5IGVudHJ5IHRvbyBjbG9zZSB0byBibG9jayBlbmQmIzM0OzsKQEAgLTI0NSw3ICYjNDM7MjQ0LDcgQEAgc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KQogCQkJCSAqIGZhaWx1cmUgd2lsbCBiZSBkZXRlY3RlZCBpbiB0aGUKIAkJCQkgKiBkaXJlbnQgdGVzdCBiZWxvdy4gKi8KIAkJCQlpZiAoZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0mZ3Q7cmVjX2xlbiwKLQkJCQkJc2ItJmd0O3NfYmxvY2tzaXplKSAmbHQ7IGV4dDRfZGlyX3JlY19sZW4oMSwKJiM0MzsJCQkJCXNiLSZndDtzX2Jsb2Nrc2l6ZSkgJmx0OyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsCiAJCQkJCQkJCQlpbm9kZSkpCiAJCQkJCWJyZWFrOwogCQkJCWkgJiM0Mzs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtJmd0O3JlY19sZW4sCkBAIC00NjgsMjcgJiM0Mzs0NjcsNDMgQEAgdm9pZCBleHQ0X2h0cmVlX2ZyZWVfZGlyX2luZm8oc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKnApCiAgKiBUaGUgZGVjcnlwdGVkIGZpbGVuYW1lIGlzIHBhc3NlZCBpbiB2aWEgZW50X25hbWUuICBwYXJhbWV0ZXIuCiAgKi8KIGludCBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIGhhc2gsCi0JCQkgICAgIF9fdTMyIG1pbm9yX2hhc2gsCiYjNDM7CQkJICAgICBfX3UzMiBtaW5vcl9oYXNoLCBpbnQgYnVmX3NpemUsCiAJCQkgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCwKIAkJCSAgICBzdHJ1Y3QgZnNjcnlwdF9zdHIgKmVudF9uYW1lKQogewogCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudCA9IE5VTEw7CiAJc3RydWN0IGZuYW1lICpmbmFtZSwgKm5ld19mbjsKIAlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbzsKJiM0MzsJaW50IGV4dHJhX2RhdGEgPSAwOwogCiAJaW5mbyA9IGRpcl9maWxlLSZndDtwcml2YXRlX2RhdGE7CiAJcCA9ICZhbXA7aW5mby0mZ3Q7cm9vdC5yYl9ub2RlOwogCiAJLyogQ3JlYXRlIGFuZCBhbGxvY2F0ZSB0aGUgZm5hbWUgc3RydWN0dXJlICovCi0JbmV3X2ZuID0ga3phbGxvY19mbGV4KCpuZXdfZm4sIG5hbWUsIGVudF9uYW1lLSZndDtsZW4gJiM0MzsgMSk7CiYjNDM7CWlmIChkaXJlbnQtJmd0O2ZpbGVfdHlwZSAmYW1wOyB+RVhUNF9GVF9NQVNLKSB7CiYjNDM7CQl1bnNpZ25lZCBpbnQgcmVjX2xlbiA9CiYjNDM7CQkJZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkaXJlbnQtJmd0O3JlY19sZW4sIGJ1Zl9zaXplKTsKJiM0MzsJCWV4dHJhX2RhdGEgPSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oZGlyZW50LCByZWNfbGVuKTsKJiM0MzsJfQomIzQzOwomIzQzOwkvKiBleHRhX2RhdGEgY29udGFpbnMgJiM0MzsxIGJ5dGUgZm9yIE5VTEwgKi8KJiM0MzsJbmV3X2ZuID0ga3phbGxvY19mbGV4KCpuZXdfZm4sIG5hbWUsIGVudF9uYW1lLSZndDtsZW4gJiM0MzsKJiM0MzsJCQkgICAgICAoZXh0cmFfZGF0YSA/IGV4dHJhX2RhdGEgOiAxKSk7CiAJaWYgKCFuZXdfZm4pCiAJCXJldHVybiAtRU5PTUVNOwogCW5ld19mbi0mZ3Q7aGFzaCA9IGhhc2g7CiAJbmV3X2ZuLSZndDttaW5vcl9oYXNoID0gbWlub3JfaGFzaDsKIAluZXdfZm4tJmd0O2lub2RlID0gbGUzMl90b19jcHUoZGlyZW50LSZndDtpbm9kZSk7Ci0JbmV3X2ZuLSZndDtuYW1lX2xlbiA9IGVudF9uYW1lLSZndDtsZW47CiAJbmV3X2ZuLSZndDtmaWxlX3R5cGUgPSBkaXJlbnQtJmd0O2ZpbGVfdHlwZTsKJiM0MzsJbmV3X2ZuLSZndDtuYW1lX2xlbiA9IGVudF9uYW1lLSZndDtsZW47CiAJbWVtY3B5KG5ld19mbi0mZ3Q7bmFtZSwgZW50X25hbWUtJmd0O25hbWUsIGVudF9uYW1lLSZndDtsZW4pOwomIzQzOwlpZiAoZXh0cmFfZGF0YSkKJiM0MzsJCS8qIERpcmRhdGEgYnl0ZXMgbGllIHBhc3QgdGhlIF9fY291bnRlZF9ieShuYW1lX2xlbikgYm91bmQgYnV0CiYjNDM7CQkgKiB3aXRoaW4gdGhlIGt6YWxsb2NfZmxleCBhbGxvY2F0aW9uOyB1c2UgdW5zYWZlX21lbWNweSB0bwomIzQzOwkJICogYXZvaWQgYSBGT1JUSUZZX1NPVVJDRSBmYWxzZSBwb3NpdGl2ZS4gKi8KJiM0MzsJCXVuc2FmZV9tZW1jcHkobmV3X2ZuLSZndDtuYW1lICYjNDM7IGVudF9uYW1lLSZndDtsZW4sCiYjNDM7CQkJICAgICAgZGlyZW50LSZndDtuYW1lICYjNDM7IGRpcmVudC0mZ3Q7bmFtZV9sZW4sIGV4dHJhX2RhdGEsCiYjNDM7CQkJICAgICAgLyogd2l0aGluIGt6YWxsb2NfZmxleCBhbGxvY2F0aW9uICovKTsKIAogCXdoaWxlICgqcCkgewogCQlwYXJlbnQgPSAqcDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NC5oIGIvZnMvZXh0NC9leHQ0LmgKaW5kZXggYjM3YzEzNmVhM2FiMzMuLjE1ZDg4NWNmM2JkMDI1IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2V4dDQuaApAQCAtMTIyNyw2ICYjNDM7MTIyNyw3IEBAIHN0cnVjdCBleHQ0X2lub2RlX2luZm8gewogI2lmZGVmIENPTkZJR19GU19FTkNSWVBUSU9OCiAJc3RydWN0IGZzY3J5cHRfaW5vZGVfaW5mbyAqaV9jcnlwdF9pbmZvOwogI2VuZGlmCiYjNDM7CXZvaWQgKmlfZGlyZGF0YTsKIH07CiAKIC8qCkBAIC0yMzM0LDYgJiM0MzsyMzM1LDcgQEAgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZVTkNTKGNhc2Vmb2xkLAkJQ0FTRUZPTEQpCiAJCQkJCSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRkxFWF9CR3wgXAogCQkJCQkgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VBX0lOT0RFfCBcCiAJCQkJCSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTU1QIHwgXAomIzQzOwkJCQkJIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBIHwgXAogCQkJCQkgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0lOTElORV9EQVRBIHwgXAogCQkJCQkgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VOQ1JZUFQgfCBcCiAJCQkJCSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfQ0FTRUZPTEQgfCBcCkBAIC0yNDcyLDEwICYjNDM7MjQ3NCw4IEBAIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfZW1lcmdlbmN5X3N0YXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiAgKiBTdHJ1Y3R1cmUgb2YgYSBkaXJlY3RvcnkgZW50cnkKICAqLwogI2RlZmluZSBFWFQ0X05BTUVfTEVOIDI1NQotLyoKLSAqIEJhc2UgbGVuZ3RoIG9mIHRoZSBleHQ0IGRpcmVjdG9yeSBlbnRyeSBleGNsdWRpbmcgdGhlIG5hbWUgbGVuZ3RoCi0gKi8KLSNkZWZpbmUgRVhUNF9CQVNFX0RJUl9MRU4gKHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMikgLSBFWFQ0X05BTUVfTEVOKQomIzQzOy8qIG9mZnNldG9mIGF2b2lkcyBzaXplb2YoKSYjNDM7cGFkZGluZyBnaXZpbmcgOSBpbnN0ZWFkIG9mIHRoZSBjb3JyZWN0IG9uLWRpc2sgOCAqLwomIzQzOyNkZWZpbmUgRVhUNF9CQVNFX0RJUl9MRU4gb2Zmc2V0b2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIsIG5hbWUpCiAKIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSB7CiAJX19sZTMyCWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLwpAQCAtMjU1Niw2ICYjNDM7MjU1Niw2MSBAQCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCB7CiAjZGVmaW5lIEVYVDRfRlRfU1lNTElOSwkJNwogCiAjZGVmaW5lIEVYVDRfRlRfTUFYCQk4CiYjNDM7I2RlZmluZSBFWFQ0X0ZUX01BU0sJCTB4ZgomIzQzOwomIzQzOyNpZiBFWFQ0X0ZUX01BWCAmZ3Q7IEVYVDRfRlRfTUFTSwomIzQzOyNlcnJvciAmIzM0O2NvbmZsaWN0aW5nIEVYVDRfRlRfTUFYIGFuZCBFWFQ0X0ZUX01BU0smIzM0OwomIzQzOyNlbmRpZgomIzQzOwomIzQzOy8qCiYjNDM7ICogZF90eXBlIGhhcyA0IHVudXNlZCBiaXRzLCBzbyBpdCBjYW4gaG9sZCBmb3VyIHR5cGVzIG9mIGRhdGEuIFRoZXNlIGRpZmZlcmVudAomIzQzOyAqIHR5cGVzIG9mIGRhdGEgKGUuZy4gZnNjeXB0IGhhc2gsIGhpZ2ggMzIgYml0cyBvZiA2NC1iaXQgaW5vZGUgbnVtYmVyKSBjYW4gYmUKJiM0MzsgKiBzdG9yZWQsIGluIGZsYWcgb3JkZXIsIGFmdGVyIGZpbGUtbmFtZSBpbiBleHQ0IGRpcmVudC4KJiM0MzsgKgomIzQzOyAqIFRoZXNlIGZsYWdzIGFyZSBhZGRlZCB0byBkX3R5cGUgaWYgZXh0NCBkaXJlbnQgaGFzIGV4dHJhIGRhdGEgYWZ0ZXIKJiM0MzsgKiBmaWxlbmFtZS4gVGhpcyBkYXRhIGxlbmd0aCBpcyB2YXJpYWJsZSBhbmQgbGVuZ3RoIGlzIHN0b3JlZCBpbiBmaXJzdCBieXRlCiYjNDM7ICogb2YgZGF0YS4gRGF0YSBzdGFydHMgYWZ0ZXIgZmlsZW5hbWUgTlVMIGJ5dGUuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBFWFQ0X0RJUkVOVF9MVUZJRAkJMHgxMAomIzQzOyNkZWZpbmUgRVhUNF9ESVJFTlRfSU5PNjQJCTB4MjAKJiM0MzsjZGVmaW5lIEVYVDRfRElSRU5UX0NGSEFTSAkJMHg0MAomIzQzOwomIzQzO3N0cnVjdCBleHQ0X2ZpZCB7CiYjNDM7CWNoYXIgICAgZmlkWzE2XTsgICAgIC8qIDEyOC1iaXQgdW5pcXVlIGZpbGUgaWRlbnRpZmllciAqLwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyIHsKJiM0MzsJLyogbGVuZ3RoIG9mIHRoaXMgaGVhZGVyICYjNDM7IHRoZSB3aG9sZSBkYXRhIGJsb2IgKi8KJiM0MzsJX191OAlkZGhfbGVuZ3RoOwomIzQzO30gX19wYWNrZWQ7CiYjNDM7CiYjNDM7c3RydWN0IGV4dDRfZGlyZW50X2ZpZCB7CiYjNDM7CXN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciBkZl9oZWFkZXI7CiYjNDM7CXN0cnVjdCBleHQ0X2ZpZCAgICAgICAgICAgICAgICBkZl9maWRbXTsKJiM0Mzt9OwomIzQzOwomIzQzOyNkZWZpbmUgRVhUNF9MVUZJRF9NQUdJQyAgICAweEFEMjAwOTA3VUwKJiM0MztzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gewomIzQzOwlfX3UzMgkJCWVkcF9tYWdpYzsJLyogRVhUNF9MVUZJRF9NQUdJQyAqLwomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkCWVkcF9kZmlkOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IGV4dDRfZGlyZW50X2hhc2ggewomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIJZGhfaGVhZGVyOwomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfaGFzaAlkaF9oYXNoOwomIzQzO30gX19wYWNrZWQ7CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZQomIzQzO3N0cnVjdCBleHQ0X2RpcmVudF9maWQgKmV4dDRfZGVudHJ5X2dldF9maWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKJiM0MzsJCQkJCSAgICBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKnApCiYjNDM7ewomIzQzOwlpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShzYikpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKHAgJmFtcDsmYW1wOyBwLSZndDtlZHBfbWFnaWMgPT0gRVhUNF9MVUZJRF9NQUdJQykKJiM0MzsJCXJldHVybiAmYW1wO3AtJmd0O2VkcF9kZmlkOwomIzQzOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiAKICNkZWZpbmUgRVhUNF9GVF9ESVJfQ1NVTQkweERFCiAKQEAgLTI1NzMsMTMgJiM0MzsyNjI4LDI2IEBAIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsIHsKICAqIGNhc2Vmb2xkZWQgYW5kIGVuY3J5cHRlZCBuZWVkIHRvIHN0b3JlIHRoZSBoYXNoIGFzIHdlbGwsIHNvIHdlIGFkZCByb29tIGZvcgogICogZXh0NF9leHRlbmRlZF9kaXJfZW50cnlfMi4gRm9yIGFsbCBlbnRyaWVzIHJlbGF0ZWQgdG8gJiMzOTsuJiMzOTsgb3IgJiMzOTsuLiYjMzk7IHlvdSBzaG91bGQKICAqIHBhc3MgTlVMTCBmb3IgZGlyLCBhcyB0aG9zZSBlbnRyaWVzIGRvIG5vdCB1c2UgdGhlIGV4dHJhIGZpZWxkcy4KJiM0MzsgKgomIzQzOyAqIEZvciBkaXJlY3RvcmllcyB3aXRoIHRoZSBkaXJkYXRhIGZlYXR1cmUsIGV4dHJhIGRhdGEgbWF5IGZvbGxvdyB0aGUgZmlsZW5hbWUuCiYjNDM7ICogVXNlIGV4dDRfZGlyX2VudHJ5X2xlbigpIHRvIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeQomIzQzOyAqIGluY2x1ZGluZyBhbnkgZGlyZGF0YSwgb3IgZXh0NF9kaXJlbnRfcmVjX2xlbigpIGRpcmVjdGx5IHdoZW4gdGhlIHRvdGFsCiYjNDM7ICogbmFtZV9sZW4gKGluY2x1ZGluZyBkaXJkYXRhIGxlbmd0aCkgaXMgYWxyZWFkeSBrbm93bi4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXh0NF9kaXJfcmVjX2xlbihfX3U4IG5hbWVfbGVuLAomIzQzO3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV4dDRfZGlyZW50X3JlY19sZW4odW5zaWduZWQgaW50IG5hbWVfbGVuLAogCQkJCQkJY29uc3Qgc3RydWN0IGlub2RlICpkaXIpCiB7Ci0JaW50IHJlY19sZW4gPSAobmFtZV9sZW4gJiM0MzsgOCAmIzQzOyBFWFQ0X0RJUl9ST1VORCk7CiYjNDM7CXVuc2lnbmVkIGludCByZWNfbGVuID0gKG5hbWVfbGVuICYjNDM7IDggJiM0MzsgRVhUNF9ESVJfUk9VTkQpOwogCi0JaWYgKGRpciAmYW1wOyZhbXA7IGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkKJiM0MzsJLyoKJiM0MzsJICogV2l0aG91dCBkaXJkYXRhLCB0aGUgY2FzZWZvbGQmIzQzO2ZzY3J5cHQgaGFzaCBsaXZlcyBhdCBhIGZpeGVkIHBvc2l0aW9uCiYjNDM7CSAqIGFmdGVyIHRoZSBmaWxlbmFtZSBhbmQgbXVzdCBiZSByZXNlcnZlZCBleHBsaWNpdGx5LiAgV2l0aCBkaXJkYXRhIHRoZQomIzQzOwkgKiBoYXNoIGlzIHN0b3JlZCBhcyBhIENGSEFTSCBleHRlbnNpb24gYW5kIGlzIGFscmVhZHkgY291bnRlZCBpbiB0aGUKJiM0MzsJICogbmFtZV9sZW4gYXJndW1lbnQgKHZpYSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4pLCBzbyBhZGRpbmcgaXQgYWdhaW4KJiM0MzsJICogd291bGQgZG91YmxlLWNvdW50LgomIzQzOwkgKi8KJiM0MzsJaWYgKGRpciAmYW1wOyZhbXA7IGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci0mZ3Q7aV9zYikpCiAJCXJlY19sZW4gJiM0Mzs9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfaGFzaCk7CiAJcmV0dXJuIChyZWNfbGVuICZhbXA7IH5FWFQ0X0RJUl9ST1VORCk7CiB9CkBAIC0yNjY3LDYgJiM0MzsyNzM1LDggQEAgc3RydWN0IGV4dDRfZmlsZW5hbWUgewogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpCiAJc3RydWN0IHFzdHIgY2ZfbmFtZTsKICNlbmRpZgomIzQzOwkvKiBMVUZJRC9kaXJkYXRhIHBheWxvYWQgdG8gZW1iZWQgaW4gdGhlIG5ldyBkaXJlY3RvcnkgZW50cnksIG9yIE5VTEwgKi8KJiM0MzsJc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZDsKIH07CiAKICNkZWZpbmUgZm5hbWVfbmFtZShwKSAoKHApLSZndDtkaXNrX25hbWUubmFtZSkKQEAgLTI5NzgsMTggJiM0MzszMDQ4LDI3IEBAIGV4dGVybiBpbnQgX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgc3RydWN0IGlub2RlICosCiAJdW5saWtlbHkoX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShfX2Z1bmNfXywgX19MSU5FX18sIChkaXIpLCAoZmlscCksIFwKIAkJCQkoZGUpLCAoYmgpLCAoYnVmKSwgKHNpemUpLCAob2Zmc2V0KSkpCiBleHRlcm4gaW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCwKLQkJCQlfX3UzMiBtaW5vcl9oYXNoLAomIzQzOwkJCQlfX3UzMiBtaW5vcl9oYXNoLCBpbnQgYnVmX3NpemUsCiAJCQkJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCwKIAkJCQlzdHJ1Y3QgZnNjcnlwdF9zdHIgKmVudF9uYW1lKTsKIGV4dGVybiB2b2lkIGV4dDRfaHRyZWVfZnJlZV9kaXJfaW5mbyhzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqcCk7CiBleHRlcm4gaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJICAgICB2b2lkICpidWYsIGludCBidWZfc2l6ZSwKIAkJCSAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLAotCQkJICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmRlc3RfZGUpOwotdm9pZCBleHQ0X2luc2VydF9kZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsCi0JCQlpbnQgYnVmX3NpemUsCi0JCQlzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUpOwomIzQzOwkJCSAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipkZXN0X2RlLAomIzQzOwkJCSAgICAgaW50IGRsZW4pOwomIzQzO3ZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiYjNDM7CQkJICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsCiYjNDM7CQkJICAgICBpbnQgYnVmX3NpemUsCiYjNDM7CQkJICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsCiYjNDM7CQkJICAgICB2b2lkICpkYXRhKTsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsCiYjNDM7CQkJCSAgICAgIGludCBidWZfc2l6ZSwKJiM0MzsJCQkJICAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lKQomIzQzO3sKJiM0MzsJZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEoZGlyLCBpbm9kZSwgZGUsIGJ1Zl9zaXplLCBmbmFtZSwgTlVMTCk7CiYjNDM7fQogc3RhdGljIGlubGluZSB2b2lkIGV4dDRfdXBkYXRlX2R4X2ZsYWcoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZGlyX2luZGV4KGlub2RlLSZndDtpX3NiKSAmYW1wOyZhbXA7CkBAIC0zMDAzLDEyICYjNDM7MzA4MiwxNCBAQCBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBleHQ0X2ZpbGV0eXBlX3RhYmxlW10gPSB7CiAJRFRfVU5LTk9XTiwgRFRfUkVHLCBEVF9ESVIsIERUX0NIUiwgRFRfQkxLLCBEVF9GSUZPLCBEVF9TT0NLLCBEVF9MTksKIH07CiAKLXN0YXRpYyBpbmxpbmUgIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSkKJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSkKIHsKLQlpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoc2IpIHx8IGZpbGV0eXBlICZndDs9IEVYVDRfRlRfTUFYKQomIzQzOwl1bnNpZ25lZCBjaGFyIGZsX2luZGV4ID0gZmlsZXR5cGUgJmFtcDsgRVhUNF9GVF9NQVNLOwomIzQzOwomIzQzOwlpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoc2IpIHx8IGZsX2luZGV4ICZndDs9IEVYVDRfRlRfTUFYKQogCQlyZXR1cm4gRFRfVU5LTk9XTjsKIAotCXJldHVybiBleHQ0X2ZpbGV0eXBlX3RhYmxlW2ZpbGV0eXBlXTsKJiM0MzsJcmV0dXJuIGV4dDRfZmlsZXR5cGVfdGFibGVbZmxfaW5kZXhdOwogfQogZXh0ZXJuIGludCBleHQ0X2NoZWNrX2FsbF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCSAgICAgdm9pZCAqYnVmLCBpbnQgYnVmX3NpemUpOwpAQCAtMzIzMSwxMCAmIzQzOzMzMTIsMTggQEAgZXh0ZXJuIGludCBleHQ0X2V4dF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogLyogbmFtZWkuYyAqLwotZXh0ZXJuIGludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCSAgICAgc3RydWN0IGlub2RlICppbm9kZSk7CiYjNDM7ZXh0ZXJuIGludCBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLAomIzQzOwkJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiYjNDM7CQkJCSAgY29uc3Qgdm9pZCAqZGF0YTEsIGNvbnN0IHZvaWQgKmRhdGEyKTsKJiM0MztzdGF0aWMgaW5saW5lIGludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKJiM0MzsJCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiYjNDM7ewomIzQzOwlyZXR1cm4gZXh0NF9pbml0X25ld19kaXJfZGF0YShoYW5kbGUsIGRpciwgaW5vZGUsIE5VTEwsIE5VTEwpOwomIzQzO30KIGV4dGVybiBpbnQgZXh0NF9kaXJibG9ja19jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CiYjNDM7ZXh0ZXJuIGludCBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKJiM0MzsJCQkgICBpbnQgbmFtZWxlbiwgc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICplZHApOwogZXh0ZXJuIGludCBleHQ0X2h0cmVlX2ZpbGxfdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIHN0YXJ0X2hhc2gsCiAJCQkJX191MzIgc3RhcnRfbWlub3JfaGFzaCwgX191MzIgKm5leHRfaGFzaCk7CiBleHRlcm4gaW50IGV4dDRfc2VhcmNoX2RpcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLApAQCAtMzgwNyw2ICYjNDM7Mzg5NiwxMCBAQCBleHRlcm4gaW50IF9fZXh0NF91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsCiAJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGV4dGVybiBpbnQgX19leHQ0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwomIzQzO2V4dGVybiB1bnNpZ25lZCBjaGFyIGV4dDRfZGlyZGF0YV9nZXQoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IGJ1Zl9zaXplLAomIzQzOwkJCQkgICAgICBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICAqbHVmaWQsCiYjNDM7CQkJCSAgICAgIHN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvKTsKIAogI2RlZmluZSBTX1NISUZUIDEyCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBleHQ0X3R5cGVfYnlfbW9kZVsoU19JRk1UICZndDsmZ3Q7IFNfU0hJRlQpICYjNDM7IDFdID0gewpAQCAtNDAwNCw2ICYjNDM7NDA5NywxMDkgQEAgc3RhdGljIGlubGluZSB2b2lkIGV4dDRfY2xlYXJfaW9fdW53cml0dGVuX2ZsYWcoZXh0NF9pb19lbmRfdCAqaW9fZW5kKQogCQlpb19lbmQtJmd0O2ZsYWcgJmFtcDs9IH5FWFQ0X0lPX0VORF9VTldSSVRURU47CiB9CiAKJiM0MzsvKgomIzQzOyAqIEFkdmFuY2UgdG8gdGhlIG5leHQgZGlyZGF0YSByZWNvcmQgaGVhZGVyIHN0YXJ0aW5nIGZyb20gQGRkaC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIGV4dDRfZGlyZGF0YV9uZXh0KGRkaCkgXAomIzQzOwkoKHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqKSgoY2hhciAqKShkZGgpICYjNDM7IChkZGgpLSZndDtkZGhfbGVuZ3RoKSkKJiM0MzsKJiM0MzsvKgomIzQzOyAqIGV4dDRfZGlyX2VudHJ5X2lzX3RhaWwoKSAtIENoZWNrIGlmIGEgZGlyZWN0b3J5IGVudHJ5IGlzIGEgdGFpbCBlbnRyeS4KJiM0MzsgKiBAZGU6IGRpcmVjdG9yeSBlbnRyeSB0byBjaGVjawomIzQzOyAqCiYjNDM7ICogUmV0dXJucyB0cnVlIGlmIEBkZSBpcyBhIGRpcmVjdG9yeSBibG9jayB0YWlsIGVudHJ5IChjaGVja3N1bSByZWNvcmQpLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBleHQ0X2Rpcl9lbnRyeV9pc190YWlsKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsICp0ID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsICopZGU7CiYjNDM7CiYjNDM7CXJldHVybiAhdC0mZ3Q7ZGV0X3Jlc2VydmVkX3plcm8xICZhbXA7JmFtcDsKJiM0MzsJICAgICAgIGxlMTZfdG9fY3B1KHQtJmd0O2RldF9yZWNfbGVuKSA9PSBzaXplb2YoKnQpICZhbXA7JmFtcDsKJiM0MzsJICAgICAgICF0LSZndDtkZXRfcmVzZXJ2ZWRfemVybzIgJmFtcDsmYW1wOwomIzQzOwkgICAgICAgdC0mZ3Q7ZGV0X3Jlc2VydmVkX2Z0ID09IEVYVDRfRlRfRElSX0NTVU07CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKCkgLSBDb21wdXRlIHRoZSB0b3RhbCBkaXJkYXRhIGxlbmd0aCBmb3IgYW4gZW50cnkuCiYjNDM7ICogQGRlOiBkaXJlY3RvcnkgZW50cnkKJiM0MzsgKiBAcmVjX2xlbjogdGhlIHJlY29yZCBsZW5ndGggb2YgdGhlIGRpcmVjdG9yeSBlbnRyeSAoZGVjb2RlZCkKJiM0MzsgKgomIzQzOyAqIENvbXB1dGVzIHRoZSBsZW5ndGggb2Ygb3B0aW9uYWwgZGF0YSBzdG9yZWQgYWZ0ZXIgdGhlIGZpbGVuYW1lIChhbmQgaXRzCiYjNDM7ICogaW1wbGljaXQgTlVMIHRlcm1pbmF0b3IpLiAgRWFjaCBleHRlbnNpb24gaXMgaW5kaWNhdGVkIGJ5IGEgYml0IGluIHRoZQomIzQzOyAqIGhpZ2ggNCBiaXRzIG9mIGRlLSZndDtmaWxlX3R5cGU7IHRoZSBmaXJzdCBieXRlIG9mIGVhY2ggZXh0ZW5zaW9uIGlzIGl0cwomIzQzOyAqIGxlbmd0aCAoaW5jbHVkaW5nIHRoYXQgbGVuZ3RoIGJ5dGUgaXRzZWxmKS4KJiM0MzsgKgomIzQzOyAqIFJldHVybnMgMCBmb3IgdGFpbCBlbnRyaWVzIGFuZCBmb3IgZW50cmllcyB3aXRoIG5vIGRpcmRhdGEuCiYjNDM7ICovCiYjNDM7c3RhdGljIGlubGluZSBpbnQgZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwKJiM0MzsJCQkJCSAgIHVuc2lnbmVkIGludCByZWNfbGVuKQomIzQzO3sKJiM0MzsJX191OCBleHRyYV9kYXRhX2ZsYWdzOwomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIgKmRkaDsKJiM0MzsJaW50IGRsZW4gPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwomIzQzOwomIzQzOwlpZiAoZXh0NF9kaXJfZW50cnlfaXNfdGFpbChkZSkpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJZXh0cmFfZGF0YV9mbGFncyA9IChkZS0mZ3Q7ZmlsZV90eXBlICZhbXA7IH5FWFQ0X0ZUX01BU0spICZndDsmZ3Q7IDQ7CiYjNDM7CS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGVudHJ5IHRvIGFmdGVyIGZpbGVuYW1lICYjNDM7IE5VTCAqLwomIzQzOwlvZmZzZXQgPSBFWFQ0X0JBU0VfRElSX0xFTiAmIzQzOyBkZS0mZ3Q7bmFtZV9sZW4gJiM0MzsgMTsKJiM0MzsKJiM0MzsJLyogYm91bmRzIGNoZWNrOiBlbnN1cmUgd2Ugc3RhcnQgcmVhZGluZyB3aXRoaW4gdGhlIGVudHJ5ICovCiYjNDM7CWlmIChvZmZzZXQgJmd0Oz0gcmVjX2xlbikKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlkZGggPSAoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopKChjaGFyICopZGUgJiM0Mzsgb2Zmc2V0KTsKJiM0MzsKJiM0MzsJd2hpbGUgKGV4dHJhX2RhdGFfZmxhZ3MpIHsKJiM0MzsJCWlmIChleHRyYV9kYXRhX2ZsYWdzICZhbXA7IDEpIHsKJiM0MzsJCQkvKiBib3VuZHMgY2hlY2sgYmVmb3JlIHJlYWRpbmcgZGRoX2xlbmd0aCAqLwomIzQzOwkJCWlmIChvZmZzZXQgJiM0Mzsgc2l6ZW9mKCpkZGgpICZndDsgcmVjX2xlbikKJiM0MzsJCQkJcmV0dXJuIGRsZW47CiYjNDM7CiYjNDM7CQkJLyogdmFsaWRhdGUgZGRoX2xlbmd0aCBpcyByZWFzb25hYmxlIOKAlCByZWFkIG9uY2UgdG8KJiM0MzsJCQkgKiBhdm9pZCBhIFRPQ1RPVSBkb3VibGUtZmV0Y2ggb24gdGhlIGRpc2sgZmllbGQgKi8KJiM0MzsJCQl7CiYjNDM7CQkJCXU4IGRkaF9sZW4gPSBkZGgtJmd0O2RkaF9sZW5ndGg7CiYjNDM7CiYjNDM7CQkJCWlmIChkZGhfbGVuID09IDAgfHwgZGRoX2xlbiAmZ3Q7IHJlY19sZW4gLSBvZmZzZXQpCiYjNDM7CQkJCQlyZXR1cm4gZGxlbjsKJiM0MzsJCQkJZGxlbiAmIzQzOz0gZGRoX2xlbiAmIzQzOyAoZGxlbiA9PSAwKTsKJiM0MzsJCQkJb2Zmc2V0ICYjNDM7PSBkZGhfbGVuOwomIzQzOwkJCX0KJiM0MzsJCQlkZGggPSBleHQ0X2RpcmRhdGFfbmV4dChkZGgpOwomIzQzOwkJfQomIzQzOwkJZXh0cmFfZGF0YV9mbGFncyAmZ3Q7Jmd0Oz0gMTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gZGxlbjsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBleHQ0X2Rpcl9lbnRyeV9sZW4oKSAtIENvbXB1dGUgdGhlIHJlcXVpcmVkIHJlY19sZW4gZm9yIGEgZGlyZWN0b3J5IGVudHJ5LgomIzQzOyAqIEBkZTogICAgICAgIGRpcmVjdG9yeSBlbnRyeSAodXNlZCB0byByZWFkIG5hbWVfbGVuIGFuZCBhbnkgZGlyZGF0YSBsZW5ndGgpCiYjNDM7ICogQGJsb2Nrc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIEBkZSBsaXZlcyBpbiAodGhlIHJlYWwgZGlyZWN0b3J5IGJsb2NrCiYjNDM7ICogICAgICAgICAgICAgc2l6ZSwgb3IgdGhlIHNtYWxsZXIgaW5saW5lLWRhdGEgYnVmZmVyIHNpemUgZm9yIGlubGluZQomIzQzOyAqICAgICAgICAgICAgIGRpcmVjdG9yaWVzKSAtLSB1c2VkIG9ubHkgdG8gZGVjb2RlIEBkZS0mZ3Q7cmVjX2xlbiYjMzk7cyAmIzM0OzAvNjU1MzUKJiM0MzsgKiAgICAgICAgICAgICBtZWFucyByZXN0IG9mIGJ1ZmZlciYjMzQ7IHNlbnRpbmVsIGNvcnJlY3RseS4KJiM0MzsgKiBAZGlyOiAgICAgICBkaXJlY3RvcnkgaW5vZGUgKG1heSBiZSBOVUxMIGZvciAmIzM5Oy4mIzM5OyBhbmQgJiMzOTsuLiYjMzk7IGVudHJpZXMsIHdoaWNoCiYjNDM7ICogICAgICAgICAgICAgbmV2ZXIgY2FycnkgdGhlIGNhc2Vmb2xkJiM0Mztmc2NyeXB0IGhhc2ggcmVnYXJkbGVzcyBvZiB0aGUKJiM0MzsgKiAgICAgICAgICAgICBkaXJlY3RvcnkmIzM5O3MgZmVhdHVyZSBmbGFncykKJiM0MzsgKgomIzQzOyAqIFJldHVybnMgdGhlIG1pbmltdW0gcmVjb3JkIGxlbmd0aCBuZWVkZWQgdG8gaG9sZCBAZGUsIHJvdW5kZWQgdXAgdG8gdGhlCiYjNDM7ICogZGlyZWN0b3J5IGFsaWdubWVudCBhbmQgaW5jbHVkaW5nIHJvb20gZm9yIHRoZSBjYXNlZm9sZCYjNDM7ZnNjcnlwdCBoYXNoIGlmCiYjNDM7ICogdGhlIGRpcmVjdG9yeSByZXF1aXJlcyBpdC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQ0X2Rpcl9lbnRyeV9sZW4oc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLAomIzQzOwkJCQkJICAgICAgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwKJiM0MzsJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgaW50IHJlY19sZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLSZndDtyZWNfbGVuLCBibG9ja3NpemUpOwomIzQzOwl1bnNpZ25lZCBpbnQgZGlyZGF0YSA9IGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbihkZSwgcmVjX2xlbik7CiYjNDM7CiYjNDM7CXJldHVybiBleHQ0X2RpcmVudF9yZWNfbGVuKGRlLSZndDtuYW1lX2xlbiAmIzQzOyBkaXJkYXRhLCBkaXIpOwomIzQzO30KJiM0MzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW9tYXBfb3BzIGV4dDRfaW9tYXBfb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpb21hcF9vcHMgZXh0NF9pb21hcF9yZXBvcnRfb3BzOwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmMKaW5kZXggOGUyMjU5Nzk5NjE0ZTkuLjAwNmQ0NWU5Y2U4Nzk4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5jCkBAIC0yNjk3LDYgJiM0MzsyNjk3LDcgQEAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmY19pbmVsaWdpYmxlX3JlYXNvbnNbXSA9IHsKIAlbRVhUNF9GQ19SRUFTT05fTUlHUkFURV0gPSAmIzM0O0lub2RlIGZvcm1hdCBtaWdyYXRpb24mIzM0OywKIAlbRVhUNF9GQ19SRUFTT05fVkVSSVRZXSA9ICYjMzQ7ZnMtdmVyaXR5IGVuYWJsZSYjMzQ7LAogCVtFWFQ0X0ZDX1JFQVNPTl9NT1ZFX0VYVF0gPSAmIzM0O01vdmUgZXh0ZW50cyYjMzQ7LAomIzQzOwlbRVhUNF9GQ19SRUFTT05fRElSREFUQV0gPSAmIzM0O0RpcmRhdGEgTFVGSUQgKG5vdCByZWNvcmRlZCBieSBmYXN0LWNvbW1pdCkmIzM0OywKIH07CiAKIGludCBleHQ0X2ZjX2luZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuaCBiL2ZzL2V4dDQvZmFzdF9jb21taXQuaAppbmRleCAyZjc3YTM3ZmIxMDE4MC4uODk5ZmFlYjRlNmUwNjQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuaAomIzQzOyYjNDM7JiM0MzsgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmgKQEAgLTEwMCw2ICYjNDM7MTAwLDcgQEAgZW51bSB7CiAJRVhUNF9GQ19SRUFTT05fTUlHUkFURSwKIAlFWFQ0X0ZDX1JFQVNPTl9WRVJJVFksCiAJRVhUNF9GQ19SRUFTT05fTU9WRV9FWFQsCiYjNDM7CUVYVDRfRkNfUkVBU09OX0RJUkRBVEEsCiAJRVhUNF9GQ19SRUFTT05fTUFYCiB9OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lubGluZS5jIGIvZnMvZXh0NC9pbmxpbmUuYwppbmRleCA4MDQ1ZTRmZjI3MGM3Zi4uMWJiZjg5ZTE4MDc2ZjQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5saW5lLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pbmxpbmUuYwpAQCAtOTczLDExICYjNDM7OTczLDIwIEBAIHN0YXRpYyBpbnQgZXh0NF9hZGRfZGlyZW50X3RvX2lubGluZShoYW5kbGVfdCAqaGFuZGxlLAogCQkJCSAgICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYywKIAkJCQkgICAgIHZvaWQgKmlubGluZV9zdGFydCwgaW50IGlubGluZV9zaXplKQogewotCWludAkJZXJyOwomIzQzOwlpbnQJCWVyciwgZGxlbiA9IDA7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkZmlkID0gTlVMTDsKJiM0MzsKJiM0MzsJLyogZm5hbWUtJmd0O2RmaWQgd2FzIHNldCBpbiBleHQ0X2FkZF9lbnRyeSgpICovCiYjNDM7CWRmaWQgPSBmbmFtZS0mZ3Q7ZGZpZDsKJiM0MzsJaWYgKGRmaWQpCiYjNDM7CQlkbGVuID0gZGZpZC0mZ3Q7ZGZfaGVhZGVyLmRkaF9sZW5ndGg7CiYjNDM7CWlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikgJmFtcDsmYW1wOwomIzQzOwkgICAgZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci0mZ3Q7aV9zYikpCiYjNDM7CQlkbGVuICYjNDM7PSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyZW50X2hhc2gpOwogCiAJZXJyID0gZXh0NF9maW5kX2Rlc3RfZGUoZGlyLCBpbG9jLSZndDtiaCwgaW5saW5lX3N0YXJ0LAotCQkJCWlubGluZV9zaXplLCBmbmFtZSwgJmFtcDtkZSk7CiYjNDM7CQkJCWlubGluZV9zaXplLCBmbmFtZSwgJmFtcDtkZSwgZGxlbik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtOTg2LDcgJiM0Mzs5OTUsNyBAQCBzdGF0aWMgaW50IGV4dDRfYWRkX2RpcmVudF90b19pbmxpbmUoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJICAgIEVYVDRfSlRSX05PTkUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JZXh0NF9pbnNlcnRfZGVudHJ5KGRpciwgaW5vZGUsIGRlLCBpbmxpbmVfc2l6ZSwgZm5hbWUpOwomIzQzOwlleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgaW5saW5lX3NpemUsIGZuYW1lLCBkZmlkKTsKIAogCWV4dDRfc2hvd19pbmxpbmVfZGlyKGRpciwgaWxvYy0mZ3Q7YmgsIGlubGluZV9zdGFydCwgaW5saW5lX3NpemUpOwogCkBAIC0xMDU1LDcgJiM0MzsxMDY0LDcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCWludCBvbGRfc2l6ZSA9IEVYVDRfSShkaXIpLSZndDtpX2lubGluZV9zaXplIC0gRVhUNF9NSU5fSU5MSU5FX0RBVEFfU0laRTsKIAlpbnQgbmV3X3NpemUgPSBnZXRfbWF4X2lubGluZV94YXR0cl92YWx1ZV9zaXplKGRpciwgaWxvYyk7CiAKLQlpZiAobmV3X3NpemUgLSBvbGRfc2l6ZSAmbHQ7PSBleHQ0X2Rpcl9yZWNfbGVuKDEsIE5VTEwpKQomIzQzOwlpZiAobmV3X3NpemUgLSBvbGRfc2l6ZSAmbHQ7PSBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIE5VTEwpKQogCQlyZXR1cm4gLUVOT1NQQzsKIAogCXJldCA9IGV4dDRfdXBkYXRlX2lubGluZV9kYXRhKGhhbmRsZSwgZGlyLApAQCAtMTI2NCw2ICYjNDM7MTI3Myw3IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwKIAlpbnQgZXJyID0gMCwgY291bnQgPSAwOwogCXVuc2lnbmVkIGludCBwYXJlbnRfaW5vOwogCWludCBwb3M7CiYjNDM7CXVuc2lnbmVkIGludCBkZV9sZW47CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGRpcl9maWxlKTsKIAlpbnQgcmV0LCBpbmxpbmVfc2l6ZSA9IDA7CkBAIC0xMzA5LDcgJiM0MzsxMzE5LDcgQEAgaW50IGV4dDRfaW5saW5lZGlyX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLAogCQkJZmFrZS5uYW1lX2xlbiA9IDE7CiAJCQltZW1jcHkoZmFrZS5uYW1lLCAmIzM0Oy4mIzM0OywgMik7CiAJCQlmYWtlLnJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzaygKLQkJCQkJICBleHQ0X2Rpcl9yZWNfbGVuKGZha2UubmFtZV9sZW4sIE5VTEwpLAomIzQzOwkJCQkJICBleHQ0X2RpcmVudF9yZWNfbGVuKGZha2UubmFtZV9sZW4sIE5VTEwpLAogCQkJCQkgIGlubGluZV9zaXplKTsKIAkJCWV4dDRfc2V0X2RlX3R5cGUoaW5vZGUtJmd0O2lfc2IsICZhbXA7ZmFrZSwgU19JRkRJUik7CiAJCQlkZSA9ICZhbXA7ZmFrZTsKQEAgLTEzMTksMjYgJiM0MzsxMzI5LDM0IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwKIAkJCWZha2UubmFtZV9sZW4gPSAyOwogCQkJbWVtY3B5KGZha2UubmFtZSwgJiMzNDsuLiYjMzQ7LCAzKTsKIAkJCWZha2UucmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKAotCQkJCQkgIGV4dDRfZGlyX3JlY19sZW4oZmFrZS5uYW1lX2xlbiwgTlVMTCksCiYjNDM7CQkJCQkgIGV4dDRfZGlyZW50X3JlY19sZW4oZmFrZS5uYW1lX2xlbiwgTlVMTCksCiAJCQkJCSAgaW5saW5lX3NpemUpOwogCQkJZXh0NF9zZXRfZGVfdHlwZShpbm9kZS0mZ3Q7aV9zYiwgJmFtcDtmYWtlLCBTX0lGRElSKTsKIAkJCWRlID0gJmFtcDtmYWtlOwogCQkJcG9zID0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkU7CiAJCX0gZWxzZSB7CiYjNDM7CQkJaWYgKHBvcyAmIzQzOyBFWFQ0X0JBU0VfRElSX0xFTiAmZ3Q7IGlubGluZV9zaXplKSB7CiYjNDM7CQkJCXJldCA9IGNvdW50OwomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQl9CiAJCQlkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKShkaXJfYnVmICYjNDM7IHBvcyk7Ci0JCQlwb3MgJiM0Mzs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtJmd0O3JlY19sZW4sIGlubGluZV9zaXplKTsKJiM0MzsJCQlkZV9sZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLSZndDtyZWNfbGVuLCBpbmxpbmVfc2l6ZSk7CiYjNDM7CQkJaWYgKGRlX2xlbiAmbHQ7IEVYVDRfQkFTRV9ESVJfTEVOIHx8CiYjNDM7CQkJICAgIHBvcyAmIzQzOyBkZV9sZW4gJmd0OyAodW5zaWduZWQgaW50KWlubGluZV9zaXplKSB7CiYjNDM7CQkJCXJldCA9IGNvdW50OwomIzQzOwkJCQlnb3RvIG91dDsKJiM0MzsJCQl9CiAJCQlpZiAoZXh0NF9jaGVja19kaXJfZW50cnkoaW5vZGUsIGRpcl9maWxlLCBkZSwKIAkJCQkJIGlsb2MuYmgsIGRpcl9idWYsCiAJCQkJCSBpbmxpbmVfc2l6ZSwgcG9zKSkgewogCQkJCXJldCA9IGNvdW50OwogCQkJCWdvdG8gb3V0OwogCQkJfQomIzQzOwkJCXBvcyAmIzQzOz0gZGVfbGVuOwogCQl9CiAKLQkJaWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkgewotCQkJaGluZm8tJmd0O2hhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTsKLQkJCWhpbmZvLSZndDttaW5vcl9oYXNoID0gRVhUNF9ESVJFTlRfTUlOT1JfSEFTSChkZSk7Ci0JCX0gZWxzZSB7CiYjNDM7CQlpZiAoIShleHQ0X2RpcmRhdGFfZ2V0KGRlLCBkaXIsIGlubGluZV9zaXplLCBOVUxMLCBoaW5mbykgJmFtcDsKJiM0MzsJCQkJCQkJRVhUNF9ESVJFTlRfQ0ZIQVNIKSkgewogCQkJZXJyID0gZXh0NGZzX2Rpcmhhc2goZGlyLCBkZS0mZ3Q7bmFtZSwgZGUtJmd0O25hbWVfbGVuLCBoaW5mbyk7CiAJCQlpZiAoZXJyKSB7CiAJCQkJcmV0ID0gZXJyOwpAQCAtMTM1NCw3ICYjNDM7MTM3Miw4IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwKIAkJdG1wX3N0ci5uYW1lID0gZGUtJmd0O25hbWU7CiAJCXRtcF9zdHIubGVuID0gZGUtJmd0O25hbWVfbGVuOwogCQllcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwgaGluZm8tJmd0O2hhc2gsCi0JCQkJCSAgICAgIGhpbmZvLSZndDttaW5vcl9oYXNoLCBkZSwgJmFtcDt0bXBfc3RyKTsKJiM0MzsJCQkJCSAgICAgIGhpbmZvLSZndDttaW5vcl9oYXNoLCBpbmxpbmVfc2l6ZSwKJiM0MzsJCQkJCSAgICAgIGRlLCAmYW1wO3RtcF9zdHIpOwogCQlpZiAoZXJyKSB7CiAJCQlyZXQgPSBlcnI7CiAJCQlnb3RvIG91dDsKQEAgLTE0MjcsOCAmIzQzOzE0NDYsOCBAQCBpbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsCiAJICogU28gd2Ugd2lsbCB1c2UgZXh0cmFfb2Zmc2V0IGFuZCBleHRyYV9zaXplIHRvIGluZGljYXRlIHRoZW0KIAkgKiBkdXJpbmcgdGhlIGlubGluZSBkaXIgaXRlcmF0aW9uLgogCSAqLwotCWRvdGRvdF9vZmZzZXQgPSBleHQ0X2Rpcl9yZWNfbGVuKDEsIE5VTEwpOwotCWRvdGRvdF9zaXplID0gZG90ZG90X29mZnNldCAmIzQzOyBleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpOwomIzQzOwlkb3Rkb3Rfb2Zmc2V0ID0gZXh0NF9kaXJlbnRfcmVjX2xlbigxLCBOVUxMKTsKJiM0MzsJZG90ZG90X3NpemUgPSBkb3Rkb3Rfb2Zmc2V0ICYjNDM7IGV4dDRfZGlyZW50X3JlY19sZW4oMiwgTlVMTCk7CiAJZXh0cmFfb2Zmc2V0ID0gZG90ZG90X3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRTsKIAlleHRyYV9zaXplID0gZXh0cmFfb2Zmc2V0ICYjNDM7IGlubGluZV9zaXplOwogCkBAIC0xNDYzLDcgJiM0MzsxNDgyLDcgQEAgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJICogZmFpbHVyZSB3aWxsIGJlIGRldGVjdGVkIGluIHRoZQogCQkJICogZGlyZW50IHRlc3QgYmVsb3cuICovCiAJCQlpZiAoZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0mZ3Q7cmVjX2xlbiwgZXh0cmFfc2l6ZSkKLQkJCQkmbHQ7IGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkpCiYjNDM7CQkJCSZsdDsgZXh0NF9kaXJlbnRfcmVjX2xlbigxLCBOVUxMKSkKIAkJCQlicmVhazsKIAkJCWkgJiM0Mzs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtJmd0O3JlY19sZW4sCiAJCQkJCQkgICAgZXh0cmFfc2l6ZSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lvY3RsLmMgYi9mcy9leHQ0L2lvY3RsLmMKaW5kZXggYzgzODdlNmEyYzZlOTAuLmI1NDIxZDU5ZjdhMDMyIDEwMDY0NAotLS0gYS9mcy9leHQ0L2lvY3RsLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9pb2N0bC5jCkBAIC0xNTM1LDYgJiM0MzsxNTM1LDg3IEBAIHN0YXRpYyBpbnQgZXh0NF9pb2N0bF9zZXRfdHVuZV9zYihzdHJ1Y3QgZmlsZSAqZmlscCwKIAlyZXR1cm4gcmV0OwogfQogCiYjNDM7LyoKJiM0MzsgKiBleHQ0X2lvY3RsX3NldF9sdWZpZCgpIC0gU2V0IExVRklEIG9uIGEgZGlyZWN0b3J5IGVudHJ5CiYjNDM7ICogQGZpbHA6CWZpbGUgcG9pbnRlciAocGFyZW50IGRpcmVjdG9yeSkKJiM0MzsgKiBAYXJnOglwb2ludGVyIHRvIGV4dDRfc2V0X2x1ZmlkIHN0cnVjdHVyZSB3aXRoIGZpbGVuYW1lIGFuZCBMVUZJRCBkYXRhCiYjNDM7ICoKJiM0MzsgKiBUaGlzIGlvY3RsIGFsbG93cyBzZXR0aW5nIExVRklEIGRhdGEgb24gYW4gZXhpc3RpbmcKJiM0MzsgKiBkaXJlY3RvcnkgZW50cnkuIEl0IGlzIGNhbGxlZCBvbiB0aGUgcGFyZW50IGRpcmVjdG9yeSB3aXRoIGEgZmlsZW5hbWUgYW5kCiYjNDM7ICogTFVGSUQgZGF0YS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgbG9uZyBleHQ0X2lvY3RsX3NldF9sdWZpZChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGZpbGVfaW5vZGUoZmlscCk7CiYjNDM7CXN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwID0gZmlsZV9tbnRfaWRtYXAoZmlscCk7CiYjNDM7CXN0cnVjdCBleHQ0X3NldF9sdWZpZCBsdWZpZF9hcmdzOwomIzQzOwlzdHJ1Y3QgewomIzQzOwkJX191MzIgZWRwX21hZ2ljOwomIzQzOwkJc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyIGRmX2hlYWRlcjsKJiM0MzsJCWNoYXIgZGZfZmlkWzI1NV07CiYjNDM7CX0gZWRwOwomIzQzOwlpbnQgZXJyOwomIzQzOwomIzQzOwkvKiBDaGVjayBpZiBwYXJlbnQgaXMgYSBkaXJlY3RvcnkgKi8KJiM0MzsJaWYgKCFTX0lTRElSKGRpci0mZ3Q7aV9tb2RlKSkKJiM0MzsJCXJldHVybiAtRU5PVERJUjsKJiM0MzsKJiM0MzsJLyogVGhpcyBpb2N0bCBtdXRhdGVzIGRpcmVjdG9yeSBlbnRyaWVzOyBtZXJlbHkgaGF2aW5nIHRoZSBkaXJlY3RvcnkKJiM0MzsJICogb3BlbiAod2hpY2ggb25seSBldmVyIHJlcXVpcmVzIHJlYWQgYWNjZXNzKSBpcyBub3QgZW5vdWdoICovCiYjNDM7CWVyciA9IGlub2RlX3Blcm1pc3Npb24oaWRtYXAsIGRpciwgTUFZX1dSSVRFKTsKJiM0MzsJaWYgKGVycikKJiM0MzsJCXJldHVybiBlcnI7CiYjNDM7CiYjNDM7CS8qIENvcHkgYXJndW1lbnRzIGZyb20gdXNlciBzcGFjZSAqLwomIzQzOwlpZiAoY29weV9mcm9tX3VzZXIoJmFtcDtsdWZpZF9hcmdzLCAoc3RydWN0IGV4dDRfc2V0X2x1ZmlkIF9fdXNlciAqKWFyZywKJiM0MzsJCQkgICBzaXplb2YobHVmaWRfYXJncykpKQomIzQzOwkJcmV0dXJuIC1FRkFVTFQ7CiYjNDM7CiYjNDM7CS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMuICBlc2xfbmFtZV9sZW4gaXMgTlVMLWV4Y2x1ZGVkIGxlbmd0aCAoMS0yNTUpLiAqLwomIzQzOwlpZiAobHVmaWRfYXJncy5lc2xfbmFtZV9sZW4gPT0gMCB8fCBsdWZpZF9hcmdzLmVzbF9uYW1lX2xlbiAmZ3Q7IEVYVDRfTkFNRV9MRU4pCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJLyogZGRoX2xlbmd0aCAoZXNsX2RhdGFfbGVuICYjNDM7IHRoZSBoZWFkZXIgYnl0ZSBiZWxvdykgbXVzdCBpdHNlbGYgZml0CiYjNDM7CSAqIGluIHRoZSBfX3U4IGRkaF9sZW5ndGggZmllbGQgd2l0aG91dCB3cmFwcGluZyAqLwomIzQzOwlpZiAobHVmaWRfYXJncy5lc2xfZGF0YV9sZW4gPT0gMCB8fAomIzQzOwkgICAgbHVmaWRfYXJncy5lc2xfZGF0YV9sZW4gJmd0OyAyNTUgLSBzaXplb2YoZWRwLmRmX2hlYWRlcikpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJLyogRW5zdXJlIGZpbGVuYW1lIGlzIE5VTC10ZXJtaW5hdGVkIGF0IGV4YWN0bHkgZXNsX25hbWVfbGVuICovCiYjNDM7CWlmIChsdWZpZF9hcmdzLmVzbF9uYW1lW2x1ZmlkX2FyZ3MuZXNsX25hbWVfbGVuXSAhPSAmIzM5O1wwJiMzOTspCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJLyogJiMzOTsuJiMzOTsgYW5kICYjMzk7Li4mIzM5OyBhcmUgbm90IG9yZGluYXJ5IGVudHJpZXMgLS0gdGhleSBtdXN0IHN0YXkgdGhlIGZpcnN0CiYjNDM7CSAqIHR3byBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkmIzM5O3MgZmlyc3QgYmxvY2ssIHNvIHRoZXkgY2FuJiMzOTt0IGdvCiYjNDM7CSAqIHRocm91Z2ggdGhlIGdlbmVyYWwgZGVsZXRlJiM0MztyZS1hZGQgcGF0aCB0aGlzIGlvY3RsIHVzZXMgKi8KJiM0MzsJaWYgKCFzdHJjbXAobHVmaWRfYXJncy5lc2xfbmFtZSwgJiMzNDsuJiMzNDspIHx8ICFzdHJjbXAobHVmaWRfYXJncy5lc2xfbmFtZSwgJiMzNDsuLiYjMzQ7KSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwkvKiBQcmVwYXJlIHRoZSBkZW50cnkgcGFyYW0gc3RydWN0IHdpdGggTFVGSUQgZGF0YS4gZGRoX2xlbmd0aCBpcwomIzQzOwkgKiBkb2N1bWVudGVkIChzZWUgc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyKSBhcyB0aGUgbGVuZ3RoIG9mCiYjNDM7CSAqIHRoZSBoZWFkZXIgcGx1cyB0aGUgd2hvbGUgZGF0YSBibG9iIC0tIGluY2x1ZGUgdGhlIGhlYWRlciBoZXJlIHNvCiYjNDM7CSAqIGV2ZXJ5IGRpcmRhdGEgcmVhZGVyL3dyaXRlciB0aGF0IHRha2VzIGRkaF9sZW5ndGggYXQgZmFjZSB2YWx1ZQomIzQzOwkgKiAoZS5nLiBleHQ0X2RpcmRhdGFfc2V0KCkmIzM5O3MgbWVtY3B5KSBjb3BpZXMgdGhlIGZ1bGwgTFVGSUQgcGF5bG9hZAomIzQzOwkgKiBpbnN0ZWFkIG9mIHNpbGVudGx5IGRyb3BwaW5nIGl0cyBsYXN0IGJ5dGUuICovCiYjNDM7CWVkcC5lZHBfbWFnaWMgPSBFWFQ0X0xVRklEX01BR0lDOwomIzQzOwllZHAuZGZfaGVhZGVyLmRkaF9sZW5ndGggPSBsdWZpZF9hcmdzLmVzbF9kYXRhX2xlbiAmIzQzOwomIzQzOwkJCQkgICAgc2l6ZW9mKGVkcC5kZl9oZWFkZXIpOwomIzQzOwltZW1jcHkoZWRwLmRmX2ZpZCwgbHVmaWRfYXJncy5lc2xfZGF0YSwgbHVmaWRfYXJncy5lc2xfZGF0YV9sZW4pOwomIzQzOwomIzQzOwkvKiBXYW50IHdyaXRlIGFjY2VzcyAqLwomIzQzOwllcnIgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbHApOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJLyogQ2FsbCB0aGUgaGVscGVyIGZ1bmN0aW9uIHRvIGRvIHRoZSBhY3R1YWwgd29yayAqLwomIzQzOwllcnIgPSBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkKGRpciwgbHVmaWRfYXJncy5lc2xfbmFtZSwKJiM0MzsJCQkJICAgIGx1ZmlkX2FyZ3MuZXNsX25hbWVfbGVuLAomIzQzOwkJCQkgICAgKHN0cnVjdCBleHQ0X2RlbnRyeV9wYXJhbSAqKSZhbXA7ZWRwKTsKJiM0MzsKJiM0MzsJbW50X2Ryb3Bfd3JpdGVfZmlsZShmaWxwKTsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgbG9uZyBfX2V4dDRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbHApOwpAQCAtMTkyMSw2ICYjNDM7MjAwMiw4IEBAIHN0YXRpYyBsb25nIF9fZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAJCQkJCSAgICAgICh2b2lkIF9fdXNlciAqKWFyZyk7CiAJY2FzZSBFWFQ0X0lPQ19TRVRfVFVORV9TQl9QQVJBTToKIAkJcmV0dXJuIGV4dDRfaW9jdGxfc2V0X3R1bmVfc2IoZmlscCwgKHZvaWQgX191c2VyICopYXJnKTsKJiM0MzsJY2FzZSBFWFQ0X0lPQ19TRVRfTFVGSUQ6CiYjNDM7CQlyZXR1cm4gZXh0NF9pb2N0bF9zZXRfbHVmaWQoZmlscCwgYXJnKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1RUWTsKIAl9CkBAIC0yMDAwLDYgJiM0MzsyMDgzLDcgQEAgbG9uZyBleHQ0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAJY2FzZSBGU19JT0NfU0VURlNMQUJFTDoKIAljYXNlIEVYVDRfSU9DX0dFVEZTVVVJRDoKIAljYXNlIEVYVDRfSU9DX1NFVEZTVVVJRDoKJiM0MzsJY2FzZSBFWFQ0X0lPQ19TRVRfTFVGSUQ6CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggY2M0OWFlMDRhNmY2NDkuLmJhMzllY2M2OTBiYzJkIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZXh0NC9uYW1laS5jCkBAIC0xMDIsNyAmIzQzOzEwMiw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfYXBwZW5kKGhhbmRsZV90ICpoYW5kbGUsCiB9CiAKIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50KTsKJiM0MzsJCQkgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCk7CiAKIC8qCiAgKiBIaW50cyB0byBleHQ0X3JlYWRfZGlyYmxvY2sgcmVnYXJkaW5nIHdoZXRoZXIgd2UgZXhwZWN0IGEgZGlyZWN0b3J5CkBAIC0xMjgsNyAmIzQzOzEyOCw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fZXh0NF9yZWFkX2RpcmJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJCQl1bnNpZ25lZCBpbnQgbGluZSkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50OwomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlyZW50OwogCWludCBpc19keF9ibG9jayA9IDA7CiAKIAlpZiAoYmxvY2sgJmd0Oz0gaW5vZGUtJmd0O2lfc2l6ZSAmZ3Q7Jmd0OyBpbm9kZS0mZ3Q7aV9ibGtiaXRzKSB7CkBAIC0xNjAsNyAmIzQzOzE2MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fZXh0NF9yZWFkX2RpcmJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJfQogCWlmICghYmgpCiAJCXJldHVybiBOVUxMOwotCWRpcmVudCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikgYmgtJmd0O2JfZGF0YTsKJiM0MzsJZGlyZW50ID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIGJoLSZndDtiX2RhdGE7CiAJLyogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYW4gaW5kZXggYmxvY2sgKi8KIAlpZiAoaXNfZHgoaW5vZGUpKSB7CiAJCWlmIChibG9jayA9PSAwKQpAQCAtMjQ0LDIyICYjNDM7MjQ0LDEzIEBAIHN0cnVjdCBkeF9lbnRyeQogICogaGFzaCB2ZXJzaW9uIG1vZCA0IHNob3VsZCBuZXZlciBiZSAwLiAgU2luY2VyZWx5LCB0aGUgcGFyYW5vaWEgZGVwYXJ0bWVudC4KICAqLwogCi1zdHJ1Y3QgZHhfcm9vdAomIzQzO3N0cnVjdCBkeF9yb290X2luZm8KIHsKLQlzdHJ1Y3QgZmFrZV9kaXJlbnQgZG90OwotCWNoYXIgZG90X25hbWVbNF07Ci0Jc3RydWN0IGZha2VfZGlyZW50IGRvdGRvdDsKLQljaGFyIGRvdGRvdF9uYW1lWzRdOwotCXN0cnVjdCBkeF9yb290X2luZm8KLQl7Ci0JCV9fbGUzMiByZXNlcnZlZF96ZXJvOwotCQl1OCBoYXNoX3ZlcnNpb247Ci0JCXU4IGluZm9fbGVuZ3RoOyAvKiA4ICovCi0JCXU4IGluZGlyZWN0X2xldmVsczsKLQkJdTggdW51c2VkX2ZsYWdzOwotCX0KLQlpbmZvOwotCXN0cnVjdCBkeF9lbnRyeQllbnRyaWVzW107CiYjNDM7CV9fbGUzMiByZXNlcnZlZF96ZXJvOwomIzQzOwl1OCBoYXNoX3ZlcnNpb247CiYjNDM7CXU4IGluZm9fbGVuZ3RoOyAvKiA4ICovCiYjNDM7CXU4IGluZGlyZWN0X2xldmVsczsKJiM0MzsJdTggdW51c2VkX2ZsYWdzOwogfTsKIAogc3RydWN0IGR4X25vZGUKQEAgLTMxNCwxNyAmIzQzOzMwNSwxNiBAQCBzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKmdldF9kaXJlbnRfdGFpbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCAqdDsKLQlpbnQgYmxvY2tzaXplID0gRVhUNF9CTE9DS19TSVpFKGlub2RlLSZndDtpX3NiKTsKIAogI2lmZGVmIFBBUkFOT0lECi0Jc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkLCAqdG9wOwomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZCwgKnRvcDsKIAotCWQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopYmgtJmd0O2JfZGF0YTsKLQl0b3AgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopKGJoLSZndDtiX2RhdGEgJiM0MzsKLQkJKGJsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCkpKTsKLQl3aGlsZSAoZCAmbHQ7IHRvcCAmYW1wOyZhbXA7IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZC0mZ3Q7cmVjX2xlbiwgYmxvY2tzaXplKSkKLQkJZCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikoKCh2b2lkICopZCkgJiM0MzsKLQkJICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZC0mZ3Q7cmVjX2xlbiwgYmxvY2tzaXplKSk7CiYjNDM7CWQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiliaC0mZ3Q7Yl9kYXRhOwomIzQzOwl0b3AgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoYmgtJmd0O2JfZGF0YSAmIzQzOwomIzQzOwkJKEVYVDRfQkxPQ0tfU0laRShpbm9kZS0mZ3Q7aV9zYikgLSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpKSk7CiYjNDM7CXdoaWxlIChkICZsdDsgdG9wICZhbXA7JmFtcDsgZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkLSZndDtyZWNfbGVuLCBFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtJmd0O2lfc2IpKSkKJiM0MzsJCWQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoKCh2b2lkICopZCkgJiM0MzsKJiM0MzsJCSAgICBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGQtJmd0O3JlY19sZW4sIEVYVDRfQkxPQ0tfU0laRShpbm9kZS0mZ3Q7aV9zYikpKTsKIAogCWlmIChkICE9IHRvcCkKIAkJcmV0dXJuIE5VTEw7CkBAIC0zMzQsMTEgJiM0MzszMjQsNyBAQCBzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKmdldF9kaXJlbnRfdGFpbChzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCXQgPSBFWFQ0X0RJUkVOVF9UQUlMKGJoLSZndDtiX2RhdGEsIEVYVDRfQkxPQ0tfU0laRShpbm9kZS0mZ3Q7aV9zYikpOwogI2VuZGlmCiAKLQlpZiAodC0mZ3Q7ZGV0X3Jlc2VydmVkX3plcm8xIHx8Ci0JICAgIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKHQtJmd0O2RldF9yZWNfbGVuLCBibG9ja3NpemUpICE9Ci0JICAgICBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpKSB8fAotCSAgICB0LSZndDtkZXRfcmVzZXJ2ZWRfemVybzIgfHwKLQkgICAgdC0mZ3Q7ZGV0X3Jlc2VydmVkX2Z0ICE9IEVYVDRfRlRfRElSX0NTVU0pCiYjNDM7CWlmICghZXh0NF9kaXJfZW50cnlfaXNfdGFpbCgoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKil0KSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gdDsKQEAgLTQxMCwzNSAmIzQzOzM5Niw0MyBAQCBpbnQgZXh0NF9oYW5kbGVfZGlydHlfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwKIH0KIAogc3RhdGljIHN0cnVjdCBkeF9jb3VudGxpbWl0ICpnZXRfZHhfY291bnRsaW1pdChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCQkgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQsCiYjNDM7CQkJCQkgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCwKIAkJCQkJICAgICAgIGludCAqb2Zmc2V0KQogewotCXN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZHA7CiYjNDM7CXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTsKIAlzdHJ1Y3QgZHhfcm9vdF9pbmZvICpyb290OwotCWludCBjb3VudF9vZmZzZXQ7CiYjNDM7CWludCBjb3VudF9vZmZzZXQsIGRvdGRvdF9yZWNfbGVuOwogCWludCBibG9ja3NpemUgPSBFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtJmd0O2lfc2IpOwogCXVuc2lnbmVkIGludCBybGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkaXJlbnQtJmd0O3JlY19sZW4sIGJsb2Nrc2l6ZSk7CiAKLQlpZiAocmxlbiA9PSBibG9ja3NpemUpCi0JCWNvdW50X29mZnNldCA9IDg7Ci0JZWxzZSBpZiAocmxlbiA9PSAxMikgewotCQlkcCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikoKCh2b2lkICopZGlyZW50KSAmIzQzOyAxMik7Ci0JCWlmIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRwLSZndDtyZWNfbGVuLCBibG9ja3NpemUpICE9IGJsb2Nrc2l6ZSAtIDEyKQomIzQzOwlpZiAocmxlbiA9PSBibG9ja3NpemUpIHsKJiM0MzsJCWNvdW50X29mZnNldCA9IHNpemVvZihzdHJ1Y3QgZHhfbm9kZSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAocmxlbiAmbHQ7IEVYVDRfQkFTRV9ESVJfTEVOIHx8CiYjNDM7CQkgICAgcmxlbiAmIzQzOyBFWFQ0X0JBU0VfRElSX0xFTiAmZ3Q7IGJsb2Nrc2l6ZSkKJiM0MzsJCQlyZXR1cm4gTlVMTDsKJiM0MzsJCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKCgoY2hhciAqKWRpcmVudCkgJiM0Mzsgcmxlbik7CiYjNDM7CQlpZiAobGUxNl90b19jcHUoZGUtJmd0O3JlY19sZW4pICE9IChibG9ja3NpemUgLSBybGVuKSkKIAkJCXJldHVybiBOVUxMOwotCQlyb290ID0gKHN0cnVjdCBkeF9yb290X2luZm8gKikoKCh2b2lkICopZHAgJiM0MzsgMTIpKTsKJiM0MzsJCS8qIGRlLSZndDtyZWNfbGVuIGNvdmVycyB3aG9sZSBkeF9yb290IGJsb2NrLCBjYWxjdWxhdGUgYWN0dWFsIGxlbmd0aC4KJiM0MzsJCSAqIFRoaXMgaXMgdGhlICYjMzk7Li4mIzM5OyBlbnRyeSwgd2hpY2ggbmV2ZXIgY2FycmllcyB0aGUgY2FzZWZvbGQmIzQzO2ZzY3J5cHQKJiM0MzsJCSAqIGhhc2gsIHNvIHBhc3MgTlVMTCBmb3IgZGlyIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpcmVjdG9yeSYjMzk7cyBmbGFncyAqLwomIzQzOwkJZG90ZG90X3JlY19sZW4gPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIGJsb2Nrc2l6ZSwgTlVMTCk7CiYjNDM7CQlpZiAocmxlbiAmIzQzOyBkb3Rkb3RfcmVjX2xlbiAmIzQzOyBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykgJmd0OyBibG9ja3NpemUpCiYjNDM7CQkJcmV0dXJuIE5VTEw7CiYjNDM7CQlyb290ID0gKHN0cnVjdCBkeF9yb290X2luZm8gKikoKChjaGFyICopZGUgJiM0MzsgZG90ZG90X3JlY19sZW4pKTsKIAkJaWYgKHJvb3QtJmd0O3Jlc2VydmVkX3plcm8gfHwKIAkJICAgIHJvb3QtJmd0O2luZm9fbGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgZHhfcm9vdF9pbmZvKSkKIAkJCXJldHVybiBOVUxMOwotCQljb3VudF9vZmZzZXQgPSAzMjsKLQl9IGVsc2UKLQkJcmV0dXJuIE5VTEw7CiYjNDM7CQljb3VudF9vZmZzZXQgPSByb290LSZndDtpbmZvX2xlbmd0aCAmIzQzOyBybGVuICYjNDM7IGRvdGRvdF9yZWNfbGVuOwomIzQzOwl9CiAKIAlpZiAob2Zmc2V0KQogCQkqb2Zmc2V0ID0gY291bnRfb2Zmc2V0OwogCXJldHVybiAoc3RydWN0IGR4X2NvdW50bGltaXQgKikoKCh2b2lkICopZGlyZW50KSAmIzQzOyBjb3VudF9vZmZzZXQpOwogfQogCi1zdGF0aWMgX19sZTMyIGV4dDRfZHhfY3N1bShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCwKJiM0MztzdGF0aWMgX19sZTMyIGV4dDRfZHhfY3N1bShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlyZW50LAogCQkJICAgaW50IGNvdW50X29mZnNldCwgaW50IGNvdW50LCBzdHJ1Y3QgZHhfdGFpbCAqdCkKIHsKIAlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CkBAIC00NTYsNyAmIzQzOzQ1MCw3IEBAIHN0YXRpYyBfX2xlMzIgZXh0NF9keF9jc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50LAogfQogCiBzdGF0aWMgaW50IGV4dDRfZHhfY3N1bV92ZXJpZnkoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCkKJiM0MzsJCQkgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCkKIHsKIAlzdHJ1Y3QgZHhfY291bnRsaW1pdCAqYzsKIAlzdHJ1Y3QgZHhfdGFpbCAqdDsKQEAgLTQ3Nyw2ICYjNDM7NDcxLDEwIEBAIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQl3YXJuX25vX3NwYWNlX2Zvcl9jc3VtKGlub2RlKTsKIAkJcmV0dXJuIDA7CiAJfQomIzQzOwlpZiAoY291bnQgJmd0OyBsaW1pdCkgewomIzQzOwkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgJiMzNDtkaXIgc2VlbXMgY29ycnVwdD8gIFJ1biBlMmZzY2sgLUQuJiMzNDspOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KIAl0ID0gKHN0cnVjdCBkeF90YWlsICopKCgoc3RydWN0IGR4X2VudHJ5ICopYykgJiM0MzsgbGltaXQpOwogCiAJaWYgKHQtJmd0O2R0X2NoZWNrc3VtICE9IGV4dDRfZHhfY3N1bShpbm9kZSwgZGlyZW50LCBjb3VudF9vZmZzZXQsCkBAIC00ODUsNyAmIzQzOzQ4Myw3IEBAIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBleHQ0X2R4X2NzdW1fc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50KQomIzQzO3N0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCkKIHsKIAlzdHJ1Y3QgZHhfY291bnRsaW1pdCAqYzsKIAlzdHJ1Y3QgZHhfdGFpbCAqdDsKQEAgLTUwNiw2ICYjNDM7NTA0LDEwIEBAIHN0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQpCiAJCXdhcm5fbm9fc3BhY2VfZm9yX2NzdW0oaW5vZGUpOwogCQlyZXR1cm47CiAJfQomIzQzOwlpZiAoY291bnQgJmd0OyBsaW1pdCkgewomIzQzOwkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgJiMzNDtkaXIgc2VlbXMgY29ycnVwdD8gIFJ1biBlMmZzY2sgLUQuJiMzNDspOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiAJdCA9IChzdHJ1Y3QgZHhfdGFpbCAqKSgoKHN0cnVjdCBkeF9lbnRyeSAqKWMpICYjNDM7IGxpbWl0KTsKIAogCXQtJmd0O2R0X2NoZWNrc3VtID0gZXh0NF9keF9jc3VtKGlub2RlLCBkaXJlbnQsIGNvdW50X29mZnNldCwgY291bnQsIHQpOwpAQCAtNTE1LDcgJiM0Mzs1MTcsNyBAQCBzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9kaXJ0eV9keF9ub2RlKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKLQlleHQ0X2R4X2NzdW1fc2V0KGlub2RlLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopYmgtJmd0O2JfZGF0YSk7CiYjNDM7CWV4dDRfZHhfY3N1bV9zZXQoaW5vZGUsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJoLSZndDtiX2RhdGEpOwogCXJldHVybiBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CiB9CiAKQEAgLTUzMyw2ICYjNDM7NTM1LDMwIEBAIGV4dDRfbmV4dF9lbnRyeShzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqcCwgdW5zaWduZWQgbG9uZyBibG9ja3NpemUpCiAgKiBGdXR1cmU6IHVzZSBoaWdoIGZvdXIgYml0cyBvZiBibG9jayBmb3IgY29hbGVzY2Utb24tZGVsZXRlIGZsYWdzCiAgKiBNYXNrIHRoZW0gb2ZmIGZvciBub3cuCiAgKi8KJiM0MztzdGF0aWMgc3RydWN0IGR4X3Jvb3RfaW5mbyAqZHhfZ2V0X2R4X2luZm8oc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmRlX2J1ZikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBibG9ja3NpemUgPSBkaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplOwomIzQzOwl2b2lkICpiYXNlID0gZGVfYnVmOwomIzQzOwomIzQzOwkvKiAmIzM5Oy4mIzM5OyBhbmQgJiMzOTsuLiYjMzk7IG5ldmVyIGNhcnJ5IHRoZSBjYXNlZm9sZCYjNDM7ZnNjcnlwdCBoYXNoLCBzbyBwYXNzIE5VTEwKJiM0MzsJICogZm9yIGRpciByZWdhcmRsZXNzIG9mIHRoZSBkaXJlY3RvcnkmIzM5O3MgZmxhZ3MgKi8KJiM0MzsJaWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWRlX2J1ZiktJmd0O3JlY19sZW4sCiYjNDM7CQkJCSAgIGJsb2Nrc2l6ZSkgJmx0OyBFWFQ0X0JBU0VfRElSX0xFTikKJiM0MzsJCXJldHVybiBFUlJfUFRSKC1FRlNDT1JSVVBURUQpOwomIzQzOwlkZV9idWYgJiM0Mzs9IGV4dDRfZGlyX2VudHJ5X2xlbihkZV9idWYsIGJsb2Nrc2l6ZSwgTlVMTCk7CiYjNDM7CiYjNDM7CS8qIGR4IHJvb3QgaW5mbyBpcyBhZnRlciBkb3Rkb3QgZW50cnkgKi8KJiM0MzsJaWYgKGRlX2J1ZiAmbHQ7IGJhc2UgfHwgKGNoYXIgKilkZV9idWYgLSAoY2hhciAqKWJhc2UgJiM0MzsKJiM0MzsJICAgIEVYVDRfQkFTRV9ESVJfTEVOICZndDsgYmxvY2tzaXplKQomIzQzOwkJcmV0dXJuIEVSUl9QVFIoLUVGU0NPUlJVUFRFRCk7CiYjNDM7CWRlX2J1ZiAmIzQzOz0gZXh0NF9kaXJfZW50cnlfbGVuKGRlX2J1ZiwgYmxvY2tzaXplLCBOVUxMKTsKJiM0MzsKJiM0MzsJaWYgKGRlX2J1ZiAmbHQ7IGJhc2UgfHwgKGNoYXIgKilkZV9idWYgLSAoY2hhciAqKWJhc2UgJiM0MzsKJiM0MzsJCQkgICAgICBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykgJmd0OyBibG9ja3NpemUpCiYjNDM7CQlyZXR1cm4gRVJSX1BUUigtRUZTQ09SUlVQVEVEKTsKJiM0MzsKJiM0MzsJcmV0dXJuIChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopZGVfYnVmOwomIzQzO30KIAogc3RhdGljIGlubGluZSBleHQ0X2xibGtfdCBkeF9nZXRfYmxvY2soc3RydWN0IGR4X2VudHJ5ICplbnRyeSkKIHsKQEAgLTU3NCwxMSAmIzQzOzYwMCwxNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZHhfc2V0X2xpbWl0KHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgdW5zaWduZWQgdmFsdWUpCiAJKChzdHJ1Y3QgZHhfY291bnRsaW1pdCAqKSBlbnRyaWVzKS0mZ3Q7bGltaXQgPSBjcHVfdG9fbGUxNih2YWx1ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfcm9vdF9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgaW5mb3NpemUpCiYjNDM7c3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9yb290X2xpbWl0KHN0cnVjdCBpbm9kZSAqZGlyLAomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG90X2RlKQogewotCXVuc2lnbmVkIGludCBlbnRyeV9zcGFjZSA9IGRpci0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemUgLQotCQkJZXh0NF9kaXJfcmVjX2xlbigxLCBOVUxMKSAtCi0JCQlleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpIC0gaW5mb3NpemU7CiYjNDM7CXN0cnVjdCBkeF9yb290X2luZm8gKmluZm87CiYjNDM7CXVuc2lnbmVkIGludCBlbnRyeV9zcGFjZTsKJiM0MzsKJiM0MzsJaW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgZG90X2RlKTsKJiM0MzsJaWYgKElTX0VSUihpbmZvKSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwllbnRyeV9zcGFjZSA9IGRpci0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemUgLSAoKGNoYXIgKilpbmZvIC0gKGNoYXIgKilkb3RfZGUpIC0KJiM0MzsJCWluZm8tJmd0O2luZm9fbGVuZ3RoOwogCiAJaWYgKGV4dDRfaGFzX2ZlYXR1cmVfbWV0YWRhdGFfY3N1bShkaXItJmd0O2lfc2IpKQogCQllbnRyeV9zcGFjZSAtPSBzaXplb2Yoc3RydWN0IGR4X3RhaWwpOwpAQCAtNTg3LDggJiM0Mzs2MTksMTAgQEAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9yb290X2xpbWl0KHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBpbmZvc2l6ZSkKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9ub2RlX2xpbWl0KHN0cnVjdCBpbm9kZSAqZGlyKQogewomIzQzOwkvKiBkeF9ub2RlIGZha2VfZGlyZW50IGlzIGFsd2F5cyA4IGJ5dGVzIOKAlCBpdCBuZXZlciBjYXJyaWVzIGEgY2FzZWZvbGQKJiM0MzsJICogaGFzaCwgc28gcGFzcyBOVUxMIHRvIHN1cHByZXNzIHRoZSBoYXNoLXNpemUgdGVybS4gKi8KIAl1bnNpZ25lZCBpbnQgZW50cnlfc3BhY2UgPSBkaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplIC0KLQkJCWV4dDRfZGlyX3JlY19sZW4oMCwgZGlyKTsKJiM0MzsJCQlleHQ0X2RpcmVudF9yZWNfbGVuKDAsIE5VTEwpOwogCiAJaWYgKGV4dDRfaGFzX2ZlYXR1cmVfbWV0YWRhdGFfY3N1bShkaXItJmd0O2lfc2IpKQogCQllbnRyeV9zcGFjZSAtPSBzaXplb2Yoc3RydWN0IGR4X3RhaWwpOwpAQCAtNjk4LDcgJiM0Mzs3MzIsOSBAQCBzdGF0aWMgc3RydWN0IHN0YXRzIGR4X3Nob3dfbGVhZihzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkgICAgICAgKHVuc2lnbmVkKSAoKGNoYXIgKikgZGUgLSBiYXNlKSk7CiAjZW5kaWYKIAkJCX0KLQkJCXNwYWNlICYjNDM7PSBleHQ0X2Rpcl9yZWNfbGVuKGRlLSZndDtuYW1lX2xlbiwgZGlyKTsKJiM0MzsJCQlpZiAoKGNoYXIgKilkZSAmIzQzOyBFWFQ0X0JBU0VfRElSX0xFTiAmZ3Q7IGJhc2UgJiM0Mzsgc2l6ZSkKJiM0MzsJCQkJYnJlYWs7CiYjNDM7CQkJc3BhY2UgJiM0Mzs9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgc2l6ZSwgZGlyKTsKIAkJCW5hbWVzJiM0MzsmIzQzOzsKIAkJfQogCQlkZSA9IGV4dDRfbmV4dF9lbnRyeShkZSwgc2l6ZSk7CkBAIC03ODAsNyAmIzQzOzgxNiw3IEBAIGR4X3Byb2JlKHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwgc3RydWN0IGlub2RlICpkaXIsCiB7CiAJdW5zaWduZWQgY291bnQsIGluZGlyZWN0LCBsZXZlbCwgaTsKIAlzdHJ1Y3QgZHhfZW50cnkgKmF0LCAqZW50cmllcywgKnAsICpxLCAqbTsKLQlzdHJ1Y3QgZHhfcm9vdCAqcm9vdDsKJiM0MzsJc3RydWN0IGR4X3Jvb3RfaW5mbyAqaW5mbzsKIAlzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lID0gZnJhbWVfaW47CiAJc3RydWN0IGR4X2ZyYW1lICpyZXRfZXJyID0gRVJSX1BUUihFUlJfQkFEX0RYX0RJUik7CiAJdTMyIGhhc2g7CkBAIC03OTIsMjMgJiM0Mzs4MjgsMzEgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAlpZiAoSVNfRVJSKGZyYW1lLSZndDtiaCkpCiAJCXJldHVybiAoc3RydWN0IGR4X2ZyYW1lICopIGZyYW1lLSZndDtiaDsKIAotCXJvb3QgPSAoc3RydWN0IGR4X3Jvb3QgKikgZnJhbWUtJmd0O2JoLSZndDtiX2RhdGE7Ci0JaWYgKHJvb3QtJmd0O2luZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfVEVBICZhbXA7JmFtcDsKLQkgICAgcm9vdC0mZ3Q7aW5mby5oYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9IQUxGX01ENCAmYW1wOyZhbXA7Ci0JICAgIHJvb3QtJmd0O2luZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfTEVHQUNZICZhbXA7JmFtcDsKLQkgICAgcm9vdC0mZ3Q7aW5mby5oYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9TSVBIQVNIKSB7Ci0JCWV4dDRfd2FybmluZ19pbm9kZShkaXIsICYjMzQ7VW5yZWNvZ25pc2VkIGlub2RlIGhhc2ggY29kZSAldSYjMzQ7LAotCQkJCSAgIHJvb3QtJmd0O2luZm8uaGFzaF92ZXJzaW9uKTsKJiM0MzsJaW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopZnJhbWUtJmd0O2JoLSZndDtiX2RhdGEpOwomIzQzOwlpZiAoSVNfRVJSKGluZm8pKQomIzQzOwkJZ290byBmYWlsOwomIzQzOwlpZiAoaW5mby0mZ3Q7aW5mb19sZW5ndGggIT0gc2l6ZW9mKHN0cnVjdCBkeF9yb290X2luZm8pKSB7CiYjNDM7CQlleHQ0X3dhcm5pbmdfaW5vZGUoZGlyLCAmIzM0O2NvcnJ1cHRlZCBodHJlZTogaW5mb19sZW5ndGggJXUmIzM0OywKJiM0MzsJCQkJICAgaW5mby0mZ3Q7aW5mb19sZW5ndGgpOwomIzQzOwkJZ290byBmYWlsOwomIzQzOwl9CiYjNDM7CWlmIChpbmZvLSZndDtoYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9URUEgJmFtcDsmYW1wOwomIzQzOwkgICAgaW5mby0mZ3Q7aGFzaF92ZXJzaW9uICE9IERYX0hBU0hfSEFMRl9NRDQgJmFtcDsmYW1wOwomIzQzOwkgICAgaW5mby0mZ3Q7aGFzaF92ZXJzaW9uICE9IERYX0hBU0hfTEVHQUNZICZhbXA7JmFtcDsKJiM0MzsJICAgIGluZm8tJmd0O2hhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHsKJiM0MzsJCWV4dDRfd2FybmluZyhkaXItJmd0O2lfc2IsCiYjNDM7CQkJJiMzNDtVbnJlY29nbmlzZWQgaW5vZGUgaGFzaCBjb2RlICVkIGZvciBkaXJlY3RvcnkgIyVsbHUmIzM0OywKJiM0MzsJCQlpbmZvLSZndDtoYXNoX3ZlcnNpb24sIGRpci0mZ3Q7aV9pbm8pOwogCQlnb3RvIGZhaWw7CiAJfQogCWlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpIHsKLQkJaWYgKHJvb3QtJmd0O2luZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfU0lQSEFTSCkgewomIzQzOwkJaWYgKGluZm8tJmd0O2hhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHsKIAkJCWV4dDRfd2FybmluZ19pbm9kZShkaXIsCiAJCQkJJiMzNDtIYXNoIGluIGRpcmVudCwgYnV0IGhhc2ggaXMgbm90IFNJUEhBU0gmIzM0Oyk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAocm9vdC0mZ3Q7aW5mby5oYXNoX3ZlcnNpb24gPT0gRFhfSEFTSF9TSVBIQVNIKSB7CiYjNDM7CQlpZiAoaW5mby0mZ3Q7aGFzaF92ZXJzaW9uID09IERYX0hBU0hfU0lQSEFTSCkgewogCQkJZXh0NF93YXJuaW5nX2lub2RlKGRpciwKIAkJCQkmIzM0O0hhc2ggY29kZSBpcyBTSVBIQVNILCBidXQgaGFzaCBub3QgaW4gZGlyZW50JiMzNDspOwogCQkJZ290byBmYWlsOwpAQCAtODE2LDcgJiM0Mzs4NjAsNyBAQCBkeF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLAogCX0KIAlpZiAoZm5hbWUpCiAJCWhpbmZvID0gJmFtcDtmbmFtZS0mZ3Q7aGluZm87Ci0JaGluZm8tJmd0O2hhc2hfdmVyc2lvbiA9IHJvb3QtJmd0O2luZm8uaGFzaF92ZXJzaW9uOwomIzQzOwloaW5mby0mZ3Q7aGFzaF92ZXJzaW9uID0gaW5mby0mZ3Q7aGFzaF92ZXJzaW9uOwogCWlmIChoaW5mby0mZ3Q7aGFzaF92ZXJzaW9uICZsdDs9IERYX0hBU0hfVEVBKQogCQloaW5mby0mZ3Q7aGFzaF92ZXJzaW9uICYjNDM7PSBFWFQ0X1NCKGRpci0mZ3Q7aV9zYiktJmd0O3NfaGFzaF91bnNpZ25lZDsKIAloaW5mby0mZ3Q7c2VlZCA9IEVYVDRfU0IoZGlyLSZndDtpX3NiKS0mZ3Q7c19oYXNoX3NlZWQ7CkBAIC04MzIsMTMgJiM0Mzs4NzYsMTMgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAl9CiAJaGFzaCA9IGhpbmZvLSZndDtoYXNoOwogCi0JaWYgKHJvb3QtJmd0O2luZm8udW51c2VkX2ZsYWdzICZhbXA7IDEpIHsKJiM0MzsJaWYgKGluZm8tJmd0O3VudXNlZF9mbGFncyAmYW1wOyAxKSB7CiAJCWV4dDRfd2FybmluZ19pbm9kZShkaXIsICYjMzQ7VW5pbXBsZW1lbnRlZCBoYXNoIGZsYWdzOiAlIzA2eCYjMzQ7LAotCQkJCSAgIHJvb3QtJmd0O2luZm8udW51c2VkX2ZsYWdzKTsKJiM0MzsJCQkJICAgaW5mby0mZ3Q7dW51c2VkX2ZsYWdzKTsKIAkJZ290byBmYWlsOwogCX0KIAotCWluZGlyZWN0ID0gcm9vdC0mZ3Q7aW5mby5pbmRpcmVjdF9sZXZlbHM7CiYjNDM7CWluZGlyZWN0ID0gaW5mby0mZ3Q7aW5kaXJlY3RfbGV2ZWxzOwogCWlmIChpbmRpcmVjdCAmZ3Q7PSBleHQ0X2Rpcl9odHJlZV9sZXZlbChkaXItJmd0O2lfc2IpKSB7CiAJCWV4dDRfd2FybmluZyhkaXItJmd0O2lfc2IsCiAJCQkgICAgICYjMzQ7RGlyZWN0b3J5IChpbm86ICVsbHUpIGh0cmVlIGRlcHRoICUjMDZ4IGV4Y2VlZCYjMzQ7CkBAIC04NTEsMTQgJiM0Mzs4OTUsMTUgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJZ290byBmYWlsOwogCX0KIAotCWVudHJpZXMgPSAoc3RydWN0IGR4X2VudHJ5ICopKCgoY2hhciAqKSZhbXA7cm9vdC0mZ3Q7aW5mbykgJiM0MzsKLQkJCQkgICAgICByb290LSZndDtpbmZvLmluZm9fbGVuZ3RoKTsKJiM0MzsJZW50cmllcyA9IChzdHJ1Y3QgZHhfZW50cnkgKikoKChjaGFyICopaW5mbykgJiM0MzsgaW5mby0mZ3Q7aW5mb19sZW5ndGgpOwogCi0JaWYgKGR4X2dldF9saW1pdChlbnRyaWVzKSAhPSBkeF9yb290X2xpbWl0KGRpciwKLQkJCQkJCSAgIHJvb3QtJmd0O2luZm8uaW5mb19sZW5ndGgpKSB7CiYjNDM7CWlmIChkeF9nZXRfbGltaXQoZW50cmllcykgIT0KJiM0MzsJICAgIGR4X3Jvb3RfbGltaXQoZGlyLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilmcmFtZS0mZ3Q7YmgtJmd0O2JfZGF0YSkpIHsKIAkJZXh0NF93YXJuaW5nX2lub2RlKGRpciwgJiMzNDtkeCBlbnRyeTogbGltaXQgJXUgIT0gcm9vdCBsaW1pdCAldSYjMzQ7LAogCQkJCSAgIGR4X2dldF9saW1pdChlbnRyaWVzKSwKLQkJCQkgICBkeF9yb290X2xpbWl0KGRpciwgcm9vdC0mZ3Q7aW5mby5pbmZvX2xlbmd0aCkpOwomIzQzOwkJCQkgICBkeF9yb290X2xpbWl0KGRpciwKJiM0MzsJCQkJICAgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopZnJhbWUtJmd0O2JoLSZndDtiX2RhdGEKJiM0MzsJCQkJICAgKSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKQEAgLTkzNSw3ICYjNDM7OTgwLDcgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAlyZXR1cm4gcmV0X2VycjsKIH0KIAotc3RhdGljIHZvaWQgZHhfcmVsZWFzZShzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcykKJiM0MztzdGF0aWMgdm9pZCBkeF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcykKIHsKIAlzdHJ1Y3QgZHhfcm9vdF9pbmZvICppbmZvOwogCWludCBpOwpAQCAtOTQ0LDcgJiM0Mzs5ODksOSBAQCBzdGF0aWMgdm9pZCBkeF9yZWxlYXNlKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzKQogCWlmIChmcmFtZXNbMF0uYmggPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JaW5mbyA9ICZhbXA7KChzdHJ1Y3QgZHhfcm9vdCAqKWZyYW1lc1swXS5iaC0mZ3Q7Yl9kYXRhKS0mZ3Q7aW5mbzsKJiM0MzsJaW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopZnJhbWVzWzBdLmJoLSZndDtiX2RhdGEpOwomIzQzOwlpZiAoSVNfRVJSKGluZm8pKQomIzQzOwkJcmV0dXJuOwogCS8qIHNhdmUgbG9jYWwgY29weSwgJiMzNDtpbmZvJiMzNDsgbWF5IGJlIGZyZWVkIGFmdGVyIGJyZWxzZSgpICovCiAJaW5kaXJlY3RfbGV2ZWxzID0gaW5mby0mZ3Q7aW5kaXJlY3RfbGV2ZWxzOwogCWZvciAoaSA9IDA7IGkgJmx0Oz0gaW5kaXJlY3RfbGV2ZWxzOyBpJiM0MzsmIzQzOykgewpAQCAtMTA1Niw3ICYjNDM7MTEwMyw3IEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsCiAJLyogY3N1bSBlbnRyaWVzIGFyZSBub3QgbGFyZ2VyIGluIHRoZSBjYXNlZm9sZGVkIGVuY3J5cHRlZCBjYXNlICovCiAJdG9wID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopICgoY2hhciAqKSBkZSAmIzQzOwogCQkJCQkgICBkaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplIC0KLQkJCQkJICAgZXh0NF9kaXJfcmVjX2xlbigwLAomIzQzOwkJCQkJICAgZXh0NF9kaXJlbnRfcmVjX2xlbigwLAogCQkJCQkJCSAgIGNzdW0gPyBOVUxMIDogZGlyKSk7CiAJLyogQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBlbmNyeXB0ZWQgKi8KIAlpZiAoSVNfRU5DUllQVEVEKGRpcikpIHsKQEAgLTEwODEsMjIgJiM0MzsxMTI4LDIzIEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsCiAJCQkvKiBzaWxlbnRseSBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrICovCiAJCQlicmVhazsKIAkJfQotCQlpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7Ci0JCQlpZiAoZGUtJmd0O25hbWVfbGVuICZhbXA7JmFtcDsgZGUtJmd0O2lub2RlKSB7Ci0JCQkJaGluZm8tJmd0O2hhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTsKLQkJCQloaW5mby0mZ3Q7bWlub3JfaGFzaCA9IEVYVDRfRElSRU5UX01JTk9SX0hBU0goZGUpOwotCQkJfSBlbHNlIHsKLQkJCQloaW5mby0mZ3Q7aGFzaCA9IDA7Ci0JCQkJaGluZm8tJmd0O21pbm9yX2hhc2ggPSAwOwotCQkJfQomIzQzOwkJaWYgKGRlLSZndDtuYW1lX2xlbiAmYW1wOyZhbXA7IGRlLSZndDtpbm9kZSkgewomIzQzOwkJCS8qIGNoZWNrIGZvciBzYXZlZCBoYXNoIGZpcnN0LCBvciBnZW5lcmF0ZSBpdCBmcm9tIG5hbWUgKi8KJiM0MzsJCQlpZiAoIShleHQ0X2RpcmRhdGFfZ2V0KGRlLCBkaXIsIGRpci0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemUsCiYjNDM7CQkJCQkgICAgICAgTlVMTCwgaGluZm8pICZhbXA7CiYjNDM7CQkJICAgICAgRVhUNF9ESVJFTlRfQ0ZIQVNIKSkgewomIzQzOwkJCQllcnIgPSBleHQ0ZnNfZGlyaGFzaChkaXIsIGRlLSZndDtuYW1lLAomIzQzOwkJCQkJCSAgICAgZGUtJmd0O25hbWVfbGVuLCBoaW5mbyk7CiYjNDM7CQkJCWlmIChlcnIgJmx0OyAwKSB7CiYjNDM7CQkJCQljb3VudCA9IGVycjsKJiM0MzsJCQkJCWdvdG8gZXJyb3V0OwomIzQzOwkJCQl9CiYjNDM7CQkJIH0KIAkJfSBlbHNlIHsKLQkJCWVyciA9IGV4dDRmc19kaXJoYXNoKGRpciwgZGUtJmd0O25hbWUsCi0JCQkJCSAgICAgZGUtJmd0O25hbWVfbGVuLCBoaW5mbyk7Ci0JCQlpZiAoZXJyICZsdDsgMCkgewotCQkJCWNvdW50ID0gZXJyOwotCQkJCWdvdG8gZXJyb3V0OwotCQkJfQomIzQzOwkJCWhpbmZvLSZndDtoYXNoID0gMDsKJiM0MzsJCQloaW5mby0mZ3Q7bWlub3JfaGFzaCA9IDA7CiAJCX0KJiM0MzsKIAkJaWYgKChoaW5mby0mZ3Q7aGFzaCAmbHQ7IHN0YXJ0X2hhc2gpIHx8CiAJCSAgICAoKGhpbmZvLSZndDtoYXNoID09IHN0YXJ0X2hhc2gpICZhbXA7JmFtcDsKIAkJICAgICAoaGluZm8tJmd0O21pbm9yX2hhc2ggJmx0OyBzdGFydF9taW5vcl9oYXNoKSkpCkBAIC0xMTA3LDggJiM0MzsxMTU1LDggQEAgc3RhdGljIGludCBodHJlZV9kaXJibG9ja190b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSwKIAkJCXRtcF9zdHIubmFtZSA9IGRlLSZndDtuYW1lOwogCQkJdG1wX3N0ci5sZW4gPSBkZS0mZ3Q7bmFtZV9sZW47CiAJCQllcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwKLQkJCQkgICBoaW5mby0mZ3Q7aGFzaCwgaGluZm8tJmd0O21pbm9yX2hhc2gsIGRlLAotCQkJCSAgICZhbXA7dG1wX3N0cik7CiYjNDM7CQkJCSAgIGhpbmZvLSZndDtoYXNoLCBoaW5mby0mZ3Q7bWlub3JfaGFzaCwKJiM0MzsJCQkJICAgZGlyLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSwgZGUsICZhbXA7dG1wX3N0cik7CiAJCX0gZWxzZSB7CiAJCQlpbnQgc2F2ZV9sZW4gPSBmbmFtZV9jcnlwdG9fc3RyLmxlbjsKIAkJCXN0cnVjdCBmc2NyeXB0X3N0ciBkZV9uYW1lID0gRlNUUl9JTklUKGRlLSZndDtuYW1lLApAQCAtMTEyMyw4ICYjNDM7MTE3MSw5IEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsCiAJCQkJZ290byBlcnJvdXQ7CiAJCQl9CiAJCQllcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwKLQkJCQkgICBoaW5mby0mZ3Q7aGFzaCwgaGluZm8tJmd0O21pbm9yX2hhc2gsIGRlLAotCQkJCQkmYW1wO2ZuYW1lX2NyeXB0b19zdHIpOwomIzQzOwkJCQkJCWhpbmZvLSZndDtoYXNoLCBoaW5mby0mZ3Q7bWlub3JfaGFzaCwKJiM0MzsJCQkJCQlkaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplLCBkZSwKJiM0MzsJCQkJCQkmYW1wO2ZuYW1lX2NyeXB0b19zdHIpOwogCQkJZm5hbWVfY3J5cHRvX3N0ci5sZW4gPSBzYXZlX2xlbjsKIAkJfQogCQlpZiAoZXJyICE9IDApIHsKQEAgLTEyMDIsNiAmIzQzOzEyNTEsNyBAQCBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLAogCQl0bXBfc3RyLm5hbWUgPSBkZS0mZ3Q7bmFtZTsKIAkJdG1wX3N0ci5sZW4gPSBkZS0mZ3Q7bmFtZV9sZW47CiAJCWVyciA9IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAwLCAwLAomIzQzOwkJCQkJICAgICAgZGlyLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSwKIAkJCQkJICAgICAgZGUsICZhbXA7dG1wX3N0cik7CiAJCWlmIChlcnIgIT0gMCkKIAkJCWdvdG8gZXJyb3V0OwpAQCAtMTIxMyw2ICYjNDM7MTI2Myw3IEBAIGludCBleHQ0X2h0cmVlX2ZpbGxfdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIHN0YXJ0X2hhc2gsCiAJCXRtcF9zdHIubmFtZSA9IGRlLSZndDtuYW1lOwogCQl0bXBfc3RyLmxlbiA9IGRlLSZndDtuYW1lX2xlbjsKIAkJZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsIDIsIDAsCiYjNDM7CQkJCQkgICAgICBkaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplLAogCQkJCQkgICAgICBkZSwgJmFtcDt0bXBfc3RyKTsKIAkJaWYgKGVyciAhPSAwKQogCQkJZ290byBlcnJvdXQ7CkBAIC0xMjUwLDEyICYjNDM7MTMwMSwxMiBAQCBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLAogCQkgICAgKGNvdW50ICZhbXA7JmFtcDsgKChoYXNodmFsICZhbXA7IDEpID09IDApKSkKIAkJCWJyZWFrOwogCX0KLQlkeF9yZWxlYXNlKGZyYW1lcyk7CiYjNDM7CWR4X3JlbGVhc2UoZGlyLCBmcmFtZXMpOwogCWR4dHJhY2UocHJpbnRrKEtFUk5fREVCVUcgJiMzNDtGaWxsIHRyZWU6IHJldHVybmVkICVkIGVudHJpZXMsICYjMzQ7CiAJCSAgICAgICAmIzM0O25leHQgaGFzaDogJXhcbiYjMzQ7LCBjb3VudCwgKm5leHRfaGFzaCkpOwogCXJldHVybiBjb3VudDsKIGVycm91dDoKLQlkeF9yZWxlYXNlKGZyYW1lcyk7CiYjNDM7CWR4X3JlbGVhc2UoZGlyLCBmcmFtZXMpOwogCXJldHVybiAoZXJyKTsKIH0KIApAQCAtMTI3Myw2ICYjNDM7MTMyNCwyMDcgQEAgc3RhdGljIGlubGluZSBpbnQgc2VhcmNoX2RpcmJsb2NrKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCiAgKiBEaXJlY3RvcnkgYmxvY2sgc3BsaXR0aW5nLCBjb21wYWN0aW5nCiAgKi8KIAomIzQzOy8qCiYjNDM7ICogZXh0NF9kaXJkYXRhX2dldCgpIC0gUmVhZCBkaXJkYXRhIGZpZWxkcyBmcm9tIGEgZGlyZWN0b3J5IGVudHJ5LgomIzQzOyAqIEBkZTogICAgICAgICBkaXJlY3RvcnkgZW50cnkKJiM0MzsgKiBAZGlyOiAgICAgICAgZGlyZWN0b3J5IGlub2RlICh1c2VkIGZvciBmc2NyeXB0JiM0MztjYXNlZm9sZCBoYXNoIGZhbGxiYWNrKQomIzQzOyAqIEBkZmlkOiAgICAgIGlmIG5vbi1OVUxMIGFuZCBFWFQ0X0RJUkVOVF9MVUZJRCBpcyBzZXQsIExVRklEIGRhdGEgaXMgY29waWVkCiYjNDM7ICogCQloZXJlCiYjNDM7ICogQGhpbmZvOglpZiBub24tTlVMTCwgcmVjZWl2ZXMgdGhlIGNhc2Vmb2xkIGhhc2ggYW5kIG1pbm9yIGhhc2gKJiM0MzsgKgomIzQzOyAqIFJlYWRzIGFueSBkaXJkYXRhIHN0b3JlZCBpbiBAZGUuICBJZiB0aGUgZGlyZGF0YSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLAomIzQzOyAqIGZhbGxzIGJhY2sgdG8gcmVhZGluZyB0aGUgaGFzaCBzdG9yZWQgaW5saW5lIGFmdGVyIHRoZSBmaWxlbmFtZSAoZm9yCiYjNDM7ICogY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGRlciBjYXNlZm9sZCYjNDM7ZnNjcnlwdCBmb3JtYXQpLgomIzQzOyAqCiYjNDM7ICogUmV0dXJucyBhIGJpdG1hc2sgb2YgRVhUNF9ESVJFTlRfKiBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIGZpZWxkcyB3ZXJlIHJlYWQuCiYjNDM7ICoKJiM0MzsgKiBDb21wYXRpYmlsaXR5IG5vdGU6IGVuYWJsaW5nIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBIG9uIGEgZmlsZXN5c3RlbQomIzQzOyAqIHRoYXQgYWxyZWFkeSBoYXMgY2FzZWZvbGRlZCYjNDM7ZW5jcnlwdGVkIGRpcmVjdG9yaWVzIGlzIE5PVCBzYWZlIHdpdGhvdXQgYQomIzQzOyAqIHByaW9yIG1pZ3JhdGlvbiBwYXNzLiAgQmVmb3JlIGRpcmRhdGEsIHRoZSBjYXNlZm9sZCYjNDM7ZnNjcnlwdCBoYXNoIHdhcyBzdG9yZWQKJiM0MzsgKiBhcyBhIHJhdyA4IGJ5dGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlbmFtZSB3aXRoIG5vIGZsYWcgaW4gZmlsZV90eXBlLgomIzQzOyAqIEFmdGVyIGRpcmRhdGEgaXMgZW5hYmxlZCwgdGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoZSBoYXNoIHRvIGJlIHByZXNlbnQgb25seQomIzQzOyAqIHdoZW4gRVhUNF9ESVJFTlRfQ0ZIQVNIICgweDQwKSBpcyBzZXQgaW4gZmlsZV90eXBlOyBleGlzdGluZyBlbnRyaWVzIHRoYXQKJiM0MzsgKiBjYXJyeSB0aGUgcmF3IGhhc2ggYXJlIHNpbGVudGx5IG1pc3JlYWQgYXMgaGF2aW5nIG5vIGhhc2ggYXQgYWxsLCBicmVha2luZwomIzQzOyAqIGRpcmVjdG9yeSBsb29rdXBzLiAgZTJmc2NrIG11c3QgYmUgcnVuIHRvIGNvbnZlcnQgYWxsIGFmZmVjdGVkIGVudHJpZXMgdG8KJiM0MzsgKiB0aGUgRVhUNF9ESVJFTlRfQ0ZIQVNIIGV4dGVuc2lvbiBmb3JtYXQgYmVmb3JlIHRoZSBmZWF0dXJlIGZsYWcgaXMgc2V0IHdpdGgKJiM0MzsgKiB0dW5lMmZzLiAgRGV0ZWN0aW9uIGhldXJpc3RpYzogaW4gYSBjYXNlZm9sZCYjNDM7ZW5jcnlwdGVkIGRpcmVjdG9yeSwgYW4gZW50cnkKJiM0MzsgKiB3aXRoIHJlY19sZW4gJmd0Oz0gcm91bmRfdXAobmFtZV9sZW4sIDQpICYjNDM7IDggYW5kIG5vIEVYVDRfRElSRU5UX0NGSEFTSCBiaXQKJiM0MzsgKiBjYXJyaWVzIGEgcmF3IHByZS1kaXJkYXRhIGhhc2ggdGhhdCBtdXN0IGJlIG1pZ3JhdGVkLgomIzQzOyAqLwomIzQzO3Vuc2lnbmVkIGNoYXIgZXh0NF9kaXJkYXRhX2dldChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIHN0cnVjdCBpbm9kZSAqZGlyLAomIzQzOwkJCSAgICAgICBpbnQgYnVmX3NpemUsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRmaWQsCiYjNDM7CQkJICAgICAgIHN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvKQomIzQzO3sKJiM0MzsJdW5zaWduZWQgY2hhciByZXQgPSAwOwomIzQzOwl1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQgPSBkZS0mZ3Q7bmFtZV9sZW4gJiM0MzsgMTsKJiM0MzsJdW5zaWduZWQgaW50IHJlY19sZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLSZndDtyZWNfbGVuLCBidWZfc2l6ZSk7CiYjNDM7CiYjNDM7CS8qIGRhdGFfb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIGRlLSZndDtuYW1lLCB3aGljaCBpdHNlbGYgc3RhcnRzCiYjNDM7CSAqIEVYVDRfQkFTRV9ESVJfTEVOIGJ5dGVzIGludG8gdGhlIGVudHJ5IC0tIHJlY19sZW4gaXMgcmVsYXRpdmUgdG8KJiM0MzsJICogdGhlIHN0YXJ0IG9mIHRoZSBlbnRyeSwgc28gYWRkIHRoZSBoZWFkZXIgc2l6ZSBiZWZvcmUgY29tcGFyaW5nLAomIzQzOwkgKiBvciB0aGlzIGxldHMgcmVhZHMgcnVuIEVYVDRfQkFTRV9ESVJfTEVOIGJ5dGVzIHBhc3QgdGhlIGVudHJ5LiAqLwomIzQzOwlpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJmd0OyByZWNfbGVuKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJLyogY29tcGF0aWJpbGl0eTogaGFzaCBzdG9yZWQgaW5saW5lIGFmdGVyIGZpbGVuYW1lIChubyBkaXJkYXRhKSAqLwomIzQzOwlpZiAoaGluZm8gJmFtcDsmYW1wOyAhZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci0mZ3Q7aV9zYikgJmFtcDsmYW1wOwomIzQzOwkgICAgZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7CiYjNDM7CQloaW5mby0mZ3Q7aGFzaCA9IEVYVDRfRElSRU5UX0hBU0goZGUpOwomIzQzOwkJaGluZm8tJmd0O21pbm9yX2hhc2ggPSBFWFQ0X0RJUkVOVF9NSU5PUl9IQVNIKGRlKTsKJiM0MzsJCXJldCB8PSBFWFQ0X0RJUkVOVF9DRkhBU0g7CiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIEVYVDRfRElSRU5UXyogYml0cyBhcmUgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCAqLwomIzQzOwlpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShkaXItJmd0O2lfc2IpKQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJaWYgKGRlLSZndDtmaWxlX3R5cGUgJmFtcDsgRVhUNF9ESVJFTlRfTFVGSUQpIHsKJiM0MzsJCXN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRpc2tfZmlkID0KJiM0MzsJCQkoc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqKSgoY2hhciAqKWRlICYjNDM7CiYjNDM7CQkJRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQpOwomIzQzOwkJdW5zaWduZWQgaW50IGRsZW47CiYjNDM7CQkvKiBzdHJ1Y3QgZXh0NF9maWQgZGZfZmlkW10gZG9lcyBub3QgcHJvdmlkZSB0aGUgYXJyYXkgc2l6ZS4KJiM0MzsJCSAqIEZpcnN0LCB2ZXJpZnkgdGhhdCB0aGUgaGVhZGVyIGxpZXMgd2l0aGluIHRoZSB2YWxpZCBhcmVhLCB0aGVuCiYjNDM7IAkJICogdmVyaWZ5IHRoYXQgdGhlIGVudGlyZSByZWNvcmQgZml0cyB3aXRoaW4gaXQuICovCiYjNDM7CQlpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0MzsKJiM0MzsJCSAgICBzaXplb2YoZGlza19maWQtJmd0O2RmX2hlYWRlcikgJmd0OyByZWNfbGVuKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CQlkbGVuID0gZGlza19maWQtJmd0O2RmX2hlYWRlci5kZGhfbGVuZ3RoOwomIzQzOwkJaWYgKGRsZW4gPT0gMCB8fAomIzQzOwkJICAgIEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICYjNDM7IGRsZW4gJmd0OyByZWNfbGVuKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CQlpZiAoZGZpZCkgewomIzQzOwkJCS8qIFRoZSBzaXplIGNhcCBiZWxvdyBlbnN1cmVzIHRoZSByZWNvcmQgaG9sZHMgYXQgbGVhc3QKJiM0MzsJCQkgKiBvbmUgY29tcGxldGUgc3RydWN0IGV4dDRfZmlkLiAqLwomIzQzOwkJCWlmIChkbGVuICZndDsgc2l6ZW9mKHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlcikgJiM0MzsKJiM0MzsJCQkJICAgIHNpemVvZihzdHJ1Y3QgZXh0NF9maWQpKQomIzQzOwkJCQlyZXR1cm4gcmV0OwomIzQzOwkJCW1lbWNweShkZmlkLCBkaXNrX2ZpZCwgZGxlbik7CiYjNDM7CQkJcmV0IHw9IEVYVDRfRElSRU5UX0xVRklEOwomIzQzOwkJfQomIzQzOwkJZGF0YV9vZmZzZXQgJiM0Mzs9IGRsZW47CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogU2tpcCBJTk82NCBmb3Igbm93Ki8KJiM0MzsJaWYgKGRlLSZndDtmaWxlX3R5cGUgJmFtcDsgRVhUNF9ESVJFTlRfSU5PNjQpIHsKJiM0MzsJCXN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqZGRoID0KJiM0MzsJCSAgICAgICAoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopKChjaGFyICopZGUgJiM0MzsgRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQpOwomIzQzOwkJdW5zaWduZWQgaW50IGRsZW47CiYjNDM7CiYjNDM7CQlpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0Mzsgc2l6ZW9mKCpkZGgpICZndDsgcmVjX2xlbikKJiM0MzsJCQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwkJZGxlbiA9IGRkaC0mZ3Q7ZGRoX2xlbmd0aDsKJiM0MzsJCWlmIChkbGVuICZsdDsgc2l6ZW9mKCpkZGgpIHx8CiYjNDM7CQkgICAgRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0MzsgZGxlbiAmZ3Q7IHJlY19sZW4pCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJCWRhdGFfb2Zmc2V0ICYjNDM7PSBkbGVuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICghaGluZm8pCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlpZiAoZGUtJmd0O2ZpbGVfdHlwZSAmYW1wOyBFWFQ0X0RJUkVOVF9DRkhBU0gpIHsKJiM0MzsJCXN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICpkaCA9CiYjNDM7CQkJKHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICopKChjaGFyICopZGUgJiM0MzsgRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQpOwomIzQzOwkJdW5zaWduZWQgaW50IGRsZW47CiYjNDM7CiYjNDM7CQlpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0Mzsgc2l6ZW9mKCpkaCkgJmd0OyByZWNfbGVuKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CQlkbGVuID0gZGgtJmd0O2RoX2hlYWRlci5kZGhfbGVuZ3RoOwomIzQzOwkJaWYgKGRsZW4gJmx0OyBzaXplb2YoKmRoKSB8fAomIzQzOwkJICAgIEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICYjNDM7IGRsZW4gJmd0OyByZWNfbGVuKQomIzQzOwkJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CQloaW5mby0mZ3Q7aGFzaCA9IGxlMzJfdG9fY3B1KGRoLSZndDtkaF9oYXNoLmhhc2gpOwomIzQzOwkJaGluZm8tJmd0O21pbm9yX2hhc2ggPSBsZTMyX3RvX2NwdShkaC0mZ3Q7ZGhfaGFzaC5taW5vcl9oYXNoKTsKJiM0MzsJCXJldCB8PSBFWFQ0X0RJUkVOVF9DRkhBU0g7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBleHQ0X2RpcmRhdGFfc2V0KCkgLSBXcml0ZSBkaXJkYXRhIGZpZWxkcyBpbnRvIGEgZGlyZWN0b3J5IGVudHJ5LgomIzQzOyAqIEBkZTogICAgZGlyZWN0b3J5IGVudHJ5IChuYW1lIG11c3QgYWxyZWFkeSBiZSBzZXQpCiYjNDM7ICogQGRpcjogICBkaXJlY3RvcnkgaW5vZGUKJiM0MzsgKiBAZGF0YTogIExVRklEIGRhdGEgdG8gc3RvcmUgKG9yIE5VTEwpCiYjNDM7ICogQGZuYW1lOiBmaWxlbmFtZSBpbmZvIGNhcnJ5aW5nIHRoZSBjYXNlZm9sZCBoYXNoCiYjNDM7ICoKJiM0MzsgKiBXcml0ZXMgYW55IHJlcXVpcmVkIGRpcmRhdGEgaW50byBAZGUgYWZ0ZXIgdGhlIGZpbGVuYW1lLiAgSWYgdGhlIGRpcmRhdGEKJiM0MzsgKiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBmYWxscyBiYWNrIHRvIHdyaXRpbmcgdGhlIGhhc2ggaW5saW5lIGFmdGVyIHRoZQomIzQzOyAqIGZpbGVuYW1lIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGRlciBjYXNlZm9sZCYjNDM7ZnNjcnlwdCBmb3JtYXQpLgomIzQzOyAqCiYjNDM7ICogU2VlIGV4dDRfZGlyZGF0YV9nZXQoKSBmb3IgdGhlIGNvbXBhdGliaWxpdHkgY29uc3RyYWludDogZW5hYmxpbmcgdGhlCiYjNDM7ICogZGlyZGF0YSBmZWF0dXJlIG9uIGEgZmlsZXN5c3RlbSB3aXRoIGV4aXN0aW5nIGNhc2Vmb2xkZWQmIzQzO2VuY3J5cHRlZAomIzQzOyAqIGRpcmVjdG9yaWVzIHJlcXVpcmVzIGFuIGUyZnNjayBtaWdyYXRpb24gcGFzcyBiZWZvcmUgdHVuZTJmcyBzZXRzIHRoZQomIzQzOyAqIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBIHN1cGVyYmxvY2sgZmxhZy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBleHQ0X2RpcmRhdGFfc2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsCiYjNDM7CQkJICAgICBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkZmlkLAomIzQzOwkJCSAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lKQomIzQzO3sKJiM0MzsJc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8gPSAmYW1wO2ZuYW1lLSZndDtoaW5mbzsKJiM0MzsJdW5zaWduZWQgaW50IGRhdGFfb2Zmc2V0ID0gZGUtJmd0O25hbWVfbGVuICYjNDM7IDE7CiYjNDM7CXVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0mZ3Q7cmVjX2xlbiwKJiM0MzsJCQkJCQkgICAgICAgZGlyLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiYjNDM7CiYjNDM7CS8qIENsZWFyIHRoZSBnYXAgYnl0ZSBiZXR3ZWVuIHRoZSBmaWxlbmFtZSBhbmQgdGhlIGZpcnN0IGRpcmRhdGEKJiM0MzsJICogZXh0ZW5zaW9uIHRvIGF2b2lkIGxlYWtpbmcgc3RhbGUgbWVtb3J5IHRvIGRpc2suICBVc2UgcG9pbnRlcgomIzQzOwkgKiBhcml0aG1ldGljIHJhdGhlciB0aGFuIGRlLSZndDtuYW1lW25hbWVfbGVuXSB0byBzdGF5IHdpdGhpbiB0aGUKJiM0MzsJICogZGVjbGFyZWQgbmFtZVtdIGFycmF5IGJvdW5kcyB1bmRlciBGT1JUSUZZX1NPVVJDRS4gIE9ubHkgd3JpdGUgaXQKJiM0MzsJICogd2hlbiB0aGVyZSBpcyBhY3R1YWxseSByb29tIChlbnRyaWVzIHRoYXQgZXhhY3RseSBmaWxsIHRoZWlyIHNsb3QKJiM0MzsJICogaGF2ZSByZWNfbGVuID09IEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IG5hbWVfbGVuIHdpdGggbm8gZ2FwKS4gKi8KJiM0MzsJaWYgKEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICZsdDs9IHJlY19sZW4pCiYjNDM7CQkqKChjaGFyICopZGUgJiM0MzsgRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGUtJmd0O25hbWVfbGVuKSA9IDA7CiYjNDM7CiYjNDM7CWlmIChkZmlkKSB7CiYjNDM7CQl1bnNpZ25lZCBpbnQgZGxlbiA9IGRmaWQtJmd0O2RmX2hlYWRlci5kZGhfbGVuZ3RoOwomIzQzOwomIzQzOwkJaWYgKEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICYjNDM7IGRsZW4gJmd0OyByZWNfbGVuKSB7CiYjNDM7CQkJRVhUNF9FUlJPUl9JTk9ERShkaXIsICYjMzQ7Q2FuIG5vdCBpbnNlcnQgRklEJiMzNDspOwomIzQzOwkJCXJldHVybjsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCW1lbWNweSgoY2hhciAqKWRlICYjNDM7IEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0LCBkZmlkLCBkbGVuKTsKJiM0MzsJCWRlLSZndDtmaWxlX3R5cGUgfD0gRVhUNF9ESVJFTlRfTFVGSUQ7CiYjNDM7CQlkYXRhX29mZnNldCAmIzQzOz0gZGxlbjsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7CiYjNDM7CQlpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci0mZ3Q7aV9zYikpIHsKJiM0MzsJCQlzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCAqZGggPQomIzQzOwkJCSAgICAoc3RydWN0IGV4dDRfZGlyZW50X2hhc2ggKikoKGNoYXIgKilkZSAmIzQzOyBFWFQ0X0JBU0VfRElSX0xFTiAmIzQzOyBkYXRhX29mZnNldCk7CiYjNDM7CiYjNDM7CQkJaWYgKEVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGRhdGFfb2Zmc2V0ICYjNDM7IHNpemVvZigqZGgpICZndDsgcmVjX2xlbikgewomIzQzOwkJCQlFWFQ0X0VSUk9SX0lOT0RFKGRpciwgJiMzNDtDYW4gbm90IGluc2VydCBkaGFzaCBkaXJkYXRhJiMzNDspOwomIzQzOwkJCQlyZXR1cm47CiYjNDM7CQkJfQomIzQzOwomIzQzOwkJCWRoLSZndDtkaF9oZWFkZXIuZGRoX2xlbmd0aCA9IHNpemVvZigqZGgpOwomIzQzOwkJCWRoLSZndDtkaF9oYXNoLmhhc2ggPSBjcHVfdG9fbGUzMihoaW5mby0mZ3Q7aGFzaCk7CiYjNDM7CQkJZGgtJmd0O2RoX2hhc2gubWlub3JfaGFzaCA9IGNwdV90b19sZTMyKGhpbmZvLSZndDttaW5vcl9oYXNoKTsKJiM0MzsJCQlkZS0mZ3Q7ZmlsZV90eXBlIHw9IEVYVDRfRElSRU5UX0NGSEFTSDsKJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJLyogQ29tcGF0aWJpbGl0eTogc3RvcmUgaGFzaCBpbmxpbmUgYWZ0ZXIgZmlsZW5hbWUgKi8KJiM0MzsJCQlpZiAoRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGF0YV9vZmZzZXQgJiM0MzsKJiM0MzsJCQkgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV9oYXNoKSAmZ3Q7IHJlY19sZW4pIHsKJiM0MzsJCQkJRVhUNF9FUlJPUl9JTk9ERShkaXIsICYjMzQ7Q2FuIG5vdCBpbnNlcnQgZGhhc2gmIzM0Oyk7CiYjNDM7CQkJCXJldHVybjsKJiM0MzsJCQl9CiYjNDM7CiYjNDM7CQkJRVhUNF9ESVJFTlRfSEFTSEVTKGRlKS0mZ3Q7aGFzaCA9IGNwdV90b19sZTMyKGhpbmZvLSZndDtoYXNoKTsKJiM0MzsJCQlFWFQ0X0RJUkVOVF9IQVNIRVMoZGUpLSZndDttaW5vcl9oYXNoID0KJiM0MzsJCQkJCQljcHVfdG9fbGUzMihoaW5mby0mZ3Q7bWlub3JfaGFzaCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiAvKgogICogQ3JlYXRlIG1hcCBvZiBoYXNoIHZhbHVlcywgb2Zmc2V0cywgYW5kIHNpemVzLCBzdG9yZWQgYXQgZW5kIG9mIGJsb2NrLgogICogUmV0dXJucyBudW1iZXIgb2YgZW50cmllcyBtYXBwZWQuCkBAIC0xMjk2LDkgJiM0MzsxNTQ4LDkgQEAgc3RhdGljIGludCBkeF9tYWtlX21hcChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCQkJICgoY2hhciAqKWRlKSAtIGJhc2UpKQogCQkJcmV0dXJuIC1FRlNDT1JSVVBURUQ7CiAJCWlmIChkZS0mZ3Q7bmFtZV9sZW4gJmFtcDsmYW1wOyBkZS0mZ3Q7aW5vZGUpIHsKLQkJCWlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpCi0JCQkJaC5oYXNoID0gRVhUNF9ESVJFTlRfSEFTSChkZSk7Ci0JCQllbHNlIHsKJiM0MzsJCQlpZiAoIShleHQ0X2RpcmRhdGFfZ2V0KGRlLCBkaXIsIGRpci0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemUsCiYjNDM7CQkJCQkgICAgICAgTlVMTCwgJmFtcDtoKSAmYW1wOwomIzQzOwkJCQkJCUVYVDRfRElSRU5UX0NGSEFTSCkpIHsKIAkJCQlpbnQgZXJyID0gZXh0NGZzX2Rpcmhhc2goZGlyLCBkZS0mZ3Q7bmFtZSwKIAkJCQkJCSAgICAgZGUtJmd0O25hbWVfbGVuLCAmYW1wO2gpOwogCQkJCWlmIChlcnIgJmx0OyAwKQpAQCAtMTQ4OCw3ICYjNDM7MTc0MCw3IEBAIGludCBleHQ0X3NlYXJjaF9kaXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgY2hhciAqc2VhcmNoX2J1ZiwgaW50IGJ1Zl9zaXplLAogfQogCiBzdGF0aWMgaW50IGlzX2R4X2ludGVybmFsX25vZGUoc3RydWN0IGlub2RlICpkaXIsIGV4dDRfbGJsa190IGJsb2NrLAotCQkJICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGUpCiYjNDM7CQkJICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLSZndDtpX3NiOwogCkBAIC0xNjE5LDcgJiM0MzsxODcxLDcgQEAgc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqX19leHQ0X2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsCiAJCX0KIAkJaWYgKCFidWZmZXJfdmVyaWZpZWQoYmgpICZhbXA7JmFtcDsKIAkJICAgICFpc19keF9pbnRlcm5hbF9ub2RlKGRpciwgYmxvY2ssCi0JCQkJCSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopYmgtJmd0O2JfZGF0YSkgJmFtcDsmYW1wOwomIzQzOwkJCQkJIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJoLSZndDtiX2RhdGEpICZhbXA7JmFtcDsKIAkJICAgICFleHQ0X2RpcmJsb2NrX2NzdW1fdmVyaWZ5KGRpciwgYmgpKSB7CiAJCQlFWFQ0X0VSUk9SX0lOT0RFX0VSUihkaXIsIEVGU0JBRENSQywKIAkJCQkJICAgICAmIzM0O2NoZWNrc3VtbWluZyBkaXJlY3RvcnkgJiMzNDsKQEAgLTE3NTMsNyAmIzQzOzIwMDUsNyBAQCBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogZXh0NF9keF9maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLAogZXJyb3V0OgogCWR4dHJhY2UocHJpbnRrKEtFUk5fREVCVUcgJiMzNDslcyBub3QgZm91bmRcbiYjMzQ7LCBmbmFtZS0mZ3Q7dXNyX2ZuYW1lLSZndDtuYW1lKSk7CiBzdWNjZXNzOgotCWR4X3JlbGVhc2UoZnJhbWVzKTsKJiM0MzsJZHhfcmVsZWFzZShkaXIsIGZyYW1lcyk7CiAJcmV0dXJuIGJoOwogfQogCkBAIC0xODUwLDcgJiM0MzsyMTAyLDcgQEAgZHhfbW92ZV9kaXJlbnRzKHN0cnVjdCBpbm9kZSAqZGlyLCBjaGFyICpmcm9tLCBjaGFyICp0bywKIAl3aGlsZSAoY291bnQtLSkgewogCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikKIAkJCQkJCShmcm9tICYjNDM7IChtYXAtJmd0O29mZnMmbHQ7Jmx0OzIpKTsKLQkJcmVjX2xlbiA9IGV4dDRfZGlyX3JlY19sZW4oZGUtJmd0O25hbWVfbGVuLCBkaXIpOwomIzQzOwkJcmVjX2xlbiA9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgYmxvY2tzaXplLCBkaXIpOwogCiAJCW1lbWNweSAodG8sIGRlLCByZWNfbGVuKTsKIAkJKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSB0byktJmd0O3JlY19sZW4gPQpAQCAtMTg4Myw3ICYjNDM7MjEzNSw3IEBAIHN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZHhfcGFja19kaXJlbnRzKHN0cnVjdCBpbm9kZSAqZGlyLCBjaGFyICpiYXNlLAogCXdoaWxlICgoY2hhciopZGUgJmx0OyBiYXNlICYjNDM7IGJsb2Nrc2l6ZSkgewogCQluZXh0ID0gZXh0NF9uZXh0X2VudHJ5KGRlLCBibG9ja3NpemUpOwogCQlpZiAoZGUtJmd0O2lub2RlICZhbXA7JmFtcDsgZGUtJmd0O25hbWVfbGVuKSB7Ci0JCQlyZWNfbGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS0mZ3Q7bmFtZV9sZW4sIGRpcik7CiYjNDM7CQkJcmVjX2xlbiA9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgYmxvY2tzaXplLCBkaXIpOwogCQkJaWYgKGRlICZndDsgdG8pCiAJCQkJbWVtbW92ZSh0bywgZGUsIHJlY19sZW4pOwogCQkJdG8tJmd0O3JlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhyZWNfbGVuLCBibG9ja3NpemUpOwpAQCAtMjAzNSwxMCAmIzQzOzIyODcsMTUgQEAgc3RhdGljIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkb19zcGxpdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIGludCBleHQ0X2ZpbmRfZGVzdF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJICAgICAgdm9pZCAqYnVmLCBpbnQgYnVmX3NpemUsCiAJCSAgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwKLQkJICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipkZXN0X2RlKQomIzQzOwkJICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipkZXN0X2RlLAomIzQzOwkJICAgICAgaW50IGRsZW4pCiB7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwotCXVuc2lnbmVkIHNob3J0IHJlY2xlbiA9IGV4dDRfZGlyX3JlY19sZW4oZm5hbWVfbGVuKGZuYW1lKSwgZGlyKTsKJiM0MzsJLyogV2hlbiBkaXJkYXRhIGV4dGVuc2lvbnMgYXJlIHByZXNlbnQsIGEgTlVMIGdhcCBieXRlIHNpdHMgYmV0d2VlbgomIzQzOwkgKiB0aGUgZmlsZW5hbWUgYW5kIHRoZSBmaXJzdCBleHRlbnNpb247IGFjY291bnQgZm9yIGl0IHNvIHRoZSBmb3VuZAomIzQzOwkgKiBzbG90IGlzIGFsd2F5cyBsYXJnZSBlbm91Z2ggZm9yIGV4dDRfZGlyZGF0YV9zZXQoKSB0byB3cml0ZSBpbnRvLiAqLwomIzQzOwl1bnNpZ25lZCBzaG9ydCByZWNsZW4gPSBleHQ0X2RpcmVudF9yZWNfbGVuKGZuYW1lX2xlbihmbmFtZSkgJiM0MzsgZGxlbiAmIzQzOwomIzQzOwkJCQkJCSAgICAoZGxlbiA/IDEgOiAwKSwgZGlyKTsKIAlpbnQgbmxlbiwgcmxlbjsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKIAljaGFyICp0b3A7CkBAIC0yMDUxLDcgJiM0MzsyMzA4LDcgQEAgaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCQkJcmV0dXJuIC1FRlNDT1JSVVBURUQ7CiAJCWlmIChleHQ0X21hdGNoKGRpciwgZm5hbWUsIGRlKSkKIAkJCXJldHVybiAtRUVYSVNUOwotCQlubGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS0mZ3Q7bmFtZV9sZW4sIGRpcik7CiYjNDM7CQlubGVuID0gZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBidWZfc2l6ZSwgZGlyKTsKIAkJcmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtJmd0O3JlY19sZW4sIGJ1Zl9zaXplKTsKIAkJaWYgKChkZS0mZ3Q7aW5vZGUgPyBybGVuIC0gbmxlbiA6IHJsZW4pICZndDs9IHJlY2xlbikKIAkJCWJyZWFrOwpAQCAtMjA2NSwxNiAmIzQzOzIzMjIsMTMgQEAgaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAogCXJldHVybiAwOwogfQogCi12b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsCi0JCQlpbnQgYnVmX3NpemUsCi0JCQlzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUpCiYjNDM7dm9pZCBleHQ0X2luc2VydF9kZW50cnlfZGF0YShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwKJiM0MzsJCQkgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgaW50IGJ1Zl9zaXplLAomIzQzOwkJCSAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCB2b2lkICpkYXRhKQogewotCiAJaW50IG5sZW4sIHJsZW47CiAKLQlubGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS0mZ3Q7bmFtZV9sZW4sIGRpcik7CiYjNDM7CW5sZW4gPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIGJ1Zl9zaXplLCBkaXIpOwogCXJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLSZndDtyZWNfbGVuLCBidWZfc2l6ZSk7CiAJaWYgKGRlLSZndDtpbm9kZSkgewogCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUxID0KQEAgLTIwODgsMTMgJiM0MzsyMzQyLDcgQEAgdm9pZCBleHQ0X2luc2VydF9kZW50cnkoc3RydWN0IGlub2RlICpkaXIsCiAJZXh0NF9zZXRfZGVfdHlwZShpbm9kZS0mZ3Q7aV9zYiwgZGUsIGlub2RlLSZndDtpX21vZGUpOwogCWRlLSZndDtuYW1lX2xlbiA9IGZuYW1lX2xlbihmbmFtZSk7CiAJbWVtY3B5KGRlLSZndDtuYW1lLCBmbmFtZV9uYW1lKGZuYW1lKSwgZm5hbWVfbGVuKGZuYW1lKSk7Ci0JaWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkgewotCQlzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbyA9ICZhbXA7Zm5hbWUtJmd0O2hpbmZvOwotCi0JCUVYVDRfRElSRU5UX0hBU0hFUyhkZSktJmd0O2hhc2ggPSBjcHVfdG9fbGUzMihoaW5mby0mZ3Q7aGFzaCk7Ci0JCUVYVDRfRElSRU5UX0hBU0hFUyhkZSktJmd0O21pbm9yX2hhc2ggPQotCQkJCQkJY3B1X3RvX2xlMzIoaGluZm8tJmd0O21pbm9yX2hhc2gpOwotCX0KJiM0MzsJZXh0NF9kaXJkYXRhX3NldChkZSwgZGlyLCBkYXRhLCBmbmFtZSk7CiB9CiAKIC8qCkBAIC0yMTEyLDE0ICYjNDM7MjM2MCwyOCBAQCBzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwKIHsKIAl1bnNpZ25lZCBpbnQJYmxvY2tzaXplID0gZGlyLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKIAlpbnQJCWNzdW1fc2l6ZSA9IDA7Ci0JaW50CQllcnIsIGVycjI7CiYjNDM7CWludAkJZXJyLCBlcnIyLCBkbGVuID0gMDsKJiM0MzsJc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZDsKIAogCWlmIChleHQ0X2hhc19mZWF0dXJlX21ldGFkYXRhX2NzdW0oaW5vZGUtJmd0O2lfc2IpKQogCQljc3VtX3NpemUgPSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpOwogCiYjNDM7CS8qIGRmaWQgaXMgcmVzb2x2ZWQgb25jZSBieSBleHQ0X2FkZF9lbnRyeSgpIGFuZCBzdG9yZWQgaW4gZm5hbWUgc28KJiM0MzsJICogdGhhdCBhbGwgYWRkX2RpcmVudF90b19idWYoKSBjYWxscyB3aXRoaW4gdGhlIHNhbWUgYWRkIG9wZXJhdGlvbgomIzQzOwkgKiB1c2UgYSBjb25zaXN0ZW50IHZhbHVlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHNoYXJlZCBpX2RpcmRhdGEgZmllbGQuICovCiYjNDM7CWRmaWQgPSBmbmFtZS0mZ3Q7ZGZpZDsKIAlpZiAoIWRlKSB7CiYjNDM7CQlpZiAoZGZpZCkKJiM0MzsJCQlkbGVuID0gZGZpZC0mZ3Q7ZGZfaGVhZGVyLmRkaF9sZW5ndGg7CiYjNDM7CQkvKiBleHQ0X2RpcmVudF9yZWNfbGVuKCkgZG9lcyBub3QgYWRkIENGSEFTSCBzaXplIHdoZW4gZGlyZGF0YSBpcwomIzQzOwkJICogZW5hYmxlZCAoaXQgYXNzdW1lcyB0aGUgY2FsbGVyIGluY2x1ZGVkIGl0IGluIG5hbWVfbGVuKS4gIEFkZAomIzQzOwkJICogaXQgaGVyZSBzbyBleHQ0X2ZpbmRfZGVzdF9kZSgpIGFsbG9jYXRlcyBhIHNsb3QgbGFyZ2UgZW5vdWdoCiYjNDM7CQkgKiBmb3IgZXh0NF9kaXJkYXRhX3NldCgpIHRvIHdyaXRlIHRoZSBoYXNoIGV4dGVuc2lvbi4gKi8KJiM0MzsJCWlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikgJmFtcDsmYW1wOwomIzQzOwkJICAgIGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShkaXItJmd0O2lfc2IpKQomIzQzOwkJCWRsZW4gJiM0Mzs9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCk7CiAJCWVyciA9IGV4dDRfZmluZF9kZXN0X2RlKGRpciwgYmgsIGJoLSZndDtiX2RhdGEsCi0JCQkJCWJsb2Nrc2l6ZSAtIGNzdW1fc2l6ZSwgZm5hbWUsICZhbXA7ZGUpOwomIzQzOwkJCQkJYmxvY2tzaXplIC0gY3N1bV9zaXplLCBmbmFtZSwgJmFtcDtkZSwgZGxlbik7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KQEAgLTIxMzIsNyAmIzQzOzIzOTQsNyBAQCBzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwKIAl9CiAKIAkvKiBCeSBub3cgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgZm9yIGpvdXJuYWxpbmcgKi8KLQlleHQ0X2luc2VydF9kZW50cnkoZGlyLCBpbm9kZSwgZGUsIGJsb2Nrc2l6ZSwgZm5hbWUpOwomIzQzOwlleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgYmxvY2tzaXplLCBmbmFtZSwgZGZpZCk7CiAKIAkvKgogCSAqIFhYWCBzaG91bGRuJiMzOTt0IHVwZGF0ZSBhbnkgdGltZXMgdW50aWwgc3VjY2Vzc2Z1bApAQCAtMjE1Niw0NCAmIzQzOzI0MTgsMzggQEAgc3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsCiAJcmV0dXJuIGVyciA/IGVyciA6IGVycjI7CiB9CiAKLXN0YXRpYyBib29sIGV4dDRfY2hlY2tfZHhfcm9vdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGR4X3Jvb3QgKnJvb3QpCiYjNDM7c3RhdGljIGJvb2wgZXh0NF9jaGVja19keF9yb290KHN0cnVjdCBpbm9kZSAqZGlyLAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG90X2RlLAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG90ZG90X2RlLAomIzQzOwkJCSAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmVudHJ5KQogewotCXN0cnVjdCBmYWtlX2RpcmVudCAqZmRlOwogCWNvbnN0IGNoYXIgKmVycm9yX21zZzsKLQl1bnNpZ25lZCBpbnQgcmxlbjsKIAl1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gZGlyLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZTsKLQljaGFyICpibG9ja2VuZCA9IChjaGFyICopcm9vdCAmIzQzOyBkaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplOwomIzQzOwlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSBOVUxMOwogCi0JZmRlID0gJmFtcDtyb290LSZndDtkb3Q7Ci0JaWYgKHVubGlrZWx5KGZkZS0mZ3Q7bmFtZV9sZW4gIT0gMSkpIHsKJiM0MzsJaWYgKHVubGlrZWx5KGRvdF9kZS0mZ3Q7bmFtZV9sZW4gIT0gMSkpIHsKIAkJZXJyb3JfbXNnID0gJiMzNDtpbnZhbGlkIG5hbWVfbGVuIGZvciAmIzM5Oy4mIzM5OyYjMzQ7OwogCQlnb3RvIGNvcnJ1cHRlZDsKIAl9Ci0JaWYgKHVubGlrZWx5KHN0cm5jbXAocm9vdC0mZ3Q7ZG90X25hbWUsICYjMzQ7LiYjMzQ7LCBmZGUtJmd0O25hbWVfbGVuKSkpIHsKJiM0MzsJaWYgKHVubGlrZWx5KHN0cm5jbXAoZG90X2RlLSZndDtuYW1lLCAmIzM0Oy4mIzM0OywgZG90X2RlLSZndDtuYW1lX2xlbikpKSB7CiAJCWVycm9yX21zZyA9ICYjMzQ7aW52YWxpZCBuYW1lIGZvciAmIzM5Oy4mIzM5OyYjMzQ7OwogCQlnb3RvIGNvcnJ1cHRlZDsKIAl9Ci0JcmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZmRlLSZndDtyZWNfbGVuLCBibG9ja3NpemUpOwotCWlmICh1bmxpa2VseSgoY2hhciAqKWZkZSAmIzQzOyBybGVuICZndDs9IGJsb2NrZW5kKSkgewotCQllcnJvcl9tc2cgPSAmIzM0O2ludmFsaWQgcmVjX2xlbiBmb3IgJiMzOTsuJiMzOTsmIzM0OzsKLQkJZ290byBjb3JydXB0ZWQ7Ci0JfQogCi0JZmRlID0gJmFtcDtyb290LSZndDtkb3Rkb3Q7Ci0JaWYgKHVubGlrZWx5KGZkZS0mZ3Q7bmFtZV9sZW4gIT0gMikpIHsKJiM0MzsJaWYgKHVubGlrZWx5KGRvdGRvdF9kZS0mZ3Q7bmFtZV9sZW4gIT0gMikpIHsKIAkJZXJyb3JfbXNnID0gJiMzNDtpbnZhbGlkIG5hbWVfbGVuIGZvciAmIzM5Oy4uJiMzOTsmIzM0OzsKIAkJZ290byBjb3JydXB0ZWQ7CiAJfQotCWlmICh1bmxpa2VseShzdHJuY21wKHJvb3QtJmd0O2RvdGRvdF9uYW1lLCAmIzM0Oy4uJiMzNDssIGZkZS0mZ3Q7bmFtZV9sZW4pKSkgewomIzQzOwlpZiAodW5saWtlbHkoc3RybmNtcChkb3Rkb3RfZGUtJmd0O25hbWUsICYjMzQ7Li4mIzM0OywgZG90ZG90X2RlLSZndDtuYW1lX2xlbikpKSB7CiAJCWVycm9yX21zZyA9ICYjMzQ7aW52YWxpZCBuYW1lIGZvciAmIzM5Oy4uJiMzOTsmIzM0OzsKIAkJZ290byBjb3JydXB0ZWQ7CiAJfQotCXJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGZkZS0mZ3Q7cmVjX2xlbiwgYmxvY2tzaXplKTsKLQlpZiAodW5saWtlbHkoKGNoYXIgKilmZGUgJiM0MzsgcmxlbiAmZ3Q7PSBibG9ja2VuZCkpIHsKJiM0MzsJZGUgPSBleHQ0X25leHRfZW50cnkoZG90ZG90X2RlLCBibG9ja3NpemUpOwomIzQzOwlpZiAoKGNoYXIgKilkZSAmZ3Q7PSAoKChjaGFyICopZG90X2RlKSAmIzQzOyBibG9ja3NpemUpKSB7CiAJCWVycm9yX21zZyA9ICYjMzQ7aW52YWxpZCByZWNfbGVuIGZvciAmIzM5Oy4uJiMzOTsmIzM0OzsKIAkJZ290byBjb3JydXB0ZWQ7CiAJfQotCiYjNDM7CSplbnRyeSA9IGRlOwogCXJldHVybiB0cnVlOwogCiBjb3JydXB0ZWQ6CkBAIC0yMjExLDE2ICYjNDM7MjQ2NywxNSBAQCBzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLAogCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7Ci0Jc3RydWN0IGR4X3Jvb3QJKnJvb3Q7CiAJc3RydWN0IGR4X2ZyYW1lCWZyYW1lc1tFWFQ0X0hUUkVFX0xFVkVMXSwgKmZyYW1lOwogCXN0cnVjdCBkeF9lbnRyeSAqZW50cmllczsKLQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMgkqZGUsICpkZTI7CiYjNDM7CXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yCSpkZSwgKmRlMiwgKmRvdF9kZSwgKmRvdGRvdF9kZTsKIAljaGFyCQkqZGF0YTIsICp0b3A7CiAJdW5zaWduZWQJbGVuOwogCWludAkJcmV0dmFsOwogCXVuc2lnbmVkCWJsb2Nrc2l6ZTsKIAlleHQ0X2xibGtfdCAgYmxvY2s7Ci0Jc3RydWN0IGZha2VfZGlyZW50ICpmZGU7CiYjNDM7CXN0cnVjdCBkeF9yb290X2luZm8gKmR4X2luZm87CiAJaW50IGNzdW1fc2l6ZSA9IDA7CiAKIAlpZiAoZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGlub2RlLSZndDtpX3NiKSkKQEAgLTIyMzcsMTcgJiM0MzsyNDkyLDIwIEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsCiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0Jcm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBiaC0mZ3Q7Yl9kYXRhOwotCWlmICghZXh0NF9jaGVja19keF9yb290KGRpciwgcm9vdCkpIHsKJiM0MzsJZG90X2RlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtJmd0O2JfZGF0YTsKJiM0MzsJaWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZG90X2RlLSZndDtyZWNfbGVuLCBibG9ja3NpemUpICZsdDsgRVhUNF9CQVNFX0RJUl9MRU4gfHwKJiM0MzsJICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZG90X2RlLSZndDtyZWNfbGVuLCBibG9ja3NpemUpICZndDs9IGJsb2Nrc2l6ZSAtIEVYVDRfQkFTRV9ESVJfTEVOKSB7CiYjNDM7CQlicmVsc2UoYmgpOwomIzQzOwkJcmV0dXJuIC1FRlNDT1JSVVBURUQ7CiYjNDM7CX0KJiM0MzsJZG90ZG90X2RlID0gZXh0NF9uZXh0X2VudHJ5KGRvdF9kZSwgYmxvY2tzaXplKTsKJiM0MzsJaWYgKCFleHQ0X2NoZWNrX2R4X3Jvb3QoZGlyLCBkb3RfZGUsIGRvdGRvdF9kZSwgJmFtcDtkZSkpIHsKIAkJYnJlbHNlKGJoKTsKIAkJcmV0dXJuIC1FRlNDT1JSVVBURUQ7CiAJfQogCiAJLyogVGhlIDB0aCBibG9jayBiZWNvbWVzIHRoZSByb290LCBtb3ZlIHRoZSBkaXJlbnRzIG91dCAqLwotCWZkZSA9ICZhbXA7cm9vdC0mZ3Q7ZG90ZG90OwotCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKChjaGFyICopZmRlICYjNDM7Ci0JCWV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZmRlLSZndDtyZWNfbGVuLCBibG9ja3NpemUpKTsKLQlsZW4gPSAoKGNoYXIgKikgcm9vdCkgJiM0MzsgKGJsb2Nrc2l6ZSAtIGNzdW1fc2l6ZSkgLSAoY2hhciAqKSBkZTsKJiM0MzsJbGVuID0gKChjaGFyICopZG90X2RlKSAmIzQzOyAoYmxvY2tzaXplIC0gY3N1bV9zaXplKSAtIChjaGFyICopZGU7CiAKIAkvKiBBbGxvY2F0ZSBuZXcgYmxvY2sgZm9yIHRoZSAwdGggYmxvY2smIzM5O3MgZGlyZW50cyAqLwogCWJoMiA9IGV4dDRfYXBwZW5kKGhhbmRsZSwgZGlyLCAmYW1wO2Jsb2NrKTsKQEAgLTIyNzgsMjQgJiM0MzsyNTM2LDMyIEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsCiAJCWV4dDRfaW5pdGlhbGl6ZV9kaXJlbnRfdGFpbChiaDIsIGJsb2Nrc2l6ZSk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSByb290OyB0aGUgZG90IGRpcmVudHMgYWxyZWFkeSBleGlzdCAqLwotCWRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopICgmYW1wO3Jvb3QtJmd0O2RvdGRvdCk7Ci0JZGUtJmd0O3JlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzaygKLQkJCWJsb2Nrc2l6ZSAtIGV4dDRfZGlyX3JlY19sZW4oMiwgTlVMTCksIGJsb2Nrc2l6ZSk7Ci0JbWVtc2V0ICgmYW1wO3Jvb3QtJmd0O2luZm8sIDAsIHNpemVvZihyb290LSZndDtpbmZvKSk7Ci0Jcm9vdC0mZ3Q7aW5mby5pbmZvX2xlbmd0aCA9IHNpemVvZihyb290LSZndDtpbmZvKTsKJiM0MzsJZG90ZG90X2RlLSZndDtyZWNfbGVuID0KJiM0MzsJCWV4dDRfcmVjX2xlbl90b19kaXNrKGJsb2Nrc2l6ZSAtIGxlMTZfdG9fY3B1KGRvdF9kZS0mZ3Q7cmVjX2xlbiksCiYjNDM7CQkJCSAgICAgYmxvY2tzaXplKTsKJiM0MzsKJiM0MzsJLyogaW5pdGlhbGl6ZSBoYXNoaW5nIGluZm8gKi8KJiM0MzsJZHhfaW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgZG90X2RlKTsKJiM0MzsJaWYgKElTX0VSUihkeF9pbmZvKSkgewomIzQzOwkJYnJlbHNlKGJoMik7CiYjNDM7CQlicmVsc2UoYmgpOwomIzQzOwkJcmV0dXJuIFBUUl9FUlIoZHhfaW5mbyk7CiYjNDM7CX0KJiM0MzsJbWVtc2V0KGR4X2luZm8sIDAsIHNpemVvZigqZHhfaW5mbykpOwomIzQzOwlkeF9pbmZvLSZndDtpbmZvX2xlbmd0aCA9IHNpemVvZigqZHhfaW5mbyk7CiAJaWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkKLQkJcm9vdC0mZ3Q7aW5mby5oYXNoX3ZlcnNpb24gPSBEWF9IQVNIX1NJUEhBU0g7CiYjNDM7CQlkeF9pbmZvLSZndDtoYXNoX3ZlcnNpb24gPSBEWF9IQVNIX1NJUEhBU0g7CiAJZWxzZQotCQlyb290LSZndDtpbmZvLmhhc2hfdmVyc2lvbiA9CiYjNDM7CQlkeF9pbmZvLSZndDtoYXNoX3ZlcnNpb24gPQogCQkJCUVYVDRfU0IoZGlyLSZndDtpX3NiKS0mZ3Q7c19kZWZfaGFzaF92ZXJzaW9uOwogCi0JZW50cmllcyA9IHJvb3QtJmd0O2VudHJpZXM7CiYjNDM7CWVudHJpZXMgPSAodm9pZCAqKWR4X2luZm8gJiM0MzsgZHhfaW5mby0mZ3Q7aW5mb19sZW5ndGg7CiAJZHhfc2V0X2Jsb2NrKGVudHJpZXMsIDEpOwogCWR4X3NldF9jb3VudChlbnRyaWVzLCAxKTsKLQlkeF9zZXRfbGltaXQoZW50cmllcywgZHhfcm9vdF9saW1pdChkaXIsIHNpemVvZihyb290LSZndDtpbmZvKSkpOwomIzQzOwlkeF9zZXRfbGltaXQoZW50cmllcywgZHhfcm9vdF9saW1pdChkaXIsIGRvdF9kZSkpOwogCiAJLyogSW5pdGlhbGl6ZSBhcyBmb3IgZHhfcHJvYmUgKi8KLQlmbmFtZS0mZ3Q7aGluZm8uaGFzaF92ZXJzaW9uID0gcm9vdC0mZ3Q7aW5mby5oYXNoX3ZlcnNpb247CiYjNDM7CWZuYW1lLSZndDtoaW5mby5oYXNoX3ZlcnNpb24gPSBkeF9pbmZvLSZndDtoYXNoX3ZlcnNpb247CiAJaWYgKGZuYW1lLSZndDtoaW5mby5oYXNoX3ZlcnNpb24gJmx0Oz0gRFhfSEFTSF9URUEpCiAJCWZuYW1lLSZndDtoaW5mby5oYXNoX3ZlcnNpb24gJiM0Mzs9IEVYVDRfU0IoZGlyLSZndDtpX3NiKS0mZ3Q7c19oYXNoX3Vuc2lnbmVkOwogCWZuYW1lLSZndDtoaW5mby5zZWVkID0gRVhUNF9TQihkaXItJmd0O2lfc2IpLSZndDtzX2hhc2hfc2VlZDsKQEAgLTIzMzgsNyAmIzQzOzI2MDQsNyBAQCBzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLAogCSAqLwogCWlmIChyZXR2YWwpCiAJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7Ci0JZHhfcmVsZWFzZShmcmFtZXMpOwomIzQzOwlkeF9yZWxlYXNlKGRpciwgZnJhbWVzKTsKIAlicmVsc2UoYmgyKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMjM1NSw3ICYjNDM7MjYyMSw4IEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsCiAgKi8KIHN0YXRpYyBpbnQgX19leHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCSAgY29uc3Qgc3RydWN0IHFzdHIgKmRfbmFtZSwKLQkJCSAgc3RydWN0IGlub2RlICppbm9kZSkKJiM0MzsJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiYjNDM7CQkJICBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKmVkcCkKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKIAlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7CkBAIC0yMzgwLDYgJiM0MzsyNjQ3LDEzIEBAIHN0YXRpYyBpbnQgX19leHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwogCiYjNDM7CS8qIFJlc29sdmUgdGhlIExVRklEIHBheWxvYWQgb25jZSBoZXJlIGFuZCBzdG9yZSBpdCBpbiBmbmFtZSBzbyBldmVyeQomIzQzOwkgKiBhZGRfZGlyZW50X3RvX2J1ZigpIGNhbGwgaW4gdGhpcyBhZGQgb3BlcmF0aW9uIHVzZXMgdGhlIHNhbWUgdmFsdWUKJiM0MzsJICogd2l0aG91dCB0b3VjaGluZyB0aGUgc2hhcmVkIEVYVDRfSShpbm9kZSktJmd0O2lfZGlyZGF0YSBmaWVsZC4gKi8KJiM0MzsJZm5hbWUuZGZpZCA9IGV4dDRfZGVudHJ5X2dldF9maWQoc2IsIGVkcCk7CiYjNDM7CWlmIChmbmFtZS5kZmlkKQomIzQzOwkJZXh0NF9mY19tYXJrX2luZWxpZ2libGUoc2IsIEVYVDRfRkNfUkVBU09OX0RJUkRBVEEsIGhhbmRsZSk7CiYjNDM7CiAJaWYgKGV4dDRfaGFzX2lubGluZV9kYXRhKGRpcikpIHsKIAkJcmV0dmFsID0gZXh0NF90cnlfYWRkX2lubGluZV9lbnRyeShoYW5kbGUsICZhbXA7Zm5hbWUsIGRpciwgaW5vZGUpOwogCQlpZiAocmV0dmFsICZsdDsgMCkKQEAgLTI0NjQsNyAmIzQzOzI3MzgsOCBAQCBzdGF0aWMgaW50IGV4dDRfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAogCWlmIChmc2NyeXB0X2lzX25va2V5X25hbWUoZGVudHJ5KSkKIAkJcmV0dXJuIC1FTk9LRVk7Ci0JcmV0dXJuIF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsICZhbXA7ZGVudHJ5LSZndDtkX25hbWUsIGlub2RlKTsKJiM0MzsJcmV0dXJuIF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsICZhbXA7ZGVudHJ5LSZndDtkX25hbWUsIGlub2RlLAomIzQzOwkJCQlkZW50cnktJmd0O2RfZnNkYXRhKTsKIH0KIAogLyoKQEAgLTI2MDUsNyAmIzQzOzI4ODAsNyBAQCBzdGF0aWMgaW50IGV4dDRfZHhfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwKIAkJCWlmIChyZXN0YXJ0IHx8IGVycikKIAkJCQlnb3RvIGpvdXJuYWxfZXJyb3I7CiAJCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgZHhfcm9vdCAqZHhyb290OwomIzQzOwkJCXN0cnVjdCBkeF9yb290X2luZm8gKmluZm87CiAJCQltZW1jcHkoKGNoYXIgKikgZW50cmllczIsIChjaGFyICopIGVudHJpZXMsCiAJCQkgICAgICAgaWNvdW50ICogc2l6ZW9mKHN0cnVjdCBkeF9lbnRyeSkpOwogCQkJZHhfc2V0X2xpbWl0KGVudHJpZXMyLCBkeF9ub2RlX2xpbWl0KGRpcikpOwpAQCAtMjYxMywxMSAmIzQzOzI4ODgsMTcgQEAgc3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsCiAJCQkvKiBTZXQgdXAgcm9vdCAqLwogCQkJZHhfc2V0X2NvdW50KGVudHJpZXMsIDEpOwogCQkJZHhfc2V0X2Jsb2NrKGVudHJpZXMgJiM0MzsgMCwgbmV3YmxvY2spOwotCQkJZHhyb290ID0gKHN0cnVjdCBkeF9yb290ICopZnJhbWVzWzBdLmJoLSZndDtiX2RhdGE7Ci0JCQlkeHJvb3QtJmd0O2luZm8uaW5kaXJlY3RfbGV2ZWxzICYjNDM7PSAxOwomIzQzOwkJCWluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKQomIzQzOwkJCQkJICAgICAgZnJhbWVzWzBdLmJoLSZndDtiX2RhdGEpOwomIzQzOwkJCWlmIChJU19FUlIoaW5mbykpIHsKJiM0MzsJCQkJZXJyID0gUFRSX0VSUihpbmZvKTsKJiM0MzsJCQkJYnJlbHNlKGJoMik7CiYjNDM7CQkJCWdvdG8gam91cm5hbF9lcnJvcjsKJiM0MzsJCQl9CiYjNDM7CQkJaW5mby0mZ3Q7aW5kaXJlY3RfbGV2ZWxzICYjNDM7PSAxOwogCQkJZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRwogCQkJCSAgICAgICAmIzM0O0NyZWF0aW5nICVkIGxldmVsIGluZGV4Li4uXG4mIzM0OywKLQkJCQkgICAgICAgZHhyb290LSZndDtpbmZvLmluZGlyZWN0X2xldmVscykpOwomIzQzOwkJCQkgICAgICAgaW5mby0mZ3Q7aW5kaXJlY3RfbGV2ZWxzKSk7CiAJCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9keF9ub2RlKGhhbmRsZSwgZGlyLCBmcmFtZS0mZ3Q7YmgpOwogCQkJaWYgKGVycikgewogCQkJCWJyZWxzZShiaDIpOwpAQCAtMjY0MSw3ICYjNDM7MjkyMiw3IEBAIHN0YXRpYyBpbnQgZXh0NF9keF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLAogCWV4dDRfc3RkX2Vycm9yKGRpci0mZ3Q7aV9zYiwgZXJyKTsgLyogdGhpcyBpcyBhIG5vLW9wIGlmIGVyciA9PSAwICovCiBjbGVhbnVwOgogCWJyZWxzZShiaCk7Ci0JZHhfcmVsZWFzZShmcmFtZXMpOwomIzQzOwlkeF9yZWxlYXNlKGRpciwgZnJhbWVzKTsKIAkvKiBAcmVzdGFydCBpcyB0cnVlIG1lYW5zIGh0cmVlLXBhdGggaGFzIGJlZW4gY2hhbmdlZCwgd2UgbmVlZCB0bwogCSAqIHJlcGVhdCBkeF9wcm9iZSgpIHRvIGZpbmQgb3V0IHZhbGlkIGh0cmVlLXBhdGgKIAkgKi8KQEAgLTI5MzMsNyAmIzQzOzMyMTQsNyBAQCBpbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAKIAlkZS0mZ3Q7aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0mZ3Q7aV9pbm8pOwogCWRlLSZndDtuYW1lX2xlbiA9IDE7Ci0JZGUtJmd0O3JlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhleHQ0X2Rpcl9yZWNfbGVuKGRlLSZndDtuYW1lX2xlbiwgTlVMTCksCiYjNDM7CWRlLSZndDtyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soZXh0NF9kaXJlbnRfcmVjX2xlbihkZS0mZ3Q7bmFtZV9sZW4sIE5VTEwpLAogCQkJCQkgICBibG9ja3NpemUpOwogCW1lbWNweShkZS0mZ3Q7bmFtZSwgJiMzNDsuJiMzNDssIDIpOwogCWV4dDRfc2V0X2RlX3R5cGUoaW5vZGUtJmd0O2lfc2IsIGRlLCBTX0lGRElSKTsKQEAgLTI5NDUsNyAmIzQzOzMyMjYsNyBAQCBpbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJZXh0NF9zZXRfZGVfdHlwZShpbm9kZS0mZ3Q7aV9zYiwgZGUsIFNfSUZESVIpOwogCWlmIChpbmxpbmVfYnVmKSB7CiAJCWRlLSZndDtyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soCi0JCQkJCWV4dDRfZGlyX3JlY19sZW4oZGUtJmd0O25hbWVfbGVuLCBOVUxMKSwKJiM0MzsJCQkJCWV4dDRfZGlyZW50X3JlY19sZW4oZGUtJmd0O25hbWVfbGVuLCBOVUxMKSwKIAkJCQkJYmxvY2tzaXplKTsKIAkJZGUgPSBleHQ0X25leHRfZW50cnkoZGUsIGJsb2Nrc2l6ZSk7CiAJCWhlYWRlcl9zaXplID0gKGNoYXIgKilkZSAtIGJoLSZndDtiX2RhdGE7CkBAIC0yOTU0LDcgJiM0MzszMjM1LDcgQEAgaW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJYmxvY2tzaXplIC0gY3N1bV9zaXplKTsKIAl9IGVsc2UgewogCQlkZS0mZ3Q7cmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKGJsb2Nrc2l6ZSAtCi0JCQkJCShjc3VtX3NpemUgJiM0MzsgZXh0NF9kaXJfcmVjX2xlbigxLCBOVUxMKSksCiYjNDM7CQkJCQkoY3N1bV9zaXplICYjNDM7IGV4dDRfZGlyZW50X3JlY19sZW4oMSwgTlVMTCkpLAogCQkJCQlibG9ja3NpemUpOwogCX0KIApAQCAtMjk2Niw4ICYjNDM7MzI0Nyw5IEBAIGludCBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAlyZXR1cm4gZXh0NF9oYW5kbGVfZGlydHlfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgYmgpOwogfQogCi1pbnQgZXh0NF9pbml0X25ld19kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsCi0JCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiYjNDM7aW50IGV4dDRfaW5pdF9uZXdfZGlyX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsCiYjNDM7CQkJICAgc3RydWN0IGlub2RlICppbm9kZSwKJiM0MzsJCQkgICBjb25zdCB2b2lkICpkYXRhMSwgY29uc3Qgdm9pZCAqZGF0YTIpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmxvY2sgPSBOVUxMOwogCWV4dDRfbGJsa190IGJsb2NrID0gMDsKQEAgLTMwNzcsOCAmIzQzOzMzNTksOCBAQCBib29sIGV4dDRfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiAJfQogCiAJc2IgPSBpbm9kZS0mZ3Q7aV9zYjsKLQlpZiAoaW5vZGUtJmd0O2lfc2l6ZSAmbHQ7IGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkgJiM0MzsKLQkJCQkJZXh0NF9kaXJfcmVjX2xlbigyLCBOVUxMKSkgewomIzQzOwlpZiAoaW5vZGUtJmd0O2lfc2l6ZSAmbHQ7IGV4dDRfZGlyZW50X3JlY19sZW4oMSwgTlVMTCkgJiM0MzsKJiM0MzsJCQkJCWV4dDRfZGlyZW50X3JlY19sZW4oMiwgTlVMTCkpIHsKIAkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgJiMzNDtpbnZhbGlkIHNpemUmIzM0Oyk7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0zNDY3LDEwICYjNDM7Mzc0OSwxNiBAQCBpbnQgX19leHQ0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJaWYgKElTX0RJUlNZTkMoZGlyKSkKIAkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOwogCiYjNDM7CS8qIEZhc3QtY29tbWl0IGRvZXMgbm90IHJlY29yZCBkaXJkYXRhIGluIGl0cyBqb3VybmFsIGZvcm1hdDsgZm9yY2UgYQomIzQzOwkgKiBmdWxsIGpvdXJuYWwgY29tbWl0IHNvIHRoZSBMVUZJRCBzdXJ2aXZlcyBjcmFzaCYjNDM7cmVwbGF5LiAqLwomIzQzOwlpZiAoZXh0NF9kZW50cnlfZ2V0X2ZpZChkaXItJmd0O2lfc2IsIGRlbnRyeSA/IGRlbnRyeS0mZ3Q7ZF9mc2RhdGEgOiBOVUxMKSkKJiM0MzsJCWV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGRpci0mZ3Q7aV9zYiwgRVhUNF9GQ19SRUFTT05fRElSREFUQSwgaGFuZGxlKTsKJiM0MzsKIAlpbm9kZV9zZXRfY3RpbWVfY3VycmVudChpbm9kZSk7CiAJZXh0NF9pbmNfY291bnQoaW5vZGUpOwogCi0JZXJyID0gX19leHQ0X2FkZF9lbnRyeShoYW5kbGUsIGRpciwgZF9uYW1lLCBpbm9kZSk7CiYjNDM7CWVyciA9IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsIGRfbmFtZSwgaW5vZGUsCiYjNDM7CQkJICAgICAgIGRlbnRyeSA/IGRlbnRyeS0mZ3Q7ZF9mc2RhdGEgOiBOVUxMKTsKIAlpZiAoIWVycikgewogCQllcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiAJCS8qIHRoaXMgY2FuIGhhcHBlbiBvbmx5IGZvciB0bXBmaWxlIGJlaW5nCkBAIC0zNjM5LDcgJiM0MzszOTI3LDggQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZV9kaXJfZmluaXNoKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsCiB9CiAKIHN0YXRpYyBpbnQgZXh0NF9zZXRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCwKLQkJICAgICAgIHVuc2lnbmVkIGlubywgdW5zaWduZWQgZmlsZV90eXBlKQomIzQzOwkJICAgICAgIHVuc2lnbmVkIGlubywgdW5zaWduZWQgZmlsZV90eXBlLAomIzQzOwkJICAgICAgIGNvbnN0IHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKnNyY19maWQpCiB7CiAJaW50IHJldHZhbCwgcmV0dmFsMjsKIApAQCAtMzY0OSw4ICYjNDM7MzkzOCw1NyBAQCBzdGF0aWMgaW50IGV4dDRfc2V0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsCiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIAllbnQtJmd0O2RlLSZndDtpbm9kZSA9IGNwdV90b19sZTMyKGlubyk7Ci0JaWYgKGV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoZW50LSZndDtkaXItJmd0O2lfc2IpKQotCQllbnQtJmd0O2RlLSZndDtmaWxlX3R5cGUgPSBmaWxlX3R5cGU7CiYjNDM7CWlmIChleHQ0X2hhc19mZWF0dXJlX2ZpbGV0eXBlKGVudC0mZ3Q7ZGlyLSZndDtpX3NiKSkgewomIzQzOwkJLyogQ29weSB0aGUgc291cmNlIExVRklEIHBheWxvYWQgaW50byB0aGUgZGVzdGluYXRpb24gc2xvdCB3aGVuCiYjNDM7CQkgKiBib3RoIGNhcnJ5IGEgTFVGSUQgb2YgdGhlIHNhbWUgb24tZGlzayBzaXplLiAgTFVGSUQgaXMKJiM0MzsJCSAqIGlub2RlLXNwZWNpZmljIGFuZCBtdXN0IHRyYXZlbCB3aXRoIHRoZSBpbm9kZSB0aHJvdWdoIHJlbmFtZS4KJiM0MzsJCSAqIENGSEFTSCBieXRlcyBhcmUgbGVmdCBpbi1wbGFjZTogQ0ZIQVNIIGlzIGEgZnVuY3Rpb24gb2YgdGhlCiYjNDM7CQkgKiBkZXN0aW5hdGlvbiBmaWxlbmFtZSwgYW5kIGl0cyBieXRlcyBzaXQgYXQgdGhlIGNvcnJlY3Qgb2Zmc2V0CiYjNDM7CQkgKiBiZWNhdXNlIExVRklEIGFsd2F5cyBwcmVjZWRlcyBDRkhBU0ggaW4gdGhlIGV4dGVuc2lvbiBsYXlvdXQuCiYjNDM7CQkgKiBXaGVuIHNyY19maWQgaXMgTlVMTCwgdGhlIExVRklEIGZsYWcgaXMgc3luY2VkIHRvIHRoZSBMVUZJRAomIzQzOwkJICogYml0IGFscmVhZHkgcHJlc2VudCBpbiBmaWxlX3R5cGU6IGNhbGxlcnMgdGhhdCBjbGVhciBMVUZJRAomIzQzOwkJICogKHJlbmFtZSBvZiBhIG5vbi1MVUZJRCBpbm9kZSwgd2hpdGVvdXQpIHBhc3MgZmlsZV90eXBlIHdpdGgKJiM0MzsJCSAqIExVRklEPTA7IGV4dDRfcmVzZXRlbnQgcGFzc2VzIHRoZSBvcmlnaW5hbCBmaWxlX3R5cGUgc28gdGhlCiYjNDM7CQkgKiBmbGFnIGlzIHJlc3RvcmVkIGZvciBlcnJvciByZWNvdmVyeSB3aXRob3V0IG92ZXJ3cml0aW5nIHRoZQomIzQzOwkJICogTFVGSUQgYnl0ZXMgdGhhdCBhcmUgc3RpbGwgaW50YWN0IG9uIGRpc2suICovCiYjNDM7CQlpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGVudC0mZ3Q7ZGlyLSZndDtpX3NiKSkgewomIzQzOwkJCWlmIChzcmNfZmlkICZhbXA7JmFtcDsgKGVudC0mZ3Q7ZGUtJmd0O2ZpbGVfdHlwZSAmYW1wOyBFWFQ0X0RJUkVOVF9MVUZJRCkpIHsKJiM0MzsJCQkJdW5zaWduZWQgaW50IHJlY19sZW4gPQomIzQzOwkJCQkJZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhlbnQtJmd0O2RlLSZndDtyZWNfbGVuLAomIzQzOwkJCQkJCWVudC0mZ3Q7ZGlyLSZndDtpX3NiLSZndDtzX2Jsb2Nrc2l6ZSk7CiYjNDM7CQkJCXVuc2lnbmVkIGludCBkZGhfb2ZmID0KJiM0MzsJCQkJCUVYVDRfQkFTRV9ESVJfTEVOICYjNDM7IGVudC0mZ3Q7ZGUtJmd0O25hbWVfbGVuICYjNDM7IDE7CiYjNDM7CQkJCXN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqZGRoID0KJiM0MzsJCQkJCShzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIgKikKJiM0MzsJCQkJCSgoY2hhciAqKWVudC0mZ3Q7ZGUgJiM0MzsgZGRoX29mZik7CiYjNDM7CQkJCXVuc2lnbmVkIGludCBjb3B5X2xlbiA9IHNyY19maWQtJmd0O2RmX2hlYWRlci5kZGhfbGVuZ3RoOwomIzQzOwomIzQzOwkJCQlpZiAoZGRoX29mZiAmIzQzOyBzaXplb2YoKmRkaCkgJmd0OyByZWNfbGVuIHx8CiYjNDM7CQkJCSAgICBkZGgtJmd0O2RkaF9sZW5ndGggIT0gY29weV9sZW4gfHwKJiM0MzsJCQkJICAgIGRkaF9vZmYgJiM0MzsgY29weV9sZW4gJmd0OyByZWNfbGVuKSB7CiYjNDM7CQkJCQkvKiBDYW5ub3QgY29weTogY2xlYXIgdGhlIGZsYWcgc28gdGhlCiYjNDM7CQkJCQkgKiBzbG90IGRvZXMgbm90IGFkdmVydGlzZSBhIHN0YWxlIExVRklECiYjNDM7CQkJCQkgKiBmcm9tIHRoZSBvbGQgaW5vZGUuICovCiYjNDM7CQkJCQllbnQtJmd0O2RlLSZndDtmaWxlX3R5cGUgJmFtcDs9IH5FWFQ0X0RJUkVOVF9MVUZJRDsKJiM0MzsJCQkJfSBlbHNlIHsKJiM0MzsJCQkJCW1lbWNweShkZGgsIHNyY19maWQsIGNvcHlfbGVuKTsKJiM0MzsJCQkJfQomIzQzOwkJCX0gZWxzZSBpZiAoIXNyY19maWQpIHsKJiM0MzsJCQkJLyogU3luYyB0aGUgTFVGSUQgZmxhZyB3aXRoIHdoYXQgZmlsZV90eXBlIHJlcXVlc3RzLgomIzQzOwkJCQkgKiBGb3Igbm9ybWFsIHJlbmFtZSAoc291cmNlIGhhcyBubyBMVUZJRCkgYW5kIGZvcgomIzQzOwkJCQkgKiB0aGUgd2hpdGVvdXQgc2V0ZW50LCBmaWxlX3R5cGUgY2FycmllcyBMVUZJRD0wLAomIzQzOwkJCQkgKiBzbyB3ZSBjbGVhciB0aGUgc3RhbGUgZmxhZy4gIEZvciBleHQ0X3Jlc2V0ZW50CiYjNDM7CQkJCSAqIChlcnJvciByZWNvdmVyeSksIGZpbGVfdHlwZSBpcyB0aGUgb3JpZ2luYWwKJiM0MzsJCQkJICogZmlsZV90eXBlIHdpdGggTFVGSUQ9MSwgc28gd2UgcmVzdG9yZSB0aGUgZmxhZyDigJQKJiM0MzsJCQkJICogdGhlIExVRklEIGJ5dGVzIGFyZSBzdGlsbCBvbiBkaXNrIHVudG91Y2hlZC4gKi8KJiM0MzsJCQkJZW50LSZndDtkZS0mZ3Q7ZmlsZV90eXBlID0KJiM0MzsJCQkJCShlbnQtJmd0O2RlLSZndDtmaWxlX3R5cGUgJmFtcDsgfkVYVDRfRElSRU5UX0xVRklEKSB8CiYjNDM7CQkJCQkoZmlsZV90eXBlICZhbXA7IEVYVDRfRElSRU5UX0xVRklEKTsKJiM0MzsJCQl9CiYjNDM7CQl9CiYjNDM7CQllbnQtJmd0O2RlLSZndDtmaWxlX3R5cGUgPSAoZmlsZV90eXBlICZhbXA7IEVYVDRfRlRfTUFTSykgfAomIzQzOwkJCQkgICAgIChlbnQtJmd0O2RlLSZndDtmaWxlX3R5cGUgJmFtcDsgfkVYVDRfRlRfTUFTSyk7CiYjNDM7CX0KIAlpbm9kZV9pbmNfaXZlcnNpb24oZW50LSZndDtkaXIpOwogCWlub2RlX3NldF9tdGltZV90b190cyhlbnQtJmd0O2RpciwgaW5vZGVfc2V0X2N0aW1lX2N1cnJlbnQoZW50LSZndDtkaXIpKTsKIAlyZXR2YWwgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBlbnQtJmd0O2Rpcik7CkBAIC0zNjg3LDcgJiM0Mzs0MDI1LDcgQEAgc3RhdGljIHZvaWQgZXh0NF9yZXNldGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9yZW5hbWVudCAqZW50LAogCQlyZXR1cm47CiAJfQogCi0JZXh0NF9zZXRlbnQoaGFuZGxlLCAmYW1wO29sZCwgaW5vLCBmaWxlX3R5cGUpOwomIzQzOwlleHQ0X3NldGVudChoYW5kbGUsICZhbXA7b2xkLCBpbm8sIGZpbGVfdHlwZSwgTlVMTCk7CiAJYnJlbHNlKG9sZC5iaCk7CiB9CiAKQEAgLTM3ODYsNiAmIzQzOzQxMjQsMzIgQEAgc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0NF93aGl0ZW91dF9mb3JfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLAogCXJldHVybiB3aDsKIH0KIAomIzQzOy8qCiYjNDM7ICogZXh0NF9sdWZpZF9zbmFwc2hvdCAtIGNvcHkgdGhlIExVRklEIHJlY29yZCBmcm9tIGEgZGlyZWN0b3J5IGVudHJ5CiYjNDM7ICoKJiM0MzsgKiBBbGxvY2F0ZXMgYW5kIHJldHVybnMgYSBrbWVtZHVwJiMzOTtkIGNvcHkgb2YgdGhlIGZ1bGwgb24tZGlzayBMVUZJRCByZWNvcmQKJiM0MzsgKiAoaGVhZGVyICYjNDM7IEZJRCBwYXlsb2FkIG9mIGFyYml0cmFyeSBsZW5ndGgpLiAgUmV0dXJucyBOVUxMIGlmIG5vIExVRklEIGlzCiYjNDM7ICogcHJlc2VudCwgdGhlIHJlY29yZCBpcyBtYWxmb3JtZWQsIG9yIGFsbG9jYXRpb24gZmFpbHMuICBDYWxsZXIgbXVzdCBrZnJlZSgpLgomIzQzOyAqLwomIzQzO3N0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICoKJiM0MztleHQ0X2x1ZmlkX3NuYXBzaG90KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBkZGhfb2ZmID0gRVhUNF9CQVNFX0RJUl9MRU4gJiM0MzsgZGUtJmd0O25hbWVfbGVuICYjNDM7IDE7CiYjNDM7CXVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS0mZ3Q7cmVjX2xlbiwgYmxvY2tzaXplKTsKJiM0MzsJc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGlza19maWQ7CiYjNDM7CXVuc2lnbmVkIGludCBkbGVuOwomIzQzOwomIzQzOwlpZiAoIShkZS0mZ3Q7ZmlsZV90eXBlICZhbXA7IEVYVDRfRElSRU5UX0xVRklEKSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlpZiAoZGRoX29mZiAmIzQzOyBzaXplb2YoZGlza19maWQtJmd0O2RmX2hlYWRlcikgJmd0OyByZWNfbGVuKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CWRpc2tfZmlkID0gKHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKikoKGNoYXIgKilkZSAmIzQzOyBkZGhfb2ZmKTsKJiM0MzsJZGxlbiA9IGRpc2tfZmlkLSZndDtkZl9oZWFkZXIuZGRoX2xlbmd0aDsKJiM0MzsJaWYgKGRsZW4gJmx0OyBzaXplb2YoZGlza19maWQtJmd0O2RmX2hlYWRlcikgfHwgZGRoX29mZiAmIzQzOyBkbGVuICZndDsgcmVjX2xlbikKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwlyZXR1cm4ga21lbWR1cChkaXNrX2ZpZCwgZGxlbiwgR0ZQX05PRlMpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBBbnlib2R5IGNhbiByZW5hbWUgYW55dGhpbmcgd2l0aCB0aGlzOiB0aGUgcGVybWlzc2lvbiBjaGVja3MgYXJlIGxlZnQgdG8gdGhlCiAgKiBoaWdoZXItbGV2ZWwgcm91dGluZXMuCkBAIC0zODE0LDYgJiM0Mzs0MTc4LDcgQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLAogCXN0cnVjdCBpbm9kZSAqd2hpdGVvdXQgPSBOVUxMOwogCWludCBjcmVkaXRzOwogCXU4IG9sZF9maWxlX3R5cGU7CiYjNDM7CXN0cnVjdCBleHQ0X2RpcmVudF9maWQgKm9sZF9maWQgPSBOVUxMOwogCiAJaWYgKG5ldy5pbm9kZSAmYW1wOyZhbXA7IG5ldy5pbm9kZS0mZ3Q7aV9ubGluayA9PSAwKSB7CiAJCUVYVDRfRVJST1JfSU5PREUobmV3Lmlub2RlLApAQCAtMzkyNSw3ICYjNDM7NDI5MCw3IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpciwKIAkJICogdG8gYmUgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIHZhbGlkIG9sZCBlbnRyeS4KIAkJICovCiAJCXJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgJmFtcDtvbGQsIHdoaXRlb3V0LSZndDtpX2lubywKLQkJCQkgICAgIEVYVDRfRlRfQ0hSREVWKTsKJiM0MzsJCQkJICAgICBFWFQ0X0ZUX0NIUkRFViwgTlVMTCk7CiAJCWlmIChyZXR2YWwpCiAJCQlnb3RvIGVuZF9yZW5hbWU7CiAJCXJldHZhbCA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIHdoaXRlb3V0KTsKQEAgLTM5MzgsOCAmIzQzOzQzMDMsMTggQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLAogCQlpZiAocmV0dmFsKQogCQkJZ290byBlbmRfcmVuYW1lOwogCX0gZWxzZSB7CiYjNDM7CQlpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKG9sZC5kaXItJmd0O2lfc2IpKSB7CiYjNDM7CQkJb2xkX2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3Qob2xkLmRlLAomIzQzOwkJCQkJCSAgICAgIG9sZC5kaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKJiM0MzsJCQlpZiAob2xkX2ZpZCkKJiM0MzsJCQkJZXh0NF9mY19tYXJrX2luZWxpZ2libGUob2xkLmRpci0mZ3Q7aV9zYiwKJiM0MzsJCQkJCQkJRVhUNF9GQ19SRUFTT05fRElSREFUQSwKJiM0MzsJCQkJCQkJaGFuZGxlKTsKJiM0MzsJCQllbHNlCiYjNDM7CQkJCW9sZF9maWxlX3R5cGUgJmFtcDs9IH5FWFQ0X0RJUkVOVF9MVUZJRDsKJiM0MzsJCX0KIAkJcmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCAmYW1wO25ldywKLQkJCQkgICAgIG9sZC5pbm9kZS0mZ3Q7aV9pbm8sIG9sZF9maWxlX3R5cGUpOwomIzQzOwkJCQkgICAgIG9sZC5pbm9kZS0mZ3Q7aV9pbm8sIG9sZF9maWxlX3R5cGUsIG9sZF9maWQpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBlbmRfcmVuYW1lOwogCX0KQEAgLTQwMjYsNiAmIzQzOzQ0MDEsNyBAQCBzdGF0aWMgaW50IGV4dDRfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCiAJcmV0dmFsID0gMDsKIAogZW5kX3JlbmFtZToKJiM0MzsJa2ZyZWUob2xkX2ZpZCk7CiAJaWYgKHdoaXRlb3V0KSB7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWV4dDRfcmVzZXRlbnQoaGFuZGxlLCAmYW1wO29sZCwKQEAgLTQwNjIsOCAmIzQzOzQ0MzgsOSBAQCBzdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKIAkJLmRlbnRyeSA9IG5ld19kZW50cnksCiAJCS5pbm9kZSA9IGRfaW5vZGUobmV3X2RlbnRyeSksCiAJfTsKLQl1OCBuZXdfZmlsZV90eXBlOwomIzQzOwl1OCBuZXdfZmlsZV90eXBlLCBvbGRfZGVfZmlsZV90eXBlOwogCWludCByZXR2YWw7CiYjNDM7CXN0cnVjdCBleHQ0X2RpcmVudF9maWQgKm9sZF9maWQgPSBOVUxMLCAqbmV3X2ZpZCA9IE5VTEw7CiAKIAlpZiAoKGV4dDRfdGVzdF9pbm9kZV9mbGFnKG5ld19kaXIsIEVYVDRfSU5PREVfUFJPSklOSEVSSVQpICZhbXA7JmFtcDsKIAkgICAgICFwcm9qaWRfZXEoRVhUNF9JKG5ld19kaXIpLSZndDtpX3Byb2ppZCwKQEAgLTQxNDIsMTIgJiM0Mzs0NTE5LDI3IEBAIHN0YXRpYyBpbnQgZXh0NF9jcm9zc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAogCQkJZ290byBlbmRfcmVuYW1lOwogCX0KIAomIzQzOwlpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKG9sZC5kaXItJmd0O2lfc2IpKSB7CiYjNDM7CQlvbGRfZmlkID0gZXh0NF9sdWZpZF9zbmFwc2hvdChvbGQuZGUsIG9sZC5kaXItJmd0O2lfc2ItJmd0O3NfYmxvY2tzaXplKTsKJiM0MzsJCW5ld19maWQgPSBleHQ0X2x1ZmlkX3NuYXBzaG90KG5ldy5kZSwgbmV3LmRpci0mZ3Q7aV9zYi0mZ3Q7c19ibG9ja3NpemUpOwomIzQzOwkJaWYgKG9sZF9maWQgfHwgbmV3X2ZpZCkKJiM0MzsJCQlleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShvbGQuZGlyLSZndDtpX3NiLAomIzQzOwkJCQkJCUVYVDRfRkNfUkVBU09OX0RJUkRBVEEsIGhhbmRsZSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJb2xkX2RlX2ZpbGVfdHlwZSA9IG9sZC5kZS0mZ3Q7ZmlsZV90eXBlOwomIzQzOwlpZiAoIW9sZF9maWQpCiYjNDM7CQlvbGRfZGVfZmlsZV90eXBlICZhbXA7PSB+RVhUNF9ESVJFTlRfTFVGSUQ7CiAJbmV3X2ZpbGVfdHlwZSA9IG5ldy5kZS0mZ3Q7ZmlsZV90eXBlOwotCXJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgJmFtcDtuZXcsIG9sZC5pbm9kZS0mZ3Q7aV9pbm8sIG9sZC5kZS0mZ3Q7ZmlsZV90eXBlKTsKJiM0MzsJaWYgKCFuZXdfZmlkKQomIzQzOwkJbmV3X2ZpbGVfdHlwZSAmYW1wOz0gfkVYVDRfRElSRU5UX0xVRklEOwomIzQzOwlyZXR2YWwgPSBleHQ0X3NldGVudChoYW5kbGUsICZhbXA7bmV3LCBvbGQuaW5vZGUtJmd0O2lfaW5vLCBvbGRfZGVfZmlsZV90eXBlLAomIzQzOwkJCSAgICAgb2xkX2ZpZCk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlbmRfcmVuYW1lOwogCi0JcmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCAmYW1wO29sZCwgbmV3Lmlub2RlLSZndDtpX2lubywgbmV3X2ZpbGVfdHlwZSk7CiYjNDM7CXJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgJmFtcDtvbGQsIG5ldy5pbm9kZS0mZ3Q7aV9pbm8sIG5ld19maWxlX3R5cGUsCiYjNDM7CQkJICAgICBuZXdfZmlkKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVuZF9yZW5hbWU7CiAKQEAgLTQxODAsNiAmIzQzOzQ1NzIsOCBAQCBzdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKIAlyZXR2YWwgPSAwOwogCiBlbmRfcmVuYW1lOgomIzQzOwlrZnJlZShvbGRfZmlkKTsKJiM0MzsJa2ZyZWUobmV3X2ZpZCk7CiAJYnJlbHNlKG9sZC5kaXJfYmgpOwogCWJyZWxzZShuZXcuZGlyX2JoKTsKIAlicmVsc2Uob2xkLmJoKTsKQEAgLTQyMTYsNiAmIzQzOzQ2MTAsMTU0IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLAogCXJldHVybiBleHQ0X3JlbmFtZShpZG1hcCwgb2xkX2Rpciwgb2xkX2RlbnRyeSwgbmV3X2RpciwgbmV3X2RlbnRyeSwgZmxhZ3MpOwogfQogCiYjNDM7LyoKJiM0MzsgKiBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkKCkgLSBTZXQgTFVGSUQgZGF0YSBvbiBhbiBleGlzdGluZyBkaXJlY3RvcnkgZW50cnkKJiM0MzsgKiBAZGlyOiAgICAgICAgcGFyZW50IGRpcmVjdG9yeSBpbm9kZQomIzQzOyAqIEBmaWxlbmFtZTogICBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSBkaXJlY3RvcnkKJiM0MzsgKiBAbmFtZWxlbjogICAgbGVuZ3RoIG9mIGZpbGVuYW1lCiYjNDM7ICogQGVkcDogICAgICAgIHBvaW50ZXIgdG8gaW5pdGlhbGl6ZWQgZGVudHJ5IHBhcmFtIHdpdGggTFVGSUQgZGF0YQomIzQzOyAqCiYjNDM7ICogVGhpcyBmdW5jdGlvbiBmaW5kcyBhbiBleGlzdGluZyBkaXJlY3RvcnkgZW50cnksIGRlbGV0ZXMgaXQsIGFuZCByZS1jcmVhdGVzIGl0CiYjNDM7ICogd2l0aCBMVUZJRCBkYXRhIGF0dGFjaGVkLiBVc2VkIGJ5IHRoZSBFWFQ0X0lPQ19TRVRfTFVGSUQgaW9jdGwuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgomIzQzOyAqLwomIzQzO2ludCBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKJiM0MzsJCQkgICAgaW50IG5hbWVsZW4sIHN0cnVjdCBleHQ0X2RlbnRyeV9wYXJhbSAqZWRwKQomIzQzO3sKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0mZ3Q7aV9zYjsKJiM0MzsJIC8qIHplcm8taW5pdDogc2FmZSB0byBmcmVlIG9uIGFueSBwYXRoICovCiYjNDM7CXN0cnVjdCBleHQ0X2ZpbGVuYW1lIGZuYW1lID0ge307CiYjNDM7CXN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSA9IE5VTEw7CiYjNDM7CXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwomIzQzOwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKJiM0MzsJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CiYjNDM7CXN0cnVjdCBxc3RyIGRfbmFtZTsKJiM0MzsJaW50IGVyciA9IDA7CiYjNDM7CiYjNDM7CWlmICghZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKHNiKSkKJiM0MzsJCXJldHVybiAtRU9QTk9UU1VQUDsKJiM0MzsKJiM0MzsJaWYgKG5hbWVsZW4gJmd0OyBFWFQ0X05BTUVfTEVOKQomIzQzOwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CiYjNDM7CWlmIChuYW1lbGVuICE9IHN0cm5sZW4oZmlsZW5hbWUsIG5hbWVsZW4gJiM0MzsgMSkpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKJiM0MzsJZF9uYW1lLm5hbWUgPSBmaWxlbmFtZTsKJiM0MzsJZF9uYW1lLmxlbiA9IG5hbWVsZW47CiYjNDM7CiYjNDM7CWVyciA9IGV4dDRfZm5hbWVfc2V0dXBfZmlsZW5hbWUoZGlyLCAmYW1wO2RfbmFtZSwgMCwgJmFtcDtmbmFtZSk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlnb3RvIG91dF9mcmVlOwomIzQzOwomIzQzOwkvKiBMb2NrIGRpciB3aXRoIHRoZSBWRlMgcGFyZW50LW11dGF0aW9uIHN1YmNsYXNzIGJlZm9yZSBzdGFydGluZyB0aGUKJiM0MzsJICogam91cm5hbC4gIEhvbGRpbmcgaV9yd3NlbSB3aGlsZSBjYWxsaW5nIGV4dDRfam91cm5hbF9zdGFydCgpIGlzIHNhZmUKJiM0MzsJICogKGV4dDRfc2V0YXR0ciwgZXh0NF9mYWxsb2NhdGUgZXRjLiBkbyB0aGUgc2FtZSkuICBUaGUgbG9va3VwIG11c3QgYmUKJiM0MzsJICogaW5zaWRlIHRoZSBsb2NrIHRvIHByZXZlbnQgVE9DVE9VOiB0aGUgYmgvZGUgcG9pbnRlcnMgbXVzdCBiZSBzdGFibGUKJiM0MzsJICogZnJvbSBmaW5kX2VudHJ5IHRocm91Z2ggZGVsZXRlX2VudHJ5LiAqLwomIzQzOwlpbm9kZV9sb2NrX25lc3RlZChkaXIsIElfTVVURVhfUEFSRU5UKTsKJiM0MzsKJiM0MzsJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGRpciwgRVhUNF9IVF9ESVIsCiYjNDM7CQkJCSAgICAzICogRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhzYikgJiM0MzsKJiM0MzsJCQkJICAgIDIgKiBFWFQ0X0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyk7CiYjNDM7CWlmIChJU19FUlIoaGFuZGxlKSkgewomIzQzOwkJZXJyID0gUFRSX0VSUihoYW5kbGUpOwomIzQzOwkJaGFuZGxlID0gTlVMTDsKJiM0MzsJCWdvdG8gb3V0X3VubG9ja19kaXI7CiYjNDM7CX0KJiM0MzsKJiM0MzsJYmggPSBleHQ0X2ZpbmRfZW50cnkoZGlyLCAmYW1wO2RfbmFtZSwgJmFtcDtkZSwgTlVMTCk7CiYjNDM7CWlmIChJU19FUlIoYmgpKSB7CiYjNDM7CQllcnIgPSBQVFJfRVJSKGJoKTsKJiM0MzsJCWJoID0gTlVMTDsKJiM0MzsJCWdvdG8gb3V0X2pvdXJuYWw7CiYjNDM7CX0KJiM0MzsJaWYgKCFiaCkgewomIzQzOwkJZXJyID0gLUVOT0VOVDsKJiM0MzsJCWdvdG8gb3V0X2pvdXJuYWw7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaW5vZGUgPSBleHQ0X2lnZXQoc2IsIGxlMzJfdG9fY3B1KGRlLSZndDtpbm9kZSksIEVYVDRfSUdFVF9OT1JNQUwpOwomIzQzOwlpZiAoSVNfRVJSKGlub2RlKSkgewomIzQzOwkJZXJyID0gUFRSX0VSUihpbm9kZSk7CiYjNDM7CQlpbm9kZSA9IE5VTEw7CiYjNDM7CQlnb3RvIG91dF9icmVsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogTG9jayB0aGUgdGFyZ2V0IGlub2RlIGFmdGVyIHRoZSBkaXJlY3RvcnkgKGRpci10aGVuLWNoaWxkIG9yZGVyaW5nKQomIzQzOwkgKiB0byBzZXJpYWxpemUgY29uY3VycmVudCBFWFQ0X0lPQ19TRVRfTFVGSUQgY2FsbHMgb24gZGlmZmVyZW50CiYjNDM7CSAqIGhhcmRsaW5rcyBvZiB0aGUgc2FtZSBpbm9kZS4gIFVzZSBJX01VVEVYX0NISUxEIGZvciBkaXJlY3RvcnkgaW5vZGVzCiYjNDM7CSAqIChjb25zaXN0ZW50IHdpdGggVkZTIHJlbmFtZS9ybWRpcikgYW5kIElfTVVURVhfTk9ORElSMiBmb3IgYWxsCiYjNDM7CSAqIG90aGVyczsgbWl4aW5nIHN1YmNsYXNzZXMgb24gdGhlIHNhbWUgaW5vZGUgdHJpZ2dlcnMgbG9ja2RlcCBjeWNsZXMKJiM0MzsJICogd2l0aCBjb25jdXJyZW50IHJlbmFtZS4gKi8KJiM0MzsJaWYgKGlub2RlICE9IGRpcikgewomIzQzOwkJaWYgKFNfSVNESVIoaW5vZGUtJmd0O2lfbW9kZSkpCiYjNDM7CQkJaW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfQ0hJTEQpOwomIzQzOwkJZWxzZQomIzQzOwkJCWlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX05PTkRJUjIpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IGV4dDRfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJZ290byBvdXRfdW5sb2NrOwomIzQzOwomIzQzOwlicmVsc2UoYmgpOwomIzQzOwliaCA9IE5VTEw7CiYjNDM7CiYjNDM7CS8qIFJlLWFkZCB3aXRoIExVRklEIHZpYSBkZW50cnktJmd0O2RfZnNkYXRhLiAgZXh0NF9hZGRfZW50cnkoKSByZXNvbHZlcwomIzQzOwkgKiBkZmlkIGZyb20gZF9mc2RhdGEgaW50byBmbmFtZS5kZmlkIGFuZCBwYXNzZXMgaXQgdGhyb3VnaCB0bwomIzQzOwkgKiBhZGRfZGlyZW50X3RvX2J1ZigpIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHNoYXJlZCBpX2RpcmRhdGEgZmllbGQsCiYjNDM7CSAqIGVsaW1pbmF0aW5nIHRoZSByYWNlIHdpdGggY29uY3VycmVudCBsaW5rKCkgY2FsbHMuICovCiYjNDM7CXsKJiM0MzsJCXN0cnVjdCBkZW50cnkgcGFyZW50X2RlbnRyeSA9IHsgLmRfaW5vZGUgPSBkaXIgfTsKJiM0MzsJCXN0cnVjdCBkZW50cnkgbmV3X2RlbnRyeSA9IHsKJiM0MzsJCQkuZF9uYW1lID0gZF9uYW1lLAomIzQzOwkJCS5kX3BhcmVudCA9ICZhbXA7cGFyZW50X2RlbnRyeSwKJiM0MzsJCQkuZF9pbm9kZSA9IGlub2RlLAomIzQzOwkJCS5kX2ZzZGF0YSA9IGVkcCwKJiM0MzsJCX07CiYjNDM7CQllcnIgPSBleHQ0X2FkZF9lbnRyeShoYW5kbGUsICZhbXA7bmV3X2RlbnRyeSwgaW5vZGUpOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChlcnIpIHsKJiM0MzsJCS8qIERlbGV0ZSBzdWNjZWVkZWQgYnV0IHJlLWFkZCBmYWlsZWQ7IHRyeSB0byByZXN0b3JlIHNvIHRoZQomIzQzOwkJICogaW5vZGUgaXMgbm90IGxlZnQgd2l0aG91dCBhIGRpcmVjdG9yeSBlbnRyeS4gKi8KJiM0MzsJCXN0cnVjdCBkZW50cnkgcGFyZW50X2RlbnRyeSA9IHsgLmRfaW5vZGUgPSBkaXIgfTsKJiM0MzsJCXN0cnVjdCBkZW50cnkgb3JpZ19kZW50cnkgPSB7CiYjNDM7CQkJLmRfbmFtZSA9IGRfbmFtZSwKJiM0MzsJCQkuZF9wYXJlbnQgPSAmYW1wO3BhcmVudF9kZW50cnksCiYjNDM7CQkJLmRfaW5vZGUgPSBpbm9kZSwKJiM0MzsJCX07CiYjNDM7CQlpbnQgcm9sbGJhY2tfZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCAmYW1wO29yaWdfZGVudHJ5LCBpbm9kZSk7CiYjNDM7CiYjNDM7CQlpZiAocm9sbGJhY2tfZXJyKQomIzQzOwkJCUVYVDRfRVJST1JfSU5PREUoZGlyLAomIzQzOwkJCQkmIzM0O0ZhaWxlZCB0byBzZXQgTFVGSUQgb24gJiMzOTslLipzJiMzOTsgKGVycj0lZCkgYW5kIGZhaWxlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXJlY3RvcnkgZW50cnkgKGVycj0lZCk7IGlub2RlICVsbHUgbWF5IGJlIG9ycGhhbmVkJiMzNDssCiYjNDM7CQkJCW5hbWVsZW4sIGZpbGVuYW1lLCBlcnIsIHJvbGxiYWNrX2VyciwKJiM0MzsJCQkJaW5vZGUtJmd0O2lfaW5vKTsKJiM0MzsJCWdvdG8gb3V0X3VubG9jazsKJiM0MzsJfQomIzQzOwomIzQzOwlpbm9kZV9zZXRfY3RpbWVfY3VycmVudChkaXIpOwomIzQzOwlpbm9kZV9pbmNfaXZlcnNpb24oZGlyKTsKJiM0MzsJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKJiM0MzsKJiM0MztvdXRfdW5sb2NrOgomIzQzOwlpZiAoaW5vZGUgIT0gZGlyKQomIzQzOwkJaW5vZGVfdW5sb2NrKGlub2RlKTsKJiM0MztvdXRfYnJlbHNlOgomIzQzOwlicmVsc2UoYmgpOwomIzQzO291dF9qb3VybmFsOgomIzQzOwlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwomIzQzO291dF91bmxvY2tfZGlyOgomIzQzOwlpbm9kZV91bmxvY2soZGlyKTsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7b3V0X2ZyZWU6CiYjNDM7CWV4dDRfZm5hbWVfZnJlZV9maWxlbmFtZSgmYW1wO2ZuYW1lKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVycjsKJiM0Mzt9CiYjNDM7CiAvKgogICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KICAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zeXNmcy5jIGIvZnMvZXh0NC9zeXNmcy5jCmluZGV4IDkyM2IzNzVlMDE3ZmFhLi44MDA3NGZiMTVlZTliNyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zeXNmcy5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2V4dDQvc3lzZnMuYwpAQCAtMzYyLDYgJiM0MzszNjIsNyBAQCBFWFQ0X0FUVFJfRkVBVFVSRSh2ZXJpdHkpOwogI2VuZGlmCiBFWFQ0X0FUVFJfRkVBVFVSRShtZXRhZGF0YV9jc3VtX3NlZWQpOwogRVhUNF9BVFRSX0ZFQVRVUkUoZmFzdF9jb21taXQpOwomIzQzO0VYVDRfQVRUUl9GRUFUVVJFKGRpcmRhdGEpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpICZhbXA7JmFtcDsgZGVmaW5lZChDT05GSUdfRlNfRU5DUllQVElPTikKIEVYVDRfQVRUUl9GRUFUVVJFKGVuY3J5cHRlZF9jYXNlZm9sZCk7CiAjZW5kaWYKQEAgLTM4NSw2ICYjNDM7Mzg2LDcgQEAgc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmV4dDRfZmVhdF9hdHRyc1tdID0gewogI2VuZGlmCiAJQVRUUl9MSVNUKG1ldGFkYXRhX2NzdW1fc2VlZCksCiAJQVRUUl9MSVNUKGZhc3RfY29tbWl0KSwKJiM0MzsJQVRUUl9MSVNUKGRpcmRhdGEpLAogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpICZhbXA7JmFtcDsgZGVmaW5lZChDT05GSUdfRlNfRU5DUllQVElPTikKIAlBVFRSX0xJU1QoZW5jcnlwdGVkX2Nhc2Vmb2xkKSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9leHQ0LmgKaW5kZXggOWM2ODM5OTFjMzJmOTYuLjkxMzRmZTY0OTQ3YTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZXh0NC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9saW51eC9leHQ0LmgKQEAgLTM1LDYgJiM0MzszNSw3IEBACiAjZGVmaW5lIEVYVDRfSU9DX1NFVEZTVVVJRAkJX0lPVygmIzM5O2YmIzM5OywgNDQsIHN0cnVjdCBmc3V1aWQpCiAjZGVmaW5lIEVYVDRfSU9DX0dFVF9UVU5FX1NCX1BBUkFNCV9JT1IoJiMzOTtmJiMzOTssIDQ1LCBzdHJ1Y3QgZXh0NF90dW5lX3NiX3BhcmFtcykKICNkZWZpbmUgRVhUNF9JT0NfU0VUX1RVTkVfU0JfUEFSQU0JX0lPVygmIzM5O2YmIzM5OywgNDYsIHN0cnVjdCBleHQ0X3R1bmVfc2JfcGFyYW1zKQomIzQzOyNkZWZpbmUgRVhUNF9JT0NfU0VUX0xVRklECQlfSU9XKCYjMzk7ZiYjMzk7LCA0Nywgc3RydWN0IGV4dDRfc2V0X2x1ZmlkKQogCiAjZGVmaW5lIEVYVDRfSU9DX1NIVVRET1dOIF9JT1IoJiMzOTtYJiMzOTssIDEyNSwgX191MzIpCiAKQEAgLTkyLDYgJiM0Mzs5MywxOSBAQCBzdHJ1Y3QgbW92ZV9leHRlbnQgewogCV9fdTY0IG1vdmVkX2xlbjsJLyogbW92ZWQgYmxvY2sgbGVuZ3RoICovCiB9OwogCiYjNDM7LyoKJiM0MzsgKiBTdHJ1Y3R1cmUgZm9yIEVYVDRfSU9DX1NFVF9MVUZJRAomIzQzOyAqIFNldHMgTFVGSUQgb24gYSBkaXJlY3RvcnkgZW50cnkKJiM0MzsgKiBDYWxsZWQgb24gcGFyZW50IGRpcmVjdG9yeSB3aXRoIGZpbGVuYW1lIGFuZCBMVUZJRCBkYXRhIGFzIGFyZ3VtZW50cwomIzQzOyAqLwomIzQzO3N0cnVjdCBleHQ0X3NldF9sdWZpZCB7CiYjNDM7CV9fdTggZXNsX25hbWVfbGVuOwkvKiBsZW5ndGggb2YgZmlsZW5hbWUsIE5PVCBpbmNsdWRpbmcgTlVMIHRlcm1pbmF0b3IKJiM0MzsJCQkJICogKHZhbGlkIHJhbmdlOiAxLTI1NSwgbWF0Y2hpbmcgRVhUNF9OQU1FX0xFTikgKi8KJiM0MzsJY2hhciAgZXNsX25hbWVbMjU1ICYjNDM7IDFdOyAvKiBmaWxlbmFtZSAoTlVMLXRlcm1pbmF0ZWQpICovCiYjNDM7CV9fdTggZXNsX2RhdGFfbGVuOwkvKiBsZW5ndGggb2YgTFVGSUQgZGF0YSAqLwomIzQzOwljaGFyICBlc2xfZGF0YVsyNTVdOyAvKiBMVUZJRCBkYXRhIChyYXcgYnl0ZXMpICovCiYjNDM7fTsKJiM0MzsKIC8qCiAgKiBGbGFncyB1c2VkIGJ5IEVYVDRfSU9DX1NIVVRET1dOCiAgKi8KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQzMTkKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAzNDUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgYGRpcmRhdGFgIFBhdGNoIGZvciBleHQ0KioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGlzIHBhdGNoIGZvciBleHQ0IHRoYXQgaW50cm9kdWNlcyBgZGlyZGF0YWAsIHVzaW5nIGBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQWAgYW5kIHRoZSBgRVhUNF9JT0NfU0VUX0xVRklEYCBpb2N0bC4gUmlnaHQgb2ZmIHRoZSBiYXQsIEkgc2VlIHRoaXMgaXMgYSAqZnVuY3Rpb25hbCogY2hhbmdlIOKAkyB3ZSYjMzk7cmUgdGFsa2luZyBhYm91dCBuZXcgaW9jdGwgaGFuZGxpbmcsIGRpcmVjdG9yeSBlbnRyeSBwYXJzaW5nIGNoYW5nZXMsIG5ldyBzdHJ1Y3R1cmVzLCB0aGUgd29ya3MuIERlZmluaXRlbHkgZnV6ei13b3J0aHkuIExldCYjMzk7cyBwaW5wb2ludCB0aG9zZSBrZXkgZnVuY3Rpb25zIHRvIHRhcmdldC4KCkxvb2tpbmcgb3ZlciB0aGUgY29kZSwgaXQgbG9va3MgbGlrZSB0aGVzZSBhcmUgdGhlIGhvdHNwb3RzOiBgZXh0NF9pb2N0bF9zZXRfbHVmaWRgLCBgZXh0NF9kaXJkYXRhX3NldF9sdWZpZGAsIGBleHQ0X2RpcmRhdGFfZ2V0YCwgYGV4dDRfZGlyZGF0YV9zZXRgLCBgZXh0NF9sdWZpZF9zbmFwc2hvdGAsIGBleHQ0X2luc2VydF9kZW50cnlfZGF0YWAsIGFuZCBgZXh0NF9pbml0X25ld19kaXJfZGF0YWAuIE15IGluc3RpbmN0cyB0ZWxsIG1lIHRvIGZvY3VzIG9uIGBleHQ0X2lvY3RsX3NldF9sdWZpZGAgYW5kIGBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkYCBhcyBlbnRyeSBwb2ludHMuIExldCYjMzk7cyBzZWUgaWYgdGhvc2UgYXJlIGFjdHVhbGx5IHJlYWNoYWJsZSB3aXRoaW4gdGhlIGZpbGVzeXN0ZW0uIEkgY2FuIHVzZSB0aGUgdXN1YWwgdG9vbHMsIGBjb2Rlc2VhcmNoLWRpci1pbmRleGAgb3IgYGdyZXBwZXJgIHNob3VsZCBkbyB0aGUgdHJpY2suCgpBbHJpZ2h0LCBhIHF1aWNrIGNoZWNrIHJldmVhbHMgdGhleSYjMzk7cmUgc2l0dGluZyBpbiBgZnMvZXh0NC9pb2N0bC5jYCBhbmQgYGZzL2V4dDQvbmFtZWkuY2AuIEdvb2QsIHRoYXQgbmFycm93cyBkb3duIHRoZSBzY29wZS4gTm93LCB0aGUgYmlnIHF1ZXN0aW9uIGlzIGRlcGVuZGVuY2llcy4gV2hhdCBjb25maWd1cmF0aW9ucyBuZWVkIHRvIGJlIGVuYWJsZWQgZm9yIHRoaXMgZmVhdHVyZT8gSSBzZWUgdGhlIHBhdGNoIG1lbnRpb25zIGBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQWAsIGJ1dCBpcyB0aGVyZSBhIGNvcnJlc3BvbmRpbmcgYENPTkZJR19FWFQ0X0RJUkRBVEFgIG9yIHNvbWV0aGluZyBzaW1pbGFyPyBJJiMzOTtsbCBydW4gYSBxdWljayBncmVwIGZvciBgQ09ORklHX0VYVDRgIGFuZCBgRElSREFUQWAgdG8gY29uZmlybS4gVGhpcyBpcyBnb2luZyB0byBiZSBteSBiYXNlbGluZSBmb3IgZnV6emluZyBhbmQgaWYgaXQmIzM5O3Mgbm90IGVuYWJsZWQsIEkgaGF2ZSB0byBlbnN1cmUgdGhvc2UgY29uZmlndXJhdGlvbnMgYXJlIGluIHRoZSBmdXp6aW5nIHByb2ZpbGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX0VYVDQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0Ly5rdW5pdGNvbmZpZz0xPUNPTkZJR19LVU5JVD15XG5mcy9leHQ0Ly5rdW5pdGNvbmZpZzoyOkNPTkZJR19FWFQ0X0ZTPXlcbmZzL2V4dDQvLmt1bml0Y29uZmlnOjM6Q09ORklHX0VYVDRfS1VOSVRfVEVTVFM9eVxuLS1cbmZzL2V4dDQvTWFrZWZpbGUtNS1cbmZzL2V4dDQvTWFrZWZpbGU6NjpvYmotJChDT05GSUdfRVhUNF9GUykgJiM0Mzs9IGV4dDQub1xuZnMvZXh0NC9NYWtlZmlsZS03LVxuZnMvZXh0NC9NYWtlZmlsZT04PWV4dDQteVx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcbi0tXG5mcy9leHQ0L01ha2VmaWxlLTE0LVxuZnMvZXh0NC9NYWtlZmlsZToxNTpleHQ0LSQoQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMKVx0JiM0Mzs9IGFjbC5vXG5mcy9leHQ0L01ha2VmaWxlOjE2OmV4dDQtJChDT05GSUdfRVhUNF9GU19TRUNVUklUWSlcdFx0JiM0Mzs9IHhhdHRyX3NlY3VyaXR5Lm9cbmZzL2V4dDQvTWFrZWZpbGUtMTctZXh0NC10ZXN0LW9ianNcdFx0XHRcdCYjNDM7PSBpbm9kZS10ZXN0Lm8gbWJhbGxvYy10ZXN0Lm8gXFxcbmZzL2V4dDQvTWFrZWZpbGUtMTgtXHRcdFx0XHRcdCAgIGV4dGVudHMtdGVzdC5vIGhhc2gtdGVzdC5vXG5mcy9leHQ0L01ha2VmaWxlOjE5Om9iai0kKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVx0XHQmIzQzOz0gZXh0NC10ZXN0Lm9cbmZzL2V4dDQvTWFrZWZpbGUtMjAtZXh0NC0kKENPTkZJR19GU19WRVJJVFkpXHRcdCYjNDM7PSB2ZXJpdHkub1xuLS1cbmZzL2V4dDQvYWNsLmg9Mzk9c3RhdGljIGlubGluZSBpbnQgZXh0NF9hY2xfY291bnQoc2l6ZV90IHNpemUpXG4tLVxuZnMvZXh0NC9hY2wuaC01NC1cbmZzL2V4dDQvYWNsLmg6NTU6I2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTFxuZnMvZXh0NC9hY2wuaC01Ni1cbi0tXG5mcy9leHQ0L2FjbC5oPTYxPWV4dGVybiBpbnQgZXh0NF9pbml0X2FjbChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopO1xuZnMvZXh0NC9hY2wuaC02Mi1cbmZzL2V4dDQvYWNsLmg6NjM6I2Vsc2UgIC8qIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCAqL1xuZnMvZXh0NC9hY2wuaC02NC0jaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC5oXHUwMDNlXG4tLVxuZnMvZXh0NC9hY2wuaD02OT1leHQ0X2luaXRfYWNsKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKVxuLS1cbmZzL2V4dDQvYWNsLmgtNzItfVxuZnMvZXh0NC9hY2wuaDo3MzojZW5kaWYgIC8qIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCAqL1xuZnMvZXh0NC9hY2wuaC03NC1cbi0tXG5mcy9leHQ0L2V4dDQuaC05MS0gKi9cbmZzL2V4dDQvZXh0NC5oOjkyOiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xuZnMvZXh0NC9leHQ0LmgtOTMtI2RlZmluZSBleHRfZGVidWcoaW5vLCBmbXQsIC4uLilcdFx0XHRcdFx0XFxcbi0tXG5mcy9leHQ0L2V4dDQuaD0xNTg3PXN0cnVjdCBleHQ0X3NiX2luZm8ge1xuLS1cbmZzL2V4dDQvZXh0NC5oLTE3OTYtXHR1NjQgc19kYXhfcGFydF9vZmY7XG5mcy9leHQ0L2V4dDQuaDoxNzk3OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xuZnMvZXh0NC9leHQ0LmgtMTc5OC1cdHVuc2lnbmVkIGxvbmcgc19zaW11bGF0ZV9mYWlsO1xuLS1cbmZzL2V4dDQvZXh0NC5oLTE4NTktXHR0aWRfdCBzX2ZjX2luZWxpZ2libGVfdGlkO1xuZnMvZXh0NC9leHQ0Lmg6MTg2MDojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcbmZzL2V4dDQvZXh0NC5oLTE4NjEtXHRpbnQgc19mY19kZWJ1Z19tYXhfcmVwbGF5O1xuLS1cbmZzL2V4dDQvZXh0NC5oPTE5ODQ9c3RhdGljIGlubGluZSBib29sIGV4dDRfc2ltdWxhdGVfZmFpbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuLS1cbmZzL2V4dDQvZXh0NC5oLTE5ODYte1xuZnMvZXh0NC9leHQ0Lmg6MTk4NzojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcbmZzL2V4dDQvZXh0NC5oLTE5ODgtXHRzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTtcbi0tXG5mcy9leHQ0L2V4dDQuaD00MjI3PWV4dGVybiBpbnQgZXh0NF9ibG9ja193cml0ZV9iZWdpbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuLS1cbmZzL2V4dDQvZXh0NC5oLTQyMzAtXG5mcy9leHQ0L2V4dDQuaDo0MjMxOiNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuZnMvZXh0NC9leHQ0LmgtNDIzMi0jZGVmaW5lIEVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChzeW0pIFxcXG4tLVxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yNzA9ZXh0ZXJuIGludCBleHQ0X2V4dF96ZXJvb3V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dGVudCAqZXgpO1xuZnMvZXh0NC9leHQ0X2V4dGVudHMuaDoyNzE6I2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXG5mcy9leHQ0L2V4dDRfZXh0ZW50cy5oLTI3Mi1leHRlcm4gaW50IGV4dDRfZXh0X3NwYWNlX3Jvb3RfaWR4X3Rlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGNoZWNrKTtcbi0tXG5mcy9leHQ0L2V4dGVudHMuYz02MjI3PWludCBleHQ0X2V4dF9jbGVhcl9iYihzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvZXh0ZW50cy5jLTYyNzgtXG5mcy9leHQ0L2V4dGVudHMuYzo2Mjc5OiNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxuZnMvZXh0NC9leHRlbnRzLmMtNjI4MC1pbnQgZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHhfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2hlY2spXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jPTI1ODE9c3RhdGljIGludCBleHQ0X2ZjX3JlcGxheShqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXG4tLVxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTI2MDYtXG5mcy9leHQ0L2Zhc3RfY29tbWl0LmM6MjYwNzojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcbmZzL2V4dDQvZmFzdF9jb21taXQuYy0yNjA4LVx0aWYgKHNiaS1cdTAwM2VzX2ZjX2RlYnVnX21heF9yZXBsYXkgXHUwMDI2XHUwMDI2IG9mZiBcdTAwM2U9IHNiaS1cdTAwM2VzX2ZjX2RlYnVnX21heF9yZXBsYXkpIHtcbi0tXG5mcy9leHQ0L2hhc2guYz0zMTQ9aW50IGV4dDRmc19kaXJoYXNoKGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuLFxuLS1cbmZzL2V4dDQvaGFzaC5jLTM0NC1cbmZzL2V4dDQvaGFzaC5jOjM0NTojaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcbmZzL2V4dDQvaGFzaC5jLTM0Ni1FWFBPUlRfU1lNQk9MX0ZPUl9FWFQ0X1RFU1QoZXh0NGZzX2Rpcmhhc2gpO1xuLS1cbmZzL2V4dDQvaWFsbG9jLmM9ODc2PXN0YXRpYyBpbnQgZXh0NF94YXR0cl9jcmVkaXRzX2Zvcl9uZXdfaW5vZGUoc3RydWN0IGlub2RlICpkaXIsIG1vZGVfdCBtb2RlLFxuLS1cbmZzL2V4dDQvaWFsbG9jLmMtODgwLVx0aW50IG5ibG9ja3MgPSAwO1xuZnMvZXh0NC9pYWxsb2MuYzo4ODE6I2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTFxuZnMvZXh0NC9pYWxsb2MuYy04ODItXHRzdHJ1Y3QgcG9zaXhfYWNsICpwID0gZ2V0X2lub2RlX2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpO1xuLS1cbmZzL2V4dDQvaW5vZGUuYz00MTI9aW50IGV4dDRfaXNzdWVfemVyb291dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLCBleHQ0X2ZzYmxrX3QgcGJsayxcbi0tXG5mcy9leHQ0L2lub2RlLmMtNDM2LSAqL1xuZnMvZXh0NC9pbm9kZS5jOjQzNzojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcbmZzL2V4dDQvaW5vZGUuYy00Mzgtdm9pZCBleHQ0X2NoZWNrX21hcF9leHRlbnRzX2VudihzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuLS1cbmZzL2V4dDQvbWJhbGxvYy5jPTU3Mjg9c3RhdGljIHZvaWQgZXh0NF9tYl9wYV9wdXRfZnJlZShzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKVxuLS1cbmZzL2V4dDQvbWJhbGxvYy5jLTU3NDMtXG5mcy9leHQ0L21iYWxsb2MuYzo1NzQ0OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xuZnMvZXh0NC9tYmFsbG9jLmMtNTc0NS1zdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9tYl9zaG93X3BhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZXh0NC9tYmFsbG9jLmM9NzEyOT1leHQ0X21iYWxsb2NfcXVlcnlfcmFuZ2UoXG4tLVxuZnMvZXh0NC9tYmFsbG9jLmMtNzE4NC1cbmZzL2V4dDQvbWJhbGxvYy5jOjcxODU6I2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXG5mcy9leHQ0L21iYWxsb2MuYy03MTg2LXZvaWQgbWJfY2xlYXJfYml0c190ZXN0KHZvaWQgKmJtLCBpbnQgY3VyLCBpbnQgbGVuKVxuLS1cbmZzL2V4dDQvbWJhbGxvYy5oLTI4LSAqL1xuZnMvZXh0NC9tYmFsbG9jLmg6Mjk6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXG5mcy9leHQ0L21iYWxsb2MuaC0zMC0jZGVmaW5lIG1iX2RlYnVnKHNiLCBmbXQsIC4uLilcdFx0XHRcdFx0XHRcXFxuLS1cbmZzL2V4dDQvbWJhbGxvYy5oPTI3Mz1leHRlcm4gaW50IGV4dDRfbWJfbWFya19jb250ZXh0KGhhbmRsZV90ICpoYW5kbGUsXG4tLVxuZnMvZXh0NC9tYmFsbG9jLmgtMjc3LVx0XHRleHQ0X2dycGJsa190ICpyZXRfY2hhbmdlZCk7XG5mcy9leHQ0L21iYWxsb2MuaDoyNzg6I2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXG5mcy9leHQ0L21iYWxsb2MuaC0yNzktZXh0ZXJuIHZvaWQgbWJfY2xlYXJfYml0c190ZXN0KHZvaWQgKmJtLCBpbnQgY3VyLCBpbnQgbGVuKTtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9MTI1PXN0YXRpYyBjb25zdCBzdHJ1Y3QgZnNfY29udGV4dF9vcGVyYXRpb25zIGV4dDRfY29udGV4dF9vcHMgPSB7XG4tLVxuZnMvZXh0NC9zdXBlci5jLTEzMi1cbmZzL2V4dDQvc3VwZXIuYzoxMzM6I2lmICFkZWZpbmVkKENPTkZJR19FWFQyX0ZTKSBcdTAwMjZcdTAwMjYgIWRlZmluZWQoQ09ORklHX0VYVDJfRlNfTU9EVUxFKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfRVhUNF9VU0VfRk9SX0VYVDIpXG5mcy9leHQ0L3N1cGVyLmMtMTM0LXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBleHQyX2ZzX3R5cGUgPSB7XG4tLVxuZnMvZXh0NC9zdXBlci5jPTE2OTI9ZW51bSB7XG4tLVxuZnMvZXh0NC9zdXBlci5jLTE3MTUtXHRPcHRfZXJyb3JzLCBPcHRfZGF0YSwgT3B0X2RhdGFfZXJyLCBPcHRfanFmbXQsIE9wdF9kYXhfdHlwZSxcbmZzL2V4dDQvc3VwZXIuYzoxNzE2OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xuZnMvZXh0NC9zdXBlci5jLTE3MTctXHRPcHRfZmNfZGVidWdfbWF4X3JlcGxheSwgT3B0X2ZjX2RlYnVnX2ZvcmNlXG4tLVxuZnMvZXh0NC9zdXBlci5jPTE3NjI9c3RhdGljIGNvbnN0IHN0cnVjdCBmc19wYXJhbWV0ZXJfc3BlYyBleHQ0X3BhcmFtX3NwZWNzW10gPSB7XG4tLVxuZnMvZXh0NC9zdXBlci5jLTE4MzUtXHRmc3BhcmFtX2ZsYWdcdChcJiMzNDtub2luaXRfaXRhYmxlXCYjMzQ7LFx0T3B0X25vaW5pdF9pdGFibGUpLFxuZnMvZXh0NC9zdXBlci5jOjE4MzY6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXG5mcy9leHQ0L3N1cGVyLmMtMTgzNy1cdGZzcGFyYW1fZmxhZ1x0KFwmIzM0O2ZjX2RlYnVnX2ZvcmNlXCYjMzQ7LFx0T3B0X2ZjX2RlYnVnX2ZvcmNlKSxcbi0tXG5mcy9leHQ0L3N1cGVyLmM9MTg3OT1zdGF0aWMgY29uc3Qgc3RydWN0IG1vdW50X29wdHMge1xuLS1cbmZzL2V4dDQvc3VwZXIuYy0xOTIyLVx0e09wdF91c2VyX3hhdHRyLCBFWFQ0X01PVU5UX1hBVFRSX1VTRVIsIE1PUFRfU0VUfSxcbmZzL2V4dDQvc3VwZXIuYzoxOTIzOiNpZmRlZiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0xcbmZzL2V4dDQvc3VwZXIuYy0xOTI0LVx0e09wdF9hY2wsIEVYVDRfTU9VTlRfUE9TSVhfQUNMLCBNT1BUX1NFVH0sXG4tLVxuZnMvZXh0NC9zdXBlci5jLTE5NDUtXHQgTU9QVF9TRVR9LFxuZnMvZXh0NC9zdXBlci5jOjE5NDY6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXG5mcy9leHQ0L3N1cGVyLmMtMTk0Ny1cdHtPcHRfZmNfZGVidWdfZm9yY2UsIEVYVDRfTU9VTlQyX0pPVVJOQUxfRkFTVF9DT01NSVQsXG4tLVxuZnMvZXh0NC9zdXBlci5jPTE5OTc9c3RydWN0IGV4dDRfZnNfY29udGV4dCB7XG4tLVxuZnMvZXh0NC9zdXBlci5jLTIwMDAtXHRpbnRcdFx0c19qcXVvdGFfZm10O1x0LyogRm9ybWF0IG9mIHF1b3RhIHRvIHVzZSAqL1xuZnMvZXh0NC9zdXBlci5jOjIwMDE6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXG5mcy9leHQ0L3N1cGVyLmMtMjAwMi1cdGludCBzX2ZjX2RlYnVnX21heF9yZXBsYXk7XG4tLVxuZnMvZXh0NC9zdXBlci5jPTIxNzE9c3RhdGljIGludCBleHQ0X3BhcnNlX3BhcmFtKHN0cnVjdCBmc19jb250ZXh0ICpmYywgc3RydWN0IGZzX3BhcmFtZXRlciAqcGFyYW0pXG4tLVxuZnMvZXh0NC9zdXBlci5jLTIzMDYtXHRcdHJldHVybiAwO1xuZnMvZXh0NC9zdXBlci5jOjIzMDc6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXG5mcy9leHQ0L3N1cGVyLmMtMjMwOC1cdGNhc2UgT3B0X2ZjX2RlYnVnX21heF9yZXBsYXk6XG4tLVxuZnMvZXh0NC9zdXBlci5jPTI4NTU9c3RhdGljIHZvaWQgZXh0NF9hcHBseV9vcHRpb25zKHN0cnVjdCBmc19jb250ZXh0ICpmYywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi0tXG5mcy9leHQ0L3N1cGVyLmMtMjg3OC1cbmZzL2V4dDQvc3VwZXIuYzoyODc5OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xuZnMvZXh0NC9zdXBlci5jLTI4ODAtXHRBUFBMWShzX2ZjX2RlYnVnX21heF9yZXBsYXkpO1xuLS1cbmZzL2V4dDQvc3VwZXIuYz00Mzg4PXN0YXRpYyB2b2lkIGV4dDRfc2V0X2RlZl9vcHRzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsXG4tLVxuZnMvZXh0NC9zdXBlci5jLTQ0MDMtXHRzZXRfb3B0KHNiLCBYQVRUUl9VU0VSKTtcbmZzL2V4dDQvc3VwZXIuYzo0NDA0OiNpZmRlZiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0xcbmZzL2V4dDQvc3VwZXIuYy00NDA1LVx0c2V0X29wdChzYiwgUE9TSVhfQUNMKTtcbi0tXG5mcy9leHQ0L3N1cGVyLmM9NzM3Nz1zdGF0aWMgc3NpemVfdCBleHQ0X3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLFxuLS1cbmZzL2V4dDQvc3VwZXIuYy03NDM3LVxuZnMvZXh0NC9zdXBlci5jOjc0Mzg6I2lmICFkZWZpbmVkKENPTkZJR19FWFQyX0ZTKSBcdTAwMjZcdTAwMjYgIWRlZmluZWQoQ09ORklHX0VYVDJfRlNfTU9EVUxFKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfRVhUNF9VU0VfRk9SX0VYVDIpXG5mcy9leHQ0L3N1cGVyLmMtNzQzOS1zdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfYXNfZXh0Mih2b2lkKVxuLS1cbmZzL2V4dDQvc3lzZnMuYz0yNjY9RVhUNF9SV19BVFRSX1NCSV9QSShtc2dfcmF0ZWxpbWl0X2J1cnN0LCBzX21zZ19yYXRlbGltaXRfc3RhdGUuYnVyc3QpO1xuZnMvZXh0NC9zeXNmcy5jOjI2NzojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcbmZzL2V4dDQvc3lzZnMuYy0yNjgtRVhUNF9SV19BVFRSX1NCSV9VTChzaW11bGF0ZV9mYWlsLCBzX3NpbXVsYXRlX2ZhaWwpO1xuLS1cbmZzL2V4dDQvc3lzZnMuYz0yOTU9c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmV4dDRfYXR0cnNbXSA9IHtcbi0tXG5mcy9leHQ0L3N5c2ZzLmMtMzM1LVx0QVRUUl9MSVNUKGpvdXJuYWxfdGFzayksXG5mcy9leHQ0L3N5c2ZzLmM6MzM2OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xuZnMvZXh0NC9zeXNmcy5jLTMzNy1cdEFUVFJfTElTVChzaW11bGF0ZV9mYWlsKSxcbi0tXG5mcy9leHQ0L3hhdHRyLmM9ODg9c3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICogY29uc3QgZXh0NF94YXR0cl9oYW5kbGVyX21hcFtdID0ge1xuZnMvZXh0NC94YXR0ci5jLTg5LVx0W0VYVDRfWEFUVFJfSU5ERVhfVVNFUl1cdFx0ICAgICA9IFx1MDAyNmV4dDRfeGF0dHJfdXNlcl9oYW5kbGVyLFxuZnMvZXh0NC94YXR0ci5jOjkwOiNpZmRlZiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0xcbmZzL2V4dDQveGF0dHIuYy05MS1cdFtFWFQ0X1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1NdICA9IFx1MDAyNm5vcF9wb3NpeF9hY2xfYWNjZXNzLFxuLS1cbmZzL2V4dDQveGF0dHIuYy05NC1cdFtFWFQ0X1hBVFRSX0lOREVYX1RSVVNURURdXHQgICAgID0gXHUwMDI2ZXh0NF94YXR0cl90cnVzdGVkX2hhbmRsZXIsXG5mcy9leHQ0L3hhdHRyLmM6OTU6I2lmZGVmIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZXG5mcy9leHQ0L3hhdHRyLmMtOTYtXHRbRVhUNF9YQVRUUl9JTkRFWF9TRUNVUklUWV1cdCAgICAgPSBcdTAwMjZleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsXG4tLVxuZnMvZXh0NC94YXR0ci5jPTEwMT1jb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqIGNvbnN0IGV4dDRfeGF0dHJfaGFuZGxlcnNbXSA9IHtcbi0tXG5mcy9leHQ0L3hhdHRyLmMtMTAzLVx0XHUwMDI2ZXh0NF94YXR0cl90cnVzdGVkX2hhbmRsZXIsXG5mcy9leHQ0L3hhdHRyLmM6MTA0OiNpZmRlZiBDT05GSUdfRVhUNF9GU19TRUNVUklUWVxuZnMvZXh0NC94YXR0ci5jLTEwNS1cdFx1MDAyNmV4dDRfeGF0dHJfc2VjdXJpdHlfaGFuZGxlcixcbi0tXG5mcy9leHQ0L3hhdHRyLmg9MjEzPV9feGF0dHJfY2hlY2tfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXIsXG4tLVxuZnMvZXh0NC94YXR0ci5oLTIxOC1cbmZzL2V4dDQveGF0dHIuaDoyMTk6I2lmZGVmIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZXG5mcy9leHQ0L3hhdHRyLmgtMjIwLWV4dGVybiBpbnQgZXh0NF9pbml0X3NlY3VyaXR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzkyODEKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzMTAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBFeHQ0IERpcmVjdG9yeSBEYXRhIEZlYXR1cmUqKgoKT2theSwgc28gdGhlcmUgaXNuJiMzOTt0IGEgZGVkaWNhdGVkIEtjb25maWcgb3B0aW9uIGxpa2UgYENPTkZJR19FWFQ0X0RJUkRBVEFgIHRoYXQgSSB3YXMgZXhwZWN0aW5nLiBJdCYjMzk7cyBqdXN0IGEgZmVhdHVyZSBmbGFnIHdpdGhpbiBleHQ0LiBUaGUgcmVsZXZhbnQgcGF0Y2ggaW50cm9kdWNlcyBgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEFgLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8gbm90ZS4gQW5kIEkgc2VlIHRoZSBjb25maWd1cmF0aW9uIHRvIGVuYWJsZSBpdCBpcyBzaW1wbHkgYEVYVDRfRlNgLiBUaGF0IG1ha2VzIHNlbnNlLgoKV2FpdCwgdGhpcyBwYXRjaCBhbHNvIHRvdWNoZXMgYGZzL2V4dDQvaW9jdGwuY2AsIHNwZWNpZmljYWxseSBhZGRpbmcgYEVYVDRfSU9DX1NFVF9MVUZJRGAuIFRoYXQmIzM5O3MgaW50cmlndWluZy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRoYXQgaXMgdXRpbGl6ZWQuIE9rYXksICp5ZXMqLCBpdCYjMzk7cyBhbiBpb2N0bCBvcGVyYXRpb24gb24gZXh0NCBkaXJlY3Rvcmllcy4gR29vZCB0byBrbm93LgoKQWxyaWdodCwgSSBuZWVkIHRvIGxpc3QgdGhlIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHkgZm9yIG15IGFuYWx5c2lzLiBMZXQmIzM5O3MgbWFrZSBhIG5vdGUgb2YgYGV4dDRfaW9jdGxfc2V0X2x1ZmlkYCBhbmQgYGV4dDRfZGlyZGF0YV9zZXRfbHVmaWRgIHdpdGhpbiBgRm9jdXNTeW1ib2xzYC4gVGhlbiwgSSYjMzk7bGwgbmVlZCB0byBhZGQgYGV4dDRfZGlyZGF0YV9nZXRgLCBgZXh0NF9kaXJkYXRhX3NldGAsIGBleHQ0X2x1ZmlkX3NuYXBzaG90YCwgYGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhYCwgYW5kIGBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhYC4KCkxldCYjMzk7cyBkaWcgYSBsaXR0bGUgZGVlcGVyLiBIbW0sIHdoYXQgZWxzZSBpcyByZWxldmFudD8gYGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbmAsIGFuZCBgZXh0NF9kaXJfZW50cnlfbGVuYC4gT2gsIGhhbmcgb24sIGBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW5gIGlzIGFuIGlubGluZSBmdW5jdGlvbiBkZWZpbmVkIGluIGBleHQ0LmhgLiBTbyBpdCBtaWdodCBiZSBhIGJpdCBzaW1wbGVyIHRvIGZvbGxvdy4KCmBleHQ0X2RpcmRhdGFfZ2V0YCBpcyBpbiBgZnMvZXh0NC9uYW1laS5jYC4gTWFrZXMgc2Vuc2UuIExldCYjMzk7cyB0aG9yb3VnaGx5IGNoZWNrIGBmcy9leHQ0L25hbWVpLmNgIGFuZCBtYWtlIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55IG90aGVyIG5ldyBmdW5jdGlvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ni8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XmludCBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9uYW1laS5jPTQ1ODY9c3RhdGljIGludCBleHQ0X3JlbmFtZTIoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTQ2MjQtICovXG5mcy9leHQ0L25hbWVpLmM6NDYyNTppbnQgZXh0NF9kaXJkYXRhX3NldF9sdWZpZChzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3QgY2hhciAqZmlsZW5hbWUsXG5mcy9leHQ0L25hbWVpLmMtNDYyNi1cdFx0XHQgICAgaW50IG5hbWVsZW4sIHN0cnVjdCBleHQ0X2RlbnRyeV9wYXJhbSAqZWRwKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwMTc2CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB1bmRlcnN0YW5kaW5nLCBwcmVzZW50ZWQgYXMgbXkgb3duIG1lbnRhbCBwcm9jZXNzaW5nOgoKKipBbmFseXppbmcgYGV4dDRfaW9jdGxfc2V0X2x1ZmlkYCoqCgpSaWdodCwgbGV0JiMzOTtzIHN0YXJ0IGJ5IGxvb2tpbmcgYXQgYGV4dDRfaW9jdGxfc2V0X2x1ZmlkYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGlzIGZ1bmN0aW9uIGRvZXMuIEdpdmVuIHRoZSBuYW1lLCBJJiMzOTttIGd1ZXNzaW5nIGl0IHJlbGF0ZXMgdG8gYW4gaW9jdGwgY2FsbCwgYW5kIGl0IGxpa2VseSBkZWFscyB3aXRoIHNldHRpbmcgc29tZXRoaW5nIGFzc29jaWF0ZWQgd2l0aCBhIExVRklELCB3aGljaCBwcm9iYWJseSBzdGFuZHMgZm9yIHNvbWV0aGluZyBsaWtlICYjMzQ7TG9naWNhbCBVbml0IEZpbGUgSUQmIzM0OyBvciBhIHNpbWlsYXIgYmxvY2sgZGV2aWNlIGNvbmNlcHQuCgpJJiMzOTtsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0aGUga2VybmVsJiMzOTtzIGV4dDQgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbiBkb2VzIHdpdGggYmxvY2sgZGV2aWNlcy4gU3BlY2lmaWNhbGx5LCBob3cgZG9lcyBpdCBpbnRlcmFjdCB3aXRoIHRoZSBkZXZpY2UmIzM5O3MgaW9jdGxzPyBJJiMzOTtsbCBwcm9iYWJseSB3YW50IHRvIGxvb2sgZm9yIHRoZSBmdW5jdGlvbiYjMzk7cyBkZWZpbml0aW9uLCBhbnkgcmVsYXRlZCBzdHJ1Y3R1cmVzLCBhbmQgdGhlIGNhbGxpbmcgY29udGV4dHMgdG8gZnVsbHkgZ3Jhc3AgaXRzIGZ1bmN0aW9uLiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgaXQgYWZmZWN0cyB0aGUgbWV0YWRhdGEgb3IgdGhlIGRpcmVjdC1pL28gcGF0aC4gRG9lcyBpdCBhbGxvY2F0ZSBuZXcgc3RydWN0dXJlcz8gRG9lcyBpdCBpbmZsdWVuY2UgYW55IGNhY2hlIGJlaGF2aW9yPyBQZXJoYXBzIHRoZXJlJiMzOTtzIGEgc2VjdXJpdHkgaW1wbGljYXRpb24gdG9vOyBhIHRob3JvdWdoIHJldmlldyBpcyBhIG11c3QuIEtub3dpbmcgdGhlIHNwZWNpZmljcyBvZiB3aGF0IGBsdWZpZGAgY29udHJvbHMgd2lsbCBiZSBrZXksIGFuZCBhbnkgZWRnZSBjYXNlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtec3RhdGljIGxvbmcgZXh0NF9pb2N0bF9zZXRfbHVmaWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2lvY3RsLmM9MTM5MD1zdGF0aWMgaW50IGV4dDRfaW9jdGxfc2V0X3R1bmVfc2Ioc3RydWN0IGZpbGUgKmZpbHAsXG4tLVxuZnMvZXh0NC9pb2N0bC5jLTE1NDYtICovXG5mcy9leHQ0L2lvY3RsLmM6MTU0NzpzdGF0aWMgbG9uZyBleHQ0X2lvY3RsX3NldF9sdWZpZChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpXG5mcy9leHQ0L2lvY3RsLmMtMTU0OC17XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDA2MDEKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA1NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIGNvZGUgYWRkaXRpb25zLCBmcmFtZWQgYXMgbXkgb3duIHRob3VnaHQgcHJvY2VzczoKCioqUmVmaW5pbmcgTXkgRm9jdXMgZm9yIERlZXAgRGl2ZSoqCgpSaWdodCwgc28gSSYjMzk7bSBob25pbmcgaW4gb24gdGhlIGtleSBhcmVhcyB3aXRoaW4gdGhpcyBleHQ0IGZpbGUgc3lzdGVtIGFuYWx5c2lzLiBJIG5lZWQgdG8gdGlnaHRlbiB0aGUgc2NvcGUgb2YgbXkgaW52ZXN0aWdhdGlvbiwgYW5kIEkmIzM5O3ZlIGRlY2lkZWQgdG8gZXhwbGljaXRseSBhZGQgYGV4dDRfaW9jdGxfc2V0X2x1ZmlkYCBhbmQgYGV4dDRfZGlyZGF0YV9zZXRfbHVmaWRgIHRvIHRoZSBgRm9jdXNTeW1ib2xzYCBsaXN0LiBUaGF0JiMzOTtzIGNydWNpYWwuIEkmIzM5O20gdHJlYXRpbmcgdGhlc2UgYXMgdGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyByaWdodCBub3cgZm9yIHRoZSBpbnZlc3RpZ2F0aW9uLgoKRnVydGhlcm1vcmUsIEkgcmVjb2duaXplIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSByZWxhdGVkIGRhdGEgYWNjZXNzIGZ1bmN0aW9ucy4gVGhlcmVmb3JlIEkgd2lsbCBhbHNvIGluY2x1ZGUgYGV4dDRfZGlyZGF0YV9nZXRgIGFuZCBgZXh0NF9kaXJkYXRhX3NldGAgaW4gdGhlIGBGb2N1c1N5bWJvbHNgLiBUaGF0IHdpbGwgZ2l2ZSBtZSBtb3JlIGNvbnRleHQgZm9yIHRoZSBmaXJzdCB0d28gZnVuY3Rpb25zIGFuZCBoZWxwIG1lIGdyYXNwIHRoZSBmbG93IG9mIGRhdGEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O151bnNpZ25lZCBjaGFyIGV4dDRfZGlyZGF0YV9nZXQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L25hbWVpLmM9MTMxMz1zdGF0aWMgaW5saW5lIGludCBzZWFyY2hfZGlyYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbi0tXG5mcy9leHQ0L25hbWVpLmMtMTM1My0gKi9cbmZzL2V4dDQvbmFtZWkuYzoxMzU0OnVuc2lnbmVkIGNoYXIgZXh0NF9kaXJkYXRhX2dldChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuZnMvZXh0NC9uYW1laS5jLTEzNTUtXHRcdFx0ICAgICAgIGludCBidWZfc2l6ZSxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDEwMDcKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAxMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGVlcCBEaXZlIGludG8gYGV4dDRfZGlyZGF0YV9zZXRgKioKCkFscmlnaHQsIHNvIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgYGV4dDRfZGlyZGF0YV9zZXRgLiBJIGtub3cgdGhpcyBpcyBhIGNvcmUgZnVuY3Rpb24sIGNlbnRyYWwgdG8gaG93IGV4dDQgbWFuYWdlcyBkaXJlY3RvcnkgZW50cmllcyBhbmQgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEuIEVzc2VudGlhbGx5LCBpdCYjMzk7cyByZXNwb25zaWJsZSBmb3Igc2V0dGluZyBvciB1cGRhdGluZyBkaXJlY3RvcnkgZGF0YSB3aXRoaW4gdGhlIGlub2RlLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCB0aGUgbG93LWxldmVsIGRldGFpbHMgb2YgaG93IGEgZmlsZSYjMzk7cyBuYW1lLCBpdHMgaW5vZGUgbnVtYmVyLCBhbmQgdmFyaW91cyBvdGhlciBiaXRzIG9mIGNydWNpYWwgaW5mb3JtYXRpb24gYXJlIHN0b3JlZCB3aXRoaW4gdGhlIGRpcmVjdG9yeSYjMzk7cyBibG9ja3MuIEkmIzM5O20gdmlzdWFsaXppbmcgdGhlIGJsb2NrIGxheW91dCwgdGhlIG9mZnNldHMsIHRoZSBsZW5ndGhzLi4uIGFuZCB0aGUgYWxsIHRoZSBwb3RlbnRpYWwgaXNzdWVzIHRoYXQgbWlnaHQgYXJpc2UgZHVyaW5nIHRoZSBpbnRyaWNhdGUgZGFuY2Ugb2Ygd3JpdGluZyB0aGlzIGRhdGEgY29ycmVjdGx5LgoKVGhlIGNyaXRpY2FsIHBpZWNlcyBhcmUgYWxsIHRoZXJlOiB0aGUgZGlyZWN0b3J5IGVudHJ5LCB0aGUgbmFtZSBsZW5ndGgsIHRoZSBpbm9kZSBudW1iZXIsIHRoZSBkYXRhIHR5cGUuLi4gSSYjMzk7bSBpbW1lZGlhdGVseSBjb25jZXJuZWQgYWJvdXQgdGhlIHBvdGVudGlhbCBmb3IgZnJhZ21lbnRhdGlvbiBpZiB0aGUgZGlyZWN0b3J5IGdyb3dzIGFuZCBjb250cmFjdHMgZnJlcXVlbnRseS4gSG93IGRvZXMgaXQgaGFuZGxlIHBvdGVudGlhbCBjb2xsaXNpb25zIHdoZW4gdXBkYXRpbmcgYW4gZW50cnk/IERvZXMgaXQgYWNjb3VudCBmb3IgcG9zc2libGUgcGFydGlhbCB3cml0ZXMsIG9yIHBvd2VyIGZhaWx1cmVzIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBjcnVjaWFsIHByb2Nlc3M/IEkmIzM5O20gd29uZGVyaW5nIHdoYXQgZXJyb3IgaGFuZGxpbmcgaXMgaW4gcGxhY2UsIHNwZWNpZmljYWxseSBmb3Igc2l0dWF0aW9ucyB3aGVyZSBhIGRhdGEgd3JpdGUgaXMgcGFydGlhbGx5IHN1Y2Nlc3NmdWwsIHdoaWNoIHdvdWxkIGluZXZpdGFibHkgY29ycnVwdCB0aGUgZmlsZXN5c3RlbS4KCkkmIzM5O20gYWxzbyBjdXJpb3VzIGFib3V0IHRoZSBsb2NraW5nIG1lY2hhbmlzbXMgZW1wbG95ZWQgdG8gZW5zdXJlIHRocmVhZC1zYWZldHkgd2hlbiBtdWx0aXBsZSBwcm9jZXNzZXMgYXJlIGF0dGVtcHRpbmcgdG8gbW9kaWZ5IHRoZSBzYW1lIGRpcmVjdG9yeSBjb25jdXJyZW50bHkuIElzIGl0IHVzaW5nIHBlci1pbm9kZSBsb2Nrcz8gR2xvYmFsIGxvY2tzPyBBIGNvbWJpbmF0aW9uPyBXaGF0JiMzOTtzIHRoZSBncmFudWxhcml0eSBvZiB0aGUgbG9ja2luZyBhbmQgaG93IGRvZXMgdGhhdCBhZmZlY3Qgb3ZlcmFsbCBwZXJmb3JtYW5jZT8gSSYjMzk7bSBnb2luZyB0byB3YW50IHRvIGNoZWNrIGludG8gdGhhdCBzb29uLiBBbmQgaG93IGFyZSB3ZSBzdXJlIHRoYXQgdGhlIGpvdXJuYWwgaXMgY29ycmVjdGx5IHVwZGF0ZWQgdG8gZW5zdXJlIHdlJiMzOTtyZSBuZXZlciBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGU/IEl0JiMzOTtzIGVzc2VudGlhbCB0aGF0IHRoZXNlIG9wZXJhdGlvbnMgYmUgYXRvbWljIG9yIHRoYXQgd2UgaGF2ZSB0aGUgcHJvcGVyIGpvdXJuYWwgZW50cmllcyB0byByZWNvdmVyLgoKRnVydGhlcm1vcmUsIGhvdyBkb2VzIGl0IGludGVyYWN0IHdpdGggdGhlIGJsb2NrIGFsbG9jYXRvcj8gSG93IGRvZXMgdGhlIGJsb2NrIGFsbG9jYXRvciBlbnN1cmUgaXQgaGFzIHRoZSBjb3JyZWN0IGFtb3VudCBvZiBzcGFjZSBmb3IgdGhpcyBkYXRhIHNldD8gQXJlIHRoZXJlIG9wdGltaXphdGlvbnMgZm9yIGNvbW1vbmx5IG9jY3VycmluZyBzY2VuYXJpb3M/IEFuZCB3aGF0IGFib3V0IHRoZSBpbXBhY3Qgb24gcGVyZm9ybWFuY2Ugd2l0aCBTU0RzIHZlcnN1cyBIRERzPyBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgZGVzaWduZWQgdG8gcGVyZm9ybSB3ZWxsIG9uIGEgdmFyaWV0eSBvZiB1bmRlcmx5aW5nIHN0b3JhZ2UgdHlwZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15zdGF0aWMgdm9pZCBleHQ0X2RpcmRhdGFfc2V0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9uYW1laS5jPTEzNTQ9dW5zaWduZWQgY2hhciBleHQ0X2RpcmRhdGFfZ2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTE0NjctICovXG5mcy9leHQ0L25hbWVpLmM6MTQ2ODpzdGF0aWMgdm9pZCBleHQ0X2RpcmRhdGFfc2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXG5mcy9leHQ0L25hbWVpLmMtMTQ2OS1cdFx0XHQgICAgIHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRmaWQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQxNjQ3CgkJCQkJCQlvdXRwdXQ6IDQ1CgkJCQkJCQl0aG91Z2h0czogMTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgdGFraW5nIG9uIHRoZSBwZXJzb25hIHlvdSYjMzk7dmUgZGVzY3JpYmVkOgoKKipFeHQ0IExVRklEIFNuYXBzaG90IENvbnNpZGVyYXRpb25zKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIFRoaW5raW5nIGFib3V0IGBleHQ0X2x1ZmlkX3NuYXBzaG90YCwgSSYjMzk7bSBpbW1lZGlhdGVseSBmb2N1c2luZyBvbiB0aGUgaW1wbGljYXRpb25zIHdpdGhpbiBhbiBleHQ0IGZpbGVzeXN0ZW0uIFRoZSB0ZXJtICYjMzQ7TFVGSUQmIzM0OyBzdWdnZXN0cyAqTG9naWNhbCBVbml0IEZpbGUgSUQqLCBtZWFuaW5nIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggaG93IHNuYXBzaG90cyBhcmUgaW1wbGVtZW50ZWQsIHNwZWNpZmljYWxseSBhdCBhIGZpbGUtc3lzdGVtIGxldmVsLgoKTXkgcHJpbWFyeSBjb25jZXJuIGlzIHRoZSBlZmZpY2llbmN5IG9mIHN1Y2ggYSBzbmFwc2hvdCBtZWNoYW5pc20sIGFuZCBhbnkgYXNzb2NpYXRlZCBvdmVyaGVhZC4gSG93IGlzIHRoaXMgc25hcHNob3QgJiMzNDtjcmVhdGVkJiMzNDsg4oCTIGlzIGl0IGEgZnVsbCBjb3B5LCBhIGNvcHktb24td3JpdGUgb3BlcmF0aW9uLCBvciBwZXJoYXBzIHNvbWV0aGluZyBtb3JlIGNsZXZlciB0aGF0IGxldmVyYWdlcyB0aGUgYmxvY2sgZ3JvdXAgc3RydWN0dXJlPyBQZXJmb3JtYW5jZSBpcyBrZXksIGVzcGVjaWFsbHkgZHVyaW5nIHNuYXBzaG90IGNyZWF0aW9uIGFuZCBzdWJzZXF1ZW50IHJlYWRzL3dyaXRlcyB0byB0aGUgJiMzNDtwYXJlbnQmIzM0OyBhbmQgJiMzNDtzbmFwc2hvdCYjMzQ7IHZvbHVtZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBpbXBhY3Qgb24gaW5vZGUgbWFuYWdlbWVudCBhbmQgYmxvY2sgYWxsb2NhdGlvbi4gQXJlIHRoZXJlIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIHBlbmFsdGllcz8gQXJlIG1ldGFkYXRhIHVwZGF0ZXMgYXRvbWljIGFuZCBjb25zaXN0ZW50PwoKTmV4dCwgSSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBncmFudWxhcml0eS4gRG9lcyB0aGlzIExVRklELWJhc2VkIGFwcHJvYWNoIG9mZmVyIHNuYXBzaG90cyBvZiBlbnRpcmUgdm9sdW1lcywgaW5kaXZpZHVhbCBmaWxlcywgb3IgYSBtb3JlIGdyYW51bGFyIHNlbGVjdGlvbiBvZiBkYXRhPyBUaGUgZmxleGliaWxpdHkgb2Ygc2VsZWN0aW5nIHRoZSBkYXRhIGluY2x1ZGVkIHdvdWxkIGJlIHZhbHVhYmxlIGluIG9yZGVyIHRvIGF2b2lkIGEgJiMzNDtzbmFwc2hvdCYjMzQ7IHdoaWNoIGlzIGFzIGxhcmdlIGFzIHRoZSBvcmlnaW5hbCBkYXRhLgoKRXJyb3IgaGFuZGxpbmcgaXMgY3JpdGljYWwgdG9vLiBXaGF0IGhhcHBlbnMgaWYgdGhlIHNuYXBzaG90IG9wZXJhdGlvbiBmYWlscyBtaWQtd2F5PyBJcyBkYXRhIGNvcnJ1cHRpb24gYSBwb3NzaWJpbGl0eSwgYW5kIGlmIHNvLCBob3cgaXMgaXQgbWl0aWdhdGVkPyBSZWNvdmVyeSBtZWNoYW5pc21zIGFyZSBhIG11c3QsIGFzIGlzIGVuc3VyaW5nIGRhdGEgaW50ZWdyaXR5IHVuZGVyIGFsbCBjaXJjdW1zdGFuY2VzLiBJIG5lZWQgdG8gc2VlIHRoZSBwb3RlbnRpYWwgZmFpbHVyZSBtb2Rlcy4KCkZpbmFsbHksIGNvbXBhdGliaWxpdHkgYW5kIGludGVncmF0aW9uIGFyZSBwYXJhbW91bnQuIERvZXMgdGhpcyBgZXh0NF9sdWZpZF9zbmFwc2hvdGAgcGxheSBuaWNlbHkgd2l0aCBleGlzdGluZyB0b29scyBhbmQgdXRpbGl0aWVzLCBzdWNoIGFzIGBmc2NrYCwgYGUyZnNja2AsIGFuZCBvdGhlciB2b2x1bWUgbWFuYWdlbWVudCB0ZWNobm9sb2dpZXM/IEFueSBpbnRlZ3JhdGlvbiBpc3N1ZXMgY291bGQgbWFrZSB0aGlzIGRpZmZpY3VsdCB0byBpbXBsZW1lbnQgaW4gbWFueSByZWFsLXdvcmxkIHVzZSBjYXNlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkVycm9yOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bm8gbWF0Y2hlczwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtec3RhdGljIHN0cnVjdCBleHQ0X2RpcmVudF9maWQgXFwqLipleHQ0X2x1ZmlkX3NuYXBzaG90JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjA5OAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhhdCB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkdyZXAsIFRoZW4gRGlnZXN0KioKClJpZ2h0LCBsZXQmIzM5O3MgY3V0IHN0cmFpZ2h0IHRvIHRoZSBjaGFzZS4gVGhhdCYjMzk7cyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuIEkmIzM5O20gZ29pbmcgdG8gcmVhY2ggZm9yIGBncmVwYCBhbmQgYWltIGZvciBgZXh0NF9sdWZpZF9zbmFwc2hvdGAuIFRoYXQgbGlrZWx5IHRhcmdldHMgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBzbmFwc2hvdHMgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEJ5IGV4YW1pbmluZyB0aGUgc291cmNlIGNvZGUsIEkgY2FuIHF1aWNrbHkgbmFycm93IGRvd24gdGhlIGFyZWFzIGludm9sdmVkIGluIHNuYXBzaG90IGNyZWF0aW9uIGFuZCBtYW5hZ2VtZW50IHdpdGhpbiB0aGUgZXh0NCBpbXBsZW1lbnRhdGlvbi4gVGhhdCYjMzk7cyB1c3VhbGx5IHRoZSBtb3N0IGVmZmljaWVudCB3YXkgdG8gdW5kZXJzdGFuZCBpdHMgbnVhbmNlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9sdWZpZF9zbmFwc2hvdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvbmFtZWkuYz00MDkyPXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmV4dDRfd2hpdGVvdXRfZm9yX3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcbi0tXG5mcy9leHQ0L25hbWVpLmMtNDEyNy0vKlxuZnMvZXh0NC9uYW1laS5jOjQxMjg6ICogZXh0NF9sdWZpZF9zbmFwc2hvdCAtIGNvcHkgdGhlIExVRklEIHJlY29yZCBmcm9tIGEgZGlyZWN0b3J5IGVudHJ5XG5mcy9leHQ0L25hbWVpLmMtNDEyOS0gKlxuLS1cbmZzL2V4dDQvbmFtZWkuYz00MTM0PXN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpcbmZzL2V4dDQvbmFtZWkuYzo0MTM1OmV4dDRfbHVmaWRfc25hcHNob3Qoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCB1bnNpZ25lZCBpbnQgYmxvY2tzaXplKVxuZnMvZXh0NC9uYW1laS5jLTQxMzYte1xuLS1cbmZzL2V4dDQvbmFtZWkuYz00MTYxPXN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2Rpcixcbi0tXG5mcy9leHQ0L25hbWVpLmMtNDMwNi1cdFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShvbGQuZGlyLVx1MDAzZWlfc2IpKSB7XG5mcy9leHQ0L25hbWVpLmM6NDMwNzpcdFx0XHRvbGRfZmlkID0gZXh0NF9sdWZpZF9zbmFwc2hvdChvbGQuZGUsXG5mcy9leHQ0L25hbWVpLmMtNDMwOC1cdFx0XHRcdFx0XHQgICAgICBvbGQuZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuLS1cbmZzL2V4dDQvbmFtZWkuYz00NDI3PXN0YXRpYyBpbnQgZXh0NF9jcm9zc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LFxuLS1cbmZzL2V4dDQvbmFtZWkuYy00NTIyLVx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShvbGQuZGlyLVx1MDAzZWlfc2IpKSB7XG5mcy9leHQ0L25hbWVpLmM6NDUyMzpcdFx0b2xkX2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3Qob2xkLmRlLCBvbGQuZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuZnMvZXh0NC9uYW1laS5jOjQ1MjQ6XHRcdG5ld19maWQgPSBleHQ0X2x1ZmlkX3NuYXBzaG90KG5ldy5kZSwgbmV3LmRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbmZzL2V4dDQvbmFtZWkuYy00NTI1LVx0XHRpZiAob2xkX2ZpZCB8fCBuZXdfZmlkKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjgzNAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDQ3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKkFuYWx5emluZyBSZWxldmFudCBTdGF0aWMgRnVuY3Rpb25zIGZvciBGaWxlIFN5c3RlbSBPcGVyYXRpb25zKioKCkFscmlnaHQsIHNvIEkmIzM5O20gZm9jdXNpbmcgb24gdGhlc2Ugc3RhdGljIGZ1bmN0aW9ucyBzcGVjaWZpY2FsbHkuIFdlJiMzOTtyZSBsb29raW5nIGF0IGBleHQ0X2x1ZmlkX3NuYXBzaG90YCwgd2hpY2ggaXMgY3J1Y2lhbCBmb3Igb3VyIHNuYXBzaG90IGNhcGFiaWxpdGllcyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS4gSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgaXRzIGludGVyYWN0aW9ucy4gVG8gZ2V0IGEgaG9saXN0aWMgdmlldywgSSBhbHNvIG5lZWQgdG8gYnJpbmcgaW4gYGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhYCBhbmQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLiBDb25zaWRlcmluZyB0aGVzZSB0aHJlZSB0b2dldGhlciBzaG91bGQgZ2l2ZSBtZSB0aGUgaW5zaWdodHMgSSYjMzk7bSBsb29raW5nIGZvci4gSSBuZWVkIHRvIHNlZSBob3cgdGhleSBpbnRlcnJlbGF0ZSBpbiB0aGUgY29udGV4dCBvZiBmaWxlIGNyZWF0aW9uLCBkZWxldGlvbiBhbmQgZXNwZWNpYWxseSBzbmFwc2hvdCBpbXBsZW1lbnRhdGlvbi4gSXQmIzM5O3MgdGltZSB0byBkaWcgaW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9leHQ0Lmg9MzA1NT1leHRlcm4gaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuLS1cbmZzL2V4dDQvZXh0NC5oLTMwNTktXHRcdFx0ICAgICBpbnQgZGxlbik7XG5mcy9leHQ0L2V4dDQuaDozMDYwOnZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L2V4dDQuaC0zMDYxLVx0XHRcdCAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxuLS1cbmZzL2V4dDQvZXh0NC5oPTMwNjU9c3RhdGljIGlubGluZSB2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dDQuaC0zMDY5LXtcbmZzL2V4dDQvZXh0NC5oOjMwNzA6XHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgYnVmX3NpemUsIGZuYW1lLCBOVUxMKTtcbmZzL2V4dDQvZXh0NC5oLTMwNzEtfVxuLS1cbmZzL2V4dDQvaW5saW5lLmM9OTY5PXN0YXRpYyBpbnQgZXh0NF9hZGRfZGlyZW50X3RvX2lubGluZShoYW5kbGVfdCAqaGFuZGxlLFxuLS1cbmZzL2V4dDQvaW5saW5lLmMtOTk3LVx0XHRyZXR1cm4gZXJyO1xuZnMvZXh0NC9pbmxpbmUuYzo5OTg6XHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgaW5saW5lX3NpemUsIGZuYW1lLCBkZmlkKTtcbmZzL2V4dDQvaW5saW5lLmMtOTk5LVxuLS1cbmZzL2V4dDQvbmFtZWkuYz0yMjg3PWludCBleHQ0X2ZpbmRfZGVzdF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbi0tXG5mcy9leHQ0L25hbWVpLmMtMjMyNC1cbmZzL2V4dDQvbmFtZWkuYzoyMzI1OnZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG5mcy9leHQ0L25hbWVpLmMtMjMyNi1cdFx0XHQgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgaW50IGJ1Zl9zaXplLFxuLS1cbmZzL2V4dDQvbmFtZWkuYz0yMzU2PXN0YXRpYyBpbnQgYWRkX2RpcmVudF90b19idWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy0yMzk2LVx0LyogQnkgbm93IHRoZSBidWZmZXIgaXMgbWFya2VkIGZvciBqb3VybmFsaW5nICovXG5mcy9leHQ0L25hbWVpLmM6MjM5NzpcdGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKGRpciwgaW5vZGUsIGRlLCBibG9ja3NpemUsIGZuYW1lLCBkZmlkKTtcbmZzL2V4dDQvbmFtZWkuYy0yMzk4LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MzY5MgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDEzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgbGluZSBvZiB0aG91Z2h0LCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgcHJlc2VudGVkIGFzIGlmIGl0IHdlcmUgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZToKCioqRGl2aW5nIERlZXAgaW50byBleHQ0IERpcmVjdG9yeSBJbml0aWFsaXphdGlvbioqCgpSaWdodCwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLiBUaGlzIGZ1bmN0aW9uLCBhcyBJIHJlY2FsbCwgaXMgd2hlcmUgdGhlIHJ1YmJlciByZWFsbHkgbWVldHMgdGhlIHJvYWQgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGRpcmVjdG9yeSB3aXRoaW4gYW4gZXh0NCBmaWxlc3lzdGVtLiBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBpbnRyaWNhdGUgZGFuY2UgaXQgcGVyZm9ybXMgdG8gbGF5IGRvd24gdGhlIGluaXRpYWwgYml0cyBvZiBtZXRhZGF0YSBhbmQgZGF0YSBibG9ja3MuIFdlJiMzOTtyZSBzZXR0aW5nIHVwIHRoYXQgZGlyZWN0b3J5IHN0cnVjdHVyZSwgYW5kIHRoZXJlJiMzOTtzIGEgbG90IHRvIGNvbnNpZGVyLgoKRmlyc3QsIEkmIzM5O20gbWVudGFsbHkgcGFyc2luZyB0aGUgYXJndW1lbnRzOiB0aGUgaW5vZGUsIHRoZSBibG9jayBncm91cCwgdGhlIHBhcmVudCBkaXJlY3RvcnkmIzM5O3MgaW5vZGUsIHRoZSBuZXcgZGlyZWN0b3J5JiMzOTtzIG5hbWUsIGFuZCB0aGUgbGluayBjb3VudC4gVGhlIGtleSBoZXJlIGlzIGVmZmljaWVuY3kg4oCTIHdlIGRvbiYjMzk7dCB3YW50IHRvIG92ZXItYWxsb2NhdGUgb3IgZnJhZ21lbnQgdGhpbmdzIHJpZ2h0IG9mZiB0aGUgYmF0LiBJdCBoYXMgdG8gZW5zdXJlIHRoZSBuZXcgZGlyZWN0b3J5IGlzIGxhaWQgb3V0IGNvbnRpZ3VvdXNseSB3aGVuZXZlciBwb3NzaWJsZS4KCkkmIzM5O20gcGljdHVyaW5nIHRoZSBwcm9jZXNzOiBhbGxvY2F0aW5nIGFuIGlub2RlIGZvciB0aGUgbmV3IGRpcmVjdG9yeSwgemVyb2luZyBvdXQgdGhlIGJsb2NrLCBpbml0aWFsaXppbmcgdGhlIGRpcmVjdG9yeSBlbnRyeS4gQnV0IEkmIzM5O20gYWxzbyBjb25zaWRlcmluZyB0aGUgaW1wbGljYXRpb25zIG9mIHRoZSBibG9jayBncm91cCBwb2xpY3kuIElzIGl0IHVzaW5nIHRoZSBkZWZhdWx0IHN0cmF0ZWd5LCBvciBhcmUgdGhlcmUgc3BlY2lmaWMgYWxsb2NhdGlvbiBoaW50cyBpbiBwbGF5PyBUaGF0IG1ha2VzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0ZXJtcyBvZiBmcmFnbWVudGF0aW9uIGFuZCBzdWJzZXF1ZW50IHBlcmZvcm1hbmNlLgoKVGhlbiB0aGVyZSYjMzk7cyB0aGUgYGV4dDRfc2V0X2lub2RlX2ZsYWdzYCBjYWxsIHRvIGNvbnNpZGVyLiBXZSYjMzk7cmUgdGFsa2luZyBhYm91dCBzZXR0aW5nIGZsYWdzIGxpa2UgYEVYVDRfRElSVFlgIGFuZCBvdGhlcnMuIEkmIzM5O20gbWVudGFsbHkgcmV2aWV3aW5nIG15IGtub3dsZWRnZSBvZiB0aGUgcG90ZW50aWFsIHByb2JsZW1zIHRoYXQgY291bGQgaGFwcGVuIHdpdGggYW4gdW4tc2V0IGZsYWcuCiBJJiMzOTttIGFsc28gc2NydXRpbml6aW5nIHRoZSBgZXh0NF9pbml0X25ld19kaXJfZGF0YWAgZnVuY3Rpb24mIzM5O3Mgcm9sZSBpbiBjb25zdHJ1Y3RpbmcgdGhlICYjMzQ7LiYjMzQ7IGFuZCAmIzM0Oy4uJiMzNDsgZW50cmllcy4gQXJlIHdlIGJlaW5nIGNhcmVmdWwgd2l0aCB0aGUgbGluayBjb3VudHM/IEl0JiMzOTtzIGVzc2VudGlhbCB0aG9zZSBlbnRyaWVzIGFyZSBzZXQgdXAgY29ycmVjdGx5LCBvciB0aGUgZmlsZXN5c3RlbSB3aWxsIGhhdmUgYSBjYXRhc3Ryb3BoaWMgZmFpbHVyZS4KCkZpbmFsbHksIEkmIzM5O20gbWVudGFsbHkgY2hlY2tpbmcgZm9yIGFueSBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcy4gQ2FuIHdlIHN0cmVhbWxpbmUgYmxvY2sgYWxsb2NhdGlvbiBmdXJ0aGVyPyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoZSBpbml0aWFsIGRpcmVjdG9yeSBlbnRyeSBzaXplIGNhbGN1bGF0aW9ucz8gSSYjMzk7bSBhbHdheXMgbG9va2luZyBmb3Igd2F5cyB0byBpbXByb3ZlIHRoaXMgcHJvY2VzcyB0byBhdm9pZCBkZWFkbG9ja3MuIFRoaXMgaXMgY29yZSBmaWxlc3lzdGVtIGZ1bmN0aW9uYWxpdHksIHNvIGl0IG5lZWRzIHRvIGJlIGJ1bGxldHByb29mIGFuZCBlZmZpY2llbnQuCgpJdCYjMzk7cyBhbGwgYWJvdXQgdGhlIGRldGFpbHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfaW5pdF9uZXdfZGlyX2RhdGEmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcy9leHQ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9leHQ0L2V4dDQuaD0zMzEyPWV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcbi0tXG5mcy9leHQ0L2V4dDQuaC0zMzE0LS8qIG5hbWVpLmMgKi9cbmZzL2V4dDQvZXh0NC5oOjMzMTU6ZXh0ZXJuIGludCBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuZnMvZXh0NC9leHQ0LmgtMzMxNi1cdFx0XHRcdCAgc3RydWN0IGlub2RlICppbm9kZSxcbi0tXG5mcy9leHQ0L2V4dDQuaD0zMzE4PXN0YXRpYyBpbmxpbmUgaW50IGV4dDRfaW5pdF9uZXdfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuLS1cbmZzL2V4dDQvZXh0NC5oLTMzMjAte1xuZnMvZXh0NC9leHQ0Lmg6MzMyMTpcdHJldHVybiBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhKGhhbmRsZSwgZGlyLCBpbm9kZSwgTlVMTCwgTlVMTCk7XG5mcy9leHQ0L2V4dDQuaC0zMzIyLX1cbi0tXG5mcy9leHQ0L25hbWVpLmM9MzIwND1pbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTMyNDktXG5mcy9leHQ0L25hbWVpLmM6MzI1MDppbnQgZXh0NF9pbml0X25ld19kaXJfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbmZzL2V4dDQvbmFtZWkuYy0zMjUxLVx0XHRcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ0NTc0CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMjkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQW5hbHl6aW5nIERpcmVjdG9yeSBFbnRyeSBMZW5ndGggQ2FsY3VsYXRpb25zKioKClJpZ2h0LCBsZXQmIzM5O3MgY2lyY2xlIGJhY2sgYW5kIG1ha2UgYWJzb2x1dGVseSBzdXJlIHdlIGhhdmVuJiMzOTt0IG92ZXJsb29rZWQgYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgcmVsYXRlZCB0byBkaXJlY3RvcnkgZW50cnkgbGVuZ3RocywgcGFydGljdWxhcmx5IGFzIHRoZXkgcmVsYXRlIHRvIGBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW5gIGFuZCBgZXh0NF9kaXJfZW50cnlfbGVuYC4gSSYjMzk7dmUgZ290IHRvIGVuc3VyZSB0aGUgY29kZSBjb3JyZWN0bHkgY2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGVhY2ggZW50cnkgaW4gYW4gZXh0NCBkaXJlY3RvcnkuIEkgbmVlZCB0byBjcm9zcy1yZWZlcmVuY2UgdGhvc2UgdHdvIGZ1bmN0aW9ucyBhbmQgY29uZmlybSB0aGVpciBhc3N1bXB0aW9ucyBhcmUgY29uc2lzdGVudC4gV2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBwb3RlbnRpYWxseSB2dWxuZXJhYmxlIGFyZWFzIGhlcmUsIHNvIEkgbmVlZCB0byBzZWUgaG93IHRoZXkgaW50ZXJhY3QuIEFyZSB0aGVyZSBjb3JuZXIgY2FzZXMgd2hlcmUgdGhlc2UgY2FsY3VsYXRpb25zIGNvdWxkIGJlIG9mZiwgbGVhZGluZyB0byBidWZmZXIgb3ZlcmZsb3dzIG9yIGluY29ycmVjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZT8gSGF2ZSBhbnkgb2YgdGhlIG5ld2VyIGZpbGVzeXN0ZW0gZW5oYW5jZW1lbnRzIGFmZmVjdGVkIHRoZXNlIGNhbGN1bGF0aW9ucz8gVGltZSB0byBkaWcgaW50byB0aGUgZGV0YWlscyBhbmQgcmVjb25maXJtIG15IHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZXNlIGZ1bmN0aW9ucyByZWxhdGUgYW5kIHRoZSBwb3RlbnRpYWwgcmlza3MgaWYgdGhvc2UgY2FsY3VsYXRpb25zIGFyZSB3cm9uZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDcvMTQgMTk6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9kaXIuYz00Njk9aW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCxcbi0tXG5mcy9leHQ0L2Rpci5jLTQ4NS1cdFx0XHRleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRpcmVudC1cdTAwM2VyZWNfbGVuLCBidWZfc2l6ZSk7XG5mcy9leHQ0L2Rpci5jOjQ4NjpcdFx0ZXh0cmFfZGF0YSA9IGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbihkaXJlbnQsIHJlY19sZW4pO1xuZnMvZXh0NC9kaXIuYy00ODctXHR9XG4tLVxuZnMvZXh0NC9leHQ0Lmg9MjYzNz1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQ0X2RpcmVudF9yZWNfbGVuKHVuc2lnbmVkIGludCBuYW1lX2xlbixcbi0tXG5mcy9leHQ0L2V4dDQuaC0yNjQ1LVx0ICogaGFzaCBpcyBzdG9yZWQgYXMgYSBDRkhBU0ggZXh0ZW5zaW9uIGFuZCBpcyBhbHJlYWR5IGNvdW50ZWQgaW4gdGhlXG5mcy9leHQ0L2V4dDQuaDoyNjQ2Olx0ICogbmFtZV9sZW4gYXJndW1lbnQgKHZpYSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4pLCBzbyBhZGRpbmcgaXQgYWdhaW5cbmZzL2V4dDQvZXh0NC5oLTI2NDctXHQgKiB3b3VsZCBkb3VibGUtY291bnQuXG4tLVxuZnMvZXh0NC9leHQ0Lmg9NDExMj1zdGF0aWMgaW5saW5lIGJvb2wgZXh0NF9kaXJfZW50cnlfaXNfdGFpbChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUpXG4tLVxuZnMvZXh0NC9leHQ0LmgtNDEyMi0vKlxuZnMvZXh0NC9leHQ0Lmg6NDEyMzogKiBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oKSAtIENvbXB1dGUgdGhlIHRvdGFsIGRpcmRhdGEgbGVuZ3RoIGZvciBhbiBlbnRyeS5cbmZzL2V4dDQvZXh0NC5oLTQxMjQtICogQGRlOiBkaXJlY3RvcnkgZW50cnlcbi0tXG5mcy9leHQ0L2V4dDQuaC00MTMzLSAqL1xuZnMvZXh0NC9leHQ0Lmg6NDEzNDpzdGF0aWMgaW5saW5lIGludCBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxuZnMvZXh0NC9leHQ0LmgtNDEzNS1cdFx0XHRcdFx0ICAgdW5zaWduZWQgaW50IHJlY19sZW4pXG4tLVxuZnMvZXh0NC9leHQ0Lmg9NDE5Mz1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQ0X2Rpcl9lbnRyeV9sZW4oc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxuLS1cbmZzL2V4dDQvZXh0NC5oLTQxOTctXHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcbmZzL2V4dDQvZXh0NC5oOjQxOTg6XHR1bnNpZ25lZCBpbnQgZGlyZGF0YSA9IGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbihkZSwgcmVjX2xlbik7XG5mcy9leHQ0L2V4dDQuaC00MTk5LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NTQ3MAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI3OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgZXh0NCBEaXJlY3RvcnkgU3RydWN0dXJlIENvZGUqKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgYGV4dDRgIGRpcmVjdG9yeSBjb2RlLiBJIHNlZSB0aGF0IGBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW5gIGlzIGFuIGlubGluZSBmdW5jdGlvbiwgd2hpY2ggbWFrZXMgc2Vuc2UuIEkgbmVlZCB0byBhZGQgc2V2ZXJhbCBmdW5jdGlvbnMgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gTGV0JiMzOTtzIHNlZS4uLiBJJiMzOTtsbCBpbmNsdWRlIGBleHQ0X2lvY3RsX3NldF9sdWZpZGAsIGBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkYCwgYGV4dDRfZGlyZGF0YV9nZXRgLCBgZXh0NF9kaXJkYXRhX3NldGAsIGBleHQ0X2x1ZmlkX3NuYXBzaG90YCwgYGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhYCwgYW5kIGBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhYC4gSG9sZCBvbiwgbG9va3MgbGlrZSBgZXh0NF9kaXJkYXRhX3NldGAgaXMgYWN0dWFsbHkgc3RhdGljLCBhcyBpcyBgZXh0NF9sdWZpZF9zbmFwc2hvdGAgYW5kIGBleHQ0X2lvY3RsX3NldF9sdWZpZGAuIEhvd2V2ZXIsIGBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkYCBpcyBleHBvcnRlZCwgYXMgaXMgYGV4dDRfZGlyZGF0YV9nZXRgLiBBbHNvIGdsb2JhbCBhcmUgYGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhYCBhbmQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLgoKTm93LCBiZWZvcmUgSSBtb3ZlIG9uLCBsZXQmIzM5O3MganVzdCBtYWtlIHN1cmUgSSBoYXZlbiYjMzk7dCBtaXNzZWQgYW55dGhpbmcgaW50ZXJlc3RpbmcuIEhtbW0sIGBleHQ0X2RpcmVudF9yZWNfbGVuYCBpcyBhbHNvIGlubGluZSwgYXMgaXMgYGV4dDRfZGlyX2VudHJ5X2xlbmAuIEFoLCBJIHNlZSwgdGhleSYjMzk7dmUgbW9kaWZpZWQgYGV4dDRfY2hlY2tfZHhfcm9vdGAsIGFuZCB0aGV5JiMzOTt2ZSBhZGRlZCBgZHhfZ2V0X2R4X2luZm9gLiBBbHJpZ2h0LCB0aGF0IGxvb2tzIGNvbXByZWhlbnNpdmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2R4X2dldF9keF9pbmZvJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9uYW1laS5jPTUyOD1leHQ0X25leHRfZW50cnkoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKnAsIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplKVxuLS1cbmZzL2V4dDQvbmFtZWkuYy01MzctICovXG5mcy9leHQ0L25hbWVpLmM6NTM4OnN0YXRpYyBzdHJ1Y3QgZHhfcm9vdF9pbmZvICpkeF9nZXRfZHhfaW5mbyhzdHJ1Y3QgaW5vZGUgKmRpciwgdm9pZCAqZGVfYnVmKVxuZnMvZXh0NC9uYW1laS5jLTUzOS17XG4tLVxuZnMvZXh0NC9uYW1laS5jPTYwMz1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQoc3RydWN0IGlub2RlICpkaXIsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTYwOC1cbmZzL2V4dDQvbmFtZWkuYzo2MDk6XHRpbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCBkb3RfZGUpO1xuZnMvZXh0NC9uYW1laS5jLTYxMC1cdGlmIChJU19FUlIoaW5mbykpXG4tLVxuZnMvZXh0NC9uYW1laS5jPTgxND1keF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy04MzAtXG5mcy9leHQ0L25hbWVpLmM6ODMxOlx0aW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopZnJhbWUtXHUwMDNlYmgtXHUwMDNlYl9kYXRhKTtcbmZzL2V4dDQvbmFtZWkuYy04MzItXHRpZiAoSVNfRVJSKGluZm8pKVxuLS1cbmZzL2V4dDQvbmFtZWkuYz05ODM9c3RhdGljIHZvaWQgZHhfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMpXG4tLVxuZnMvZXh0NC9uYW1laS5jLTk5MS1cbmZzL2V4dDQvbmFtZWkuYzo5OTI6XHRpbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilmcmFtZXNbMF0uYmgtXHUwMDNlYl9kYXRhKTtcbmZzL2V4dDQvbmFtZWkuYy05OTMtXHRpZiAoSVNfRVJSKGluZm8pKVxuLS1cbmZzL2V4dDQvbmFtZWkuYz0yNDY1PXN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTI1NDMtXHQvKiBpbml0aWFsaXplIGhhc2hpbmcgaW5mbyAqL1xuZnMvZXh0NC9uYW1laS5jOjI1NDQ6XHRkeF9pbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCBkb3RfZGUpO1xuZnMvZXh0NC9uYW1laS5jLTI1NDUtXHRpZiAoSVNfRVJSKGR4X2luZm8pKSB7XG4tLVxuZnMvZXh0NC9uYW1laS5jPTI3NDg9c3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTI4OTAtXHRcdFx0ZHhfc2V0X2Jsb2NrKGVudHJpZXMgJiM0MzsgMCwgbmV3YmxvY2spO1xuZnMvZXh0NC9uYW1laS5jOjI4OTE6XHRcdFx0aW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopXG5mcy9leHQ0L25hbWVpLmMtMjg5Mi1cdFx0XHRcdFx0ICAgICAgZnJhbWVzWzBdLmJoLVx1MDAzZWJfZGF0YSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ2ODcwCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMjgxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFkZGluZyBgZHhfZ2V0X2R4X2luZm9gIHRvIHRoZSBGb2N1cyBTeW1ib2xzIGFuZCBSZWZpbmluZyBDb25maWd1cmF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gaW50ZWdyYXRpbmcgYGR4X2dldF9keF9pbmZvYCBpbnRvIHRoZSBgRm9jdXNTeW1ib2xzYCBsaXN0LiBHb29kLCB0aGF0JiMzOTtzIHN0cmFpZ2h0Zm9yd2FyZC4gTm93LCBsZXQmIzM5O3MganVzdCBkb3VibGUtY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jaWVzLiBUaGUgaW5pdGlhbCB0aG91Z2h0IHdhcyBgRVhUNF9GU2AsIHdoaWNoIHNlZW1zIHJpZ2h0LCBidXQgaXMgdGhlcmUgYW55dGhpbmcgZWxzZSBJIG5lZWQgdG8gY29uc2lkZXI/IEFoLCB0aGUgcGF0Y2ggbWVudGlvbnMgYEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBYC4gUmlnaHQsIHRoYXQmIzM5O3MgYW4gKmV4dDQgZmVhdHVyZSosIG5vdCBhIGtlcm5lbCBjb25maWcgaXRzZWxmLiBTbywgY29uZmlybWluZyB0aGF0IGBFWFQ0X0ZTYCBpcyBpbmRlZWQgc3VmZmljaWVudCBpcyB0aGUgY29ycmVjdCBhcHByb2FjaC4KCk5vdywgYSBxdWljayByZXZpZXcgb2YgdGhlIGV4aXN0aW5nIGBGb2N1c1N5bWJvbHNgIGlzIGluIG9yZGVyLiBMZXQmIzM5O3MgbWFrZSBzdXJlIEkgaGF2ZW4mIzM5O3QgbWlzc2VkIGFueXRoaW5nIG9idmlvdXMuIEkgaGF2ZToKCiogICBgZXh0NF9pb2N0bF9zZXRfbHVmaWRgCiogICBgZXh0NF9kaXJkYXRhX3NldF9sdWZpZGAKKiAgIGBleHQ0X2RpcmRhdGFfZ2V0YAoqICAgYGV4dDRfZGlyZGF0YV9zZXRgCiogICBgZXh0NF9sdWZpZF9zbmFwc2hvdGAKKiAgIGBleHQ0X2luc2VydF9kZW50cnlfZGF0YWAKKiAgIGBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhYAoqICAgYGR4X2dldF9keF9pbmZvYAoKTG9va3MgZ29vZCwgY292ZXJpbmcgYSBkZWNlbnQgcmFuZ2Ugb2YgZXh0NCYjMzk7cyBkaXJkYXRhIGZ1bmN0aW9uYWxpdGllcy4KCkxldCYjMzk7cyBkbyBvbmUgbGFzdCBzY2FuIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlIGp1bXBzIG91dCBhcyByZWxldmFudC4gSSYjMzk7bGwgbmVlZCB0byByZW1lbWJlciB0byBjaGVjayBmb3IgZnVuY3Rpb25zIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGltcGFjdGVkIG9yIHJlbGF0ZWQuIGBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW5gIGlzIGlubGluZSwgc28gaXQgd29uJiMzOTt0IGJlIGluIHRoZSBzeW1ib2wgdGFibGUsIGJ1dCBpdCYjMzk7cyB3b3J0aCBub3RpbmcgaGVyZSwgdG8ga2VlcCBpdCBpbiBtaW5kLiBTaW1pbGFybHksIGBleHQ0X2Rpcl9lbnRyeV9sZW5gIGlzIGFsc28gaW5saW5lLiBIbW0sIGBleHQ0X2NoZWNrX2R4X3Jvb3RgIGlzIG1vZGlmaWVkLCB0aGF0IG9uZSBpcyB3b3J0aCBzb21lIGFkZGl0aW9uYWwgc2NydXRpbnkuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfY2hlY2tfZHhfcm9vdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzL2V4dDQvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2ZzL2V4dDQvbmFtZWkuYz0yMzU2PXN0YXRpYyBpbnQgYWRkX2RpcmVudF90b19idWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy0yNDIwLVxuZnMvZXh0NC9uYW1laS5jOjI0MjE6c3RhdGljIGJvb2wgZXh0NF9jaGVja19keF9yb290KHN0cnVjdCBpbm9kZSAqZGlyLFxuZnMvZXh0NC9uYW1laS5jLTI0MjItXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkb3RfZGUsXG4tLVxuZnMvZXh0NC9uYW1laS5jPTI0NjU9c3RhdGljIGludCBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbi0tXG5mcy9leHQ0L25hbWVpLmMtMjUwMS1cdGRvdGRvdF9kZSA9IGV4dDRfbmV4dF9lbnRyeShkb3RfZGUsIGJsb2Nrc2l6ZSk7XG5mcy9leHQ0L25hbWVpLmM6MjUwMjpcdGlmICghZXh0NF9jaGVja19keF9yb290KGRpciwgZG90X2RlLCBkb3Rkb3RfZGUsIFx1MDAyNmRlKSkge1xuZnMvZXh0NC9uYW1laS5jLTI1MDMtXHRcdGJyZWxzZShiaCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ3ODgwCgkJCQkJCQlvdXRwdXQ6IDMwCgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqQWRkaW5nIGBleHQ0X2NoZWNrX2R4X3Jvb3RgIHRvIHRoZSBGb2N1cyBMaXN0ICZhbXA7IENvbnNpZGVyaW5nIGBleHQ0X3NldGVudGAqKgoKQWxyaWdodCwgSSYjMzk7bSBnb2luZyB0byBhZGQgYGV4dDRfY2hlY2tfZHhfcm9vdGAgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gSSBuZWVkIHRvIGtlZXAgYSBjbG9zZSBleWUgb24gdGhhdCBmdW5jdGlvbiBpbiB0aGUgY29udGV4dCBvZiBteSBjdXJyZW50IGludmVzdGlnYXRpb24uIEkgYW50aWNpcGF0ZSBpdCYjMzk7cyBsaWtlbHkgdG8gYmUgcmVsZXZhbnQgZ2l2ZW4gdGhlIGFyZWEgSSYjMzk7bSBwcm9iaW5nLgoKTm93LCBsZXQgbWUgc2hpZnQgZ2VhcnMgc2xpZ2h0bHkgYW5kIHJldmlzaXQgYGV4dDRfc2V0ZW50YC4gSSB3YW50IHRvIHF1aWNrbHkgcmUtZXZhbHVhdGUgaXQgYW5kIHNlZSBpZiBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgZmlyc3QgZm9jdXMuIEl0IHdpbGwgYmUgdXNlZnVsIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhpcyBjb250ZXh0LCBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMsIGJlZm9yZSBkaXZpbmcgaW4gZnVydGhlci4gSXQmIzM5O3MgZ29vZCB0byBrZWVwIG11bHRpcGxlIGFuZ2xlcyBpbiB2aWV3IGZvciBtb3JlIGVmZmVjdGl2ZSBkZWJ1Z2dpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2V4dDRfc2V0ZW50JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9uYW1laS5jPTM5MDA9c3RhdGljIGludCBleHQ0X3JlbmFtZV9kaXJfZmluaXNoKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTM5MjgtXG5mcy9leHQ0L25hbWVpLmM6MzkyOTpzdGF0aWMgaW50IGV4dDRfc2V0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsXG5mcy9leHQ0L25hbWVpLmMtMzkzMC1cdFx0ICAgICAgIHVuc2lnbmVkIGlubywgdW5zaWduZWQgZmlsZV90eXBlLFxuLS1cbmZzL2V4dDQvbmFtZWkuYz00MDA2PXN0YXRpYyB2b2lkIGV4dDRfcmVzZXRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCxcbi0tXG5mcy9leHQ0L25hbWVpLmMtNDAyNy1cbmZzL2V4dDQvbmFtZWkuYzo0MDI4Olx0ZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZvbGQsIGlubywgZmlsZV90eXBlLCBOVUxMKTtcbmZzL2V4dDQvbmFtZWkuYy00MDI5LVx0YnJlbHNlKG9sZC5iaCk7XG4tLVxuZnMvZXh0NC9uYW1laS5jPTQxNjE9c3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLFxuLS1cbmZzL2V4dDQvbmFtZWkuYy00MjkxLVx0XHQgKi9cbmZzL2V4dDQvbmFtZWkuYzo0MjkyOlx0XHRyZXR2YWwgPSBleHQ0X3NldGVudChoYW5kbGUsIFx1MDAyNm9sZCwgd2hpdGVvdXQtXHUwMDNlaV9pbm8sXG5mcy9leHQ0L25hbWVpLmMtNDI5My1cdFx0XHRcdCAgICAgRVhUNF9GVF9DSFJERVYsIE5VTEwpO1xuLS1cbmZzL2V4dDQvbmFtZWkuYy00MzE1LVx0XHR9XG5mcy9leHQ0L25hbWVpLmM6NDMxNjpcdFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZuZXcsXG5mcy9leHQ0L25hbWVpLmMtNDMxNy1cdFx0XHRcdCAgICAgb2xkLmlub2RlLVx1MDAzZWlfaW5vLCBvbGRfZmlsZV90eXBlLCBvbGRfZmlkKTtcbi0tXG5mcy9leHQ0L25hbWVpLmM9NDQyNz1zdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSxcbi0tXG5mcy9leHQ0L25hbWVpLmMtNDUzNS1cdFx0bmV3X2ZpbGVfdHlwZSBcdTAwMjY9IH5FWFQ0X0RJUkVOVF9MVUZJRDtcbmZzL2V4dDQvbmFtZWkuYzo0NTM2Olx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZuZXcsIG9sZC5pbm9kZS1cdTAwM2VpX2lubywgb2xkX2RlX2ZpbGVfdHlwZSxcbmZzL2V4dDQvbmFtZWkuYy00NTM3LVx0XHRcdCAgICAgb2xkX2ZpZCk7XG4tLVxuZnMvZXh0NC9uYW1laS5jLTQ1NDAtXG5mcy9leHQ0L25hbWVpLmM6NDU0MTpcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLCBuZXcuaW5vZGUtXHUwMDNlaV9pbm8sIG5ld19maWxlX3R5cGUsXG5mcy9leHQ0L25hbWVpLmMtNDU0Mi1cdFx0XHQgICAgIG5ld19maWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0ODgxOQoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDM1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGFzIGlmIHRoZXkgd2VyZSBteSBvd246CgoqKkludGVncmF0aW5nIHNyY19maWQgaW50byBleHQ0X3NldGVudCoqCgpSaWdodCwgc28gSSBuZWVkIHRvIG1vZGlmeSBgZXh0NF9zZXRlbnRgLiBUaGUgZ29hbCBpcyB0byBpbmNvcnBvcmF0ZSB0aGUgaGFuZGxpbmcgb2YgYHNyY19maWRgLiBUaGlzIGZlZWxzIGxpa2UgYSBzdHJhaWdodGZvcndhcmQsIHRob3VnaCBwb3RlbnRpYWxseSBkZWxpY2F0ZSwgY2hhbmdlLiBCZXN0IHRvIGJlIG1ldGljdWxvdXMgaGVyZS4gTm93LCBiZWZvcmUgSSBqdW1wIGluLCBJIHdhbnQgdG8gY29uZmlybSBob3cgYF9fZXh0NF9hZGRfZW50cnlgIGlzIGhhbmRsaW5nIGVudHJpZXMsIGFzIHRoYXQgaXMgbGlrZWx5IHRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgZ2V0IHVwZGF0ZWQuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoZSBpbnRlcmFjdGlvbnMuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgd2l0aCBhIHNhbml0eSBjaGVjayB0aGVyZSwgbWFraW5nIHN1cmUgdG8gY29uc2lkZXIgdGhlIGltcGxpY2F0aW9ucyBvbiB0aGUgaW5vZGUgc3RydWN0dXJlIGFuZCBkaXJlY3RvcnkgZW50cnkgbGF5b3V0LiBJdCYjMzk7cyBhIGtleSBlbnRyeSBwb2ludCwgYW5kIHRoYXQmIzM5O3MgdGhlIGFyZWEgSSBuZWVkIHRvIHVuZGVyc3RhbmQgbW9zdCBjbGVhcmx5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wNy8xNCAxOTo0MzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtfX2V4dDRfYWRkX2VudHJ5JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvZXh0NC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvZXh0NC9uYW1laS5jPTI0NjU9c3RhdGljIGludCBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbi0tXG5mcy9leHQ0L25hbWVpLmMtMjYyMS0gKi9cbmZzL2V4dDQvbmFtZWkuYzoyNjIyOnN0YXRpYyBpbnQgX19leHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbmZzL2V4dDQvbmFtZWkuYy0yNjIzLVx0XHRcdCAgY29uc3Qgc3RydWN0IHFzdHIgKmRfbmFtZSxcbi0tXG5mcy9leHQ0L25hbWVpLmM9MjczND1zdGF0aWMgaW50IGV4dDRfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcbi0tXG5mcy9leHQ0L25hbWVpLmMtMjc0MC1cdFx0cmV0dXJuIC1FTk9LRVk7XG5mcy9leHQ0L25hbWVpLmM6Mjc0MTpcdHJldHVybiBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGlyLCBcdTAwMjZkZW50cnktXHUwMDNlZF9uYW1lLCBpbm9kZSxcbmZzL2V4dDQvbmFtZWkuYy0yNzQyLVx0XHRcdFx0ZGVudHJ5LVx1MDAzZWRfZnNkYXRhKTtcbi0tXG5mcy9leHQ0L25hbWVpLmM9MzczNz1pbnQgX19leHQ0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tLVxuZnMvZXh0NC9uYW1laS5jLTM3NTktXG5mcy9leHQ0L25hbWVpLmM6Mzc2MDpcdGVyciA9IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsIGRfbmFtZSwgaW5vZGUsXG5mcy9leHQ0L25hbWVpLmMtMzc2MS1cdFx0XHQgICAgICAgZGVudHJ5ID8gZGVudHJ5LVx1MDAzZWRfZnNkYXRhIDogTlVMTCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ5NDUwCgkJCQkJCQlvdXRwdXQ6IDI1MgoJCQkJCQkJdGhvdWdodHM6IDMzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBFWFQ0IFBhdGNoKioKCk9rYXksIEkmIzM5O3ZlIHJldmlld2VkIHRoZSBjb2RlLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcywgbGV0JiMzOTtzIGluY2x1ZGUgYF9fZXh0NF9hZGRfZW50cnlgIGluIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBpbnZvbHZlZCwganVzdCB0byBlbnN1cmUgY29tcHJlaGVuc2l2ZSBjb3ZlcmFnZS4gU28gdGhhdCYjMzk7cyB0aGUgZmluYWwgbGlzdDoKCiogICBgZXh0NF9pb2N0bF9zZXRfbHVmaWRgCiogICBgZXh0NF9kaXJkYXRhX3NldF9sdWZpZGAKKiAgIGBleHQ0X2RpcmRhdGFfZ2V0YAoqICAgYGV4dDRfZGlyZGF0YV9zZXRgCiogICBgZXh0NF9sdWZpZF9zbmFwc2hvdGAKKiAgIGBleHQ0X2luc2VydF9kZW50cnlfZGF0YWAKKiAgIGBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhYAoqICAgYGR4X2dldF9keF9pbmZvYAoqICAgYGV4dDRfY2hlY2tfZHhfcm9vdGAKKiAgIGBleHQ0X3NldGVudGAKKiAgIGBfX2V4dDRfYWRkX2VudHJ5YAoKTm93LCByZWdhcmRpbmcgY29uZmlndXJhdGlvbiwgbXkgdW5kZXJzdGFuZGluZyBpcyB0aGF0IGBFWFQ0X0ZTYCBpcyB0aGUgcmVsZXZhbnQgY29uZmlnLiBIb3dldmVyLCBJIGFsd2F5cyBsaWtlIHRvIGRvdWJsZS1jaGVjayB0aGVzZSBhc3N1bXB0aW9ucy4gSSBzZWUgdGhlIHBhdGNoIHRvdWNoZXMgYGZzL2V4dDQvc3lzZnMuY2AsIGFkZGluZyBhIGBkaXJkYXRhYCBmZWF0dXJlLiBBbHNvLCBpdCBtb2RpZmllcyBgZnMvZXh0NC9mYXN0X2NvbW1pdC5jYCB3aXRoIHRoZSBpbmNsdXNpb24gb2YgYEVYVDRfRkNfUkVBU09OX0RJUkRBVEFgLCBhbmQgaXQgaGFuZGxlcyBkaXJkYXRhIGluIGBmcy9leHQ0L2lubGluZS5jYC4gVGhlcmUmIzM5O3MgdGhlIGFkZGl0aW9uIG9mIGBFWFQ0X0lPQ19TRVRfTFVGSURgIGluIGBmcy9leHQ0L2lvY3RsLmNgLiBUaGVuLCBzaWduaWZpY2FudCBjaGFuZ2VzIGFyZSBwcmVzZW50IGluIGBmcy9leHQ0L25hbWVpLmNgLCBhbmQgYGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50YCBnZXRzIG1vZGlmaWVkIGluIGBmcy9leHQ0L2Rpci5jYC4KCkJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIEkmIzM5O20gY29uZmlkZW50IHRoYXQgYEVYVDRfRlNgIGlzLCBpbiBmYWN0LCB0aGUgb25seSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY3kgZm9yIHRoaXMgY2hhbmdlLiBJJiMzOTttIHJlYWR5IHRvIHN1Ym1pdCBteSBmaW5kaW5ncyBhbmQgY29uY2x1c2lvbnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA3LzE0IDE5OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtFWFQ0X0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7ZXh0NF9pb2N0bF9zZXRfbHVmaWQmIzM0OywKICAgICYjMzQ7ZXh0NF9kaXJkYXRhX3NldF9sdWZpZCYjMzQ7LAogICAgJiMzNDtleHQ0X2RpcmRhdGFfZ2V0JiMzNDssCiAgICAmIzM0O2V4dDRfZGlyZGF0YV9zZXQmIzM0OywKICAgICYjMzQ7ZXh0NF9sdWZpZF9zbmFwc2hvdCYjMzQ7LAogICAgJiMzNDtleHQ0X2luc2VydF9kZW50cnlfZGF0YSYjMzQ7LAogICAgJiMzNDtleHQ0X2luaXRfbmV3X2Rpcl9kYXRhJiMzNDssCiAgICAmIzM0O2R4X2dldF9keF9pbmZvJiMzNDssCiAgICAmIzM0O2V4dDRfY2hlY2tfZHhfcm9vdCYjMzQ7LAogICAgJiMzNDtleHQ0X3NldGVudCYjMzQ7LAogICAgJiMzNDtfX2V4dDRfYWRkX2VudHJ5JiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0NCBmZWF0dXJlIGBkaXJkYXRhYCAoRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEpIGFuZCBhIG5ldyBpb2N0bCBgRVhUNF9JT0NfU0VUX0xVRklEYCB0byBhdHRhY2ggTFVGSUQgZGF0YSB0byBkaXJlY3RvcnkgZW50cmllcy4gSXQgbW9kaWZpZXMgY29yZSBkaXJlY3RvcnkgZW50cnkgcGFyc2luZywgaW5zZXJ0aW9uLCBzcGxpdHRpbmcsIGFuZCByZW5hbWluZyBsb2dpYyB0byBoYW5kbGUgdmFyaWFibGUtbGVuZ3RoIGRhdGEgYXBwZW5kZWQgdG8gZGlyZWN0b3J5IGVudHJpZXMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7RVhUNF9GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2V4dDRfaW9jdGxfc2V0X2x1ZmlkJiMzNDssCiAgICAmIzM0O2V4dDRfZGlyZGF0YV9zZXRfbHVmaWQmIzM0OywKICAgICYjMzQ7ZXh0NF9kaXJkYXRhX2dldCYjMzQ7LAogICAgJiMzNDtleHQ0X2RpcmRhdGFfc2V0JiMzNDssCiAgICAmIzM0O2V4dDRfbHVmaWRfc25hcHNob3QmIzM0OywKICAgICYjMzQ7ZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEmIzM0OywKICAgICYjMzQ7ZXh0NF9pbml0X25ld19kaXJfZGF0YSYjMzQ7LAogICAgJiMzNDtkeF9nZXRfZHhfaW5mbyYjMzQ7LAogICAgJiMzNDtleHQ0X2NoZWNrX2R4X3Jvb3QmIzM0OywKICAgICYjMzQ7ZXh0NF9zZXRlbnQmIzM0OywKICAgICYjMzQ7X19leHQ0X2FkZF9lbnRyeSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dDQgZmVhdHVyZSBgZGlyZGF0YWAgKEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBKSBhbmQgYSBuZXcgaW9jdGwgYEVYVDRfSU9DX1NFVF9MVUZJRGAgdG8gYXR0YWNoIExVRklEIGRhdGEgdG8gZGlyZWN0b3J5IGVudHJpZXMuIEl0IG1vZGlmaWVzIGNvcmUgZGlyZWN0b3J5IGVudHJ5IHBhcnNpbmcsIGluc2VydGlvbiwgc3BsaXR0aW5nLCBhbmQgcmVuYW1pbmcgbG9naWMgdG8gaGFuZGxlIHZhcmlhYmxlLWxlbmd0aCBkYXRhIGFwcGVuZGVkIHRvIGRpcmVjdG9yeSBlbnRyaWVzLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gdGhlIGV4dDQgZmlsZXN5c3RlbSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0MjowNy4zNTU0Njc5MzhaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjExMzg0ODY0NDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiRVhUNF9GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImV4dDRfaW9jdGxfc2V0X2x1ZmlkXCIsXG4gICAgXCJleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkXCIsXG4gICAgXCJleHQ0X2RpcmRhdGFfZ2V0XCIsXG4gICAgXCJleHQ0X2RpcmRhdGFfc2V0XCIsXG4gICAgXCJleHQ0X2x1ZmlkX3NuYXBzaG90XCIsXG4gICAgXCJleHQ0X2luc2VydF9kZW50cnlfZGF0YVwiLFxuICAgIFwiZXh0NF9pbml0X25ld19kaXJfZGF0YVwiLFxuICAgIFwiZHhfZ2V0X2R4X2luZm9cIixcbiAgICBcImV4dDRfY2hlY2tfZHhfcm9vdFwiLFxuICAgIFwiZXh0NF9zZXRlbnRcIixcbiAgICBcIl9fZXh0NF9hZGRfZW50cnlcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGV4dDQgZmVhdHVyZSBgZGlyZGF0YWAgKEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBKSBhbmQgYSBuZXcgaW9jdGwgYEVYVDRfSU9DX1NFVF9MVUZJRGAgdG8gYXR0YWNoIExVRklEIGRhdGEgdG8gZGlyZWN0b3J5IGVudHJpZXMuIEl0IG1vZGlmaWVzIGNvcmUgZGlyZWN0b3J5IGVudHJ5IHBhcnNpbmcsIGluc2VydGlvbiwgc3BsaXR0aW5nLCBhbmQgcmVuYW1pbmcgbG9naWMgdG8gaGFuZGxlIHZhcmlhYmxlLWxlbmd0aCBkYXRhIGFwcGVuZGVkIHRvIGRpcmVjdG9yeSBlbnRyaWVzLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgZnVuY3Rpb25hbCBjaGFuZ2UgdG8gdGhlIGV4dDQgZmlsZXN5c3RlbSB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQyOjA3LjM1NTQ3NTUxOFoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Njg0NTcwNjg5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYjQ0MTU4ODE4Y2RiYmY4ZTIyODFhYjI4N2YxN2Q5NzFhNzZiYmZkZFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEp1bCAxNCAxOTo0MjowNSAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2Rpci5jIGIvZnMvZXh0NC9kaXIuY1xcbmluZGV4IDE3ZWRkNjc4ZmE4N2I4Li41MGM0OGM1MGEyOWQ4OCAxMDA2NDRcXG4tLS0gYS9mcy9leHQ0L2Rpci5jXFxuKysrIGIvZnMvZXh0NC9kaXIuY1xcbkBAIC04OSwxNiArODksMTUgQEAgaW50IF9fZXh0NF9jaGVja19kaXJfZW50cnkoY29uc3QgY2hhciAqZnVuY3Rpb24sIHVuc2lnbmVkIGludCBsaW5lLFxcbiBcXHRib29sIGZha2UgPSBpc19mYWtlX2Rpcl9lbnRyeShkZSk7XFxuIFxcdGJvb2wgaGFzX2NzdW0gPSBleHQ0X2hhc19mZWF0dXJlX21ldGFkYXRhX2NzdW0oZGlyLVxcdTAwM2VpX3NiKTtcXG4gXFxuLVxcdGlmICh1bmxpa2VseShybGVuIFxcdTAwM2MgZXh0NF9kaXJfcmVjX2xlbigxLCBmYWtlID8gTlVMTCA6IGRpcikpKVxcbitcXHRpZiAodW5saWtlbHkocmxlbiBcXHUwMDNjIGV4dDRfZGlyZW50X3JlY19sZW4oMSwgZmFrZSA/IE5VTEwgOiBkaXIpKSlcXG4gXFx0XFx0ZXJyb3JfbXNnID0gXFxcInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWxcXFwiO1xcbiBcXHRlbHNlIGlmICh1bmxpa2VseShybGVuICUgNCAhPSAwKSlcXG4gXFx0XFx0ZXJyb3JfbXNnID0gXFxcInJlY19sZW4gJSA0ICE9IDBcXFwiO1xcbi1cXHRlbHNlIGlmICh1bmxpa2VseShybGVuIFxcdTAwM2MgZXh0NF9kaXJfcmVjX2xlbihkZS1cXHUwMDNlbmFtZV9sZW4sXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdGZha2UgPyBOVUxMIDogZGlyKSkpXFxuLVxcdFxcdGVycm9yX21zZyA9IFxcXCJyZWNfbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtZV9sZW5cXFwiO1xcbiBcXHRlbHNlIGlmICh1bmxpa2VseShuZXh0X29mZnNldCBcXHUwMDNlIHNpemUpKVxcbiBcXHRcXHRlcnJvcl9tc2cgPSBcXFwiZGlyZWN0b3J5IGVudHJ5IG92ZXJydW5cXFwiO1xcbi1cXHRlbHNlIGlmICh1bmxpa2VseShuZXh0X29mZnNldCBcXHUwMDNlIHNpemUgLSBleHQ0X2Rpcl9yZWNfbGVuKDEsXFxuK1xcdGVsc2UgaWYgKHVubGlrZWx5KHJsZW4gXFx1MDAzYyBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIHNpemUsIGZha2UgPyBOVUxMIDogZGlyKSkpXFxuK1xcdFxcdGVycm9yX21zZyA9IFxcXCJyZWNfbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtZV9sZW5cXFwiO1xcbitcXHRlbHNlIGlmICh1bmxpa2VseShuZXh0X29mZnNldCBcXHUwMDNlIHNpemUgLSBleHQ0X2RpcmVudF9yZWNfbGVuKDEsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgaGFzX2NzdW0gPyBOVUxMIDogZGlyKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHRcXHQgIG5leHRfb2Zmc2V0ICE9IHNpemUpKVxcbiBcXHRcXHRlcnJvcl9tc2cgPSBcXFwiZGlyZWN0b3J5IGVudHJ5IHRvbyBjbG9zZSB0byBibG9jayBlbmRcXFwiO1xcbkBAIC0yNDUsNyArMjQ0LDcgQEAgc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxcbiBcXHRcXHRcXHRcXHQgKiBmYWlsdXJlIHdpbGwgYmUgZGV0ZWN0ZWQgaW4gdGhlXFxuIFxcdFxcdFxcdFxcdCAqIGRpcmVudCB0ZXN0IGJlbG93LiAqL1xcbiBcXHRcXHRcXHRcXHRpZiAoZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cXHUwMDNlcmVjX2xlbixcXG4tXFx0XFx0XFx0XFx0XFx0c2ItXFx1MDAzZXNfYmxvY2tzaXplKSBcXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSxcXG4rXFx0XFx0XFx0XFx0XFx0c2ItXFx1MDAzZXNfYmxvY2tzaXplKSBcXHUwMDNjIGV4dDRfZGlyZW50X3JlY19sZW4oMSxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0aW5vZGUpKVxcbiBcXHRcXHRcXHRcXHRcXHRicmVhaztcXG4gXFx0XFx0XFx0XFx0aSArPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVxcdTAwM2VyZWNfbGVuLFxcbkBAIC00NjgsMjcgKzQ2Nyw0MyBAQCB2b2lkIGV4dDRfaHRyZWVfZnJlZV9kaXJfaW5mbyhzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqcClcXG4gICogVGhlIGRlY3J5cHRlZCBmaWxlbmFtZSBpcyBwYXNzZWQgaW4gdmlhIGVudF9uYW1lLiAgcGFyYW1ldGVyLlxcbiAgKi9cXG4gaW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCxcXG4tXFx0XFx0XFx0ICAgICBfX3UzMiBtaW5vcl9oYXNoLFxcbitcXHRcXHRcXHQgICAgIF9fdTMyIG1pbm9yX2hhc2gsIGludCBidWZfc2l6ZSxcXG4gXFx0XFx0XFx0ICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQsXFxuIFxcdFxcdFxcdCAgICBzdHJ1Y3QgZnNjcnlwdF9zdHIgKmVudF9uYW1lKVxcbiB7XFxuIFxcdHN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudCA9IE5VTEw7XFxuIFxcdHN0cnVjdCBmbmFtZSAqZm5hbWUsICpuZXdfZm47XFxuIFxcdHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICppbmZvO1xcbitcXHRpbnQgZXh0cmFfZGF0YSA9IDA7XFxuIFxcbiBcXHRpbmZvID0gZGlyX2ZpbGUtXFx1MDAzZXByaXZhdGVfZGF0YTtcXG4gXFx0cCA9IFxcdTAwMjZpbmZvLVxcdTAwM2Vyb290LnJiX25vZGU7XFxuIFxcbiBcXHQvKiBDcmVhdGUgYW5kIGFsbG9jYXRlIHRoZSBmbmFtZSBzdHJ1Y3R1cmUgKi9cXG4tXFx0bmV3X2ZuID0ga3phbGxvY19mbGV4KCpuZXdfZm4sIG5hbWUsIGVudF9uYW1lLVxcdTAwM2VsZW4gKyAxKTtcXG4rXFx0aWYgKGRpcmVudC1cXHUwMDNlZmlsZV90eXBlIFxcdTAwMjYgfkVYVDRfRlRfTUFTSykge1xcbitcXHRcXHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9XFxuK1xcdFxcdFxcdGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGlyZW50LVxcdTAwM2VyZWNfbGVuLCBidWZfc2l6ZSk7XFxuK1xcdFxcdGV4dHJhX2RhdGEgPSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oZGlyZW50LCByZWNfbGVuKTtcXG4rXFx0fVxcbitcXG4rXFx0LyogZXh0YV9kYXRhIGNvbnRhaW5zICsxIGJ5dGUgZm9yIE5VTEwgKi9cXG4rXFx0bmV3X2ZuID0ga3phbGxvY19mbGV4KCpuZXdfZm4sIG5hbWUsIGVudF9uYW1lLVxcdTAwM2VsZW4gK1xcbitcXHRcXHRcXHQgICAgICAoZXh0cmFfZGF0YSA/IGV4dHJhX2RhdGEgOiAxKSk7XFxuIFxcdGlmICghbmV3X2ZuKVxcbiBcXHRcXHRyZXR1cm4gLUVOT01FTTtcXG4gXFx0bmV3X2ZuLVxcdTAwM2VoYXNoID0gaGFzaDtcXG4gXFx0bmV3X2ZuLVxcdTAwM2VtaW5vcl9oYXNoID0gbWlub3JfaGFzaDtcXG4gXFx0bmV3X2ZuLVxcdTAwM2Vpbm9kZSA9IGxlMzJfdG9fY3B1KGRpcmVudC1cXHUwMDNlaW5vZGUpO1xcbi1cXHRuZXdfZm4tXFx1MDAzZW5hbWVfbGVuID0gZW50X25hbWUtXFx1MDAzZWxlbjtcXG4gXFx0bmV3X2ZuLVxcdTAwM2VmaWxlX3R5cGUgPSBkaXJlbnQtXFx1MDAzZWZpbGVfdHlwZTtcXG4rXFx0bmV3X2ZuLVxcdTAwM2VuYW1lX2xlbiA9IGVudF9uYW1lLVxcdTAwM2VsZW47XFxuIFxcdG1lbWNweShuZXdfZm4tXFx1MDAzZW5hbWUsIGVudF9uYW1lLVxcdTAwM2VuYW1lLCBlbnRfbmFtZS1cXHUwMDNlbGVuKTtcXG4rXFx0aWYgKGV4dHJhX2RhdGEpXFxuK1xcdFxcdC8qIERpcmRhdGEgYnl0ZXMgbGllIHBhc3QgdGhlIF9fY291bnRlZF9ieShuYW1lX2xlbikgYm91bmQgYnV0XFxuK1xcdFxcdCAqIHdpdGhpbiB0aGUga3phbGxvY19mbGV4IGFsbG9jYXRpb247IHVzZSB1bnNhZmVfbWVtY3B5IHRvXFxuK1xcdFxcdCAqIGF2b2lkIGEgRk9SVElGWV9TT1VSQ0UgZmFsc2UgcG9zaXRpdmUuICovXFxuK1xcdFxcdHVuc2FmZV9tZW1jcHkobmV3X2ZuLVxcdTAwM2VuYW1lICsgZW50X25hbWUtXFx1MDAzZWxlbixcXG4rXFx0XFx0XFx0ICAgICAgZGlyZW50LVxcdTAwM2VuYW1lICsgZGlyZW50LVxcdTAwM2VuYW1lX2xlbiwgZXh0cmFfZGF0YSxcXG4rXFx0XFx0XFx0ICAgICAgLyogd2l0aGluIGt6YWxsb2NfZmxleCBhbGxvY2F0aW9uICovKTtcXG4gXFxuIFxcdHdoaWxlICgqcCkge1xcbiBcXHRcXHRwYXJlbnQgPSAqcDtcXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaFxcbmluZGV4IGIzN2MxMzZlYTNhYjMzLi4xNWQ4ODVjZjNiZDAyNSAxMDA2NDRcXG4tLS0gYS9mcy9leHQ0L2V4dDQuaFxcbisrKyBiL2ZzL2V4dDQvZXh0NC5oXFxuQEAgLTEyMjcsNiArMTIyNyw3IEBAIHN0cnVjdCBleHQ0X2lub2RlX2luZm8ge1xcbiAjaWZkZWYgQ09ORklHX0ZTX0VOQ1JZUFRJT05cXG4gXFx0c3RydWN0IGZzY3J5cHRfaW5vZGVfaW5mbyAqaV9jcnlwdF9pbmZvO1xcbiAjZW5kaWZcXG4rXFx0dm9pZCAqaV9kaXJkYXRhO1xcbiB9O1xcbiBcXG4gLypcXG5AQCAtMjMzNCw2ICsyMzM1LDcgQEAgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZVTkNTKGNhc2Vmb2xkLFxcdFxcdENBU0VGT0xEKVxcbiBcXHRcXHRcXHRcXHRcXHQgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkd8IFxcXFxcXG4gXFx0XFx0XFx0XFx0XFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FQV9JTk9ERXwgXFxcXFxcbiBcXHRcXHRcXHRcXHRcXHQgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX01NUCB8IFxcXFxcXG4rXFx0XFx0XFx0XFx0XFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9ESVJEQVRBIHwgXFxcXFxcbiBcXHRcXHRcXHRcXHRcXHQgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0lOTElORV9EQVRBIHwgXFxcXFxcbiBcXHRcXHRcXHRcXHRcXHQgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VOQ1JZUFQgfCBcXFxcXFxuIFxcdFxcdFxcdFxcdFxcdCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfQ0FTRUZPTEQgfCBcXFxcXFxuQEAgLTI0NzIsMTAgKzI0NzQsOCBAQCBzdGF0aWMgaW5saW5lIGludCBleHQ0X2VtZXJnZW5jeV9zdGF0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiAgKiBTdHJ1Y3R1cmUgb2YgYSBkaXJlY3RvcnkgZW50cnlcXG4gICovXFxuICNkZWZpbmUgRVhUNF9OQU1FX0xFTiAyNTVcXG4tLypcXG4tICogQmFzZSBsZW5ndGggb2YgdGhlIGV4dDQgZGlyZWN0b3J5IGVudHJ5IGV4Y2x1ZGluZyB0aGUgbmFtZSBsZW5ndGhcXG4tICovXFxuLSNkZWZpbmUgRVhUNF9CQVNFX0RJUl9MRU4gKHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMikgLSBFWFQ0X05BTUVfTEVOKVxcbisvKiBvZmZzZXRvZiBhdm9pZHMgc2l6ZW9mKCkrcGFkZGluZyBnaXZpbmcgOSBpbnN0ZWFkIG9mIHRoZSBjb3JyZWN0IG9uLWRpc2sgOCAqL1xcbisjZGVmaW5lIEVYVDRfQkFTRV9ESVJfTEVOIG9mZnNldG9mKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yLCBuYW1lKVxcbiBcXG4gc3RydWN0IGV4dDRfZGlyX2VudHJ5IHtcXG4gXFx0X19sZTMyXFx0aW5vZGU7XFx0XFx0XFx0LyogSW5vZGUgbnVtYmVyICovXFxuQEAgLTI1NTYsNiArMjU1Niw2MSBAQCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCB7XFxuICNkZWZpbmUgRVhUNF9GVF9TWU1MSU5LXFx0XFx0N1xcbiBcXG4gI2RlZmluZSBFWFQ0X0ZUX01BWFxcdFxcdDhcXG4rI2RlZmluZSBFWFQ0X0ZUX01BU0tcXHRcXHQweGZcXG4rXFxuKyNpZiBFWFQ0X0ZUX01BWCBcXHUwMDNlIEVYVDRfRlRfTUFTS1xcbisjZXJyb3IgXFxcImNvbmZsaWN0aW5nIEVYVDRfRlRfTUFYIGFuZCBFWFQ0X0ZUX01BU0tcXFwiXFxuKyNlbmRpZlxcbitcXG4rLypcXG4rICogZF90eXBlIGhhcyA0IHVudXNlZCBiaXRzLCBzbyBpdCBjYW4gaG9sZCBmb3VyIHR5cGVzIG9mIGRhdGEuIFRoZXNlIGRpZmZlcmVudFxcbisgKiB0eXBlcyBvZiBkYXRhIChlLmcuIGZzY3lwdCBoYXNoLCBoaWdoIDMyIGJpdHMgb2YgNjQtYml0IGlub2RlIG51bWJlcikgY2FuIGJlXFxuKyAqIHN0b3JlZCwgaW4gZmxhZyBvcmRlciwgYWZ0ZXIgZmlsZS1uYW1lIGluIGV4dDQgZGlyZW50LlxcbisgKlxcbisgKiBUaGVzZSBmbGFncyBhcmUgYWRkZWQgdG8gZF90eXBlIGlmIGV4dDQgZGlyZW50IGhhcyBleHRyYSBkYXRhIGFmdGVyXFxuKyAqIGZpbGVuYW1lLiBUaGlzIGRhdGEgbGVuZ3RoIGlzIHZhcmlhYmxlIGFuZCBsZW5ndGggaXMgc3RvcmVkIGluIGZpcnN0IGJ5dGVcXG4rICogb2YgZGF0YS4gRGF0YSBzdGFydHMgYWZ0ZXIgZmlsZW5hbWUgTlVMIGJ5dGUuXFxuKyAqL1xcbisjZGVmaW5lIEVYVDRfRElSRU5UX0xVRklEXFx0XFx0MHgxMFxcbisjZGVmaW5lIEVYVDRfRElSRU5UX0lOTzY0XFx0XFx0MHgyMFxcbisjZGVmaW5lIEVYVDRfRElSRU5UX0NGSEFTSFxcdFxcdDB4NDBcXG4rXFxuK3N0cnVjdCBleHQ0X2ZpZCB7XFxuK1xcdGNoYXIgICAgZmlkWzE2XTsgICAgIC8qIDEyOC1iaXQgdW5pcXVlIGZpbGUgaWRlbnRpZmllciAqL1xcbit9O1xcbitcXG4rc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyIHtcXG4rXFx0LyogbGVuZ3RoIG9mIHRoaXMgaGVhZGVyICsgdGhlIHdob2xlIGRhdGEgYmxvYiAqL1xcbitcXHRfX3U4XFx0ZGRoX2xlbmd0aDtcXG4rfSBfX3BhY2tlZDtcXG4rXFxuK3N0cnVjdCBleHQ0X2RpcmVudF9maWQge1xcbitcXHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIgZGZfaGVhZGVyO1xcbitcXHRzdHJ1Y3QgZXh0NF9maWQgICAgICAgICAgICAgICAgZGZfZmlkW107XFxuK307XFxuK1xcbisjZGVmaW5lIEVYVDRfTFVGSURfTUFHSUMgICAgMHhBRDIwMDkwN1VMXFxuK3N0cnVjdCBleHQ0X2RlbnRyeV9wYXJhbSB7XFxuK1xcdF9fdTMyXFx0XFx0XFx0ZWRwX21hZ2ljO1xcdC8qIEVYVDRfTFVGSURfTUFHSUMgKi9cXG4rXFx0c3RydWN0IGV4dDRfZGlyZW50X2ZpZFxcdGVkcF9kZmlkO1xcbit9O1xcbitcXG4rc3RydWN0IGV4dDRfZGlyZW50X2hhc2gge1xcbitcXHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXJcXHRkaF9oZWFkZXI7XFxuK1xcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV9oYXNoXFx0ZGhfaGFzaDtcXG4rfSBfX3BhY2tlZDtcXG4rXFxuK3N0YXRpYyBpbmxpbmVcXG4rc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZXh0NF9kZW50cnlfZ2V0X2ZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICpwKVxcbit7XFxuK1xcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKHNiKSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChwIFxcdTAwMjZcXHUwMDI2IHAtXFx1MDAzZWVkcF9tYWdpYyA9PSBFWFQ0X0xVRklEX01BR0lDKVxcbitcXHRcXHRyZXR1cm4gXFx1MDAyNnAtXFx1MDAzZWVkcF9kZmlkO1xcbitcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4gXFxuICNkZWZpbmUgRVhUNF9GVF9ESVJfQ1NVTVxcdDB4REVcXG4gXFxuQEAgLTI1NzMsMTMgKzI2MjgsMjYgQEAgc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwge1xcbiAgKiBjYXNlZm9sZGVkIGFuZCBlbmNyeXB0ZWQgbmVlZCB0byBzdG9yZSB0aGUgaGFzaCBhcyB3ZWxsLCBzbyB3ZSBhZGQgcm9vbSBmb3JcXG4gICogZXh0NF9leHRlbmRlZF9kaXJfZW50cnlfMi4gRm9yIGFsbCBlbnRyaWVzIHJlbGF0ZWQgdG8gJy4nIG9yICcuLicgeW91IHNob3VsZFxcbiAgKiBwYXNzIE5VTEwgZm9yIGRpciwgYXMgdGhvc2UgZW50cmllcyBkbyBub3QgdXNlIHRoZSBleHRyYSBmaWVsZHMuXFxuKyAqXFxuKyAqIEZvciBkaXJlY3RvcmllcyB3aXRoIHRoZSBkaXJkYXRhIGZlYXR1cmUsIGV4dHJhIGRhdGEgbWF5IGZvbGxvdyB0aGUgZmlsZW5hbWUuXFxuKyAqIFVzZSBleHQ0X2Rpcl9lbnRyeV9sZW4oKSB0byBjb21wdXRlIHRoZSBsZW5ndGggb2YgYSBkaXJlY3RvcnkgZW50cnlcXG4rICogaW5jbHVkaW5nIGFueSBkaXJkYXRhLCBvciBleHQ0X2RpcmVudF9yZWNfbGVuKCkgZGlyZWN0bHkgd2hlbiB0aGUgdG90YWxcXG4rICogbmFtZV9sZW4gKGluY2x1ZGluZyBkaXJkYXRhIGxlbmd0aCkgaXMgYWxyZWFkeSBrbm93bi5cXG4gICovXFxuLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV4dDRfZGlyX3JlY19sZW4oX191OCBuYW1lX2xlbixcXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXh0NF9kaXJlbnRfcmVjX2xlbih1bnNpZ25lZCBpbnQgbmFtZV9sZW4sXFxuIFxcdFxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyKVxcbiB7XFxuLVxcdGludCByZWNfbGVuID0gKG5hbWVfbGVuICsgOCArIEVYVDRfRElSX1JPVU5EKTtcXG4rXFx0dW5zaWduZWQgaW50IHJlY19sZW4gPSAobmFtZV9sZW4gKyA4ICsgRVhUNF9ESVJfUk9VTkQpO1xcbiBcXG4tXFx0aWYgKGRpciBcXHUwMDI2XFx1MDAyNiBleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpXFxuK1xcdC8qXFxuK1xcdCAqIFdpdGhvdXQgZGlyZGF0YSwgdGhlIGNhc2Vmb2xkK2ZzY3J5cHQgaGFzaCBsaXZlcyBhdCBhIGZpeGVkIHBvc2l0aW9uXFxuK1xcdCAqIGFmdGVyIHRoZSBmaWxlbmFtZSBhbmQgbXVzdCBiZSByZXNlcnZlZCBleHBsaWNpdGx5LiAgV2l0aCBkaXJkYXRhIHRoZVxcbitcXHQgKiBoYXNoIGlzIHN0b3JlZCBhcyBhIENGSEFTSCBleHRlbnNpb24gYW5kIGlzIGFscmVhZHkgY291bnRlZCBpbiB0aGVcXG4rXFx0ICogbmFtZV9sZW4gYXJndW1lbnQgKHZpYSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4pLCBzbyBhZGRpbmcgaXQgYWdhaW5cXG4rXFx0ICogd291bGQgZG91YmxlLWNvdW50LlxcbitcXHQgKi9cXG4rXFx0aWYgKGRpciBcXHUwMDI2XFx1MDAyNiBleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVxcdTAwM2VpX3NiKSlcXG4gXFx0XFx0cmVjX2xlbiArPSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X2hhc2gpO1xcbiBcXHRyZXR1cm4gKHJlY19sZW4gXFx1MDAyNiB+RVhUNF9ESVJfUk9VTkQpO1xcbiB9XFxuQEAgLTI2NjcsNiArMjczNSw4IEBAIHN0cnVjdCBleHQ0X2ZpbGVuYW1lIHtcXG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpXFxuIFxcdHN0cnVjdCBxc3RyIGNmX25hbWU7XFxuICNlbmRpZlxcbitcXHQvKiBMVUZJRC9kaXJkYXRhIHBheWxvYWQgdG8gZW1iZWQgaW4gdGhlIG5ldyBkaXJlY3RvcnkgZW50cnksIG9yIE5VTEwgKi9cXG4rXFx0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZDtcXG4gfTtcXG4gXFxuICNkZWZpbmUgZm5hbWVfbmFtZShwKSAoKHApLVxcdTAwM2VkaXNrX25hbWUubmFtZSlcXG5AQCAtMjk3OCwxOCArMzA0OCwyNyBAQCBleHRlcm4gaW50IF9fZXh0NF9jaGVja19kaXJfZW50cnkoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBpbm9kZSAqLFxcbiBcXHR1bmxpa2VseShfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KF9fZnVuY19fLCBfX0xJTkVfXywgKGRpciksIChmaWxwKSwgXFxcXFxcbiBcXHRcXHRcXHRcXHQoZGUpLCAoYmgpLCAoYnVmKSwgKHNpemUpLCAob2Zmc2V0KSkpXFxuIGV4dGVybiBpbnQgZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBoYXNoLFxcbi1cXHRcXHRcXHRcXHRfX3UzMiBtaW5vcl9oYXNoLFxcbitcXHRcXHRcXHRcXHRfX3UzMiBtaW5vcl9oYXNoLCBpbnQgYnVmX3NpemUsXFxuIFxcdFxcdFxcdFxcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQsXFxuIFxcdFxcdFxcdFxcdHN0cnVjdCBmc2NyeXB0X3N0ciAqZW50X25hbWUpO1xcbiBleHRlcm4gdm9pZCBleHQ0X2h0cmVlX2ZyZWVfZGlyX2luZm8oc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKnApO1xcbiBleHRlcm4gaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbiBcXHRcXHRcXHQgICAgIHZvaWQgKmJ1ZiwgaW50IGJ1Zl9zaXplLFxcbiBcXHRcXHRcXHQgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4tXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmRlc3RfZGUpO1xcbi12b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcXG4tXFx0XFx0XFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxcbi1cXHRcXHRcXHRpbnQgYnVmX3NpemUsXFxuLVxcdFxcdFxcdHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSk7XFxuK1xcdFxcdFxcdCAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipkZXN0X2RlLFxcbitcXHRcXHRcXHQgICAgIGludCBkbGVuKTtcXG4rdm9pZCBleHQ0X2luc2VydF9kZW50cnlfZGF0YShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcXG4rXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsXFxuK1xcdFxcdFxcdCAgICAgaW50IGJ1Zl9zaXplLFxcbitcXHRcXHRcXHQgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4rXFx0XFx0XFx0ICAgICB2b2lkICpkYXRhKTtcXG4rc3RhdGljIGlubGluZSB2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxcbitcXHRcXHRcXHRcXHQgICAgICBpbnQgYnVmX3NpemUsXFxuK1xcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSlcXG4re1xcbitcXHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgYnVmX3NpemUsIGZuYW1lLCBOVUxMKTtcXG4rfVxcbiBzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF91cGRhdGVfZHhfZmxhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiB7XFxuIFxcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9kaXJfaW5kZXgoaW5vZGUtXFx1MDAzZWlfc2IpIFxcdTAwMjZcXHUwMDI2XFxuQEAgLTMwMDMsMTIgKzMwODIsMTQgQEAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXh0NF9maWxldHlwZV90YWJsZVtdID0ge1xcbiBcXHREVF9VTktOT1dOLCBEVF9SRUcsIERUX0RJUiwgRFRfQ0hSLCBEVF9CTEssIERUX0ZJRk8sIERUX1NPQ0ssIERUX0xOS1xcbiB9O1xcbiBcXG4tc3RhdGljIGlubGluZSAgdW5zaWduZWQgY2hhciBnZXRfZHR5cGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGZpbGV0eXBlKVxcbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSlcXG4ge1xcbi1cXHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoc2IpIHx8IGZpbGV0eXBlIFxcdTAwM2U9IEVYVDRfRlRfTUFYKVxcbitcXHR1bnNpZ25lZCBjaGFyIGZsX2luZGV4ID0gZmlsZXR5cGUgXFx1MDAyNiBFWFQ0X0ZUX01BU0s7XFxuK1xcbitcXHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoc2IpIHx8IGZsX2luZGV4IFxcdTAwM2U9IEVYVDRfRlRfTUFYKVxcbiBcXHRcXHRyZXR1cm4gRFRfVU5LTk9XTjtcXG4gXFxuLVxcdHJldHVybiBleHQ0X2ZpbGV0eXBlX3RhYmxlW2ZpbGV0eXBlXTtcXG4rXFx0cmV0dXJuIGV4dDRfZmlsZXR5cGVfdGFibGVbZmxfaW5kZXhdO1xcbiB9XFxuIGV4dGVybiBpbnQgZXh0NF9jaGVja19hbGxfZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXFxuIFxcdFxcdFxcdCAgICAgdm9pZCAqYnVmLCBpbnQgYnVmX3NpemUpO1xcbkBAIC0zMjMxLDEwICszMzEyLDE4IEBAIGV4dGVybiBpbnQgZXh0NF9leHRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKik7XFxuIGV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG4gXFxuIC8qIG5hbWVpLmMgKi9cXG4tZXh0ZXJuIGludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4tXFx0XFx0XFx0ICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcXG4rZXh0ZXJuIGludCBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbitcXHRcXHRcXHRcXHQgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuK1xcdFxcdFxcdFxcdCAgY29uc3Qgdm9pZCAqZGF0YTEsIGNvbnN0IHZvaWQgKmRhdGEyKTtcXG4rc3RhdGljIGlubGluZSBpbnQgZXh0NF9pbml0X25ld19kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuK1xcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbit7XFxuK1xcdHJldHVybiBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhKGhhbmRsZSwgZGlyLCBpbm9kZSwgTlVMTCwgTlVMTCk7XFxuK31cXG4gZXh0ZXJuIGludCBleHQ0X2RpcmJsb2NrX2NzdW1fdmVyaWZ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIFxcdFxcdFxcdFxcdCAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7XFxuK2V4dGVybiBpbnQgZXh0NF9kaXJkYXRhX3NldF9sdWZpZChzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3QgY2hhciAqZmlsZW5hbWUsXFxuK1xcdFxcdFxcdCAgIGludCBuYW1lbGVuLCBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKmVkcCk7XFxuIGV4dGVybiBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLFxcbiBcXHRcXHRcXHRcXHRfX3UzMiBzdGFydF9taW5vcl9oYXNoLCBfX3UzMiAqbmV4dF9oYXNoKTtcXG4gZXh0ZXJuIGludCBleHQ0X3NlYXJjaF9kaXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcXG5AQCAtMzgwNyw2ICszODk2LDEwIEBAIGV4dGVybiBpbnQgX19leHQ0X3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKmRfbmFtZSxcXG4gXFx0XFx0XFx0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7XFxuIGV4dGVybiBpbnQgX19leHQ0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIFxcdFxcdCAgICAgICBjb25zdCBzdHJ1Y3QgcXN0ciAqZF9uYW1lLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpO1xcbitleHRlcm4gdW5zaWduZWQgY2hhciBleHQ0X2RpcmRhdGFfZ2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGlub2RlICpkaXIsIGludCBidWZfc2l6ZSxcXG4rXFx0XFx0XFx0XFx0ICAgICAgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAgKmx1ZmlkLFxcbitcXHRcXHRcXHRcXHQgICAgICBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbyk7XFxuIFxcbiAjZGVmaW5lIFNfU0hJRlQgMTJcXG4gc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXh0NF90eXBlX2J5X21vZGVbKFNfSUZNVCBcXHUwMDNlXFx1MDAzZSBTX1NISUZUKSArIDFdID0ge1xcbkBAIC00MDA0LDYgKzQwOTcsMTA5IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2NsZWFyX2lvX3Vud3JpdHRlbl9mbGFnKGV4dDRfaW9fZW5kX3QgKmlvX2VuZClcXG4gXFx0XFx0aW9fZW5kLVxcdTAwM2VmbGFnIFxcdTAwMjY9IH5FWFQ0X0lPX0VORF9VTldSSVRURU47XFxuIH1cXG4gXFxuKy8qXFxuKyAqIEFkdmFuY2UgdG8gdGhlIG5leHQgZGlyZGF0YSByZWNvcmQgaGVhZGVyIHN0YXJ0aW5nIGZyb20gQGRkaC5cXG4rICovXFxuKyNkZWZpbmUgZXh0NF9kaXJkYXRhX25leHQoZGRoKSBcXFxcXFxuK1xcdCgoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopKChjaGFyICopKGRkaCkgKyAoZGRoKS1cXHUwMDNlZGRoX2xlbmd0aCkpXFxuK1xcbisvKlxcbisgKiBleHQ0X2Rpcl9lbnRyeV9pc190YWlsKCkgLSBDaGVjayBpZiBhIGRpcmVjdG9yeSBlbnRyeSBpcyBhIHRhaWwgZW50cnkuXFxuKyAqIEBkZTogZGlyZWN0b3J5IGVudHJ5IHRvIGNoZWNrXFxuKyAqXFxuKyAqIFJldHVybnMgdHJ1ZSBpZiBAZGUgaXMgYSBkaXJlY3RvcnkgYmxvY2sgdGFpbCBlbnRyeSAoY2hlY2tzdW0gcmVjb3JkKS5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgYm9vbCBleHQ0X2Rpcl9lbnRyeV9pc190YWlsKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSlcXG4re1xcbitcXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCAqdCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCAqKWRlO1xcbitcXG4rXFx0cmV0dXJuICF0LVxcdTAwM2VkZXRfcmVzZXJ2ZWRfemVybzEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICAgIGxlMTZfdG9fY3B1KHQtXFx1MDAzZWRldF9yZWNfbGVuKSA9PSBzaXplb2YoKnQpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICAhdC1cXHUwMDNlZGV0X3Jlc2VydmVkX3plcm8yIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAgICB0LVxcdTAwM2VkZXRfcmVzZXJ2ZWRfZnQgPT0gRVhUNF9GVF9ESVJfQ1NVTTtcXG4rfVxcbitcXG4rLypcXG4rICogZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKCkgLSBDb21wdXRlIHRoZSB0b3RhbCBkaXJkYXRhIGxlbmd0aCBmb3IgYW4gZW50cnkuXFxuKyAqIEBkZTogZGlyZWN0b3J5IGVudHJ5XFxuKyAqIEByZWNfbGVuOiB0aGUgcmVjb3JkIGxlbmd0aCBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IChkZWNvZGVkKVxcbisgKlxcbisgKiBDb21wdXRlcyB0aGUgbGVuZ3RoIG9mIG9wdGlvbmFsIGRhdGEgc3RvcmVkIGFmdGVyIHRoZSBmaWxlbmFtZSAoYW5kIGl0c1xcbisgKiBpbXBsaWNpdCBOVUwgdGVybWluYXRvcikuICBFYWNoIGV4dGVuc2lvbiBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlXFxuKyAqIGhpZ2ggNCBiaXRzIG9mIGRlLVxcdTAwM2VmaWxlX3R5cGU7IHRoZSBmaXJzdCBieXRlIG9mIGVhY2ggZXh0ZW5zaW9uIGlzIGl0c1xcbisgKiBsZW5ndGggKGluY2x1ZGluZyB0aGF0IGxlbmd0aCBieXRlIGl0c2VsZikuXFxuKyAqXFxuKyAqIFJldHVybnMgMCBmb3IgdGFpbCBlbnRyaWVzIGFuZCBmb3IgZW50cmllcyB3aXRoIG5vIGRpcmRhdGEuXFxuKyAqL1xcbitzdGF0aWMgaW5saW5lIGludCBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxcbitcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBpbnQgcmVjX2xlbilcXG4re1xcbitcXHRfX3U4IGV4dHJhX2RhdGFfZmxhZ3M7XFxuK1xcdHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqZGRoO1xcbitcXHRpbnQgZGxlbiA9IDA7XFxuK1xcdHVuc2lnbmVkIGludCBvZmZzZXQ7XFxuK1xcbitcXHRpZiAoZXh0NF9kaXJfZW50cnlfaXNfdGFpbChkZSkpXFxuK1xcdFxcdHJldHVybiAwO1xcbitcXG4rXFx0ZXh0cmFfZGF0YV9mbGFncyA9IChkZS1cXHUwMDNlZmlsZV90eXBlIFxcdTAwMjYgfkVYVDRfRlRfTUFTSykgXFx1MDAzZVxcdTAwM2UgNDtcXG4rXFx0Lyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZW50cnkgdG8gYWZ0ZXIgZmlsZW5hbWUgKyBOVUwgKi9cXG4rXFx0b2Zmc2V0ID0gRVhUNF9CQVNFX0RJUl9MRU4gKyBkZS1cXHUwMDNlbmFtZV9sZW4gKyAxO1xcbitcXG4rXFx0LyogYm91bmRzIGNoZWNrOiBlbnN1cmUgd2Ugc3RhcnQgcmVhZGluZyB3aXRoaW4gdGhlIGVudHJ5ICovXFxuK1xcdGlmIChvZmZzZXQgXFx1MDAzZT0gcmVjX2xlbilcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRkZGggPSAoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopKChjaGFyICopZGUgKyBvZmZzZXQpO1xcbitcXG4rXFx0d2hpbGUgKGV4dHJhX2RhdGFfZmxhZ3MpIHtcXG4rXFx0XFx0aWYgKGV4dHJhX2RhdGFfZmxhZ3MgXFx1MDAyNiAxKSB7XFxuK1xcdFxcdFxcdC8qIGJvdW5kcyBjaGVjayBiZWZvcmUgcmVhZGluZyBkZGhfbGVuZ3RoICovXFxuK1xcdFxcdFxcdGlmIChvZmZzZXQgKyBzaXplb2YoKmRkaCkgXFx1MDAzZSByZWNfbGVuKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gZGxlbjtcXG4rXFxuK1xcdFxcdFxcdC8qIHZhbGlkYXRlIGRkaF9sZW5ndGggaXMgcmVhc29uYWJsZSDigJQgcmVhZCBvbmNlIHRvXFxuK1xcdFxcdFxcdCAqIGF2b2lkIGEgVE9DVE9VIGRvdWJsZS1mZXRjaCBvbiB0aGUgZGlzayBmaWVsZCAqL1xcbitcXHRcXHRcXHR7XFxuK1xcdFxcdFxcdFxcdHU4IGRkaF9sZW4gPSBkZGgtXFx1MDAzZWRkaF9sZW5ndGg7XFxuK1xcbitcXHRcXHRcXHRcXHRpZiAoZGRoX2xlbiA9PSAwIHx8IGRkaF9sZW4gXFx1MDAzZSByZWNfbGVuIC0gb2Zmc2V0KVxcbitcXHRcXHRcXHRcXHRcXHRyZXR1cm4gZGxlbjtcXG4rXFx0XFx0XFx0XFx0ZGxlbiArPSBkZGhfbGVuICsgKGRsZW4gPT0gMCk7XFxuK1xcdFxcdFxcdFxcdG9mZnNldCArPSBkZGhfbGVuO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGRkaCA9IGV4dDRfZGlyZGF0YV9uZXh0KGRkaCk7XFxuK1xcdFxcdH1cXG4rXFx0XFx0ZXh0cmFfZGF0YV9mbGFncyBcXHUwMDNlXFx1MDAzZT0gMTtcXG4rXFx0fVxcbitcXHRyZXR1cm4gZGxlbjtcXG4rfVxcbitcXG4rLypcXG4rICogZXh0NF9kaXJfZW50cnlfbGVuKCkgLSBDb21wdXRlIHRoZSByZXF1aXJlZCByZWNfbGVuIGZvciBhIGRpcmVjdG9yeSBlbnRyeS5cXG4rICogQGRlOiAgICAgICAgZGlyZWN0b3J5IGVudHJ5ICh1c2VkIHRvIHJlYWQgbmFtZV9sZW4gYW5kIGFueSBkaXJkYXRhIGxlbmd0aClcXG4rICogQGJsb2Nrc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIEBkZSBsaXZlcyBpbiAodGhlIHJlYWwgZGlyZWN0b3J5IGJsb2NrXFxuKyAqICAgICAgICAgICAgIHNpemUsIG9yIHRoZSBzbWFsbGVyIGlubGluZS1kYXRhIGJ1ZmZlciBzaXplIGZvciBpbmxpbmVcXG4rICogICAgICAgICAgICAgZGlyZWN0b3JpZXMpIC0tIHVzZWQgb25seSB0byBkZWNvZGUgQGRlLVxcdTAwM2VyZWNfbGVuJ3MgXFxcIjAvNjU1MzVcXG4rICogICAgICAgICAgICAgbWVhbnMgcmVzdCBvZiBidWZmZXJcXFwiIHNlbnRpbmVsIGNvcnJlY3RseS5cXG4rICogQGRpcjogICAgICAgZGlyZWN0b3J5IGlub2RlIChtYXkgYmUgTlVMTCBmb3IgJy4nIGFuZCAnLi4nIGVudHJpZXMsIHdoaWNoXFxuKyAqICAgICAgICAgICAgIG5ldmVyIGNhcnJ5IHRoZSBjYXNlZm9sZCtmc2NyeXB0IGhhc2ggcmVnYXJkbGVzcyBvZiB0aGVcXG4rICogICAgICAgICAgICAgZGlyZWN0b3J5J3MgZmVhdHVyZSBmbGFncylcXG4rICpcXG4rICogUmV0dXJucyB0aGUgbWluaW11bSByZWNvcmQgbGVuZ3RoIG5lZWRlZCB0byBob2xkIEBkZSwgcm91bmRlZCB1cCB0byB0aGVcXG4rICogZGlyZWN0b3J5IGFsaWdubWVudCBhbmQgaW5jbHVkaW5nIHJvb20gZm9yIHRoZSBjYXNlZm9sZCtmc2NyeXB0IGhhc2ggaWZcXG4rICogdGhlIGRpcmVjdG9yeSByZXF1aXJlcyBpdC5cXG4rICovXFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGV4dDRfZGlyX2VudHJ5X2xlbihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIHVuc2lnbmVkIGludCBibG9ja3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBpbm9kZSAqZGlyKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcXG4rXFx0dW5zaWduZWQgaW50IGRpcmRhdGEgPSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oZGUsIHJlY19sZW4pO1xcbitcXG4rXFx0cmV0dXJuIGV4dDRfZGlyZW50X3JlY19sZW4oZGUtXFx1MDAzZW5hbWVfbGVuICsgZGlyZGF0YSwgZGlyKTtcXG4rfVxcbitcXG4gZXh0ZXJuIGNvbnN0IHN0cnVjdCBpb21hcF9vcHMgZXh0NF9pb21hcF9vcHM7XFxuIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW9tYXBfb3BzIGV4dDRfaW9tYXBfcmVwb3J0X29wcztcXG4gXFxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xcbmluZGV4IDhlMjI1OTc5OTYxNGU5Li4wMDZkNDVlOWNlODc5OCAxMDA2NDRcXG4tLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcXG4rKysgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcXG5AQCAtMjY5Nyw2ICsyNjk3LDcgQEAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmY19pbmVsaWdpYmxlX3JlYXNvbnNbXSA9IHtcXG4gXFx0W0VYVDRfRkNfUkVBU09OX01JR1JBVEVdID0gXFxcIklub2RlIGZvcm1hdCBtaWdyYXRpb25cXFwiLFxcbiBcXHRbRVhUNF9GQ19SRUFTT05fVkVSSVRZXSA9IFxcXCJmcy12ZXJpdHkgZW5hYmxlXFxcIixcXG4gXFx0W0VYVDRfRkNfUkVBU09OX01PVkVfRVhUXSA9IFxcXCJNb3ZlIGV4dGVudHNcXFwiLFxcbitcXHRbRVhUNF9GQ19SRUFTT05fRElSREFUQV0gPSBcXFwiRGlyZGF0YSBMVUZJRCAobm90IHJlY29yZGVkIGJ5IGZhc3QtY29tbWl0KVxcXCIsXFxuIH07XFxuIFxcbiBpbnQgZXh0NF9mY19pbmZvX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuaCBiL2ZzL2V4dDQvZmFzdF9jb21taXQuaFxcbmluZGV4IDJmNzdhMzdmYjEwMTgwLi44OTlmYWViNGU2ZTA2NCAxMDA2NDRcXG4tLS0gYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmhcXG4rKysgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmhcXG5AQCAtMTAwLDYgKzEwMCw3IEBAIGVudW0ge1xcbiBcXHRFWFQ0X0ZDX1JFQVNPTl9NSUdSQVRFLFxcbiBcXHRFWFQ0X0ZDX1JFQVNPTl9WRVJJVFksXFxuIFxcdEVYVDRfRkNfUkVBU09OX01PVkVfRVhULFxcbitcXHRFWFQ0X0ZDX1JFQVNPTl9ESVJEQVRBLFxcbiBcXHRFWFQ0X0ZDX1JFQVNPTl9NQVhcXG4gfTtcXG4gXFxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW5saW5lLmMgYi9mcy9leHQ0L2lubGluZS5jXFxuaW5kZXggODA0NWU0ZmYyNzBjN2YuLjFiYmY4OWUxODA3NmY0IDEwMDY0NFxcbi0tLSBhL2ZzL2V4dDQvaW5saW5lLmNcXG4rKysgYi9mcy9leHQ0L2lubGluZS5jXFxuQEAgLTk3MywxMSArOTczLDIwIEBAIHN0YXRpYyBpbnQgZXh0NF9hZGRfZGlyZW50X3RvX2lubGluZShoYW5kbGVfdCAqaGFuZGxlLFxcbiBcXHRcXHRcXHRcXHQgICAgIHN0cnVjdCBleHQ0X2lsb2MgKmlsb2MsXFxuIFxcdFxcdFxcdFxcdCAgICAgdm9pZCAqaW5saW5lX3N0YXJ0LCBpbnQgaW5saW5lX3NpemUpXFxuIHtcXG4tXFx0aW50XFx0XFx0ZXJyO1xcbitcXHRpbnRcXHRcXHRlcnIsIGRsZW4gPSAwO1xcbiBcXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7XFxuK1xcdHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRmaWQgPSBOVUxMO1xcbitcXG4rXFx0LyogZm5hbWUtXFx1MDAzZWRmaWQgd2FzIHNldCBpbiBleHQ0X2FkZF9lbnRyeSgpICovXFxuK1xcdGRmaWQgPSBmbmFtZS1cXHUwMDNlZGZpZDtcXG4rXFx0aWYgKGRmaWQpXFxuK1xcdFxcdGRsZW4gPSBkZmlkLVxcdTAwM2VkZl9oZWFkZXIuZGRoX2xlbmd0aDtcXG4rXFx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci1cXHUwMDNlaV9zYikpXFxuK1xcdFxcdGRsZW4gKz0gc2l6ZW9mKHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoKTtcXG4gXFxuIFxcdGVyciA9IGV4dDRfZmluZF9kZXN0X2RlKGRpciwgaWxvYy1cXHUwMDNlYmgsIGlubGluZV9zdGFydCxcXG4tXFx0XFx0XFx0XFx0aW5saW5lX3NpemUsIGZuYW1lLCBcXHUwMDI2ZGUpO1xcbitcXHRcXHRcXHRcXHRpbmxpbmVfc2l6ZSwgZm5hbWUsIFxcdTAwMjZkZSwgZGxlbik7XFxuIFxcdGlmIChlcnIpXFxuIFxcdFxcdHJldHVybiBlcnI7XFxuIFxcbkBAIC05ODYsNyArOTk1LDcgQEAgc3RhdGljIGludCBleHQ0X2FkZF9kaXJlbnRfdG9faW5saW5lKGhhbmRsZV90ICpoYW5kbGUsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICBFWFQ0X0pUUl9OT05FKTtcXG4gXFx0aWYgKGVycilcXG4gXFx0XFx0cmV0dXJuIGVycjtcXG4tXFx0ZXh0NF9pbnNlcnRfZGVudHJ5KGRpciwgaW5vZGUsIGRlLCBpbmxpbmVfc2l6ZSwgZm5hbWUpO1xcbitcXHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgaW5saW5lX3NpemUsIGZuYW1lLCBkZmlkKTtcXG4gXFxuIFxcdGV4dDRfc2hvd19pbmxpbmVfZGlyKGRpciwgaWxvYy1cXHUwMDNlYmgsIGlubGluZV9zdGFydCwgaW5saW5lX3NpemUpO1xcbiBcXG5AQCAtMTA1NSw3ICsxMDY0LDcgQEAgc3RhdGljIGludCBleHQ0X3VwZGF0ZV9pbmxpbmVfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbiBcXHRpbnQgb2xkX3NpemUgPSBFWFQ0X0koZGlyKS1cXHUwMDNlaV9pbmxpbmVfc2l6ZSAtIEVYVDRfTUlOX0lOTElORV9EQVRBX1NJWkU7XFxuIFxcdGludCBuZXdfc2l6ZSA9IGdldF9tYXhfaW5saW5lX3hhdHRyX3ZhbHVlX3NpemUoZGlyLCBpbG9jKTtcXG4gXFxuLVxcdGlmIChuZXdfc2l6ZSAtIG9sZF9zaXplIFxcdTAwM2M9IGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkpXFxuK1xcdGlmIChuZXdfc2l6ZSAtIG9sZF9zaXplIFxcdTAwM2M9IGV4dDRfZGlyZW50X3JlY19sZW4oMSwgTlVMTCkpXFxuIFxcdFxcdHJldHVybiAtRU5PU1BDO1xcbiBcXG4gXFx0cmV0ID0gZXh0NF91cGRhdGVfaW5saW5lX2RhdGEoaGFuZGxlLCBkaXIsXFxuQEAgLTEyNjQsNiArMTI3Myw3IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcXG4gXFx0aW50IGVyciA9IDAsIGNvdW50ID0gMDtcXG4gXFx0dW5zaWduZWQgaW50IHBhcmVudF9pbm87XFxuIFxcdGludCBwb3M7XFxuK1xcdHVuc2lnbmVkIGludCBkZV9sZW47XFxuIFxcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTtcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZGlyX2ZpbGUpO1xcbiBcXHRpbnQgcmV0LCBpbmxpbmVfc2l6ZSA9IDA7XFxuQEAgLTEzMDksNyArMTMxOSw3IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcXG4gXFx0XFx0XFx0ZmFrZS5uYW1lX2xlbiA9IDE7XFxuIFxcdFxcdFxcdG1lbWNweShmYWtlLm5hbWUsIFxcXCIuXFxcIiwgMik7XFxuIFxcdFxcdFxcdGZha2UucmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKFxcbi1cXHRcXHRcXHRcXHRcXHQgIGV4dDRfZGlyX3JlY19sZW4oZmFrZS5uYW1lX2xlbiwgTlVMTCksXFxuK1xcdFxcdFxcdFxcdFxcdCAgZXh0NF9kaXJlbnRfcmVjX2xlbihmYWtlLm5hbWVfbGVuLCBOVUxMKSxcXG4gXFx0XFx0XFx0XFx0XFx0ICBpbmxpbmVfc2l6ZSk7XFxuIFxcdFxcdFxcdGV4dDRfc2V0X2RlX3R5cGUoaW5vZGUtXFx1MDAzZWlfc2IsIFxcdTAwMjZmYWtlLCBTX0lGRElSKTtcXG4gXFx0XFx0XFx0ZGUgPSBcXHUwMDI2ZmFrZTtcXG5AQCAtMTMxOSwyNiArMTMyOSwzNCBAQCBpbnQgZXh0NF9pbmxpbmVkaXJfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXFxuIFxcdFxcdFxcdGZha2UubmFtZV9sZW4gPSAyO1xcbiBcXHRcXHRcXHRtZW1jcHkoZmFrZS5uYW1lLCBcXFwiLi5cXFwiLCAzKTtcXG4gXFx0XFx0XFx0ZmFrZS5yZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soXFxuLVxcdFxcdFxcdFxcdFxcdCAgZXh0NF9kaXJfcmVjX2xlbihmYWtlLm5hbWVfbGVuLCBOVUxMKSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBleHQ0X2RpcmVudF9yZWNfbGVuKGZha2UubmFtZV9sZW4sIE5VTEwpLFxcbiBcXHRcXHRcXHRcXHRcXHQgIGlubGluZV9zaXplKTtcXG4gXFx0XFx0XFx0ZXh0NF9zZXRfZGVfdHlwZShpbm9kZS1cXHUwMDNlaV9zYiwgXFx1MDAyNmZha2UsIFNfSUZESVIpO1xcbiBcXHRcXHRcXHRkZSA9IFxcdTAwMjZmYWtlO1xcbiBcXHRcXHRcXHRwb3MgPSBFWFQ0X0lOTElORV9ET1RET1RfU0laRTtcXG4gXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0aWYgKHBvcyArIEVYVDRfQkFTRV9ESVJfTEVOIFxcdTAwM2UgaW5saW5lX3NpemUpIHtcXG4rXFx0XFx0XFx0XFx0cmV0ID0gY291bnQ7XFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRcXHR9XFxuIFxcdFxcdFxcdGRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKGRpcl9idWYgKyBwb3MpO1xcbi1cXHRcXHRcXHRwb3MgKz0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cXHUwMDNlcmVjX2xlbiwgaW5saW5lX3NpemUpO1xcbitcXHRcXHRcXHRkZV9sZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVxcdTAwM2VyZWNfbGVuLCBpbmxpbmVfc2l6ZSk7XFxuK1xcdFxcdFxcdGlmIChkZV9sZW4gXFx1MDAzYyBFWFQ0X0JBU0VfRElSX0xFTiB8fFxcbitcXHRcXHRcXHQgICAgcG9zICsgZGVfbGVuIFxcdTAwM2UgKHVuc2lnbmVkIGludClpbmxpbmVfc2l6ZSkge1xcbitcXHRcXHRcXHRcXHRyZXQgPSBjb3VudDtcXG4rXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdFxcdH1cXG4gXFx0XFx0XFx0aWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGlub2RlLCBkaXJfZmlsZSwgZGUsXFxuIFxcdFxcdFxcdFxcdFxcdCBpbG9jLmJoLCBkaXJfYnVmLFxcbiBcXHRcXHRcXHRcXHRcXHQgaW5saW5lX3NpemUsIHBvcykpIHtcXG4gXFx0XFx0XFx0XFx0cmV0ID0gY291bnQ7XFxuIFxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbiBcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdHBvcyArPSBkZV9sZW47XFxuIFxcdFxcdH1cXG4gXFxuLVxcdFxcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpIHtcXG4tXFx0XFx0XFx0aGluZm8tXFx1MDAzZWhhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTtcXG4tXFx0XFx0XFx0aGluZm8tXFx1MDAzZW1pbm9yX2hhc2ggPSBFWFQ0X0RJUkVOVF9NSU5PUl9IQVNIKGRlKTtcXG4tXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0aWYgKCEoZXh0NF9kaXJkYXRhX2dldChkZSwgZGlyLCBpbmxpbmVfc2l6ZSwgTlVMTCwgaGluZm8pIFxcdTAwMjZcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0RVhUNF9ESVJFTlRfQ0ZIQVNIKSkge1xcbiBcXHRcXHRcXHRlcnIgPSBleHQ0ZnNfZGlyaGFzaChkaXIsIGRlLVxcdTAwM2VuYW1lLCBkZS1cXHUwMDNlbmFtZV9sZW4sIGhpbmZvKTtcXG4gXFx0XFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRcXHRyZXQgPSBlcnI7XFxuQEAgLTEzNTQsNyArMTM3Miw4IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcXG4gXFx0XFx0dG1wX3N0ci5uYW1lID0gZGUtXFx1MDAzZW5hbWU7XFxuIFxcdFxcdHRtcF9zdHIubGVuID0gZGUtXFx1MDAzZW5hbWVfbGVuO1xcbiBcXHRcXHRlcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwgaGluZm8tXFx1MDAzZWhhc2gsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgIGhpbmZvLVxcdTAwM2VtaW5vcl9oYXNoLCBkZSwgXFx1MDAyNnRtcF9zdHIpO1xcbitcXHRcXHRcXHRcXHRcXHQgICAgICBoaW5mby1cXHUwMDNlbWlub3JfaGFzaCwgaW5saW5lX3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGRlLCBcXHUwMDI2dG1wX3N0cik7XFxuIFxcdFxcdGlmIChlcnIpIHtcXG4gXFx0XFx0XFx0cmV0ID0gZXJyO1xcbiBcXHRcXHRcXHRnb3RvIG91dDtcXG5AQCAtMTQyNyw4ICsxNDQ2LDggQEAgaW50IGV4dDRfcmVhZF9pbmxpbmVfZGlyKHN0cnVjdCBmaWxlICpmaWxlLFxcbiBcXHQgKiBTbyB3ZSB3aWxsIHVzZSBleHRyYV9vZmZzZXQgYW5kIGV4dHJhX3NpemUgdG8gaW5kaWNhdGUgdGhlbVxcbiBcXHQgKiBkdXJpbmcgdGhlIGlubGluZSBkaXIgaXRlcmF0aW9uLlxcbiBcXHQgKi9cXG4tXFx0ZG90ZG90X29mZnNldCA9IGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCk7XFxuLVxcdGRvdGRvdF9zaXplID0gZG90ZG90X29mZnNldCArIGV4dDRfZGlyX3JlY19sZW4oMiwgTlVMTCk7XFxuK1xcdGRvdGRvdF9vZmZzZXQgPSBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIE5VTEwpO1xcbitcXHRkb3Rkb3Rfc2l6ZSA9IGRvdGRvdF9vZmZzZXQgKyBleHQ0X2RpcmVudF9yZWNfbGVuKDIsIE5VTEwpO1xcbiBcXHRleHRyYV9vZmZzZXQgPSBkb3Rkb3Rfc2l6ZSAtIEVYVDRfSU5MSU5FX0RPVERPVF9TSVpFO1xcbiBcXHRleHRyYV9zaXplID0gZXh0cmFfb2Zmc2V0ICsgaW5saW5lX3NpemU7XFxuIFxcbkBAIC0xNDYzLDcgKzE0ODIsNyBAQCBpbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsXFxuIFxcdFxcdFxcdCAqIGZhaWx1cmUgd2lsbCBiZSBkZXRlY3RlZCBpbiB0aGVcXG4gXFx0XFx0XFx0ICogZGlyZW50IHRlc3QgYmVsb3cuICovXFxuIFxcdFxcdFxcdGlmIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVxcdTAwM2VyZWNfbGVuLCBleHRyYV9zaXplKVxcbi1cXHRcXHRcXHRcXHRcXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkpXFxuK1xcdFxcdFxcdFxcdFxcdTAwM2MgZXh0NF9kaXJlbnRfcmVjX2xlbigxLCBOVUxMKSlcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdFxcdGkgKz0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cXHUwMDNlcmVjX2xlbixcXG4gXFx0XFx0XFx0XFx0XFx0XFx0ICAgIGV4dHJhX3NpemUpO1xcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2lvY3RsLmMgYi9mcy9leHQ0L2lvY3RsLmNcXG5pbmRleCBjODM4N2U2YTJjNmU5MC4uYjU0MjFkNTlmN2EwMzIgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9pb2N0bC5jXFxuKysrIGIvZnMvZXh0NC9pb2N0bC5jXFxuQEAgLTE1MzUsNiArMTUzNSw4NyBAQCBzdGF0aWMgaW50IGV4dDRfaW9jdGxfc2V0X3R1bmVfc2Ioc3RydWN0IGZpbGUgKmZpbHAsXFxuIFxcdHJldHVybiByZXQ7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIGV4dDRfaW9jdGxfc2V0X2x1ZmlkKCkgLSBTZXQgTFVGSUQgb24gYSBkaXJlY3RvcnkgZW50cnlcXG4rICogQGZpbHA6XFx0ZmlsZSBwb2ludGVyIChwYXJlbnQgZGlyZWN0b3J5KVxcbisgKiBAYXJnOlxcdHBvaW50ZXIgdG8gZXh0NF9zZXRfbHVmaWQgc3RydWN0dXJlIHdpdGggZmlsZW5hbWUgYW5kIExVRklEIGRhdGFcXG4rICpcXG4rICogVGhpcyBpb2N0bCBhbGxvd3Mgc2V0dGluZyBMVUZJRCBkYXRhIG9uIGFuIGV4aXN0aW5nXFxuKyAqIGRpcmVjdG9yeSBlbnRyeS4gSXQgaXMgY2FsbGVkIG9uIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHdpdGggYSBmaWxlbmFtZSBhbmRcXG4rICogTFVGSUQgZGF0YS5cXG4rICovXFxuK3N0YXRpYyBsb25nIGV4dDRfaW9jdGxfc2V0X2x1ZmlkKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZylcXG4re1xcbitcXHRzdHJ1Y3QgaW5vZGUgKmRpciA9IGZpbGVfaW5vZGUoZmlscCk7XFxuK1xcdHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwID0gZmlsZV9tbnRfaWRtYXAoZmlscCk7XFxuK1xcdHN0cnVjdCBleHQ0X3NldF9sdWZpZCBsdWZpZF9hcmdzO1xcbitcXHRzdHJ1Y3Qge1xcbitcXHRcXHRfX3UzMiBlZHBfbWFnaWM7XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciBkZl9oZWFkZXI7XFxuK1xcdFxcdGNoYXIgZGZfZmlkWzI1NV07XFxuK1xcdH0gZWRwO1xcbitcXHRpbnQgZXJyO1xcbitcXG4rXFx0LyogQ2hlY2sgaWYgcGFyZW50IGlzIGEgZGlyZWN0b3J5ICovXFxuK1xcdGlmICghU19JU0RJUihkaXItXFx1MDAzZWlfbW9kZSkpXFxuK1xcdFxcdHJldHVybiAtRU5PVERJUjtcXG4rXFxuK1xcdC8qIFRoaXMgaW9jdGwgbXV0YXRlcyBkaXJlY3RvcnkgZW50cmllczsgbWVyZWx5IGhhdmluZyB0aGUgZGlyZWN0b3J5XFxuK1xcdCAqIG9wZW4gKHdoaWNoIG9ubHkgZXZlciByZXF1aXJlcyByZWFkIGFjY2VzcykgaXMgbm90IGVub3VnaCAqL1xcbitcXHRlcnIgPSBpbm9kZV9wZXJtaXNzaW9uKGlkbWFwLCBkaXIsIE1BWV9XUklURSk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcbitcXHQvKiBDb3B5IGFyZ3VtZW50cyBmcm9tIHVzZXIgc3BhY2UgKi9cXG4rXFx0aWYgKGNvcHlfZnJvbV91c2VyKFxcdTAwMjZsdWZpZF9hcmdzLCAoc3RydWN0IGV4dDRfc2V0X2x1ZmlkIF9fdXNlciAqKWFyZyxcXG4rXFx0XFx0XFx0ICAgc2l6ZW9mKGx1ZmlkX2FyZ3MpKSlcXG4rXFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuK1xcbitcXHQvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzLiAgZXNsX25hbWVfbGVuIGlzIE5VTC1leGNsdWRlZCBsZW5ndGggKDEtMjU1KS4gKi9cXG4rXFx0aWYgKGx1ZmlkX2FyZ3MuZXNsX25hbWVfbGVuID09IDAgfHwgbHVmaWRfYXJncy5lc2xfbmFtZV9sZW4gXFx1MDAzZSBFWFQ0X05BTUVfTEVOKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qIGRkaF9sZW5ndGggKGVzbF9kYXRhX2xlbiArIHRoZSBoZWFkZXIgYnl0ZSBiZWxvdykgbXVzdCBpdHNlbGYgZml0XFxuK1xcdCAqIGluIHRoZSBfX3U4IGRkaF9sZW5ndGggZmllbGQgd2l0aG91dCB3cmFwcGluZyAqL1xcbitcXHRpZiAobHVmaWRfYXJncy5lc2xfZGF0YV9sZW4gPT0gMCB8fFxcbitcXHQgICAgbHVmaWRfYXJncy5lc2xfZGF0YV9sZW4gXFx1MDAzZSAyNTUgLSBzaXplb2YoZWRwLmRmX2hlYWRlcikpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0LyogRW5zdXJlIGZpbGVuYW1lIGlzIE5VTC10ZXJtaW5hdGVkIGF0IGV4YWN0bHkgZXNsX25hbWVfbGVuICovXFxuK1xcdGlmIChsdWZpZF9hcmdzLmVzbF9uYW1lW2x1ZmlkX2FyZ3MuZXNsX25hbWVfbGVuXSAhPSAnXFxcXDAnKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qICcuJyBhbmQgJy4uJyBhcmUgbm90IG9yZGluYXJ5IGVudHJpZXMgLS0gdGhleSBtdXN0IHN0YXkgdGhlIGZpcnN0XFxuK1xcdCAqIHR3byBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkncyBmaXJzdCBibG9jaywgc28gdGhleSBjYW4ndCBnb1xcbitcXHQgKiB0aHJvdWdoIHRoZSBnZW5lcmFsIGRlbGV0ZStyZS1hZGQgcGF0aCB0aGlzIGlvY3RsIHVzZXMgKi9cXG4rXFx0aWYgKCFzdHJjbXAobHVmaWRfYXJncy5lc2xfbmFtZSwgXFxcIi5cXFwiKSB8fCAhc3RyY21wKGx1ZmlkX2FyZ3MuZXNsX25hbWUsIFxcXCIuLlxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdC8qIFByZXBhcmUgdGhlIGRlbnRyeSBwYXJhbSBzdHJ1Y3Qgd2l0aCBMVUZJRCBkYXRhLiBkZGhfbGVuZ3RoIGlzXFxuK1xcdCAqIGRvY3VtZW50ZWQgKHNlZSBzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIpIGFzIHRoZSBsZW5ndGggb2ZcXG4rXFx0ICogdGhlIGhlYWRlciBwbHVzIHRoZSB3aG9sZSBkYXRhIGJsb2IgLS0gaW5jbHVkZSB0aGUgaGVhZGVyIGhlcmUgc29cXG4rXFx0ICogZXZlcnkgZGlyZGF0YSByZWFkZXIvd3JpdGVyIHRoYXQgdGFrZXMgZGRoX2xlbmd0aCBhdCBmYWNlIHZhbHVlXFxuK1xcdCAqIChlLmcuIGV4dDRfZGlyZGF0YV9zZXQoKSdzIG1lbWNweSkgY29waWVzIHRoZSBmdWxsIExVRklEIHBheWxvYWRcXG4rXFx0ICogaW5zdGVhZCBvZiBzaWxlbnRseSBkcm9wcGluZyBpdHMgbGFzdCBieXRlLiAqL1xcbitcXHRlZHAuZWRwX21hZ2ljID0gRVhUNF9MVUZJRF9NQUdJQztcXG4rXFx0ZWRwLmRmX2hlYWRlci5kZGhfbGVuZ3RoID0gbHVmaWRfYXJncy5lc2xfZGF0YV9sZW4gK1xcbitcXHRcXHRcXHRcXHQgICAgc2l6ZW9mKGVkcC5kZl9oZWFkZXIpO1xcbitcXHRtZW1jcHkoZWRwLmRmX2ZpZCwgbHVmaWRfYXJncy5lc2xfZGF0YSwgbHVmaWRfYXJncy5lc2xfZGF0YV9sZW4pO1xcbitcXG4rXFx0LyogV2FudCB3cml0ZSBhY2Nlc3MgKi9cXG4rXFx0ZXJyID0gbW50X3dhbnRfd3JpdGVfZmlsZShmaWxwKTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4rXFxuK1xcdC8qIENhbGwgdGhlIGhlbHBlciBmdW5jdGlvbiB0byBkbyB0aGUgYWN0dWFsIHdvcmsgKi9cXG4rXFx0ZXJyID0gZXh0NF9kaXJkYXRhX3NldF9sdWZpZChkaXIsIGx1ZmlkX2FyZ3MuZXNsX25hbWUsXFxuK1xcdFxcdFxcdFxcdCAgICBsdWZpZF9hcmdzLmVzbF9uYW1lX2xlbixcXG4rXFx0XFx0XFx0XFx0ICAgIChzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKilcXHUwMDI2ZWRwKTtcXG4rXFxuK1xcdG1udF9kcm9wX3dyaXRlX2ZpbGUoZmlscCk7XFxuK1xcdHJldHVybiBlcnI7XFxuK31cXG4rXFxuIHN0YXRpYyBsb25nIF9fZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIHtcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlscCk7XFxuQEAgLTE5MjEsNiArMjAwMiw4IEBAIHN0YXRpYyBsb25nIF9fZXh0NF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgICh2b2lkIF9fdXNlciAqKWFyZyk7XFxuIFxcdGNhc2UgRVhUNF9JT0NfU0VUX1RVTkVfU0JfUEFSQU06XFxuIFxcdFxcdHJldHVybiBleHQ0X2lvY3RsX3NldF90dW5lX3NiKGZpbHAsICh2b2lkIF9fdXNlciAqKWFyZyk7XFxuK1xcdGNhc2UgRVhUNF9JT0NfU0VUX0xVRklEOlxcbitcXHRcXHRyZXR1cm4gZXh0NF9pb2N0bF9zZXRfbHVmaWQoZmlscCwgYXJnKTtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIC1FTk9UVFk7XFxuIFxcdH1cXG5AQCAtMjAwMCw2ICsyMDgzLDcgQEAgbG9uZyBleHQ0X2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXFxuIFxcdGNhc2UgRlNfSU9DX1NFVEZTTEFCRUw6XFxuIFxcdGNhc2UgRVhUNF9JT0NfR0VURlNVVUlEOlxcbiBcXHRjYXNlIEVYVDRfSU9DX1NFVEZTVVVJRDpcXG4rXFx0Y2FzZSBFWFQ0X0lPQ19TRVRfTFVGSUQ6XFxuIFxcdFxcdGJyZWFrO1xcbiBcXHRkZWZhdWx0OlxcbiBcXHRcXHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xcbmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmNcXG5pbmRleCBjYzQ5YWUwNGE2ZjY0OS4uYmEzOWVjYzY5MGJjMmQgMTAwNjQ0XFxuLS0tIGEvZnMvZXh0NC9uYW1laS5jXFxuKysrIGIvZnMvZXh0NC9uYW1laS5jXFxuQEAgLTEwMiw3ICsxMDIsNyBAQCBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQ0X2FwcGVuZChoYW5kbGVfdCAqaGFuZGxlLFxcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGV4dDRfZHhfY3N1bV92ZXJpZnkoc3RydWN0IGlub2RlICppbm9kZSxcXG4tXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50KTtcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQpO1xcbiBcXG4gLypcXG4gICogSGludHMgdG8gZXh0NF9yZWFkX2RpcmJsb2NrIHJlZ2FyZGluZyB3aGV0aGVyIHdlIGV4cGVjdCBhIGRpcmVjdG9yeVxcbkBAIC0xMjgsNyArMTI4LDcgQEAgc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqX19leHQ0X3JlYWRfZGlyYmxvY2soc3RydWN0IGlub2RlICppbm9kZSxcXG4gXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgaW50IGxpbmUpXFxuIHtcXG4gXFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcXG4tXFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQ7XFxuK1xcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQ7XFxuIFxcdGludCBpc19keF9ibG9jayA9IDA7XFxuIFxcbiBcXHRpZiAoYmxvY2sgXFx1MDAzZT0gaW5vZGUtXFx1MDAzZWlfc2l6ZSBcXHUwMDNlXFx1MDAzZSBpbm9kZS1cXHUwMDNlaV9ibGtiaXRzKSB7XFxuQEAgLTE2MCw3ICsxNjAsNyBAQCBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpfX2V4dDRfcmVhZF9kaXJibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHR9XFxuIFxcdGlmICghYmgpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbi1cXHRkaXJlbnQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopIGJoLVxcdTAwM2ViX2RhdGE7XFxuK1xcdGRpcmVudCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC1cXHUwMDNlYl9kYXRhO1xcbiBcXHQvKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhbiBpbmRleCBibG9jayAqL1xcbiBcXHRpZiAoaXNfZHgoaW5vZGUpKSB7XFxuIFxcdFxcdGlmIChibG9jayA9PSAwKVxcbkBAIC0yNDQsMjIgKzI0NCwxMyBAQCBzdHJ1Y3QgZHhfZW50cnlcXG4gICogaGFzaCB2ZXJzaW9uIG1vZCA0IHNob3VsZCBuZXZlciBiZSAwLiAgU2luY2VyZWx5LCB0aGUgcGFyYW5vaWEgZGVwYXJ0bWVudC5cXG4gICovXFxuIFxcbi1zdHJ1Y3QgZHhfcm9vdFxcbitzdHJ1Y3QgZHhfcm9vdF9pbmZvXFxuIHtcXG4tXFx0c3RydWN0IGZha2VfZGlyZW50IGRvdDtcXG4tXFx0Y2hhciBkb3RfbmFtZVs0XTtcXG4tXFx0c3RydWN0IGZha2VfZGlyZW50IGRvdGRvdDtcXG4tXFx0Y2hhciBkb3Rkb3RfbmFtZVs0XTtcXG4tXFx0c3RydWN0IGR4X3Jvb3RfaW5mb1xcbi1cXHR7XFxuLVxcdFxcdF9fbGUzMiByZXNlcnZlZF96ZXJvO1xcbi1cXHRcXHR1OCBoYXNoX3ZlcnNpb247XFxuLVxcdFxcdHU4IGluZm9fbGVuZ3RoOyAvKiA4ICovXFxuLVxcdFxcdHU4IGluZGlyZWN0X2xldmVscztcXG4tXFx0XFx0dTggdW51c2VkX2ZsYWdzO1xcbi1cXHR9XFxuLVxcdGluZm87XFxuLVxcdHN0cnVjdCBkeF9lbnRyeVxcdGVudHJpZXNbXTtcXG4rXFx0X19sZTMyIHJlc2VydmVkX3plcm87XFxuK1xcdHU4IGhhc2hfdmVyc2lvbjtcXG4rXFx0dTggaW5mb19sZW5ndGg7IC8qIDggKi9cXG4rXFx0dTggaW5kaXJlY3RfbGV2ZWxzO1xcbitcXHR1OCB1bnVzZWRfZmxhZ3M7XFxuIH07XFxuIFxcbiBzdHJ1Y3QgZHhfbm9kZVxcbkBAIC0zMTQsMTcgKzMwNSwxNiBAQCBzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKmdldF9kaXJlbnRfdGFpbChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKVxcbiB7XFxuIFxcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsICp0O1xcbi1cXHRpbnQgYmxvY2tzaXplID0gRVhUNF9CTE9DS19TSVpFKGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gXFxuICNpZmRlZiBQQVJBTk9JRFxcbi1cXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmQsICp0b3A7XFxuK1xcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkLCAqdG9wO1xcbiBcXG4tXFx0ZCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKiliaC1cXHUwMDNlYl9kYXRhO1xcbi1cXHR0b3AgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopKGJoLVxcdTAwM2ViX2RhdGEgK1xcbi1cXHRcXHQoYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsKSkpO1xcbi1cXHR3aGlsZSAoZCBcXHUwMDNjIHRvcCBcXHUwMDI2XFx1MDAyNiBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGQtXFx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSkpXFxuLVxcdFxcdGQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopKCgodm9pZCAqKWQpICtcXG4tXFx0XFx0ICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZC1cXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKSk7XFxuK1xcdGQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKiliaC1cXHUwMDNlYl9kYXRhO1xcbitcXHR0b3AgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoYmgtXFx1MDAzZWJfZGF0YSArXFxuK1xcdFxcdChFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtXFx1MDAzZWlfc2IpIC0gc2l6ZW9mKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsKSkpO1xcbitcXHR3aGlsZSAoZCBcXHUwMDNjIHRvcCBcXHUwMDI2XFx1MDAyNiBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGQtXFx1MDAzZXJlY19sZW4sIEVYVDRfQkxPQ0tfU0laRShpbm9kZS1cXHUwMDNlaV9zYikpKVxcbitcXHRcXHRkID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKCgodm9pZCAqKWQpICtcXG4rXFx0XFx0ICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZC1cXHUwMDNlcmVjX2xlbiwgRVhUNF9CTE9DS19TSVpFKGlub2RlLVxcdTAwM2VpX3NiKSkpO1xcbiBcXG4gXFx0aWYgKGQgIT0gdG9wKVxcbiBcXHRcXHRyZXR1cm4gTlVMTDtcXG5AQCAtMzM0LDExICszMjQsNyBAQCBzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKmdldF9kaXJlbnRfdGFpbChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHR0ID0gRVhUNF9ESVJFTlRfVEFJTChiaC1cXHUwMDNlYl9kYXRhLCBFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtXFx1MDAzZWlfc2IpKTtcXG4gI2VuZGlmXFxuIFxcbi1cXHRpZiAodC1cXHUwMDNlZGV0X3Jlc2VydmVkX3plcm8xIHx8XFxuLVxcdCAgICAoZXh0NF9yZWNfbGVuX2Zyb21fZGlzayh0LVxcdTAwM2VkZXRfcmVjX2xlbiwgYmxvY2tzaXplKSAhPVxcbi1cXHQgICAgIHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCkpIHx8XFxuLVxcdCAgICB0LVxcdTAwM2VkZXRfcmVzZXJ2ZWRfemVybzIgfHxcXG4tXFx0ICAgIHQtXFx1MDAzZWRldF9yZXNlcnZlZF9mdCAhPSBFWFQ0X0ZUX0RJUl9DU1VNKVxcbitcXHRpZiAoIWV4dDRfZGlyX2VudHJ5X2lzX3RhaWwoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopdCkpXFxuIFxcdFxcdHJldHVybiBOVUxMO1xcbiBcXG4gXFx0cmV0dXJuIHQ7XFxuQEAgLTQxMCwzNSArMzk2LDQzIEBAIGludCBleHQ0X2hhbmRsZV9kaXJ0eV9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLFxcbiB9XFxuIFxcbiBzdGF0aWMgc3RydWN0IGR4X2NvdW50bGltaXQgKmdldF9keF9jb3VudGxpbWl0KHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLVxcdFxcdFxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICAgICBpbnQgKm9mZnNldClcXG4ge1xcbi1cXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRwO1xcbitcXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7XFxuIFxcdHN0cnVjdCBkeF9yb290X2luZm8gKnJvb3Q7XFxuLVxcdGludCBjb3VudF9vZmZzZXQ7XFxuK1xcdGludCBjb3VudF9vZmZzZXQsIGRvdGRvdF9yZWNfbGVuO1xcbiBcXHRpbnQgYmxvY2tzaXplID0gRVhUNF9CTE9DS19TSVpFKGlub2RlLVxcdTAwM2VpX3NiKTtcXG4gXFx0dW5zaWduZWQgaW50IHJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRpcmVudC1cXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcXG4gXFxuLVxcdGlmIChybGVuID09IGJsb2Nrc2l6ZSlcXG4tXFx0XFx0Y291bnRfb2Zmc2V0ID0gODtcXG4tXFx0ZWxzZSBpZiAocmxlbiA9PSAxMikge1xcbi1cXHRcXHRkcCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikoKCh2b2lkICopZGlyZW50KSArIDEyKTtcXG4tXFx0XFx0aWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZHAtXFx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSkgIT0gYmxvY2tzaXplIC0gMTIpXFxuK1xcdGlmIChybGVuID09IGJsb2Nrc2l6ZSkge1xcbitcXHRcXHRjb3VudF9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGR4X25vZGUpO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRpZiAocmxlbiBcXHUwMDNjIEVYVDRfQkFTRV9ESVJfTEVOIHx8XFxuK1xcdFxcdCAgICBybGVuICsgRVhUNF9CQVNFX0RJUl9MRU4gXFx1MDAzZSBibG9ja3NpemUpXFxuK1xcdFxcdFxcdHJldHVybiBOVUxMO1xcbitcXHRcXHRkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSgoKGNoYXIgKilkaXJlbnQpICsgcmxlbik7XFxuK1xcdFxcdGlmIChsZTE2X3RvX2NwdShkZS1cXHUwMDNlcmVjX2xlbikgIT0gKGJsb2Nrc2l6ZSAtIHJsZW4pKVxcbiBcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4tXFx0XFx0cm9vdCA9IChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopKCgodm9pZCAqKWRwICsgMTIpKTtcXG4rXFx0XFx0LyogZGUtXFx1MDAzZXJlY19sZW4gY292ZXJzIHdob2xlIGR4X3Jvb3QgYmxvY2ssIGNhbGN1bGF0ZSBhY3R1YWwgbGVuZ3RoLlxcbitcXHRcXHQgKiBUaGlzIGlzIHRoZSAnLi4nIGVudHJ5LCB3aGljaCBuZXZlciBjYXJyaWVzIHRoZSBjYXNlZm9sZCtmc2NyeXB0XFxuK1xcdFxcdCAqIGhhc2gsIHNvIHBhc3MgTlVMTCBmb3IgZGlyIHJlZ2FyZGxlc3Mgb2YgdGhlIGRpcmVjdG9yeSdzIGZsYWdzICovXFxuK1xcdFxcdGRvdGRvdF9yZWNfbGVuID0gZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBibG9ja3NpemUsIE5VTEwpO1xcbitcXHRcXHRpZiAocmxlbiArIGRvdGRvdF9yZWNfbGVuICsgc2l6ZW9mKHN0cnVjdCBkeF9yb290X2luZm8pIFxcdTAwM2UgYmxvY2tzaXplKVxcbitcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFx0XFx0cm9vdCA9IChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopKCgoY2hhciAqKWRlICsgZG90ZG90X3JlY19sZW4pKTtcXG4gXFx0XFx0aWYgKHJvb3QtXFx1MDAzZXJlc2VydmVkX3plcm8gfHxcXG4gXFx0XFx0ICAgIHJvb3QtXFx1MDAzZWluZm9fbGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgZHhfcm9vdF9pbmZvKSlcXG4gXFx0XFx0XFx0cmV0dXJuIE5VTEw7XFxuLVxcdFxcdGNvdW50X29mZnNldCA9IDMyO1xcbi1cXHR9IGVsc2VcXG4tXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdFxcdGNvdW50X29mZnNldCA9IHJvb3QtXFx1MDAzZWluZm9fbGVuZ3RoICsgcmxlbiArIGRvdGRvdF9yZWNfbGVuO1xcbitcXHR9XFxuIFxcbiBcXHRpZiAob2Zmc2V0KVxcbiBcXHRcXHQqb2Zmc2V0ID0gY291bnRfb2Zmc2V0O1xcbiBcXHRyZXR1cm4gKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopKCgodm9pZCAqKWRpcmVudCkgKyBjb3VudF9vZmZzZXQpO1xcbiB9XFxuIFxcbi1zdGF0aWMgX19sZTMyIGV4dDRfZHhfY3N1bShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCxcXG4rc3RhdGljIF9fbGUzMiBleHQ0X2R4X2NzdW0oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCxcXG4gXFx0XFx0XFx0ICAgaW50IGNvdW50X29mZnNldCwgaW50IGNvdW50LCBzdHJ1Y3QgZHhfdGFpbCAqdClcXG4ge1xcbiBcXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7XFxuQEAgLTQ1Niw3ICs0NTAsNyBAQCBzdGF0aWMgX19sZTMyIGV4dDRfZHhfY3N1bShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudCxcXG4gfVxcbiBcXG4gc3RhdGljIGludCBleHQ0X2R4X2NzdW1fdmVyaWZ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLVxcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudClcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQpXFxuIHtcXG4gXFx0c3RydWN0IGR4X2NvdW50bGltaXQgKmM7XFxuIFxcdHN0cnVjdCBkeF90YWlsICp0O1xcbkBAIC00NzcsNiArNDcxLDEwIEBAIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHRcXHR3YXJuX25vX3NwYWNlX2Zvcl9jc3VtKGlub2RlKTtcXG4gXFx0XFx0cmV0dXJuIDA7XFxuIFxcdH1cXG4rXFx0aWYgKGNvdW50IFxcdTAwM2UgbGltaXQpIHtcXG4rXFx0XFx0RVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgXFxcImRpciBzZWVtcyBjb3JydXB0PyAgUnVuIGUyZnNjayAtRC5cXFwiKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4gXFx0dCA9IChzdHJ1Y3QgZHhfdGFpbCAqKSgoKHN0cnVjdCBkeF9lbnRyeSAqKWMpICsgbGltaXQpO1xcbiBcXG4gXFx0aWYgKHQtXFx1MDAzZWR0X2NoZWNrc3VtICE9IGV4dDRfZHhfY3N1bShpbm9kZSwgZGlyZW50LCBjb3VudF9vZmZzZXQsXFxuQEAgLTQ4NSw3ICs0ODMsNyBAQCBzdGF0aWMgaW50IGV4dDRfZHhfY3N1bV92ZXJpZnkoc3RydWN0IGlub2RlICppbm9kZSxcXG4gXFx0cmV0dXJuIDE7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQpXFxuK3N0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudClcXG4ge1xcbiBcXHRzdHJ1Y3QgZHhfY291bnRsaW1pdCAqYztcXG4gXFx0c3RydWN0IGR4X3RhaWwgKnQ7XFxuQEAgLTUwNiw2ICs1MDQsMTAgQEAgc3RhdGljIHZvaWQgZXh0NF9keF9jc3VtX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudClcXG4gXFx0XFx0d2Fybl9ub19zcGFjZV9mb3JfY3N1bShpbm9kZSk7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbitcXHRpZiAoY291bnQgXFx1MDAzZSBsaW1pdCkge1xcbitcXHRcXHRFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLCBcXFwiZGlyIHNlZW1zIGNvcnJ1cHQ/ICBSdW4gZTJmc2NrIC1ELlxcXCIpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4gXFx0dCA9IChzdHJ1Y3QgZHhfdGFpbCAqKSgoKHN0cnVjdCBkeF9lbnRyeSAqKWMpICsgbGltaXQpO1xcbiBcXG4gXFx0dC1cXHUwMDNlZHRfY2hlY2tzdW0gPSBleHQ0X2R4X2NzdW0oaW5vZGUsIGRpcmVudCwgY291bnRfb2Zmc2V0LCBjb3VudCwgdCk7XFxuQEAgLTUxNSw3ICs1MTcsNyBAQCBzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9kaXJ0eV9keF9ub2RlKGhhbmRsZV90ICpoYW5kbGUsXFxuIFxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaClcXG4ge1xcbi1cXHRleHQ0X2R4X2NzdW1fc2V0KGlub2RlLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopYmgtXFx1MDAzZWJfZGF0YSk7XFxuK1xcdGV4dDRfZHhfY3N1bV9zZXQoaW5vZGUsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJoLVxcdTAwM2ViX2RhdGEpO1xcbiBcXHRyZXR1cm4gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpO1xcbiB9XFxuIFxcbkBAIC01MzMsNiArNTM1LDMwIEBAIGV4dDRfbmV4dF9lbnRyeShzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqcCwgdW5zaWduZWQgbG9uZyBibG9ja3NpemUpXFxuICAqIEZ1dHVyZTogdXNlIGhpZ2ggZm91ciBiaXRzIG9mIGJsb2NrIGZvciBjb2FsZXNjZS1vbi1kZWxldGUgZmxhZ3NcXG4gICogTWFzayB0aGVtIG9mZiBmb3Igbm93LlxcbiAgKi9cXG4rc3RhdGljIHN0cnVjdCBkeF9yb290X2luZm8gKmR4X2dldF9keF9pbmZvKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICpkZV9idWYpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IGJsb2Nrc2l6ZSA9IGRpci1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemU7XFxuK1xcdHZvaWQgKmJhc2UgPSBkZV9idWY7XFxuK1xcbitcXHQvKiAnLicgYW5kICcuLicgbmV2ZXIgY2FycnkgdGhlIGNhc2Vmb2xkK2ZzY3J5cHQgaGFzaCwgc28gcGFzcyBOVUxMXFxuK1xcdCAqIGZvciBkaXIgcmVnYXJkbGVzcyBvZiB0aGUgZGlyZWN0b3J5J3MgZmxhZ3MgKi9cXG4rXFx0aWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWRlX2J1ZiktXFx1MDAzZXJlY19sZW4sXFxuK1xcdFxcdFxcdFxcdCAgIGJsb2Nrc2l6ZSkgXFx1MDAzYyBFWFQ0X0JBU0VfRElSX0xFTilcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGU0NPUlJVUFRFRCk7XFxuK1xcdGRlX2J1ZiArPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGVfYnVmLCBibG9ja3NpemUsIE5VTEwpO1xcbitcXG4rXFx0LyogZHggcm9vdCBpbmZvIGlzIGFmdGVyIGRvdGRvdCBlbnRyeSAqL1xcbitcXHRpZiAoZGVfYnVmIFxcdTAwM2MgYmFzZSB8fCAoY2hhciAqKWRlX2J1ZiAtIChjaGFyICopYmFzZSArXFxuK1xcdCAgICBFWFQ0X0JBU0VfRElSX0xFTiBcXHUwMDNlIGJsb2Nrc2l6ZSlcXG4rXFx0XFx0cmV0dXJuIEVSUl9QVFIoLUVGU0NPUlJVUFRFRCk7XFxuK1xcdGRlX2J1ZiArPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGVfYnVmLCBibG9ja3NpemUsIE5VTEwpO1xcbitcXG4rXFx0aWYgKGRlX2J1ZiBcXHUwMDNjIGJhc2UgfHwgKGNoYXIgKilkZV9idWYgLSAoY2hhciAqKWJhc2UgK1xcbitcXHRcXHRcXHQgICAgICBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykgXFx1MDAzZSBibG9ja3NpemUpXFxuK1xcdFxcdHJldHVybiBFUlJfUFRSKC1FRlNDT1JSVVBURUQpO1xcbitcXG4rXFx0cmV0dXJuIChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopZGVfYnVmO1xcbit9XFxuIFxcbiBzdGF0aWMgaW5saW5lIGV4dDRfbGJsa190IGR4X2dldF9ibG9jayhzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5KVxcbiB7XFxuQEAgLTU3NCwxMSArNjAwLDE3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBkeF9zZXRfbGltaXQoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSlcXG4gXFx0KChzdHJ1Y3QgZHhfY291bnRsaW1pdCAqKSBlbnRyaWVzKS1cXHUwMDNlbGltaXQgPSBjcHVfdG9fbGUxNih2YWx1ZSk7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfcm9vdF9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgaW5mb3NpemUpXFxuK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfcm9vdF9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpcixcXG4rXFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRvdF9kZSlcXG4ge1xcbi1cXHR1bnNpZ25lZCBpbnQgZW50cnlfc3BhY2UgPSBkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIC1cXG4tXFx0XFx0XFx0ZXh0NF9kaXJfcmVjX2xlbigxLCBOVUxMKSAtXFxuLVxcdFxcdFxcdGV4dDRfZGlyX3JlY19sZW4oMiwgTlVMTCkgLSBpbmZvc2l6ZTtcXG4rXFx0c3RydWN0IGR4X3Jvb3RfaW5mbyAqaW5mbztcXG4rXFx0dW5zaWduZWQgaW50IGVudHJ5X3NwYWNlO1xcbitcXG4rXFx0aW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgZG90X2RlKTtcXG4rXFx0aWYgKElTX0VSUihpbmZvKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdGVudHJ5X3NwYWNlID0gZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAtICgoY2hhciAqKWluZm8gLSAoY2hhciAqKWRvdF9kZSkgLVxcbitcXHRcXHRpbmZvLVxcdTAwM2VpbmZvX2xlbmd0aDtcXG4gXFxuIFxcdGlmIChleHQ0X2hhc19mZWF0dXJlX21ldGFkYXRhX2NzdW0oZGlyLVxcdTAwM2VpX3NiKSlcXG4gXFx0XFx0ZW50cnlfc3BhY2UgLT0gc2l6ZW9mKHN0cnVjdCBkeF90YWlsKTtcXG5AQCAtNTg3LDggKzYxOSwxMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGluZm9zaXplKVxcbiBcXG4gc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9ub2RlX2xpbWl0KHN0cnVjdCBpbm9kZSAqZGlyKVxcbiB7XFxuK1xcdC8qIGR4X25vZGUgZmFrZV9kaXJlbnQgaXMgYWx3YXlzIDggYnl0ZXMg4oCUIGl0IG5ldmVyIGNhcnJpZXMgYSBjYXNlZm9sZFxcbitcXHQgKiBoYXNoLCBzbyBwYXNzIE5VTEwgdG8gc3VwcHJlc3MgdGhlIGhhc2gtc2l6ZSB0ZXJtLiAqL1xcbiBcXHR1bnNpZ25lZCBpbnQgZW50cnlfc3BhY2UgPSBkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplIC1cXG4tXFx0XFx0XFx0ZXh0NF9kaXJfcmVjX2xlbigwLCBkaXIpO1xcbitcXHRcXHRcXHRleHQ0X2RpcmVudF9yZWNfbGVuKDAsIE5VTEwpO1xcbiBcXG4gXFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfbWV0YWRhdGFfY3N1bShkaXItXFx1MDAzZWlfc2IpKVxcbiBcXHRcXHRlbnRyeV9zcGFjZSAtPSBzaXplb2Yoc3RydWN0IGR4X3RhaWwpO1xcbkBAIC02OTgsNyArNzMyLDkgQEAgc3RhdGljIHN0cnVjdCBzdGF0cyBkeF9zaG93X2xlYWYoc3RydWN0IGlub2RlICpkaXIsXFxuIFxcdFxcdFxcdFxcdCAgICAgICAodW5zaWduZWQpICgoY2hhciAqKSBkZSAtIGJhc2UpKTtcXG4gI2VuZGlmXFxuIFxcdFxcdFxcdH1cXG4tXFx0XFx0XFx0c3BhY2UgKz0gZXh0NF9kaXJfcmVjX2xlbihkZS1cXHUwMDNlbmFtZV9sZW4sIGRpcik7XFxuK1xcdFxcdFxcdGlmICgoY2hhciAqKWRlICsgRVhUNF9CQVNFX0RJUl9MRU4gXFx1MDAzZSBiYXNlICsgc2l6ZSlcXG4rXFx0XFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdFxcdHNwYWNlICs9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgc2l6ZSwgZGlyKTtcXG4gXFx0XFx0XFx0bmFtZXMrKztcXG4gXFx0XFx0fVxcbiBcXHRcXHRkZSA9IGV4dDRfbmV4dF9lbnRyeShkZSwgc2l6ZSk7XFxuQEAgLTc4MCw3ICs4MTYsNyBAQCBkeF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbiB7XFxuIFxcdHVuc2lnbmVkIGNvdW50LCBpbmRpcmVjdCwgbGV2ZWwsIGk7XFxuIFxcdHN0cnVjdCBkeF9lbnRyeSAqYXQsICplbnRyaWVzLCAqcCwgKnEsICptO1xcbi1cXHRzdHJ1Y3QgZHhfcm9vdCAqcm9vdDtcXG4rXFx0c3RydWN0IGR4X3Jvb3RfaW5mbyAqaW5mbztcXG4gXFx0c3RydWN0IGR4X2ZyYW1lICpmcmFtZSA9IGZyYW1lX2luO1xcbiBcXHRzdHJ1Y3QgZHhfZnJhbWUgKnJldF9lcnIgPSBFUlJfUFRSKEVSUl9CQURfRFhfRElSKTtcXG4gXFx0dTMyIGhhc2g7XFxuQEAgLTc5MiwyMyArODI4LDMxIEBAIGR4X3Byb2JlKHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwgc3RydWN0IGlub2RlICpkaXIsXFxuIFxcdGlmIChJU19FUlIoZnJhbWUtXFx1MDAzZWJoKSlcXG4gXFx0XFx0cmV0dXJuIChzdHJ1Y3QgZHhfZnJhbWUgKikgZnJhbWUtXFx1MDAzZWJoO1xcbiBcXG4tXFx0cm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBmcmFtZS1cXHUwMDNlYmgtXFx1MDAzZWJfZGF0YTtcXG4tXFx0aWYgKHJvb3QtXFx1MDAzZWluZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfVEVBIFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICByb290LVxcdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0hBTEZfTUQ0IFxcdTAwMjZcXHUwMDI2XFxuLVxcdCAgICByb290LVxcdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0xFR0FDWSBcXHUwMDI2XFx1MDAyNlxcbi1cXHQgICAgcm9vdC1cXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9TSVBIQVNIKSB7XFxuLVxcdFxcdGV4dDRfd2FybmluZ19pbm9kZShkaXIsIFxcXCJVbnJlY29nbmlzZWQgaW5vZGUgaGFzaCBjb2RlICV1XFxcIixcXG4tXFx0XFx0XFx0XFx0ICAgcm9vdC1cXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24pO1xcbitcXHRpbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilmcmFtZS1cXHUwMDNlYmgtXFx1MDAzZWJfZGF0YSk7XFxuK1xcdGlmIChJU19FUlIoaW5mbykpXFxuK1xcdFxcdGdvdG8gZmFpbDtcXG4rXFx0aWYgKGluZm8tXFx1MDAzZWluZm9fbGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgZHhfcm9vdF9pbmZvKSkge1xcbitcXHRcXHRleHQ0X3dhcm5pbmdfaW5vZGUoZGlyLCBcXFwiY29ycnVwdGVkIGh0cmVlOiBpbmZvX2xlbmd0aCAldVxcXCIsXFxuK1xcdFxcdFxcdFxcdCAgIGluZm8tXFx1MDAzZWluZm9fbGVuZ3RoKTtcXG4rXFx0XFx0Z290byBmYWlsO1xcbitcXHR9XFxuK1xcdGlmIChpbmZvLVxcdTAwM2VoYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9URUEgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGluZm8tXFx1MDAzZWhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0hBTEZfTUQ0IFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBpbmZvLVxcdTAwM2VoYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9MRUdBQ1kgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGluZm8tXFx1MDAzZWhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHtcXG4rXFx0XFx0ZXh0NF93YXJuaW5nKGRpci1cXHUwMDNlaV9zYixcXG4rXFx0XFx0XFx0XFxcIlVucmVjb2duaXNlZCBpbm9kZSBoYXNoIGNvZGUgJWQgZm9yIGRpcmVjdG9yeSAjJWxsdVxcXCIsXFxuK1xcdFxcdFxcdGluZm8tXFx1MDAzZWhhc2hfdmVyc2lvbiwgZGlyLVxcdTAwM2VpX2lubyk7XFxuIFxcdFxcdGdvdG8gZmFpbDtcXG4gXFx0fVxcbiBcXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7XFxuLVxcdFxcdGlmIChyb290LVxcdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHtcXG4rXFx0XFx0aWYgKGluZm8tXFx1MDAzZWhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHtcXG4gXFx0XFx0XFx0ZXh0NF93YXJuaW5nX2lub2RlKGRpcixcXG4gXFx0XFx0XFx0XFx0XFxcIkhhc2ggaW4gZGlyZW50LCBidXQgaGFzaCBpcyBub3QgU0lQSEFTSFxcXCIpO1xcbiBcXHRcXHRcXHRnb3RvIGZhaWw7XFxuIFxcdFxcdH1cXG4gXFx0fSBlbHNlIHtcXG4tXFx0XFx0aWYgKHJvb3QtXFx1MDAzZWluZm8uaGFzaF92ZXJzaW9uID09IERYX0hBU0hfU0lQSEFTSCkge1xcbitcXHRcXHRpZiAoaW5mby1cXHUwMDNlaGFzaF92ZXJzaW9uID09IERYX0hBU0hfU0lQSEFTSCkge1xcbiBcXHRcXHRcXHRleHQ0X3dhcm5pbmdfaW5vZGUoZGlyLFxcbiBcXHRcXHRcXHRcXHRcXFwiSGFzaCBjb2RlIGlzIFNJUEhBU0gsIGJ1dCBoYXNoIG5vdCBpbiBkaXJlbnRcXFwiKTtcXG4gXFx0XFx0XFx0Z290byBmYWlsO1xcbkBAIC04MTYsNyArODYwLDcgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4gXFx0fVxcbiBcXHRpZiAoZm5hbWUpXFxuIFxcdFxcdGhpbmZvID0gXFx1MDAyNmZuYW1lLVxcdTAwM2VoaW5mbztcXG4tXFx0aGluZm8tXFx1MDAzZWhhc2hfdmVyc2lvbiA9IHJvb3QtXFx1MDAzZWluZm8uaGFzaF92ZXJzaW9uO1xcbitcXHRoaW5mby1cXHUwMDNlaGFzaF92ZXJzaW9uID0gaW5mby1cXHUwMDNlaGFzaF92ZXJzaW9uO1xcbiBcXHRpZiAoaGluZm8tXFx1MDAzZWhhc2hfdmVyc2lvbiBcXHUwMDNjPSBEWF9IQVNIX1RFQSlcXG4gXFx0XFx0aGluZm8tXFx1MDAzZWhhc2hfdmVyc2lvbiArPSBFWFQ0X1NCKGRpci1cXHUwMDNlaV9zYiktXFx1MDAzZXNfaGFzaF91bnNpZ25lZDtcXG4gXFx0aGluZm8tXFx1MDAzZXNlZWQgPSBFWFQ0X1NCKGRpci1cXHUwMDNlaV9zYiktXFx1MDAzZXNfaGFzaF9zZWVkO1xcbkBAIC04MzIsMTMgKzg3NiwxMyBAQCBkeF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbiBcXHR9XFxuIFxcdGhhc2ggPSBoaW5mby1cXHUwMDNlaGFzaDtcXG4gXFxuLVxcdGlmIChyb290LVxcdTAwM2VpbmZvLnVudXNlZF9mbGFncyBcXHUwMDI2IDEpIHtcXG4rXFx0aWYgKGluZm8tXFx1MDAzZXVudXNlZF9mbGFncyBcXHUwMDI2IDEpIHtcXG4gXFx0XFx0ZXh0NF93YXJuaW5nX2lub2RlKGRpciwgXFxcIlVuaW1wbGVtZW50ZWQgaGFzaCBmbGFnczogJSMwNnhcXFwiLFxcbi1cXHRcXHRcXHRcXHQgICByb290LVxcdTAwM2VpbmZvLnVudXNlZF9mbGFncyk7XFxuK1xcdFxcdFxcdFxcdCAgIGluZm8tXFx1MDAzZXVudXNlZF9mbGFncyk7XFxuIFxcdFxcdGdvdG8gZmFpbDtcXG4gXFx0fVxcbiBcXG4tXFx0aW5kaXJlY3QgPSByb290LVxcdTAwM2VpbmZvLmluZGlyZWN0X2xldmVscztcXG4rXFx0aW5kaXJlY3QgPSBpbmZvLVxcdTAwM2VpbmRpcmVjdF9sZXZlbHM7XFxuIFxcdGlmIChpbmRpcmVjdCBcXHUwMDNlPSBleHQ0X2Rpcl9odHJlZV9sZXZlbChkaXItXFx1MDAzZWlfc2IpKSB7XFxuIFxcdFxcdGV4dDRfd2FybmluZyhkaXItXFx1MDAzZWlfc2IsXFxuIFxcdFxcdFxcdCAgICAgXFxcIkRpcmVjdG9yeSAoaW5vOiAlbGx1KSBodHJlZSBkZXB0aCAlIzA2eCBleGNlZWRcXFwiXFxuQEAgLTg1MSwxNCArODk1LDE1IEBAIGR4X3Byb2JlKHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwgc3RydWN0IGlub2RlICpkaXIsXFxuIFxcdFxcdGdvdG8gZmFpbDtcXG4gXFx0fVxcbiBcXG4tXFx0ZW50cmllcyA9IChzdHJ1Y3QgZHhfZW50cnkgKikoKChjaGFyICopXFx1MDAyNnJvb3QtXFx1MDAzZWluZm8pICtcXG4tXFx0XFx0XFx0XFx0ICAgICAgcm9vdC1cXHUwMDNlaW5mby5pbmZvX2xlbmd0aCk7XFxuK1xcdGVudHJpZXMgPSAoc3RydWN0IGR4X2VudHJ5ICopKCgoY2hhciAqKWluZm8pICsgaW5mby1cXHUwMDNlaW5mb19sZW5ndGgpO1xcbiBcXG4tXFx0aWYgKGR4X2dldF9saW1pdChlbnRyaWVzKSAhPSBkeF9yb290X2xpbWl0KGRpcixcXG4tXFx0XFx0XFx0XFx0XFx0XFx0ICAgcm9vdC1cXHUwMDNlaW5mby5pbmZvX2xlbmd0aCkpIHtcXG4rXFx0aWYgKGR4X2dldF9saW1pdChlbnRyaWVzKSAhPVxcbitcXHQgICAgZHhfcm9vdF9saW1pdChkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWZyYW1lLVxcdTAwM2ViaC1cXHUwMDNlYl9kYXRhKSkge1xcbiBcXHRcXHRleHQ0X3dhcm5pbmdfaW5vZGUoZGlyLCBcXFwiZHggZW50cnk6IGxpbWl0ICV1ICE9IHJvb3QgbGltaXQgJXVcXFwiLFxcbiBcXHRcXHRcXHRcXHQgICBkeF9nZXRfbGltaXQoZW50cmllcyksXFxuLVxcdFxcdFxcdFxcdCAgIGR4X3Jvb3RfbGltaXQoZGlyLCByb290LVxcdTAwM2VpbmZvLmluZm9fbGVuZ3RoKSk7XFxuK1xcdFxcdFxcdFxcdCAgIGR4X3Jvb3RfbGltaXQoZGlyLFxcbitcXHRcXHRcXHRcXHQgICAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilmcmFtZS1cXHUwMDNlYmgtXFx1MDAzZWJfZGF0YVxcbitcXHRcXHRcXHRcXHQgICApKTtcXG4gXFx0XFx0Z290byBmYWlsO1xcbiBcXHR9XFxuIFxcbkBAIC05MzUsNyArOTgwLDcgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4gXFx0cmV0dXJuIHJldF9lcnI7XFxuIH1cXG4gXFxuLXN0YXRpYyB2b2lkIGR4X3JlbGVhc2Uoc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMpXFxuK3N0YXRpYyB2b2lkIGR4X3JlbGVhc2Uoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzKVxcbiB7XFxuIFxcdHN0cnVjdCBkeF9yb290X2luZm8gKmluZm87XFxuIFxcdGludCBpO1xcbkBAIC05NDQsNyArOTg5LDkgQEAgc3RhdGljIHZvaWQgZHhfcmVsZWFzZShzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcylcXG4gXFx0aWYgKGZyYW1lc1swXS5iaCA9PSBOVUxMKVxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbi1cXHRpbmZvID0gXFx1MDAyNigoc3RydWN0IGR4X3Jvb3QgKilmcmFtZXNbMF0uYmgtXFx1MDAzZWJfZGF0YSktXFx1MDAzZWluZm87XFxuK1xcdGluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWZyYW1lc1swXS5iaC1cXHUwMDNlYl9kYXRhKTtcXG4rXFx0aWYgKElTX0VSUihpbmZvKSlcXG4rXFx0XFx0cmV0dXJuO1xcbiBcXHQvKiBzYXZlIGxvY2FsIGNvcHksIFxcXCJpbmZvXFxcIiBtYXkgYmUgZnJlZWQgYWZ0ZXIgYnJlbHNlKCkgKi9cXG4gXFx0aW5kaXJlY3RfbGV2ZWxzID0gaW5mby1cXHUwMDNlaW5kaXJlY3RfbGV2ZWxzO1xcbiBcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2M9IGluZGlyZWN0X2xldmVsczsgaSsrKSB7XFxuQEAgLTEwNTYsNyArMTEwMyw3IEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXFxuIFxcdC8qIGNzdW0gZW50cmllcyBhcmUgbm90IGxhcmdlciBpbiB0aGUgY2FzZWZvbGRlZCBlbmNyeXB0ZWQgY2FzZSAqL1xcbiBcXHR0b3AgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICtcXG4gXFx0XFx0XFx0XFx0XFx0ICAgZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSAtXFxuLVxcdFxcdFxcdFxcdFxcdCAgIGV4dDRfZGlyX3JlY19sZW4oMCxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgZXh0NF9kaXJlbnRfcmVjX2xlbigwLFxcbiBcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICBjc3VtID8gTlVMTCA6IGRpcikpO1xcbiBcXHQvKiBDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIGVuY3J5cHRlZCAqL1xcbiBcXHRpZiAoSVNfRU5DUllQVEVEKGRpcikpIHtcXG5AQCAtMTA4MSwyMiArMTEyOCwyMyBAQCBzdGF0aWMgaW50IGh0cmVlX2RpcmJsb2NrX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxcbiBcXHRcXHRcXHQvKiBzaWxlbnRseSBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrICovXFxuIFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHR9XFxuLVxcdFxcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpIHtcXG4tXFx0XFx0XFx0aWYgKGRlLVxcdTAwM2VuYW1lX2xlbiBcXHUwMDI2XFx1MDAyNiBkZS1cXHUwMDNlaW5vZGUpIHtcXG4tXFx0XFx0XFx0XFx0aGluZm8tXFx1MDAzZWhhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTtcXG4tXFx0XFx0XFx0XFx0aGluZm8tXFx1MDAzZW1pbm9yX2hhc2ggPSBFWFQ0X0RJUkVOVF9NSU5PUl9IQVNIKGRlKTtcXG4tXFx0XFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0XFx0aGluZm8tXFx1MDAzZWhhc2ggPSAwO1xcbi1cXHRcXHRcXHRcXHRoaW5mby1cXHUwMDNlbWlub3JfaGFzaCA9IDA7XFxuLVxcdFxcdFxcdH1cXG4rXFx0XFx0aWYgKGRlLVxcdTAwM2VuYW1lX2xlbiBcXHUwMDI2XFx1MDAyNiBkZS1cXHUwMDNlaW5vZGUpIHtcXG4rXFx0XFx0XFx0LyogY2hlY2sgZm9yIHNhdmVkIGhhc2ggZmlyc3QsIG9yIGdlbmVyYXRlIGl0IGZyb20gbmFtZSAqL1xcbitcXHRcXHRcXHRpZiAoIShleHQ0X2RpcmRhdGFfZ2V0KGRlLCBkaXIsIGRpci1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgICBOVUxMLCBoaW5mbykgXFx1MDAyNlxcbitcXHRcXHRcXHQgICAgICBFWFQ0X0RJUkVOVF9DRkhBU0gpKSB7XFxuK1xcdFxcdFxcdFxcdGVyciA9IGV4dDRmc19kaXJoYXNoKGRpciwgZGUtXFx1MDAzZW5hbWUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgZGUtXFx1MDAzZW5hbWVfbGVuLCBoaW5mbyk7XFxuK1xcdFxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdFxcdFxcdGNvdW50ID0gZXJyO1xcbitcXHRcXHRcXHRcXHRcXHRnb3RvIGVycm91dDtcXG4rXFx0XFx0XFx0XFx0fVxcbitcXHRcXHRcXHQgfVxcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRlcnIgPSBleHQ0ZnNfZGlyaGFzaChkaXIsIGRlLVxcdTAwM2VuYW1lLFxcbi1cXHRcXHRcXHRcXHRcXHQgICAgIGRlLVxcdTAwM2VuYW1lX2xlbiwgaGluZm8pO1xcbi1cXHRcXHRcXHRpZiAoZXJyIFxcdTAwM2MgMCkge1xcbi1cXHRcXHRcXHRcXHRjb3VudCA9IGVycjtcXG4tXFx0XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuLVxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0aGluZm8tXFx1MDAzZWhhc2ggPSAwO1xcbitcXHRcXHRcXHRoaW5mby1cXHUwMDNlbWlub3JfaGFzaCA9IDA7XFxuIFxcdFxcdH1cXG4rXFxuIFxcdFxcdGlmICgoaGluZm8tXFx1MDAzZWhhc2ggXFx1MDAzYyBzdGFydF9oYXNoKSB8fFxcbiBcXHRcXHQgICAgKChoaW5mby1cXHUwMDNlaGFzaCA9PSBzdGFydF9oYXNoKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHQgICAgIChoaW5mby1cXHUwMDNlbWlub3JfaGFzaCBcXHUwMDNjIHN0YXJ0X21pbm9yX2hhc2gpKSlcXG5AQCAtMTEwNyw4ICsxMTU1LDggQEAgc3RhdGljIGludCBodHJlZV9kaXJibG9ja190b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcXG4gXFx0XFx0XFx0dG1wX3N0ci5uYW1lID0gZGUtXFx1MDAzZW5hbWU7XFxuIFxcdFxcdFxcdHRtcF9zdHIubGVuID0gZGUtXFx1MDAzZW5hbWVfbGVuO1xcbiBcXHRcXHRcXHRlcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSxcXG4tXFx0XFx0XFx0XFx0ICAgaGluZm8tXFx1MDAzZWhhc2gsIGhpbmZvLVxcdTAwM2VtaW5vcl9oYXNoLCBkZSxcXG4tXFx0XFx0XFx0XFx0ICAgXFx1MDAyNnRtcF9zdHIpO1xcbitcXHRcXHRcXHRcXHQgICBoaW5mby1cXHUwMDNlaGFzaCwgaGluZm8tXFx1MDAzZW1pbm9yX2hhc2gsXFxuK1xcdFxcdFxcdFxcdCAgIGRpci1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUsIGRlLCBcXHUwMDI2dG1wX3N0cik7XFxuIFxcdFxcdH0gZWxzZSB7XFxuIFxcdFxcdFxcdGludCBzYXZlX2xlbiA9IGZuYW1lX2NyeXB0b19zdHIubGVuO1xcbiBcXHRcXHRcXHRzdHJ1Y3QgZnNjcnlwdF9zdHIgZGVfbmFtZSA9IEZTVFJfSU5JVChkZS1cXHUwMDNlbmFtZSxcXG5AQCAtMTEyMyw4ICsxMTcxLDkgQEAgc3RhdGljIGludCBodHJlZV9kaXJibG9ja190b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcXG4gXFx0XFx0XFx0XFx0Z290byBlcnJvdXQ7XFxuIFxcdFxcdFxcdH1cXG4gXFx0XFx0XFx0ZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsXFxuLVxcdFxcdFxcdFxcdCAgIGhpbmZvLVxcdTAwM2VoYXNoLCBoaW5mby1cXHUwMDNlbWlub3JfaGFzaCwgZGUsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdTAwMjZmbmFtZV9jcnlwdG9fc3RyKTtcXG4rXFx0XFx0XFx0XFx0XFx0XFx0aGluZm8tXFx1MDAzZWhhc2gsIGhpbmZvLVxcdTAwM2VtaW5vcl9oYXNoLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplLCBkZSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx1MDAyNmZuYW1lX2NyeXB0b19zdHIpO1xcbiBcXHRcXHRcXHRmbmFtZV9jcnlwdG9fc3RyLmxlbiA9IHNhdmVfbGVuO1xcbiBcXHRcXHR9XFxuIFxcdFxcdGlmIChlcnIgIT0gMCkge1xcbkBAIC0xMjAyLDYgKzEyNTEsNyBAQCBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLFxcbiBcXHRcXHR0bXBfc3RyLm5hbWUgPSBkZS1cXHUwMDNlbmFtZTtcXG4gXFx0XFx0dG1wX3N0ci5sZW4gPSBkZS1cXHUwMDNlbmFtZV9sZW47XFxuIFxcdFxcdGVyciA9IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAwLCAwLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICBkZSwgXFx1MDAyNnRtcF9zdHIpO1xcbiBcXHRcXHRpZiAoZXJyICE9IDApXFxuIFxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbkBAIC0xMjEzLDYgKzEyNjMsNyBAQCBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLFxcbiBcXHRcXHR0bXBfc3RyLm5hbWUgPSBkZS1cXHUwMDNlbmFtZTtcXG4gXFx0XFx0dG1wX3N0ci5sZW4gPSBkZS1cXHUwMDNlbmFtZV9sZW47XFxuIFxcdFxcdGVyciA9IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAyLCAwLFxcbitcXHRcXHRcXHRcXHRcXHQgICAgICBkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgICBkZSwgXFx1MDAyNnRtcF9zdHIpO1xcbiBcXHRcXHRpZiAoZXJyICE9IDApXFxuIFxcdFxcdFxcdGdvdG8gZXJyb3V0O1xcbkBAIC0xMjUwLDEyICsxMzAxLDEyIEBAIGludCBleHQ0X2h0cmVlX2ZpbGxfdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIHN0YXJ0X2hhc2gsXFxuIFxcdFxcdCAgICAoY291bnQgXFx1MDAyNlxcdTAwMjYgKChoYXNodmFsIFxcdTAwMjYgMSkgPT0gMCkpKVxcbiBcXHRcXHRcXHRicmVhaztcXG4gXFx0fVxcbi1cXHRkeF9yZWxlYXNlKGZyYW1lcyk7XFxuK1xcdGR4X3JlbGVhc2UoZGlyLCBmcmFtZXMpO1xcbiBcXHRkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHIFxcXCJGaWxsIHRyZWU6IHJldHVybmVkICVkIGVudHJpZXMsIFxcXCJcXG4gXFx0XFx0ICAgICAgIFxcXCJuZXh0IGhhc2g6ICV4XFxcXG5cXFwiLCBjb3VudCwgKm5leHRfaGFzaCkpO1xcbiBcXHRyZXR1cm4gY291bnQ7XFxuIGVycm91dDpcXG4tXFx0ZHhfcmVsZWFzZShmcmFtZXMpO1xcbitcXHRkeF9yZWxlYXNlKGRpciwgZnJhbWVzKTtcXG4gXFx0cmV0dXJuIChlcnIpO1xcbiB9XFxuIFxcbkBAIC0xMjczLDYgKzEzMjQsMjA3IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNlYXJjaF9kaXJibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbiAgKiBEaXJlY3RvcnkgYmxvY2sgc3BsaXR0aW5nLCBjb21wYWN0aW5nXFxuICAqL1xcbiBcXG4rLypcXG4rICogZXh0NF9kaXJkYXRhX2dldCgpIC0gUmVhZCBkaXJkYXRhIGZpZWxkcyBmcm9tIGEgZGlyZWN0b3J5IGVudHJ5LlxcbisgKiBAZGU6ICAgICAgICAgZGlyZWN0b3J5IGVudHJ5XFxuKyAqIEBkaXI6ICAgICAgICBkaXJlY3RvcnkgaW5vZGUgKHVzZWQgZm9yIGZzY3J5cHQrY2FzZWZvbGQgaGFzaCBmYWxsYmFjaylcXG4rICogQGRmaWQ6ICAgICAgaWYgbm9uLU5VTEwgYW5kIEVYVDRfRElSRU5UX0xVRklEIGlzIHNldCwgTFVGSUQgZGF0YSBpcyBjb3BpZWRcXG4rICogXFx0XFx0aGVyZVxcbisgKiBAaGluZm86XFx0aWYgbm9uLU5VTEwsIHJlY2VpdmVzIHRoZSBjYXNlZm9sZCBoYXNoIGFuZCBtaW5vciBoYXNoXFxuKyAqXFxuKyAqIFJlYWRzIGFueSBkaXJkYXRhIHN0b3JlZCBpbiBAZGUuICBJZiB0aGUgZGlyZGF0YSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLFxcbisgKiBmYWxscyBiYWNrIHRvIHJlYWRpbmcgdGhlIGhhc2ggc3RvcmVkIGlubGluZSBhZnRlciB0aGUgZmlsZW5hbWUgKGZvclxcbisgKiBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZGVyIGNhc2Vmb2xkK2ZzY3J5cHQgZm9ybWF0KS5cXG4rICpcXG4rICogUmV0dXJucyBhIGJpdG1hc2sgb2YgRVhUNF9ESVJFTlRfKiBmbGFncyBpbmRpY2F0aW5nIHdoaWNoIGZpZWxkcyB3ZXJlIHJlYWQuXFxuKyAqXFxuKyAqIENvbXBhdGliaWxpdHkgbm90ZTogZW5hYmxpbmcgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEgb24gYSBmaWxlc3lzdGVtXFxuKyAqIHRoYXQgYWxyZWFkeSBoYXMgY2FzZWZvbGRlZCtlbmNyeXB0ZWQgZGlyZWN0b3JpZXMgaXMgTk9UIHNhZmUgd2l0aG91dCBhXFxuKyAqIHByaW9yIG1pZ3JhdGlvbiBwYXNzLiAgQmVmb3JlIGRpcmRhdGEsIHRoZSBjYXNlZm9sZCtmc2NyeXB0IGhhc2ggd2FzIHN0b3JlZFxcbisgKiBhcyBhIHJhdyA4IGJ5dGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlbmFtZSB3aXRoIG5vIGZsYWcgaW4gZmlsZV90eXBlLlxcbisgKiBBZnRlciBkaXJkYXRhIGlzIGVuYWJsZWQsIHRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGUgaGFzaCB0byBiZSBwcmVzZW50IG9ubHlcXG4rICogd2hlbiBFWFQ0X0RJUkVOVF9DRkhBU0ggKDB4NDApIGlzIHNldCBpbiBmaWxlX3R5cGU7IGV4aXN0aW5nIGVudHJpZXMgdGhhdFxcbisgKiBjYXJyeSB0aGUgcmF3IGhhc2ggYXJlIHNpbGVudGx5IG1pc3JlYWQgYXMgaGF2aW5nIG5vIGhhc2ggYXQgYWxsLCBicmVha2luZ1xcbisgKiBkaXJlY3RvcnkgbG9va3Vwcy4gIGUyZnNjayBtdXN0IGJlIHJ1biB0byBjb252ZXJ0IGFsbCBhZmZlY3RlZCBlbnRyaWVzIHRvXFxuKyAqIHRoZSBFWFQ0X0RJUkVOVF9DRkhBU0ggZXh0ZW5zaW9uIGZvcm1hdCBiZWZvcmUgdGhlIGZlYXR1cmUgZmxhZyBpcyBzZXQgd2l0aFxcbisgKiB0dW5lMmZzLiAgRGV0ZWN0aW9uIGhldXJpc3RpYzogaW4gYSBjYXNlZm9sZCtlbmNyeXB0ZWQgZGlyZWN0b3J5LCBhbiBlbnRyeVxcbisgKiB3aXRoIHJlY19sZW4gXFx1MDAzZT0gcm91bmRfdXAobmFtZV9sZW4sIDQpICsgOCBhbmQgbm8gRVhUNF9ESVJFTlRfQ0ZIQVNIIGJpdFxcbisgKiBjYXJyaWVzIGEgcmF3IHByZS1kaXJkYXRhIGhhc2ggdGhhdCBtdXN0IGJlIG1pZ3JhdGVkLlxcbisgKi9cXG4rdW5zaWduZWQgY2hhciBleHQ0X2RpcmRhdGFfZ2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXFxuK1xcdFxcdFxcdCAgICAgICBpbnQgYnVmX3NpemUsXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkZmlkLFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8pXFxuK3tcXG4rXFx0dW5zaWduZWQgY2hhciByZXQgPSAwO1xcbitcXHR1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQgPSBkZS1cXHUwMDNlbmFtZV9sZW4gKyAxO1xcbitcXHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXFx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcXG4rXFxuK1xcdC8qIGRhdGFfb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIGRlLVxcdTAwM2VuYW1lLCB3aGljaCBpdHNlbGYgc3RhcnRzXFxuK1xcdCAqIEVYVDRfQkFTRV9ESVJfTEVOIGJ5dGVzIGludG8gdGhlIGVudHJ5IC0tIHJlY19sZW4gaXMgcmVsYXRpdmUgdG9cXG4rXFx0ICogdGhlIHN0YXJ0IG9mIHRoZSBlbnRyeSwgc28gYWRkIHRoZSBoZWFkZXIgc2l6ZSBiZWZvcmUgY29tcGFyaW5nLFxcbitcXHQgKiBvciB0aGlzIGxldHMgcmVhZHMgcnVuIEVYVDRfQkFTRV9ESVJfTEVOIGJ5dGVzIHBhc3QgdGhlIGVudHJ5LiAqL1xcbitcXHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCBcXHUwMDNlIHJlY19sZW4pXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHQvKiBjb21wYXRpYmlsaXR5OiBoYXNoIHN0b3JlZCBpbmxpbmUgYWZ0ZXIgZmlsZW5hbWUgKG5vIGRpcmRhdGEpICovXFxuK1xcdGlmIChoaW5mbyBcXHUwMDI2XFx1MDAyNiAhZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci1cXHUwMDNlaV9zYikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkge1xcbitcXHRcXHRoaW5mby1cXHUwMDNlaGFzaCA9IEVYVDRfRElSRU5UX0hBU0goZGUpO1xcbitcXHRcXHRoaW5mby1cXHUwMDNlbWlub3JfaGFzaCA9IEVYVDRfRElSRU5UX01JTk9SX0hBU0goZGUpO1xcbitcXHRcXHRyZXQgfD0gRVhUNF9ESVJFTlRfQ0ZIQVNIO1xcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHQvKiBFWFQ0X0RJUkVOVF8qIGJpdHMgYXJlIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQgKi9cXG4rXFx0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVxcdTAwM2VpX3NiKSlcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGlmIChkZS1cXHUwMDNlZmlsZV90eXBlIFxcdTAwMjYgRVhUNF9ESVJFTlRfTFVGSUQpIHtcXG4rXFx0XFx0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGlza19maWQgPVxcbitcXHRcXHRcXHQoc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqKSgoY2hhciAqKWRlICtcXG4rXFx0XFx0XFx0RVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCk7XFxuK1xcdFxcdHVuc2lnbmVkIGludCBkbGVuO1xcbitcXHRcXHQvKiBzdHJ1Y3QgZXh0NF9maWQgZGZfZmlkW10gZG9lcyBub3QgcHJvdmlkZSB0aGUgYXJyYXkgc2l6ZS5cXG4rXFx0XFx0ICogRmlyc3QsIHZlcmlmeSB0aGF0IHRoZSBoZWFkZXIgbGllcyB3aXRoaW4gdGhlIHZhbGlkIGFyZWEsIHRoZW5cXG4rIFxcdFxcdCAqIHZlcmlmeSB0aGF0IHRoZSBlbnRpcmUgcmVjb3JkIGZpdHMgd2l0aGluIGl0LiAqL1xcbitcXHRcXHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCArXFxuK1xcdFxcdCAgICBzaXplb2YoZGlza19maWQtXFx1MDAzZWRmX2hlYWRlcikgXFx1MDAzZSByZWNfbGVuKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0XFx0ZGxlbiA9IGRpc2tfZmlkLVxcdTAwM2VkZl9oZWFkZXIuZGRoX2xlbmd0aDtcXG4rXFx0XFx0aWYgKGRsZW4gPT0gMCB8fFxcbitcXHRcXHQgICAgRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCArIGRsZW4gXFx1MDAzZSByZWNfbGVuKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0XFx0aWYgKGRmaWQpIHtcXG4rXFx0XFx0XFx0LyogVGhlIHNpemUgY2FwIGJlbG93IGVuc3VyZXMgdGhlIHJlY29yZCBob2xkcyBhdCBsZWFzdFxcbitcXHRcXHRcXHQgKiBvbmUgY29tcGxldGUgc3RydWN0IGV4dDRfZmlkLiAqL1xcbitcXHRcXHRcXHRpZiAoZGxlbiBcXHUwMDNlIHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIpICtcXG4rXFx0XFx0XFx0XFx0ICAgIHNpemVvZihzdHJ1Y3QgZXh0NF9maWQpKVxcbitcXHRcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHRcXHRcXHRtZW1jcHkoZGZpZCwgZGlza19maWQsIGRsZW4pO1xcbitcXHRcXHRcXHRyZXQgfD0gRVhUNF9ESVJFTlRfTFVGSUQ7XFxuK1xcdFxcdH1cXG4rXFx0XFx0ZGF0YV9vZmZzZXQgKz0gZGxlbjtcXG4rXFx0fVxcbitcXG4rXFx0LyogU2tpcCBJTk82NCBmb3Igbm93Ki9cXG4rXFx0aWYgKGRlLVxcdTAwM2VmaWxlX3R5cGUgXFx1MDAyNiBFWFQ0X0RJUkVOVF9JTk82NCkge1xcbitcXHRcXHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIgKmRkaCA9XFxuK1xcdFxcdCAgICAgICAoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopKChjaGFyICopZGUgKyBFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0KTtcXG4rXFx0XFx0dW5zaWduZWQgaW50IGRsZW47XFxuK1xcbitcXHRcXHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCArIHNpemVvZigqZGRoKSBcXHUwMDNlIHJlY19sZW4pXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRcXHRkbGVuID0gZGRoLVxcdTAwM2VkZGhfbGVuZ3RoO1xcbitcXHRcXHRpZiAoZGxlbiBcXHUwMDNjIHNpemVvZigqZGRoKSB8fFxcbitcXHRcXHQgICAgRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCArIGRsZW4gXFx1MDAzZSByZWNfbGVuKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0XFx0ZGF0YV9vZmZzZXQgKz0gZGxlbjtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFoaW5mbylcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGlmIChkZS1cXHUwMDNlZmlsZV90eXBlIFxcdTAwMjYgRVhUNF9ESVJFTlRfQ0ZIQVNIKSB7XFxuK1xcdFxcdHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICpkaCA9XFxuK1xcdFxcdFxcdChzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCAqKSgoY2hhciAqKWRlICsgRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCk7XFxuK1xcdFxcdHVuc2lnbmVkIGludCBkbGVuO1xcbitcXG4rXFx0XFx0aWYgKEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgKyBzaXplb2YoKmRoKSBcXHUwMDNlIHJlY19sZW4pXFxuK1xcdFxcdFxcdHJldHVybiByZXQ7XFxuK1xcdFxcdGRsZW4gPSBkaC1cXHUwMDNlZGhfaGVhZGVyLmRkaF9sZW5ndGg7XFxuK1xcdFxcdGlmIChkbGVuIFxcdTAwM2Mgc2l6ZW9mKCpkaCkgfHxcXG4rXFx0XFx0ICAgIEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgKyBkbGVuIFxcdTAwM2UgcmVjX2xlbilcXG4rXFx0XFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdFxcdGhpbmZvLVxcdTAwM2VoYXNoID0gbGUzMl90b19jcHUoZGgtXFx1MDAzZWRoX2hhc2guaGFzaCk7XFxuK1xcdFxcdGhpbmZvLVxcdTAwM2VtaW5vcl9oYXNoID0gbGUzMl90b19jcHUoZGgtXFx1MDAzZWRoX2hhc2gubWlub3JfaGFzaCk7XFxuK1xcdFxcdHJldCB8PSBFWFQ0X0RJUkVOVF9DRkhBU0g7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIGV4dDRfZGlyZGF0YV9zZXQoKSAtIFdyaXRlIGRpcmRhdGEgZmllbGRzIGludG8gYSBkaXJlY3RvcnkgZW50cnkuXFxuKyAqIEBkZTogICAgZGlyZWN0b3J5IGVudHJ5IChuYW1lIG11c3QgYWxyZWFkeSBiZSBzZXQpXFxuKyAqIEBkaXI6ICAgZGlyZWN0b3J5IGlub2RlXFxuKyAqIEBkYXRhOiAgTFVGSUQgZGF0YSB0byBzdG9yZSAob3IgTlVMTClcXG4rICogQGZuYW1lOiBmaWxlbmFtZSBpbmZvIGNhcnJ5aW5nIHRoZSBjYXNlZm9sZCBoYXNoXFxuKyAqXFxuKyAqIFdyaXRlcyBhbnkgcmVxdWlyZWQgZGlyZGF0YSBpbnRvIEBkZSBhZnRlciB0aGUgZmlsZW5hbWUuICBJZiB0aGUgZGlyZGF0YVxcbisgKiBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCBmYWxscyBiYWNrIHRvIHdyaXRpbmcgdGhlIGhhc2ggaW5saW5lIGFmdGVyIHRoZVxcbisgKiBmaWxlbmFtZSAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkZXIgY2FzZWZvbGQrZnNjcnlwdCBmb3JtYXQpLlxcbisgKlxcbisgKiBTZWUgZXh0NF9kaXJkYXRhX2dldCgpIGZvciB0aGUgY29tcGF0aWJpbGl0eSBjb25zdHJhaW50OiBlbmFibGluZyB0aGVcXG4rICogZGlyZGF0YSBmZWF0dXJlIG9uIGEgZmlsZXN5c3RlbSB3aXRoIGV4aXN0aW5nIGNhc2Vmb2xkZWQrZW5jcnlwdGVkXFxuKyAqIGRpcmVjdG9yaWVzIHJlcXVpcmVzIGFuIGUyZnNjayBtaWdyYXRpb24gcGFzcyBiZWZvcmUgdHVuZTJmcyBzZXRzIHRoZVxcbisgKiBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQSBzdXBlcmJsb2NrIGZsYWcuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBleHQ0X2RpcmRhdGFfc2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXFxuK1xcdFxcdFxcdCAgICAgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZCxcXG4rXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUpXFxuK3tcXG4rXFx0c3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8gPSBcXHUwMDI2Zm5hbWUtXFx1MDAzZWhpbmZvO1xcbitcXHR1bnNpZ25lZCBpbnQgZGF0YV9vZmZzZXQgPSBkZS1cXHUwMDNlbmFtZV9sZW4gKyAxO1xcbitcXHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXFx1MDAzZXJlY19sZW4sXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgICBkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4rXFxuK1xcdC8qIENsZWFyIHRoZSBnYXAgYnl0ZSBiZXR3ZWVuIHRoZSBmaWxlbmFtZSBhbmQgdGhlIGZpcnN0IGRpcmRhdGFcXG4rXFx0ICogZXh0ZW5zaW9uIHRvIGF2b2lkIGxlYWtpbmcgc3RhbGUgbWVtb3J5IHRvIGRpc2suICBVc2UgcG9pbnRlclxcbitcXHQgKiBhcml0aG1ldGljIHJhdGhlciB0aGFuIGRlLVxcdTAwM2VuYW1lW25hbWVfbGVuXSB0byBzdGF5IHdpdGhpbiB0aGVcXG4rXFx0ICogZGVjbGFyZWQgbmFtZVtdIGFycmF5IGJvdW5kcyB1bmRlciBGT1JUSUZZX1NPVVJDRS4gIE9ubHkgd3JpdGUgaXRcXG4rXFx0ICogd2hlbiB0aGVyZSBpcyBhY3R1YWxseSByb29tIChlbnRyaWVzIHRoYXQgZXhhY3RseSBmaWxsIHRoZWlyIHNsb3RcXG4rXFx0ICogaGF2ZSByZWNfbGVuID09IEVYVDRfQkFTRV9ESVJfTEVOICsgbmFtZV9sZW4gd2l0aCBubyBnYXApLiAqL1xcbitcXHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCBcXHUwMDNjPSByZWNfbGVuKVxcbitcXHRcXHQqKChjaGFyICopZGUgKyBFWFQ0X0JBU0VfRElSX0xFTiArIGRlLVxcdTAwM2VuYW1lX2xlbikgPSAwO1xcbitcXG4rXFx0aWYgKGRmaWQpIHtcXG4rXFx0XFx0dW5zaWduZWQgaW50IGRsZW4gPSBkZmlkLVxcdTAwM2VkZl9oZWFkZXIuZGRoX2xlbmd0aDtcXG4rXFxuK1xcdFxcdGlmIChFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0ICsgZGxlbiBcXHUwMDNlIHJlY19sZW4pIHtcXG4rXFx0XFx0XFx0RVhUNF9FUlJPUl9JTk9ERShkaXIsIFxcXCJDYW4gbm90IGluc2VydCBGSURcXFwiKTtcXG4rXFx0XFx0XFx0cmV0dXJuO1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRtZW1jcHkoKGNoYXIgKilkZSArIEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQsIGRmaWQsIGRsZW4pO1xcbitcXHRcXHRkZS1cXHUwMDNlZmlsZV90eXBlIHw9IEVYVDRfRElSRU5UX0xVRklEO1xcbitcXHRcXHRkYXRhX29mZnNldCArPSBkbGVuO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7XFxuK1xcdFxcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVxcdTAwM2VpX3NiKSkge1xcbitcXHRcXHRcXHRzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCAqZGggPVxcbitcXHRcXHRcXHQgICAgKHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICopKChjaGFyICopZGUgKyBFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0KTtcXG4rXFxuK1xcdFxcdFxcdGlmIChFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKCpkaCkgXFx1MDAzZSByZWNfbGVuKSB7XFxuK1xcdFxcdFxcdFxcdEVYVDRfRVJST1JfSU5PREUoZGlyLCBcXFwiQ2FuIG5vdCBpbnNlcnQgZGhhc2ggZGlyZGF0YVxcXCIpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm47XFxuK1xcdFxcdFxcdH1cXG4rXFxuK1xcdFxcdFxcdGRoLVxcdTAwM2VkaF9oZWFkZXIuZGRoX2xlbmd0aCA9IHNpemVvZigqZGgpO1xcbitcXHRcXHRcXHRkaC1cXHUwMDNlZGhfaGFzaC5oYXNoID0gY3B1X3RvX2xlMzIoaGluZm8tXFx1MDAzZWhhc2gpO1xcbitcXHRcXHRcXHRkaC1cXHUwMDNlZGhfaGFzaC5taW5vcl9oYXNoID0gY3B1X3RvX2xlMzIoaGluZm8tXFx1MDAzZW1pbm9yX2hhc2gpO1xcbitcXHRcXHRcXHRkZS1cXHUwMDNlZmlsZV90eXBlIHw9IEVYVDRfRElSRU5UX0NGSEFTSDtcXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0LyogQ29tcGF0aWJpbGl0eTogc3RvcmUgaGFzaCBpbmxpbmUgYWZ0ZXIgZmlsZW5hbWUgKi9cXG4rXFx0XFx0XFx0aWYgKEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgK1xcbitcXHRcXHRcXHQgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV9oYXNoKSBcXHUwMDNlIHJlY19sZW4pIHtcXG4rXFx0XFx0XFx0XFx0RVhUNF9FUlJPUl9JTk9ERShkaXIsIFxcXCJDYW4gbm90IGluc2VydCBkaGFzaFxcXCIpO1xcbitcXHRcXHRcXHRcXHRyZXR1cm47XFxuK1xcdFxcdFxcdH1cXG4rXFxuK1xcdFxcdFxcdEVYVDRfRElSRU5UX0hBU0hFUyhkZSktXFx1MDAzZWhhc2ggPSBjcHVfdG9fbGUzMihoaW5mby1cXHUwMDNlaGFzaCk7XFxuK1xcdFxcdFxcdEVYVDRfRElSRU5UX0hBU0hFUyhkZSktXFx1MDAzZW1pbm9yX2hhc2ggPVxcbitcXHRcXHRcXHRcXHRcXHRcXHRjcHVfdG9fbGUzMihoaW5mby1cXHUwMDNlbWlub3JfaGFzaCk7XFxuK1xcdFxcdH1cXG4rXFx0fVxcbit9XFxuK1xcbiAvKlxcbiAgKiBDcmVhdGUgbWFwIG9mIGhhc2ggdmFsdWVzLCBvZmZzZXRzLCBhbmQgc2l6ZXMsIHN0b3JlZCBhdCBlbmQgb2YgYmxvY2suXFxuICAqIFJldHVybnMgbnVtYmVyIG9mIGVudHJpZXMgbWFwcGVkLlxcbkBAIC0xMjk2LDkgKzE1NDgsOSBAQCBzdGF0aWMgaW50IGR4X21ha2VfbWFwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbiBcXHRcXHRcXHRcXHRcXHQgKChjaGFyICopZGUpIC0gYmFzZSkpXFxuIFxcdFxcdFxcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xcbiBcXHRcXHRpZiAoZGUtXFx1MDAzZW5hbWVfbGVuIFxcdTAwMjZcXHUwMDI2IGRlLVxcdTAwM2Vpbm9kZSkge1xcbi1cXHRcXHRcXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKVxcbi1cXHRcXHRcXHRcXHRoLmhhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTtcXG4tXFx0XFx0XFx0ZWxzZSB7XFxuK1xcdFxcdFxcdGlmICghKGV4dDRfZGlyZGF0YV9nZXQoZGUsIGRpciwgZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgICAgIE5VTEwsIFxcdTAwMjZoKSBcXHUwMDI2XFxuK1xcdFxcdFxcdFxcdFxcdFxcdEVYVDRfRElSRU5UX0NGSEFTSCkpIHtcXG4gXFx0XFx0XFx0XFx0aW50IGVyciA9IGV4dDRmc19kaXJoYXNoKGRpciwgZGUtXFx1MDAzZW5hbWUsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdCAgICAgZGUtXFx1MDAzZW5hbWVfbGVuLCBcXHUwMDI2aCk7XFxuIFxcdFxcdFxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbkBAIC0xNDg4LDcgKzE3NDAsNyBAQCBpbnQgZXh0NF9zZWFyY2hfZGlyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGNoYXIgKnNlYXJjaF9idWYsIGludCBidWZfc2l6ZSxcXG4gfVxcbiBcXG4gc3RhdGljIGludCBpc19keF9pbnRlcm5hbF9ub2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBleHQ0X2xibGtfdCBibG9jayxcXG4tXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGUpXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUpXFxuIHtcXG4gXFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci1cXHUwMDNlaV9zYjtcXG4gXFxuQEAgLTE2MTksNyArMTg3MSw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fZXh0NF9maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLFxcbiBcXHRcXHR9XFxuIFxcdFxcdGlmICghYnVmZmVyX3ZlcmlmaWVkKGJoKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHRcXHQgICAgIWlzX2R4X2ludGVybmFsX25vZGUoZGlyLCBibG9jayxcXG4tXFx0XFx0XFx0XFx0XFx0IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKiliaC1cXHUwMDNlYl9kYXRhKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRcXHRcXHRcXHQgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtXFx1MDAzZWJfZGF0YSkgXFx1MDAyNlxcdTAwMjZcXG4gXFx0XFx0ICAgICFleHQ0X2RpcmJsb2NrX2NzdW1fdmVyaWZ5KGRpciwgYmgpKSB7XFxuIFxcdFxcdFxcdEVYVDRfRVJST1JfSU5PREVfRVJSKGRpciwgRUZTQkFEQ1JDLFxcbiBcXHRcXHRcXHRcXHRcXHQgICAgIFxcXCJjaGVja3N1bW1pbmcgZGlyZWN0b3J5IFxcXCJcXG5AQCAtMTc1Myw3ICsyMDA1LDcgQEAgc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDRfZHhfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpcixcXG4gZXJyb3V0OlxcbiBcXHRkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHIFxcXCIlcyBub3QgZm91bmRcXFxcblxcXCIsIGZuYW1lLVxcdTAwM2V1c3JfZm5hbWUtXFx1MDAzZW5hbWUpKTtcXG4gc3VjY2VzczpcXG4tXFx0ZHhfcmVsZWFzZShmcmFtZXMpO1xcbitcXHRkeF9yZWxlYXNlKGRpciwgZnJhbWVzKTtcXG4gXFx0cmV0dXJuIGJoO1xcbiB9XFxuIFxcbkBAIC0xODUwLDcgKzIxMDIsNyBAQCBkeF9tb3ZlX2RpcmVudHMoc3RydWN0IGlub2RlICpkaXIsIGNoYXIgKmZyb20sIGNoYXIgKnRvLFxcbiBcXHR3aGlsZSAoY291bnQtLSkge1xcbiBcXHRcXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilcXG4gXFx0XFx0XFx0XFx0XFx0XFx0KGZyb20gKyAobWFwLVxcdTAwM2VvZmZzXFx1MDAzY1xcdTAwM2MyKSk7XFxuLVxcdFxcdHJlY19sZW4gPSBleHQ0X2Rpcl9yZWNfbGVuKGRlLVxcdTAwM2VuYW1lX2xlbiwgZGlyKTtcXG4rXFx0XFx0cmVjX2xlbiA9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgYmxvY2tzaXplLCBkaXIpO1xcbiBcXG4gXFx0XFx0bWVtY3B5ICh0bywgZGUsIHJlY19sZW4pO1xcbiBcXHRcXHQoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIHRvKS1cXHUwMDNlcmVjX2xlbiA9XFxuQEAgLTE4ODMsNyArMjEzNSw3IEBAIHN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZHhfcGFja19kaXJlbnRzKHN0cnVjdCBpbm9kZSAqZGlyLCBjaGFyICpiYXNlLFxcbiBcXHR3aGlsZSAoKGNoYXIqKWRlIFxcdTAwM2MgYmFzZSArIGJsb2Nrc2l6ZSkge1xcbiBcXHRcXHRuZXh0ID0gZXh0NF9uZXh0X2VudHJ5KGRlLCBibG9ja3NpemUpO1xcbiBcXHRcXHRpZiAoZGUtXFx1MDAzZWlub2RlIFxcdTAwMjZcXHUwMDI2IGRlLVxcdTAwM2VuYW1lX2xlbikge1xcbi1cXHRcXHRcXHRyZWNfbGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS1cXHUwMDNlbmFtZV9sZW4sIGRpcik7XFxuK1xcdFxcdFxcdHJlY19sZW4gPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIGJsb2Nrc2l6ZSwgZGlyKTtcXG4gXFx0XFx0XFx0aWYgKGRlIFxcdTAwM2UgdG8pXFxuIFxcdFxcdFxcdFxcdG1lbW1vdmUodG8sIGRlLCByZWNfbGVuKTtcXG4gXFx0XFx0XFx0dG8tXFx1MDAzZXJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhyZWNfbGVuLCBibG9ja3NpemUpO1xcbkBAIC0yMDM1LDEwICsyMjg3LDE1IEBAIHN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG9fc3BsaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuIGludCBleHQ0X2ZpbmRfZGVzdF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcXG4gXFx0XFx0ICAgICAgdm9pZCAqYnVmLCBpbnQgYnVmX3NpemUsXFxuIFxcdFxcdCAgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4tXFx0XFx0ICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKipkZXN0X2RlKVxcbitcXHRcXHQgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmRlc3RfZGUsXFxuK1xcdFxcdCAgICAgIGludCBkbGVuKVxcbiB7XFxuIFxcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTtcXG4tXFx0dW5zaWduZWQgc2hvcnQgcmVjbGVuID0gZXh0NF9kaXJfcmVjX2xlbihmbmFtZV9sZW4oZm5hbWUpLCBkaXIpO1xcbitcXHQvKiBXaGVuIGRpcmRhdGEgZXh0ZW5zaW9ucyBhcmUgcHJlc2VudCwgYSBOVUwgZ2FwIGJ5dGUgc2l0cyBiZXR3ZWVuXFxuK1xcdCAqIHRoZSBmaWxlbmFtZSBhbmQgdGhlIGZpcnN0IGV4dGVuc2lvbjsgYWNjb3VudCBmb3IgaXQgc28gdGhlIGZvdW5kXFxuK1xcdCAqIHNsb3QgaXMgYWx3YXlzIGxhcmdlIGVub3VnaCBmb3IgZXh0NF9kaXJkYXRhX3NldCgpIHRvIHdyaXRlIGludG8uICovXFxuK1xcdHVuc2lnbmVkIHNob3J0IHJlY2xlbiA9IGV4dDRfZGlyZW50X3JlY19sZW4oZm5hbWVfbGVuKGZuYW1lKSArIGRsZW4gK1xcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgKGRsZW4gPyAxIDogMCksIGRpcik7XFxuIFxcdGludCBubGVuLCBybGVuO1xcbiBcXHR1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDtcXG4gXFx0Y2hhciAqdG9wO1xcbkBAIC0yMDUxLDcgKzIzMDgsNyBAQCBpbnQgZXh0NF9maW5kX2Rlc3RfZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXFxuIFxcdFxcdFxcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xcbiBcXHRcXHRpZiAoZXh0NF9tYXRjaChkaXIsIGZuYW1lLCBkZSkpXFxuIFxcdFxcdFxcdHJldHVybiAtRUVYSVNUO1xcbi1cXHRcXHRubGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS1cXHUwMDNlbmFtZV9sZW4sIGRpcik7XFxuK1xcdFxcdG5sZW4gPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIGJ1Zl9zaXplLCBkaXIpO1xcbiBcXHRcXHRybGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cXHUwMDNlcmVjX2xlbiwgYnVmX3NpemUpO1xcbiBcXHRcXHRpZiAoKGRlLVxcdTAwM2Vpbm9kZSA/IHJsZW4gLSBubGVuIDogcmxlbikgXFx1MDAzZT0gcmVjbGVuKVxcbiBcXHRcXHRcXHRicmVhaztcXG5AQCAtMjA2NSwxNiArMjMyMiwxMyBAQCBpbnQgZXh0NF9maW5kX2Rlc3RfZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi12b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpcixcXG4tXFx0XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSxcXG4tXFx0XFx0XFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxcbi1cXHRcXHRcXHRpbnQgYnVmX3NpemUsXFxuLVxcdFxcdFxcdHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSlcXG4rdm9pZCBleHQ0X2luc2VydF9kZW50cnlfZGF0YShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcXG4rXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIGludCBidWZfc2l6ZSxcXG4rXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHZvaWQgKmRhdGEpXFxuIHtcXG4tXFxuIFxcdGludCBubGVuLCBybGVuO1xcbiBcXG4tXFx0bmxlbiA9IGV4dDRfZGlyX3JlY19sZW4oZGUtXFx1MDAzZW5hbWVfbGVuLCBkaXIpO1xcbitcXHRubGVuID0gZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBidWZfc2l6ZSwgZGlyKTtcXG4gXFx0cmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXFx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcXG4gXFx0aWYgKGRlLVxcdTAwM2Vpbm9kZSkge1xcbiBcXHRcXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUxID1cXG5AQCAtMjA4OCwxMyArMjM0Miw3IEBAIHZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLFxcbiBcXHRleHQ0X3NldF9kZV90eXBlKGlub2RlLVxcdTAwM2VpX3NiLCBkZSwgaW5vZGUtXFx1MDAzZWlfbW9kZSk7XFxuIFxcdGRlLVxcdTAwM2VuYW1lX2xlbiA9IGZuYW1lX2xlbihmbmFtZSk7XFxuIFxcdG1lbWNweShkZS1cXHUwMDNlbmFtZSwgZm5hbWVfbmFtZShmbmFtZSksIGZuYW1lX2xlbihmbmFtZSkpO1xcbi1cXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7XFxuLVxcdFxcdHN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvID0gXFx1MDAyNmZuYW1lLVxcdTAwM2VoaW5mbztcXG4tXFxuLVxcdFxcdEVYVDRfRElSRU5UX0hBU0hFUyhkZSktXFx1MDAzZWhhc2ggPSBjcHVfdG9fbGUzMihoaW5mby1cXHUwMDNlaGFzaCk7XFxuLVxcdFxcdEVYVDRfRElSRU5UX0hBU0hFUyhkZSktXFx1MDAzZW1pbm9yX2hhc2ggPVxcbi1cXHRcXHRcXHRcXHRcXHRcXHRjcHVfdG9fbGUzMihoaW5mby1cXHUwMDNlbWlub3JfaGFzaCk7XFxuLVxcdH1cXG4rXFx0ZXh0NF9kaXJkYXRhX3NldChkZSwgZGlyLCBkYXRhLCBmbmFtZSk7XFxuIH1cXG4gXFxuIC8qXFxuQEAgLTIxMTIsMTQgKzIzNjAsMjggQEAgc3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuIHtcXG4gXFx0dW5zaWduZWQgaW50XFx0YmxvY2tzaXplID0gZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4gXFx0aW50XFx0XFx0Y3N1bV9zaXplID0gMDtcXG4tXFx0aW50XFx0XFx0ZXJyLCBlcnIyO1xcbitcXHRpbnRcXHRcXHRlcnIsIGVycjIsIGRsZW4gPSAwO1xcbitcXHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkZmlkO1xcbiBcXG4gXFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfbWV0YWRhdGFfY3N1bShpbm9kZS1cXHUwMDNlaV9zYikpXFxuIFxcdFxcdGNzdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCk7XFxuIFxcbitcXHQvKiBkZmlkIGlzIHJlc29sdmVkIG9uY2UgYnkgZXh0NF9hZGRfZW50cnkoKSBhbmQgc3RvcmVkIGluIGZuYW1lIHNvXFxuK1xcdCAqIHRoYXQgYWxsIGFkZF9kaXJlbnRfdG9fYnVmKCkgY2FsbHMgd2l0aGluIHRoZSBzYW1lIGFkZCBvcGVyYXRpb25cXG4rXFx0ICogdXNlIGEgY29uc2lzdGVudCB2YWx1ZSB3aXRob3V0IHRvdWNoaW5nIHRoZSBzaGFyZWQgaV9kaXJkYXRhIGZpZWxkLiAqL1xcbitcXHRkZmlkID0gZm5hbWUtXFx1MDAzZWRmaWQ7XFxuIFxcdGlmICghZGUpIHtcXG4rXFx0XFx0aWYgKGRmaWQpXFxuK1xcdFxcdFxcdGRsZW4gPSBkZmlkLVxcdTAwM2VkZl9oZWFkZXIuZGRoX2xlbmd0aDtcXG4rXFx0XFx0LyogZXh0NF9kaXJlbnRfcmVjX2xlbigpIGRvZXMgbm90IGFkZCBDRkhBU0ggc2l6ZSB3aGVuIGRpcmRhdGEgaXNcXG4rXFx0XFx0ICogZW5hYmxlZCAoaXQgYXNzdW1lcyB0aGUgY2FsbGVyIGluY2x1ZGVkIGl0IGluIG5hbWVfbGVuKS4gIEFkZFxcbitcXHRcXHQgKiBpdCBoZXJlIHNvIGV4dDRfZmluZF9kZXN0X2RlKCkgYWxsb2NhdGVzIGEgc2xvdCBsYXJnZSBlbm91Z2hcXG4rXFx0XFx0ICogZm9yIGV4dDRfZGlyZGF0YV9zZXQoKSB0byB3cml0ZSB0aGUgaGFzaCBleHRlbnNpb24uICovXFxuK1xcdFxcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShkaXItXFx1MDAzZWlfc2IpKVxcbitcXHRcXHRcXHRkbGVuICs9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCk7XFxuIFxcdFxcdGVyciA9IGV4dDRfZmluZF9kZXN0X2RlKGRpciwgYmgsIGJoLVxcdTAwM2ViX2RhdGEsXFxuLVxcdFxcdFxcdFxcdFxcdGJsb2Nrc2l6ZSAtIGNzdW1fc2l6ZSwgZm5hbWUsIFxcdTAwMjZkZSk7XFxuK1xcdFxcdFxcdFxcdFxcdGJsb2Nrc2l6ZSAtIGNzdW1fc2l6ZSwgZm5hbWUsIFxcdTAwMjZkZSwgZGxlbik7XFxuIFxcdFxcdGlmIChlcnIpXFxuIFxcdFxcdFxcdHJldHVybiBlcnI7XFxuIFxcdH1cXG5AQCAtMjEzMiw3ICsyMzk0LDcgQEAgc3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuIFxcdH1cXG4gXFxuIFxcdC8qIEJ5IG5vdyB0aGUgYnVmZmVyIGlzIG1hcmtlZCBmb3Igam91cm5hbGluZyAqL1xcbi1cXHRleHQ0X2luc2VydF9kZW50cnkoZGlyLCBpbm9kZSwgZGUsIGJsb2Nrc2l6ZSwgZm5hbWUpO1xcbitcXHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgYmxvY2tzaXplLCBmbmFtZSwgZGZpZCk7XFxuIFxcbiBcXHQvKlxcbiBcXHQgKiBYWFggc2hvdWxkbid0IHVwZGF0ZSBhbnkgdGltZXMgdW50aWwgc3VjY2Vzc2Z1bFxcbkBAIC0yMTU2LDQ0ICsyNDE4LDM4IEBAIHN0YXRpYyBpbnQgYWRkX2RpcmVudF90b19idWYoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbiBcXHRyZXR1cm4gZXJyID8gZXJyIDogZXJyMjtcXG4gfVxcbiBcXG4tc3RhdGljIGJvb2wgZXh0NF9jaGVja19keF9yb290KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZHhfcm9vdCAqcm9vdClcXG4rc3RhdGljIGJvb2wgZXh0NF9jaGVja19keF9yb290KHN0cnVjdCBpbm9kZSAqZGlyLFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRvdF9kZSxcXG4rXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkb3Rkb3RfZGUsXFxuK1xcdFxcdFxcdCAgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmVudHJ5KVxcbiB7XFxuLVxcdHN0cnVjdCBmYWtlX2RpcmVudCAqZmRlO1xcbiBcXHRjb25zdCBjaGFyICplcnJvcl9tc2c7XFxuLVxcdHVuc2lnbmVkIGludCBybGVuO1xcbiBcXHR1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZTtcXG4tXFx0Y2hhciAqYmxvY2tlbmQgPSAoY2hhciAqKXJvb3QgKyBkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplO1xcbitcXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSBOVUxMO1xcbiBcXG4tXFx0ZmRlID0gXFx1MDAyNnJvb3QtXFx1MDAzZWRvdDtcXG4tXFx0aWYgKHVubGlrZWx5KGZkZS1cXHUwMDNlbmFtZV9sZW4gIT0gMSkpIHtcXG4rXFx0aWYgKHVubGlrZWx5KGRvdF9kZS1cXHUwMDNlbmFtZV9sZW4gIT0gMSkpIHtcXG4gXFx0XFx0ZXJyb3JfbXNnID0gXFxcImludmFsaWQgbmFtZV9sZW4gZm9yICcuJ1xcXCI7XFxuIFxcdFxcdGdvdG8gY29ycnVwdGVkO1xcbiBcXHR9XFxuLVxcdGlmICh1bmxpa2VseShzdHJuY21wKHJvb3QtXFx1MDAzZWRvdF9uYW1lLCBcXFwiLlxcXCIsIGZkZS1cXHUwMDNlbmFtZV9sZW4pKSkge1xcbitcXHRpZiAodW5saWtlbHkoc3RybmNtcChkb3RfZGUtXFx1MDAzZW5hbWUsIFxcXCIuXFxcIiwgZG90X2RlLVxcdTAwM2VuYW1lX2xlbikpKSB7XFxuIFxcdFxcdGVycm9yX21zZyA9IFxcXCJpbnZhbGlkIG5hbWUgZm9yICcuJ1xcXCI7XFxuIFxcdFxcdGdvdG8gY29ycnVwdGVkO1xcbiBcXHR9XFxuLVxcdHJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGZkZS1cXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcXG4tXFx0aWYgKHVubGlrZWx5KChjaGFyICopZmRlICsgcmxlbiBcXHUwMDNlPSBibG9ja2VuZCkpIHtcXG4tXFx0XFx0ZXJyb3JfbXNnID0gXFxcImludmFsaWQgcmVjX2xlbiBmb3IgJy4nXFxcIjtcXG4tXFx0XFx0Z290byBjb3JydXB0ZWQ7XFxuLVxcdH1cXG4gXFxuLVxcdGZkZSA9IFxcdTAwMjZyb290LVxcdTAwM2Vkb3Rkb3Q7XFxuLVxcdGlmICh1bmxpa2VseShmZGUtXFx1MDAzZW5hbWVfbGVuICE9IDIpKSB7XFxuK1xcdGlmICh1bmxpa2VseShkb3Rkb3RfZGUtXFx1MDAzZW5hbWVfbGVuICE9IDIpKSB7XFxuIFxcdFxcdGVycm9yX21zZyA9IFxcXCJpbnZhbGlkIG5hbWVfbGVuIGZvciAnLi4nXFxcIjtcXG4gXFx0XFx0Z290byBjb3JydXB0ZWQ7XFxuIFxcdH1cXG4tXFx0aWYgKHVubGlrZWx5KHN0cm5jbXAocm9vdC1cXHUwMDNlZG90ZG90X25hbWUsIFxcXCIuLlxcXCIsIGZkZS1cXHUwMDNlbmFtZV9sZW4pKSkge1xcbitcXHRpZiAodW5saWtlbHkoc3RybmNtcChkb3Rkb3RfZGUtXFx1MDAzZW5hbWUsIFxcXCIuLlxcXCIsIGRvdGRvdF9kZS1cXHUwMDNlbmFtZV9sZW4pKSkge1xcbiBcXHRcXHRlcnJvcl9tc2cgPSBcXFwiaW52YWxpZCBuYW1lIGZvciAnLi4nXFxcIjtcXG4gXFx0XFx0Z290byBjb3JydXB0ZWQ7XFxuIFxcdH1cXG4tXFx0cmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZmRlLVxcdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpO1xcbi1cXHRpZiAodW5saWtlbHkoKGNoYXIgKilmZGUgKyBybGVuIFxcdTAwM2U9IGJsb2NrZW5kKSkge1xcbitcXHRkZSA9IGV4dDRfbmV4dF9lbnRyeShkb3Rkb3RfZGUsIGJsb2Nrc2l6ZSk7XFxuK1xcdGlmICgoY2hhciAqKWRlIFxcdTAwM2U9ICgoKGNoYXIgKilkb3RfZGUpICsgYmxvY2tzaXplKSkge1xcbiBcXHRcXHRlcnJvcl9tc2cgPSBcXFwiaW52YWxpZCByZWNfbGVuIGZvciAnLi4nXFxcIjtcXG4gXFx0XFx0Z290byBjb3JydXB0ZWQ7XFxuIFxcdH1cXG4tXFxuK1xcdCplbnRyeSA9IGRlO1xcbiBcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuIGNvcnJ1cHRlZDpcXG5AQCAtMjIxMSwxNiArMjQ2NywxNSBAQCBzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbiBcXHRcXHRcXHQgICAgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaClcXG4ge1xcbiBcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjtcXG4tXFx0c3RydWN0IGR4X3Jvb3RcXHQqcm9vdDtcXG4gXFx0c3RydWN0IGR4X2ZyYW1lXFx0ZnJhbWVzW0VYVDRfSFRSRUVfTEVWRUxdLCAqZnJhbWU7XFxuIFxcdHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcztcXG4tXFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzJcXHQqZGUsICpkZTI7XFxuK1xcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yXFx0KmRlLCAqZGUyLCAqZG90X2RlLCAqZG90ZG90X2RlO1xcbiBcXHRjaGFyXFx0XFx0KmRhdGEyLCAqdG9wO1xcbiBcXHR1bnNpZ25lZFxcdGxlbjtcXG4gXFx0aW50XFx0XFx0cmV0dmFsO1xcbiBcXHR1bnNpZ25lZFxcdGJsb2Nrc2l6ZTtcXG4gXFx0ZXh0NF9sYmxrX3QgIGJsb2NrO1xcbi1cXHRzdHJ1Y3QgZmFrZV9kaXJlbnQgKmZkZTtcXG4rXFx0c3RydWN0IGR4X3Jvb3RfaW5mbyAqZHhfaW5mbztcXG4gXFx0aW50IGNzdW1fc2l6ZSA9IDA7XFxuIFxcbiBcXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGlub2RlLVxcdTAwM2VpX3NiKSlcXG5AQCAtMjIzNywxNyArMjQ5MiwyMCBAQCBzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbiBcXHRcXHRyZXR1cm4gcmV0dmFsO1xcbiBcXHR9XFxuIFxcbi1cXHRyb290ID0gKHN0cnVjdCBkeF9yb290ICopIGJoLVxcdTAwM2ViX2RhdGE7XFxuLVxcdGlmICghZXh0NF9jaGVja19keF9yb290KGRpciwgcm9vdCkpIHtcXG4rXFx0ZG90X2RlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtXFx1MDAzZWJfZGF0YTtcXG4rXFx0aWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZG90X2RlLVxcdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpIFxcdTAwM2MgRVhUNF9CQVNFX0RJUl9MRU4gfHxcXG4rXFx0ICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZG90X2RlLVxcdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpIFxcdTAwM2U9IGJsb2Nrc2l6ZSAtIEVYVDRfQkFTRV9ESVJfTEVOKSB7XFxuK1xcdFxcdGJyZWxzZShiaCk7XFxuK1xcdFxcdHJldHVybiAtRUZTQ09SUlVQVEVEO1xcbitcXHR9XFxuK1xcdGRvdGRvdF9kZSA9IGV4dDRfbmV4dF9lbnRyeShkb3RfZGUsIGJsb2Nrc2l6ZSk7XFxuK1xcdGlmICghZXh0NF9jaGVja19keF9yb290KGRpciwgZG90X2RlLCBkb3Rkb3RfZGUsIFxcdTAwMjZkZSkpIHtcXG4gXFx0XFx0YnJlbHNlKGJoKTtcXG4gXFx0XFx0cmV0dXJuIC1FRlNDT1JSVVBURUQ7XFxuIFxcdH1cXG4gXFxuIFxcdC8qIFRoZSAwdGggYmxvY2sgYmVjb21lcyB0aGUgcm9vdCwgbW92ZSB0aGUgZGlyZW50cyBvdXQgKi9cXG4tXFx0ZmRlID0gXFx1MDAyNnJvb3QtXFx1MDAzZWRvdGRvdDtcXG4tXFx0ZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoKGNoYXIgKilmZGUgK1xcbi1cXHRcXHRleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGZkZS1cXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKSk7XFxuLVxcdGxlbiA9ICgoY2hhciAqKSByb290KSArIChibG9ja3NpemUgLSBjc3VtX3NpemUpIC0gKGNoYXIgKikgZGU7XFxuK1xcdGxlbiA9ICgoY2hhciAqKWRvdF9kZSkgKyAoYmxvY2tzaXplIC0gY3N1bV9zaXplKSAtIChjaGFyICopZGU7XFxuIFxcbiBcXHQvKiBBbGxvY2F0ZSBuZXcgYmxvY2sgZm9yIHRoZSAwdGggYmxvY2sncyBkaXJlbnRzICovXFxuIFxcdGJoMiA9IGV4dDRfYXBwZW5kKGhhbmRsZSwgZGlyLCBcXHUwMDI2YmxvY2spO1xcbkBAIC0yMjc4LDI0ICsyNTM2LDMyIEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuIFxcdFxcdGV4dDRfaW5pdGlhbGl6ZV9kaXJlbnRfdGFpbChiaDIsIGJsb2Nrc2l6ZSk7XFxuIFxcbiBcXHQvKiBJbml0aWFsaXplIHRoZSByb290OyB0aGUgZG90IGRpcmVudHMgYWxyZWFkeSBleGlzdCAqL1xcbi1cXHRkZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSAoXFx1MDAyNnJvb3QtXFx1MDAzZWRvdGRvdCk7XFxuLVxcdGRlLVxcdTAwM2VyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soXFxuLVxcdFxcdFxcdGJsb2Nrc2l6ZSAtIGV4dDRfZGlyX3JlY19sZW4oMiwgTlVMTCksIGJsb2Nrc2l6ZSk7XFxuLVxcdG1lbXNldCAoXFx1MDAyNnJvb3QtXFx1MDAzZWluZm8sIDAsIHNpemVvZihyb290LVxcdTAwM2VpbmZvKSk7XFxuLVxcdHJvb3QtXFx1MDAzZWluZm8uaW5mb19sZW5ndGggPSBzaXplb2Yocm9vdC1cXHUwMDNlaW5mbyk7XFxuK1xcdGRvdGRvdF9kZS1cXHUwMDNlcmVjX2xlbiA9XFxuK1xcdFxcdGV4dDRfcmVjX2xlbl90b19kaXNrKGJsb2Nrc2l6ZSAtIGxlMTZfdG9fY3B1KGRvdF9kZS1cXHUwMDNlcmVjX2xlbiksXFxuK1xcdFxcdFxcdFxcdCAgICAgYmxvY2tzaXplKTtcXG4rXFxuK1xcdC8qIGluaXRpYWxpemUgaGFzaGluZyBpbmZvICovXFxuK1xcdGR4X2luZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIGRvdF9kZSk7XFxuK1xcdGlmIChJU19FUlIoZHhfaW5mbykpIHtcXG4rXFx0XFx0YnJlbHNlKGJoMik7XFxuK1xcdFxcdGJyZWxzZShiaCk7XFxuK1xcdFxcdHJldHVybiBQVFJfRVJSKGR4X2luZm8pO1xcbitcXHR9XFxuK1xcdG1lbXNldChkeF9pbmZvLCAwLCBzaXplb2YoKmR4X2luZm8pKTtcXG4rXFx0ZHhfaW5mby1cXHUwMDNlaW5mb19sZW5ndGggPSBzaXplb2YoKmR4X2luZm8pO1xcbiBcXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKVxcbi1cXHRcXHRyb290LVxcdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiA9IERYX0hBU0hfU0lQSEFTSDtcXG4rXFx0XFx0ZHhfaW5mby1cXHUwMDNlaGFzaF92ZXJzaW9uID0gRFhfSEFTSF9TSVBIQVNIO1xcbiBcXHRlbHNlXFxuLVxcdFxcdHJvb3QtXFx1MDAzZWluZm8uaGFzaF92ZXJzaW9uID1cXG4rXFx0XFx0ZHhfaW5mby1cXHUwMDNlaGFzaF92ZXJzaW9uID1cXG4gXFx0XFx0XFx0XFx0RVhUNF9TQihkaXItXFx1MDAzZWlfc2IpLVxcdTAwM2VzX2RlZl9oYXNoX3ZlcnNpb247XFxuIFxcbi1cXHRlbnRyaWVzID0gcm9vdC1cXHUwMDNlZW50cmllcztcXG4rXFx0ZW50cmllcyA9ICh2b2lkICopZHhfaW5mbyArIGR4X2luZm8tXFx1MDAzZWluZm9fbGVuZ3RoO1xcbiBcXHRkeF9zZXRfYmxvY2soZW50cmllcywgMSk7XFxuIFxcdGR4X3NldF9jb3VudChlbnRyaWVzLCAxKTtcXG4tXFx0ZHhfc2V0X2xpbWl0KGVudHJpZXMsIGR4X3Jvb3RfbGltaXQoZGlyLCBzaXplb2Yocm9vdC1cXHUwMDNlaW5mbykpKTtcXG4rXFx0ZHhfc2V0X2xpbWl0KGVudHJpZXMsIGR4X3Jvb3RfbGltaXQoZGlyLCBkb3RfZGUpKTtcXG4gXFxuIFxcdC8qIEluaXRpYWxpemUgYXMgZm9yIGR4X3Byb2JlICovXFxuLVxcdGZuYW1lLVxcdTAwM2VoaW5mby5oYXNoX3ZlcnNpb24gPSByb290LVxcdTAwM2VpbmZvLmhhc2hfdmVyc2lvbjtcXG4rXFx0Zm5hbWUtXFx1MDAzZWhpbmZvLmhhc2hfdmVyc2lvbiA9IGR4X2luZm8tXFx1MDAzZWhhc2hfdmVyc2lvbjtcXG4gXFx0aWYgKGZuYW1lLVxcdTAwM2VoaW5mby5oYXNoX3ZlcnNpb24gXFx1MDAzYz0gRFhfSEFTSF9URUEpXFxuIFxcdFxcdGZuYW1lLVxcdTAwM2VoaW5mby5oYXNoX3ZlcnNpb24gKz0gRVhUNF9TQihkaXItXFx1MDAzZWlfc2IpLVxcdTAwM2VzX2hhc2hfdW5zaWduZWQ7XFxuIFxcdGZuYW1lLVxcdTAwM2VoaW5mby5zZWVkID0gRVhUNF9TQihkaXItXFx1MDAzZWlfc2IpLVxcdTAwM2VzX2hhc2hfc2VlZDtcXG5AQCAtMjMzOCw3ICsyNjA0LDcgQEAgc3RhdGljIGludCBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4gXFx0ICovXFxuIFxcdGlmIChyZXR2YWwpXFxuIFxcdFxcdGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7XFxuLVxcdGR4X3JlbGVhc2UoZnJhbWVzKTtcXG4rXFx0ZHhfcmVsZWFzZShkaXIsIGZyYW1lcyk7XFxuIFxcdGJyZWxzZShiaDIpO1xcbiBcXHRyZXR1cm4gcmV0dmFsO1xcbiB9XFxuQEAgLTIzNTUsNyArMjYyMSw4IEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuICAqL1xcbiBzdGF0aWMgaW50IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuIFxcdFxcdFxcdCAgY29uc3Qgc3RydWN0IHFzdHIgKmRfbmFtZSxcXG4tXFx0XFx0XFx0ICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbitcXHRcXHRcXHQgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuK1xcdFxcdFxcdCAgc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICplZHApXFxuIHtcXG4gXFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7XFxuIFxcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTtcXG5AQCAtMjM4MCw2ICsyNjQ3LDEzIEBAIHN0YXRpYyBpbnQgX19leHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4gXFx0aWYgKHJldHZhbClcXG4gXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFxuK1xcdC8qIFJlc29sdmUgdGhlIExVRklEIHBheWxvYWQgb25jZSBoZXJlIGFuZCBzdG9yZSBpdCBpbiBmbmFtZSBzbyBldmVyeVxcbitcXHQgKiBhZGRfZGlyZW50X3RvX2J1ZigpIGNhbGwgaW4gdGhpcyBhZGQgb3BlcmF0aW9uIHVzZXMgdGhlIHNhbWUgdmFsdWVcXG4rXFx0ICogd2l0aG91dCB0b3VjaGluZyB0aGUgc2hhcmVkIEVYVDRfSShpbm9kZSktXFx1MDAzZWlfZGlyZGF0YSBmaWVsZC4gKi9cXG4rXFx0Zm5hbWUuZGZpZCA9IGV4dDRfZGVudHJ5X2dldF9maWQoc2IsIGVkcCk7XFxuK1xcdGlmIChmbmFtZS5kZmlkKVxcbitcXHRcXHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShzYiwgRVhUNF9GQ19SRUFTT05fRElSREFUQSwgaGFuZGxlKTtcXG4rXFxuIFxcdGlmIChleHQ0X2hhc19pbmxpbmVfZGF0YShkaXIpKSB7XFxuIFxcdFxcdHJldHZhbCA9IGV4dDRfdHJ5X2FkZF9pbmxpbmVfZW50cnkoaGFuZGxlLCBcXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xcbiBcXHRcXHRpZiAocmV0dmFsIFxcdTAwM2MgMClcXG5AQCAtMjQ2NCw3ICsyNzM4LDggQEAgc3RhdGljIGludCBleHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksXFxuIFxcbiBcXHRpZiAoZnNjcnlwdF9pc19ub2tleV9uYW1lKGRlbnRyeSkpXFxuIFxcdFxcdHJldHVybiAtRU5PS0VZO1xcbi1cXHRyZXR1cm4gX19leHQ0X2FkZF9lbnRyeShoYW5kbGUsIGRpciwgXFx1MDAyNmRlbnRyeS1cXHUwMDNlZF9uYW1lLCBpbm9kZSk7XFxuK1xcdHJldHVybiBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGlyLCBcXHUwMDI2ZGVudHJ5LVxcdTAwM2VkX25hbWUsIGlub2RlLFxcbitcXHRcXHRcXHRcXHRkZW50cnktXFx1MDAzZWRfZnNkYXRhKTtcXG4gfVxcbiBcXG4gLypcXG5AQCAtMjYwNSw3ICsyODgwLDcgQEAgc3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuIFxcdFxcdFxcdGlmIChyZXN0YXJ0IHx8IGVycilcXG4gXFx0XFx0XFx0XFx0Z290byBqb3VybmFsX2Vycm9yO1xcbiBcXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRzdHJ1Y3QgZHhfcm9vdCAqZHhyb290O1xcbitcXHRcXHRcXHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICppbmZvO1xcbiBcXHRcXHRcXHRtZW1jcHkoKGNoYXIgKikgZW50cmllczIsIChjaGFyICopIGVudHJpZXMsXFxuIFxcdFxcdFxcdCAgICAgICBpY291bnQgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7XFxuIFxcdFxcdFxcdGR4X3NldF9saW1pdChlbnRyaWVzMiwgZHhfbm9kZV9saW1pdChkaXIpKTtcXG5AQCAtMjYxMywxMSArMjg4OCwxNyBAQCBzdGF0aWMgaW50IGV4dDRfZHhfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4gXFx0XFx0XFx0LyogU2V0IHVwIHJvb3QgKi9cXG4gXFx0XFx0XFx0ZHhfc2V0X2NvdW50KGVudHJpZXMsIDEpO1xcbiBcXHRcXHRcXHRkeF9zZXRfYmxvY2soZW50cmllcyArIDAsIG5ld2Jsb2NrKTtcXG4tXFx0XFx0XFx0ZHhyb290ID0gKHN0cnVjdCBkeF9yb290ICopZnJhbWVzWzBdLmJoLVxcdTAwM2ViX2RhdGE7XFxuLVxcdFxcdFxcdGR4cm9vdC1cXHUwMDNlaW5mby5pbmRpcmVjdF9sZXZlbHMgKz0gMTtcXG4rXFx0XFx0XFx0aW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopXFxuK1xcdFxcdFxcdFxcdFxcdCAgICAgIGZyYW1lc1swXS5iaC1cXHUwMDNlYl9kYXRhKTtcXG4rXFx0XFx0XFx0aWYgKElTX0VSUihpbmZvKSkge1xcbitcXHRcXHRcXHRcXHRlcnIgPSBQVFJfRVJSKGluZm8pO1xcbitcXHRcXHRcXHRcXHRicmVsc2UoYmgyKTtcXG4rXFx0XFx0XFx0XFx0Z290byBqb3VybmFsX2Vycm9yO1xcbitcXHRcXHRcXHR9XFxuK1xcdFxcdFxcdGluZm8tXFx1MDAzZWluZGlyZWN0X2xldmVscyArPSAxO1xcbiBcXHRcXHRcXHRkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHXFxuIFxcdFxcdFxcdFxcdCAgICAgICBcXFwiQ3JlYXRpbmcgJWQgbGV2ZWwgaW5kZXguLi5cXFxcblxcXCIsXFxuLVxcdFxcdFxcdFxcdCAgICAgICBkeHJvb3QtXFx1MDAzZWluZm8uaW5kaXJlY3RfbGV2ZWxzKSk7XFxuK1xcdFxcdFxcdFxcdCAgICAgICBpbmZvLVxcdTAwM2VpbmRpcmVjdF9sZXZlbHMpKTtcXG4gXFx0XFx0XFx0ZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfZHhfbm9kZShoYW5kbGUsIGRpciwgZnJhbWUtXFx1MDAzZWJoKTtcXG4gXFx0XFx0XFx0aWYgKGVycikge1xcbiBcXHRcXHRcXHRcXHRicmVsc2UoYmgyKTtcXG5AQCAtMjY0MSw3ICsyOTIyLDcgQEAgc3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuIFxcdGV4dDRfc3RkX2Vycm9yKGRpci1cXHUwMDNlaV9zYiwgZXJyKTsgLyogdGhpcyBpcyBhIG5vLW9wIGlmIGVyciA9PSAwICovXFxuIGNsZWFudXA6XFxuIFxcdGJyZWxzZShiaCk7XFxuLVxcdGR4X3JlbGVhc2UoZnJhbWVzKTtcXG4rXFx0ZHhfcmVsZWFzZShkaXIsIGZyYW1lcyk7XFxuIFxcdC8qIEByZXN0YXJ0IGlzIHRydWUgbWVhbnMgaHRyZWUtcGF0aCBoYXMgYmVlbiBjaGFuZ2VkLCB3ZSBuZWVkIHRvXFxuIFxcdCAqIHJlcGVhdCBkeF9wcm9iZSgpIHRvIGZpbmQgb3V0IHZhbGlkIGh0cmVlLXBhdGhcXG4gXFx0ICovXFxuQEAgLTI5MzMsNyArMzIxNCw3IEBAIGludCBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gXFxuIFxcdGRlLVxcdTAwM2Vpbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLVxcdTAwM2VpX2lubyk7XFxuIFxcdGRlLVxcdTAwM2VuYW1lX2xlbiA9IDE7XFxuLVxcdGRlLVxcdTAwM2VyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soZXh0NF9kaXJfcmVjX2xlbihkZS1cXHUwMDNlbmFtZV9sZW4sIE5VTEwpLFxcbitcXHRkZS1cXHUwMDNlcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKGV4dDRfZGlyZW50X3JlY19sZW4oZGUtXFx1MDAzZW5hbWVfbGVuLCBOVUxMKSxcXG4gXFx0XFx0XFx0XFx0XFx0ICAgYmxvY2tzaXplKTtcXG4gXFx0bWVtY3B5KGRlLVxcdTAwM2VuYW1lLCBcXFwiLlxcXCIsIDIpO1xcbiBcXHRleHQ0X3NldF9kZV90eXBlKGlub2RlLVxcdTAwM2VpX3NiLCBkZSwgU19JRkRJUik7XFxuQEAgLTI5NDUsNyArMzIyNiw3IEBAIGludCBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gXFx0ZXh0NF9zZXRfZGVfdHlwZShpbm9kZS1cXHUwMDNlaV9zYiwgZGUsIFNfSUZESVIpO1xcbiBcXHRpZiAoaW5saW5lX2J1Zikge1xcbiBcXHRcXHRkZS1cXHUwMDNlcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKFxcbi1cXHRcXHRcXHRcXHRcXHRleHQ0X2Rpcl9yZWNfbGVuKGRlLVxcdTAwM2VuYW1lX2xlbiwgTlVMTCksXFxuK1xcdFxcdFxcdFxcdFxcdGV4dDRfZGlyZW50X3JlY19sZW4oZGUtXFx1MDAzZW5hbWVfbGVuLCBOVUxMKSxcXG4gXFx0XFx0XFx0XFx0XFx0YmxvY2tzaXplKTtcXG4gXFx0XFx0ZGUgPSBleHQ0X25leHRfZW50cnkoZGUsIGJsb2Nrc2l6ZSk7XFxuIFxcdFxcdGhlYWRlcl9zaXplID0gKGNoYXIgKilkZSAtIGJoLVxcdTAwM2ViX2RhdGE7XFxuQEAgLTI5NTQsNyArMzIzNSw3IEBAIGludCBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcXG4gXFx0XFx0XFx0YmxvY2tzaXplIC0gY3N1bV9zaXplKTtcXG4gXFx0fSBlbHNlIHtcXG4gXFx0XFx0ZGUtXFx1MDAzZXJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhibG9ja3NpemUgLVxcbi1cXHRcXHRcXHRcXHRcXHQoY3N1bV9zaXplICsgZXh0NF9kaXJfcmVjX2xlbigxLCBOVUxMKSksXFxuK1xcdFxcdFxcdFxcdFxcdChjc3VtX3NpemUgKyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIE5VTEwpKSxcXG4gXFx0XFx0XFx0XFx0XFx0YmxvY2tzaXplKTtcXG4gXFx0fVxcbiBcXG5AQCAtMjk2Niw4ICszMjQ3LDkgQEAgaW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbiBcXHRyZXR1cm4gZXh0NF9oYW5kbGVfZGlydHlfZGlyYmxvY2soaGFuZGxlLCBpbm9kZSwgYmgpO1xcbiB9XFxuIFxcbi1pbnQgZXh0NF9pbml0X25ld19kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuLVxcdFxcdFxcdCAgICAgc3RydWN0IGlub2RlICppbm9kZSlcXG4raW50IGV4dDRfaW5pdF9uZXdfZGlyX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuK1xcdFxcdFxcdCAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuK1xcdFxcdFxcdCAgIGNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCB2b2lkICpkYXRhMilcXG4ge1xcbiBcXHRzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcl9ibG9jayA9IE5VTEw7XFxuIFxcdGV4dDRfbGJsa190IGJsb2NrID0gMDtcXG5AQCAtMzA3Nyw4ICszMzU5LDggQEAgYm9vbCBleHQ0X2VtcHR5X2RpcihzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiBcXHR9XFxuIFxcbiBcXHRzYiA9IGlub2RlLVxcdTAwM2VpX3NiO1xcbi1cXHRpZiAoaW5vZGUtXFx1MDAzZWlfc2l6ZSBcXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkgK1xcbi1cXHRcXHRcXHRcXHRcXHRleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpKSB7XFxuK1xcdGlmIChpbm9kZS1cXHUwMDNlaV9zaXplIFxcdTAwM2MgZXh0NF9kaXJlbnRfcmVjX2xlbigxLCBOVUxMKSArXFxuK1xcdFxcdFxcdFxcdFxcdGV4dDRfZGlyZW50X3JlY19sZW4oMiwgTlVMTCkpIHtcXG4gXFx0XFx0RVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgXFxcImludmFsaWQgc2l6ZVxcXCIpO1xcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcdH1cXG5AQCAtMzQ2NywxMCArMzc0OSwxNiBAQCBpbnQgX19leHQ0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuIFxcdGlmIChJU19ESVJTWU5DKGRpcikpXFxuIFxcdFxcdGV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTtcXG4gXFxuK1xcdC8qIEZhc3QtY29tbWl0IGRvZXMgbm90IHJlY29yZCBkaXJkYXRhIGluIGl0cyBqb3VybmFsIGZvcm1hdDsgZm9yY2UgYVxcbitcXHQgKiBmdWxsIGpvdXJuYWwgY29tbWl0IHNvIHRoZSBMVUZJRCBzdXJ2aXZlcyBjcmFzaCtyZXBsYXkuICovXFxuK1xcdGlmIChleHQ0X2RlbnRyeV9nZXRfZmlkKGRpci1cXHUwMDNlaV9zYiwgZGVudHJ5ID8gZGVudHJ5LVxcdTAwM2VkX2ZzZGF0YSA6IE5VTEwpKVxcbitcXHRcXHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShkaXItXFx1MDAzZWlfc2IsIEVYVDRfRkNfUkVBU09OX0RJUkRBVEEsIGhhbmRsZSk7XFxuK1xcbiBcXHRpbm9kZV9zZXRfY3RpbWVfY3VycmVudChpbm9kZSk7XFxuIFxcdGV4dDRfaW5jX2NvdW50KGlub2RlKTtcXG4gXFxuLVxcdGVyciA9IF9fZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBkaXIsIGRfbmFtZSwgaW5vZGUpO1xcbitcXHRlcnIgPSBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGlyLCBkX25hbWUsIGlub2RlLFxcbitcXHRcXHRcXHQgICAgICAgZGVudHJ5ID8gZGVudHJ5LVxcdTAwM2VkX2ZzZGF0YSA6IE5VTEwpO1xcbiBcXHRpZiAoIWVycikge1xcbiBcXHRcXHRlcnIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7XFxuIFxcdFxcdC8qIHRoaXMgY2FuIGhhcHBlbiBvbmx5IGZvciB0bXBmaWxlIGJlaW5nXFxuQEAgLTM2MzksNyArMzkyNyw4IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWVfZGlyX2ZpbmlzaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9yZW5hbWVudCAqZW50LFxcbiB9XFxuIFxcbiBzdGF0aWMgaW50IGV4dDRfc2V0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsXFxuLVxcdFxcdCAgICAgICB1bnNpZ25lZCBpbm8sIHVuc2lnbmVkIGZpbGVfdHlwZSlcXG4rXFx0XFx0ICAgICAgIHVuc2lnbmVkIGlubywgdW5zaWduZWQgZmlsZV90eXBlLFxcbitcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqc3JjX2ZpZClcXG4ge1xcbiBcXHRpbnQgcmV0dmFsLCByZXR2YWwyO1xcbiBcXG5AQCAtMzY0OSw4ICszOTM4LDU3IEBAIHN0YXRpYyBpbnQgZXh0NF9zZXRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCxcXG4gXFx0aWYgKHJldHZhbClcXG4gXFx0XFx0cmV0dXJuIHJldHZhbDtcXG4gXFx0ZW50LVxcdTAwM2VkZS1cXHUwMDNlaW5vZGUgPSBjcHVfdG9fbGUzMihpbm8pO1xcbi1cXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9maWxldHlwZShlbnQtXFx1MDAzZWRpci1cXHUwMDNlaV9zYikpXFxuLVxcdFxcdGVudC1cXHUwMDNlZGUtXFx1MDAzZWZpbGVfdHlwZSA9IGZpbGVfdHlwZTtcXG4rXFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoZW50LVxcdTAwM2VkaXItXFx1MDAzZWlfc2IpKSB7XFxuK1xcdFxcdC8qIENvcHkgdGhlIHNvdXJjZSBMVUZJRCBwYXlsb2FkIGludG8gdGhlIGRlc3RpbmF0aW9uIHNsb3Qgd2hlblxcbitcXHRcXHQgKiBib3RoIGNhcnJ5IGEgTFVGSUQgb2YgdGhlIHNhbWUgb24tZGlzayBzaXplLiAgTFVGSUQgaXNcXG4rXFx0XFx0ICogaW5vZGUtc3BlY2lmaWMgYW5kIG11c3QgdHJhdmVsIHdpdGggdGhlIGlub2RlIHRocm91Z2ggcmVuYW1lLlxcbitcXHRcXHQgKiBDRkhBU0ggYnl0ZXMgYXJlIGxlZnQgaW4tcGxhY2U6IENGSEFTSCBpcyBhIGZ1bmN0aW9uIG9mIHRoZVxcbitcXHRcXHQgKiBkZXN0aW5hdGlvbiBmaWxlbmFtZSwgYW5kIGl0cyBieXRlcyBzaXQgYXQgdGhlIGNvcnJlY3Qgb2Zmc2V0XFxuK1xcdFxcdCAqIGJlY2F1c2UgTFVGSUQgYWx3YXlzIHByZWNlZGVzIENGSEFTSCBpbiB0aGUgZXh0ZW5zaW9uIGxheW91dC5cXG4rXFx0XFx0ICogV2hlbiBzcmNfZmlkIGlzIE5VTEwsIHRoZSBMVUZJRCBmbGFnIGlzIHN5bmNlZCB0byB0aGUgTFVGSURcXG4rXFx0XFx0ICogYml0IGFscmVhZHkgcHJlc2VudCBpbiBmaWxlX3R5cGU6IGNhbGxlcnMgdGhhdCBjbGVhciBMVUZJRFxcbitcXHRcXHQgKiAocmVuYW1lIG9mIGEgbm9uLUxVRklEIGlub2RlLCB3aGl0ZW91dCkgcGFzcyBmaWxlX3R5cGUgd2l0aFxcbitcXHRcXHQgKiBMVUZJRD0wOyBleHQ0X3Jlc2V0ZW50IHBhc3NlcyB0aGUgb3JpZ2luYWwgZmlsZV90eXBlIHNvIHRoZVxcbitcXHRcXHQgKiBmbGFnIGlzIHJlc3RvcmVkIGZvciBlcnJvciByZWNvdmVyeSB3aXRob3V0IG92ZXJ3cml0aW5nIHRoZVxcbitcXHRcXHQgKiBMVUZJRCBieXRlcyB0aGF0IGFyZSBzdGlsbCBpbnRhY3Qgb24gZGlzay4gKi9cXG4rXFx0XFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShlbnQtXFx1MDAzZWRpci1cXHUwMDNlaV9zYikpIHtcXG4rXFx0XFx0XFx0aWYgKHNyY19maWQgXFx1MDAyNlxcdTAwMjYgKGVudC1cXHUwMDNlZGUtXFx1MDAzZWZpbGVfdHlwZSBcXHUwMDI2IEVYVDRfRElSRU5UX0xVRklEKSkge1xcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9XFxuK1xcdFxcdFxcdFxcdFxcdGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZW50LVxcdTAwM2VkZS1cXHUwMDNlcmVjX2xlbixcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ZW50LVxcdTAwM2VkaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4rXFx0XFx0XFx0XFx0dW5zaWduZWQgaW50IGRkaF9vZmYgPVxcbitcXHRcXHRcXHRcXHRcXHRFWFQ0X0JBU0VfRElSX0xFTiArIGVudC1cXHUwMDNlZGUtXFx1MDAzZW5hbWVfbGVuICsgMTtcXG4rXFx0XFx0XFx0XFx0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICpkZGggPVxcbitcXHRcXHRcXHRcXHRcXHQoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopXFxuK1xcdFxcdFxcdFxcdFxcdCgoY2hhciAqKWVudC1cXHUwMDNlZGUgKyBkZGhfb2ZmKTtcXG4rXFx0XFx0XFx0XFx0dW5zaWduZWQgaW50IGNvcHlfbGVuID0gc3JjX2ZpZC1cXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XFxuK1xcbitcXHRcXHRcXHRcXHRpZiAoZGRoX29mZiArIHNpemVvZigqZGRoKSBcXHUwMDNlIHJlY19sZW4gfHxcXG4rXFx0XFx0XFx0XFx0ICAgIGRkaC1cXHUwMDNlZGRoX2xlbmd0aCAhPSBjb3B5X2xlbiB8fFxcbitcXHRcXHRcXHRcXHQgICAgZGRoX29mZiArIGNvcHlfbGVuIFxcdTAwM2UgcmVjX2xlbikge1xcbitcXHRcXHRcXHRcXHRcXHQvKiBDYW5ub3QgY29weTogY2xlYXIgdGhlIGZsYWcgc28gdGhlXFxuK1xcdFxcdFxcdFxcdFxcdCAqIHNsb3QgZG9lcyBub3QgYWR2ZXJ0aXNlIGEgc3RhbGUgTFVGSURcXG4rXFx0XFx0XFx0XFx0XFx0ICogZnJvbSB0aGUgb2xkIGlub2RlLiAqL1xcbitcXHRcXHRcXHRcXHRcXHRlbnQtXFx1MDAzZWRlLVxcdTAwM2VmaWxlX3R5cGUgXFx1MDAyNj0gfkVYVDRfRElSRU5UX0xVRklEO1xcbitcXHRcXHRcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRcXHRcXHRtZW1jcHkoZGRoLCBzcmNfZmlkLCBjb3B5X2xlbik7XFxuK1xcdFxcdFxcdFxcdH1cXG4rXFx0XFx0XFx0fSBlbHNlIGlmICghc3JjX2ZpZCkge1xcbitcXHRcXHRcXHRcXHQvKiBTeW5jIHRoZSBMVUZJRCBmbGFnIHdpdGggd2hhdCBmaWxlX3R5cGUgcmVxdWVzdHMuXFxuK1xcdFxcdFxcdFxcdCAqIEZvciBub3JtYWwgcmVuYW1lIChzb3VyY2UgaGFzIG5vIExVRklEKSBhbmQgZm9yXFxuK1xcdFxcdFxcdFxcdCAqIHRoZSB3aGl0ZW91dCBzZXRlbnQsIGZpbGVfdHlwZSBjYXJyaWVzIExVRklEPTAsXFxuK1xcdFxcdFxcdFxcdCAqIHNvIHdlIGNsZWFyIHRoZSBzdGFsZSBmbGFnLiAgRm9yIGV4dDRfcmVzZXRlbnRcXG4rXFx0XFx0XFx0XFx0ICogKGVycm9yIHJlY292ZXJ5KSwgZmlsZV90eXBlIGlzIHRoZSBvcmlnaW5hbFxcbitcXHRcXHRcXHRcXHQgKiBmaWxlX3R5cGUgd2l0aCBMVUZJRD0xLCBzbyB3ZSByZXN0b3JlIHRoZSBmbGFnIOKAlFxcbitcXHRcXHRcXHRcXHQgKiB0aGUgTFVGSUQgYnl0ZXMgYXJlIHN0aWxsIG9uIGRpc2sgdW50b3VjaGVkLiAqL1xcbitcXHRcXHRcXHRcXHRlbnQtXFx1MDAzZWRlLVxcdTAwM2VmaWxlX3R5cGUgPVxcbitcXHRcXHRcXHRcXHRcXHQoZW50LVxcdTAwM2VkZS1cXHUwMDNlZmlsZV90eXBlIFxcdTAwMjYgfkVYVDRfRElSRU5UX0xVRklEKSB8XFxuK1xcdFxcdFxcdFxcdFxcdChmaWxlX3R5cGUgXFx1MDAyNiBFWFQ0X0RJUkVOVF9MVUZJRCk7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXHRcXHRlbnQtXFx1MDAzZWRlLVxcdTAwM2VmaWxlX3R5cGUgPSAoZmlsZV90eXBlIFxcdTAwMjYgRVhUNF9GVF9NQVNLKSB8XFxuK1xcdFxcdFxcdFxcdCAgICAgKGVudC1cXHUwMDNlZGUtXFx1MDAzZWZpbGVfdHlwZSBcXHUwMDI2IH5FWFQ0X0ZUX01BU0spO1xcbitcXHR9XFxuIFxcdGlub2RlX2luY19pdmVyc2lvbihlbnQtXFx1MDAzZWRpcik7XFxuIFxcdGlub2RlX3NldF9tdGltZV90b190cyhlbnQtXFx1MDAzZWRpciwgaW5vZGVfc2V0X2N0aW1lX2N1cnJlbnQoZW50LVxcdTAwM2VkaXIpKTtcXG4gXFx0cmV0dmFsID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZW50LVxcdTAwM2VkaXIpO1xcbkBAIC0zNjg3LDcgKzQwMjUsNyBAQCBzdGF0aWMgdm9pZCBleHQ0X3Jlc2V0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsXFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbiBcXG4tXFx0ZXh0NF9zZXRlbnQoaGFuZGxlLCBcXHUwMDI2b2xkLCBpbm8sIGZpbGVfdHlwZSk7XFxuK1xcdGV4dDRfc2V0ZW50KGhhbmRsZSwgXFx1MDAyNm9sZCwgaW5vLCBmaWxlX3R5cGUsIE5VTEwpO1xcbiBcXHRicmVsc2Uob2xkLmJoKTtcXG4gfVxcbiBcXG5AQCAtMzc4Niw2ICs0MTI0LDMyIEBAIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmV4dDRfd2hpdGVvdXRfZm9yX3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcXG4gXFx0cmV0dXJuIHdoO1xcbiB9XFxuIFxcbisvKlxcbisgKiBleHQ0X2x1ZmlkX3NuYXBzaG90IC0gY29weSB0aGUgTFVGSUQgcmVjb3JkIGZyb20gYSBkaXJlY3RvcnkgZW50cnlcXG4rICpcXG4rICogQWxsb2NhdGVzIGFuZCByZXR1cm5zIGEga21lbWR1cCdkIGNvcHkgb2YgdGhlIGZ1bGwgb24tZGlzayBMVUZJRCByZWNvcmRcXG4rICogKGhlYWRlciArIEZJRCBwYXlsb2FkIG9mIGFyYml0cmFyeSBsZW5ndGgpLiAgUmV0dXJucyBOVUxMIGlmIG5vIExVRklEIGlzXFxuKyAqIHByZXNlbnQsIHRoZSByZWNvcmQgaXMgbWFsZm9ybWVkLCBvciBhbGxvY2F0aW9uIGZhaWxzLiAgQ2FsbGVyIG11c3Qga2ZyZWUoKS5cXG4rICovXFxuK3N0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpcXG4rZXh0NF9sdWZpZF9zbmFwc2hvdChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIHVuc2lnbmVkIGludCBibG9ja3NpemUpXFxuK3tcXG4rXFx0dW5zaWduZWQgaW50IGRkaF9vZmYgPSBFWFQ0X0JBU0VfRElSX0xFTiArIGRlLVxcdTAwM2VuYW1lX2xlbiArIDE7XFxuK1xcdHVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcXG4rXFx0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGlza19maWQ7XFxuK1xcdHVuc2lnbmVkIGludCBkbGVuO1xcbitcXG4rXFx0aWYgKCEoZGUtXFx1MDAzZWZpbGVfdHlwZSBcXHUwMDI2IEVYVDRfRElSRU5UX0xVRklEKSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGlmIChkZGhfb2ZmICsgc2l6ZW9mKGRpc2tfZmlkLVxcdTAwM2VkZl9oZWFkZXIpIFxcdTAwM2UgcmVjX2xlbilcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdGRpc2tfZmlkID0gKHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKikoKGNoYXIgKilkZSArIGRkaF9vZmYpO1xcbitcXHRkbGVuID0gZGlza19maWQtXFx1MDAzZWRmX2hlYWRlci5kZGhfbGVuZ3RoO1xcbitcXHRpZiAoZGxlbiBcXHUwMDNjIHNpemVvZihkaXNrX2ZpZC1cXHUwMDNlZGZfaGVhZGVyKSB8fCBkZGhfb2ZmICsgZGxlbiBcXHUwMDNlIHJlY19sZW4pXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRyZXR1cm4ga21lbWR1cChkaXNrX2ZpZCwgZGxlbiwgR0ZQX05PRlMpO1xcbit9XFxuK1xcbiAvKlxcbiAgKiBBbnlib2R5IGNhbiByZW5hbWUgYW55dGhpbmcgd2l0aCB0aGlzOiB0aGUgcGVybWlzc2lvbiBjaGVja3MgYXJlIGxlZnQgdG8gdGhlXFxuICAqIGhpZ2hlci1sZXZlbCByb3V0aW5lcy5cXG5AQCAtMzgxNCw2ICs0MTc4LDcgQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLFxcbiBcXHRzdHJ1Y3QgaW5vZGUgKndoaXRlb3V0ID0gTlVMTDtcXG4gXFx0aW50IGNyZWRpdHM7XFxuIFxcdHU4IG9sZF9maWxlX3R5cGU7XFxuK1xcdHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKm9sZF9maWQgPSBOVUxMO1xcbiBcXG4gXFx0aWYgKG5ldy5pbm9kZSBcXHUwMDI2XFx1MDAyNiBuZXcuaW5vZGUtXFx1MDAzZWlfbmxpbmsgPT0gMCkge1xcbiBcXHRcXHRFWFQ0X0VSUk9SX0lOT0RFKG5ldy5pbm9kZSxcXG5AQCAtMzkyNSw3ICs0MjkwLDcgQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLFxcbiBcXHRcXHQgKiB0byBiZSBzdGlsbCBwb2ludGluZyB0byB0aGUgdmFsaWQgb2xkIGVudHJ5LlxcbiBcXHRcXHQgKi9cXG4gXFx0XFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcXHUwMDI2b2xkLCB3aGl0ZW91dC1cXHUwMDNlaV9pbm8sXFxuLVxcdFxcdFxcdFxcdCAgICAgRVhUNF9GVF9DSFJERVYpO1xcbitcXHRcXHRcXHRcXHQgICAgIEVYVDRfRlRfQ0hSREVWLCBOVUxMKTtcXG4gXFx0XFx0aWYgKHJldHZhbClcXG4gXFx0XFx0XFx0Z290byBlbmRfcmVuYW1lO1xcbiBcXHRcXHRyZXR2YWwgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCB3aGl0ZW91dCk7XFxuQEAgLTM5MzgsOCArNDMwMywxOCBAQCBzdGF0aWMgaW50IGV4dDRfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsXFxuIFxcdFxcdGlmIChyZXR2YWwpXFxuIFxcdFxcdFxcdGdvdG8gZW5kX3JlbmFtZTtcXG4gXFx0fSBlbHNlIHtcXG4rXFx0XFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShvbGQuZGlyLVxcdTAwM2VpX3NiKSkge1xcbitcXHRcXHRcXHRvbGRfZmlkID0gZXh0NF9sdWZpZF9zbmFwc2hvdChvbGQuZGUsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICAgIG9sZC5kaXItXFx1MDAzZWlfc2ItXFx1MDAzZXNfYmxvY2tzaXplKTtcXG4rXFx0XFx0XFx0aWYgKG9sZF9maWQpXFxuK1xcdFxcdFxcdFxcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKG9sZC5kaXItXFx1MDAzZWlfc2IsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdEVYVDRfRkNfUkVBU09OX0RJUkRBVEEsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdFxcdGhhbmRsZSk7XFxuK1xcdFxcdFxcdGVsc2VcXG4rXFx0XFx0XFx0XFx0b2xkX2ZpbGVfdHlwZSBcXHUwMDI2PSB+RVhUNF9ESVJFTlRfTFVGSUQ7XFxuK1xcdFxcdH1cXG4gXFx0XFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcXHUwMDI2bmV3LFxcbi1cXHRcXHRcXHRcXHQgICAgIG9sZC5pbm9kZS1cXHUwMDNlaV9pbm8sIG9sZF9maWxlX3R5cGUpO1xcbitcXHRcXHRcXHRcXHQgICAgIG9sZC5pbm9kZS1cXHUwMDNlaV9pbm8sIG9sZF9maWxlX3R5cGUsIG9sZF9maWQpO1xcbiBcXHRcXHRpZiAocmV0dmFsKVxcbiBcXHRcXHRcXHRnb3RvIGVuZF9yZW5hbWU7XFxuIFxcdH1cXG5AQCAtNDAyNiw2ICs0NDAxLDcgQEAgc3RhdGljIGludCBleHQ0X3JlbmFtZShzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCwgc3RydWN0IGlub2RlICpvbGRfZGlyLFxcbiBcXHRyZXR2YWwgPSAwO1xcbiBcXG4gZW5kX3JlbmFtZTpcXG4rXFx0a2ZyZWUob2xkX2ZpZCk7XFxuIFxcdGlmICh3aGl0ZW91dCkge1xcbiBcXHRcXHRpZiAocmV0dmFsKSB7XFxuIFxcdFxcdFxcdGV4dDRfcmVzZXRlbnQoaGFuZGxlLCBcXHUwMDI2b2xkLFxcbkBAIC00MDYyLDggKzQ0MzgsOSBAQCBzdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSxcXG4gXFx0XFx0LmRlbnRyeSA9IG5ld19kZW50cnksXFxuIFxcdFxcdC5pbm9kZSA9IGRfaW5vZGUobmV3X2RlbnRyeSksXFxuIFxcdH07XFxuLVxcdHU4IG5ld19maWxlX3R5cGU7XFxuK1xcdHU4IG5ld19maWxlX3R5cGUsIG9sZF9kZV9maWxlX3R5cGU7XFxuIFxcdGludCByZXR2YWw7XFxuK1xcdHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKm9sZF9maWQgPSBOVUxMLCAqbmV3X2ZpZCA9IE5VTEw7XFxuIFxcbiBcXHRpZiAoKGV4dDRfdGVzdF9pbm9kZV9mbGFnKG5ld19kaXIsIEVYVDRfSU5PREVfUFJPSklOSEVSSVQpIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICAgIXByb2ppZF9lcShFWFQ0X0kobmV3X2RpciktXFx1MDAzZWlfcHJvamlkLFxcbkBAIC00MTQyLDEyICs0NTE5LDI3IEBAIHN0YXRpYyBpbnQgZXh0NF9jcm9zc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LFxcbiBcXHRcXHRcXHRnb3RvIGVuZF9yZW5hbWU7XFxuIFxcdH1cXG4gXFxuK1xcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEob2xkLmRpci1cXHUwMDNlaV9zYikpIHtcXG4rXFx0XFx0b2xkX2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3Qob2xkLmRlLCBvbGQuZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuK1xcdFxcdG5ld19maWQgPSBleHQ0X2x1ZmlkX3NuYXBzaG90KG5ldy5kZSwgbmV3LmRpci1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpO1xcbitcXHRcXHRpZiAob2xkX2ZpZCB8fCBuZXdfZmlkKVxcbitcXHRcXHRcXHRleHQ0X2ZjX21hcmtfaW5lbGlnaWJsZShvbGQuZGlyLVxcdTAwM2VpX3NiLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRFWFQ0X0ZDX1JFQVNPTl9ESVJEQVRBLCBoYW5kbGUpO1xcbitcXHR9XFxuK1xcbitcXHRvbGRfZGVfZmlsZV90eXBlID0gb2xkLmRlLVxcdTAwM2VmaWxlX3R5cGU7XFxuK1xcdGlmICghb2xkX2ZpZClcXG4rXFx0XFx0b2xkX2RlX2ZpbGVfdHlwZSBcXHUwMDI2PSB+RVhUNF9ESVJFTlRfTFVGSUQ7XFxuIFxcdG5ld19maWxlX3R5cGUgPSBuZXcuZGUtXFx1MDAzZWZpbGVfdHlwZTtcXG4tXFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcXHUwMDI2bmV3LCBvbGQuaW5vZGUtXFx1MDAzZWlfaW5vLCBvbGQuZGUtXFx1MDAzZWZpbGVfdHlwZSk7XFxuK1xcdGlmICghbmV3X2ZpZClcXG4rXFx0XFx0bmV3X2ZpbGVfdHlwZSBcXHUwMDI2PSB+RVhUNF9ESVJFTlRfTFVGSUQ7XFxuK1xcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXFx1MDAyNm5ldywgb2xkLmlub2RlLVxcdTAwM2VpX2lubywgb2xkX2RlX2ZpbGVfdHlwZSxcXG4rXFx0XFx0XFx0ICAgICBvbGRfZmlkKTtcXG4gXFx0aWYgKHJldHZhbClcXG4gXFx0XFx0Z290byBlbmRfcmVuYW1lO1xcbiBcXG4tXFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcXHUwMDI2b2xkLCBuZXcuaW5vZGUtXFx1MDAzZWlfaW5vLCBuZXdfZmlsZV90eXBlKTtcXG4rXFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcXHUwMDI2b2xkLCBuZXcuaW5vZGUtXFx1MDAzZWlfaW5vLCBuZXdfZmlsZV90eXBlLFxcbitcXHRcXHRcXHQgICAgIG5ld19maWQpO1xcbiBcXHRpZiAocmV0dmFsKVxcbiBcXHRcXHRnb3RvIGVuZF9yZW5hbWU7XFxuIFxcbkBAIC00MTgwLDYgKzQ1NzIsOCBAQCBzdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSxcXG4gXFx0cmV0dmFsID0gMDtcXG4gXFxuIGVuZF9yZW5hbWU6XFxuK1xcdGtmcmVlKG9sZF9maWQpO1xcbitcXHRrZnJlZShuZXdfZmlkKTtcXG4gXFx0YnJlbHNlKG9sZC5kaXJfYmgpO1xcbiBcXHRicmVsc2UobmV3LmRpcl9iaCk7XFxuIFxcdGJyZWxzZShvbGQuYmgpO1xcbkBAIC00MjE2LDYgKzQ2MTAsMTU0IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLFxcbiBcXHRyZXR1cm4gZXh0NF9yZW5hbWUoaWRtYXAsIG9sZF9kaXIsIG9sZF9kZW50cnksIG5ld19kaXIsIG5ld19kZW50cnksIGZsYWdzKTtcXG4gfVxcbiBcXG4rLypcXG4rICogZXh0NF9kaXJkYXRhX3NldF9sdWZpZCgpIC0gU2V0IExVRklEIGRhdGEgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJ5XFxuKyAqIEBkaXI6ICAgICAgICBwYXJlbnQgZGlyZWN0b3J5IGlub2RlXFxuKyAqIEBmaWxlbmFtZTogICBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSBkaXJlY3RvcnlcXG4rICogQG5hbWVsZW46ICAgIGxlbmd0aCBvZiBmaWxlbmFtZVxcbisgKiBAZWRwOiAgICAgICAgcG9pbnRlciB0byBpbml0aWFsaXplZCBkZW50cnkgcGFyYW0gd2l0aCBMVUZJRCBkYXRhXFxuKyAqXFxuKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJ5LCBkZWxldGVzIGl0LCBhbmQgcmUtY3JlYXRlcyBpdFxcbisgKiB3aXRoIExVRklEIGRhdGEgYXR0YWNoZWQuIFVzZWQgYnkgdGhlIEVYVDRfSU9DX1NFVF9MVUZJRCBpb2N0bC5cXG4rICpcXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cXG4rICovXFxuK2ludCBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpmaWxlbmFtZSxcXG4rXFx0XFx0XFx0ICAgIGludCBuYW1lbGVuLCBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKmVkcClcXG4re1xcbitcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLVxcdTAwM2VpX3NiO1xcbitcXHQgLyogemVyby1pbml0OiBzYWZlIHRvIGZyZWUgb24gYW55IHBhdGggKi9cXG4rXFx0c3RydWN0IGV4dDRfZmlsZW5hbWUgZm5hbWUgPSB7fTtcXG4rXFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlID0gTlVMTDtcXG4rXFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7XFxuK1xcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xcbitcXHRoYW5kbGVfdCAqaGFuZGxlID0gTlVMTDtcXG4rXFx0c3RydWN0IHFzdHIgZF9uYW1lO1xcbitcXHRpbnQgZXJyID0gMDtcXG4rXFxuK1xcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKHNiKSlcXG4rXFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbitcXG4rXFx0aWYgKG5hbWVsZW4gXFx1MDAzZSBFWFQ0X05BTUVfTEVOKVxcbitcXHRcXHRyZXR1cm4gLUVOQU1FVE9PTE9ORztcXG4rXFx0aWYgKG5hbWVsZW4gIT0gc3RybmxlbihmaWxlbmFtZSwgbmFtZWxlbiArIDEpKVxcbitcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4rXFxuK1xcdGRfbmFtZS5uYW1lID0gZmlsZW5hbWU7XFxuK1xcdGRfbmFtZS5sZW4gPSBuYW1lbGVuO1xcbitcXG4rXFx0ZXJyID0gZXh0NF9mbmFtZV9zZXR1cF9maWxlbmFtZShkaXIsIFxcdTAwMjZkX25hbWUsIDAsIFxcdTAwMjZmbmFtZSk7XFxuK1xcdGlmIChlcnIpXFxuK1xcdFxcdGdvdG8gb3V0X2ZyZWU7XFxuK1xcbitcXHQvKiBMb2NrIGRpciB3aXRoIHRoZSBWRlMgcGFyZW50LW11dGF0aW9uIHN1YmNsYXNzIGJlZm9yZSBzdGFydGluZyB0aGVcXG4rXFx0ICogam91cm5hbC4gIEhvbGRpbmcgaV9yd3NlbSB3aGlsZSBjYWxsaW5nIGV4dDRfam91cm5hbF9zdGFydCgpIGlzIHNhZmVcXG4rXFx0ICogKGV4dDRfc2V0YXR0ciwgZXh0NF9mYWxsb2NhdGUgZXRjLiBkbyB0aGUgc2FtZSkuICBUaGUgbG9va3VwIG11c3QgYmVcXG4rXFx0ICogaW5zaWRlIHRoZSBsb2NrIHRvIHByZXZlbnQgVE9DVE9VOiB0aGUgYmgvZGUgcG9pbnRlcnMgbXVzdCBiZSBzdGFibGVcXG4rXFx0ICogZnJvbSBmaW5kX2VudHJ5IHRocm91Z2ggZGVsZXRlX2VudHJ5LiAqL1xcbitcXHRpbm9kZV9sb2NrX25lc3RlZChkaXIsIElfTVVURVhfUEFSRU5UKTtcXG4rXFxuK1xcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChkaXIsIEVYVDRfSFRfRElSLFxcbitcXHRcXHRcXHRcXHQgICAgMyAqIEVYVDRfREFUQV9UUkFOU19CTE9DS1Moc2IpICtcXG4rXFx0XFx0XFx0XFx0ICAgIDIgKiBFWFQ0X0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyk7XFxuK1xcdGlmIChJU19FUlIoaGFuZGxlKSkge1xcbitcXHRcXHRlcnIgPSBQVFJfRVJSKGhhbmRsZSk7XFxuK1xcdFxcdGhhbmRsZSA9IE5VTEw7XFxuK1xcdFxcdGdvdG8gb3V0X3VubG9ja19kaXI7XFxuK1xcdH1cXG4rXFxuK1xcdGJoID0gZXh0NF9maW5kX2VudHJ5KGRpciwgXFx1MDAyNmRfbmFtZSwgXFx1MDAyNmRlLCBOVUxMKTtcXG4rXFx0aWYgKElTX0VSUihiaCkpIHtcXG4rXFx0XFx0ZXJyID0gUFRSX0VSUihiaCk7XFxuK1xcdFxcdGJoID0gTlVMTDtcXG4rXFx0XFx0Z290byBvdXRfam91cm5hbDtcXG4rXFx0fVxcbitcXHRpZiAoIWJoKSB7XFxuK1xcdFxcdGVyciA9IC1FTk9FTlQ7XFxuK1xcdFxcdGdvdG8gb3V0X2pvdXJuYWw7XFxuK1xcdH1cXG4rXFxuK1xcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBsZTMyX3RvX2NwdShkZS1cXHUwMDNlaW5vZGUpLCBFWFQ0X0lHRVRfTk9STUFMKTtcXG4rXFx0aWYgKElTX0VSUihpbm9kZSkpIHtcXG4rXFx0XFx0ZXJyID0gUFRSX0VSUihpbm9kZSk7XFxuK1xcdFxcdGlub2RlID0gTlVMTDtcXG4rXFx0XFx0Z290byBvdXRfYnJlbHNlO1xcbitcXHR9XFxuK1xcbitcXHQvKiBMb2NrIHRoZSB0YXJnZXQgaW5vZGUgYWZ0ZXIgdGhlIGRpcmVjdG9yeSAoZGlyLXRoZW4tY2hpbGQgb3JkZXJpbmcpXFxuK1xcdCAqIHRvIHNlcmlhbGl6ZSBjb25jdXJyZW50IEVYVDRfSU9DX1NFVF9MVUZJRCBjYWxscyBvbiBkaWZmZXJlbnRcXG4rXFx0ICogaGFyZGxpbmtzIG9mIHRoZSBzYW1lIGlub2RlLiAgVXNlIElfTVVURVhfQ0hJTEQgZm9yIGRpcmVjdG9yeSBpbm9kZXNcXG4rXFx0ICogKGNvbnNpc3RlbnQgd2l0aCBWRlMgcmVuYW1lL3JtZGlyKSBhbmQgSV9NVVRFWF9OT05ESVIyIGZvciBhbGxcXG4rXFx0ICogb3RoZXJzOyBtaXhpbmcgc3ViY2xhc3NlcyBvbiB0aGUgc2FtZSBpbm9kZSB0cmlnZ2VycyBsb2NrZGVwIGN5Y2xlc1xcbitcXHQgKiB3aXRoIGNvbmN1cnJlbnQgcmVuYW1lLiAqL1xcbitcXHRpZiAoaW5vZGUgIT0gZGlyKSB7XFxuK1xcdFxcdGlmIChTX0lTRElSKGlub2RlLVxcdTAwM2VpX21vZGUpKVxcbitcXHRcXHRcXHRpbm9kZV9sb2NrX25lc3RlZChpbm9kZSwgSV9NVVRFWF9DSElMRCk7XFxuK1xcdFxcdGVsc2VcXG4rXFx0XFx0XFx0aW5vZGVfbG9ja19uZXN0ZWQoaW5vZGUsIElfTVVURVhfTk9ORElSMik7XFxuK1xcdH1cXG4rXFxuK1xcdGVyciA9IGV4dDRfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuK1xcbitcXHRicmVsc2UoYmgpO1xcbitcXHRiaCA9IE5VTEw7XFxuK1xcbitcXHQvKiBSZS1hZGQgd2l0aCBMVUZJRCB2aWEgZGVudHJ5LVxcdTAwM2VkX2ZzZGF0YS4gIGV4dDRfYWRkX2VudHJ5KCkgcmVzb2x2ZXNcXG4rXFx0ICogZGZpZCBmcm9tIGRfZnNkYXRhIGludG8gZm5hbWUuZGZpZCBhbmQgcGFzc2VzIGl0IHRocm91Z2ggdG9cXG4rXFx0ICogYWRkX2RpcmVudF90b19idWYoKSB3aXRob3V0IHRvdWNoaW5nIHRoZSBzaGFyZWQgaV9kaXJkYXRhIGZpZWxkLFxcbitcXHQgKiBlbGltaW5hdGluZyB0aGUgcmFjZSB3aXRoIGNvbmN1cnJlbnQgbGluaygpIGNhbGxzLiAqL1xcbitcXHR7XFxuK1xcdFxcdHN0cnVjdCBkZW50cnkgcGFyZW50X2RlbnRyeSA9IHsgLmRfaW5vZGUgPSBkaXIgfTtcXG4rXFx0XFx0c3RydWN0IGRlbnRyeSBuZXdfZGVudHJ5ID0ge1xcbitcXHRcXHRcXHQuZF9uYW1lID0gZF9uYW1lLFxcbitcXHRcXHRcXHQuZF9wYXJlbnQgPSBcXHUwMDI2cGFyZW50X2RlbnRyeSxcXG4rXFx0XFx0XFx0LmRfaW5vZGUgPSBpbm9kZSxcXG4rXFx0XFx0XFx0LmRfZnNkYXRhID0gZWRwLFxcbitcXHRcXHR9O1xcbitcXHRcXHRlcnIgPSBleHQ0X2FkZF9lbnRyeShoYW5kbGUsIFxcdTAwMjZuZXdfZGVudHJ5LCBpbm9kZSk7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChlcnIpIHtcXG4rXFx0XFx0LyogRGVsZXRlIHN1Y2NlZWRlZCBidXQgcmUtYWRkIGZhaWxlZDsgdHJ5IHRvIHJlc3RvcmUgc28gdGhlXFxuK1xcdFxcdCAqIGlub2RlIGlzIG5vdCBsZWZ0IHdpdGhvdXQgYSBkaXJlY3RvcnkgZW50cnkuICovXFxuK1xcdFxcdHN0cnVjdCBkZW50cnkgcGFyZW50X2RlbnRyeSA9IHsgLmRfaW5vZGUgPSBkaXIgfTtcXG4rXFx0XFx0c3RydWN0IGRlbnRyeSBvcmlnX2RlbnRyeSA9IHtcXG4rXFx0XFx0XFx0LmRfbmFtZSA9IGRfbmFtZSxcXG4rXFx0XFx0XFx0LmRfcGFyZW50ID0gXFx1MDAyNnBhcmVudF9kZW50cnksXFxuK1xcdFxcdFxcdC5kX2lub2RlID0gaW5vZGUsXFxuK1xcdFxcdH07XFxuK1xcdFxcdGludCByb2xsYmFja19lcnIgPSBleHQ0X2FkZF9lbnRyeShoYW5kbGUsIFxcdTAwMjZvcmlnX2RlbnRyeSwgaW5vZGUpO1xcbitcXG4rXFx0XFx0aWYgKHJvbGxiYWNrX2VycilcXG4rXFx0XFx0XFx0RVhUNF9FUlJPUl9JTk9ERShkaXIsXFxuK1xcdFxcdFxcdFxcdFxcXCJGYWlsZWQgdG8gc2V0IExVRklEIG9uICclLipzJyAoZXJyPSVkKSBhbmQgZmFpbGVkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpcmVjdG9yeSBlbnRyeSAoZXJyPSVkKTsgaW5vZGUgJWxsdSBtYXkgYmUgb3JwaGFuZWRcXFwiLFxcbitcXHRcXHRcXHRcXHRuYW1lbGVuLCBmaWxlbmFtZSwgZXJyLCByb2xsYmFja19lcnIsXFxuK1xcdFxcdFxcdFxcdGlub2RlLVxcdTAwM2VpX2lubyk7XFxuK1xcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4rXFx0fVxcbitcXG4rXFx0aW5vZGVfc2V0X2N0aW1lX2N1cnJlbnQoZGlyKTtcXG4rXFx0aW5vZGVfaW5jX2l2ZXJzaW9uKGRpcik7XFxuK1xcdGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7XFxuK1xcbitvdXRfdW5sb2NrOlxcbitcXHRpZiAoaW5vZGUgIT0gZGlyKVxcbitcXHRcXHRpbm9kZV91bmxvY2soaW5vZGUpO1xcbitvdXRfYnJlbHNlOlxcbitcXHRicmVsc2UoYmgpO1xcbitvdXRfam91cm5hbDpcXG4rXFx0ZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTtcXG4rb3V0X3VubG9ja19kaXI6XFxuK1xcdGlub2RlX3VubG9jayhkaXIpO1xcbitcXHRpcHV0KGlub2RlKTtcXG4rb3V0X2ZyZWU6XFxuK1xcdGV4dDRfZm5hbWVfZnJlZV9maWxlbmFtZShcXHUwMDI2Zm5hbWUpO1xcbitcXG4rXFx0cmV0dXJuIGVycjtcXG4rfVxcbitcXG4gLypcXG4gICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi5cXG4gICovXFxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3lzZnMuYyBiL2ZzL2V4dDQvc3lzZnMuY1xcbmluZGV4IDkyM2IzNzVlMDE3ZmFhLi44MDA3NGZiMTVlZTliNyAxMDA2NDRcXG4tLS0gYS9mcy9leHQ0L3N5c2ZzLmNcXG4rKysgYi9mcy9leHQ0L3N5c2ZzLmNcXG5AQCAtMzYyLDYgKzM2Miw3IEBAIEVYVDRfQVRUUl9GRUFUVVJFKHZlcml0eSk7XFxuICNlbmRpZlxcbiBFWFQ0X0FUVFJfRkVBVFVSRShtZXRhZGF0YV9jc3VtX3NlZWQpO1xcbiBFWFQ0X0FUVFJfRkVBVFVSRShmYXN0X2NvbW1pdCk7XFxuK0VYVDRfQVRUUl9GRUFUVVJFKGRpcmRhdGEpO1xcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVU5JQ09ERSkgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfRlNfRU5DUllQVElPTilcXG4gRVhUNF9BVFRSX0ZFQVRVUkUoZW5jcnlwdGVkX2Nhc2Vmb2xkKTtcXG4gI2VuZGlmXFxuQEAgLTM4NSw2ICszODYsNyBAQCBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZXh0NF9mZWF0X2F0dHJzW10gPSB7XFxuICNlbmRpZlxcbiBcXHRBVFRSX0xJU1QobWV0YWRhdGFfY3N1bV9zZWVkKSxcXG4gXFx0QVRUUl9MSVNUKGZhc3RfY29tbWl0KSxcXG4rXFx0QVRUUl9MSVNUKGRpcmRhdGEpLFxcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVU5JQ09ERSkgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfRlNfRU5DUllQVElPTilcXG4gXFx0QVRUUl9MSVNUKGVuY3J5cHRlZF9jYXNlZm9sZCksXFxuICNlbmRpZlxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZXh0NC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxcbmluZGV4IDljNjgzOTkxYzMyZjk2Li45MTM0ZmU2NDk0N2E5MyAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZXh0NC5oXFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxcbkBAIC0zNSw2ICszNSw3IEBAXFxuICNkZWZpbmUgRVhUNF9JT0NfU0VURlNVVUlEXFx0XFx0X0lPVygnZicsIDQ0LCBzdHJ1Y3QgZnN1dWlkKVxcbiAjZGVmaW5lIEVYVDRfSU9DX0dFVF9UVU5FX1NCX1BBUkFNXFx0X0lPUignZicsIDQ1LCBzdHJ1Y3QgZXh0NF90dW5lX3NiX3BhcmFtcylcXG4gI2RlZmluZSBFWFQ0X0lPQ19TRVRfVFVORV9TQl9QQVJBTVxcdF9JT1coJ2YnLCA0Niwgc3RydWN0IGV4dDRfdHVuZV9zYl9wYXJhbXMpXFxuKyNkZWZpbmUgRVhUNF9JT0NfU0VUX0xVRklEXFx0XFx0X0lPVygnZicsIDQ3LCBzdHJ1Y3QgZXh0NF9zZXRfbHVmaWQpXFxuIFxcbiAjZGVmaW5lIEVYVDRfSU9DX1NIVVRET1dOIF9JT1IoJ1gnLCAxMjUsIF9fdTMyKVxcbiBcXG5AQCAtOTIsNiArOTMsMTkgQEAgc3RydWN0IG1vdmVfZXh0ZW50IHtcXG4gXFx0X191NjQgbW92ZWRfbGVuO1xcdC8qIG1vdmVkIGJsb2NrIGxlbmd0aCAqL1xcbiB9O1xcbiBcXG4rLypcXG4rICogU3RydWN0dXJlIGZvciBFWFQ0X0lPQ19TRVRfTFVGSURcXG4rICogU2V0cyBMVUZJRCBvbiBhIGRpcmVjdG9yeSBlbnRyeVxcbisgKiBDYWxsZWQgb24gcGFyZW50IGRpcmVjdG9yeSB3aXRoIGZpbGVuYW1lIGFuZCBMVUZJRCBkYXRhIGFzIGFyZ3VtZW50c1xcbisgKi9cXG4rc3RydWN0IGV4dDRfc2V0X2x1ZmlkIHtcXG4rXFx0X191OCBlc2xfbmFtZV9sZW47XFx0LyogbGVuZ3RoIG9mIGZpbGVuYW1lLCBOT1QgaW5jbHVkaW5nIE5VTCB0ZXJtaW5hdG9yXFxuK1xcdFxcdFxcdFxcdCAqICh2YWxpZCByYW5nZTogMS0yNTUsIG1hdGNoaW5nIEVYVDRfTkFNRV9MRU4pICovXFxuK1xcdGNoYXIgIGVzbF9uYW1lWzI1NSArIDFdOyAvKiBmaWxlbmFtZSAoTlVMLXRlcm1pbmF0ZWQpICovXFxuK1xcdF9fdTggZXNsX2RhdGFfbGVuO1xcdC8qIGxlbmd0aCBvZiBMVUZJRCBkYXRhICovXFxuK1xcdGNoYXIgIGVzbF9kYXRhWzI1NV07IC8qIExVRklEIGRhdGEgKHJhdyBieXRlcykgKi9cXG4rfTtcXG4rXFxuIC8qXFxuICAqIEZsYWdzIHVzZWQgYnkgRVhUNF9JT0NfU0hVVERPV05cXG4gICovXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQyOjA4LjA0MjI2NjMyNloiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIwNDUxNjgwNjkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkVYVDRfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJleHQ0X2lvY3RsX3NldF9sdWZpZFwiLFxuICAgIFwiZXh0NF9kaXJkYXRhX3NldF9sdWZpZFwiLFxuICAgIFwiZXh0NF9kaXJkYXRhX2dldFwiLFxuICAgIFwiZXh0NF9kaXJkYXRhX3NldFwiLFxuICAgIFwiZXh0NF9sdWZpZF9zbmFwc2hvdFwiLFxuICAgIFwiZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGFcIixcbiAgICBcImV4dDRfaW5pdF9uZXdfZGlyX2RhdGFcIixcbiAgICBcImR4X2dldF9keF9pbmZvXCIsXG4gICAgXCJleHQ0X2NoZWNrX2R4X3Jvb3RcIixcbiAgICBcImV4dDRfc2V0ZW50XCIsXG4gICAgXCJfX2V4dDRfYWRkX2VudHJ5XCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBleHQ0IGZlYXR1cmUgYGRpcmRhdGFgIChFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQSkgYW5kIGEgbmV3IGlvY3RsIGBFWFQ0X0lPQ19TRVRfTFVGSURgIHRvIGF0dGFjaCBMVUZJRCBkYXRhIHRvIGRpcmVjdG9yeSBlbnRyaWVzLiBJdCBtb2RpZmllcyBjb3JlIGRpcmVjdG9yeSBlbnRyeSBwYXJzaW5nLCBpbnNlcnRpb24sIHNwbGl0dGluZywgYW5kIHJlbmFtaW5nIGxvZ2ljIHRvIGhhbmRsZSB2YXJpYWJsZS1sZW5ndGggZGF0YSBhcHBlbmRlZCB0byBkaXJlY3RvcnkgZW50cmllcy4gVGhpcyBpcyBhIHNpZ25pZmljYW50IGZ1bmN0aW9uYWwgY2hhbmdlIHRvIHRoZSBleHQ0IGZpbGVzeXN0ZW0gdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG5ldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgRG8gbm90IGxpc3QgdG9vIGdlbmVyaWMgY29uZmlncyAod2UgYWxyZWFkeSBoYXZlIHRoZW0gZW5hYmxlZCkuIE9ubHkgbGlzdCB0aG9zZSB0aGF0XG4gICBzcGVjaWZpY2FsbHkgY292ZXIgdGhlIG1vZGlmaWVkIGNvZGUuIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncyBvdXRwdXQgYXJyYXksXG4gICBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI0NDE1ODgxOGNkYmJmOGUyMjgxYWIyODdmMTdkOTcxYTc2YmJmZGRcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEp1bCAxNCAxOTo0MjowNSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZGlyLmMgYi9mcy9leHQ0L2Rpci5jXG5pbmRleCAxN2VkZDY3OGZhODdiOC4uNTBjNDhjNTBhMjlkODggMTAwNjQ0XG4tLS0gYS9mcy9leHQ0L2Rpci5jXG4rKysgYi9mcy9leHQ0L2Rpci5jXG5AQCAtODksMTYgKzg5LDE1IEBAIGludCBfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCB1bnNpZ25lZCBpbnQgbGluZSxcbiBcdGJvb2wgZmFrZSA9IGlzX2Zha2VfZGlyX2VudHJ5KGRlKTtcbiBcdGJvb2wgaGFzX2NzdW0gPSBleHQ0X2hhc19mZWF0dXJlX21ldGFkYXRhX2NzdW0oZGlyLVx1MDAzZWlfc2IpO1xuIFxuLVx0aWYgKHVubGlrZWx5KHJsZW4gXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSwgZmFrZSA/IE5VTEwgOiBkaXIpKSlcbitcdGlmICh1bmxpa2VseShybGVuIFx1MDAzYyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIGZha2UgPyBOVUxMIDogZGlyKSkpXG4gXHRcdGVycm9yX21zZyA9IFwicmVjX2xlbiBpcyBzbWFsbGVyIHRoYW4gbWluaW1hbFwiO1xuIFx0ZWxzZSBpZiAodW5saWtlbHkocmxlbiAlIDQgIT0gMCkpXG4gXHRcdGVycm9yX21zZyA9IFwicmVjX2xlbiAlIDQgIT0gMFwiO1xuLVx0ZWxzZSBpZiAodW5saWtlbHkocmxlbiBcdTAwM2MgZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbixcbi1cdFx0XHRcdFx0XHRcdGZha2UgPyBOVUxMIDogZGlyKSkpXG4tXHRcdGVycm9yX21zZyA9IFwicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuXCI7XG4gXHRlbHNlIGlmICh1bmxpa2VseShuZXh0X29mZnNldCBcdTAwM2Ugc2l6ZSkpXG4gXHRcdGVycm9yX21zZyA9IFwiZGlyZWN0b3J5IGVudHJ5IG92ZXJydW5cIjtcbi1cdGVsc2UgaWYgKHVubGlrZWx5KG5leHRfb2Zmc2V0IFx1MDAzZSBzaXplIC0gZXh0NF9kaXJfcmVjX2xlbigxLFxuK1x0ZWxzZSBpZiAodW5saWtlbHkocmxlbiBcdTAwM2MgZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBzaXplLCBmYWtlID8gTlVMTCA6IGRpcikpKVxuK1x0XHRlcnJvcl9tc2cgPSBcInJlY19sZW4gaXMgdG9vIHNtYWxsIGZvciBuYW1lX2xlblwiO1xuK1x0ZWxzZSBpZiAodW5saWtlbHkobmV4dF9vZmZzZXQgXHUwMDNlIHNpemUgLSBleHQ0X2RpcmVudF9yZWNfbGVuKDEsXG4gXHRcdFx0XHRcdFx0ICBoYXNfY3N1bSA/IE5VTEwgOiBkaXIpIFx1MDAyNlx1MDAyNlxuIFx0XHRcdCAgbmV4dF9vZmZzZXQgIT0gc2l6ZSkpXG4gXHRcdGVycm9yX21zZyA9IFwiZGlyZWN0b3J5IGVudHJ5IHRvbyBjbG9zZSB0byBibG9jayBlbmRcIjtcbkBAIC0yNDUsNyArMjQ0LDcgQEAgc3RhdGljIGludCBleHQ0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkaXJfY29udGV4dCAqY3R4KVxuIFx0XHRcdFx0ICogZmFpbHVyZSB3aWxsIGJlIGRldGVjdGVkIGluIHRoZVxuIFx0XHRcdFx0ICogZGlyZW50IHRlc3QgYmVsb3cuICovXG4gXHRcdFx0XHRpZiAoZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLFxuLVx0XHRcdFx0XHRzYi1cdTAwM2VzX2Jsb2Nrc2l6ZSkgXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSxcbitcdFx0XHRcdFx0c2ItXHUwMDNlc19ibG9ja3NpemUpIFx1MDAzYyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsXG4gXHRcdFx0XHRcdFx0XHRcdFx0aW5vZGUpKVxuIFx0XHRcdFx0XHRicmVhaztcbiBcdFx0XHRcdGkgKz0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLFxuQEAgLTQ2OCwyNyArNDY3LDQzIEBAIHZvaWQgZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpwKVxuICAqIFRoZSBkZWNyeXB0ZWQgZmlsZW5hbWUgaXMgcGFzc2VkIGluIHZpYSBlbnRfbmFtZS4gIHBhcmFtZXRlci5cbiAgKi9cbiBpbnQgZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBoYXNoLFxuLVx0XHRcdCAgICAgX191MzIgbWlub3JfaGFzaCxcbitcdFx0XHQgICAgIF9fdTMyIG1pbm9yX2hhc2gsIGludCBidWZfc2l6ZSxcbiBcdFx0XHQgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCxcbiBcdFx0XHQgICAgc3RydWN0IGZzY3J5cHRfc3RyICplbnRfbmFtZSlcbiB7XG4gXHRzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQgPSBOVUxMO1xuIFx0c3RydWN0IGZuYW1lICpmbmFtZSwgKm5ld19mbjtcbiBcdHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICppbmZvO1xuK1x0aW50IGV4dHJhX2RhdGEgPSAwO1xuIFxuIFx0aW5mbyA9IGRpcl9maWxlLVx1MDAzZXByaXZhdGVfZGF0YTtcbiBcdHAgPSBcdTAwMjZpbmZvLVx1MDAzZXJvb3QucmJfbm9kZTtcbiBcbiBcdC8qIENyZWF0ZSBhbmQgYWxsb2NhdGUgdGhlIGZuYW1lIHN0cnVjdHVyZSAqL1xuLVx0bmV3X2ZuID0ga3phbGxvY19mbGV4KCpuZXdfZm4sIG5hbWUsIGVudF9uYW1lLVx1MDAzZWxlbiArIDEpO1xuK1x0aWYgKGRpcmVudC1cdTAwM2VmaWxlX3R5cGUgXHUwMDI2IH5FWFQ0X0ZUX01BU0spIHtcbitcdFx0dW5zaWduZWQgaW50IHJlY19sZW4gPVxuK1x0XHRcdGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGlyZW50LVx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcbitcdFx0ZXh0cmFfZGF0YSA9IGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbihkaXJlbnQsIHJlY19sZW4pO1xuK1x0fVxuK1xuK1x0LyogZXh0YV9kYXRhIGNvbnRhaW5zICsxIGJ5dGUgZm9yIE5VTEwgKi9cbitcdG5ld19mbiA9IGt6YWxsb2NfZmxleCgqbmV3X2ZuLCBuYW1lLCBlbnRfbmFtZS1cdTAwM2VsZW4gK1xuK1x0XHRcdCAgICAgIChleHRyYV9kYXRhID8gZXh0cmFfZGF0YSA6IDEpKTtcbiBcdGlmICghbmV3X2ZuKVxuIFx0XHRyZXR1cm4gLUVOT01FTTtcbiBcdG5ld19mbi1cdTAwM2VoYXNoID0gaGFzaDtcbiBcdG5ld19mbi1cdTAwM2VtaW5vcl9oYXNoID0gbWlub3JfaGFzaDtcbiBcdG5ld19mbi1cdTAwM2Vpbm9kZSA9IGxlMzJfdG9fY3B1KGRpcmVudC1cdTAwM2Vpbm9kZSk7XG4tXHRuZXdfZm4tXHUwMDNlbmFtZV9sZW4gPSBlbnRfbmFtZS1cdTAwM2VsZW47XG4gXHRuZXdfZm4tXHUwMDNlZmlsZV90eXBlID0gZGlyZW50LVx1MDAzZWZpbGVfdHlwZTtcbitcdG5ld19mbi1cdTAwM2VuYW1lX2xlbiA9IGVudF9uYW1lLVx1MDAzZWxlbjtcbiBcdG1lbWNweShuZXdfZm4tXHUwMDNlbmFtZSwgZW50X25hbWUtXHUwMDNlbmFtZSwgZW50X25hbWUtXHUwMDNlbGVuKTtcbitcdGlmIChleHRyYV9kYXRhKVxuK1x0XHQvKiBEaXJkYXRhIGJ5dGVzIGxpZSBwYXN0IHRoZSBfX2NvdW50ZWRfYnkobmFtZV9sZW4pIGJvdW5kIGJ1dFxuK1x0XHQgKiB3aXRoaW4gdGhlIGt6YWxsb2NfZmxleCBhbGxvY2F0aW9uOyB1c2UgdW5zYWZlX21lbWNweSB0b1xuK1x0XHQgKiBhdm9pZCBhIEZPUlRJRllfU09VUkNFIGZhbHNlIHBvc2l0aXZlLiAqL1xuK1x0XHR1bnNhZmVfbWVtY3B5KG5ld19mbi1cdTAwM2VuYW1lICsgZW50X25hbWUtXHUwMDNlbGVuLFxuK1x0XHRcdCAgICAgIGRpcmVudC1cdTAwM2VuYW1lICsgZGlyZW50LVx1MDAzZW5hbWVfbGVuLCBleHRyYV9kYXRhLFxuK1x0XHRcdCAgICAgIC8qIHdpdGhpbiBremFsbG9jX2ZsZXggYWxsb2NhdGlvbiAqLyk7XG4gXG4gXHR3aGlsZSAoKnApIHtcbiBcdFx0cGFyZW50ID0gKnA7XG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaFxuaW5kZXggYjM3YzEzNmVhM2FiMzMuLjE1ZDg4NWNmM2JkMDI1IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9leHQ0LmhcbisrKyBiL2ZzL2V4dDQvZXh0NC5oXG5AQCAtMTIyNyw2ICsxMjI3LDcgQEAgc3RydWN0IGV4dDRfaW5vZGVfaW5mbyB7XG4gI2lmZGVmIENPTkZJR19GU19FTkNSWVBUSU9OXG4gXHRzdHJ1Y3QgZnNjcnlwdF9pbm9kZV9pbmZvICppX2NyeXB0X2luZm87XG4gI2VuZGlmXG4rXHR2b2lkICppX2RpcmRhdGE7XG4gfTtcbiBcbiAvKlxuQEAgLTIzMzQsNiArMjMzNSw3IEBAIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GVU5DUyhjYXNlZm9sZCxcdFx0Q0FTRUZPTEQpXG4gXHRcdFx0XHRcdCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRkxFWF9CR3wgXFxcbiBcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FQV9JTk9ERXwgXFxcbiBcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9NTVAgfCBcXFxuK1x0XHRcdFx0XHQgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEgfCBcXFxuIFx0XHRcdFx0XHQgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0lOTElORV9EQVRBIHwgXFxcbiBcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9FTkNSWVBUIHwgXFxcbiBcdFx0XHRcdFx0IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9DQVNFRk9MRCB8IFxcXG5AQCAtMjQ3MiwxMCArMjQ3NCw4IEBAIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfZW1lcmdlbmN5X3N0YXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gICogU3RydWN0dXJlIG9mIGEgZGlyZWN0b3J5IGVudHJ5XG4gICovXG4gI2RlZmluZSBFWFQ0X05BTUVfTEVOIDI1NVxuLS8qXG4tICogQmFzZSBsZW5ndGggb2YgdGhlIGV4dDQgZGlyZWN0b3J5IGVudHJ5IGV4Y2x1ZGluZyB0aGUgbmFtZSBsZW5ndGhcbi0gKi9cbi0jZGVmaW5lIEVYVDRfQkFTRV9ESVJfTEVOIChzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIpIC0gRVhUNF9OQU1FX0xFTilcbisvKiBvZmZzZXRvZiBhdm9pZHMgc2l6ZW9mKCkrcGFkZGluZyBnaXZpbmcgOSBpbnN0ZWFkIG9mIHRoZSBjb3JyZWN0IG9uLWRpc2sgOCAqL1xuKyNkZWZpbmUgRVhUNF9CQVNFX0RJUl9MRU4gb2Zmc2V0b2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIsIG5hbWUpXG4gXG4gc3RydWN0IGV4dDRfZGlyX2VudHJ5IHtcbiBcdF9fbGUzMlx0aW5vZGU7XHRcdFx0LyogSW5vZGUgbnVtYmVyICovXG5AQCAtMjU1Niw2ICsyNTU2LDYxIEBAIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsIHtcbiAjZGVmaW5lIEVYVDRfRlRfU1lNTElOS1x0XHQ3XG4gXG4gI2RlZmluZSBFWFQ0X0ZUX01BWFx0XHQ4XG4rI2RlZmluZSBFWFQ0X0ZUX01BU0tcdFx0MHhmXG4rXG4rI2lmIEVYVDRfRlRfTUFYIFx1MDAzZSBFWFQ0X0ZUX01BU0tcbisjZXJyb3IgXCJjb25mbGljdGluZyBFWFQ0X0ZUX01BWCBhbmQgRVhUNF9GVF9NQVNLXCJcbisjZW5kaWZcbitcbisvKlxuKyAqIGRfdHlwZSBoYXMgNCB1bnVzZWQgYml0cywgc28gaXQgY2FuIGhvbGQgZm91ciB0eXBlcyBvZiBkYXRhLiBUaGVzZSBkaWZmZXJlbnRcbisgKiB0eXBlcyBvZiBkYXRhIChlLmcuIGZzY3lwdCBoYXNoLCBoaWdoIDMyIGJpdHMgb2YgNjQtYml0IGlub2RlIG51bWJlcikgY2FuIGJlXG4rICogc3RvcmVkLCBpbiBmbGFnIG9yZGVyLCBhZnRlciBmaWxlLW5hbWUgaW4gZXh0NCBkaXJlbnQuXG4rICpcbisgKiBUaGVzZSBmbGFncyBhcmUgYWRkZWQgdG8gZF90eXBlIGlmIGV4dDQgZGlyZW50IGhhcyBleHRyYSBkYXRhIGFmdGVyXG4rICogZmlsZW5hbWUuIFRoaXMgZGF0YSBsZW5ndGggaXMgdmFyaWFibGUgYW5kIGxlbmd0aCBpcyBzdG9yZWQgaW4gZmlyc3QgYnl0ZVxuKyAqIG9mIGRhdGEuIERhdGEgc3RhcnRzIGFmdGVyIGZpbGVuYW1lIE5VTCBieXRlLlxuKyAqL1xuKyNkZWZpbmUgRVhUNF9ESVJFTlRfTFVGSURcdFx0MHgxMFxuKyNkZWZpbmUgRVhUNF9ESVJFTlRfSU5PNjRcdFx0MHgyMFxuKyNkZWZpbmUgRVhUNF9ESVJFTlRfQ0ZIQVNIXHRcdDB4NDBcbitcbitzdHJ1Y3QgZXh0NF9maWQge1xuK1x0Y2hhciAgICBmaWRbMTZdOyAgICAgLyogMTI4LWJpdCB1bmlxdWUgZmlsZSBpZGVudGlmaWVyICovXG4rfTtcbitcbitzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIge1xuK1x0LyogbGVuZ3RoIG9mIHRoaXMgaGVhZGVyICsgdGhlIHdob2xlIGRhdGEgYmxvYiAqL1xuK1x0X191OFx0ZGRoX2xlbmd0aDtcbit9IF9fcGFja2VkO1xuK1xuK3N0cnVjdCBleHQ0X2RpcmVudF9maWQge1xuK1x0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyIGRmX2hlYWRlcjtcbitcdHN0cnVjdCBleHQ0X2ZpZCAgICAgICAgICAgICAgICBkZl9maWRbXTtcbit9O1xuK1xuKyNkZWZpbmUgRVhUNF9MVUZJRF9NQUdJQyAgICAweEFEMjAwOTA3VUxcbitzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0ge1xuK1x0X191MzJcdFx0XHRlZHBfbWFnaWM7XHQvKiBFWFQ0X0xVRklEX01BR0lDICovXG4rXHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkXHRlZHBfZGZpZDtcbit9O1xuK1xuK3N0cnVjdCBleHQ0X2RpcmVudF9oYXNoIHtcbitcdHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlclx0ZGhfaGVhZGVyO1xuK1x0c3RydWN0IGV4dDRfZGlyX2VudHJ5X2hhc2hcdGRoX2hhc2g7XG4rfSBfX3BhY2tlZDtcbitcbitzdGF0aWMgaW5saW5lXG4rc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZXh0NF9kZW50cnlfZ2V0X2ZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxuK1x0XHRcdFx0XHQgICAgc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICpwKVxuK3tcbitcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKHNiKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRpZiAocCBcdTAwMjZcdTAwMjYgcC1cdTAwM2VlZHBfbWFnaWMgPT0gRVhUNF9MVUZJRF9NQUdJQylcbitcdFx0cmV0dXJuIFx1MDAyNnAtXHUwMDNlZWRwX2RmaWQ7XG4rXG4rXHRyZXR1cm4gTlVMTDtcbit9XG4gXG4gI2RlZmluZSBFWFQ0X0ZUX0RJUl9DU1VNXHQweERFXG4gXG5AQCAtMjU3MywxMyArMjYyOCwyNiBAQCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCB7XG4gICogY2FzZWZvbGRlZCBhbmQgZW5jcnlwdGVkIG5lZWQgdG8gc3RvcmUgdGhlIGhhc2ggYXMgd2VsbCwgc28gd2UgYWRkIHJvb20gZm9yXG4gICogZXh0NF9leHRlbmRlZF9kaXJfZW50cnlfMi4gRm9yIGFsbCBlbnRyaWVzIHJlbGF0ZWQgdG8gJy4nIG9yICcuLicgeW91IHNob3VsZFxuICAqIHBhc3MgTlVMTCBmb3IgZGlyLCBhcyB0aG9zZSBlbnRyaWVzIGRvIG5vdCB1c2UgdGhlIGV4dHJhIGZpZWxkcy5cbisgKlxuKyAqIEZvciBkaXJlY3RvcmllcyB3aXRoIHRoZSBkaXJkYXRhIGZlYXR1cmUsIGV4dHJhIGRhdGEgbWF5IGZvbGxvdyB0aGUgZmlsZW5hbWUuXG4rICogVXNlIGV4dDRfZGlyX2VudHJ5X2xlbigpIHRvIGNvbXB1dGUgdGhlIGxlbmd0aCBvZiBhIGRpcmVjdG9yeSBlbnRyeVxuKyAqIGluY2x1ZGluZyBhbnkgZGlyZGF0YSwgb3IgZXh0NF9kaXJlbnRfcmVjX2xlbigpIGRpcmVjdGx5IHdoZW4gdGhlIHRvdGFsXG4rICogbmFtZV9sZW4gKGluY2x1ZGluZyBkaXJkYXRhIGxlbmd0aCkgaXMgYWxyZWFkeSBrbm93bi5cbiAgKi9cbi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQ0X2Rpcl9yZWNfbGVuKF9fdTggbmFtZV9sZW4sXG4rc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXh0NF9kaXJlbnRfcmVjX2xlbih1bnNpZ25lZCBpbnQgbmFtZV9sZW4sXG4gXHRcdFx0XHRcdFx0Y29uc3Qgc3RydWN0IGlub2RlICpkaXIpXG4ge1xuLVx0aW50IHJlY19sZW4gPSAobmFtZV9sZW4gKyA4ICsgRVhUNF9ESVJfUk9VTkQpO1xuK1x0dW5zaWduZWQgaW50IHJlY19sZW4gPSAobmFtZV9sZW4gKyA4ICsgRVhUNF9ESVJfUk9VTkQpO1xuIFxuLVx0aWYgKGRpciBcdTAwMjZcdTAwMjYgZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKVxuK1x0LypcbitcdCAqIFdpdGhvdXQgZGlyZGF0YSwgdGhlIGNhc2Vmb2xkK2ZzY3J5cHQgaGFzaCBsaXZlcyBhdCBhIGZpeGVkIHBvc2l0aW9uXG4rXHQgKiBhZnRlciB0aGUgZmlsZW5hbWUgYW5kIG11c3QgYmUgcmVzZXJ2ZWQgZXhwbGljaXRseS4gIFdpdGggZGlyZGF0YSB0aGVcbitcdCAqIGhhc2ggaXMgc3RvcmVkIGFzIGEgQ0ZIQVNIIGV4dGVuc2lvbiBhbmQgaXMgYWxyZWFkeSBjb3VudGVkIGluIHRoZVxuK1x0ICogbmFtZV9sZW4gYXJndW1lbnQgKHZpYSBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4pLCBzbyBhZGRpbmcgaXQgYWdhaW5cbitcdCAqIHdvdWxkIGRvdWJsZS1jb3VudC5cbitcdCAqL1xuK1x0aWYgKGRpciBcdTAwMjZcdTAwMjYgZXh0NF9oYXNoX2luX2RpcmVudChkaXIpIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVx1MDAzZWlfc2IpKVxuIFx0XHRyZWNfbGVuICs9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfaGFzaCk7XG4gXHRyZXR1cm4gKHJlY19sZW4gXHUwMDI2IH5FWFQ0X0RJUl9ST1VORCk7XG4gfVxuQEAgLTI2NjcsNiArMjczNSw4IEBAIHN0cnVjdCBleHQ0X2ZpbGVuYW1lIHtcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVU5JQ09ERSlcbiBcdHN0cnVjdCBxc3RyIGNmX25hbWU7XG4gI2VuZGlmXG4rXHQvKiBMVUZJRC9kaXJkYXRhIHBheWxvYWQgdG8gZW1iZWQgaW4gdGhlIG5ldyBkaXJlY3RvcnkgZW50cnksIG9yIE5VTEwgKi9cbitcdHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRmaWQ7XG4gfTtcbiBcbiAjZGVmaW5lIGZuYW1lX25hbWUocCkgKChwKS1cdTAwM2VkaXNrX25hbWUubmFtZSlcbkBAIC0yOTc4LDE4ICszMDQ4LDI3IEBAIGV4dGVybiBpbnQgX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgc3RydWN0IGlub2RlICosXG4gXHR1bmxpa2VseShfX2V4dDRfY2hlY2tfZGlyX2VudHJ5KF9fZnVuY19fLCBfX0xJTkVfXywgKGRpciksIChmaWxwKSwgXFxcbiBcdFx0XHRcdChkZSksIChiaCksIChidWYpLCAoc2l6ZSksIChvZmZzZXQpKSlcbiBleHRlcm4gaW50IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KHN0cnVjdCBmaWxlICpkaXJfZmlsZSwgX191MzIgaGFzaCxcbi1cdFx0XHRcdF9fdTMyIG1pbm9yX2hhc2gsXG4rXHRcdFx0XHRfX3UzMiBtaW5vcl9oYXNoLCBpbnQgYnVmX3NpemUsXG4gXHRcdFx0XHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGlyZW50LFxuIFx0XHRcdFx0c3RydWN0IGZzY3J5cHRfc3RyICplbnRfbmFtZSk7XG4gZXh0ZXJuIHZvaWQgZXh0NF9odHJlZV9mcmVlX2Rpcl9pbmZvKHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpwKTtcbiBleHRlcm4gaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuIFx0XHRcdCAgICAgdm9pZCAqYnVmLCBpbnQgYnVmX3NpemUsXG4gXHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4tXHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmRlc3RfZGUpO1xuLXZvaWQgZXh0NF9pbnNlcnRfZGVudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuLVx0XHRcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcbi1cdFx0XHRpbnQgYnVmX3NpemUsXG4tXHRcdFx0c3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lKTtcbitcdFx0XHQgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqZGVzdF9kZSxcbitcdFx0XHQgICAgIGludCBkbGVuKTtcbit2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuK1x0XHRcdCAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxuK1x0XHRcdCAgICAgaW50IGJ1Zl9zaXplLFxuK1x0XHRcdCAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuK1x0XHRcdCAgICAgdm9pZCAqZGF0YSk7XG4rc3RhdGljIGlubGluZSB2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcbitcdFx0XHRcdCAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcbitcdFx0XHRcdCAgICAgIGludCBidWZfc2l6ZSxcbitcdFx0XHRcdCAgICAgIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSlcbit7XG4rXHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgYnVmX3NpemUsIGZuYW1lLCBOVUxMKTtcbit9XG4gc3RhdGljIGlubGluZSB2b2lkIGV4dDRfdXBkYXRlX2R4X2ZsYWcoc3RydWN0IGlub2RlICppbm9kZSlcbiB7XG4gXHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZGlyX2luZGV4KGlub2RlLVx1MDAzZWlfc2IpIFx1MDAyNlx1MDAyNlxuQEAgLTMwMDMsMTIgKzMwODIsMTQgQEAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXh0NF9maWxldHlwZV90YWJsZVtdID0ge1xuIFx0RFRfVU5LTk9XTiwgRFRfUkVHLCBEVF9ESVIsIERUX0NIUiwgRFRfQkxLLCBEVF9GSUZPLCBEVF9TT0NLLCBEVF9MTktcbiB9O1xuIFxuLXN0YXRpYyBpbmxpbmUgIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSlcbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSlcbiB7XG4tXHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoc2IpIHx8IGZpbGV0eXBlIFx1MDAzZT0gRVhUNF9GVF9NQVgpXG4rXHR1bnNpZ25lZCBjaGFyIGZsX2luZGV4ID0gZmlsZXR5cGUgXHUwMDI2IEVYVDRfRlRfTUFTSztcbitcbitcdGlmICghZXh0NF9oYXNfZmVhdHVyZV9maWxldHlwZShzYikgfHwgZmxfaW5kZXggXHUwMDNlPSBFWFQ0X0ZUX01BWClcbiBcdFx0cmV0dXJuIERUX1VOS05PV047XG4gXG4tXHRyZXR1cm4gZXh0NF9maWxldHlwZV90YWJsZVtmaWxldHlwZV07XG4rXHRyZXR1cm4gZXh0NF9maWxldHlwZV90YWJsZVtmbF9pbmRleF07XG4gfVxuIGV4dGVybiBpbnQgZXh0NF9jaGVja19hbGxfZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXG4gXHRcdFx0ICAgICB2b2lkICpidWYsIGludCBidWZfc2l6ZSk7XG5AQCAtMzIzMSwxMCArMzMxMiwxOCBAQCBleHRlcm4gaW50IGV4dDRfZXh0X21pZ3JhdGUoc3RydWN0IGlub2RlICopO1xuIGV4dGVybiBpbnQgZXh0NF9pbmRfbWlncmF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTtcbiBcbiAvKiBuYW1laS5jICovXG4tZXh0ZXJuIGludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbi1cdFx0XHQgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xuK2V4dGVybiBpbnQgZXh0NF9pbml0X25ld19kaXJfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbitcdFx0XHRcdCAgc3RydWN0IGlub2RlICppbm9kZSxcbitcdFx0XHRcdCAgY29uc3Qgdm9pZCAqZGF0YTEsIGNvbnN0IHZvaWQgKmRhdGEyKTtcbitzdGF0aWMgaW5saW5lIGludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbitcdFx0XHRcdCAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuK3tcbitcdHJldHVybiBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhKGhhbmRsZSwgZGlyLCBpbm9kZSwgTlVMTCwgTlVMTCk7XG4rfVxuIGV4dGVybiBpbnQgZXh0NF9kaXJibG9ja19jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKTtcbitleHRlcm4gaW50IGV4dDRfZGlyZGF0YV9zZXRfbHVmaWQoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLFxuK1x0XHRcdCAgIGludCBuYW1lbGVuLCBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKmVkcCk7XG4gZXh0ZXJuIGludCBleHQ0X2h0cmVlX2ZpbGxfdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIHN0YXJ0X2hhc2gsXG4gXHRcdFx0XHRfX3UzMiBzdGFydF9taW5vcl9oYXNoLCBfX3UzMiAqbmV4dF9oYXNoKTtcbiBleHRlcm4gaW50IGV4dDRfc2VhcmNoX2RpcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuQEAgLTM4MDcsNiArMzg5NiwxMCBAQCBleHRlcm4gaW50IF9fZXh0NF91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsXG4gXHRcdFx0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7XG4gZXh0ZXJuIGludCBfX2V4dDRfbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7XG4rZXh0ZXJuIHVuc2lnbmVkIGNoYXIgZXh0NF9kaXJkYXRhX2dldChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsXG4rXHRcdFx0XHQgICAgICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IGJ1Zl9zaXplLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAgKmx1ZmlkLFxuK1x0XHRcdFx0ICAgICAgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8pO1xuIFxuICNkZWZpbmUgU19TSElGVCAxMlxuIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGV4dDRfdHlwZV9ieV9tb2RlWyhTX0lGTVQgXHUwMDNlXHUwMDNlIFNfU0hJRlQpICsgMV0gPSB7XG5AQCAtNDAwNCw2ICs0MDk3LDEwOSBAQCBzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9jbGVhcl9pb191bndyaXR0ZW5fZmxhZyhleHQ0X2lvX2VuZF90ICppb19lbmQpXG4gXHRcdGlvX2VuZC1cdTAwM2VmbGFnIFx1MDAyNj0gfkVYVDRfSU9fRU5EX1VOV1JJVFRFTjtcbiB9XG4gXG4rLypcbisgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IGRpcmRhdGEgcmVjb3JkIGhlYWRlciBzdGFydGluZyBmcm9tIEBkZGguXG4rICovXG4rI2RlZmluZSBleHQ0X2RpcmRhdGFfbmV4dChkZGgpIFxcXG4rXHQoKHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqKSgoY2hhciAqKShkZGgpICsgKGRkaCktXHUwMDNlZGRoX2xlbmd0aCkpXG4rXG4rLypcbisgKiBleHQ0X2Rpcl9lbnRyeV9pc190YWlsKCkgLSBDaGVjayBpZiBhIGRpcmVjdG9yeSBlbnRyeSBpcyBhIHRhaWwgZW50cnkuXG4rICogQGRlOiBkaXJlY3RvcnkgZW50cnkgdG8gY2hlY2tcbisgKlxuKyAqIFJldHVybnMgdHJ1ZSBpZiBAZGUgaXMgYSBkaXJlY3RvcnkgYmxvY2sgdGFpbCBlbnRyeSAoY2hlY2tzdW0gcmVjb3JkKS5cbisgKi9cbitzdGF0aWMgaW5saW5lIGJvb2wgZXh0NF9kaXJfZW50cnlfaXNfdGFpbChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUpXG4re1xuK1x0c3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKnQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKilkZTtcbitcbitcdHJldHVybiAhdC1cdTAwM2VkZXRfcmVzZXJ2ZWRfemVybzEgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgbGUxNl90b19jcHUodC1cdTAwM2VkZXRfcmVjX2xlbikgPT0gc2l6ZW9mKCp0KSBcdTAwMjZcdTAwMjZcbitcdCAgICAgICAhdC1cdTAwM2VkZXRfcmVzZXJ2ZWRfemVybzIgXHUwMDI2XHUwMDI2XG4rXHQgICAgICAgdC1cdTAwM2VkZXRfcmVzZXJ2ZWRfZnQgPT0gRVhUNF9GVF9ESVJfQ1NVTTtcbit9XG4rXG4rLypcbisgKiBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oKSAtIENvbXB1dGUgdGhlIHRvdGFsIGRpcmRhdGEgbGVuZ3RoIGZvciBhbiBlbnRyeS5cbisgKiBAZGU6IGRpcmVjdG9yeSBlbnRyeVxuKyAqIEByZWNfbGVuOiB0aGUgcmVjb3JkIGxlbmd0aCBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5IChkZWNvZGVkKVxuKyAqXG4rICogQ29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBvcHRpb25hbCBkYXRhIHN0b3JlZCBhZnRlciB0aGUgZmlsZW5hbWUgKGFuZCBpdHNcbisgKiBpbXBsaWNpdCBOVUwgdGVybWluYXRvcikuICBFYWNoIGV4dGVuc2lvbiBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlXG4rICogaGlnaCA0IGJpdHMgb2YgZGUtXHUwMDNlZmlsZV90eXBlOyB0aGUgZmlyc3QgYnl0ZSBvZiBlYWNoIGV4dGVuc2lvbiBpcyBpdHNcbisgKiBsZW5ndGggKGluY2x1ZGluZyB0aGF0IGxlbmd0aCBieXRlIGl0c2VsZikuXG4rICpcbisgKiBSZXR1cm5zIDAgZm9yIHRhaWwgZW50cmllcyBhbmQgZm9yIGVudHJpZXMgd2l0aCBubyBkaXJkYXRhLlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgaW50IGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsXG4rXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGludCByZWNfbGVuKVxuK3tcbitcdF9fdTggZXh0cmFfZGF0YV9mbGFncztcbitcdHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqZGRoO1xuK1x0aW50IGRsZW4gPSAwO1xuK1x0dW5zaWduZWQgaW50IG9mZnNldDtcbitcbitcdGlmIChleHQ0X2Rpcl9lbnRyeV9pc190YWlsKGRlKSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRleHRyYV9kYXRhX2ZsYWdzID0gKGRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjYgfkVYVDRfRlRfTUFTSykgXHUwMDNlXHUwMDNlIDQ7XG4rXHQvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBlbnRyeSB0byBhZnRlciBmaWxlbmFtZSArIE5VTCAqL1xuK1x0b2Zmc2V0ID0gRVhUNF9CQVNFX0RJUl9MRU4gKyBkZS1cdTAwM2VuYW1lX2xlbiArIDE7XG4rXG4rXHQvKiBib3VuZHMgY2hlY2s6IGVuc3VyZSB3ZSBzdGFydCByZWFkaW5nIHdpdGhpbiB0aGUgZW50cnkgKi9cbitcdGlmIChvZmZzZXQgXHUwMDNlPSByZWNfbGVuKVxuK1x0XHRyZXR1cm4gMDtcbitcbitcdGRkaCA9IChzdHJ1Y3QgZXh0NF9kaXJlbnRfZGF0YV9oZWFkZXIgKikoKGNoYXIgKilkZSArIG9mZnNldCk7XG4rXG4rXHR3aGlsZSAoZXh0cmFfZGF0YV9mbGFncykge1xuK1x0XHRpZiAoZXh0cmFfZGF0YV9mbGFncyBcdTAwMjYgMSkge1xuK1x0XHRcdC8qIGJvdW5kcyBjaGVjayBiZWZvcmUgcmVhZGluZyBkZGhfbGVuZ3RoICovXG4rXHRcdFx0aWYgKG9mZnNldCArIHNpemVvZigqZGRoKSBcdTAwM2UgcmVjX2xlbilcbitcdFx0XHRcdHJldHVybiBkbGVuO1xuK1xuK1x0XHRcdC8qIHZhbGlkYXRlIGRkaF9sZW5ndGggaXMgcmVhc29uYWJsZSDigJQgcmVhZCBvbmNlIHRvXG4rXHRcdFx0ICogYXZvaWQgYSBUT0NUT1UgZG91YmxlLWZldGNoIG9uIHRoZSBkaXNrIGZpZWxkICovXG4rXHRcdFx0e1xuK1x0XHRcdFx0dTggZGRoX2xlbiA9IGRkaC1cdTAwM2VkZGhfbGVuZ3RoO1xuK1xuK1x0XHRcdFx0aWYgKGRkaF9sZW4gPT0gMCB8fCBkZGhfbGVuIFx1MDAzZSByZWNfbGVuIC0gb2Zmc2V0KVxuK1x0XHRcdFx0XHRyZXR1cm4gZGxlbjtcbitcdFx0XHRcdGRsZW4gKz0gZGRoX2xlbiArIChkbGVuID09IDApO1xuK1x0XHRcdFx0b2Zmc2V0ICs9IGRkaF9sZW47XG4rXHRcdFx0fVxuK1x0XHRcdGRkaCA9IGV4dDRfZGlyZGF0YV9uZXh0KGRkaCk7XG4rXHRcdH1cbitcdFx0ZXh0cmFfZGF0YV9mbGFncyBcdTAwM2VcdTAwM2U9IDE7XG4rXHR9XG4rXHRyZXR1cm4gZGxlbjtcbit9XG4rXG4rLypcbisgKiBleHQ0X2Rpcl9lbnRyeV9sZW4oKSAtIENvbXB1dGUgdGhlIHJlcXVpcmVkIHJlY19sZW4gZm9yIGEgZGlyZWN0b3J5IGVudHJ5LlxuKyAqIEBkZTogICAgICAgIGRpcmVjdG9yeSBlbnRyeSAodXNlZCB0byByZWFkIG5hbWVfbGVuIGFuZCBhbnkgZGlyZGF0YSBsZW5ndGgpXG4rICogQGJsb2Nrc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIEBkZSBsaXZlcyBpbiAodGhlIHJlYWwgZGlyZWN0b3J5IGJsb2NrXG4rICogICAgICAgICAgICAgc2l6ZSwgb3IgdGhlIHNtYWxsZXIgaW5saW5lLWRhdGEgYnVmZmVyIHNpemUgZm9yIGlubGluZVxuKyAqICAgICAgICAgICAgIGRpcmVjdG9yaWVzKSAtLSB1c2VkIG9ubHkgdG8gZGVjb2RlIEBkZS1cdTAwM2VyZWNfbGVuJ3MgXCIwLzY1NTM1XG4rICogICAgICAgICAgICAgbWVhbnMgcmVzdCBvZiBidWZmZXJcIiBzZW50aW5lbCBjb3JyZWN0bHkuXG4rICogQGRpcjogICAgICAgZGlyZWN0b3J5IGlub2RlIChtYXkgYmUgTlVMTCBmb3IgJy4nIGFuZCAnLi4nIGVudHJpZXMsIHdoaWNoXG4rICogICAgICAgICAgICAgbmV2ZXIgY2FycnkgdGhlIGNhc2Vmb2xkK2ZzY3J5cHQgaGFzaCByZWdhcmRsZXNzIG9mIHRoZVxuKyAqICAgICAgICAgICAgIGRpcmVjdG9yeSdzIGZlYXR1cmUgZmxhZ3MpXG4rICpcbisgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHJlY29yZCBsZW5ndGggbmVlZGVkIHRvIGhvbGQgQGRlLCByb3VuZGVkIHVwIHRvIHRoZVxuKyAqIGRpcmVjdG9yeSBhbGlnbm1lbnQgYW5kIGluY2x1ZGluZyByb29tIGZvciB0aGUgY2FzZWZvbGQrZnNjcnlwdCBoYXNoIGlmXG4rICogdGhlIGRpcmVjdG9yeSByZXF1aXJlcyBpdC5cbisgKi9cbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQ0X2Rpcl9lbnRyeV9sZW4oc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxuK1x0XHRcdFx0XHQgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tzaXplLFxuK1x0XHRcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpcilcbit7XG4rXHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcbitcdHVuc2lnbmVkIGludCBkaXJkYXRhID0gZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKGRlLCByZWNfbGVuKTtcbitcbitcdHJldHVybiBleHQ0X2RpcmVudF9yZWNfbGVuKGRlLVx1MDAzZW5hbWVfbGVuICsgZGlyZGF0YSwgZGlyKTtcbit9XG4rXG4gZXh0ZXJuIGNvbnN0IHN0cnVjdCBpb21hcF9vcHMgZXh0NF9pb21hcF9vcHM7XG4gZXh0ZXJuIGNvbnN0IHN0cnVjdCBpb21hcF9vcHMgZXh0NF9pb21hcF9yZXBvcnRfb3BzO1xuIFxuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmFzdF9jb21taXQuYyBiL2ZzL2V4dDQvZmFzdF9jb21taXQuY1xuaW5kZXggOGUyMjU5Nzk5NjE0ZTkuLjAwNmQ0NWU5Y2U4Nzk4IDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jXG4rKysgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmNcbkBAIC0yNjk3LDYgKzI2OTcsNyBAQCBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZjX2luZWxpZ2libGVfcmVhc29uc1tdID0ge1xuIFx0W0VYVDRfRkNfUkVBU09OX01JR1JBVEVdID0gXCJJbm9kZSBmb3JtYXQgbWlncmF0aW9uXCIsXG4gXHRbRVhUNF9GQ19SRUFTT05fVkVSSVRZXSA9IFwiZnMtdmVyaXR5IGVuYWJsZVwiLFxuIFx0W0VYVDRfRkNfUkVBU09OX01PVkVfRVhUXSA9IFwiTW92ZSBleHRlbnRzXCIsXG4rXHRbRVhUNF9GQ19SRUFTT05fRElSREFUQV0gPSBcIkRpcmRhdGEgTFVGSUQgKG5vdCByZWNvcmRlZCBieSBmYXN0LWNvbW1pdClcIixcbiB9O1xuIFxuIGludCBleHQ0X2ZjX2luZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbmRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29tbWl0LmggYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmhcbmluZGV4IDJmNzdhMzdmYjEwMTgwLi44OTlmYWViNGU2ZTA2NCAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvZmFzdF9jb21taXQuaFxuKysrIGIvZnMvZXh0NC9mYXN0X2NvbW1pdC5oXG5AQCAtMTAwLDYgKzEwMCw3IEBAIGVudW0ge1xuIFx0RVhUNF9GQ19SRUFTT05fTUlHUkFURSxcbiBcdEVYVDRfRkNfUkVBU09OX1ZFUklUWSxcbiBcdEVYVDRfRkNfUkVBU09OX01PVkVfRVhULFxuK1x0RVhUNF9GQ19SRUFTT05fRElSREFUQSxcbiBcdEVYVDRfRkNfUkVBU09OX01BWFxuIH07XG4gXG5kaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbmxpbmUuYyBiL2ZzL2V4dDQvaW5saW5lLmNcbmluZGV4IDgwNDVlNGZmMjcwYzdmLi4xYmJmODllMTgwNzZmNCAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvaW5saW5lLmNcbisrKyBiL2ZzL2V4dDQvaW5saW5lLmNcbkBAIC05NzMsMTEgKzk3MywyMCBAQCBzdGF0aWMgaW50IGV4dDRfYWRkX2RpcmVudF90b19pbmxpbmUoaGFuZGxlX3QgKmhhbmRsZSxcbiBcdFx0XHRcdCAgICAgc3RydWN0IGV4dDRfaWxvYyAqaWxvYyxcbiBcdFx0XHRcdCAgICAgdm9pZCAqaW5saW5lX3N0YXJ0LCBpbnQgaW5saW5lX3NpemUpXG4ge1xuLVx0aW50XHRcdGVycjtcbitcdGludFx0XHRlcnIsIGRsZW4gPSAwO1xuIFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlO1xuK1x0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZCA9IE5VTEw7XG4rXG4rXHQvKiBmbmFtZS1cdTAwM2VkZmlkIHdhcyBzZXQgaW4gZXh0NF9hZGRfZW50cnkoKSAqL1xuK1x0ZGZpZCA9IGZuYW1lLVx1MDAzZWRmaWQ7XG4rXHRpZiAoZGZpZClcbitcdFx0ZGxlbiA9IGRmaWQtXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XG4rXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShkaXItXHUwMDNlaV9zYikpXG4rXHRcdGRsZW4gKz0gc2l6ZW9mKHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoKTtcbiBcbiBcdGVyciA9IGV4dDRfZmluZF9kZXN0X2RlKGRpciwgaWxvYy1cdTAwM2ViaCwgaW5saW5lX3N0YXJ0LFxuLVx0XHRcdFx0aW5saW5lX3NpemUsIGZuYW1lLCBcdTAwMjZkZSk7XG4rXHRcdFx0XHRpbmxpbmVfc2l6ZSwgZm5hbWUsIFx1MDAyNmRlLCBkbGVuKTtcbiBcdGlmIChlcnIpXG4gXHRcdHJldHVybiBlcnI7XG4gXG5AQCAtOTg2LDcgKzk5NSw3IEBAIHN0YXRpYyBpbnQgZXh0NF9hZGRfZGlyZW50X3RvX2lubGluZShoYW5kbGVfdCAqaGFuZGxlLFxuIFx0XHRcdFx0XHQgICAgRVhUNF9KVFJfTk9ORSk7XG4gXHRpZiAoZXJyKVxuIFx0XHRyZXR1cm4gZXJyO1xuLVx0ZXh0NF9pbnNlcnRfZGVudHJ5KGRpciwgaW5vZGUsIGRlLCBpbmxpbmVfc2l6ZSwgZm5hbWUpO1xuK1x0ZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGEoZGlyLCBpbm9kZSwgZGUsIGlubGluZV9zaXplLCBmbmFtZSwgZGZpZCk7XG4gXG4gXHRleHQ0X3Nob3dfaW5saW5lX2RpcihkaXIsIGlsb2MtXHUwMDNlYmgsIGlubGluZV9zdGFydCwgaW5saW5lX3NpemUpO1xuIFxuQEAgLTEwNTUsNyArMTA2NCw3IEBAIHN0YXRpYyBpbnQgZXh0NF91cGRhdGVfaW5saW5lX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdGludCBvbGRfc2l6ZSA9IEVYVDRfSShkaXIpLVx1MDAzZWlfaW5saW5lX3NpemUgLSBFWFQ0X01JTl9JTkxJTkVfREFUQV9TSVpFO1xuIFx0aW50IG5ld19zaXplID0gZ2V0X21heF9pbmxpbmVfeGF0dHJfdmFsdWVfc2l6ZShkaXIsIGlsb2MpO1xuIFxuLVx0aWYgKG5ld19zaXplIC0gb2xkX3NpemUgXHUwMDNjPSBleHQ0X2Rpcl9yZWNfbGVuKDEsIE5VTEwpKVxuK1x0aWYgKG5ld19zaXplIC0gb2xkX3NpemUgXHUwMDNjPSBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIE5VTEwpKVxuIFx0XHRyZXR1cm4gLUVOT1NQQztcbiBcbiBcdHJldCA9IGV4dDRfdXBkYXRlX2lubGluZV9kYXRhKGhhbmRsZSwgZGlyLFxuQEAgLTEyNjQsNiArMTI3Myw3IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdGludCBlcnIgPSAwLCBjb3VudCA9IDA7XG4gXHR1bnNpZ25lZCBpbnQgcGFyZW50X2lubztcbiBcdGludCBwb3M7XG4rXHR1bnNpZ25lZCBpbnQgZGVfbGVuO1xuIFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlO1xuIFx0c3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZGlyX2ZpbGUpO1xuIFx0aW50IHJldCwgaW5saW5lX3NpemUgPSAwO1xuQEAgLTEzMDksNyArMTMxOSw3IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdFx0XHRmYWtlLm5hbWVfbGVuID0gMTtcbiBcdFx0XHRtZW1jcHkoZmFrZS5uYW1lLCBcIi5cIiwgMik7XG4gXHRcdFx0ZmFrZS5yZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soXG4tXHRcdFx0XHRcdCAgZXh0NF9kaXJfcmVjX2xlbihmYWtlLm5hbWVfbGVuLCBOVUxMKSxcbitcdFx0XHRcdFx0ICBleHQ0X2RpcmVudF9yZWNfbGVuKGZha2UubmFtZV9sZW4sIE5VTEwpLFxuIFx0XHRcdFx0XHQgIGlubGluZV9zaXplKTtcbiBcdFx0XHRleHQ0X3NldF9kZV90eXBlKGlub2RlLVx1MDAzZWlfc2IsIFx1MDAyNmZha2UsIFNfSUZESVIpO1xuIFx0XHRcdGRlID0gXHUwMDI2ZmFrZTtcbkBAIC0xMzE5LDI2ICsxMzI5LDM0IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdFx0XHRmYWtlLm5hbWVfbGVuID0gMjtcbiBcdFx0XHRtZW1jcHkoZmFrZS5uYW1lLCBcIi4uXCIsIDMpO1xuIFx0XHRcdGZha2UucmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKFxuLVx0XHRcdFx0XHQgIGV4dDRfZGlyX3JlY19sZW4oZmFrZS5uYW1lX2xlbiwgTlVMTCksXG4rXHRcdFx0XHRcdCAgZXh0NF9kaXJlbnRfcmVjX2xlbihmYWtlLm5hbWVfbGVuLCBOVUxMKSxcbiBcdFx0XHRcdFx0ICBpbmxpbmVfc2l6ZSk7XG4gXHRcdFx0ZXh0NF9zZXRfZGVfdHlwZShpbm9kZS1cdTAwM2VpX3NiLCBcdTAwMjZmYWtlLCBTX0lGRElSKTtcbiBcdFx0XHRkZSA9IFx1MDAyNmZha2U7XG4gXHRcdFx0cG9zID0gRVhUNF9JTkxJTkVfRE9URE9UX1NJWkU7XG4gXHRcdH0gZWxzZSB7XG4rXHRcdFx0aWYgKHBvcyArIEVYVDRfQkFTRV9ESVJfTEVOIFx1MDAzZSBpbmxpbmVfc2l6ZSkge1xuK1x0XHRcdFx0cmV0ID0gY291bnQ7XG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHR9XG4gXHRcdFx0ZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoZGlyX2J1ZiArIHBvcyk7XG4tXHRcdFx0cG9zICs9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbiwgaW5saW5lX3NpemUpO1xuK1x0XHRcdGRlX2xlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbiwgaW5saW5lX3NpemUpO1xuK1x0XHRcdGlmIChkZV9sZW4gXHUwMDNjIEVYVDRfQkFTRV9ESVJfTEVOIHx8XG4rXHRcdFx0ICAgIHBvcyArIGRlX2xlbiBcdTAwM2UgKHVuc2lnbmVkIGludClpbmxpbmVfc2l6ZSkge1xuK1x0XHRcdFx0cmV0ID0gY291bnQ7XG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHR9XG4gXHRcdFx0aWYgKGV4dDRfY2hlY2tfZGlyX2VudHJ5KGlub2RlLCBkaXJfZmlsZSwgZGUsXG4gXHRcdFx0XHRcdCBpbG9jLmJoLCBkaXJfYnVmLFxuIFx0XHRcdFx0XHQgaW5saW5lX3NpemUsIHBvcykpIHtcbiBcdFx0XHRcdHJldCA9IGNvdW50O1xuIFx0XHRcdFx0Z290byBvdXQ7XG4gXHRcdFx0fVxuK1x0XHRcdHBvcyArPSBkZV9sZW47XG4gXHRcdH1cbiBcbi1cdFx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkge1xuLVx0XHRcdGhpbmZvLVx1MDAzZWhhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTtcbi1cdFx0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gRVhUNF9ESVJFTlRfTUlOT1JfSEFTSChkZSk7XG4tXHRcdH0gZWxzZSB7XG4rXHRcdGlmICghKGV4dDRfZGlyZGF0YV9nZXQoZGUsIGRpciwgaW5saW5lX3NpemUsIE5VTEwsIGhpbmZvKSBcdTAwMjZcbitcdFx0XHRcdFx0XHRcdEVYVDRfRElSRU5UX0NGSEFTSCkpIHtcbiBcdFx0XHRlcnIgPSBleHQ0ZnNfZGlyaGFzaChkaXIsIGRlLVx1MDAzZW5hbWUsIGRlLVx1MDAzZW5hbWVfbGVuLCBoaW5mbyk7XG4gXHRcdFx0aWYgKGVycikge1xuIFx0XHRcdFx0cmV0ID0gZXJyO1xuQEAgLTEzNTQsNyArMTM3Miw4IEBAIGludCBleHQ0X2lubGluZWRpcl90b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdFx0dG1wX3N0ci5uYW1lID0gZGUtXHUwMDNlbmFtZTtcbiBcdFx0dG1wX3N0ci5sZW4gPSBkZS1cdTAwM2VuYW1lX2xlbjtcbiBcdFx0ZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsIGhpbmZvLVx1MDAzZWhhc2gsXG4tXHRcdFx0XHRcdCAgICAgIGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gsIGRlLCBcdTAwMjZ0bXBfc3RyKTtcbitcdFx0XHRcdFx0ICAgICAgaGluZm8tXHUwMDNlbWlub3JfaGFzaCwgaW5saW5lX3NpemUsXG4rXHRcdFx0XHRcdCAgICAgIGRlLCBcdTAwMjZ0bXBfc3RyKTtcbiBcdFx0aWYgKGVycikge1xuIFx0XHRcdHJldCA9IGVycjtcbiBcdFx0XHRnb3RvIG91dDtcbkBAIC0xNDI3LDggKzE0NDYsOCBAQCBpbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsXG4gXHQgKiBTbyB3ZSB3aWxsIHVzZSBleHRyYV9vZmZzZXQgYW5kIGV4dHJhX3NpemUgdG8gaW5kaWNhdGUgdGhlbVxuIFx0ICogZHVyaW5nIHRoZSBpbmxpbmUgZGlyIGl0ZXJhdGlvbi5cbiBcdCAqL1xuLVx0ZG90ZG90X29mZnNldCA9IGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCk7XG4tXHRkb3Rkb3Rfc2l6ZSA9IGRvdGRvdF9vZmZzZXQgKyBleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpO1xuK1x0ZG90ZG90X29mZnNldCA9IGV4dDRfZGlyZW50X3JlY19sZW4oMSwgTlVMTCk7XG4rXHRkb3Rkb3Rfc2l6ZSA9IGRvdGRvdF9vZmZzZXQgKyBleHQ0X2RpcmVudF9yZWNfbGVuKDIsIE5VTEwpO1xuIFx0ZXh0cmFfb2Zmc2V0ID0gZG90ZG90X3NpemUgLSBFWFQ0X0lOTElORV9ET1RET1RfU0laRTtcbiBcdGV4dHJhX3NpemUgPSBleHRyYV9vZmZzZXQgKyBpbmxpbmVfc2l6ZTtcbiBcbkBAIC0xNDYzLDcgKzE0ODIsNyBAQCBpbnQgZXh0NF9yZWFkX2lubGluZV9kaXIoc3RydWN0IGZpbGUgKmZpbGUsXG4gXHRcdFx0ICogZmFpbHVyZSB3aWxsIGJlIGRldGVjdGVkIGluIHRoZVxuIFx0XHRcdCAqIGRpcmVudCB0ZXN0IGJlbG93LiAqL1xuIFx0XHRcdGlmIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sIGV4dHJhX3NpemUpXG4tXHRcdFx0XHRcdTAwM2MgZXh0NF9kaXJfcmVjX2xlbigxLCBOVUxMKSlcbitcdFx0XHRcdFx1MDAzYyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIE5VTEwpKVxuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0aSArPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sXG4gXHRcdFx0XHRcdFx0ICAgIGV4dHJhX3NpemUpO1xuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaW9jdGwuYyBiL2ZzL2V4dDQvaW9jdGwuY1xuaW5kZXggYzgzODdlNmEyYzZlOTAuLmI1NDIxZDU5ZjdhMDMyIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9pb2N0bC5jXG4rKysgYi9mcy9leHQ0L2lvY3RsLmNcbkBAIC0xNTM1LDYgKzE1MzUsODcgQEAgc3RhdGljIGludCBleHQ0X2lvY3RsX3NldF90dW5lX3NiKHN0cnVjdCBmaWxlICpmaWxwLFxuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rLypcbisgKiBleHQ0X2lvY3RsX3NldF9sdWZpZCgpIC0gU2V0IExVRklEIG9uIGEgZGlyZWN0b3J5IGVudHJ5XG4rICogQGZpbHA6XHRmaWxlIHBvaW50ZXIgKHBhcmVudCBkaXJlY3RvcnkpXG4rICogQGFyZzpcdHBvaW50ZXIgdG8gZXh0NF9zZXRfbHVmaWQgc3RydWN0dXJlIHdpdGggZmlsZW5hbWUgYW5kIExVRklEIGRhdGFcbisgKlxuKyAqIFRoaXMgaW9jdGwgYWxsb3dzIHNldHRpbmcgTFVGSUQgZGF0YSBvbiBhbiBleGlzdGluZ1xuKyAqIGRpcmVjdG9yeSBlbnRyeS4gSXQgaXMgY2FsbGVkIG9uIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHdpdGggYSBmaWxlbmFtZSBhbmRcbisgKiBMVUZJRCBkYXRhLlxuKyAqL1xuK3N0YXRpYyBsb25nIGV4dDRfaW9jdGxfc2V0X2x1ZmlkKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZylcbit7XG4rXHRzdHJ1Y3QgaW5vZGUgKmRpciA9IGZpbGVfaW5vZGUoZmlscCk7XG4rXHRzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCA9IGZpbGVfbW50X2lkbWFwKGZpbHApO1xuK1x0c3RydWN0IGV4dDRfc2V0X2x1ZmlkIGx1ZmlkX2FyZ3M7XG4rXHRzdHJ1Y3Qge1xuK1x0XHRfX3UzMiBlZHBfbWFnaWM7XG4rXHRcdHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciBkZl9oZWFkZXI7XG4rXHRcdGNoYXIgZGZfZmlkWzI1NV07XG4rXHR9IGVkcDtcbitcdGludCBlcnI7XG4rXG4rXHQvKiBDaGVjayBpZiBwYXJlbnQgaXMgYSBkaXJlY3RvcnkgKi9cbitcdGlmICghU19JU0RJUihkaXItXHUwMDNlaV9tb2RlKSlcbitcdFx0cmV0dXJuIC1FTk9URElSO1xuK1xuK1x0LyogVGhpcyBpb2N0bCBtdXRhdGVzIGRpcmVjdG9yeSBlbnRyaWVzOyBtZXJlbHkgaGF2aW5nIHRoZSBkaXJlY3RvcnlcbitcdCAqIG9wZW4gKHdoaWNoIG9ubHkgZXZlciByZXF1aXJlcyByZWFkIGFjY2VzcykgaXMgbm90IGVub3VnaCAqL1xuK1x0ZXJyID0gaW5vZGVfcGVybWlzc2lvbihpZG1hcCwgZGlyLCBNQVlfV1JJVEUpO1xuK1x0aWYgKGVycilcbitcdFx0cmV0dXJuIGVycjtcbitcbitcdC8qIENvcHkgYXJndW1lbnRzIGZyb20gdXNlciBzcGFjZSAqL1xuK1x0aWYgKGNvcHlfZnJvbV91c2VyKFx1MDAyNmx1ZmlkX2FyZ3MsIChzdHJ1Y3QgZXh0NF9zZXRfbHVmaWQgX191c2VyICopYXJnLFxuK1x0XHRcdCAgIHNpemVvZihsdWZpZF9hcmdzKSkpXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1xuK1x0LyogVmFsaWRhdGUgcGFyYW1ldGVycy4gIGVzbF9uYW1lX2xlbiBpcyBOVUwtZXhjbHVkZWQgbGVuZ3RoICgxLTI1NSkuICovXG4rXHRpZiAobHVmaWRfYXJncy5lc2xfbmFtZV9sZW4gPT0gMCB8fCBsdWZpZF9hcmdzLmVzbF9uYW1lX2xlbiBcdTAwM2UgRVhUNF9OQU1FX0xFTilcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHQvKiBkZGhfbGVuZ3RoIChlc2xfZGF0YV9sZW4gKyB0aGUgaGVhZGVyIGJ5dGUgYmVsb3cpIG11c3QgaXRzZWxmIGZpdFxuK1x0ICogaW4gdGhlIF9fdTggZGRoX2xlbmd0aCBmaWVsZCB3aXRob3V0IHdyYXBwaW5nICovXG4rXHRpZiAobHVmaWRfYXJncy5lc2xfZGF0YV9sZW4gPT0gMCB8fFxuK1x0ICAgIGx1ZmlkX2FyZ3MuZXNsX2RhdGFfbGVuIFx1MDAzZSAyNTUgLSBzaXplb2YoZWRwLmRmX2hlYWRlcikpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0LyogRW5zdXJlIGZpbGVuYW1lIGlzIE5VTC10ZXJtaW5hdGVkIGF0IGV4YWN0bHkgZXNsX25hbWVfbGVuICovXG4rXHRpZiAobHVmaWRfYXJncy5lc2xfbmFtZVtsdWZpZF9hcmdzLmVzbF9uYW1lX2xlbl0gIT0gJ1xcMCcpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0LyogJy4nIGFuZCAnLi4nIGFyZSBub3Qgb3JkaW5hcnkgZW50cmllcyAtLSB0aGV5IG11c3Qgc3RheSB0aGUgZmlyc3RcbitcdCAqIHR3byBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkncyBmaXJzdCBibG9jaywgc28gdGhleSBjYW4ndCBnb1xuK1x0ICogdGhyb3VnaCB0aGUgZ2VuZXJhbCBkZWxldGUrcmUtYWRkIHBhdGggdGhpcyBpb2N0bCB1c2VzICovXG4rXHRpZiAoIXN0cmNtcChsdWZpZF9hcmdzLmVzbF9uYW1lLCBcIi5cIikgfHwgIXN0cmNtcChsdWZpZF9hcmdzLmVzbF9uYW1lLCBcIi4uXCIpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdC8qIFByZXBhcmUgdGhlIGRlbnRyeSBwYXJhbSBzdHJ1Y3Qgd2l0aCBMVUZJRCBkYXRhLiBkZGhfbGVuZ3RoIGlzXG4rXHQgKiBkb2N1bWVudGVkIChzZWUgc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyKSBhcyB0aGUgbGVuZ3RoIG9mXG4rXHQgKiB0aGUgaGVhZGVyIHBsdXMgdGhlIHdob2xlIGRhdGEgYmxvYiAtLSBpbmNsdWRlIHRoZSBoZWFkZXIgaGVyZSBzb1xuK1x0ICogZXZlcnkgZGlyZGF0YSByZWFkZXIvd3JpdGVyIHRoYXQgdGFrZXMgZGRoX2xlbmd0aCBhdCBmYWNlIHZhbHVlXG4rXHQgKiAoZS5nLiBleHQ0X2RpcmRhdGFfc2V0KCkncyBtZW1jcHkpIGNvcGllcyB0aGUgZnVsbCBMVUZJRCBwYXlsb2FkXG4rXHQgKiBpbnN0ZWFkIG9mIHNpbGVudGx5IGRyb3BwaW5nIGl0cyBsYXN0IGJ5dGUuICovXG4rXHRlZHAuZWRwX21hZ2ljID0gRVhUNF9MVUZJRF9NQUdJQztcbitcdGVkcC5kZl9oZWFkZXIuZGRoX2xlbmd0aCA9IGx1ZmlkX2FyZ3MuZXNsX2RhdGFfbGVuICtcbitcdFx0XHRcdCAgICBzaXplb2YoZWRwLmRmX2hlYWRlcik7XG4rXHRtZW1jcHkoZWRwLmRmX2ZpZCwgbHVmaWRfYXJncy5lc2xfZGF0YSwgbHVmaWRfYXJncy5lc2xfZGF0YV9sZW4pO1xuK1xuK1x0LyogV2FudCB3cml0ZSBhY2Nlc3MgKi9cbitcdGVyciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0LyogQ2FsbCB0aGUgaGVscGVyIGZ1bmN0aW9uIHRvIGRvIHRoZSBhY3R1YWwgd29yayAqL1xuK1x0ZXJyID0gZXh0NF9kaXJkYXRhX3NldF9sdWZpZChkaXIsIGx1ZmlkX2FyZ3MuZXNsX25hbWUsXG4rXHRcdFx0XHQgICAgbHVmaWRfYXJncy5lc2xfbmFtZV9sZW4sXG4rXHRcdFx0XHQgICAgKHN0cnVjdCBleHQ0X2RlbnRyeV9wYXJhbSAqKVx1MDAyNmVkcCk7XG4rXG4rXHRtbnRfZHJvcF93cml0ZV9maWxlKGZpbHApO1xuK1x0cmV0dXJuIGVycjtcbit9XG4rXG4gc3RhdGljIGxvbmcgX19leHQ0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcbiB7XG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTtcbkBAIC0xOTIxLDYgKzIwMDIsOCBAQCBzdGF0aWMgbG9uZyBfX2V4dDRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIFx0XHRcdFx0XHQgICAgICAodm9pZCBfX3VzZXIgKilhcmcpO1xuIFx0Y2FzZSBFWFQ0X0lPQ19TRVRfVFVORV9TQl9QQVJBTTpcbiBcdFx0cmV0dXJuIGV4dDRfaW9jdGxfc2V0X3R1bmVfc2IoZmlscCwgKHZvaWQgX191c2VyICopYXJnKTtcbitcdGNhc2UgRVhUNF9JT0NfU0VUX0xVRklEOlxuK1x0XHRyZXR1cm4gZXh0NF9pb2N0bF9zZXRfbHVmaWQoZmlscCwgYXJnKTtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiAtRU5PVFRZO1xuIFx0fVxuQEAgLTIwMDAsNiArMjA4Myw3IEBAIGxvbmcgZXh0NF9jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxuIFx0Y2FzZSBGU19JT0NfU0VURlNMQUJFTDpcbiBcdGNhc2UgRVhUNF9JT0NfR0VURlNVVUlEOlxuIFx0Y2FzZSBFWFQ0X0lPQ19TRVRGU1VVSUQ6XG4rXHRjYXNlIEVYVDRfSU9DX1NFVF9MVUZJRDpcbiBcdFx0YnJlYWs7XG4gXHRkZWZhdWx0OlxuIFx0XHRyZXR1cm4gLUVOT0lPQ1RMQ01EO1xuZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuY1xuaW5kZXggY2M0OWFlMDRhNmY2NDkuLmJhMzllY2M2OTBiYzJkIDEwMDY0NFxuLS0tIGEvZnMvZXh0NC9uYW1laS5jXG4rKysgYi9mcy9leHQ0L25hbWVpLmNcbkBAIC0xMDIsNyArMTAyLDcgQEAgc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqZXh0NF9hcHBlbmQoaGFuZGxlX3QgKmhhbmRsZSxcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X2R4X2NzdW1fdmVyaWZ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4tXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50KTtcbitcdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCk7XG4gXG4gLypcbiAgKiBIaW50cyB0byBleHQ0X3JlYWRfZGlyYmxvY2sgcmVnYXJkaW5nIHdoZXRoZXIgd2UgZXhwZWN0IGEgZGlyZWN0b3J5XG5AQCAtMTI4LDcgKzEyOCw3IEBAIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fZXh0NF9yZWFkX2RpcmJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRcdFx0XHRcdFx0dW5zaWduZWQgaW50IGxpbmUpXG4ge1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDtcbi1cdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50O1xuK1x0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudDtcbiBcdGludCBpc19keF9ibG9jayA9IDA7XG4gXG4gXHRpZiAoYmxvY2sgXHUwMDNlPSBpbm9kZS1cdTAwM2VpX3NpemUgXHUwMDNlXHUwMDNlIGlub2RlLVx1MDAzZWlfYmxrYml0cykge1xuQEAgLTE2MCw3ICsxNjAsNyBAQCBzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpfX2V4dDRfcmVhZF9kaXJibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0fVxuIFx0aWYgKCFiaClcbiBcdFx0cmV0dXJuIE5VTEw7XG4tXHRkaXJlbnQgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopIGJoLVx1MDAzZWJfZGF0YTtcbitcdGRpcmVudCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSBiaC1cdTAwM2ViX2RhdGE7XG4gXHQvKiBEZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhbiBpbmRleCBibG9jayAqL1xuIFx0aWYgKGlzX2R4KGlub2RlKSkge1xuIFx0XHRpZiAoYmxvY2sgPT0gMClcbkBAIC0yNDQsMjIgKzI0NCwxMyBAQCBzdHJ1Y3QgZHhfZW50cnlcbiAgKiBoYXNoIHZlcnNpb24gbW9kIDQgc2hvdWxkIG5ldmVyIGJlIDAuICBTaW5jZXJlbHksIHRoZSBwYXJhbm9pYSBkZXBhcnRtZW50LlxuICAqL1xuIFxuLXN0cnVjdCBkeF9yb290XG4rc3RydWN0IGR4X3Jvb3RfaW5mb1xuIHtcbi1cdHN0cnVjdCBmYWtlX2RpcmVudCBkb3Q7XG4tXHRjaGFyIGRvdF9uYW1lWzRdO1xuLVx0c3RydWN0IGZha2VfZGlyZW50IGRvdGRvdDtcbi1cdGNoYXIgZG90ZG90X25hbWVbNF07XG4tXHRzdHJ1Y3QgZHhfcm9vdF9pbmZvXG4tXHR7XG4tXHRcdF9fbGUzMiByZXNlcnZlZF96ZXJvO1xuLVx0XHR1OCBoYXNoX3ZlcnNpb247XG4tXHRcdHU4IGluZm9fbGVuZ3RoOyAvKiA4ICovXG4tXHRcdHU4IGluZGlyZWN0X2xldmVscztcbi1cdFx0dTggdW51c2VkX2ZsYWdzO1xuLVx0fVxuLVx0aW5mbztcbi1cdHN0cnVjdCBkeF9lbnRyeVx0ZW50cmllc1tdO1xuK1x0X19sZTMyIHJlc2VydmVkX3plcm87XG4rXHR1OCBoYXNoX3ZlcnNpb247XG4rXHR1OCBpbmZvX2xlbmd0aDsgLyogOCAqL1xuK1x0dTggaW5kaXJlY3RfbGV2ZWxzO1xuK1x0dTggdW51c2VkX2ZsYWdzO1xuIH07XG4gXG4gc3RydWN0IGR4X25vZGVcbkBAIC0zMTQsMTcgKzMwNSwxNiBAQCBzdGF0aWMgc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKmdldF9kaXJlbnRfdGFpbChzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHRcdFx0XHRcdCAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpXG4ge1xuIFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwgKnQ7XG4tXHRpbnQgYmxvY2tzaXplID0gRVhUNF9CTE9DS19TSVpFKGlub2RlLVx1MDAzZWlfc2IpO1xuIFxuICNpZmRlZiBQQVJBTk9JRFxuLVx0c3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkLCAqdG9wO1xuK1x0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmQsICp0b3A7XG4gXG4tXHRkID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqKWJoLVx1MDAzZWJfZGF0YTtcbi1cdHRvcCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKikoYmgtXHUwMDNlYl9kYXRhICtcbi1cdFx0KGJsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCkpKTtcbi1cdHdoaWxlIChkIFx1MDAzYyB0b3AgXHUwMDI2XHUwMDI2IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZC1cdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpKVxuLVx0XHRkID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqKSgoKHZvaWQgKilkKSArXG4tXHRcdCAgICBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGQtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKSk7XG4rXHRkID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtXHUwMDNlYl9kYXRhO1xuK1x0dG9wID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKGJoLVx1MDAzZWJfZGF0YSArXG4rXHRcdChFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtXHUwMDNlaV9zYikgLSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyX2VudHJ5X3RhaWwpKSk7XG4rXHR3aGlsZSAoZCBcdTAwM2MgdG9wIFx1MDAyNlx1MDAyNiBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGQtXHUwMDNlcmVjX2xlbiwgRVhUNF9CTE9DS19TSVpFKGlub2RlLVx1MDAzZWlfc2IpKSlcbitcdFx0ZCA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSgoKHZvaWQgKilkKSArXG4rXHRcdCAgICBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGQtXHUwMDNlcmVjX2xlbiwgRVhUNF9CTE9DS19TSVpFKGlub2RlLVx1MDAzZWlfc2IpKSk7XG4gXG4gXHRpZiAoZCAhPSB0b3ApXG4gXHRcdHJldHVybiBOVUxMO1xuQEAgLTMzNCwxMSArMzI0LDcgQEAgc3RhdGljIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsICpnZXRfZGlyZW50X3RhaWwoc3RydWN0IGlub2RlICppbm9kZSxcbiBcdHQgPSBFWFQ0X0RJUkVOVF9UQUlMKGJoLVx1MDAzZWJfZGF0YSwgRVhUNF9CTE9DS19TSVpFKGlub2RlLVx1MDAzZWlfc2IpKTtcbiAjZW5kaWZcbiBcbi1cdGlmICh0LVx1MDAzZWRldF9yZXNlcnZlZF96ZXJvMSB8fFxuLVx0ICAgIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKHQtXHUwMDNlZGV0X3JlY19sZW4sIGJsb2Nrc2l6ZSkgIT1cbi1cdCAgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV90YWlsKSkgfHxcbi1cdCAgICB0LVx1MDAzZWRldF9yZXNlcnZlZF96ZXJvMiB8fFxuLVx0ICAgIHQtXHUwMDNlZGV0X3Jlc2VydmVkX2Z0ICE9IEVYVDRfRlRfRElSX0NTVU0pXG4rXHRpZiAoIWV4dDRfZGlyX2VudHJ5X2lzX3RhaWwoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopdCkpXG4gXHRcdHJldHVybiBOVUxMO1xuIFxuIFx0cmV0dXJuIHQ7XG5AQCAtNDEwLDM1ICszOTYsNDMgQEAgaW50IGV4dDRfaGFuZGxlX2RpcnR5X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsXG4gfVxuIFxuIHN0YXRpYyBzdHJ1Y3QgZHhfY291bnRsaW1pdCAqZ2V0X2R4X2NvdW50bGltaXQoc3RydWN0IGlub2RlICppbm9kZSxcbi1cdFx0XHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50LFxuK1x0XHRcdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudCxcbiBcdFx0XHRcdFx0ICAgICAgIGludCAqb2Zmc2V0KVxuIHtcbi1cdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZHA7XG4rXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7XG4gXHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICpyb290O1xuLVx0aW50IGNvdW50X29mZnNldDtcbitcdGludCBjb3VudF9vZmZzZXQsIGRvdGRvdF9yZWNfbGVuO1xuIFx0aW50IGJsb2Nrc2l6ZSA9IEVYVDRfQkxPQ0tfU0laRShpbm9kZS1cdTAwM2VpX3NiKTtcbiBcdHVuc2lnbmVkIGludCBybGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkaXJlbnQtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcbiBcbi1cdGlmIChybGVuID09IGJsb2Nrc2l6ZSlcbi1cdFx0Y291bnRfb2Zmc2V0ID0gODtcbi1cdGVsc2UgaWYgKHJsZW4gPT0gMTIpIHtcbi1cdFx0ZHAgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopKCgodm9pZCAqKWRpcmVudCkgKyAxMik7XG4tXHRcdGlmIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRwLVx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSkgIT0gYmxvY2tzaXplIC0gMTIpXG4rXHRpZiAocmxlbiA9PSBibG9ja3NpemUpIHtcbitcdFx0Y291bnRfb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBkeF9ub2RlKTtcbitcdH0gZWxzZSB7XG4rXHRcdGlmIChybGVuIFx1MDAzYyBFWFQ0X0JBU0VfRElSX0xFTiB8fFxuK1x0XHQgICAgcmxlbiArIEVYVDRfQkFTRV9ESVJfTEVOIFx1MDAzZSBibG9ja3NpemUpXG4rXHRcdFx0cmV0dXJuIE5VTEw7XG4rXHRcdGRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKCgoY2hhciAqKWRpcmVudCkgKyBybGVuKTtcbitcdFx0aWYgKGxlMTZfdG9fY3B1KGRlLVx1MDAzZXJlY19sZW4pICE9IChibG9ja3NpemUgLSBybGVuKSlcbiBcdFx0XHRyZXR1cm4gTlVMTDtcbi1cdFx0cm9vdCA9IChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopKCgodm9pZCAqKWRwICsgMTIpKTtcbitcdFx0LyogZGUtXHUwMDNlcmVjX2xlbiBjb3ZlcnMgd2hvbGUgZHhfcm9vdCBibG9jaywgY2FsY3VsYXRlIGFjdHVhbCBsZW5ndGguXG4rXHRcdCAqIFRoaXMgaXMgdGhlICcuLicgZW50cnksIHdoaWNoIG5ldmVyIGNhcnJpZXMgdGhlIGNhc2Vmb2xkK2ZzY3J5cHRcbitcdFx0ICogaGFzaCwgc28gcGFzcyBOVUxMIGZvciBkaXIgcmVnYXJkbGVzcyBvZiB0aGUgZGlyZWN0b3J5J3MgZmxhZ3MgKi9cbitcdFx0ZG90ZG90X3JlY19sZW4gPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIGJsb2Nrc2l6ZSwgTlVMTCk7XG4rXHRcdGlmIChybGVuICsgZG90ZG90X3JlY19sZW4gKyBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykgXHUwMDNlIGJsb2Nrc2l6ZSlcbitcdFx0XHRyZXR1cm4gTlVMTDtcbitcdFx0cm9vdCA9IChzdHJ1Y3QgZHhfcm9vdF9pbmZvICopKCgoY2hhciAqKWRlICsgZG90ZG90X3JlY19sZW4pKTtcbiBcdFx0aWYgKHJvb3QtXHUwMDNlcmVzZXJ2ZWRfemVybyB8fFxuIFx0XHQgICAgcm9vdC1cdTAwM2VpbmZvX2xlbmd0aCAhPSBzaXplb2Yoc3RydWN0IGR4X3Jvb3RfaW5mbykpXG4gXHRcdFx0cmV0dXJuIE5VTEw7XG4tXHRcdGNvdW50X29mZnNldCA9IDMyO1xuLVx0fSBlbHNlXG4tXHRcdHJldHVybiBOVUxMO1xuK1x0XHRjb3VudF9vZmZzZXQgPSByb290LVx1MDAzZWluZm9fbGVuZ3RoICsgcmxlbiArIGRvdGRvdF9yZWNfbGVuO1xuK1x0fVxuIFxuIFx0aWYgKG9mZnNldClcbiBcdFx0Km9mZnNldCA9IGNvdW50X29mZnNldDtcbiBcdHJldHVybiAoc3RydWN0IGR4X2NvdW50bGltaXQgKikoKCh2b2lkICopZGlyZW50KSArIGNvdW50X29mZnNldCk7XG4gfVxuIFxuLXN0YXRpYyBfX2xlMzIgZXh0NF9keF9jc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50LFxuK3N0YXRpYyBfX2xlMzIgZXh0NF9keF9jc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQsXG4gXHRcdFx0ICAgaW50IGNvdW50X29mZnNldCwgaW50IGNvdW50LCBzdHJ1Y3QgZHhfdGFpbCAqdClcbiB7XG4gXHRzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7XG5AQCAtNDU2LDcgKzQ1MCw3IEBAIHN0YXRpYyBfX2xlMzIgZXh0NF9keF9jc3VtKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50LFxuIH1cbiBcbiBzdGF0aWMgaW50IGV4dDRfZHhfY3N1bV92ZXJpZnkoc3RydWN0IGlub2RlICppbm9kZSxcbi1cdFx0XHQgICAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5ICpkaXJlbnQpXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkaXJlbnQpXG4ge1xuIFx0c3RydWN0IGR4X2NvdW50bGltaXQgKmM7XG4gXHRzdHJ1Y3QgZHhfdGFpbCAqdDtcbkBAIC00NzcsNiArNDcxLDEwIEBAIHN0YXRpYyBpbnQgZXh0NF9keF9jc3VtX3ZlcmlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHR3YXJuX25vX3NwYWNlX2Zvcl9jc3VtKGlub2RlKTtcbiBcdFx0cmV0dXJuIDA7XG4gXHR9XG4rXHRpZiAoY291bnQgXHUwMDNlIGxpbWl0KSB7XG4rXHRcdEVYVDRfRVJST1JfSU5PREUoaW5vZGUsIFwiZGlyIHNlZW1zIGNvcnJ1cHQ/ICBSdW4gZTJmc2NrIC1ELlwiKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4gXHR0ID0gKHN0cnVjdCBkeF90YWlsICopKCgoc3RydWN0IGR4X2VudHJ5ICopYykgKyBsaW1pdCk7XG4gXG4gXHRpZiAodC1cdTAwM2VkdF9jaGVja3N1bSAhPSBleHQ0X2R4X2NzdW0oaW5vZGUsIGRpcmVudCwgY291bnRfb2Zmc2V0LFxuQEAgLTQ4NSw3ICs0ODMsNyBAQCBzdGF0aWMgaW50IGV4dDRfZHhfY3N1bV92ZXJpZnkoc3RydWN0IGlub2RlICppbm9kZSxcbiBcdHJldHVybiAxO1xuIH1cbiBcbi1zdGF0aWMgdm9pZCBleHQ0X2R4X2NzdW1fc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGlyZW50KVxuK3N0YXRpYyB2b2lkIGV4dDRfZHhfY3N1bV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRpcmVudClcbiB7XG4gXHRzdHJ1Y3QgZHhfY291bnRsaW1pdCAqYztcbiBcdHN0cnVjdCBkeF90YWlsICp0O1xuQEAgLTUwNiw2ICs1MDQsMTAgQEAgc3RhdGljIHZvaWQgZXh0NF9keF9jc3VtX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKmRpcmVudClcbiBcdFx0d2Fybl9ub19zcGFjZV9mb3JfY3N1bShpbm9kZSk7XG4gXHRcdHJldHVybjtcbiBcdH1cbitcdGlmIChjb3VudCBcdTAwM2UgbGltaXQpIHtcbitcdFx0RVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgXCJkaXIgc2VlbXMgY29ycnVwdD8gIFJ1biBlMmZzY2sgLUQuXCIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4gXHR0ID0gKHN0cnVjdCBkeF90YWlsICopKCgoc3RydWN0IGR4X2VudHJ5ICopYykgKyBsaW1pdCk7XG4gXG4gXHR0LVx1MDAzZWR0X2NoZWNrc3VtID0gZXh0NF9keF9jc3VtKGlub2RlLCBkaXJlbnQsIGNvdW50X29mZnNldCwgY291bnQsIHQpO1xuQEAgLTUxNSw3ICs1MTcsNyBAQCBzdGF0aWMgaW5saW5lIGludCBleHQ0X2hhbmRsZV9kaXJ0eV9keF9ub2RlKGhhbmRsZV90ICpoYW5kbGUsXG4gXHRcdFx0XHRcdCAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0XHRcdFx0XHQgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaClcbiB7XG4tXHRleHQ0X2R4X2NzdW1fc2V0KGlub2RlLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5ICopYmgtXHUwMDNlYl9kYXRhKTtcbitcdGV4dDRfZHhfY3N1bV9zZXQoaW5vZGUsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJoLVx1MDAzZWJfZGF0YSk7XG4gXHRyZXR1cm4gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpO1xuIH1cbiBcbkBAIC01MzMsNiArNTM1LDMwIEBAIGV4dDRfbmV4dF9lbnRyeShzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqcCwgdW5zaWduZWQgbG9uZyBibG9ja3NpemUpXG4gICogRnV0dXJlOiB1c2UgaGlnaCBmb3VyIGJpdHMgb2YgYmxvY2sgZm9yIGNvYWxlc2NlLW9uLWRlbGV0ZSBmbGFnc1xuICAqIE1hc2sgdGhlbSBvZmYgZm9yIG5vdy5cbiAgKi9cbitzdGF0aWMgc3RydWN0IGR4X3Jvb3RfaW5mbyAqZHhfZ2V0X2R4X2luZm8oc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmRlX2J1Zilcbit7XG4rXHR1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemU7XG4rXHR2b2lkICpiYXNlID0gZGVfYnVmO1xuK1xuK1x0LyogJy4nIGFuZCAnLi4nIG5ldmVyIGNhcnJ5IHRoZSBjYXNlZm9sZCtmc2NyeXB0IGhhc2gsIHNvIHBhc3MgTlVMTFxuK1x0ICogZm9yIGRpciByZWdhcmRsZXNzIG9mIHRoZSBkaXJlY3RvcnkncyBmbGFncyAqL1xuK1x0aWYgKGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soKChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWRlX2J1ZiktXHUwMDNlcmVjX2xlbixcbitcdFx0XHRcdCAgIGJsb2Nrc2l6ZSkgXHUwMDNjIEVYVDRfQkFTRV9ESVJfTEVOKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUZTQ09SUlVQVEVEKTtcbitcdGRlX2J1ZiArPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGVfYnVmLCBibG9ja3NpemUsIE5VTEwpO1xuK1xuK1x0LyogZHggcm9vdCBpbmZvIGlzIGFmdGVyIGRvdGRvdCBlbnRyeSAqL1xuK1x0aWYgKGRlX2J1ZiBcdTAwM2MgYmFzZSB8fCAoY2hhciAqKWRlX2J1ZiAtIChjaGFyICopYmFzZSArXG4rXHQgICAgRVhUNF9CQVNFX0RJUl9MRU4gXHUwMDNlIGJsb2Nrc2l6ZSlcbitcdFx0cmV0dXJuIEVSUl9QVFIoLUVGU0NPUlJVUFRFRCk7XG4rXHRkZV9idWYgKz0gZXh0NF9kaXJfZW50cnlfbGVuKGRlX2J1ZiwgYmxvY2tzaXplLCBOVUxMKTtcbitcbitcdGlmIChkZV9idWYgXHUwMDNjIGJhc2UgfHwgKGNoYXIgKilkZV9idWYgLSAoY2hhciAqKWJhc2UgK1xuK1x0XHRcdCAgICAgIHNpemVvZihzdHJ1Y3QgZHhfcm9vdF9pbmZvKSBcdTAwM2UgYmxvY2tzaXplKVxuK1x0XHRyZXR1cm4gRVJSX1BUUigtRUZTQ09SUlVQVEVEKTtcbitcbitcdHJldHVybiAoc3RydWN0IGR4X3Jvb3RfaW5mbyAqKWRlX2J1Zjtcbit9XG4gXG4gc3RhdGljIGlubGluZSBleHQ0X2xibGtfdCBkeF9nZXRfYmxvY2soc3RydWN0IGR4X2VudHJ5ICplbnRyeSlcbiB7XG5AQCAtNTc0LDExICs2MDAsMTcgQEAgc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9saW1pdChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIHVuc2lnbmVkIHZhbHVlKVxuIFx0KChzdHJ1Y3QgZHhfY291bnRsaW1pdCAqKSBlbnRyaWVzKS1cdTAwM2VsaW1pdCA9IGNwdV90b19sZTE2KHZhbHVlKTtcbiB9XG4gXG4tc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9yb290X2xpbWl0KHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBpbmZvc2l6ZSlcbitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQoc3RydWN0IGlub2RlICpkaXIsXG4rXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG90X2RlKVxuIHtcbi1cdHVuc2lnbmVkIGludCBlbnRyeV9zcGFjZSA9IGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIC1cbi1cdFx0XHRleHQ0X2Rpcl9yZWNfbGVuKDEsIE5VTEwpIC1cbi1cdFx0XHRleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpIC0gaW5mb3NpemU7XG4rXHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICppbmZvO1xuK1x0dW5zaWduZWQgaW50IGVudHJ5X3NwYWNlO1xuK1xuK1x0aW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgZG90X2RlKTtcbitcdGlmIChJU19FUlIoaW5mbykpXG4rXHRcdHJldHVybiAwO1xuK1x0ZW50cnlfc3BhY2UgPSBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSAtICgoY2hhciAqKWluZm8gLSAoY2hhciAqKWRvdF9kZSkgLVxuK1x0XHRpbmZvLVx1MDAzZWluZm9fbGVuZ3RoO1xuIFxuIFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfbWV0YWRhdGFfY3N1bShkaXItXHUwMDNlaV9zYikpXG4gXHRcdGVudHJ5X3NwYWNlIC09IHNpemVvZihzdHJ1Y3QgZHhfdGFpbCk7XG5AQCAtNTg3LDggKzYxOSwxMCBAQCBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGluZm9zaXplKVxuIFxuIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfbm9kZV9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpcilcbiB7XG4rXHQvKiBkeF9ub2RlIGZha2VfZGlyZW50IGlzIGFsd2F5cyA4IGJ5dGVzIOKAlCBpdCBuZXZlciBjYXJyaWVzIGEgY2FzZWZvbGRcbitcdCAqIGhhc2gsIHNvIHBhc3MgTlVMTCB0byBzdXBwcmVzcyB0aGUgaGFzaC1zaXplIHRlcm0uICovXG4gXHR1bnNpZ25lZCBpbnQgZW50cnlfc3BhY2UgPSBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSAtXG4tXHRcdFx0ZXh0NF9kaXJfcmVjX2xlbigwLCBkaXIpO1xuK1x0XHRcdGV4dDRfZGlyZW50X3JlY19sZW4oMCwgTlVMTCk7XG4gXG4gXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9tZXRhZGF0YV9jc3VtKGRpci1cdTAwM2VpX3NiKSlcbiBcdFx0ZW50cnlfc3BhY2UgLT0gc2l6ZW9mKHN0cnVjdCBkeF90YWlsKTtcbkBAIC02OTgsNyArNzMyLDkgQEAgc3RhdGljIHN0cnVjdCBzdGF0cyBkeF9zaG93X2xlYWYoc3RydWN0IGlub2RlICpkaXIsXG4gXHRcdFx0XHQgICAgICAgKHVuc2lnbmVkKSAoKGNoYXIgKikgZGUgLSBiYXNlKSk7XG4gI2VuZGlmXG4gXHRcdFx0fVxuLVx0XHRcdHNwYWNlICs9IGV4dDRfZGlyX3JlY19sZW4oZGUtXHUwMDNlbmFtZV9sZW4sIGRpcik7XG4rXHRcdFx0aWYgKChjaGFyICopZGUgKyBFWFQ0X0JBU0VfRElSX0xFTiBcdTAwM2UgYmFzZSArIHNpemUpXG4rXHRcdFx0XHRicmVhaztcbitcdFx0XHRzcGFjZSArPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIHNpemUsIGRpcik7XG4gXHRcdFx0bmFtZXMrKztcbiBcdFx0fVxuIFx0XHRkZSA9IGV4dDRfbmV4dF9lbnRyeShkZSwgc2l6ZSk7XG5AQCAtNzgwLDcgKzgxNiw3IEBAIGR4X3Byb2JlKHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwgc3RydWN0IGlub2RlICpkaXIsXG4ge1xuIFx0dW5zaWduZWQgY291bnQsIGluZGlyZWN0LCBsZXZlbCwgaTtcbiBcdHN0cnVjdCBkeF9lbnRyeSAqYXQsICplbnRyaWVzLCAqcCwgKnEsICptO1xuLVx0c3RydWN0IGR4X3Jvb3QgKnJvb3Q7XG4rXHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICppbmZvO1xuIFx0c3RydWN0IGR4X2ZyYW1lICpmcmFtZSA9IGZyYW1lX2luO1xuIFx0c3RydWN0IGR4X2ZyYW1lICpyZXRfZXJyID0gRVJSX1BUUihFUlJfQkFEX0RYX0RJUik7XG4gXHR1MzIgaGFzaDtcbkBAIC03OTIsMjMgKzgyOCwzMSBAQCBkeF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0aWYgKElTX0VSUihmcmFtZS1cdTAwM2ViaCkpXG4gXHRcdHJldHVybiAoc3RydWN0IGR4X2ZyYW1lICopIGZyYW1lLVx1MDAzZWJoO1xuIFxuLVx0cm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBmcmFtZS1cdTAwM2ViaC1cdTAwM2ViX2RhdGE7XG4tXHRpZiAocm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1RFQSBcdTAwMjZcdTAwMjZcbi1cdCAgICByb290LVx1MDAzZWluZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfSEFMRl9NRDQgXHUwMDI2XHUwMDI2XG4tXHQgICAgcm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0xFR0FDWSBcdTAwMjZcdTAwMjZcbi1cdCAgICByb290LVx1MDAzZWluZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfU0lQSEFTSCkge1xuLVx0XHRleHQ0X3dhcm5pbmdfaW5vZGUoZGlyLCBcIlVucmVjb2duaXNlZCBpbm9kZSBoYXNoIGNvZGUgJXVcIixcbi1cdFx0XHRcdCAgIHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24pO1xuK1x0aW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopZnJhbWUtXHUwMDNlYmgtXHUwMDNlYl9kYXRhKTtcbitcdGlmIChJU19FUlIoaW5mbykpXG4rXHRcdGdvdG8gZmFpbDtcbitcdGlmIChpbmZvLVx1MDAzZWluZm9fbGVuZ3RoICE9IHNpemVvZihzdHJ1Y3QgZHhfcm9vdF9pbmZvKSkge1xuK1x0XHRleHQ0X3dhcm5pbmdfaW5vZGUoZGlyLCBcImNvcnJ1cHRlZCBodHJlZTogaW5mb19sZW5ndGggJXVcIixcbitcdFx0XHRcdCAgIGluZm8tXHUwMDNlaW5mb19sZW5ndGgpO1xuK1x0XHRnb3RvIGZhaWw7XG4rXHR9XG4rXHRpZiAoaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9URUEgXHUwMDI2XHUwMDI2XG4rXHQgICAgaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9IQUxGX01ENCBcdTAwMjZcdTAwMjZcbitcdCAgICBpbmZvLVx1MDAzZWhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0xFR0FDWSBcdTAwMjZcdTAwMjZcbitcdCAgICBpbmZvLVx1MDAzZWhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHtcbitcdFx0ZXh0NF93YXJuaW5nKGRpci1cdTAwM2VpX3NiLFxuK1x0XHRcdFwiVW5yZWNvZ25pc2VkIGlub2RlIGhhc2ggY29kZSAlZCBmb3IgZGlyZWN0b3J5ICMlbGx1XCIsXG4rXHRcdFx0aW5mby1cdTAwM2VoYXNoX3ZlcnNpb24sIGRpci1cdTAwM2VpX2lubyk7XG4gXHRcdGdvdG8gZmFpbDtcbiBcdH1cbiBcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpIHtcbi1cdFx0aWYgKHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24gIT0gRFhfSEFTSF9TSVBIQVNIKSB7XG4rXHRcdGlmIChpbmZvLVx1MDAzZWhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1NJUEhBU0gpIHtcbiBcdFx0XHRleHQ0X3dhcm5pbmdfaW5vZGUoZGlyLFxuIFx0XHRcdFx0XCJIYXNoIGluIGRpcmVudCwgYnV0IGhhc2ggaXMgbm90IFNJUEhBU0hcIik7XG4gXHRcdFx0Z290byBmYWlsO1xuIFx0XHR9XG4gXHR9IGVsc2Uge1xuLVx0XHRpZiAocm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiA9PSBEWF9IQVNIX1NJUEhBU0gpIHtcbitcdFx0aWYgKGluZm8tXHUwMDNlaGFzaF92ZXJzaW9uID09IERYX0hBU0hfU0lQSEFTSCkge1xuIFx0XHRcdGV4dDRfd2FybmluZ19pbm9kZShkaXIsXG4gXHRcdFx0XHRcIkhhc2ggY29kZSBpcyBTSVBIQVNILCBidXQgaGFzaCBub3QgaW4gZGlyZW50XCIpO1xuIFx0XHRcdGdvdG8gZmFpbDtcbkBAIC04MTYsNyArODYwLDcgQEAgZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdH1cbiBcdGlmIChmbmFtZSlcbiBcdFx0aGluZm8gPSBcdTAwMjZmbmFtZS1cdTAwM2VoaW5mbztcbi1cdGhpbmZvLVx1MDAzZWhhc2hfdmVyc2lvbiA9IHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb247XG4rXHRoaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gPSBpbmZvLVx1MDAzZWhhc2hfdmVyc2lvbjtcbiBcdGlmIChoaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gXHUwMDNjPSBEWF9IQVNIX1RFQSlcbiBcdFx0aGluZm8tXHUwMDNlaGFzaF92ZXJzaW9uICs9IEVYVDRfU0IoZGlyLVx1MDAzZWlfc2IpLVx1MDAzZXNfaGFzaF91bnNpZ25lZDtcbiBcdGhpbmZvLVx1MDAzZXNlZWQgPSBFWFQ0X1NCKGRpci1cdTAwM2VpX3NiKS1cdTAwM2VzX2hhc2hfc2VlZDtcbkBAIC04MzIsMTMgKzg3NiwxMyBAQCBkeF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0fVxuIFx0aGFzaCA9IGhpbmZvLVx1MDAzZWhhc2g7XG4gXG4tXHRpZiAocm9vdC1cdTAwM2VpbmZvLnVudXNlZF9mbGFncyBcdTAwMjYgMSkge1xuK1x0aWYgKGluZm8tXHUwMDNldW51c2VkX2ZsYWdzIFx1MDAyNiAxKSB7XG4gXHRcdGV4dDRfd2FybmluZ19pbm9kZShkaXIsIFwiVW5pbXBsZW1lbnRlZCBoYXNoIGZsYWdzOiAlIzA2eFwiLFxuLVx0XHRcdFx0ICAgcm9vdC1cdTAwM2VpbmZvLnVudXNlZF9mbGFncyk7XG4rXHRcdFx0XHQgICBpbmZvLVx1MDAzZXVudXNlZF9mbGFncyk7XG4gXHRcdGdvdG8gZmFpbDtcbiBcdH1cbiBcbi1cdGluZGlyZWN0ID0gcm9vdC1cdTAwM2VpbmZvLmluZGlyZWN0X2xldmVscztcbitcdGluZGlyZWN0ID0gaW5mby1cdTAwM2VpbmRpcmVjdF9sZXZlbHM7XG4gXHRpZiAoaW5kaXJlY3QgXHUwMDNlPSBleHQ0X2Rpcl9odHJlZV9sZXZlbChkaXItXHUwMDNlaV9zYikpIHtcbiBcdFx0ZXh0NF93YXJuaW5nKGRpci1cdTAwM2VpX3NiLFxuIFx0XHRcdCAgICAgXCJEaXJlY3RvcnkgKGlubzogJWxsdSkgaHRyZWUgZGVwdGggJSMwNnggZXhjZWVkXCJcbkBAIC04NTEsMTQgKzg5NSwxNSBAQCBkeF9wcm9iZShzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0XHRnb3RvIGZhaWw7XG4gXHR9XG4gXG4tXHRlbnRyaWVzID0gKHN0cnVjdCBkeF9lbnRyeSAqKSgoKGNoYXIgKilcdTAwMjZyb290LVx1MDAzZWluZm8pICtcbi1cdFx0XHRcdCAgICAgIHJvb3QtXHUwMDNlaW5mby5pbmZvX2xlbmd0aCk7XG4rXHRlbnRyaWVzID0gKHN0cnVjdCBkeF9lbnRyeSAqKSgoKGNoYXIgKilpbmZvKSArIGluZm8tXHUwMDNlaW5mb19sZW5ndGgpO1xuIFxuLVx0aWYgKGR4X2dldF9saW1pdChlbnRyaWVzKSAhPSBkeF9yb290X2xpbWl0KGRpcixcbi1cdFx0XHRcdFx0XHQgICByb290LVx1MDAzZWluZm8uaW5mb19sZW5ndGgpKSB7XG4rXHRpZiAoZHhfZ2V0X2xpbWl0KGVudHJpZXMpICE9XG4rXHQgICAgZHhfcm9vdF9saW1pdChkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWZyYW1lLVx1MDAzZWJoLVx1MDAzZWJfZGF0YSkpIHtcbiBcdFx0ZXh0NF93YXJuaW5nX2lub2RlKGRpciwgXCJkeCBlbnRyeTogbGltaXQgJXUgIT0gcm9vdCBsaW1pdCAldVwiLFxuIFx0XHRcdFx0ICAgZHhfZ2V0X2xpbWl0KGVudHJpZXMpLFxuLVx0XHRcdFx0ICAgZHhfcm9vdF9saW1pdChkaXIsIHJvb3QtXHUwMDNlaW5mby5pbmZvX2xlbmd0aCkpO1xuK1x0XHRcdFx0ICAgZHhfcm9vdF9saW1pdChkaXIsXG4rXHRcdFx0XHQgICAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilmcmFtZS1cdTAwM2ViaC1cdTAwM2ViX2RhdGFcbitcdFx0XHRcdCAgICkpO1xuIFx0XHRnb3RvIGZhaWw7XG4gXHR9XG4gXG5AQCAtOTM1LDcgKzk4MCw3IEBAIGR4X3Byb2JlKHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSwgc3RydWN0IGlub2RlICpkaXIsXG4gXHRyZXR1cm4gcmV0X2VycjtcbiB9XG4gXG4tc3RhdGljIHZvaWQgZHhfcmVsZWFzZShzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcylcbitzdGF0aWMgdm9pZCBkeF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcylcbiB7XG4gXHRzdHJ1Y3QgZHhfcm9vdF9pbmZvICppbmZvO1xuIFx0aW50IGk7XG5AQCAtOTQ0LDcgKzk4OSw5IEBAIHN0YXRpYyB2b2lkIGR4X3JlbGVhc2Uoc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMpXG4gXHRpZiAoZnJhbWVzWzBdLmJoID09IE5VTEwpXG4gXHRcdHJldHVybjtcbiBcbi1cdGluZm8gPSBcdTAwMjYoKHN0cnVjdCBkeF9yb290ICopZnJhbWVzWzBdLmJoLVx1MDAzZWJfZGF0YSktXHUwMDNlaW5mbztcbitcdGluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWZyYW1lc1swXS5iaC1cdTAwM2ViX2RhdGEpO1xuK1x0aWYgKElTX0VSUihpbmZvKSlcbitcdFx0cmV0dXJuO1xuIFx0Lyogc2F2ZSBsb2NhbCBjb3B5LCBcImluZm9cIiBtYXkgYmUgZnJlZWQgYWZ0ZXIgYnJlbHNlKCkgKi9cbiBcdGluZGlyZWN0X2xldmVscyA9IGluZm8tXHUwMDNlaW5kaXJlY3RfbGV2ZWxzO1xuIFx0Zm9yIChpID0gMDsgaSBcdTAwM2M9IGluZGlyZWN0X2xldmVsczsgaSsrKSB7XG5AQCAtMTA1Niw3ICsxMTAzLDcgQEAgc3RhdGljIGludCBodHJlZV9kaXJibG9ja190b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdC8qIGNzdW0gZW50cmllcyBhcmUgbm90IGxhcmdlciBpbiB0aGUgY2FzZWZvbGRlZCBlbmNyeXB0ZWQgY2FzZSAqL1xuIFx0dG9wID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopICgoY2hhciAqKSBkZSArXG4gXHRcdFx0XHRcdCAgIGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplIC1cbi1cdFx0XHRcdFx0ICAgZXh0NF9kaXJfcmVjX2xlbigwLFxuK1x0XHRcdFx0XHQgICBleHQ0X2RpcmVudF9yZWNfbGVuKDAsXG4gXHRcdFx0XHRcdFx0XHQgICBjc3VtID8gTlVMTCA6IGRpcikpO1xuIFx0LyogQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBlbmNyeXB0ZWQgKi9cbiBcdGlmIChJU19FTkNSWVBURUQoZGlyKSkge1xuQEAgLTEwODEsMjIgKzExMjgsMjMgQEAgc3RhdGljIGludCBodHJlZV9kaXJibG9ja190b190cmVlKHN0cnVjdCBmaWxlICpkaXJfZmlsZSxcbiBcdFx0XHQvKiBzaWxlbnRseSBpZ25vcmUgdGhlIHJlc3Qgb2YgdGhlIGJsb2NrICovXG4gXHRcdFx0YnJlYWs7XG4gXHRcdH1cbi1cdFx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkge1xuLVx0XHRcdGlmIChkZS1cdTAwM2VuYW1lX2xlbiBcdTAwMjZcdTAwMjYgZGUtXHUwMDNlaW5vZGUpIHtcbi1cdFx0XHRcdGhpbmZvLVx1MDAzZWhhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTtcbi1cdFx0XHRcdGhpbmZvLVx1MDAzZW1pbm9yX2hhc2ggPSBFWFQ0X0RJUkVOVF9NSU5PUl9IQVNIKGRlKTtcbi1cdFx0XHR9IGVsc2Uge1xuLVx0XHRcdFx0aGluZm8tXHUwMDNlaGFzaCA9IDA7XG4tXHRcdFx0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gMDtcbi1cdFx0XHR9XG4rXHRcdGlmIChkZS1cdTAwM2VuYW1lX2xlbiBcdTAwMjZcdTAwMjYgZGUtXHUwMDNlaW5vZGUpIHtcbitcdFx0XHQvKiBjaGVjayBmb3Igc2F2ZWQgaGFzaCBmaXJzdCwgb3IgZ2VuZXJhdGUgaXQgZnJvbSBuYW1lICovXG4rXHRcdFx0aWYgKCEoZXh0NF9kaXJkYXRhX2dldChkZSwgZGlyLCBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSxcbitcdFx0XHRcdFx0ICAgICAgIE5VTEwsIGhpbmZvKSBcdTAwMjZcbitcdFx0XHQgICAgICBFWFQ0X0RJUkVOVF9DRkhBU0gpKSB7XG4rXHRcdFx0XHRlcnIgPSBleHQ0ZnNfZGlyaGFzaChkaXIsIGRlLVx1MDAzZW5hbWUsXG4rXHRcdFx0XHRcdFx0ICAgICBkZS1cdTAwM2VuYW1lX2xlbiwgaGluZm8pO1xuK1x0XHRcdFx0aWYgKGVyciBcdTAwM2MgMCkge1xuK1x0XHRcdFx0XHRjb3VudCA9IGVycjtcbitcdFx0XHRcdFx0Z290byBlcnJvdXQ7XG4rXHRcdFx0XHR9XG4rXHRcdFx0IH1cbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRlcnIgPSBleHQ0ZnNfZGlyaGFzaChkaXIsIGRlLVx1MDAzZW5hbWUsXG4tXHRcdFx0XHRcdCAgICAgZGUtXHUwMDNlbmFtZV9sZW4sIGhpbmZvKTtcbi1cdFx0XHRpZiAoZXJyIFx1MDAzYyAwKSB7XG4tXHRcdFx0XHRjb3VudCA9IGVycjtcbi1cdFx0XHRcdGdvdG8gZXJyb3V0O1xuLVx0XHRcdH1cbitcdFx0XHRoaW5mby1cdTAwM2VoYXNoID0gMDtcbitcdFx0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gMDtcbiBcdFx0fVxuK1xuIFx0XHRpZiAoKGhpbmZvLVx1MDAzZWhhc2ggXHUwMDNjIHN0YXJ0X2hhc2gpIHx8XG4gXHRcdCAgICAoKGhpbmZvLVx1MDAzZWhhc2ggPT0gc3RhcnRfaGFzaCkgXHUwMDI2XHUwMDI2XG4gXHRcdCAgICAgKGhpbmZvLVx1MDAzZW1pbm9yX2hhc2ggXHUwMDNjIHN0YXJ0X21pbm9yX2hhc2gpKSlcbkBAIC0xMTA3LDggKzExNTUsOCBAQCBzdGF0aWMgaW50IGh0cmVlX2RpcmJsb2NrX3RvX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLFxuIFx0XHRcdHRtcF9zdHIubmFtZSA9IGRlLVx1MDAzZW5hbWU7XG4gXHRcdFx0dG1wX3N0ci5sZW4gPSBkZS1cdTAwM2VuYW1lX2xlbjtcbiBcdFx0XHRlcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSxcbi1cdFx0XHRcdCAgIGhpbmZvLVx1MDAzZWhhc2gsIGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gsIGRlLFxuLVx0XHRcdFx0ICAgXHUwMDI2dG1wX3N0cik7XG4rXHRcdFx0XHQgICBoaW5mby1cdTAwM2VoYXNoLCBoaW5mby1cdTAwM2VtaW5vcl9oYXNoLFxuK1x0XHRcdFx0ICAgZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUsIGRlLCBcdTAwMjZ0bXBfc3RyKTtcbiBcdFx0fSBlbHNlIHtcbiBcdFx0XHRpbnQgc2F2ZV9sZW4gPSBmbmFtZV9jcnlwdG9fc3RyLmxlbjtcbiBcdFx0XHRzdHJ1Y3QgZnNjcnlwdF9zdHIgZGVfbmFtZSA9IEZTVFJfSU5JVChkZS1cdTAwM2VuYW1lLFxuQEAgLTExMjMsOCArMTE3MSw5IEBAIHN0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsXG4gXHRcdFx0XHRnb3RvIGVycm91dDtcbiBcdFx0XHR9XG4gXHRcdFx0ZXJyID0gZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoZGlyX2ZpbGUsXG4tXHRcdFx0XHQgICBoaW5mby1cdTAwM2VoYXNoLCBoaW5mby1cdTAwM2VtaW5vcl9oYXNoLCBkZSxcbi1cdFx0XHRcdFx0XHUwMDI2Zm5hbWVfY3J5cHRvX3N0cik7XG4rXHRcdFx0XHRcdFx0aGluZm8tXHUwMDNlaGFzaCwgaGluZm8tXHUwMDNlbWlub3JfaGFzaCxcbitcdFx0XHRcdFx0XHRkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSwgZGUsXG4rXHRcdFx0XHRcdFx0XHUwMDI2Zm5hbWVfY3J5cHRvX3N0cik7XG4gXHRcdFx0Zm5hbWVfY3J5cHRvX3N0ci5sZW4gPSBzYXZlX2xlbjtcbiBcdFx0fVxuIFx0XHRpZiAoZXJyICE9IDApIHtcbkBAIC0xMjAyLDYgKzEyNTEsNyBAQCBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLFxuIFx0XHR0bXBfc3RyLm5hbWUgPSBkZS1cdTAwM2VuYW1lO1xuIFx0XHR0bXBfc3RyLmxlbiA9IGRlLVx1MDAzZW5hbWVfbGVuO1xuIFx0XHRlcnIgPSBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwgMCwgMCxcbitcdFx0XHRcdFx0ICAgICAgZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUsXG4gXHRcdFx0XHRcdCAgICAgIGRlLCBcdTAwMjZ0bXBfc3RyKTtcbiBcdFx0aWYgKGVyciAhPSAwKVxuIFx0XHRcdGdvdG8gZXJyb3V0O1xuQEAgLTEyMTMsNiArMTI2Myw3IEBAIGludCBleHQ0X2h0cmVlX2ZpbGxfdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIHN0YXJ0X2hhc2gsXG4gXHRcdHRtcF9zdHIubmFtZSA9IGRlLVx1MDAzZW5hbWU7XG4gXHRcdHRtcF9zdHIubGVuID0gZGUtXHUwMDNlbmFtZV9sZW47XG4gXHRcdGVyciA9IGV4dDRfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAyLCAwLFxuK1x0XHRcdFx0XHQgICAgICBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSxcbiBcdFx0XHRcdFx0ICAgICAgZGUsIFx1MDAyNnRtcF9zdHIpO1xuIFx0XHRpZiAoZXJyICE9IDApXG4gXHRcdFx0Z290byBlcnJvdXQ7XG5AQCAtMTI1MCwxMiArMTMwMSwxMiBAQCBpbnQgZXh0NF9odHJlZV9maWxsX3RyZWUoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBzdGFydF9oYXNoLFxuIFx0XHQgICAgKGNvdW50IFx1MDAyNlx1MDAyNiAoKGhhc2h2YWwgXHUwMDI2IDEpID09IDApKSlcbiBcdFx0XHRicmVhaztcbiBcdH1cbi1cdGR4X3JlbGVhc2UoZnJhbWVzKTtcbitcdGR4X3JlbGVhc2UoZGlyLCBmcmFtZXMpO1xuIFx0ZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyBcIkZpbGwgdHJlZTogcmV0dXJuZWQgJWQgZW50cmllcywgXCJcbiBcdFx0ICAgICAgIFwibmV4dCBoYXNoOiAleFxcblwiLCBjb3VudCwgKm5leHRfaGFzaCkpO1xuIFx0cmV0dXJuIGNvdW50O1xuIGVycm91dDpcbi1cdGR4X3JlbGVhc2UoZnJhbWVzKTtcbitcdGR4X3JlbGVhc2UoZGlyLCBmcmFtZXMpO1xuIFx0cmV0dXJuIChlcnIpO1xuIH1cbiBcbkBAIC0xMjczLDYgKzEzMjQsMjA3IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNlYXJjaF9kaXJibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuICAqIERpcmVjdG9yeSBibG9jayBzcGxpdHRpbmcsIGNvbXBhY3RpbmdcbiAgKi9cbiBcbisvKlxuKyAqIGV4dDRfZGlyZGF0YV9nZXQoKSAtIFJlYWQgZGlyZGF0YSBmaWVsZHMgZnJvbSBhIGRpcmVjdG9yeSBlbnRyeS5cbisgKiBAZGU6ICAgICAgICAgZGlyZWN0b3J5IGVudHJ5XG4rICogQGRpcjogICAgICAgIGRpcmVjdG9yeSBpbm9kZSAodXNlZCBmb3IgZnNjcnlwdCtjYXNlZm9sZCBoYXNoIGZhbGxiYWNrKVxuKyAqIEBkZmlkOiAgICAgIGlmIG5vbi1OVUxMIGFuZCBFWFQ0X0RJUkVOVF9MVUZJRCBpcyBzZXQsIExVRklEIGRhdGEgaXMgY29waWVkXG4rICogXHRcdGhlcmVcbisgKiBAaGluZm86XHRpZiBub24tTlVMTCwgcmVjZWl2ZXMgdGhlIGNhc2Vmb2xkIGhhc2ggYW5kIG1pbm9yIGhhc2hcbisgKlxuKyAqIFJlYWRzIGFueSBkaXJkYXRhIHN0b3JlZCBpbiBAZGUuICBJZiB0aGUgZGlyZGF0YSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLFxuKyAqIGZhbGxzIGJhY2sgdG8gcmVhZGluZyB0aGUgaGFzaCBzdG9yZWQgaW5saW5lIGFmdGVyIHRoZSBmaWxlbmFtZSAoZm9yXG4rICogY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGRlciBjYXNlZm9sZCtmc2NyeXB0IGZvcm1hdCkuXG4rICpcbisgKiBSZXR1cm5zIGEgYml0bWFzayBvZiBFWFQ0X0RJUkVOVF8qIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggZmllbGRzIHdlcmUgcmVhZC5cbisgKlxuKyAqIENvbXBhdGliaWxpdHkgbm90ZTogZW5hYmxpbmcgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEgb24gYSBmaWxlc3lzdGVtXG4rICogdGhhdCBhbHJlYWR5IGhhcyBjYXNlZm9sZGVkK2VuY3J5cHRlZCBkaXJlY3RvcmllcyBpcyBOT1Qgc2FmZSB3aXRob3V0IGFcbisgKiBwcmlvciBtaWdyYXRpb24gcGFzcy4gIEJlZm9yZSBkaXJkYXRhLCB0aGUgY2FzZWZvbGQrZnNjcnlwdCBoYXNoIHdhcyBzdG9yZWRcbisgKiBhcyBhIHJhdyA4IGJ5dGVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlbmFtZSB3aXRoIG5vIGZsYWcgaW4gZmlsZV90eXBlLlxuKyAqIEFmdGVyIGRpcmRhdGEgaXMgZW5hYmxlZCwgdGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoZSBoYXNoIHRvIGJlIHByZXNlbnQgb25seVxuKyAqIHdoZW4gRVhUNF9ESVJFTlRfQ0ZIQVNIICgweDQwKSBpcyBzZXQgaW4gZmlsZV90eXBlOyBleGlzdGluZyBlbnRyaWVzIHRoYXRcbisgKiBjYXJyeSB0aGUgcmF3IGhhc2ggYXJlIHNpbGVudGx5IG1pc3JlYWQgYXMgaGF2aW5nIG5vIGhhc2ggYXQgYWxsLCBicmVha2luZ1xuKyAqIGRpcmVjdG9yeSBsb29rdXBzLiAgZTJmc2NrIG11c3QgYmUgcnVuIHRvIGNvbnZlcnQgYWxsIGFmZmVjdGVkIGVudHJpZXMgdG9cbisgKiB0aGUgRVhUNF9ESVJFTlRfQ0ZIQVNIIGV4dGVuc2lvbiBmb3JtYXQgYmVmb3JlIHRoZSBmZWF0dXJlIGZsYWcgaXMgc2V0IHdpdGhcbisgKiB0dW5lMmZzLiAgRGV0ZWN0aW9uIGhldXJpc3RpYzogaW4gYSBjYXNlZm9sZCtlbmNyeXB0ZWQgZGlyZWN0b3J5LCBhbiBlbnRyeVxuKyAqIHdpdGggcmVjX2xlbiBcdTAwM2U9IHJvdW5kX3VwKG5hbWVfbGVuLCA0KSArIDggYW5kIG5vIEVYVDRfRElSRU5UX0NGSEFTSCBiaXRcbisgKiBjYXJyaWVzIGEgcmF3IHByZS1kaXJkYXRhIGhhc2ggdGhhdCBtdXN0IGJlIG1pZ3JhdGVkLlxuKyAqL1xuK3Vuc2lnbmVkIGNoYXIgZXh0NF9kaXJkYXRhX2dldChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuK1x0XHRcdCAgICAgICBpbnQgYnVmX3NpemUsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRmaWQsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvKVxuK3tcbitcdHVuc2lnbmVkIGNoYXIgcmV0ID0gMDtcbitcdHVuc2lnbmVkIGludCBkYXRhX29mZnNldCA9IGRlLVx1MDAzZW5hbWVfbGVuICsgMTtcbitcdHVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLCBidWZfc2l6ZSk7XG4rXG4rXHQvKiBkYXRhX29mZnNldCBpcyByZWxhdGl2ZSB0byBkZS1cdTAwM2VuYW1lLCB3aGljaCBpdHNlbGYgc3RhcnRzXG4rXHQgKiBFWFQ0X0JBU0VfRElSX0xFTiBieXRlcyBpbnRvIHRoZSBlbnRyeSAtLSByZWNfbGVuIGlzIHJlbGF0aXZlIHRvXG4rXHQgKiB0aGUgc3RhcnQgb2YgdGhlIGVudHJ5LCBzbyBhZGQgdGhlIGhlYWRlciBzaXplIGJlZm9yZSBjb21wYXJpbmcsXG4rXHQgKiBvciB0aGlzIGxldHMgcmVhZHMgcnVuIEVYVDRfQkFTRV9ESVJfTEVOIGJ5dGVzIHBhc3QgdGhlIGVudHJ5LiAqL1xuK1x0aWYgKEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgXHUwMDNlIHJlY19sZW4pXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHQvKiBjb21wYXRpYmlsaXR5OiBoYXNoIHN0b3JlZCBpbmxpbmUgYWZ0ZXIgZmlsZW5hbWUgKG5vIGRpcmRhdGEpICovXG4rXHRpZiAoaGluZm8gXHUwMDI2XHUwMDI2ICFleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVx1MDAzZWlfc2IpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkge1xuK1x0XHRoaW5mby1cdTAwM2VoYXNoID0gRVhUNF9ESVJFTlRfSEFTSChkZSk7XG4rXHRcdGhpbmZvLVx1MDAzZW1pbm9yX2hhc2ggPSBFWFQ0X0RJUkVOVF9NSU5PUl9IQVNIKGRlKTtcbitcdFx0cmV0IHw9IEVYVDRfRElSRU5UX0NGSEFTSDtcbitcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdC8qIEVYVDRfRElSRU5UXyogYml0cyBhcmUgb25seSBtZWFuaW5nZnVsIHdoZW4gdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCAqL1xuK1x0aWYgKCFleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVx1MDAzZWlfc2IpKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0aWYgKGRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjYgRVhUNF9ESVJFTlRfTFVGSUQpIHtcbitcdFx0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGlza19maWQgPVxuK1x0XHRcdChzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICopKChjaGFyICopZGUgK1xuK1x0XHRcdEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQpO1xuK1x0XHR1bnNpZ25lZCBpbnQgZGxlbjtcbitcdFx0Lyogc3RydWN0IGV4dDRfZmlkIGRmX2ZpZFtdIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFycmF5IHNpemUuXG4rXHRcdCAqIEZpcnN0LCB2ZXJpZnkgdGhhdCB0aGUgaGVhZGVyIGxpZXMgd2l0aGluIHRoZSB2YWxpZCBhcmVhLCB0aGVuXG4rIFx0XHQgKiB2ZXJpZnkgdGhhdCB0aGUgZW50aXJlIHJlY29yZCBmaXRzIHdpdGhpbiBpdC4gKi9cbitcdFx0aWYgKEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgK1xuK1x0XHQgICAgc2l6ZW9mKGRpc2tfZmlkLVx1MDAzZWRmX2hlYWRlcikgXHUwMDNlIHJlY19sZW4pXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcbitcdFx0ZGxlbiA9IGRpc2tfZmlkLVx1MDAzZWRmX2hlYWRlci5kZGhfbGVuZ3RoO1xuK1x0XHRpZiAoZGxlbiA9PSAwIHx8XG4rXHRcdCAgICBFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0ICsgZGxlbiBcdTAwM2UgcmVjX2xlbilcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1xuK1x0XHRpZiAoZGZpZCkge1xuK1x0XHRcdC8qIFRoZSBzaXplIGNhcCBiZWxvdyBlbnN1cmVzIHRoZSByZWNvcmQgaG9sZHMgYXQgbGVhc3RcbitcdFx0XHQgKiBvbmUgY29tcGxldGUgc3RydWN0IGV4dDRfZmlkLiAqL1xuK1x0XHRcdGlmIChkbGVuIFx1MDAzZSBzaXplb2Yoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyKSArXG4rXHRcdFx0XHQgICAgc2l6ZW9mKHN0cnVjdCBleHQ0X2ZpZCkpXG4rXHRcdFx0XHRyZXR1cm4gcmV0O1xuK1x0XHRcdG1lbWNweShkZmlkLCBkaXNrX2ZpZCwgZGxlbik7XG4rXHRcdFx0cmV0IHw9IEVYVDRfRElSRU5UX0xVRklEO1xuK1x0XHR9XG4rXHRcdGRhdGFfb2Zmc2V0ICs9IGRsZW47XG4rXHR9XG4rXG4rXHQvKiBTa2lwIElOTzY0IGZvciBub3cqL1xuK1x0aWYgKGRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjYgRVhUNF9ESVJFTlRfSU5PNjQpIHtcbitcdFx0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICpkZGggPVxuK1x0XHQgICAgICAgKHN0cnVjdCBleHQ0X2RpcmVudF9kYXRhX2hlYWRlciAqKSgoY2hhciAqKWRlICsgRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCk7XG4rXHRcdHVuc2lnbmVkIGludCBkbGVuO1xuK1xuK1x0XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCArIHNpemVvZigqZGRoKSBcdTAwM2UgcmVjX2xlbilcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1xuK1x0XHRkbGVuID0gZGRoLVx1MDAzZWRkaF9sZW5ndGg7XG4rXHRcdGlmIChkbGVuIFx1MDAzYyBzaXplb2YoKmRkaCkgfHxcbitcdFx0ICAgIEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgKyBkbGVuIFx1MDAzZSByZWNfbGVuKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXG4rXHRcdGRhdGFfb2Zmc2V0ICs9IGRsZW47XG4rXHR9XG4rXG4rXHRpZiAoIWhpbmZvKVxuK1x0XHRyZXR1cm4gcmV0O1xuK1xuK1x0aWYgKGRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjYgRVhUNF9ESVJFTlRfQ0ZIQVNIKSB7XG4rXHRcdHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICpkaCA9XG4rXHRcdFx0KHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICopKChjaGFyICopZGUgKyBFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0KTtcbitcdFx0dW5zaWduZWQgaW50IGRsZW47XG4rXG4rXHRcdGlmIChFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKCpkaCkgXHUwMDNlIHJlY19sZW4pXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdFx0ZGxlbiA9IGRoLVx1MDAzZWRoX2hlYWRlci5kZGhfbGVuZ3RoO1xuK1x0XHRpZiAoZGxlbiBcdTAwM2Mgc2l6ZW9mKCpkaCkgfHxcbitcdFx0ICAgIEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgKyBkbGVuIFx1MDAzZSByZWNfbGVuKVxuK1x0XHRcdHJldHVybiByZXQ7XG4rXG4rXHRcdGhpbmZvLVx1MDAzZWhhc2ggPSBsZTMyX3RvX2NwdShkaC1cdTAwM2VkaF9oYXNoLmhhc2gpO1xuK1x0XHRoaW5mby1cdTAwM2VtaW5vcl9oYXNoID0gbGUzMl90b19jcHUoZGgtXHUwMDNlZGhfaGFzaC5taW5vcl9oYXNoKTtcbitcdFx0cmV0IHw9IEVYVDRfRElSRU5UX0NGSEFTSDtcbitcdH1cbitcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuKy8qXG4rICogZXh0NF9kaXJkYXRhX3NldCgpIC0gV3JpdGUgZGlyZGF0YSBmaWVsZHMgaW50byBhIGRpcmVjdG9yeSBlbnRyeS5cbisgKiBAZGU6ICAgIGRpcmVjdG9yeSBlbnRyeSAobmFtZSBtdXN0IGFscmVhZHkgYmUgc2V0KVxuKyAqIEBkaXI6ICAgZGlyZWN0b3J5IGlub2RlXG4rICogQGRhdGE6ICBMVUZJRCBkYXRhIHRvIHN0b3JlIChvciBOVUxMKVxuKyAqIEBmbmFtZTogZmlsZW5hbWUgaW5mbyBjYXJyeWluZyB0aGUgY2FzZWZvbGQgaGFzaFxuKyAqXG4rICogV3JpdGVzIGFueSByZXF1aXJlZCBkaXJkYXRhIGludG8gQGRlIGFmdGVyIHRoZSBmaWxlbmFtZS4gIElmIHRoZSBkaXJkYXRhXG4rICogZmVhdHVyZSBpcyBub3QgZW5hYmxlZCwgZmFsbHMgYmFjayB0byB3cml0aW5nIHRoZSBoYXNoIGlubGluZSBhZnRlciB0aGVcbisgKiBmaWxlbmFtZSAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkZXIgY2FzZWZvbGQrZnNjcnlwdCBmb3JtYXQpLlxuKyAqXG4rICogU2VlIGV4dDRfZGlyZGF0YV9nZXQoKSBmb3IgdGhlIGNvbXBhdGliaWxpdHkgY29uc3RyYWludDogZW5hYmxpbmcgdGhlXG4rICogZGlyZGF0YSBmZWF0dXJlIG9uIGEgZmlsZXN5c3RlbSB3aXRoIGV4aXN0aW5nIGNhc2Vmb2xkZWQrZW5jcnlwdGVkXG4rICogZGlyZWN0b3JpZXMgcmVxdWlyZXMgYW4gZTJmc2NrIG1pZ3JhdGlvbiBwYXNzIGJlZm9yZSB0dW5lMmZzIHNldHMgdGhlXG4rICogRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEgc3VwZXJibG9jayBmbGFnLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGV4dDRfZGlyZGF0YV9zZXQoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbitcdFx0XHQgICAgIHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKmRmaWQsXG4rXHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUpXG4re1xuK1x0c3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8gPSBcdTAwMjZmbmFtZS1cdTAwM2VoaW5mbztcbitcdHVuc2lnbmVkIGludCBkYXRhX29mZnNldCA9IGRlLVx1MDAzZW5hbWVfbGVuICsgMTtcbitcdHVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLFxuK1x0XHRcdFx0XHRcdCAgICAgICBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4rXG4rXHQvKiBDbGVhciB0aGUgZ2FwIGJ5dGUgYmV0d2VlbiB0aGUgZmlsZW5hbWUgYW5kIHRoZSBmaXJzdCBkaXJkYXRhXG4rXHQgKiBleHRlbnNpb24gdG8gYXZvaWQgbGVha2luZyBzdGFsZSBtZW1vcnkgdG8gZGlzay4gIFVzZSBwb2ludGVyXG4rXHQgKiBhcml0aG1ldGljIHJhdGhlciB0aGFuIGRlLVx1MDAzZW5hbWVbbmFtZV9sZW5dIHRvIHN0YXkgd2l0aGluIHRoZVxuK1x0ICogZGVjbGFyZWQgbmFtZVtdIGFycmF5IGJvdW5kcyB1bmRlciBGT1JUSUZZX1NPVVJDRS4gIE9ubHkgd3JpdGUgaXRcbitcdCAqIHdoZW4gdGhlcmUgaXMgYWN0dWFsbHkgcm9vbSAoZW50cmllcyB0aGF0IGV4YWN0bHkgZmlsbCB0aGVpciBzbG90XG4rXHQgKiBoYXZlIHJlY19sZW4gPT0gRVhUNF9CQVNFX0RJUl9MRU4gKyBuYW1lX2xlbiB3aXRoIG5vIGdhcCkuICovXG4rXHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCBcdTAwM2M9IHJlY19sZW4pXG4rXHRcdCooKGNoYXIgKilkZSArIEVYVDRfQkFTRV9ESVJfTEVOICsgZGUtXHUwMDNlbmFtZV9sZW4pID0gMDtcbitcbitcdGlmIChkZmlkKSB7XG4rXHRcdHVuc2lnbmVkIGludCBkbGVuID0gZGZpZC1cdTAwM2VkZl9oZWFkZXIuZGRoX2xlbmd0aDtcbitcbitcdFx0aWYgKEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQgKyBkbGVuIFx1MDAzZSByZWNfbGVuKSB7XG4rXHRcdFx0RVhUNF9FUlJPUl9JTk9ERShkaXIsIFwiQ2FuIG5vdCBpbnNlcnQgRklEXCIpO1xuK1x0XHRcdHJldHVybjtcbitcdFx0fVxuK1xuK1x0XHRtZW1jcHkoKGNoYXIgKilkZSArIEVYVDRfQkFTRV9ESVJfTEVOICsgZGF0YV9vZmZzZXQsIGRmaWQsIGRsZW4pO1xuK1x0XHRkZS1cdTAwM2VmaWxlX3R5cGUgfD0gRVhUNF9ESVJFTlRfTFVGSUQ7XG4rXHRcdGRhdGFfb2Zmc2V0ICs9IGRsZW47XG4rXHR9XG4rXG4rXHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpKSB7XG4rXHRcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZGlyLVx1MDAzZWlfc2IpKSB7XG4rXHRcdFx0c3RydWN0IGV4dDRfZGlyZW50X2hhc2ggKmRoID1cbitcdFx0XHQgICAgKHN0cnVjdCBleHQ0X2RpcmVudF9oYXNoICopKChjaGFyICopZGUgKyBFWFQ0X0JBU0VfRElSX0xFTiArIGRhdGFfb2Zmc2V0KTtcbitcbitcdFx0XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCArIHNpemVvZigqZGgpIFx1MDAzZSByZWNfbGVuKSB7XG4rXHRcdFx0XHRFWFQ0X0VSUk9SX0lOT0RFKGRpciwgXCJDYW4gbm90IGluc2VydCBkaGFzaCBkaXJkYXRhXCIpO1xuK1x0XHRcdFx0cmV0dXJuO1xuK1x0XHRcdH1cbitcbitcdFx0XHRkaC1cdTAwM2VkaF9oZWFkZXIuZGRoX2xlbmd0aCA9IHNpemVvZigqZGgpO1xuK1x0XHRcdGRoLVx1MDAzZWRoX2hhc2guaGFzaCA9IGNwdV90b19sZTMyKGhpbmZvLVx1MDAzZWhhc2gpO1xuK1x0XHRcdGRoLVx1MDAzZWRoX2hhc2gubWlub3JfaGFzaCA9IGNwdV90b19sZTMyKGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gpO1xuK1x0XHRcdGRlLVx1MDAzZWZpbGVfdHlwZSB8PSBFWFQ0X0RJUkVOVF9DRkhBU0g7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0LyogQ29tcGF0aWJpbGl0eTogc3RvcmUgaGFzaCBpbmxpbmUgYWZ0ZXIgZmlsZW5hbWUgKi9cbitcdFx0XHRpZiAoRVhUNF9CQVNFX0RJUl9MRU4gKyBkYXRhX29mZnNldCArXG4rXHRcdFx0ICAgIHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfaGFzaCkgXHUwMDNlIHJlY19sZW4pIHtcbitcdFx0XHRcdEVYVDRfRVJST1JfSU5PREUoZGlyLCBcIkNhbiBub3QgaW5zZXJ0IGRoYXNoXCIpO1xuK1x0XHRcdFx0cmV0dXJuO1xuK1x0XHRcdH1cbitcbitcdFx0XHRFWFQ0X0RJUkVOVF9IQVNIRVMoZGUpLVx1MDAzZWhhc2ggPSBjcHVfdG9fbGUzMihoaW5mby1cdTAwM2VoYXNoKTtcbitcdFx0XHRFWFQ0X0RJUkVOVF9IQVNIRVMoZGUpLVx1MDAzZW1pbm9yX2hhc2ggPVxuK1x0XHRcdFx0XHRcdGNwdV90b19sZTMyKGhpbmZvLVx1MDAzZW1pbm9yX2hhc2gpO1xuK1x0XHR9XG4rXHR9XG4rfVxuK1xuIC8qXG4gICogQ3JlYXRlIG1hcCBvZiBoYXNoIHZhbHVlcywgb2Zmc2V0cywgYW5kIHNpemVzLCBzdG9yZWQgYXQgZW5kIG9mIGJsb2NrLlxuICAqIFJldHVybnMgbnVtYmVyIG9mIGVudHJpZXMgbWFwcGVkLlxuQEAgLTEyOTYsOSArMTU0OCw5IEBAIHN0YXRpYyBpbnQgZHhfbWFrZV9tYXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXG4gXHRcdFx0XHRcdCAoKGNoYXIgKilkZSkgLSBiYXNlKSlcbiBcdFx0XHRyZXR1cm4gLUVGU0NPUlJVUFRFRDtcbiBcdFx0aWYgKGRlLVx1MDAzZW5hbWVfbGVuIFx1MDAyNlx1MDAyNiBkZS1cdTAwM2Vpbm9kZSkge1xuLVx0XHRcdGlmIChleHQ0X2hhc2hfaW5fZGlyZW50KGRpcikpXG4tXHRcdFx0XHRoLmhhc2ggPSBFWFQ0X0RJUkVOVF9IQVNIKGRlKTtcbi1cdFx0XHRlbHNlIHtcbitcdFx0XHRpZiAoIShleHQ0X2RpcmRhdGFfZ2V0KGRlLCBkaXIsIGRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplLFxuK1x0XHRcdFx0XHQgICAgICAgTlVMTCwgXHUwMDI2aCkgXHUwMDI2XG4rXHRcdFx0XHRcdFx0RVhUNF9ESVJFTlRfQ0ZIQVNIKSkge1xuIFx0XHRcdFx0aW50IGVyciA9IGV4dDRmc19kaXJoYXNoKGRpciwgZGUtXHUwMDNlbmFtZSxcbiBcdFx0XHRcdFx0XHQgICAgIGRlLVx1MDAzZW5hbWVfbGVuLCBcdTAwMjZoKTtcbiBcdFx0XHRcdGlmIChlcnIgXHUwMDNjIDApXG5AQCAtMTQ4OCw3ICsxNzQwLDcgQEAgaW50IGV4dDRfc2VhcmNoX2RpcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBjaGFyICpzZWFyY2hfYnVmLCBpbnQgYnVmX3NpemUsXG4gfVxuIFxuIHN0YXRpYyBpbnQgaXNfZHhfaW50ZXJuYWxfbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgZXh0NF9sYmxrX3QgYmxvY2ssXG4tXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeSAqZGUpXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSlcbiB7XG4gXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLVx1MDAzZWlfc2I7XG4gXG5AQCAtMTYxOSw3ICsxODcxLDcgQEAgc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqX19leHQ0X2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsXG4gXHRcdH1cbiBcdFx0aWYgKCFidWZmZXJfdmVyaWZpZWQoYmgpIFx1MDAyNlx1MDAyNlxuIFx0XHQgICAgIWlzX2R4X2ludGVybmFsX25vZGUoZGlyLCBibG9jayxcbi1cdFx0XHRcdFx0IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnkgKiliaC1cdTAwM2ViX2RhdGEpIFx1MDAyNlx1MDAyNlxuK1x0XHRcdFx0XHQgKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopYmgtXHUwMDNlYl9kYXRhKSBcdTAwMjZcdTAwMjZcbiBcdFx0ICAgICFleHQ0X2RpcmJsb2NrX2NzdW1fdmVyaWZ5KGRpciwgYmgpKSB7XG4gXHRcdFx0RVhUNF9FUlJPUl9JTk9ERV9FUlIoZGlyLCBFRlNCQURDUkMsXG4gXHRcdFx0XHRcdCAgICAgXCJjaGVja3N1bW1pbmcgZGlyZWN0b3J5IFwiXG5AQCAtMTc1Myw3ICsyMDA1LDcgQEAgc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDRfZHhfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpcixcbiBlcnJvdXQ6XG4gXHRkeHRyYWNlKHByaW50ayhLRVJOX0RFQlVHIFwiJXMgbm90IGZvdW5kXFxuXCIsIGZuYW1lLVx1MDAzZXVzcl9mbmFtZS1cdTAwM2VuYW1lKSk7XG4gc3VjY2Vzczpcbi1cdGR4X3JlbGVhc2UoZnJhbWVzKTtcbitcdGR4X3JlbGVhc2UoZGlyLCBmcmFtZXMpO1xuIFx0cmV0dXJuIGJoO1xuIH1cbiBcbkBAIC0xODUwLDcgKzIxMDIsNyBAQCBkeF9tb3ZlX2RpcmVudHMoc3RydWN0IGlub2RlICpkaXIsIGNoYXIgKmZyb20sIGNoYXIgKnRvLFxuIFx0d2hpbGUgKGNvdW50LS0pIHtcbiBcdFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopXG4gXHRcdFx0XHRcdFx0KGZyb20gKyAobWFwLVx1MDAzZW9mZnNcdTAwM2NcdTAwM2MyKSk7XG4tXHRcdHJlY19sZW4gPSBleHQ0X2Rpcl9yZWNfbGVuKGRlLVx1MDAzZW5hbWVfbGVuLCBkaXIpO1xuK1x0XHRyZWNfbGVuID0gZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBibG9ja3NpemUsIGRpcik7XG4gXG4gXHRcdG1lbWNweSAodG8sIGRlLCByZWNfbGVuKTtcbiBcdFx0KChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKSB0byktXHUwMDNlcmVjX2xlbiA9XG5AQCAtMTg4Myw3ICsyMTM1LDcgQEAgc3RhdGljIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkeF9wYWNrX2RpcmVudHMoc3RydWN0IGlub2RlICpkaXIsIGNoYXIgKmJhc2UsXG4gXHR3aGlsZSAoKGNoYXIqKWRlIFx1MDAzYyBiYXNlICsgYmxvY2tzaXplKSB7XG4gXHRcdG5leHQgPSBleHQ0X25leHRfZW50cnkoZGUsIGJsb2Nrc2l6ZSk7XG4gXHRcdGlmIChkZS1cdTAwM2Vpbm9kZSBcdTAwMjZcdTAwMjYgZGUtXHUwMDNlbmFtZV9sZW4pIHtcbi1cdFx0XHRyZWNfbGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbiwgZGlyKTtcbitcdFx0XHRyZWNfbGVuID0gZXh0NF9kaXJfZW50cnlfbGVuKGRlLCBibG9ja3NpemUsIGRpcik7XG4gXHRcdFx0aWYgKGRlIFx1MDAzZSB0bylcbiBcdFx0XHRcdG1lbW1vdmUodG8sIGRlLCByZWNfbGVuKTtcbiBcdFx0XHR0by1cdTAwM2VyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2socmVjX2xlbiwgYmxvY2tzaXplKTtcbkBAIC0yMDM1LDEwICsyMjg3LDE1IEBAIHN0YXRpYyBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZG9fc3BsaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4gaW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxuIFx0XHQgICAgICB2b2lkICpidWYsIGludCBidWZfc2l6ZSxcbiBcdFx0ICAgICAgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuLVx0XHQgICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKmRlc3RfZGUpXG4rXHRcdCAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqZGVzdF9kZSxcbitcdFx0ICAgICAgaW50IGRsZW4pXG4ge1xuIFx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlO1xuLVx0dW5zaWduZWQgc2hvcnQgcmVjbGVuID0gZXh0NF9kaXJfcmVjX2xlbihmbmFtZV9sZW4oZm5hbWUpLCBkaXIpO1xuK1x0LyogV2hlbiBkaXJkYXRhIGV4dGVuc2lvbnMgYXJlIHByZXNlbnQsIGEgTlVMIGdhcCBieXRlIHNpdHMgYmV0d2VlblxuK1x0ICogdGhlIGZpbGVuYW1lIGFuZCB0aGUgZmlyc3QgZXh0ZW5zaW9uOyBhY2NvdW50IGZvciBpdCBzbyB0aGUgZm91bmRcbitcdCAqIHNsb3QgaXMgYWx3YXlzIGxhcmdlIGVub3VnaCBmb3IgZXh0NF9kaXJkYXRhX3NldCgpIHRvIHdyaXRlIGludG8uICovXG4rXHR1bnNpZ25lZCBzaG9ydCByZWNsZW4gPSBleHQ0X2RpcmVudF9yZWNfbGVuKGZuYW1lX2xlbihmbmFtZSkgKyBkbGVuICtcbitcdFx0XHRcdFx0XHQgICAgKGRsZW4gPyAxIDogMCksIGRpcik7XG4gXHRpbnQgbmxlbiwgcmxlbjtcbiBcdHVuc2lnbmVkIGludCBvZmZzZXQgPSAwO1xuIFx0Y2hhciAqdG9wO1xuQEAgLTIwNTEsNyArMjMwOCw3IEBAIGludCBleHQ0X2ZpbmRfZGVzdF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcbiBcdFx0XHRyZXR1cm4gLUVGU0NPUlJVUFRFRDtcbiBcdFx0aWYgKGV4dDRfbWF0Y2goZGlyLCBmbmFtZSwgZGUpKVxuIFx0XHRcdHJldHVybiAtRUVYSVNUO1xuLVx0XHRubGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbiwgZGlyKTtcbitcdFx0bmxlbiA9IGV4dDRfZGlyX2VudHJ5X2xlbihkZSwgYnVmX3NpemUsIGRpcik7XG4gXHRcdHJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRlLVx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcbiBcdFx0aWYgKChkZS1cdTAwM2Vpbm9kZSA/IHJsZW4gLSBubGVuIDogcmxlbikgXHUwMDNlPSByZWNsZW4pXG4gXHRcdFx0YnJlYWs7XG5AQCAtMjA2NSwxNiArMjMyMiwxMyBAQCBpbnQgZXh0NF9maW5kX2Rlc3RfZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tdm9pZCBleHQ0X2luc2VydF9kZW50cnkoc3RydWN0IGlub2RlICpkaXIsXG4tXHRcdFx0c3RydWN0IGlub2RlICppbm9kZSxcbi1cdFx0XHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsXG4tXHRcdFx0aW50IGJ1Zl9zaXplLFxuLVx0XHRcdHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSlcbit2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuK1x0XHRcdCAgICAgc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCBpbnQgYnVmX3NpemUsXG4rXHRcdFx0ICAgICBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsIHZvaWQgKmRhdGEpXG4ge1xuLVxuIFx0aW50IG5sZW4sIHJsZW47XG4gXG4tXHRubGVuID0gZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbiwgZGlyKTtcbitcdG5sZW4gPSBleHQ0X2Rpcl9lbnRyeV9sZW4oZGUsIGJ1Zl9zaXplLCBkaXIpO1xuIFx0cmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXHUwMDNlcmVjX2xlbiwgYnVmX3NpemUpO1xuIFx0aWYgKGRlLVx1MDAzZWlub2RlKSB7XG4gXHRcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZTEgPVxuQEAgLTIwODgsMTMgKzIzNDIsNyBAQCB2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdGV4dDRfc2V0X2RlX3R5cGUoaW5vZGUtXHUwMDNlaV9zYiwgZGUsIGlub2RlLVx1MDAzZWlfbW9kZSk7XG4gXHRkZS1cdTAwM2VuYW1lX2xlbiA9IGZuYW1lX2xlbihmbmFtZSk7XG4gXHRtZW1jcHkoZGUtXHUwMDNlbmFtZSwgZm5hbWVfbmFtZShmbmFtZSksIGZuYW1lX2xlbihmbmFtZSkpO1xuLVx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSkge1xuLVx0XHRzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbyA9IFx1MDAyNmZuYW1lLVx1MDAzZWhpbmZvO1xuLVxuLVx0XHRFWFQ0X0RJUkVOVF9IQVNIRVMoZGUpLVx1MDAzZWhhc2ggPSBjcHVfdG9fbGUzMihoaW5mby1cdTAwM2VoYXNoKTtcbi1cdFx0RVhUNF9ESVJFTlRfSEFTSEVTKGRlKS1cdTAwM2VtaW5vcl9oYXNoID1cbi1cdFx0XHRcdFx0XHRjcHVfdG9fbGUzMihoaW5mby1cdTAwM2VtaW5vcl9oYXNoKTtcbi1cdH1cbitcdGV4dDRfZGlyZGF0YV9zZXQoZGUsIGRpciwgZGF0YSwgZm5hbWUpO1xuIH1cbiBcbiAvKlxuQEAgLTIxMTIsMTQgKzIzNjAsMjggQEAgc3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4ge1xuIFx0dW5zaWduZWQgaW50XHRibG9ja3NpemUgPSBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbiBcdGludFx0XHRjc3VtX3NpemUgPSAwO1xuLVx0aW50XHRcdGVyciwgZXJyMjtcbitcdGludFx0XHRlcnIsIGVycjIsIGRsZW4gPSAwO1xuK1x0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGZpZDtcbiBcbiBcdGlmIChleHQ0X2hhc19mZWF0dXJlX21ldGFkYXRhX2NzdW0oaW5vZGUtXHUwMDNlaV9zYikpXG4gXHRcdGNzdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfdGFpbCk7XG4gXG4rXHQvKiBkZmlkIGlzIHJlc29sdmVkIG9uY2UgYnkgZXh0NF9hZGRfZW50cnkoKSBhbmQgc3RvcmVkIGluIGZuYW1lIHNvXG4rXHQgKiB0aGF0IGFsbCBhZGRfZGlyZW50X3RvX2J1ZigpIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSBhZGQgb3BlcmF0aW9uXG4rXHQgKiB1c2UgYSBjb25zaXN0ZW50IHZhbHVlIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHNoYXJlZCBpX2RpcmRhdGEgZmllbGQuICovXG4rXHRkZmlkID0gZm5hbWUtXHUwMDNlZGZpZDtcbiBcdGlmICghZGUpIHtcbitcdFx0aWYgKGRmaWQpXG4rXHRcdFx0ZGxlbiA9IGRmaWQtXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XG4rXHRcdC8qIGV4dDRfZGlyZW50X3JlY19sZW4oKSBkb2VzIG5vdCBhZGQgQ0ZIQVNIIHNpemUgd2hlbiBkaXJkYXRhIGlzXG4rXHRcdCAqIGVuYWJsZWQgKGl0IGFzc3VtZXMgdGhlIGNhbGxlciBpbmNsdWRlZCBpdCBpbiBuYW1lX2xlbikuICBBZGRcbitcdFx0ICogaXQgaGVyZSBzbyBleHQ0X2ZpbmRfZGVzdF9kZSgpIGFsbG9jYXRlcyBhIHNsb3QgbGFyZ2UgZW5vdWdoXG4rXHRcdCAqIGZvciBleHQ0X2RpcmRhdGFfc2V0KCkgdG8gd3JpdGUgdGhlIGhhc2ggZXh0ZW5zaW9uLiAqL1xuK1x0XHRpZiAoZXh0NF9oYXNoX2luX2RpcmVudChkaXIpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKGRpci1cdTAwM2VpX3NiKSlcbitcdFx0XHRkbGVuICs9IHNpemVvZihzdHJ1Y3QgZXh0NF9kaXJlbnRfaGFzaCk7XG4gXHRcdGVyciA9IGV4dDRfZmluZF9kZXN0X2RlKGRpciwgYmgsIGJoLVx1MDAzZWJfZGF0YSxcbi1cdFx0XHRcdFx0YmxvY2tzaXplIC0gY3N1bV9zaXplLCBmbmFtZSwgXHUwMDI2ZGUpO1xuK1x0XHRcdFx0XHRibG9ja3NpemUgLSBjc3VtX3NpemUsIGZuYW1lLCBcdTAwMjZkZSwgZGxlbik7XG4gXHRcdGlmIChlcnIpXG4gXHRcdFx0cmV0dXJuIGVycjtcbiBcdH1cbkBAIC0yMTMyLDcgKzIzOTQsNyBAQCBzdGF0aWMgaW50IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcbiBcdH1cbiBcbiBcdC8qIEJ5IG5vdyB0aGUgYnVmZmVyIGlzIG1hcmtlZCBmb3Igam91cm5hbGluZyAqL1xuLVx0ZXh0NF9pbnNlcnRfZGVudHJ5KGRpciwgaW5vZGUsIGRlLCBibG9ja3NpemUsIGZuYW1lKTtcbitcdGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKGRpciwgaW5vZGUsIGRlLCBibG9ja3NpemUsIGZuYW1lLCBkZmlkKTtcbiBcbiBcdC8qXG4gXHQgKiBYWFggc2hvdWxkbid0IHVwZGF0ZSBhbnkgdGltZXMgdW50aWwgc3VjY2Vzc2Z1bFxuQEAgLTIxNTYsNDQgKzI0MTgsMzggQEAgc3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRyZXR1cm4gZXJyID8gZXJyIDogZXJyMjtcbiB9XG4gXG4tc3RhdGljIGJvb2wgZXh0NF9jaGVja19keF9yb290KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZHhfcm9vdCAqcm9vdClcbitzdGF0aWMgYm9vbCBleHQ0X2NoZWNrX2R4X3Jvb3Qoc3RydWN0IGlub2RlICpkaXIsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkb3RfZGUsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkb3Rkb3RfZGUsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICoqZW50cnkpXG4ge1xuLVx0c3RydWN0IGZha2VfZGlyZW50ICpmZGU7XG4gXHRjb25zdCBjaGFyICplcnJvcl9tc2c7XG4tXHR1bnNpZ25lZCBpbnQgcmxlbjtcbiBcdHVuc2lnbmVkIGludCBibG9ja3NpemUgPSBkaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZTtcbi1cdGNoYXIgKmJsb2NrZW5kID0gKGNoYXIgKilyb290ICsgZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemU7XG4rXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSBOVUxMO1xuIFxuLVx0ZmRlID0gXHUwMDI2cm9vdC1cdTAwM2Vkb3Q7XG4tXHRpZiAodW5saWtlbHkoZmRlLVx1MDAzZW5hbWVfbGVuICE9IDEpKSB7XG4rXHRpZiAodW5saWtlbHkoZG90X2RlLVx1MDAzZW5hbWVfbGVuICE9IDEpKSB7XG4gXHRcdGVycm9yX21zZyA9IFwiaW52YWxpZCBuYW1lX2xlbiBmb3IgJy4nXCI7XG4gXHRcdGdvdG8gY29ycnVwdGVkO1xuIFx0fVxuLVx0aWYgKHVubGlrZWx5KHN0cm5jbXAocm9vdC1cdTAwM2Vkb3RfbmFtZSwgXCIuXCIsIGZkZS1cdTAwM2VuYW1lX2xlbikpKSB7XG4rXHRpZiAodW5saWtlbHkoc3RybmNtcChkb3RfZGUtXHUwMDNlbmFtZSwgXCIuXCIsIGRvdF9kZS1cdTAwM2VuYW1lX2xlbikpKSB7XG4gXHRcdGVycm9yX21zZyA9IFwiaW52YWxpZCBuYW1lIGZvciAnLidcIjtcbiBcdFx0Z290byBjb3JydXB0ZWQ7XG4gXHR9XG4tXHRybGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhmZGUtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKTtcbi1cdGlmICh1bmxpa2VseSgoY2hhciAqKWZkZSArIHJsZW4gXHUwMDNlPSBibG9ja2VuZCkpIHtcbi1cdFx0ZXJyb3JfbXNnID0gXCJpbnZhbGlkIHJlY19sZW4gZm9yICcuJ1wiO1xuLVx0XHRnb3RvIGNvcnJ1cHRlZDtcbi1cdH1cbiBcbi1cdGZkZSA9IFx1MDAyNnJvb3QtXHUwMDNlZG90ZG90O1xuLVx0aWYgKHVubGlrZWx5KGZkZS1cdTAwM2VuYW1lX2xlbiAhPSAyKSkge1xuK1x0aWYgKHVubGlrZWx5KGRvdGRvdF9kZS1cdTAwM2VuYW1lX2xlbiAhPSAyKSkge1xuIFx0XHRlcnJvcl9tc2cgPSBcImludmFsaWQgbmFtZV9sZW4gZm9yICcuLidcIjtcbiBcdFx0Z290byBjb3JydXB0ZWQ7XG4gXHR9XG4tXHRpZiAodW5saWtlbHkoc3RybmNtcChyb290LVx1MDAzZWRvdGRvdF9uYW1lLCBcIi4uXCIsIGZkZS1cdTAwM2VuYW1lX2xlbikpKSB7XG4rXHRpZiAodW5saWtlbHkoc3RybmNtcChkb3Rkb3RfZGUtXHUwMDNlbmFtZSwgXCIuLlwiLCBkb3Rkb3RfZGUtXHUwMDNlbmFtZV9sZW4pKSkge1xuIFx0XHRlcnJvcl9tc2cgPSBcImludmFsaWQgbmFtZSBmb3IgJy4uJ1wiO1xuIFx0XHRnb3RvIGNvcnJ1cHRlZDtcbiBcdH1cbi1cdHJsZW4gPSBleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGZkZS1cdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpO1xuLVx0aWYgKHVubGlrZWx5KChjaGFyICopZmRlICsgcmxlbiBcdTAwM2U9IGJsb2NrZW5kKSkge1xuK1x0ZGUgPSBleHQ0X25leHRfZW50cnkoZG90ZG90X2RlLCBibG9ja3NpemUpO1xuK1x0aWYgKChjaGFyICopZGUgXHUwMDNlPSAoKChjaGFyICopZG90X2RlKSArIGJsb2Nrc2l6ZSkpIHtcbiBcdFx0ZXJyb3JfbXNnID0gXCJpbnZhbGlkIHJlY19sZW4gZm9yICcuLidcIjtcbiBcdFx0Z290byBjb3JydXB0ZWQ7XG4gXHR9XG4tXG4rXHQqZW50cnkgPSBkZTtcbiBcdHJldHVybiB0cnVlO1xuIFxuIGNvcnJ1cHRlZDpcbkBAIC0yMjExLDE2ICsyNDY3LDE1IEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRcdFx0ICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpXG4ge1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7XG4tXHRzdHJ1Y3QgZHhfcm9vdFx0KnJvb3Q7XG4gXHRzdHJ1Y3QgZHhfZnJhbWVcdGZyYW1lc1tFWFQ0X0hUUkVFX0xFVkVMXSwgKmZyYW1lO1xuIFx0c3RydWN0IGR4X2VudHJ5ICplbnRyaWVzO1xuLVx0c3RydWN0IGV4dDRfZGlyX2VudHJ5XzJcdCpkZSwgKmRlMjtcbitcdHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yXHQqZGUsICpkZTIsICpkb3RfZGUsICpkb3Rkb3RfZGU7XG4gXHRjaGFyXHRcdCpkYXRhMiwgKnRvcDtcbiBcdHVuc2lnbmVkXHRsZW47XG4gXHRpbnRcdFx0cmV0dmFsO1xuIFx0dW5zaWduZWRcdGJsb2Nrc2l6ZTtcbiBcdGV4dDRfbGJsa190ICBibG9jaztcbi1cdHN0cnVjdCBmYWtlX2RpcmVudCAqZmRlO1xuK1x0c3RydWN0IGR4X3Jvb3RfaW5mbyAqZHhfaW5mbztcbiBcdGludCBjc3VtX3NpemUgPSAwO1xuIFxuIFx0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfbWV0YWRhdGFfY3N1bShpbm9kZS1cdTAwM2VpX3NiKSlcbkBAIC0yMjM3LDE3ICsyNDkyLDIwIEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRcdHJldHVybiByZXR2YWw7XG4gXHR9XG4gXG4tXHRyb290ID0gKHN0cnVjdCBkeF9yb290ICopIGJoLVx1MDAzZWJfZGF0YTtcbi1cdGlmICghZXh0NF9jaGVja19keF9yb290KGRpciwgcm9vdCkpIHtcbitcdGRvdF9kZSA9IChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKWJoLVx1MDAzZWJfZGF0YTtcbitcdGlmIChleHQ0X3JlY19sZW5fZnJvbV9kaXNrKGRvdF9kZS1cdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpIFx1MDAzYyBFWFQ0X0JBU0VfRElSX0xFTiB8fFxuK1x0ICAgIGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZG90X2RlLVx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSkgXHUwMDNlPSBibG9ja3NpemUgLSBFWFQ0X0JBU0VfRElSX0xFTikge1xuK1x0XHRicmVsc2UoYmgpO1xuK1x0XHRyZXR1cm4gLUVGU0NPUlJVUFRFRDtcbitcdH1cbitcdGRvdGRvdF9kZSA9IGV4dDRfbmV4dF9lbnRyeShkb3RfZGUsIGJsb2Nrc2l6ZSk7XG4rXHRpZiAoIWV4dDRfY2hlY2tfZHhfcm9vdChkaXIsIGRvdF9kZSwgZG90ZG90X2RlLCBcdTAwMjZkZSkpIHtcbiBcdFx0YnJlbHNlKGJoKTtcbiBcdFx0cmV0dXJuIC1FRlNDT1JSVVBURUQ7XG4gXHR9XG4gXG4gXHQvKiBUaGUgMHRoIGJsb2NrIGJlY29tZXMgdGhlIHJvb3QsIG1vdmUgdGhlIGRpcmVudHMgb3V0ICovXG4tXHRmZGUgPSBcdTAwMjZyb290LVx1MDAzZWRvdGRvdDtcbi1cdGRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopKChjaGFyICopZmRlICtcbi1cdFx0ZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhmZGUtXHUwMDNlcmVjX2xlbiwgYmxvY2tzaXplKSk7XG4tXHRsZW4gPSAoKGNoYXIgKikgcm9vdCkgKyAoYmxvY2tzaXplIC0gY3N1bV9zaXplKSAtIChjaGFyICopIGRlO1xuK1x0bGVuID0gKChjaGFyICopZG90X2RlKSArIChibG9ja3NpemUgLSBjc3VtX3NpemUpIC0gKGNoYXIgKilkZTtcbiBcbiBcdC8qIEFsbG9jYXRlIG5ldyBibG9jayBmb3IgdGhlIDB0aCBibG9jaydzIGRpcmVudHMgKi9cbiBcdGJoMiA9IGV4dDRfYXBwZW5kKGhhbmRsZSwgZGlyLCBcdTAwMjZibG9jayk7XG5AQCAtMjI3OCwyNCArMjUzNiwzMiBAQCBzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuIFx0XHRleHQ0X2luaXRpYWxpemVfZGlyZW50X3RhaWwoYmgyLCBibG9ja3NpemUpO1xuIFxuIFx0LyogSW5pdGlhbGl6ZSB0aGUgcm9vdDsgdGhlIGRvdCBkaXJlbnRzIGFscmVhZHkgZXhpc3QgKi9cbi1cdGRlID0gKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIChcdTAwMjZyb290LVx1MDAzZWRvdGRvdCk7XG4tXHRkZS1cdTAwM2VyZWNfbGVuID0gZXh0NF9yZWNfbGVuX3RvX2Rpc2soXG4tXHRcdFx0YmxvY2tzaXplIC0gZXh0NF9kaXJfcmVjX2xlbigyLCBOVUxMKSwgYmxvY2tzaXplKTtcbi1cdG1lbXNldCAoXHUwMDI2cm9vdC1cdTAwM2VpbmZvLCAwLCBzaXplb2Yocm9vdC1cdTAwM2VpbmZvKSk7XG4tXHRyb290LVx1MDAzZWluZm8uaW5mb19sZW5ndGggPSBzaXplb2Yocm9vdC1cdTAwM2VpbmZvKTtcbitcdGRvdGRvdF9kZS1cdTAwM2VyZWNfbGVuID1cbitcdFx0ZXh0NF9yZWNfbGVuX3RvX2Rpc2soYmxvY2tzaXplIC0gbGUxNl90b19jcHUoZG90X2RlLVx1MDAzZXJlY19sZW4pLFxuK1x0XHRcdFx0ICAgICBibG9ja3NpemUpO1xuK1xuK1x0LyogaW5pdGlhbGl6ZSBoYXNoaW5nIGluZm8gKi9cbitcdGR4X2luZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIGRvdF9kZSk7XG4rXHRpZiAoSVNfRVJSKGR4X2luZm8pKSB7XG4rXHRcdGJyZWxzZShiaDIpO1xuK1x0XHRicmVsc2UoYmgpO1xuK1x0XHRyZXR1cm4gUFRSX0VSUihkeF9pbmZvKTtcbitcdH1cbitcdG1lbXNldChkeF9pbmZvLCAwLCBzaXplb2YoKmR4X2luZm8pKTtcbitcdGR4X2luZm8tXHUwMDNlaW5mb19sZW5ndGggPSBzaXplb2YoKmR4X2luZm8pO1xuIFx0aWYgKGV4dDRfaGFzaF9pbl9kaXJlbnQoZGlyKSlcbi1cdFx0cm9vdC1cdTAwM2VpbmZvLmhhc2hfdmVyc2lvbiA9IERYX0hBU0hfU0lQSEFTSDtcbitcdFx0ZHhfaW5mby1cdTAwM2VoYXNoX3ZlcnNpb24gPSBEWF9IQVNIX1NJUEhBU0g7XG4gXHRlbHNlXG4tXHRcdHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb24gPVxuK1x0XHRkeF9pbmZvLVx1MDAzZWhhc2hfdmVyc2lvbiA9XG4gXHRcdFx0XHRFWFQ0X1NCKGRpci1cdTAwM2VpX3NiKS1cdTAwM2VzX2RlZl9oYXNoX3ZlcnNpb247XG4gXG4tXHRlbnRyaWVzID0gcm9vdC1cdTAwM2VlbnRyaWVzO1xuK1x0ZW50cmllcyA9ICh2b2lkICopZHhfaW5mbyArIGR4X2luZm8tXHUwMDNlaW5mb19sZW5ndGg7XG4gXHRkeF9zZXRfYmxvY2soZW50cmllcywgMSk7XG4gXHRkeF9zZXRfY291bnQoZW50cmllcywgMSk7XG4tXHRkeF9zZXRfbGltaXQoZW50cmllcywgZHhfcm9vdF9saW1pdChkaXIsIHNpemVvZihyb290LVx1MDAzZWluZm8pKSk7XG4rXHRkeF9zZXRfbGltaXQoZW50cmllcywgZHhfcm9vdF9saW1pdChkaXIsIGRvdF9kZSkpO1xuIFxuIFx0LyogSW5pdGlhbGl6ZSBhcyBmb3IgZHhfcHJvYmUgKi9cbi1cdGZuYW1lLVx1MDAzZWhpbmZvLmhhc2hfdmVyc2lvbiA9IHJvb3QtXHUwMDNlaW5mby5oYXNoX3ZlcnNpb247XG4rXHRmbmFtZS1cdTAwM2VoaW5mby5oYXNoX3ZlcnNpb24gPSBkeF9pbmZvLVx1MDAzZWhhc2hfdmVyc2lvbjtcbiBcdGlmIChmbmFtZS1cdTAwM2VoaW5mby5oYXNoX3ZlcnNpb24gXHUwMDNjPSBEWF9IQVNIX1RFQSlcbiBcdFx0Zm5hbWUtXHUwMDNlaGluZm8uaGFzaF92ZXJzaW9uICs9IEVYVDRfU0IoZGlyLVx1MDAzZWlfc2IpLVx1MDAzZXNfaGFzaF91bnNpZ25lZDtcbiBcdGZuYW1lLVx1MDAzZWhpbmZvLnNlZWQgPSBFWFQ0X1NCKGRpci1cdTAwM2VpX3NiKS1cdTAwM2VzX2hhc2hfc2VlZDtcbkBAIC0yMzM4LDcgKzI2MDQsNyBAQCBzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuIFx0ICovXG4gXHRpZiAocmV0dmFsKVxuIFx0XHRleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpO1xuLVx0ZHhfcmVsZWFzZShmcmFtZXMpO1xuK1x0ZHhfcmVsZWFzZShkaXIsIGZyYW1lcyk7XG4gXHRicmVsc2UoYmgyKTtcbiBcdHJldHVybiByZXR2YWw7XG4gfVxuQEAgLTIzNTUsNyArMjYyMSw4IEBAIHN0YXRpYyBpbnQgbWFrZV9pbmRleGVkX2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gICovXG4gc3RhdGljIGludCBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxuIFx0XHRcdCAgY29uc3Qgc3RydWN0IHFzdHIgKmRfbmFtZSxcbi1cdFx0XHQgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4rXHRcdFx0ICBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuK1x0XHRcdCAgc3RydWN0IGV4dDRfZGVudHJ5X3BhcmFtICplZHApXG4ge1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7XG4gXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGU7XG5AQCAtMjM4MCw2ICsyNjQ3LDEzIEBAIHN0YXRpYyBpbnQgX19leHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbiBcdGlmIChyZXR2YWwpXG4gXHRcdHJldHVybiByZXR2YWw7XG4gXG4rXHQvKiBSZXNvbHZlIHRoZSBMVUZJRCBwYXlsb2FkIG9uY2UgaGVyZSBhbmQgc3RvcmUgaXQgaW4gZm5hbWUgc28gZXZlcnlcbitcdCAqIGFkZF9kaXJlbnRfdG9fYnVmKCkgY2FsbCBpbiB0aGlzIGFkZCBvcGVyYXRpb24gdXNlcyB0aGUgc2FtZSB2YWx1ZVxuK1x0ICogd2l0aG91dCB0b3VjaGluZyB0aGUgc2hhcmVkIEVYVDRfSShpbm9kZSktXHUwMDNlaV9kaXJkYXRhIGZpZWxkLiAqL1xuK1x0Zm5hbWUuZGZpZCA9IGV4dDRfZGVudHJ5X2dldF9maWQoc2IsIGVkcCk7XG4rXHRpZiAoZm5hbWUuZGZpZClcbitcdFx0ZXh0NF9mY19tYXJrX2luZWxpZ2libGUoc2IsIEVYVDRfRkNfUkVBU09OX0RJUkRBVEEsIGhhbmRsZSk7XG4rXG4gXHRpZiAoZXh0NF9oYXNfaW5saW5lX2RhdGEoZGlyKSkge1xuIFx0XHRyZXR2YWwgPSBleHQ0X3RyeV9hZGRfaW5saW5lX2VudHJ5KGhhbmRsZSwgXHUwMDI2Zm5hbWUsIGRpciwgaW5vZGUpO1xuIFx0XHRpZiAocmV0dmFsIFx1MDAzYyAwKVxuQEAgLTI0NjQsNyArMjczOCw4IEBAIHN0YXRpYyBpbnQgZXh0NF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LFxuIFxuIFx0aWYgKGZzY3J5cHRfaXNfbm9rZXlfbmFtZShkZW50cnkpKVxuIFx0XHRyZXR1cm4gLUVOT0tFWTtcbi1cdHJldHVybiBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGlyLCBcdTAwMjZkZW50cnktXHUwMDNlZF9uYW1lLCBpbm9kZSk7XG4rXHRyZXR1cm4gX19leHQ0X2FkZF9lbnRyeShoYW5kbGUsIGRpciwgXHUwMDI2ZGVudHJ5LVx1MDAzZWRfbmFtZSwgaW5vZGUsXG4rXHRcdFx0XHRkZW50cnktXHUwMDNlZF9mc2RhdGEpO1xuIH1cbiBcbiAvKlxuQEAgLTI2MDUsNyArMjg4MCw3IEBAIHN0YXRpYyBpbnQgZXh0NF9keF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxuIFx0XHRcdGlmIChyZXN0YXJ0IHx8IGVycilcbiBcdFx0XHRcdGdvdG8gam91cm5hbF9lcnJvcjtcbiBcdFx0fSBlbHNlIHtcbi1cdFx0XHRzdHJ1Y3QgZHhfcm9vdCAqZHhyb290O1xuK1x0XHRcdHN0cnVjdCBkeF9yb290X2luZm8gKmluZm87XG4gXHRcdFx0bWVtY3B5KChjaGFyICopIGVudHJpZXMyLCAoY2hhciAqKSBlbnRyaWVzLFxuIFx0XHRcdCAgICAgICBpY291bnQgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7XG4gXHRcdFx0ZHhfc2V0X2xpbWl0KGVudHJpZXMyLCBkeF9ub2RlX2xpbWl0KGRpcikpO1xuQEAgLTI2MTMsMTEgKzI4ODgsMTcgQEAgc3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRcdFx0LyogU2V0IHVwIHJvb3QgKi9cbiBcdFx0XHRkeF9zZXRfY291bnQoZW50cmllcywgMSk7XG4gXHRcdFx0ZHhfc2V0X2Jsb2NrKGVudHJpZXMgKyAwLCBuZXdibG9jayk7XG4tXHRcdFx0ZHhyb290ID0gKHN0cnVjdCBkeF9yb290ICopZnJhbWVzWzBdLmJoLVx1MDAzZWJfZGF0YTtcbi1cdFx0XHRkeHJvb3QtXHUwMDNlaW5mby5pbmRpcmVjdF9sZXZlbHMgKz0gMTtcbitcdFx0XHRpbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilcbitcdFx0XHRcdFx0ICAgICAgZnJhbWVzWzBdLmJoLVx1MDAzZWJfZGF0YSk7XG4rXHRcdFx0aWYgKElTX0VSUihpbmZvKSkge1xuK1x0XHRcdFx0ZXJyID0gUFRSX0VSUihpbmZvKTtcbitcdFx0XHRcdGJyZWxzZShiaDIpO1xuK1x0XHRcdFx0Z290byBqb3VybmFsX2Vycm9yO1xuK1x0XHRcdH1cbitcdFx0XHRpbmZvLVx1MDAzZWluZGlyZWN0X2xldmVscyArPSAxO1xuIFx0XHRcdGR4dHJhY2UocHJpbnRrKEtFUk5fREVCVUdcbiBcdFx0XHRcdCAgICAgICBcIkNyZWF0aW5nICVkIGxldmVsIGluZGV4Li4uXFxuXCIsXG4tXHRcdFx0XHQgICAgICAgZHhyb290LVx1MDAzZWluZm8uaW5kaXJlY3RfbGV2ZWxzKSk7XG4rXHRcdFx0XHQgICAgICAgaW5mby1cdTAwM2VpbmRpcmVjdF9sZXZlbHMpKTtcbiBcdFx0XHRlcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9keF9ub2RlKGhhbmRsZSwgZGlyLCBmcmFtZS1cdTAwM2ViaCk7XG4gXHRcdFx0aWYgKGVycikge1xuIFx0XHRcdFx0YnJlbHNlKGJoMik7XG5AQCAtMjY0MSw3ICsyOTIyLDcgQEAgc3RhdGljIGludCBleHQ0X2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXG4gXHRleHQ0X3N0ZF9lcnJvcihkaXItXHUwMDNlaV9zYiwgZXJyKTsgLyogdGhpcyBpcyBhIG5vLW9wIGlmIGVyciA9PSAwICovXG4gY2xlYW51cDpcbiBcdGJyZWxzZShiaCk7XG4tXHRkeF9yZWxlYXNlKGZyYW1lcyk7XG4rXHRkeF9yZWxlYXNlKGRpciwgZnJhbWVzKTtcbiBcdC8qIEByZXN0YXJ0IGlzIHRydWUgbWVhbnMgaHRyZWUtcGF0aCBoYXMgYmVlbiBjaGFuZ2VkLCB3ZSBuZWVkIHRvXG4gXHQgKiByZXBlYXQgZHhfcHJvYmUoKSB0byBmaW5kIG91dCB2YWxpZCBodHJlZS1wYXRoXG4gXHQgKi9cbkBAIC0yOTMzLDcgKzMyMTQsNyBAQCBpbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXG4gXHRkZS1cdTAwM2Vpbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLVx1MDAzZWlfaW5vKTtcbiBcdGRlLVx1MDAzZW5hbWVfbGVuID0gMTtcbi1cdGRlLVx1MDAzZXJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhleHQ0X2Rpcl9yZWNfbGVuKGRlLVx1MDAzZW5hbWVfbGVuLCBOVUxMKSxcbitcdGRlLVx1MDAzZXJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhleHQ0X2RpcmVudF9yZWNfbGVuKGRlLVx1MDAzZW5hbWVfbGVuLCBOVUxMKSxcbiBcdFx0XHRcdFx0ICAgYmxvY2tzaXplKTtcbiBcdG1lbWNweShkZS1cdTAwM2VuYW1lLCBcIi5cIiwgMik7XG4gXHRleHQ0X3NldF9kZV90eXBlKGlub2RlLVx1MDAzZWlfc2IsIGRlLCBTX0lGRElSKTtcbkBAIC0yOTQ1LDcgKzMyMjYsNyBAQCBpbnQgZXh0NF9pbml0X2RpcmJsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXG4gXHRleHQ0X3NldF9kZV90eXBlKGlub2RlLVx1MDAzZWlfc2IsIGRlLCBTX0lGRElSKTtcbiBcdGlmIChpbmxpbmVfYnVmKSB7XG4gXHRcdGRlLVx1MDAzZXJlY19sZW4gPSBleHQ0X3JlY19sZW5fdG9fZGlzayhcbi1cdFx0XHRcdFx0ZXh0NF9kaXJfcmVjX2xlbihkZS1cdTAwM2VuYW1lX2xlbiwgTlVMTCksXG4rXHRcdFx0XHRcdGV4dDRfZGlyZW50X3JlY19sZW4oZGUtXHUwMDNlbmFtZV9sZW4sIE5VTEwpLFxuIFx0XHRcdFx0XHRibG9ja3NpemUpO1xuIFx0XHRkZSA9IGV4dDRfbmV4dF9lbnRyeShkZSwgYmxvY2tzaXplKTtcbiBcdFx0aGVhZGVyX3NpemUgPSAoY2hhciAqKWRlIC0gYmgtXHUwMDNlYl9kYXRhO1xuQEAgLTI5NTQsNyArMzIzNSw3IEBAIGludCBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdFx0XHRibG9ja3NpemUgLSBjc3VtX3NpemUpO1xuIFx0fSBlbHNlIHtcbiBcdFx0ZGUtXHUwMDNlcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl90b19kaXNrKGJsb2Nrc2l6ZSAtXG4tXHRcdFx0XHRcdChjc3VtX3NpemUgKyBleHQ0X2Rpcl9yZWNfbGVuKDEsIE5VTEwpKSxcbitcdFx0XHRcdFx0KGNzdW1fc2l6ZSArIGV4dDRfZGlyZW50X3JlY19sZW4oMSwgTlVMTCkpLFxuIFx0XHRcdFx0XHRibG9ja3NpemUpO1xuIFx0fVxuIFxuQEAgLTI5NjYsOCArMzI0Nyw5IEBAIGludCBleHQ0X2luaXRfZGlyYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSxcbiBcdHJldHVybiBleHQ0X2hhbmRsZV9kaXJ0eV9kaXJibG9jayhoYW5kbGUsIGlub2RlLCBiaCk7XG4gfVxuIFxuLWludCBleHQ0X2luaXRfbmV3X2RpcihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcbi1cdFx0XHQgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4raW50IGV4dDRfaW5pdF9uZXdfZGlyX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXG4rXHRcdFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcbitcdFx0XHQgICBjb25zdCB2b2lkICpkYXRhMSwgY29uc3Qgdm9pZCAqZGF0YTIpXG4ge1xuIFx0c3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmxvY2sgPSBOVUxMO1xuIFx0ZXh0NF9sYmxrX3QgYmxvY2sgPSAwO1xuQEAgLTMwNzcsOCArMzM1OSw4IEBAIGJvb2wgZXh0NF9lbXB0eV9kaXIoc3RydWN0IGlub2RlICppbm9kZSlcbiBcdH1cbiBcbiBcdHNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbi1cdGlmIChpbm9kZS1cdTAwM2VpX3NpemUgXHUwMDNjIGV4dDRfZGlyX3JlY19sZW4oMSwgTlVMTCkgK1xuLVx0XHRcdFx0XHRleHQ0X2Rpcl9yZWNfbGVuKDIsIE5VTEwpKSB7XG4rXHRpZiAoaW5vZGUtXHUwMDNlaV9zaXplIFx1MDAzYyBleHQ0X2RpcmVudF9yZWNfbGVuKDEsIE5VTEwpICtcbitcdFx0XHRcdFx0ZXh0NF9kaXJlbnRfcmVjX2xlbigyLCBOVUxMKSkge1xuIFx0XHRFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLCBcImludmFsaWQgc2l6ZVwiKTtcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFx0fVxuQEAgLTM0NjcsMTAgKzM3NDksMTYgQEAgaW50IF9fZXh0NF9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxuIFx0aWYgKElTX0RJUlNZTkMoZGlyKSlcbiBcdFx0ZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpO1xuIFxuK1x0LyogRmFzdC1jb21taXQgZG9lcyBub3QgcmVjb3JkIGRpcmRhdGEgaW4gaXRzIGpvdXJuYWwgZm9ybWF0OyBmb3JjZSBhXG4rXHQgKiBmdWxsIGpvdXJuYWwgY29tbWl0IHNvIHRoZSBMVUZJRCBzdXJ2aXZlcyBjcmFzaCtyZXBsYXkuICovXG4rXHRpZiAoZXh0NF9kZW50cnlfZ2V0X2ZpZChkaXItXHUwMDNlaV9zYiwgZGVudHJ5ID8gZGVudHJ5LVx1MDAzZWRfZnNkYXRhIDogTlVMTCkpXG4rXHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKGRpci1cdTAwM2VpX3NiLCBFWFQ0X0ZDX1JFQVNPTl9ESVJEQVRBLCBoYW5kbGUpO1xuK1xuIFx0aW5vZGVfc2V0X2N0aW1lX2N1cnJlbnQoaW5vZGUpO1xuIFx0ZXh0NF9pbmNfY291bnQoaW5vZGUpO1xuIFxuLVx0ZXJyID0gX19leHQ0X2FkZF9lbnRyeShoYW5kbGUsIGRpciwgZF9uYW1lLCBpbm9kZSk7XG4rXHRlcnIgPSBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGlyLCBkX25hbWUsIGlub2RlLFxuK1x0XHRcdCAgICAgICBkZW50cnkgPyBkZW50cnktXHUwMDNlZF9mc2RhdGEgOiBOVUxMKTtcbiBcdGlmICghZXJyKSB7XG4gXHRcdGVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTtcbiBcdFx0LyogdGhpcyBjYW4gaGFwcGVuIG9ubHkgZm9yIHRtcGZpbGUgYmVpbmdcbkBAIC0zNjM5LDcgKzM5MjcsOCBAQCBzdGF0aWMgaW50IGV4dDRfcmVuYW1lX2Rpcl9maW5pc2goaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCxcbiB9XG4gXG4gc3RhdGljIGludCBleHQ0X3NldGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9yZW5hbWVudCAqZW50LFxuLVx0XHQgICAgICAgdW5zaWduZWQgaW5vLCB1bnNpZ25lZCBmaWxlX3R5cGUpXG4rXHRcdCAgICAgICB1bnNpZ25lZCBpbm8sIHVuc2lnbmVkIGZpbGVfdHlwZSxcbitcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKnNyY19maWQpXG4ge1xuIFx0aW50IHJldHZhbCwgcmV0dmFsMjtcbiBcbkBAIC0zNjQ5LDggKzM5MzgsNTcgQEAgc3RhdGljIGludCBleHQ0X3NldGVudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9yZW5hbWVudCAqZW50LFxuIFx0aWYgKHJldHZhbClcbiBcdFx0cmV0dXJuIHJldHZhbDtcbiBcdGVudC1cdTAwM2VkZS1cdTAwM2Vpbm9kZSA9IGNwdV90b19sZTMyKGlubyk7XG4tXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9maWxldHlwZShlbnQtXHUwMDNlZGlyLVx1MDAzZWlfc2IpKVxuLVx0XHRlbnQtXHUwMDNlZGUtXHUwMDNlZmlsZV90eXBlID0gZmlsZV90eXBlO1xuK1x0aWYgKGV4dDRfaGFzX2ZlYXR1cmVfZmlsZXR5cGUoZW50LVx1MDAzZWRpci1cdTAwM2VpX3NiKSkge1xuK1x0XHQvKiBDb3B5IHRoZSBzb3VyY2UgTFVGSUQgcGF5bG9hZCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBzbG90IHdoZW5cbitcdFx0ICogYm90aCBjYXJyeSBhIExVRklEIG9mIHRoZSBzYW1lIG9uLWRpc2sgc2l6ZS4gIExVRklEIGlzXG4rXHRcdCAqIGlub2RlLXNwZWNpZmljIGFuZCBtdXN0IHRyYXZlbCB3aXRoIHRoZSBpbm9kZSB0aHJvdWdoIHJlbmFtZS5cbitcdFx0ICogQ0ZIQVNIIGJ5dGVzIGFyZSBsZWZ0IGluLXBsYWNlOiBDRkhBU0ggaXMgYSBmdW5jdGlvbiBvZiB0aGVcbitcdFx0ICogZGVzdGluYXRpb24gZmlsZW5hbWUsIGFuZCBpdHMgYnl0ZXMgc2l0IGF0IHRoZSBjb3JyZWN0IG9mZnNldFxuK1x0XHQgKiBiZWNhdXNlIExVRklEIGFsd2F5cyBwcmVjZWRlcyBDRkhBU0ggaW4gdGhlIGV4dGVuc2lvbiBsYXlvdXQuXG4rXHRcdCAqIFdoZW4gc3JjX2ZpZCBpcyBOVUxMLCB0aGUgTFVGSUQgZmxhZyBpcyBzeW5jZWQgdG8gdGhlIExVRklEXG4rXHRcdCAqIGJpdCBhbHJlYWR5IHByZXNlbnQgaW4gZmlsZV90eXBlOiBjYWxsZXJzIHRoYXQgY2xlYXIgTFVGSURcbitcdFx0ICogKHJlbmFtZSBvZiBhIG5vbi1MVUZJRCBpbm9kZSwgd2hpdGVvdXQpIHBhc3MgZmlsZV90eXBlIHdpdGhcbitcdFx0ICogTFVGSUQ9MDsgZXh0NF9yZXNldGVudCBwYXNzZXMgdGhlIG9yaWdpbmFsIGZpbGVfdHlwZSBzbyB0aGVcbitcdFx0ICogZmxhZyBpcyByZXN0b3JlZCBmb3IgZXJyb3IgcmVjb3Zlcnkgd2l0aG91dCBvdmVyd3JpdGluZyB0aGVcbitcdFx0ICogTFVGSUQgYnl0ZXMgdGhhdCBhcmUgc3RpbGwgaW50YWN0IG9uIGRpc2suICovXG4rXHRcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEoZW50LVx1MDAzZWRpci1cdTAwM2VpX3NiKSkge1xuK1x0XHRcdGlmIChzcmNfZmlkIFx1MDAyNlx1MDAyNiAoZW50LVx1MDAzZWRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjYgRVhUNF9ESVJFTlRfTFVGSUQpKSB7XG4rXHRcdFx0XHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9XG4rXHRcdFx0XHRcdGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZW50LVx1MDAzZWRlLVx1MDAzZXJlY19sZW4sXG4rXHRcdFx0XHRcdFx0ZW50LVx1MDAzZWRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbitcdFx0XHRcdHVuc2lnbmVkIGludCBkZGhfb2ZmID1cbitcdFx0XHRcdFx0RVhUNF9CQVNFX0RJUl9MRU4gKyBlbnQtXHUwMDNlZGUtXHUwMDNlbmFtZV9sZW4gKyAxO1xuK1x0XHRcdFx0c3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICpkZGggPVxuK1x0XHRcdFx0XHQoc3RydWN0IGV4dDRfZGlyZW50X2RhdGFfaGVhZGVyICopXG4rXHRcdFx0XHRcdCgoY2hhciAqKWVudC1cdTAwM2VkZSArIGRkaF9vZmYpO1xuK1x0XHRcdFx0dW5zaWduZWQgaW50IGNvcHlfbGVuID0gc3JjX2ZpZC1cdTAwM2VkZl9oZWFkZXIuZGRoX2xlbmd0aDtcbitcbitcdFx0XHRcdGlmIChkZGhfb2ZmICsgc2l6ZW9mKCpkZGgpIFx1MDAzZSByZWNfbGVuIHx8XG4rXHRcdFx0XHQgICAgZGRoLVx1MDAzZWRkaF9sZW5ndGggIT0gY29weV9sZW4gfHxcbitcdFx0XHRcdCAgICBkZGhfb2ZmICsgY29weV9sZW4gXHUwMDNlIHJlY19sZW4pIHtcbitcdFx0XHRcdFx0LyogQ2Fubm90IGNvcHk6IGNsZWFyIHRoZSBmbGFnIHNvIHRoZVxuK1x0XHRcdFx0XHQgKiBzbG90IGRvZXMgbm90IGFkdmVydGlzZSBhIHN0YWxlIExVRklEXG4rXHRcdFx0XHRcdCAqIGZyb20gdGhlIG9sZCBpbm9kZS4gKi9cbitcdFx0XHRcdFx0ZW50LVx1MDAzZWRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjY9IH5FWFQ0X0RJUkVOVF9MVUZJRDtcbitcdFx0XHRcdH0gZWxzZSB7XG4rXHRcdFx0XHRcdG1lbWNweShkZGgsIHNyY19maWQsIGNvcHlfbGVuKTtcbitcdFx0XHRcdH1cbitcdFx0XHR9IGVsc2UgaWYgKCFzcmNfZmlkKSB7XG4rXHRcdFx0XHQvKiBTeW5jIHRoZSBMVUZJRCBmbGFnIHdpdGggd2hhdCBmaWxlX3R5cGUgcmVxdWVzdHMuXG4rXHRcdFx0XHQgKiBGb3Igbm9ybWFsIHJlbmFtZSAoc291cmNlIGhhcyBubyBMVUZJRCkgYW5kIGZvclxuK1x0XHRcdFx0ICogdGhlIHdoaXRlb3V0IHNldGVudCwgZmlsZV90eXBlIGNhcnJpZXMgTFVGSUQ9MCxcbitcdFx0XHRcdCAqIHNvIHdlIGNsZWFyIHRoZSBzdGFsZSBmbGFnLiAgRm9yIGV4dDRfcmVzZXRlbnRcbitcdFx0XHRcdCAqIChlcnJvciByZWNvdmVyeSksIGZpbGVfdHlwZSBpcyB0aGUgb3JpZ2luYWxcbitcdFx0XHRcdCAqIGZpbGVfdHlwZSB3aXRoIExVRklEPTEsIHNvIHdlIHJlc3RvcmUgdGhlIGZsYWcg4oCUXG4rXHRcdFx0XHQgKiB0aGUgTFVGSUQgYnl0ZXMgYXJlIHN0aWxsIG9uIGRpc2sgdW50b3VjaGVkLiAqL1xuK1x0XHRcdFx0ZW50LVx1MDAzZWRlLVx1MDAzZWZpbGVfdHlwZSA9XG4rXHRcdFx0XHRcdChlbnQtXHUwMDNlZGUtXHUwMDNlZmlsZV90eXBlIFx1MDAyNiB+RVhUNF9ESVJFTlRfTFVGSUQpIHxcbitcdFx0XHRcdFx0KGZpbGVfdHlwZSBcdTAwMjYgRVhUNF9ESVJFTlRfTFVGSUQpO1xuK1x0XHRcdH1cbitcdFx0fVxuK1x0XHRlbnQtXHUwMDNlZGUtXHUwMDNlZmlsZV90eXBlID0gKGZpbGVfdHlwZSBcdTAwMjYgRVhUNF9GVF9NQVNLKSB8XG4rXHRcdFx0XHQgICAgIChlbnQtXHUwMDNlZGUtXHUwMDNlZmlsZV90eXBlIFx1MDAyNiB+RVhUNF9GVF9NQVNLKTtcbitcdH1cbiBcdGlub2RlX2luY19pdmVyc2lvbihlbnQtXHUwMDNlZGlyKTtcbiBcdGlub2RlX3NldF9tdGltZV90b190cyhlbnQtXHUwMDNlZGlyLCBpbm9kZV9zZXRfY3RpbWVfY3VycmVudChlbnQtXHUwMDNlZGlyKSk7XG4gXHRyZXR2YWwgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBlbnQtXHUwMDNlZGlyKTtcbkBAIC0zNjg3LDcgKzQwMjUsNyBAQCBzdGF0aWMgdm9pZCBleHQ0X3Jlc2V0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsXG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbi1cdGV4dDRfc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLCBpbm8sIGZpbGVfdHlwZSk7XG4rXHRleHQ0X3NldGVudChoYW5kbGUsIFx1MDAyNm9sZCwgaW5vLCBmaWxlX3R5cGUsIE5VTEwpO1xuIFx0YnJlbHNlKG9sZC5iaCk7XG4gfVxuIFxuQEAgLTM3ODYsNiArNDEyNCwzMiBAQCBzdGF0aWMgc3RydWN0IGlub2RlICpleHQ0X3doaXRlb3V0X2Zvcl9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsXG4gXHRyZXR1cm4gd2g7XG4gfVxuIFxuKy8qXG4rICogZXh0NF9sdWZpZF9zbmFwc2hvdCAtIGNvcHkgdGhlIExVRklEIHJlY29yZCBmcm9tIGEgZGlyZWN0b3J5IGVudHJ5XG4rICpcbisgKiBBbGxvY2F0ZXMgYW5kIHJldHVybnMgYSBrbWVtZHVwJ2QgY29weSBvZiB0aGUgZnVsbCBvbi1kaXNrIExVRklEIHJlY29yZFxuKyAqIChoZWFkZXIgKyBGSUQgcGF5bG9hZCBvZiBhcmJpdHJhcnkgbGVuZ3RoKS4gIFJldHVybnMgTlVMTCBpZiBubyBMVUZJRCBpc1xuKyAqIHByZXNlbnQsIHRoZSByZWNvcmQgaXMgbWFsZm9ybWVkLCBvciBhbGxvY2F0aW9uIGZhaWxzLiAgQ2FsbGVyIG11c3Qga2ZyZWUoKS5cbisgKi9cbitzdGF0aWMgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqXG4rZXh0NF9sdWZpZF9zbmFwc2hvdChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsIHVuc2lnbmVkIGludCBibG9ja3NpemUpXG4re1xuK1x0dW5zaWduZWQgaW50IGRkaF9vZmYgPSBFWFQ0X0JBU0VfRElSX0xFTiArIGRlLVx1MDAzZW5hbWVfbGVuICsgMTtcbitcdHVuc2lnbmVkIGludCByZWNfbGVuID0gZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkZS1cdTAwM2VyZWNfbGVuLCBibG9ja3NpemUpO1xuK1x0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqZGlza19maWQ7XG4rXHR1bnNpZ25lZCBpbnQgZGxlbjtcbitcbitcdGlmICghKGRlLVx1MDAzZWZpbGVfdHlwZSBcdTAwMjYgRVhUNF9ESVJFTlRfTFVGSUQpKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlmIChkZGhfb2ZmICsgc2l6ZW9mKGRpc2tfZmlkLVx1MDAzZWRmX2hlYWRlcikgXHUwMDNlIHJlY19sZW4pXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0ZGlza19maWQgPSAoc3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqKSgoY2hhciAqKWRlICsgZGRoX29mZik7XG4rXHRkbGVuID0gZGlza19maWQtXHUwMDNlZGZfaGVhZGVyLmRkaF9sZW5ndGg7XG4rXHRpZiAoZGxlbiBcdTAwM2Mgc2l6ZW9mKGRpc2tfZmlkLVx1MDAzZWRmX2hlYWRlcikgfHwgZGRoX29mZiArIGRsZW4gXHUwMDNlIHJlY19sZW4pXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0cmV0dXJuIGttZW1kdXAoZGlza19maWQsIGRsZW4sIEdGUF9OT0ZTKTtcbit9XG4rXG4gLypcbiAgKiBBbnlib2R5IGNhbiByZW5hbWUgYW55dGhpbmcgd2l0aCB0aGlzOiB0aGUgcGVybWlzc2lvbiBjaGVja3MgYXJlIGxlZnQgdG8gdGhlXG4gICogaGlnaGVyLWxldmVsIHJvdXRpbmVzLlxuQEAgLTM4MTQsNiArNDE3OCw3IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpcixcbiBcdHN0cnVjdCBpbm9kZSAqd2hpdGVvdXQgPSBOVUxMO1xuIFx0aW50IGNyZWRpdHM7XG4gXHR1OCBvbGRfZmlsZV90eXBlO1xuK1x0c3RydWN0IGV4dDRfZGlyZW50X2ZpZCAqb2xkX2ZpZCA9IE5VTEw7XG4gXG4gXHRpZiAobmV3Lmlub2RlIFx1MDAyNlx1MDAyNiBuZXcuaW5vZGUtXHUwMDNlaV9ubGluayA9PSAwKSB7XG4gXHRcdEVYVDRfRVJST1JfSU5PREUobmV3Lmlub2RlLFxuQEAgLTM5MjUsNyArNDI5MCw3IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpcixcbiBcdFx0ICogdG8gYmUgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIHZhbGlkIG9sZCBlbnRyeS5cbiBcdFx0ICovXG4gXHRcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLCB3aGl0ZW91dC1cdTAwM2VpX2lubyxcbi1cdFx0XHRcdCAgICAgRVhUNF9GVF9DSFJERVYpO1xuK1x0XHRcdFx0ICAgICBFWFQ0X0ZUX0NIUkRFViwgTlVMTCk7XG4gXHRcdGlmIChyZXR2YWwpXG4gXHRcdFx0Z290byBlbmRfcmVuYW1lO1xuIFx0XHRyZXR2YWwgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCB3aGl0ZW91dCk7XG5AQCAtMzkzOCw4ICs0MzAzLDE4IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpcixcbiBcdFx0aWYgKHJldHZhbClcbiBcdFx0XHRnb3RvIGVuZF9yZW5hbWU7XG4gXHR9IGVsc2Uge1xuK1x0XHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKG9sZC5kaXItXHUwMDNlaV9zYikpIHtcbitcdFx0XHRvbGRfZmlkID0gZXh0NF9sdWZpZF9zbmFwc2hvdChvbGQuZGUsXG4rXHRcdFx0XHRcdFx0ICAgICAgb2xkLmRpci1cdTAwM2VpX3NiLVx1MDAzZXNfYmxvY2tzaXplKTtcbitcdFx0XHRpZiAob2xkX2ZpZClcbitcdFx0XHRcdGV4dDRfZmNfbWFya19pbmVsaWdpYmxlKG9sZC5kaXItXHUwMDNlaV9zYixcbitcdFx0XHRcdFx0XHRcdEVYVDRfRkNfUkVBU09OX0RJUkRBVEEsXG4rXHRcdFx0XHRcdFx0XHRoYW5kbGUpO1xuK1x0XHRcdGVsc2VcbitcdFx0XHRcdG9sZF9maWxlX3R5cGUgXHUwMDI2PSB+RVhUNF9ESVJFTlRfTFVGSUQ7XG4rXHRcdH1cbiBcdFx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZuZXcsXG4tXHRcdFx0XHQgICAgIG9sZC5pbm9kZS1cdTAwM2VpX2lubywgb2xkX2ZpbGVfdHlwZSk7XG4rXHRcdFx0XHQgICAgIG9sZC5pbm9kZS1cdTAwM2VpX2lubywgb2xkX2ZpbGVfdHlwZSwgb2xkX2ZpZCk7XG4gXHRcdGlmIChyZXR2YWwpXG4gXHRcdFx0Z290byBlbmRfcmVuYW1lO1xuIFx0fVxuQEAgLTQwMjYsNiArNDQwMSw3IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpcixcbiBcdHJldHZhbCA9IDA7XG4gXG4gZW5kX3JlbmFtZTpcbitcdGtmcmVlKG9sZF9maWQpO1xuIFx0aWYgKHdoaXRlb3V0KSB7XG4gXHRcdGlmIChyZXR2YWwpIHtcbiBcdFx0XHRleHQ0X3Jlc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLFxuQEAgLTQwNjIsOCArNDQzOCw5IEBAIHN0YXRpYyBpbnQgZXh0NF9jcm9zc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LFxuIFx0XHQuZGVudHJ5ID0gbmV3X2RlbnRyeSxcbiBcdFx0Lmlub2RlID0gZF9pbm9kZShuZXdfZGVudHJ5KSxcbiBcdH07XG4tXHR1OCBuZXdfZmlsZV90eXBlO1xuK1x0dTggbmV3X2ZpbGVfdHlwZSwgb2xkX2RlX2ZpbGVfdHlwZTtcbiBcdGludCByZXR2YWw7XG4rXHRzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpvbGRfZmlkID0gTlVMTCwgKm5ld19maWQgPSBOVUxMO1xuIFxuIFx0aWYgKChleHQ0X3Rlc3RfaW5vZGVfZmxhZyhuZXdfZGlyLCBFWFQ0X0lOT0RFX1BST0pJTkhFUklUKSBcdTAwMjZcdTAwMjZcbiBcdCAgICAgIXByb2ppZF9lcShFWFQ0X0kobmV3X2RpciktXHUwMDNlaV9wcm9qaWQsXG5AQCAtNDE0MiwxMiArNDUxOSwyNyBAQCBzdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSxcbiBcdFx0XHRnb3RvIGVuZF9yZW5hbWU7XG4gXHR9XG4gXG4rXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKG9sZC5kaXItXHUwMDNlaV9zYikpIHtcbitcdFx0b2xkX2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3Qob2xkLmRlLCBvbGQuZGlyLVx1MDAzZWlfc2ItXHUwMDNlc19ibG9ja3NpemUpO1xuK1x0XHRuZXdfZmlkID0gZXh0NF9sdWZpZF9zbmFwc2hvdChuZXcuZGUsIG5ldy5kaXItXHUwMDNlaV9zYi1cdTAwM2VzX2Jsb2Nrc2l6ZSk7XG4rXHRcdGlmIChvbGRfZmlkIHx8IG5ld19maWQpXG4rXHRcdFx0ZXh0NF9mY19tYXJrX2luZWxpZ2libGUob2xkLmRpci1cdTAwM2VpX3NiLFxuK1x0XHRcdFx0XHRcdEVYVDRfRkNfUkVBU09OX0RJUkRBVEEsIGhhbmRsZSk7XG4rXHR9XG4rXG4rXHRvbGRfZGVfZmlsZV90eXBlID0gb2xkLmRlLVx1MDAzZWZpbGVfdHlwZTtcbitcdGlmICghb2xkX2ZpZClcbitcdFx0b2xkX2RlX2ZpbGVfdHlwZSBcdTAwMjY9IH5FWFQ0X0RJUkVOVF9MVUZJRDtcbiBcdG5ld19maWxlX3R5cGUgPSBuZXcuZGUtXHUwMDNlZmlsZV90eXBlO1xuLVx0cmV0dmFsID0gZXh0NF9zZXRlbnQoaGFuZGxlLCBcdTAwMjZuZXcsIG9sZC5pbm9kZS1cdTAwM2VpX2lubywgb2xkLmRlLVx1MDAzZWZpbGVfdHlwZSk7XG4rXHRpZiAoIW5ld19maWQpXG4rXHRcdG5ld19maWxlX3R5cGUgXHUwMDI2PSB+RVhUNF9ESVJFTlRfTFVGSUQ7XG4rXHRyZXR2YWwgPSBleHQ0X3NldGVudChoYW5kbGUsIFx1MDAyNm5ldywgb2xkLmlub2RlLVx1MDAzZWlfaW5vLCBvbGRfZGVfZmlsZV90eXBlLFxuK1x0XHRcdCAgICAgb2xkX2ZpZCk7XG4gXHRpZiAocmV0dmFsKVxuIFx0XHRnb3RvIGVuZF9yZW5hbWU7XG4gXG4tXHRyZXR2YWwgPSBleHQ0X3NldGVudChoYW5kbGUsIFx1MDAyNm9sZCwgbmV3Lmlub2RlLVx1MDAzZWlfaW5vLCBuZXdfZmlsZV90eXBlKTtcbitcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXHUwMDI2b2xkLCBuZXcuaW5vZGUtXHUwMDNlaV9pbm8sIG5ld19maWxlX3R5cGUsXG4rXHRcdFx0ICAgICBuZXdfZmlkKTtcbiBcdGlmIChyZXR2YWwpXG4gXHRcdGdvdG8gZW5kX3JlbmFtZTtcbiBcbkBAIC00MTgwLDYgKzQ1NzIsOCBAQCBzdGF0aWMgaW50IGV4dDRfY3Jvc3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSxcbiBcdHJldHZhbCA9IDA7XG4gXG4gZW5kX3JlbmFtZTpcbitcdGtmcmVlKG9sZF9maWQpO1xuK1x0a2ZyZWUobmV3X2ZpZCk7XG4gXHRicmVsc2Uob2xkLmRpcl9iaCk7XG4gXHRicmVsc2UobmV3LmRpcl9iaCk7XG4gXHRicmVsc2Uob2xkLmJoKTtcbkBAIC00MjE2LDYgKzQ2MTAsMTU0IEBAIHN0YXRpYyBpbnQgZXh0NF9yZW5hbWUyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLFxuIFx0cmV0dXJuIGV4dDRfcmVuYW1lKGlkbWFwLCBvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5LCBmbGFncyk7XG4gfVxuIFxuKy8qXG4rICogZXh0NF9kaXJkYXRhX3NldF9sdWZpZCgpIC0gU2V0IExVRklEIGRhdGEgb24gYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJ5XG4rICogQGRpcjogICAgICAgIHBhcmVudCBkaXJlY3RvcnkgaW5vZGVcbisgKiBAZmlsZW5hbWU6ICAgbmFtZSBvZiB0aGUgZmlsZSBpbiB0aGUgZGlyZWN0b3J5XG4rICogQG5hbWVsZW46ICAgIGxlbmd0aCBvZiBmaWxlbmFtZVxuKyAqIEBlZHA6ICAgICAgICBwb2ludGVyIHRvIGluaXRpYWxpemVkIGRlbnRyeSBwYXJhbSB3aXRoIExVRklEIGRhdGFcbisgKlxuKyAqIFRoaXMgZnVuY3Rpb24gZmluZHMgYW4gZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJ5LCBkZWxldGVzIGl0LCBhbmQgcmUtY3JlYXRlcyBpdFxuKyAqIHdpdGggTFVGSUQgZGF0YSBhdHRhY2hlZC4gVXNlZCBieSB0aGUgRVhUNF9JT0NfU0VUX0xVRklEIGlvY3RsLlxuKyAqXG4rICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS5cbisgKi9cbitpbnQgZXh0NF9kaXJkYXRhX3NldF9sdWZpZChzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3QgY2hhciAqZmlsZW5hbWUsXG4rXHRcdFx0ICAgIGludCBuYW1lbGVuLCBzdHJ1Y3QgZXh0NF9kZW50cnlfcGFyYW0gKmVkcClcbit7XG4rXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLVx1MDAzZWlfc2I7XG4rXHQgLyogemVyby1pbml0OiBzYWZlIHRvIGZyZWUgb24gYW55IHBhdGggKi9cbitcdHN0cnVjdCBleHQ0X2ZpbGVuYW1lIGZuYW1lID0ge307XG4rXHRzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSBOVUxMO1xuK1x0c3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7XG4rXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDtcbitcdGhhbmRsZV90ICpoYW5kbGUgPSBOVUxMO1xuK1x0c3RydWN0IHFzdHIgZF9uYW1lO1xuK1x0aW50IGVyciA9IDA7XG4rXG4rXHRpZiAoIWV4dDRfaGFzX2ZlYXR1cmVfZGlyZGF0YShzYikpXG4rXHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdGlmIChuYW1lbGVuIFx1MDAzZSBFWFQ0X05BTUVfTEVOKVxuK1x0XHRyZXR1cm4gLUVOQU1FVE9PTE9ORztcbitcdGlmIChuYW1lbGVuICE9IHN0cm5sZW4oZmlsZW5hbWUsIG5hbWVsZW4gKyAxKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4rXHRkX25hbWUubmFtZSA9IGZpbGVuYW1lO1xuK1x0ZF9uYW1lLmxlbiA9IG5hbWVsZW47XG4rXG4rXHRlcnIgPSBleHQ0X2ZuYW1lX3NldHVwX2ZpbGVuYW1lKGRpciwgXHUwMDI2ZF9uYW1lLCAwLCBcdTAwMjZmbmFtZSk7XG4rXHRpZiAoZXJyKVxuK1x0XHRnb3RvIG91dF9mcmVlO1xuK1xuK1x0LyogTG9jayBkaXIgd2l0aCB0aGUgVkZTIHBhcmVudC1tdXRhdGlvbiBzdWJjbGFzcyBiZWZvcmUgc3RhcnRpbmcgdGhlXG4rXHQgKiBqb3VybmFsLiAgSG9sZGluZyBpX3J3c2VtIHdoaWxlIGNhbGxpbmcgZXh0NF9qb3VybmFsX3N0YXJ0KCkgaXMgc2FmZVxuK1x0ICogKGV4dDRfc2V0YXR0ciwgZXh0NF9mYWxsb2NhdGUgZXRjLiBkbyB0aGUgc2FtZSkuICBUaGUgbG9va3VwIG11c3QgYmVcbitcdCAqIGluc2lkZSB0aGUgbG9jayB0byBwcmV2ZW50IFRPQ1RPVTogdGhlIGJoL2RlIHBvaW50ZXJzIG11c3QgYmUgc3RhYmxlXG4rXHQgKiBmcm9tIGZpbmRfZW50cnkgdGhyb3VnaCBkZWxldGVfZW50cnkuICovXG4rXHRpbm9kZV9sb2NrX25lc3RlZChkaXIsIElfTVVURVhfUEFSRU5UKTtcbitcbitcdGhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChkaXIsIEVYVDRfSFRfRElSLFxuK1x0XHRcdFx0ICAgIDMgKiBFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKHNiKSArXG4rXHRcdFx0XHQgICAgMiAqIEVYVDRfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTKTtcbitcdGlmIChJU19FUlIoaGFuZGxlKSkge1xuK1x0XHRlcnIgPSBQVFJfRVJSKGhhbmRsZSk7XG4rXHRcdGhhbmRsZSA9IE5VTEw7XG4rXHRcdGdvdG8gb3V0X3VubG9ja19kaXI7XG4rXHR9XG4rXG4rXHRiaCA9IGV4dDRfZmluZF9lbnRyeShkaXIsIFx1MDAyNmRfbmFtZSwgXHUwMDI2ZGUsIE5VTEwpO1xuK1x0aWYgKElTX0VSUihiaCkpIHtcbitcdFx0ZXJyID0gUFRSX0VSUihiaCk7XG4rXHRcdGJoID0gTlVMTDtcbitcdFx0Z290byBvdXRfam91cm5hbDtcbitcdH1cbitcdGlmICghYmgpIHtcbitcdFx0ZXJyID0gLUVOT0VOVDtcbitcdFx0Z290byBvdXRfam91cm5hbDtcbitcdH1cbitcbitcdGlub2RlID0gZXh0NF9pZ2V0KHNiLCBsZTMyX3RvX2NwdShkZS1cdTAwM2Vpbm9kZSksIEVYVDRfSUdFVF9OT1JNQUwpO1xuK1x0aWYgKElTX0VSUihpbm9kZSkpIHtcbitcdFx0ZXJyID0gUFRSX0VSUihpbm9kZSk7XG4rXHRcdGlub2RlID0gTlVMTDtcbitcdFx0Z290byBvdXRfYnJlbHNlO1xuK1x0fVxuK1xuK1x0LyogTG9jayB0aGUgdGFyZ2V0IGlub2RlIGFmdGVyIHRoZSBkaXJlY3RvcnkgKGRpci10aGVuLWNoaWxkIG9yZGVyaW5nKVxuK1x0ICogdG8gc2VyaWFsaXplIGNvbmN1cnJlbnQgRVhUNF9JT0NfU0VUX0xVRklEIGNhbGxzIG9uIGRpZmZlcmVudFxuK1x0ICogaGFyZGxpbmtzIG9mIHRoZSBzYW1lIGlub2RlLiAgVXNlIElfTVVURVhfQ0hJTEQgZm9yIGRpcmVjdG9yeSBpbm9kZXNcbitcdCAqIChjb25zaXN0ZW50IHdpdGggVkZTIHJlbmFtZS9ybWRpcikgYW5kIElfTVVURVhfTk9ORElSMiBmb3IgYWxsXG4rXHQgKiBvdGhlcnM7IG1peGluZyBzdWJjbGFzc2VzIG9uIHRoZSBzYW1lIGlub2RlIHRyaWdnZXJzIGxvY2tkZXAgY3ljbGVzXG4rXHQgKiB3aXRoIGNvbmN1cnJlbnQgcmVuYW1lLiAqL1xuK1x0aWYgKGlub2RlICE9IGRpcikge1xuK1x0XHRpZiAoU19JU0RJUihpbm9kZS1cdTAwM2VpX21vZGUpKVxuK1x0XHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX0NISUxEKTtcbitcdFx0ZWxzZVxuK1x0XHRcdGlub2RlX2xvY2tfbmVzdGVkKGlub2RlLCBJX01VVEVYX05PTkRJUjIpO1xuK1x0fVxuK1xuK1x0ZXJyID0gZXh0NF9kZWxldGVfZW50cnkoaGFuZGxlLCBkaXIsIGRlLCBiaCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRnb3RvIG91dF91bmxvY2s7XG4rXG4rXHRicmVsc2UoYmgpO1xuK1x0YmggPSBOVUxMO1xuK1xuK1x0LyogUmUtYWRkIHdpdGggTFVGSUQgdmlhIGRlbnRyeS1cdTAwM2VkX2ZzZGF0YS4gIGV4dDRfYWRkX2VudHJ5KCkgcmVzb2x2ZXNcbitcdCAqIGRmaWQgZnJvbSBkX2ZzZGF0YSBpbnRvIGZuYW1lLmRmaWQgYW5kIHBhc3NlcyBpdCB0aHJvdWdoIHRvXG4rXHQgKiBhZGRfZGlyZW50X3RvX2J1ZigpIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHNoYXJlZCBpX2RpcmRhdGEgZmllbGQsXG4rXHQgKiBlbGltaW5hdGluZyB0aGUgcmFjZSB3aXRoIGNvbmN1cnJlbnQgbGluaygpIGNhbGxzLiAqL1xuK1x0e1xuK1x0XHRzdHJ1Y3QgZGVudHJ5IHBhcmVudF9kZW50cnkgPSB7IC5kX2lub2RlID0gZGlyIH07XG4rXHRcdHN0cnVjdCBkZW50cnkgbmV3X2RlbnRyeSA9IHtcbitcdFx0XHQuZF9uYW1lID0gZF9uYW1lLFxuK1x0XHRcdC5kX3BhcmVudCA9IFx1MDAyNnBhcmVudF9kZW50cnksXG4rXHRcdFx0LmRfaW5vZGUgPSBpbm9kZSxcbitcdFx0XHQuZF9mc2RhdGEgPSBlZHAsXG4rXHRcdH07XG4rXHRcdGVyciA9IGV4dDRfYWRkX2VudHJ5KGhhbmRsZSwgXHUwMDI2bmV3X2RlbnRyeSwgaW5vZGUpO1xuK1x0fVxuK1xuK1x0aWYgKGVycikge1xuK1x0XHQvKiBEZWxldGUgc3VjY2VlZGVkIGJ1dCByZS1hZGQgZmFpbGVkOyB0cnkgdG8gcmVzdG9yZSBzbyB0aGVcbitcdFx0ICogaW5vZGUgaXMgbm90IGxlZnQgd2l0aG91dCBhIGRpcmVjdG9yeSBlbnRyeS4gKi9cbitcdFx0c3RydWN0IGRlbnRyeSBwYXJlbnRfZGVudHJ5ID0geyAuZF9pbm9kZSA9IGRpciB9O1xuK1x0XHRzdHJ1Y3QgZGVudHJ5IG9yaWdfZGVudHJ5ID0ge1xuK1x0XHRcdC5kX25hbWUgPSBkX25hbWUsXG4rXHRcdFx0LmRfcGFyZW50ID0gXHUwMDI2cGFyZW50X2RlbnRyeSxcbitcdFx0XHQuZF9pbm9kZSA9IGlub2RlLFxuK1x0XHR9O1xuK1x0XHRpbnQgcm9sbGJhY2tfZXJyID0gZXh0NF9hZGRfZW50cnkoaGFuZGxlLCBcdTAwMjZvcmlnX2RlbnRyeSwgaW5vZGUpO1xuK1xuK1x0XHRpZiAocm9sbGJhY2tfZXJyKVxuK1x0XHRcdEVYVDRfRVJST1JfSU5PREUoZGlyLFxuK1x0XHRcdFx0XCJGYWlsZWQgdG8gc2V0IExVRklEIG9uICclLipzJyAoZXJyPSVkKSBhbmQgZmFpbGVkIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGRpcmVjdG9yeSBlbnRyeSAoZXJyPSVkKTsgaW5vZGUgJWxsdSBtYXkgYmUgb3JwaGFuZWRcIixcbitcdFx0XHRcdG5hbWVsZW4sIGZpbGVuYW1lLCBlcnIsIHJvbGxiYWNrX2VycixcbitcdFx0XHRcdGlub2RlLVx1MDAzZWlfaW5vKTtcbitcdFx0Z290byBvdXRfdW5sb2NrO1xuK1x0fVxuK1xuK1x0aW5vZGVfc2V0X2N0aW1lX2N1cnJlbnQoZGlyKTtcbitcdGlub2RlX2luY19pdmVyc2lvbihkaXIpO1xuK1x0ZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTtcbitcbitvdXRfdW5sb2NrOlxuK1x0aWYgKGlub2RlICE9IGRpcilcbitcdFx0aW5vZGVfdW5sb2NrKGlub2RlKTtcbitvdXRfYnJlbHNlOlxuK1x0YnJlbHNlKGJoKTtcbitvdXRfam91cm5hbDpcbitcdGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7XG4rb3V0X3VubG9ja19kaXI6XG4rXHRpbm9kZV91bmxvY2soZGlyKTtcbitcdGlwdXQoaW5vZGUpO1xuK291dF9mcmVlOlxuK1x0ZXh0NF9mbmFtZV9mcmVlX2ZpbGVuYW1lKFx1MDAyNmZuYW1lKTtcbitcbitcdHJldHVybiBlcnI7XG4rfVxuK1xuIC8qXG4gICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi5cbiAgKi9cbmRpZmYgLS1naXQgYS9mcy9leHQ0L3N5c2ZzLmMgYi9mcy9leHQ0L3N5c2ZzLmNcbmluZGV4IDkyM2IzNzVlMDE3ZmFhLi44MDA3NGZiMTVlZTliNyAxMDA2NDRcbi0tLSBhL2ZzL2V4dDQvc3lzZnMuY1xuKysrIGIvZnMvZXh0NC9zeXNmcy5jXG5AQCAtMzYyLDYgKzM2Miw3IEBAIEVYVDRfQVRUUl9GRUFUVVJFKHZlcml0eSk7XG4gI2VuZGlmXG4gRVhUNF9BVFRSX0ZFQVRVUkUobWV0YWRhdGFfY3N1bV9zZWVkKTtcbiBFWFQ0X0FUVFJfRkVBVFVSRShmYXN0X2NvbW1pdCk7XG4rRVhUNF9BVFRSX0ZFQVRVUkUoZGlyZGF0YSk7XG4gI2lmIElTX0VOQUJMRUQoQ09ORklHX1VOSUNPREUpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19GU19FTkNSWVBUSU9OKVxuIEVYVDRfQVRUUl9GRUFUVVJFKGVuY3J5cHRlZF9jYXNlZm9sZCk7XG4gI2VuZGlmXG5AQCAtMzg1LDYgKzM4Niw3IEBAIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpleHQ0X2ZlYXRfYXR0cnNbXSA9IHtcbiAjZW5kaWZcbiBcdEFUVFJfTElTVChtZXRhZGF0YV9jc3VtX3NlZWQpLFxuIFx0QVRUUl9MSVNUKGZhc3RfY29tbWl0KSxcbitcdEFUVFJfTElTVChkaXJkYXRhKSxcbiAjaWYgSVNfRU5BQkxFRChDT05GSUdfVU5JQ09ERSkgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0ZTX0VOQ1JZUFRJT04pXG4gXHRBVFRSX0xJU1QoZW5jcnlwdGVkX2Nhc2Vmb2xkKSxcbiAjZW5kaWZcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZXh0NC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxuaW5kZXggOWM2ODM5OTFjMzJmOTYuLjkxMzRmZTY0OTQ3YTkzIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxuKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V4dDQuaFxuQEAgLTM1LDYgKzM1LDcgQEBcbiAjZGVmaW5lIEVYVDRfSU9DX1NFVEZTVVVJRFx0XHRfSU9XKCdmJywgNDQsIHN0cnVjdCBmc3V1aWQpXG4gI2RlZmluZSBFWFQ0X0lPQ19HRVRfVFVORV9TQl9QQVJBTVx0X0lPUignZicsIDQ1LCBzdHJ1Y3QgZXh0NF90dW5lX3NiX3BhcmFtcylcbiAjZGVmaW5lIEVYVDRfSU9DX1NFVF9UVU5FX1NCX1BBUkFNXHRfSU9XKCdmJywgNDYsIHN0cnVjdCBleHQ0X3R1bmVfc2JfcGFyYW1zKVxuKyNkZWZpbmUgRVhUNF9JT0NfU0VUX0xVRklEXHRcdF9JT1coJ2YnLCA0Nywgc3RydWN0IGV4dDRfc2V0X2x1ZmlkKVxuIFxuICNkZWZpbmUgRVhUNF9JT0NfU0hVVERPV04gX0lPUignWCcsIDEyNSwgX191MzIpXG4gXG5AQCAtOTIsNiArOTMsMTkgQEAgc3RydWN0IG1vdmVfZXh0ZW50IHtcbiBcdF9fdTY0IG1vdmVkX2xlbjtcdC8qIG1vdmVkIGJsb2NrIGxlbmd0aCAqL1xuIH07XG4gXG4rLypcbisgKiBTdHJ1Y3R1cmUgZm9yIEVYVDRfSU9DX1NFVF9MVUZJRFxuKyAqIFNldHMgTFVGSUQgb24gYSBkaXJlY3RvcnkgZW50cnlcbisgKiBDYWxsZWQgb24gcGFyZW50IGRpcmVjdG9yeSB3aXRoIGZpbGVuYW1lIGFuZCBMVUZJRCBkYXRhIGFzIGFyZ3VtZW50c1xuKyAqL1xuK3N0cnVjdCBleHQ0X3NldF9sdWZpZCB7XG4rXHRfX3U4IGVzbF9uYW1lX2xlbjtcdC8qIGxlbmd0aCBvZiBmaWxlbmFtZSwgTk9UIGluY2x1ZGluZyBOVUwgdGVybWluYXRvclxuK1x0XHRcdFx0ICogKHZhbGlkIHJhbmdlOiAxLTI1NSwgbWF0Y2hpbmcgRVhUNF9OQU1FX0xFTikgKi9cbitcdGNoYXIgIGVzbF9uYW1lWzI1NSArIDFdOyAvKiBmaWxlbmFtZSAoTlVMLXRlcm1pbmF0ZWQpICovXG4rXHRfX3U4IGVzbF9kYXRhX2xlbjtcdC8qIGxlbmd0aCBvZiBMVUZJRCBkYXRhICovXG4rXHRjaGFyICBlc2xfZGF0YVsyNTVdOyAvKiBMVUZJRCBkYXRhIChyYXcgYnl0ZXMpICovXG4rfTtcbitcbiAvKlxuICAqIEZsYWdzIHVzZWQgYnkgRVhUNF9JT0NfU0hVVERPV05cbiAgKi9cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQyOjA4LjA0MjI2ODczNVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc2NDUwMDI4MTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgYGRpcmRhdGFgIFBhdGNoIGZvciBleHQ0KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBmb3IgZXh0NCB0aGF0IGludHJvZHVjZXMgYGRpcmRhdGFgLCB1c2luZyBgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEFgIGFuZCB0aGUgYEVYVDRfSU9DX1NFVF9MVUZJRGAgaW9jdGwuIFJpZ2h0IG9mZiB0aGUgYmF0LCBJIHNlZSB0aGlzIGlzIGEgKmZ1bmN0aW9uYWwqIGNoYW5nZSDigJMgd2UncmUgdGFsa2luZyBhYm91dCBuZXcgaW9jdGwgaGFuZGxpbmcsIGRpcmVjdG9yeSBlbnRyeSBwYXJzaW5nIGNoYW5nZXMsIG5ldyBzdHJ1Y3R1cmVzLCB0aGUgd29ya3MuIERlZmluaXRlbHkgZnV6ei13b3J0aHkuIExldCdzIHBpbnBvaW50IHRob3NlIGtleSBmdW5jdGlvbnMgdG8gdGFyZ2V0LlxuXG5Mb29raW5nIG92ZXIgdGhlIGNvZGUsIGl0IGxvb2tzIGxpa2UgdGhlc2UgYXJlIHRoZSBob3RzcG90czogYGV4dDRfaW9jdGxfc2V0X2x1ZmlkYCwgYGV4dDRfZGlyZGF0YV9zZXRfbHVmaWRgLCBgZXh0NF9kaXJkYXRhX2dldGAsIGBleHQ0X2RpcmRhdGFfc2V0YCwgYGV4dDRfbHVmaWRfc25hcHNob3RgLCBgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGFgLCBhbmQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLiBNeSBpbnN0aW5jdHMgdGVsbCBtZSB0byBmb2N1cyBvbiBgZXh0NF9pb2N0bF9zZXRfbHVmaWRgIGFuZCBgZXh0NF9kaXJkYXRhX3NldF9sdWZpZGAgYXMgZW50cnkgcG9pbnRzLiBMZXQncyBzZWUgaWYgdGhvc2UgYXJlIGFjdHVhbGx5IHJlYWNoYWJsZSB3aXRoaW4gdGhlIGZpbGVzeXN0ZW0uIEkgY2FuIHVzZSB0aGUgdXN1YWwgdG9vbHMsIGBjb2Rlc2VhcmNoLWRpci1pbmRleGAgb3IgYGdyZXBwZXJgIHNob3VsZCBkbyB0aGUgdHJpY2suXG5cbkFscmlnaHQsIGEgcXVpY2sgY2hlY2sgcmV2ZWFscyB0aGV5J3JlIHNpdHRpbmcgaW4gYGZzL2V4dDQvaW9jdGwuY2AgYW5kIGBmcy9leHQ0L25hbWVpLmNgLiBHb29kLCB0aGF0IG5hcnJvd3MgZG93biB0aGUgc2NvcGUuIE5vdywgdGhlIGJpZyBxdWVzdGlvbiBpcyBkZXBlbmRlbmNpZXMuIFdoYXQgY29uZmlndXJhdGlvbnMgbmVlZCB0byBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmU/IEkgc2VlIHRoZSBwYXRjaCBtZW50aW9ucyBgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEFgLCBidXQgaXMgdGhlcmUgYSBjb3JyZXNwb25kaW5nIGBDT05GSUdfRVhUNF9ESVJEQVRBYCBvciBzb21ldGhpbmcgc2ltaWxhcj8gSSdsbCBydW4gYSBxdWljayBncmVwIGZvciBgQ09ORklHX0VYVDRgIGFuZCBgRElSREFUQWAgdG8gY29uZmlybS4gVGhpcyBpcyBnb2luZyB0byBiZSBteSBiYXNlbGluZSBmb3IgZnV6emluZyBhbmQgaWYgaXQncyBub3QgZW5hYmxlZCwgSSBoYXZlIHRvIGVuc3VyZSB0aG9zZSBjb25maWd1cmF0aW9ucyBhcmUgaW4gdGhlIGZ1enppbmcgcHJvZmlsZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQzMTksIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNDUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0MjoxNS42ODcyNzQzMDhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzAwOTY1Mzg3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19FWFQ0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvLmt1bml0Y29uZmlnPTE9Q09ORklHX0tVTklUPXlcXG5mcy9leHQ0Ly5rdW5pdGNvbmZpZzoyOkNPTkZJR19FWFQ0X0ZTPXlcXG5mcy9leHQ0Ly5rdW5pdGNvbmZpZzozOkNPTkZJR19FWFQ0X0tVTklUX1RFU1RTPXlcXG4tLVxcbmZzL2V4dDQvTWFrZWZpbGUtNS1cXG5mcy9leHQ0L01ha2VmaWxlOjY6b2JqLSQoQ09ORklHX0VYVDRfRlMpICs9IGV4dDQub1xcbmZzL2V4dDQvTWFrZWZpbGUtNy1cXG5mcy9leHQ0L01ha2VmaWxlPTg9ZXh0NC15XFx0Oj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIubyBleHQ0X2piZDIubyBleHRlbnRzLm8gXFxcXFxcbi0tXFxuZnMvZXh0NC9NYWtlZmlsZS0xNC1cXG5mcy9leHQ0L01ha2VmaWxlOjE1OmV4dDQtJChDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wpXFx0Kz0gYWNsLm9cXG5mcy9leHQ0L01ha2VmaWxlOjE2OmV4dDQtJChDT05GSUdfRVhUNF9GU19TRUNVUklUWSlcXHRcXHQrPSB4YXR0cl9zZWN1cml0eS5vXFxuZnMvZXh0NC9NYWtlZmlsZS0xNy1leHQ0LXRlc3Qtb2Jqc1xcdFxcdFxcdFxcdCs9IGlub2RlLXRlc3QubyBtYmFsbG9jLXRlc3QubyBcXFxcXFxuZnMvZXh0NC9NYWtlZmlsZS0xOC1cXHRcXHRcXHRcXHRcXHQgICBleHRlbnRzLXRlc3QubyBoYXNoLXRlc3Qub1xcbmZzL2V4dDQvTWFrZWZpbGU6MTk6b2JqLSQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXFx0XFx0Kz0gZXh0NC10ZXN0Lm9cXG5mcy9leHQ0L01ha2VmaWxlLTIwLWV4dDQtJChDT05GSUdfRlNfVkVSSVRZKVxcdFxcdCs9IHZlcml0eS5vXFxuLS1cXG5mcy9leHQ0L2FjbC5oPTM5PXN0YXRpYyBpbmxpbmUgaW50IGV4dDRfYWNsX2NvdW50KHNpemVfdCBzaXplKVxcbi0tXFxuZnMvZXh0NC9hY2wuaC01NC1cXG5mcy9leHQ0L2FjbC5oOjU1OiNpZmRlZiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0xcXG5mcy9leHQ0L2FjbC5oLTU2LVxcbi0tXFxuZnMvZXh0NC9hY2wuaD02MT1leHRlcm4gaW50IGV4dDRfaW5pdF9hY2woaGFuZGxlX3QgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTtcXG5mcy9leHQ0L2FjbC5oLTYyLVxcbmZzL2V4dDQvYWNsLmg6NjM6I2Vsc2UgIC8qIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCAqL1xcbmZzL2V4dDQvYWNsLmgtNjQtI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3NjaGVkLmhcXHUwMDNlXFxuLS1cXG5mcy9leHQ0L2FjbC5oPTY5PWV4dDRfaW5pdF9hY2woaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpXFxuLS1cXG5mcy9leHQ0L2FjbC5oLTcyLX1cXG5mcy9leHQ0L2FjbC5oOjczOiNlbmRpZiAgLyogQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMICovXFxuZnMvZXh0NC9hY2wuaC03NC1cXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTkxLSAqL1xcbmZzL2V4dDQvZXh0NC5oOjkyOiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xcbmZzL2V4dDQvZXh0NC5oLTkzLSNkZWZpbmUgZXh0X2RlYnVnKGlubywgZm10LCAuLi4pXFx0XFx0XFx0XFx0XFx0XFxcXFxcbi0tXFxuZnMvZXh0NC9leHQ0Lmg9MTU4Nz1zdHJ1Y3QgZXh0NF9zYl9pbmZvIHtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTE3OTYtXFx0dTY0IHNfZGF4X3BhcnRfb2ZmO1xcbmZzL2V4dDQvZXh0NC5oOjE3OTc6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXFxuZnMvZXh0NC9leHQ0LmgtMTc5OC1cXHR1bnNpZ25lZCBsb25nIHNfc2ltdWxhdGVfZmFpbDtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTE4NTktXFx0dGlkX3Qgc19mY19pbmVsaWdpYmxlX3RpZDtcXG5mcy9leHQ0L2V4dDQuaDoxODYwOiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xcbmZzL2V4dDQvZXh0NC5oLTE4NjEtXFx0aW50IHNfZmNfZGVidWdfbWF4X3JlcGxheTtcXG4tLVxcbmZzL2V4dDQvZXh0NC5oPTE5ODQ9c3RhdGljIGlubGluZSBib29sIGV4dDRfc2ltdWxhdGVfZmFpbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLFxcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMTk4Ni17XFxuZnMvZXh0NC9leHQ0Lmg6MTk4NzojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L2V4dDQuaC0xOTg4LVxcdHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpO1xcbi0tXFxuZnMvZXh0NC9leHQ0Lmg9NDIyNz1leHRlcm4gaW50IGV4dDRfYmxvY2tfd3JpdGVfYmVnaW4oaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTQyMzAtXFxuZnMvZXh0NC9leHQ0Lmg6NDIzMTojaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcXG5mcy9leHQ0L2V4dDQuaC00MjMyLSNkZWZpbmUgRVhQT1JUX1NZTUJPTF9GT1JfRVhUNF9URVNUKHN5bSkgXFxcXFxcbi0tXFxuZnMvZXh0NC9leHQ0X2V4dGVudHMuaD0yNzA9ZXh0ZXJuIGludCBleHQ0X2V4dF96ZXJvb3V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQ0X2V4dGVudCAqZXgpO1xcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmg6MjcxOiNpZiBJU19FTkFCTEVEKENPTkZJR19FWFQ0X0tVTklUX1RFU1RTKVxcbmZzL2V4dDQvZXh0NF9leHRlbnRzLmgtMjcyLWV4dGVybiBpbnQgZXh0NF9leHRfc3BhY2Vfcm9vdF9pZHhfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2hlY2spO1xcbi0tXFxuZnMvZXh0NC9leHRlbnRzLmM9NjIyNz1pbnQgZXh0NF9leHRfY2xlYXJfYmIoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvZXh0ZW50cy5jLTYyNzgtXFxuZnMvZXh0NC9leHRlbnRzLmM6NjI3OTojaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcXG5mcy9leHQ0L2V4dGVudHMuYy02MjgwLWludCBleHQ0X2V4dF9zcGFjZV9yb290X2lkeF90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjaGVjaylcXG4tLVxcbmZzL2V4dDQvZmFzdF9jb21taXQuYz0yNTgxPXN0YXRpYyBpbnQgZXh0NF9mY19yZXBsYXkoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbi0tXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTI2MDYtXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jOjI2MDc6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXFxuZnMvZXh0NC9mYXN0X2NvbW1pdC5jLTI2MDgtXFx0aWYgKHNiaS1cXHUwMDNlc19mY19kZWJ1Z19tYXhfcmVwbGF5IFxcdTAwMjZcXHUwMDI2IG9mZiBcXHUwMDNlPSBzYmktXFx1MDAzZXNfZmNfZGVidWdfbWF4X3JlcGxheSkge1xcbi0tXFxuZnMvZXh0NC9oYXNoLmM9MzE0PWludCBleHQ0ZnNfZGlyaGFzaChjb25zdCBzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbixcXG4tLVxcbmZzL2V4dDQvaGFzaC5jLTM0NC1cXG5mcy9leHQ0L2hhc2guYzozNDU6I2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXFxuZnMvZXh0NC9oYXNoLmMtMzQ2LUVYUE9SVF9TWU1CT0xfRk9SX0VYVDRfVEVTVChleHQ0ZnNfZGlyaGFzaCk7XFxuLS1cXG5mcy9leHQ0L2lhbGxvYy5jPTg3Nj1zdGF0aWMgaW50IGV4dDRfeGF0dHJfY3JlZGl0c19mb3JfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBtb2RlX3QgbW9kZSxcXG4tLVxcbmZzL2V4dDQvaWFsbG9jLmMtODgwLVxcdGludCBuYmxvY2tzID0gMDtcXG5mcy9leHQ0L2lhbGxvYy5jOjg4MTojaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMXFxuZnMvZXh0NC9pYWxsb2MuYy04ODItXFx0c3RydWN0IHBvc2l4X2FjbCAqcCA9IGdldF9pbm9kZV9hY2woZGlyLCBBQ0xfVFlQRV9ERUZBVUxUKTtcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYz00MTI9aW50IGV4dDRfaXNzdWVfemVyb291dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLCBleHQ0X2ZzYmxrX3QgcGJsayxcXG4tLVxcbmZzL2V4dDQvaW5vZGUuYy00MzYtICovXFxuZnMvZXh0NC9pbm9kZS5jOjQzNzojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L2lub2RlLmMtNDM4LXZvaWQgZXh0NF9jaGVja19tYXBfZXh0ZW50c19lbnYoc3RydWN0IGlub2RlICppbm9kZSlcXG4tLVxcbmZzL2V4dDQvbWJhbGxvYy5jPTU3Mjg9c3RhdGljIHZvaWQgZXh0NF9tYl9wYV9wdXRfZnJlZShzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX2NvbnRleHQgKmFjKVxcbi0tXFxuZnMvZXh0NC9tYmFsbG9jLmMtNTc0My1cXG5mcy9leHQ0L21iYWxsb2MuYzo1NzQ0OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xcbmZzL2V4dDQvbWJhbGxvYy5jLTU3NDUtc3RhdGljIGlubGluZSB2b2lkIGV4dDRfbWJfc2hvd19wYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvZXh0NC9tYmFsbG9jLmM9NzEyOT1leHQ0X21iYWxsb2NfcXVlcnlfcmFuZ2UoXFxuLS1cXG5mcy9leHQ0L21iYWxsb2MuYy03MTg0LVxcbmZzL2V4dDQvbWJhbGxvYy5jOjcxODU6I2lmIElTX0VOQUJMRUQoQ09ORklHX0VYVDRfS1VOSVRfVEVTVFMpXFxuZnMvZXh0NC9tYmFsbG9jLmMtNzE4Ni12b2lkIG1iX2NsZWFyX2JpdHNfdGVzdCh2b2lkICpibSwgaW50IGN1ciwgaW50IGxlbilcXG4tLVxcbmZzL2V4dDQvbWJhbGxvYy5oLTI4LSAqL1xcbmZzL2V4dDQvbWJhbGxvYy5oOjI5OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xcbmZzL2V4dDQvbWJhbGxvYy5oLTMwLSNkZWZpbmUgbWJfZGVidWcoc2IsIGZtdCwgLi4uKVxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tLVxcbmZzL2V4dDQvbWJhbGxvYy5oPTI3Mz1leHRlcm4gaW50IGV4dDRfbWJfbWFya19jb250ZXh0KGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L21iYWxsb2MuaC0yNzctXFx0XFx0ZXh0NF9ncnBibGtfdCAqcmV0X2NoYW5nZWQpO1xcbmZzL2V4dDQvbWJhbGxvYy5oOjI3ODojaWYgSVNfRU5BQkxFRChDT05GSUdfRVhUNF9LVU5JVF9URVNUUylcXG5mcy9leHQ0L21iYWxsb2MuaC0yNzktZXh0ZXJuIHZvaWQgbWJfY2xlYXJfYml0c190ZXN0KHZvaWQgKmJtLCBpbnQgY3VyLCBpbnQgbGVuKTtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0xMjU9c3RhdGljIGNvbnN0IHN0cnVjdCBmc19jb250ZXh0X29wZXJhdGlvbnMgZXh0NF9jb250ZXh0X29wcyA9IHtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYy0xMzItXFxuZnMvZXh0NC9zdXBlci5jOjEzMzojaWYgIWRlZmluZWQoQ09ORklHX0VYVDJfRlMpIFxcdTAwMjZcXHUwMDI2ICFkZWZpbmVkKENPTkZJR19FWFQyX0ZTX01PRFVMRSkgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfRVhUNF9VU0VfRk9SX0VYVDIpXFxuZnMvZXh0NC9zdXBlci5jLTEzNC1zdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0Ml9mc190eXBlID0ge1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTE2OTI9ZW51bSB7XFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMTcxNS1cXHRPcHRfZXJyb3JzLCBPcHRfZGF0YSwgT3B0X2RhdGFfZXJyLCBPcHRfanFmbXQsIE9wdF9kYXhfdHlwZSxcXG5mcy9leHQ0L3N1cGVyLmM6MTcxNjojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L3N1cGVyLmMtMTcxNy1cXHRPcHRfZmNfZGVidWdfbWF4X3JlcGxheSwgT3B0X2ZjX2RlYnVnX2ZvcmNlXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmM9MTc2Mj1zdGF0aWMgY29uc3Qgc3RydWN0IGZzX3BhcmFtZXRlcl9zcGVjIGV4dDRfcGFyYW1fc3BlY3NbXSA9IHtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYy0xODM1LVxcdGZzcGFyYW1fZmxhZ1xcdChcXFwibm9pbml0X2l0YWJsZVxcXCIsXFx0T3B0X25vaW5pdF9pdGFibGUpLFxcbmZzL2V4dDQvc3VwZXIuYzoxODM2OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xcbmZzL2V4dDQvc3VwZXIuYy0xODM3LVxcdGZzcGFyYW1fZmxhZ1xcdChcXFwiZmNfZGVidWdfZm9yY2VcXFwiLFxcdE9wdF9mY19kZWJ1Z19mb3JjZSksXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmM9MTg3OT1zdGF0aWMgY29uc3Qgc3RydWN0IG1vdW50X29wdHMge1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTE5MjItXFx0e09wdF91c2VyX3hhdHRyLCBFWFQ0X01PVU5UX1hBVFRSX1VTRVIsIE1PUFRfU0VUfSxcXG5mcy9leHQ0L3N1cGVyLmM6MTkyMzojaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMXFxuZnMvZXh0NC9zdXBlci5jLTE5MjQtXFx0e09wdF9hY2wsIEVYVDRfTU9VTlRfUE9TSVhfQUNMLCBNT1BUX1NFVH0sXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMTk0NS1cXHQgTU9QVF9TRVR9LFxcbmZzL2V4dDQvc3VwZXIuYzoxOTQ2OiNpZmRlZiBDT05GSUdfRVhUNF9ERUJVR1xcbmZzL2V4dDQvc3VwZXIuYy0xOTQ3LVxcdHtPcHRfZmNfZGVidWdfZm9yY2UsIEVYVDRfTU9VTlQyX0pPVVJOQUxfRkFTVF9DT01NSVQsXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmM9MTk5Nz1zdHJ1Y3QgZXh0NF9mc19jb250ZXh0IHtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYy0yMDAwLVxcdGludFxcdFxcdHNfanF1b3RhX2ZtdDtcXHQvKiBGb3JtYXQgb2YgcXVvdGEgdG8gdXNlICovXFxuZnMvZXh0NC9zdXBlci5jOjIwMDE6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXFxuZnMvZXh0NC9zdXBlci5jLTIwMDItXFx0aW50IHNfZmNfZGVidWdfbWF4X3JlcGxheTtcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0yMTcxPXN0YXRpYyBpbnQgZXh0NF9wYXJzZV9wYXJhbShzdHJ1Y3QgZnNfY29udGV4dCAqZmMsIHN0cnVjdCBmc19wYXJhbWV0ZXIgKnBhcmFtKVxcbi0tXFxuZnMvZXh0NC9zdXBlci5jLTIzMDYtXFx0XFx0cmV0dXJuIDA7XFxuZnMvZXh0NC9zdXBlci5jOjIzMDc6I2lmZGVmIENPTkZJR19FWFQ0X0RFQlVHXFxuZnMvZXh0NC9zdXBlci5jLTIzMDgtXFx0Y2FzZSBPcHRfZmNfZGVidWdfbWF4X3JlcGxheTpcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0yODU1PXN0YXRpYyB2b2lkIGV4dDRfYXBwbHlfb3B0aW9ucyhzdHJ1Y3QgZnNfY29udGV4dCAqZmMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMjg3OC1cXG5mcy9leHQ0L3N1cGVyLmM6Mjg3OTojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L3N1cGVyLmMtMjg4MC1cXHRBUFBMWShzX2ZjX2RlYnVnX21heF9yZXBsYXkpO1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTQzODg9c3RhdGljIHZvaWQgZXh0NF9zZXRfZGVmX29wdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYixcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYy00NDAzLVxcdHNldF9vcHQoc2IsIFhBVFRSX1VTRVIpO1xcbmZzL2V4dDQvc3VwZXIuYzo0NDA0OiNpZmRlZiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0xcXG5mcy9leHQ0L3N1cGVyLmMtNDQwNS1cXHRzZXRfb3B0KHNiLCBQT1NJWF9BQ0wpO1xcbi0tXFxuZnMvZXh0NC9zdXBlci5jPTczNzc9c3RhdGljIHNzaXplX3QgZXh0NF9xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSxcXG4tLVxcbmZzL2V4dDQvc3VwZXIuYy03NDM3LVxcbmZzL2V4dDQvc3VwZXIuYzo3NDM4OiNpZiAhZGVmaW5lZChDT05GSUdfRVhUMl9GUykgXFx1MDAyNlxcdTAwMjYgIWRlZmluZWQoQ09ORklHX0VYVDJfRlNfTU9EVUxFKSBcXHUwMDI2XFx1MDAyNiBkZWZpbmVkKENPTkZJR19FWFQ0X1VTRV9GT1JfRVhUMilcXG5mcy9leHQ0L3N1cGVyLmMtNzQzOS1zdGF0aWMgaW5saW5lIHZvaWQgcmVnaXN0ZXJfYXNfZXh0Mih2b2lkKVxcbi0tXFxuZnMvZXh0NC9zeXNmcy5jPTI2Nj1FWFQ0X1JXX0FUVFJfU0JJX1BJKG1zZ19yYXRlbGltaXRfYnVyc3QsIHNfbXNnX3JhdGVsaW1pdF9zdGF0ZS5idXJzdCk7XFxuZnMvZXh0NC9zeXNmcy5jOjI2NzojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L3N5c2ZzLmMtMjY4LUVYVDRfUldfQVRUUl9TQklfVUwoc2ltdWxhdGVfZmFpbCwgc19zaW11bGF0ZV9mYWlsKTtcXG4tLVxcbmZzL2V4dDQvc3lzZnMuYz0yOTU9c3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmV4dDRfYXR0cnNbXSA9IHtcXG4tLVxcbmZzL2V4dDQvc3lzZnMuYy0zMzUtXFx0QVRUUl9MSVNUKGpvdXJuYWxfdGFzayksXFxuZnMvZXh0NC9zeXNmcy5jOjMzNjojaWZkZWYgQ09ORklHX0VYVDRfREVCVUdcXG5mcy9leHQ0L3N5c2ZzLmMtMzM3LVxcdEFUVFJfTElTVChzaW11bGF0ZV9mYWlsKSxcXG4tLVxcbmZzL2V4dDQveGF0dHIuYz04OD1zdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKiBjb25zdCBleHQ0X3hhdHRyX2hhbmRsZXJfbWFwW10gPSB7XFxuZnMvZXh0NC94YXR0ci5jLTg5LVxcdFtFWFQ0X1hBVFRSX0lOREVYX1VTRVJdXFx0XFx0ICAgICA9IFxcdTAwMjZleHQ0X3hhdHRyX3VzZXJfaGFuZGxlcixcXG5mcy9leHQ0L3hhdHRyLmM6OTA6I2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTFxcbmZzL2V4dDQveGF0dHIuYy05MS1cXHRbRVhUNF9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTXSAgPSBcXHUwMDI2bm9wX3Bvc2l4X2FjbF9hY2Nlc3MsXFxuLS1cXG5mcy9leHQ0L3hhdHRyLmMtOTQtXFx0W0VYVDRfWEFUVFJfSU5ERVhfVFJVU1RFRF1cXHQgICAgID0gXFx1MDAyNmV4dDRfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyLFxcbmZzL2V4dDQveGF0dHIuYzo5NTojaWZkZWYgQ09ORklHX0VYVDRfRlNfU0VDVVJJVFlcXG5mcy9leHQ0L3hhdHRyLmMtOTYtXFx0W0VYVDRfWEFUVFJfSU5ERVhfU0VDVVJJVFldXFx0ICAgICA9IFxcdTAwMjZleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsXFxuLS1cXG5mcy9leHQ0L3hhdHRyLmM9MTAxPWNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICogY29uc3QgZXh0NF94YXR0cl9oYW5kbGVyc1tdID0ge1xcbi0tXFxuZnMvZXh0NC94YXR0ci5jLTEwMy1cXHRcXHUwMDI2ZXh0NF94YXR0cl90cnVzdGVkX2hhbmRsZXIsXFxuZnMvZXh0NC94YXR0ci5jOjEwNDojaWZkZWYgQ09ORklHX0VYVDRfRlNfU0VDVVJJVFlcXG5mcy9leHQ0L3hhdHRyLmMtMTA1LVxcdFxcdTAwMjZleHQ0X3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsXFxuLS1cXG5mcy9leHQ0L3hhdHRyLmg9MjEzPV9feGF0dHJfY2hlY2tfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXIsXFxuLS1cXG5mcy9leHQ0L3hhdHRyLmgtMjE4LVxcbmZzL2V4dDQveGF0dHIuaDoyMTk6I2lmZGVmIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZXFxuZnMvZXh0NC94YXR0ci5oLTIyMC1leHRlcm4gaW50IGV4dDRfaW5pdF9zZWN1cml0eShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0MjoxNS45ODgyNDUzMzVaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjY1NDIzNTk3NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEV4dDQgRGlyZWN0b3J5IERhdGEgRmVhdHVyZSoqXG5cbk9rYXksIHNvIHRoZXJlIGlzbid0IGEgZGVkaWNhdGVkIEtjb25maWcgb3B0aW9uIGxpa2UgYENPTkZJR19FWFQ0X0RJUkRBVEFgIHRoYXQgSSB3YXMgZXhwZWN0aW5nLiBJdCdzIGp1c3QgYSBmZWF0dXJlIGZsYWcgd2l0aGluIGV4dDQuIFRoZSByZWxldmFudCBwYXRjaCBpbnRyb2R1Y2VzIGBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQWAsIHdoaWNoIGlzIGltcG9ydGFudCB0byBub3RlLiBBbmQgSSBzZWUgdGhlIGNvbmZpZ3VyYXRpb24gdG8gZW5hYmxlIGl0IGlzIHNpbXBseSBgRVhUNF9GU2AuIFRoYXQgbWFrZXMgc2Vuc2UuXG5cbldhaXQsIHRoaXMgcGF0Y2ggYWxzbyB0b3VjaGVzIGBmcy9leHQ0L2lvY3RsLmNgLCBzcGVjaWZpY2FsbHkgYWRkaW5nIGBFWFQ0X0lPQ19TRVRfTFVGSURgLiBUaGF0J3MgaW50cmlndWluZy4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRoYXQgaXMgdXRpbGl6ZWQuIE9rYXksICp5ZXMqLCBpdCdzIGFuIGlvY3RsIG9wZXJhdGlvbiBvbiBleHQ0IGRpcmVjdG9yaWVzLiBHb29kIHRvIGtub3cuXG5cbkFscmlnaHQsIEkgbmVlZCB0byBsaXN0IHRoZSBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGlzIG5ldyBmdW5jdGlvbmFsaXR5IGZvciBteSBhbmFseXNpcy4gTGV0J3MgbWFrZSBhIG5vdGUgb2YgYGV4dDRfaW9jdGxfc2V0X2x1ZmlkYCBhbmQgYGV4dDRfZGlyZGF0YV9zZXRfbHVmaWRgIHdpdGhpbiBgRm9jdXNTeW1ib2xzYC4gVGhlbiwgSSdsbCBuZWVkIHRvIGFkZCBgZXh0NF9kaXJkYXRhX2dldGAsIGBleHQ0X2RpcmRhdGFfc2V0YCwgYGV4dDRfbHVmaWRfc25hcHNob3RgLCBgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGFgLCBhbmQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLlxuXG5MZXQncyBkaWcgYSBsaXR0bGUgZGVlcGVyLiBIbW0sIHdoYXQgZWxzZSBpcyByZWxldmFudD8gYGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbmAsIGFuZCBgZXh0NF9kaXJfZW50cnlfbGVuYC4gT2gsIGhhbmcgb24sIGBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW5gIGlzIGFuIGlubGluZSBmdW5jdGlvbiBkZWZpbmVkIGluIGBleHQ0LmhgLiBTbyBpdCBtaWdodCBiZSBhIGJpdCBzaW1wbGVyIHRvIGZvbGxvdy5cblxuYGV4dDRfZGlyZGF0YV9nZXRgIGlzIGluIGBmcy9leHQ0L25hbWVpLmNgLiBNYWtlcyBzZW5zZS4gTGV0J3MgdGhvcm91Z2hseSBjaGVjayBgZnMvZXh0NC9uYW1laS5jYCBhbmQgbWFrZSBzdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55IG90aGVyIG5ldyBmdW5jdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM5MjgxLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQyOjI4LjY0MjQ4MzQxOVoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODU4NjUyMzY5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5pbnQgZXh0NF9kaXJkYXRhX3NldF9sdWZpZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L25hbWVpLmM9NDU4Nj1zdGF0aWMgaW50IGV4dDRfcmVuYW1lMihzdHJ1Y3QgbW50X2lkbWFwICppZG1hcCxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy00NjI0LSAqL1xcbmZzL2V4dDQvbmFtZWkuYzo0NjI1OmludCBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkKHN0cnVjdCBpbm9kZSAqZGlyLCBjb25zdCBjaGFyICpmaWxlbmFtZSxcXG5mcy9leHQ0L25hbWVpLmMtNDYyNi1cXHRcXHRcXHQgICAgaW50IG5hbWVsZW4sIHN0cnVjdCBleHQ0X2RlbnRyeV9wYXJhbSAqZWRwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0MjozMC41MDExMzk3MDlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjozNjc2ODYyNDUyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHVuZGVyc3RhbmRpbmcsIHByZXNlbnRlZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3Npbmc6XG5cbioqQW5hbHl6aW5nIGBleHQ0X2lvY3RsX3NldF9sdWZpZGAqKlxuXG5SaWdodCwgbGV0J3Mgc3RhcnQgYnkgbG9va2luZyBhdCBgZXh0NF9pb2N0bF9zZXRfbHVmaWRgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRoaXMgZnVuY3Rpb24gZG9lcy4gR2l2ZW4gdGhlIG5hbWUsIEknbSBndWVzc2luZyBpdCByZWxhdGVzIHRvIGFuIGlvY3RsIGNhbGwsIGFuZCBpdCBsaWtlbHkgZGVhbHMgd2l0aCBzZXR0aW5nIHNvbWV0aGluZyBhc3NvY2lhdGVkIHdpdGggYSBMVUZJRCwgd2hpY2ggcHJvYmFibHkgc3RhbmRzIGZvciBzb21ldGhpbmcgbGlrZSBcIkxvZ2ljYWwgVW5pdCBGaWxlIElEXCIgb3IgYSBzaW1pbGFyIGJsb2NrIGRldmljZSBjb25jZXB0LlxuXG5JJ2xsIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRoZSBrZXJuZWwncyBleHQ0IGZpbGVzeXN0ZW0gaW1wbGVtZW50YXRpb24gZG9lcyB3aXRoIGJsb2NrIGRldmljZXMuIFNwZWNpZmljYWxseSwgaG93IGRvZXMgaXQgaW50ZXJhY3Qgd2l0aCB0aGUgZGV2aWNlJ3MgaW9jdGxzPyBJJ2xsIHByb2JhYmx5IHdhbnQgdG8gbG9vayBmb3IgdGhlIGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbiwgYW55IHJlbGF0ZWQgc3RydWN0dXJlcywgYW5kIHRoZSBjYWxsaW5nIGNvbnRleHRzIHRvIGZ1bGx5IGdyYXNwIGl0cyBmdW5jdGlvbi4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBob3cgaXQgYWZmZWN0cyB0aGUgbWV0YWRhdGEgb3IgdGhlIGRpcmVjdC1pL28gcGF0aC4gRG9lcyBpdCBhbGxvY2F0ZSBuZXcgc3RydWN0dXJlcz8gRG9lcyBpdCBpbmZsdWVuY2UgYW55IGNhY2hlIGJlaGF2aW9yPyBQZXJoYXBzIHRoZXJlJ3MgYSBzZWN1cml0eSBpbXBsaWNhdGlvbiB0b287IGEgdGhvcm91Z2ggcmV2aWV3IGlzIGEgbXVzdC4gS25vd2luZyB0aGUgc3BlY2lmaWNzIG9mIHdoYXQgYGx1ZmlkYCBjb250cm9scyB3aWxsIGJlIGtleSwgYW5kIGFueSBlZGdlIGNhc2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MDE3NiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQyOjM0LjE3ODAwNTAzMVoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTAyNTk5NTIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXnN0YXRpYyBsb25nIGV4dDRfaW9jdGxfc2V0X2x1ZmlkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvaW9jdGwuYz0xMzkwPXN0YXRpYyBpbnQgZXh0NF9pb2N0bF9zZXRfdHVuZV9zYihzdHJ1Y3QgZmlsZSAqZmlscCxcXG4tLVxcbmZzL2V4dDQvaW9jdGwuYy0xNTQ2LSAqL1xcbmZzL2V4dDQvaW9jdGwuYzoxNTQ3OnN0YXRpYyBsb25nIGV4dDRfaW9jdGxfc2V0X2x1ZmlkKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZylcXG5mcy9leHQ0L2lvY3RsLmMtMTU0OC17XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQyOjM0LjI4ODI3MjA4M1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjMzMDczNjk4MTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIGNvZGUgYWRkaXRpb25zLCBmcmFtZWQgYXMgbXkgb3duIHRob3VnaHQgcHJvY2VzczpcblxuKipSZWZpbmluZyBNeSBGb2N1cyBmb3IgRGVlcCBEaXZlKipcblxuUmlnaHQsIHNvIEknbSBob25pbmcgaW4gb24gdGhlIGtleSBhcmVhcyB3aXRoaW4gdGhpcyBleHQ0IGZpbGUgc3lzdGVtIGFuYWx5c2lzLiBJIG5lZWQgdG8gdGlnaHRlbiB0aGUgc2NvcGUgb2YgbXkgaW52ZXN0aWdhdGlvbiwgYW5kIEkndmUgZGVjaWRlZCB0byBleHBsaWNpdGx5IGFkZCBgZXh0NF9pb2N0bF9zZXRfbHVmaWRgIGFuZCBgZXh0NF9kaXJkYXRhX3NldF9sdWZpZGAgdG8gdGhlIGBGb2N1c1N5bWJvbHNgIGxpc3QuIFRoYXQncyBjcnVjaWFsLiBJJ20gdHJlYXRpbmcgdGhlc2UgYXMgdGhlIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyByaWdodCBub3cgZm9yIHRoZSBpbnZlc3RpZ2F0aW9uLlxuXG5GdXJ0aGVybW9yZSwgSSByZWNvZ25pemUgdGhlIGltcG9ydGFuY2Ugb2YgdGhlIHJlbGF0ZWQgZGF0YSBhY2Nlc3MgZnVuY3Rpb25zLiBUaGVyZWZvcmUgSSB3aWxsIGFsc28gaW5jbHVkZSBgZXh0NF9kaXJkYXRhX2dldGAgYW5kIGBleHQ0X2RpcmRhdGFfc2V0YCBpbiB0aGUgYEZvY3VzU3ltYm9sc2AuIFRoYXQgd2lsbCBnaXZlIG1lIG1vcmUgY29udGV4dCBmb3IgdGhlIGZpcnN0IHR3byBmdW5jdGlvbnMgYW5kIGhlbHAgbWUgZ3Jhc3AgdGhlIGZsb3cgb2YgZGF0YS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2MDEsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0MjozNy41OTU2NDM5MDNaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM0MjAyMjkwNCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJedW5zaWduZWQgY2hhciBleHQ0X2RpcmRhdGFfZ2V0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvbmFtZWkuYz0xMzEzPXN0YXRpYyBpbmxpbmUgaW50IHNlYXJjaF9kaXJibG9jayhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTEzNTMtICovXFxuZnMvZXh0NC9uYW1laS5jOjEzNTQ6dW5zaWduZWQgY2hhciBleHQ0X2RpcmRhdGFfZ2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXFxuZnMvZXh0NC9uYW1laS5jLTEzNTUtXFx0XFx0XFx0ICAgICAgIGludCBidWZfc2l6ZSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDI6MzcuOTM3Njc3Njk3WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjQ1MTk1MTM5MjksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjpcblxuKipEZWVwIERpdmUgaW50byBgZXh0NF9kaXJkYXRhX3NldGAqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgYGV4dDRfZGlyZGF0YV9zZXRgLiBJIGtub3cgdGhpcyBpcyBhIGNvcmUgZnVuY3Rpb24sIGNlbnRyYWwgdG8gaG93IGV4dDQgbWFuYWdlcyBkaXJlY3RvcnkgZW50cmllcyBhbmQgdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEuIEVzc2VudGlhbGx5LCBpdCdzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIG9yIHVwZGF0aW5nIGRpcmVjdG9yeSBkYXRhIHdpdGhpbiB0aGUgaW5vZGUuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIGxvdy1sZXZlbCBkZXRhaWxzIG9mIGhvdyBhIGZpbGUncyBuYW1lLCBpdHMgaW5vZGUgbnVtYmVyLCBhbmQgdmFyaW91cyBvdGhlciBiaXRzIG9mIGNydWNpYWwgaW5mb3JtYXRpb24gYXJlIHN0b3JlZCB3aXRoaW4gdGhlIGRpcmVjdG9yeSdzIGJsb2Nrcy4gSSdtIHZpc3VhbGl6aW5nIHRoZSBibG9jayBsYXlvdXQsIHRoZSBvZmZzZXRzLCB0aGUgbGVuZ3Rocy4uLiBhbmQgdGhlIGFsbCB0aGUgcG90ZW50aWFsIGlzc3VlcyB0aGF0IG1pZ2h0IGFyaXNlIGR1cmluZyB0aGUgaW50cmljYXRlIGRhbmNlIG9mIHdyaXRpbmcgdGhpcyBkYXRhIGNvcnJlY3RseS5cblxuVGhlIGNyaXRpY2FsIHBpZWNlcyBhcmUgYWxsIHRoZXJlOiB0aGUgZGlyZWN0b3J5IGVudHJ5LCB0aGUgbmFtZSBsZW5ndGgsIHRoZSBpbm9kZSBudW1iZXIsIHRoZSBkYXRhIHR5cGUuLi4gSSdtIGltbWVkaWF0ZWx5IGNvbmNlcm5lZCBhYm91dCB0aGUgcG90ZW50aWFsIGZvciBmcmFnbWVudGF0aW9uIGlmIHRoZSBkaXJlY3RvcnkgZ3Jvd3MgYW5kIGNvbnRyYWN0cyBmcmVxdWVudGx5LiBIb3cgZG9lcyBpdCBoYW5kbGUgcG90ZW50aWFsIGNvbGxpc2lvbnMgd2hlbiB1cGRhdGluZyBhbiBlbnRyeT8gRG9lcyBpdCBhY2NvdW50IGZvciBwb3NzaWJsZSBwYXJ0aWFsIHdyaXRlcywgb3IgcG93ZXIgZmFpbHVyZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGlzIGNydWNpYWwgcHJvY2Vzcz8gSSdtIHdvbmRlcmluZyB3aGF0IGVycm9yIGhhbmRsaW5nIGlzIGluIHBsYWNlLCBzcGVjaWZpY2FsbHkgZm9yIHNpdHVhdGlvbnMgd2hlcmUgYSBkYXRhIHdyaXRlIGlzIHBhcnRpYWxseSBzdWNjZXNzZnVsLCB3aGljaCB3b3VsZCBpbmV2aXRhYmx5IGNvcnJ1cHQgdGhlIGZpbGVzeXN0ZW0uXG5cbkknbSBhbHNvIGN1cmlvdXMgYWJvdXQgdGhlIGxvY2tpbmcgbWVjaGFuaXNtcyBlbXBsb3llZCB0byBlbnN1cmUgdGhyZWFkLXNhZmV0eSB3aGVuIG11bHRpcGxlIHByb2Nlc3NlcyBhcmUgYXR0ZW1wdGluZyB0byBtb2RpZnkgdGhlIHNhbWUgZGlyZWN0b3J5IGNvbmN1cnJlbnRseS4gSXMgaXQgdXNpbmcgcGVyLWlub2RlIGxvY2tzPyBHbG9iYWwgbG9ja3M/IEEgY29tYmluYXRpb24/IFdoYXQncyB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIGxvY2tpbmcgYW5kIGhvdyBkb2VzIHRoYXQgYWZmZWN0IG92ZXJhbGwgcGVyZm9ybWFuY2U/IEknbSBnb2luZyB0byB3YW50IHRvIGNoZWNrIGludG8gdGhhdCBzb29uLiBBbmQgaG93IGFyZSB3ZSBzdXJlIHRoYXQgdGhlIGpvdXJuYWwgaXMgY29ycmVjdGx5IHVwZGF0ZWQgdG8gZW5zdXJlIHdlJ3JlIG5ldmVyIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZT8gSXQncyBlc3NlbnRpYWwgdGhhdCB0aGVzZSBvcGVyYXRpb25zIGJlIGF0b21pYyBvciB0aGF0IHdlIGhhdmUgdGhlIHByb3BlciBqb3VybmFsIGVudHJpZXMgdG8gcmVjb3Zlci5cblxuRnVydGhlcm1vcmUsIGhvdyBkb2VzIGl0IGludGVyYWN0IHdpdGggdGhlIGJsb2NrIGFsbG9jYXRvcj8gSG93IGRvZXMgdGhlIGJsb2NrIGFsbG9jYXRvciBlbnN1cmUgaXQgaGFzIHRoZSBjb3JyZWN0IGFtb3VudCBvZiBzcGFjZSBmb3IgdGhpcyBkYXRhIHNldD8gQXJlIHRoZXJlIG9wdGltaXphdGlvbnMgZm9yIGNvbW1vbmx5IG9jY3VycmluZyBzY2VuYXJpb3M/IEFuZCB3aGF0IGFib3V0IHRoZSBpbXBhY3Qgb24gcGVyZm9ybWFuY2Ugd2l0aCBTU0RzIHZlcnN1cyBIRERzPyBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgZGVzaWduZWQgdG8gcGVyZm9ybSB3ZWxsIG9uIGEgdmFyaWV0eSBvZiB1bmRlcmx5aW5nIHN0b3JhZ2UgdHlwZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQxMDA3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDI6NDIuNDU3MTkzODQ2WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNjI1NDI4NjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiXnN0YXRpYyB2b2lkIGV4dDRfZGlyZGF0YV9zZXRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9uYW1laS5jPTEzNTQ9dW5zaWduZWQgY2hhciBleHQ0X2RpcmRhdGFfZ2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtMTQ2Ny0gKi9cXG5mcy9leHQ0L25hbWVpLmM6MTQ2ODpzdGF0aWMgdm9pZCBleHQ0X2RpcmRhdGFfc2V0KHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgc3RydWN0IGlub2RlICpkaXIsXFxuZnMvZXh0NC9uYW1laS5jLTE0NjktXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJlbnRfZmlkICpkZmlkLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0Mjo0Mi43MTk3NDIzMzZaIiwiU2VxIjoxMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTAwNDQ3MjEyMjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBzdW1tYXJ5LCB0YWtpbmcgb24gdGhlIHBlcnNvbmEgeW91J3ZlIGRlc2NyaWJlZDpcblxuKipFeHQ0IExVRklEIFNuYXBzaG90IENvbnNpZGVyYXRpb25zKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBUaGlua2luZyBhYm91dCBgZXh0NF9sdWZpZF9zbmFwc2hvdGAsIEknbSBpbW1lZGlhdGVseSBmb2N1c2luZyBvbiB0aGUgaW1wbGljYXRpb25zIHdpdGhpbiBhbiBleHQ0IGZpbGVzeXN0ZW0uIFRoZSB0ZXJtIFwiTFVGSURcIiBzdWdnZXN0cyAqTG9naWNhbCBVbml0IEZpbGUgSUQqLCBtZWFuaW5nIHdlJ3JlIGRlYWxpbmcgd2l0aCBob3cgc25hcHNob3RzIGFyZSBpbXBsZW1lbnRlZCwgc3BlY2lmaWNhbGx5IGF0IGEgZmlsZS1zeXN0ZW0gbGV2ZWwuXG5cbk15IHByaW1hcnkgY29uY2VybiBpcyB0aGUgZWZmaWNpZW5jeSBvZiBzdWNoIGEgc25hcHNob3QgbWVjaGFuaXNtLCBhbmQgYW55IGFzc29jaWF0ZWQgb3ZlcmhlYWQuIEhvdyBpcyB0aGlzIHNuYXBzaG90IFwiY3JlYXRlZFwiIOKAkyBpcyBpdCBhIGZ1bGwgY29weSwgYSBjb3B5LW9uLXdyaXRlIG9wZXJhdGlvbiwgb3IgcGVyaGFwcyBzb21ldGhpbmcgbW9yZSBjbGV2ZXIgdGhhdCBsZXZlcmFnZXMgdGhlIGJsb2NrIGdyb3VwIHN0cnVjdHVyZT8gUGVyZm9ybWFuY2UgaXMga2V5LCBlc3BlY2lhbGx5IGR1cmluZyBzbmFwc2hvdCBjcmVhdGlvbiBhbmQgc3Vic2VxdWVudCByZWFkcy93cml0ZXMgdG8gdGhlIFwicGFyZW50XCIgYW5kIFwic25hcHNob3RcIiB2b2x1bWVzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9uIGlub2RlIG1hbmFnZW1lbnQgYW5kIGJsb2NrIGFsbG9jYXRpb24uIEFyZSB0aGVyZSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHRpZXM/IEFyZSBtZXRhZGF0YSB1cGRhdGVzIGF0b21pYyBhbmQgY29uc2lzdGVudD9cblxuTmV4dCwgSSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBncmFudWxhcml0eS4gRG9lcyB0aGlzIExVRklELWJhc2VkIGFwcHJvYWNoIG9mZmVyIHNuYXBzaG90cyBvZiBlbnRpcmUgdm9sdW1lcywgaW5kaXZpZHVhbCBmaWxlcywgb3IgYSBtb3JlIGdyYW51bGFyIHNlbGVjdGlvbiBvZiBkYXRhPyBUaGUgZmxleGliaWxpdHkgb2Ygc2VsZWN0aW5nIHRoZSBkYXRhIGluY2x1ZGVkIHdvdWxkIGJlIHZhbHVhYmxlIGluIG9yZGVyIHRvIGF2b2lkIGEgXCJzbmFwc2hvdFwiIHdoaWNoIGlzIGFzIGxhcmdlIGFzIHRoZSBvcmlnaW5hbCBkYXRhLlxuXG5FcnJvciBoYW5kbGluZyBpcyBjcml0aWNhbCB0b28uIFdoYXQgaGFwcGVucyBpZiB0aGUgc25hcHNob3Qgb3BlcmF0aW9uIGZhaWxzIG1pZC13YXk/IElzIGRhdGEgY29ycnVwdGlvbiBhIHBvc3NpYmlsaXR5LCBhbmQgaWYgc28sIGhvdyBpcyBpdCBtaXRpZ2F0ZWQ/IFJlY292ZXJ5IG1lY2hhbmlzbXMgYXJlIGEgbXVzdCwgYXMgaXMgZW5zdXJpbmcgZGF0YSBpbnRlZ3JpdHkgdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuIEkgbmVlZCB0byBzZWUgdGhlIHBvdGVudGlhbCBmYWlsdXJlIG1vZGVzLlxuXG5GaW5hbGx5LCBjb21wYXRpYmlsaXR5IGFuZCBpbnRlZ3JhdGlvbiBhcmUgcGFyYW1vdW50LiBEb2VzIHRoaXMgYGV4dDRfbHVmaWRfc25hcHNob3RgIHBsYXkgbmljZWx5IHdpdGggZXhpc3RpbmcgdG9vbHMgYW5kIHV0aWxpdGllcywgc3VjaCBhcyBgZnNja2AsIGBlMmZzY2tgLCBhbmQgb3RoZXIgdm9sdW1lIG1hbmFnZW1lbnQgdGVjaG5vbG9naWVzPyBBbnkgaW50ZWdyYXRpb24gaXNzdWVzIGNvdWxkIG1ha2UgdGhpcyBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IGluIG1hbnkgcmVhbC13b3JsZCB1c2UgY2FzZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQxNjQ3LCJPdXRwdXRUb2tlbnMiOjQ1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDI6NTIuNzY0NDY2MDc3WiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjc2MzY3MjUsIkVycm9yIjoibm8gbWF0Y2hlcyIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl5zdGF0aWMgc3RydWN0IGV4dDRfZGlyZW50X2ZpZCBcXFxcKi4qZXh0NF9sdWZpZF9zbmFwc2hvdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDI6NTMuMDkyMTExNzAzWiIsIlNlcSI6MTUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjEwMDAyNzgwMTU0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipHcmVwLCBUaGVuIERpZ2VzdCoqXG5cblJpZ2h0LCBsZXQncyBjdXQgc3RyYWlnaHQgdG8gdGhlIGNoYXNlLiBUaGF0J3MgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBJJ20gZ29pbmcgdG8gcmVhY2ggZm9yIGBncmVwYCBhbmQgYWltIGZvciBgZXh0NF9sdWZpZF9zbmFwc2hvdGAuIFRoYXQgbGlrZWx5IHRhcmdldHMgdGhlIGZ1bmN0aW9uIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyBzbmFwc2hvdHMgd2l0aGluIHRoZSBleHQ0IGZpbGVzeXN0ZW0uIEJ5IGV4YW1pbmluZyB0aGUgc291cmNlIGNvZGUsIEkgY2FuIHF1aWNrbHkgbmFycm93IGRvd24gdGhlIGFyZWFzIGludm9sdmVkIGluIHNuYXBzaG90IGNyZWF0aW9uIGFuZCBtYW5hZ2VtZW50IHdpdGhpbiB0aGUgZXh0NCBpbXBsZW1lbnRhdGlvbi4gVGhhdCdzIHVzdWFsbHkgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byB1bmRlcnN0YW5kIGl0cyBudWFuY2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjA5OCwiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQzOjAzLjA5NDg5Mzc0N1oiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTA2MjEzODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfbHVmaWRfc25hcHNob3RcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9uYW1laS5jPTQwOTI9c3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0NF93aGl0ZW91dF9mb3JfcmVuYW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTQxMjctLypcXG5mcy9leHQ0L25hbWVpLmM6NDEyODogKiBleHQ0X2x1ZmlkX3NuYXBzaG90IC0gY29weSB0aGUgTFVGSUQgcmVjb3JkIGZyb20gYSBkaXJlY3RvcnkgZW50cnlcXG5mcy9leHQ0L25hbWVpLmMtNDEyOS0gKlxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTQxMzQ9c3RhdGljIHN0cnVjdCBleHQ0X2RpcmVudF9maWQgKlxcbmZzL2V4dDQvbmFtZWkuYzo0MTM1OmV4dDRfbHVmaWRfc25hcHNob3Qoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLCB1bnNpZ25lZCBpbnQgYmxvY2tzaXplKVxcbmZzL2V4dDQvbmFtZWkuYy00MTM2LXtcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYz00MTYxPXN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpcixcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy00MzA2LVxcdFxcdGlmIChleHQ0X2hhc19mZWF0dXJlX2RpcmRhdGEob2xkLmRpci1cXHUwMDNlaV9zYikpIHtcXG5mcy9leHQ0L25hbWVpLmM6NDMwNzpcXHRcXHRcXHRvbGRfZmlkID0gZXh0NF9sdWZpZF9zbmFwc2hvdChvbGQuZGUsXFxuZnMvZXh0NC9uYW1laS5jLTQzMDgtXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgb2xkLmRpci1cXHUwMDNlaV9zYi1cXHUwMDNlc19ibG9ja3NpemUpO1xcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTQ0Mjc9c3RhdGljIGludCBleHQ0X2Nyb3NzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtNDUyMi1cXHRpZiAoZXh0NF9oYXNfZmVhdHVyZV9kaXJkYXRhKG9sZC5kaXItXFx1MDAzZWlfc2IpKSB7XFxuZnMvZXh0NC9uYW1laS5jOjQ1MjM6XFx0XFx0b2xkX2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3Qob2xkLmRlLCBvbGQuZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuZnMvZXh0NC9uYW1laS5jOjQ1MjQ6XFx0XFx0bmV3X2ZpZCA9IGV4dDRfbHVmaWRfc25hcHNob3QobmV3LmRlLCBuZXcuZGlyLVxcdTAwM2VpX3NiLVxcdTAwM2VzX2Jsb2Nrc2l6ZSk7XFxuZnMvZXh0NC9uYW1laS5jLTQ1MjUtXFx0XFx0aWYgKG9sZF9maWQgfHwgbmV3X2ZpZClcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDM6MDMuMjAxMTEzNDM5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYyNzg0NzMzNTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyBSZWxldmFudCBTdGF0aWMgRnVuY3Rpb25zIGZvciBGaWxlIFN5c3RlbSBPcGVyYXRpb25zKipcblxuQWxyaWdodCwgc28gSSdtIGZvY3VzaW5nIG9uIHRoZXNlIHN0YXRpYyBmdW5jdGlvbnMgc3BlY2lmaWNhbGx5LiBXZSdyZSBsb29raW5nIGF0IGBleHQ0X2x1ZmlkX3NuYXBzaG90YCwgd2hpY2ggaXMgY3J1Y2lhbCBmb3Igb3VyIHNuYXBzaG90IGNhcGFiaWxpdGllcyB3aXRoaW4gdGhlIGV4dDQgZmlsZXN5c3RlbS4gSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgaXRzIGludGVyYWN0aW9ucy4gVG8gZ2V0IGEgaG9saXN0aWMgdmlldywgSSBhbHNvIG5lZWQgdG8gYnJpbmcgaW4gYGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhYCBhbmQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLiBDb25zaWRlcmluZyB0aGVzZSB0aHJlZSB0b2dldGhlciBzaG91bGQgZ2l2ZSBtZSB0aGUgaW5zaWdodHMgSSdtIGxvb2tpbmcgZm9yLiBJIG5lZWQgdG8gc2VlIGhvdyB0aGV5IGludGVycmVsYXRlIGluIHRoZSBjb250ZXh0IG9mIGZpbGUgY3JlYXRpb24sIGRlbGV0aW9uIGFuZCBlc3BlY2lhbGx5IHNuYXBzaG90IGltcGxlbWVudGF0aW9uLiBJdCdzIHRpbWUgdG8gZGlnIGluLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0MjgzNCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQzOjA5LjQ3OTU4OTgzNVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjI2MDcyMjkzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTMwNTU9ZXh0ZXJuIGludCBleHQ0X2ZpbmRfZGVzdF9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCxcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTMwNTktXFx0XFx0XFx0ICAgICBpbnQgZGxlbik7XFxuZnMvZXh0NC9leHQ0Lmg6MzA2MDp2b2lkIGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbmZzL2V4dDQvZXh0NC5oLTMwNjEtXFx0XFx0XFx0ICAgICBzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUsXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0zMDY1PXN0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X2luc2VydF9kZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dDQuaC0zMDY5LXtcXG5mcy9leHQ0L2V4dDQuaDozMDcwOlxcdGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKGRpciwgaW5vZGUsIGRlLCBidWZfc2l6ZSwgZm5hbWUsIE5VTEwpO1xcbmZzL2V4dDQvZXh0NC5oLTMwNzEtfVxcbi0tXFxuZnMvZXh0NC9pbmxpbmUuYz05Njk9c3RhdGljIGludCBleHQ0X2FkZF9kaXJlbnRfdG9faW5saW5lKGhhbmRsZV90ICpoYW5kbGUsXFxuLS1cXG5mcy9leHQ0L2lubGluZS5jLTk5Ny1cXHRcXHRyZXR1cm4gZXJyO1xcbmZzL2V4dDQvaW5saW5lLmM6OTk4OlxcdGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhKGRpciwgaW5vZGUsIGRlLCBpbmxpbmVfc2l6ZSwgZm5hbWUsIGRmaWQpO1xcbmZzL2V4dDQvaW5saW5lLmMtOTk5LVxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTIyODc9aW50IGV4dDRfZmluZF9kZXN0X2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTIzMjQtXFxuZnMvZXh0NC9uYW1laS5jOjIzMjU6dm9pZCBleHQ0X2luc2VydF9kZW50cnlfZGF0YShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSxcXG5mcy9leHQ0L25hbWVpLmMtMjMyNi1cXHRcXHRcXHQgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSwgaW50IGJ1Zl9zaXplLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTIzNTY9c3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtMjM5Ni1cXHQvKiBCeSBub3cgdGhlIGJ1ZmZlciBpcyBtYXJrZWQgZm9yIGpvdXJuYWxpbmcgKi9cXG5mcy9leHQ0L25hbWVpLmM6MjM5NzpcXHRleHQ0X2luc2VydF9kZW50cnlfZGF0YShkaXIsIGlub2RlLCBkZSwgYmxvY2tzaXplLCBmbmFtZSwgZGZpZCk7XFxuZnMvZXh0NC9uYW1laS5jLTIzOTgtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQzOjA5LjcwNTY3MTI3OFoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxMjQ3NTA4Nzk2OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgbGluZSBvZiB0aG91Z2h0LCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgcHJlc2VudGVkIGFzIGlmIGl0IHdlcmUgbXkgb3duIGludGVybmFsIG1vbm9sb2d1ZTpcblxuKipEaXZpbmcgRGVlcCBpbnRvIGV4dDQgRGlyZWN0b3J5IEluaXRpYWxpemF0aW9uKipcblxuUmlnaHQsIHNvIHdlJ3JlIGxvb2tpbmcgYXQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLiBUaGlzIGZ1bmN0aW9uLCBhcyBJIHJlY2FsbCwgaXMgd2hlcmUgdGhlIHJ1YmJlciByZWFsbHkgbWVldHMgdGhlIHJvYWQgaW4gdGhlIGNyZWF0aW9uIG9mIGEgbmV3IGRpcmVjdG9yeSB3aXRoaW4gYW4gZXh0NCBmaWxlc3lzdGVtLiBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGludHJpY2F0ZSBkYW5jZSBpdCBwZXJmb3JtcyB0byBsYXkgZG93biB0aGUgaW5pdGlhbCBiaXRzIG9mIG1ldGFkYXRhIGFuZCBkYXRhIGJsb2Nrcy4gV2UncmUgc2V0dGluZyB1cCB0aGF0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIGFuZCB0aGVyZSdzIGEgbG90IHRvIGNvbnNpZGVyLlxuXG5GaXJzdCwgSSdtIG1lbnRhbGx5IHBhcnNpbmcgdGhlIGFyZ3VtZW50czogdGhlIGlub2RlLCB0aGUgYmxvY2sgZ3JvdXAsIHRoZSBwYXJlbnQgZGlyZWN0b3J5J3MgaW5vZGUsIHRoZSBuZXcgZGlyZWN0b3J5J3MgbmFtZSwgYW5kIHRoZSBsaW5rIGNvdW50LiBUaGUga2V5IGhlcmUgaXMgZWZmaWNpZW5jeSDigJMgd2UgZG9uJ3Qgd2FudCB0byBvdmVyLWFsbG9jYXRlIG9yIGZyYWdtZW50IHRoaW5ncyByaWdodCBvZmYgdGhlIGJhdC4gSXQgaGFzIHRvIGVuc3VyZSB0aGUgbmV3IGRpcmVjdG9yeSBpcyBsYWlkIG91dCBjb250aWd1b3VzbHkgd2hlbmV2ZXIgcG9zc2libGUuXG5cbkknbSBwaWN0dXJpbmcgdGhlIHByb2Nlc3M6IGFsbG9jYXRpbmcgYW4gaW5vZGUgZm9yIHRoZSBuZXcgZGlyZWN0b3J5LCB6ZXJvaW5nIG91dCB0aGUgYmxvY2ssIGluaXRpYWxpemluZyB0aGUgZGlyZWN0b3J5IGVudHJ5LiBCdXQgSSdtIGFsc28gY29uc2lkZXJpbmcgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGUgYmxvY2sgZ3JvdXAgcG9saWN5LiBJcyBpdCB1c2luZyB0aGUgZGVmYXVsdCBzdHJhdGVneSwgb3IgYXJlIHRoZXJlIHNwZWNpZmljIGFsbG9jYXRpb24gaGludHMgaW4gcGxheT8gVGhhdCBtYWtlcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gdGVybXMgb2YgZnJhZ21lbnRhdGlvbiBhbmQgc3Vic2VxdWVudCBwZXJmb3JtYW5jZS5cblxuVGhlbiB0aGVyZSdzIHRoZSBgZXh0NF9zZXRfaW5vZGVfZmxhZ3NgIGNhbGwgdG8gY29uc2lkZXIuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgc2V0dGluZyBmbGFncyBsaWtlIGBFWFQ0X0RJUlRZYCBhbmQgb3RoZXJzLiBJJ20gbWVudGFsbHkgcmV2aWV3aW5nIG15IGtub3dsZWRnZSBvZiB0aGUgcG90ZW50aWFsIHByb2JsZW1zIHRoYXQgY291bGQgaGFwcGVuIHdpdGggYW4gdW4tc2V0IGZsYWcuXG4gSSdtIGFsc28gc2NydXRpbml6aW5nIHRoZSBgZXh0NF9pbml0X25ld19kaXJfZGF0YWAgZnVuY3Rpb24ncyByb2xlIGluIGNvbnN0cnVjdGluZyB0aGUgXCIuXCIgYW5kIFwiLi5cIiBlbnRyaWVzLiBBcmUgd2UgYmVpbmcgY2FyZWZ1bCB3aXRoIHRoZSBsaW5rIGNvdW50cz8gSXQncyBlc3NlbnRpYWwgdGhvc2UgZW50cmllcyBhcmUgc2V0IHVwIGNvcnJlY3RseSwgb3IgdGhlIGZpbGVzeXN0ZW0gd2lsbCBoYXZlIGEgY2F0YXN0cm9waGljIGZhaWx1cmUuXG5cbkZpbmFsbHksIEknbSBtZW50YWxseSBjaGVja2luZyBmb3IgYW55IG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLiBDYW4gd2Ugc3RyZWFtbGluZSBibG9jayBhbGxvY2F0aW9uIGZ1cnRoZXI/IElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhlIGluaXRpYWwgZGlyZWN0b3J5IGVudHJ5IHNpemUgY2FsY3VsYXRpb25zPyBJJ20gYWx3YXlzIGxvb2tpbmcgZm9yIHdheXMgdG8gaW1wcm92ZSB0aGlzIHByb2Nlc3MgdG8gYXZvaWQgZGVhZGxvY2tzLiBUaGlzIGlzIGNvcmUgZmlsZXN5c3RlbSBmdW5jdGlvbmFsaXR5LCBzbyBpdCBuZWVkcyB0byBiZSBidWxsZXRwcm9vZiBhbmQgZWZmaWNpZW50LlxuXG5JdCdzIGFsbCBhYm91dCB0aGUgZGV0YWlscy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDM2OTIsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0MzoyMi4xODA3NjIxMDZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQwMzY4OTQ2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2luaXRfbmV3X2Rpcl9kYXRhXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL2V4dDQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2V4dDQvZXh0NC5oPTMzMTI9ZXh0ZXJuIGludCBleHQ0X2luZF9taWdyYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpO1xcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMzMxNC0vKiBuYW1laS5jICovXFxuZnMvZXh0NC9leHQ0Lmg6MzMxNTpleHRlcm4gaW50IGV4dDRfaW5pdF9uZXdfZGlyX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuZnMvZXh0NC9leHQ0LmgtMzMxNi1cXHRcXHRcXHRcXHQgIHN0cnVjdCBpbm9kZSAqaW5vZGUsXFxuLS1cXG5mcy9leHQ0L2V4dDQuaD0zMzE4PXN0YXRpYyBpbmxpbmUgaW50IGV4dDRfaW5pdF9uZXdfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqZGlyLFxcbi0tXFxuZnMvZXh0NC9leHQ0LmgtMzMyMC17XFxuZnMvZXh0NC9leHQ0Lmg6MzMyMTpcXHRyZXR1cm4gZXh0NF9pbml0X25ld19kaXJfZGF0YShoYW5kbGUsIGRpciwgaW5vZGUsIE5VTEwsIE5VTEwpO1xcbmZzL2V4dDQvZXh0NC5oLTMzMjItfVxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTMyMDQ9aW50IGV4dDRfaW5pdF9kaXJibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTMyNDktXFxuZnMvZXh0NC9uYW1laS5jOjMyNTA6aW50IGV4dDRfaW5pdF9uZXdfZGlyX2RhdGEoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsXFxuZnMvZXh0NC9uYW1laS5jLTMyNTEtXFx0XFx0XFx0ICAgc3RydWN0IGlub2RlICppbm9kZSxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDM6MjIuNTg0NDU1NzM1WiIsIlNlcSI6MjEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjUyOTUwNjE0ODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFuYWx5emluZyBEaXJlY3RvcnkgRW50cnkgTGVuZ3RoIENhbGN1bGF0aW9ucyoqXG5cblJpZ2h0LCBsZXQncyBjaXJjbGUgYmFjayBhbmQgbWFrZSBhYnNvbHV0ZWx5IHN1cmUgd2UgaGF2ZW4ndCBvdmVybG9va2VkIGFueSBzdWJ0bGUgaW50ZXJhY3Rpb25zIHJlbGF0ZWQgdG8gZGlyZWN0b3J5IGVudHJ5IGxlbmd0aHMsIHBhcnRpY3VsYXJseSBhcyB0aGV5IHJlbGF0ZSB0byBgZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuYCBhbmQgYGV4dDRfZGlyX2VudHJ5X2xlbmAuIEkndmUgZ290IHRvIGVuc3VyZSB0aGUgY29kZSBjb3JyZWN0bHkgY2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGVhY2ggZW50cnkgaW4gYW4gZXh0NCBkaXJlY3RvcnkuIEkgbmVlZCB0byBjcm9zcy1yZWZlcmVuY2UgdGhvc2UgdHdvIGZ1bmN0aW9ucyBhbmQgY29uZmlybSB0aGVpciBhc3N1bXB0aW9ucyBhcmUgY29uc2lzdGVudC4gV2UncmUgZGVhbGluZyB3aXRoIHBvdGVudGlhbGx5IHZ1bG5lcmFibGUgYXJlYXMgaGVyZSwgc28gSSBuZWVkIHRvIHNlZSBob3cgdGhleSBpbnRlcmFjdC4gQXJlIHRoZXJlIGNvcm5lciBjYXNlcyB3aGVyZSB0aGVzZSBjYWxjdWxhdGlvbnMgY291bGQgYmUgb2ZmLCBsZWFkaW5nIHRvIGJ1ZmZlciBvdmVyZmxvd3Mgb3IgaW5jb3JyZWN0IGludGVycHJldGF0aW9uIG9mIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlPyBIYXZlIGFueSBvZiB0aGUgbmV3ZXIgZmlsZXN5c3RlbSBlbmhhbmNlbWVudHMgYWZmZWN0ZWQgdGhlc2UgY2FsY3VsYXRpb25zPyBUaW1lIHRvIGRpZyBpbnRvIHRoZSBkZXRhaWxzIGFuZCByZWNvbmZpcm0gbXkgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlc2UgZnVuY3Rpb25zIHJlbGF0ZSBhbmQgdGhlIHBvdGVudGlhbCByaXNrcyBpZiB0aG9zZSBjYWxjdWxhdGlvbnMgYXJlIHdyb25nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NDU3NCwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQzOjI3Ljg3OTUyMDE2NVoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTAzNzk3MTAyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImV4dDRfZGlyZW50X2dldF9kYXRhX2xlblwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L2Rpci5jPTQ2OT1pbnQgZXh0NF9odHJlZV9zdG9yZV9kaXJlbnQoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBoYXNoLFxcbi0tXFxuZnMvZXh0NC9kaXIuYy00ODUtXFx0XFx0XFx0ZXh0NF9yZWNfbGVuX2Zyb21fZGlzayhkaXJlbnQtXFx1MDAzZXJlY19sZW4sIGJ1Zl9zaXplKTtcXG5mcy9leHQ0L2Rpci5jOjQ4NjpcXHRcXHRleHRyYV9kYXRhID0gZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKGRpcmVudCwgcmVjX2xlbik7XFxuZnMvZXh0NC9kaXIuYy00ODctXFx0fVxcbi0tXFxuZnMvZXh0NC9leHQ0Lmg9MjYzNz1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQ0X2RpcmVudF9yZWNfbGVuKHVuc2lnbmVkIGludCBuYW1lX2xlbixcXG4tLVxcbmZzL2V4dDQvZXh0NC5oLTI2NDUtXFx0ICogaGFzaCBpcyBzdG9yZWQgYXMgYSBDRkhBU0ggZXh0ZW5zaW9uIGFuZCBpcyBhbHJlYWR5IGNvdW50ZWQgaW4gdGhlXFxuZnMvZXh0NC9leHQ0Lmg6MjY0NjpcXHQgKiBuYW1lX2xlbiBhcmd1bWVudCAodmlhIGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbiksIHNvIGFkZGluZyBpdCBhZ2FpblxcbmZzL2V4dDQvZXh0NC5oLTI2NDctXFx0ICogd291bGQgZG91YmxlLWNvdW50Llxcbi0tXFxuZnMvZXh0NC9leHQ0Lmg9NDExMj1zdGF0aWMgaW5saW5lIGJvb2wgZXh0NF9kaXJfZW50cnlfaXNfdGFpbChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUpXFxuLS1cXG5mcy9leHQ0L2V4dDQuaC00MTIyLS8qXFxuZnMvZXh0NC9leHQ0Lmg6NDEyMzogKiBleHQ0X2RpcmVudF9nZXRfZGF0YV9sZW4oKSAtIENvbXB1dGUgdGhlIHRvdGFsIGRpcmRhdGEgbGVuZ3RoIGZvciBhbiBlbnRyeS5cXG5mcy9leHQ0L2V4dDQuaC00MTI0LSAqIEBkZTogZGlyZWN0b3J5IGVudHJ5XFxuLS1cXG5mcy9leHQ0L2V4dDQuaC00MTMzLSAqL1xcbmZzL2V4dDQvZXh0NC5oOjQxMzQ6c3RhdGljIGlubGluZSBpbnQgZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkZSxcXG5mcy9leHQ0L2V4dDQuaC00MTM1LVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGludCByZWNfbGVuKVxcbi0tXFxuZnMvZXh0NC9leHQ0Lmg9NDE5Mz1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQ0X2Rpcl9lbnRyeV9sZW4oc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlLFxcbi0tXFxuZnMvZXh0NC9leHQ0LmgtNDE5Ny1cXHR1bnNpZ25lZCBpbnQgcmVjX2xlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtXFx1MDAzZXJlY19sZW4sIGJsb2Nrc2l6ZSk7XFxuZnMvZXh0NC9leHQ0Lmg6NDE5ODpcXHR1bnNpZ25lZCBpbnQgZGlyZGF0YSA9IGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbihkZSwgcmVjX2xlbik7XFxuZnMvZXh0NC9leHQ0LmgtNDE5OS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDM6MjcuOTgzMzIzMjg3WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU1Njg4Mzc0NzAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIGV4dDQgRGlyZWN0b3J5IFN0cnVjdHVyZSBDb2RlKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgdGhpcyBgZXh0NGAgZGlyZWN0b3J5IGNvZGUuIEkgc2VlIHRoYXQgYGV4dDRfZGlyZW50X2dldF9kYXRhX2xlbmAgaXMgYW4gaW5saW5lIGZ1bmN0aW9uLCB3aGljaCBtYWtlcyBzZW5zZS4gSSBuZWVkIHRvIGFkZCBzZXZlcmFsIGZ1bmN0aW9ucyB0byBteSBgRm9jdXNTeW1ib2xzYCBsaXN0LiBMZXQncyBzZWUuLi4gSSdsbCBpbmNsdWRlIGBleHQ0X2lvY3RsX3NldF9sdWZpZGAsIGBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkYCwgYGV4dDRfZGlyZGF0YV9nZXRgLCBgZXh0NF9kaXJkYXRhX3NldGAsIGBleHQ0X2x1ZmlkX3NuYXBzaG90YCwgYGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhYCwgYW5kIGBleHQ0X2luaXRfbmV3X2Rpcl9kYXRhYC4gSG9sZCBvbiwgbG9va3MgbGlrZSBgZXh0NF9kaXJkYXRhX3NldGAgaXMgYWN0dWFsbHkgc3RhdGljLCBhcyBpcyBgZXh0NF9sdWZpZF9zbmFwc2hvdGAgYW5kIGBleHQ0X2lvY3RsX3NldF9sdWZpZGAuIEhvd2V2ZXIsIGBleHQ0X2RpcmRhdGFfc2V0X2x1ZmlkYCBpcyBleHBvcnRlZCwgYXMgaXMgYGV4dDRfZGlyZGF0YV9nZXRgLiBBbHNvIGdsb2JhbCBhcmUgYGV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhYCBhbmQgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgLlxuXG5Ob3csIGJlZm9yZSBJIG1vdmUgb24sIGxldCdzIGp1c3QgbWFrZSBzdXJlIEkgaGF2ZW4ndCBtaXNzZWQgYW55dGhpbmcgaW50ZXJlc3RpbmcuIEhtbW0sIGBleHQ0X2RpcmVudF9yZWNfbGVuYCBpcyBhbHNvIGlubGluZSwgYXMgaXMgYGV4dDRfZGlyX2VudHJ5X2xlbmAuIEFoLCBJIHNlZSwgdGhleSd2ZSBtb2RpZmllZCBgZXh0NF9jaGVja19keF9yb290YCwgYW5kIHRoZXkndmUgYWRkZWQgYGR4X2dldF9keF9pbmZvYC4gQWxyaWdodCwgdGhhdCBsb29rcyBjb21wcmVoZW5zaXZlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0NTQ3MCwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3OSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0MzozMy41NTIxNjQ0ODdaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEyMTYyNzkwMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJkeF9nZXRfZHhfaW5mb1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L25hbWVpLmM9NTI4PWV4dDRfbmV4dF9lbnRyeShzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqcCwgdW5zaWduZWQgbG9uZyBibG9ja3NpemUpXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtNTM3LSAqL1xcbmZzL2V4dDQvbmFtZWkuYzo1Mzg6c3RhdGljIHN0cnVjdCBkeF9yb290X2luZm8gKmR4X2dldF9keF9pbmZvKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICpkZV9idWYpXFxuZnMvZXh0NC9uYW1laS5jLTUzOS17XFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9NjAzPXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfcm9vdF9saW1pdChzdHJ1Y3QgaW5vZGUgKmRpcixcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy02MDgtXFxuZnMvZXh0NC9uYW1laS5jOjYwOTpcXHRpbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCBkb3RfZGUpO1xcbmZzL2V4dDQvbmFtZWkuYy02MTAtXFx0aWYgKElTX0VSUihpbmZvKSlcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYz04MTQ9ZHhfcHJvYmUoc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy04MzAtXFxuZnMvZXh0NC9uYW1laS5jOjgzMTpcXHRpbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilmcmFtZS1cXHUwMDNlYmgtXFx1MDAzZWJfZGF0YSk7XFxuZnMvZXh0NC9uYW1laS5jLTgzMi1cXHRpZiAoSVNfRVJSKGluZm8pKVxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTk4Mz1zdGF0aWMgdm9pZCBkeF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcylcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy05OTEtXFxuZnMvZXh0NC9uYW1laS5jOjk5MjpcXHRpbmZvID0gZHhfZ2V0X2R4X2luZm8oZGlyLCAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKilmcmFtZXNbMF0uYmgtXFx1MDAzZWJfZGF0YSk7XFxuZnMvZXh0NC9uYW1laS5jLTk5My1cXHRpZiAoSVNfRVJSKGluZm8pKVxcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTI0NjU9c3RhdGljIGludCBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy0yNTQzLVxcdC8qIGluaXRpYWxpemUgaGFzaGluZyBpbmZvICovXFxuZnMvZXh0NC9uYW1laS5jOjI1NDQ6XFx0ZHhfaW5mbyA9IGR4X2dldF9keF9pbmZvKGRpciwgZG90X2RlKTtcXG5mcy9leHQ0L25hbWVpLmMtMjU0NS1cXHRpZiAoSVNfRVJSKGR4X2luZm8pKSB7XFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9Mjc0OD1zdGF0aWMgaW50IGV4dDRfZHhfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy0yODkwLVxcdFxcdFxcdGR4X3NldF9ibG9jayhlbnRyaWVzICsgMCwgbmV3YmxvY2spO1xcbmZzL2V4dDQvbmFtZWkuYzoyODkxOlxcdFxcdFxcdGluZm8gPSBkeF9nZXRfZHhfaW5mbyhkaXIsIChzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqKVxcbmZzL2V4dDQvbmFtZWkuYy0yODkyLVxcdFxcdFxcdFxcdFxcdCAgICAgIGZyYW1lc1swXS5iaC1cXHUwMDNlYl9kYXRhKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDM6MzMuNjczODAwNTc4WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYzODEwMzcwOTgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQWRkaW5nIGBkeF9nZXRfZHhfaW5mb2AgdG8gdGhlIEZvY3VzIFN5bWJvbHMgYW5kIFJlZmluaW5nIENvbmZpZ3VyYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gaW50ZWdyYXRpbmcgYGR4X2dldF9keF9pbmZvYCBpbnRvIHRoZSBgRm9jdXNTeW1ib2xzYCBsaXN0LiBHb29kLCB0aGF0J3Mgc3RyYWlnaHRmb3J3YXJkLiBOb3csIGxldCdzIGp1c3QgZG91YmxlLWNoZWNrIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcy4gVGhlIGluaXRpYWwgdGhvdWdodCB3YXMgYEVYVDRfRlNgLCB3aGljaCBzZWVtcyByaWdodCwgYnV0IGlzIHRoZXJlIGFueXRoaW5nIGVsc2UgSSBuZWVkIHRvIGNvbnNpZGVyPyBBaCwgdGhlIHBhdGNoIG1lbnRpb25zIGBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRElSREFUQWAuIFJpZ2h0LCB0aGF0J3MgYW4gKmV4dDQgZmVhdHVyZSosIG5vdCBhIGtlcm5lbCBjb25maWcgaXRzZWxmLiBTbywgY29uZmlybWluZyB0aGF0IGBFWFQ0X0ZTYCBpcyBpbmRlZWQgc3VmZmljaWVudCBpcyB0aGUgY29ycmVjdCBhcHByb2FjaC5cblxuTm93LCBhIHF1aWNrIHJldmlldyBvZiB0aGUgZXhpc3RpbmcgYEZvY3VzU3ltYm9sc2AgaXMgaW4gb3JkZXIuIExldCdzIG1ha2Ugc3VyZSBJIGhhdmVuJ3QgbWlzc2VkIGFueXRoaW5nIG9idmlvdXMuIEkgaGF2ZTpcblxuKiAgIGBleHQ0X2lvY3RsX3NldF9sdWZpZGBcbiogICBgZXh0NF9kaXJkYXRhX3NldF9sdWZpZGBcbiogICBgZXh0NF9kaXJkYXRhX2dldGBcbiogICBgZXh0NF9kaXJkYXRhX3NldGBcbiogICBgZXh0NF9sdWZpZF9zbmFwc2hvdGBcbiogICBgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGFgXG4qICAgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgXG4qICAgYGR4X2dldF9keF9pbmZvYFxuXG5Mb29rcyBnb29kLCBjb3ZlcmluZyBhIGRlY2VudCByYW5nZSBvZiBleHQ0J3MgZGlyZGF0YSBmdW5jdGlvbmFsaXRpZXMuXG5cbkxldCdzIGRvIG9uZSBsYXN0IHNjYW4gdG8gc2VlIGlmIGFueXRoaW5nIGVsc2UganVtcHMgb3V0IGFzIHJlbGV2YW50LiBJJ2xsIG5lZWQgdG8gcmVtZW1iZXIgdG8gY2hlY2sgZm9yIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBpbXBhY3RlZCBvciByZWxhdGVkLiBgZXh0NF9kaXJlbnRfZ2V0X2RhdGFfbGVuYCBpcyBpbmxpbmUsIHNvIGl0IHdvbid0IGJlIGluIHRoZSBzeW1ib2wgdGFibGUsIGJ1dCBpdCdzIHdvcnRoIG5vdGluZyBoZXJlLCB0byBrZWVwIGl0IGluIG1pbmQuIFNpbWlsYXJseSwgYGV4dDRfZGlyX2VudHJ5X2xlbmAgaXMgYWxzbyBpbmxpbmUuIEhtbSwgYGV4dDRfY2hlY2tfZHhfcm9vdGAgaXMgbW9kaWZpZWQsIHRoYXQgb25lIGlzIHdvcnRoIHNvbWUgYWRkaXRpb25hbCBzY3J1dGlueS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDY4NzAsIk91dHB1dFRva2VucyI6MzMsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyODEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDM6NDAuMDU0ODQxNjM2WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3OTc2NjE2MywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X2NoZWNrX2R4X3Jvb3RcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9uYW1laS5jPTIzNTY9c3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZXh0NF9maWxlbmFtZSAqZm5hbWUsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtMjQyMC1cXG5mcy9leHQ0L25hbWVpLmM6MjQyMTpzdGF0aWMgYm9vbCBleHQ0X2NoZWNrX2R4X3Jvb3Qoc3RydWN0IGlub2RlICpkaXIsXFxuZnMvZXh0NC9uYW1laS5jLTI0MjItXFx0XFx0XFx0ICAgICAgIHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICpkb3RfZGUsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9MjQ2NT1zdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfZmlsZW5hbWUgKmZuYW1lLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTI1MDEtXFx0ZG90ZG90X2RlID0gZXh0NF9uZXh0X2VudHJ5KGRvdF9kZSwgYmxvY2tzaXplKTtcXG5mcy9leHQ0L25hbWVpLmM6MjUwMjpcXHRpZiAoIWV4dDRfY2hlY2tfZHhfcm9vdChkaXIsIGRvdF9kZSwgZG90ZG90X2RlLCBcXHUwMDI2ZGUpKSB7XFxuZnMvZXh0NC9uYW1laS5jLTI1MDMtXFx0XFx0YnJlbHNlKGJoKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDM6NDAuMTM0NjE0MTc5WiIsIlNlcSI6MjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjYwMzE4NDM0OTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkFkZGluZyBgZXh0NF9jaGVja19keF9yb290YCB0byB0aGUgRm9jdXMgTGlzdCBcdTAwMjYgQ29uc2lkZXJpbmcgYGV4dDRfc2V0ZW50YCoqXG5cbkFscmlnaHQsIEknbSBnb2luZyB0byBhZGQgYGV4dDRfY2hlY2tfZHhfcm9vdGAgdG8gbXkgYEZvY3VzU3ltYm9sc2AgbGlzdC4gSSBuZWVkIHRvIGtlZXAgYSBjbG9zZSBleWUgb24gdGhhdCBmdW5jdGlvbiBpbiB0aGUgY29udGV4dCBvZiBteSBjdXJyZW50IGludmVzdGlnYXRpb24uIEkgYW50aWNpcGF0ZSBpdCdzIGxpa2VseSB0byBiZSByZWxldmFudCBnaXZlbiB0aGUgYXJlYSBJJ20gcHJvYmluZy5cblxuTm93LCBsZXQgbWUgc2hpZnQgZ2VhcnMgc2xpZ2h0bHkgYW5kIHJldmlzaXQgYGV4dDRfc2V0ZW50YC4gSSB3YW50IHRvIHF1aWNrbHkgcmUtZXZhbHVhdGUgaXQgYW5kIHNlZSBpZiBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgZmlyc3QgZm9jdXMuIEl0IHdpbGwgYmUgdXNlZnVsIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUgaW4gdGhpcyBjb250ZXh0LCBhbmQgYW55IHBvdGVudGlhbCBpbnRlcmFjdGlvbnMsIGJlZm9yZSBkaXZpbmcgaW4gZnVydGhlci4gSXQncyBnb29kIHRvIGtlZXAgbXVsdGlwbGUgYW5nbGVzIGluIHZpZXcgZm9yIG1vcmUgZWZmZWN0aXZlIGRlYnVnZ2luZy5cblxuXG4iLCJJbnB1dFRva2VucyI6NDc4ODAsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0Mzo0Ni4xNjY0NjAxODRaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwNjI2MzE0MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJleHQ0X3NldGVudFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9leHQ0L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9leHQ0L25hbWVpLmM9MzkwMD1zdGF0aWMgaW50IGV4dDRfcmVuYW1lX2Rpcl9maW5pc2goaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy0zOTI4LVxcbmZzL2V4dDQvbmFtZWkuYzozOTI5OnN0YXRpYyBpbnQgZXh0NF9zZXRlbnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGV4dDRfcmVuYW1lbnQgKmVudCxcXG5mcy9leHQ0L25hbWVpLmMtMzkzMC1cXHRcXHQgICAgICAgdW5zaWduZWQgaW5vLCB1bnNpZ25lZCBmaWxlX3R5cGUsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9NDAwNj1zdGF0aWMgdm9pZCBleHQ0X3Jlc2V0ZW50KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X3JlbmFtZW50ICplbnQsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtNDAyNy1cXG5mcy9leHQ0L25hbWVpLmM6NDAyODpcXHRleHQ0X3NldGVudChoYW5kbGUsIFxcdTAwMjZvbGQsIGlubywgZmlsZV90eXBlLCBOVUxMKTtcXG5mcy9leHQ0L25hbWVpLmMtNDAyOS1cXHRicmVsc2Uob2xkLmJoKTtcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYz00MTYxPXN0YXRpYyBpbnQgZXh0NF9yZW5hbWUoc3RydWN0IG1udF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpcixcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy00MjkxLVxcdFxcdCAqL1xcbmZzL2V4dDQvbmFtZWkuYzo0MjkyOlxcdFxcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXFx1MDAyNm9sZCwgd2hpdGVvdXQtXFx1MDAzZWlfaW5vLFxcbmZzL2V4dDQvbmFtZWkuYy00MjkzLVxcdFxcdFxcdFxcdCAgICAgRVhUNF9GVF9DSFJERVYsIE5VTEwpO1xcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTQzMTUtXFx0XFx0fVxcbmZzL2V4dDQvbmFtZWkuYzo0MzE2OlxcdFxcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXFx1MDAyNm5ldyxcXG5mcy9leHQ0L25hbWVpLmMtNDMxNy1cXHRcXHRcXHRcXHQgICAgIG9sZC5pbm9kZS1cXHUwMDNlaV9pbm8sIG9sZF9maWxlX3R5cGUsIG9sZF9maWQpO1xcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTQ0Mjc9c3RhdGljIGludCBleHQ0X2Nyb3NzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksXFxuLS1cXG5mcy9leHQ0L25hbWVpLmMtNDUzNS1cXHRcXHRuZXdfZmlsZV90eXBlIFxcdTAwMjY9IH5FWFQ0X0RJUkVOVF9MVUZJRDtcXG5mcy9leHQ0L25hbWVpLmM6NDUzNjpcXHRyZXR2YWwgPSBleHQ0X3NldGVudChoYW5kbGUsIFxcdTAwMjZuZXcsIG9sZC5pbm9kZS1cXHUwMDNlaV9pbm8sIG9sZF9kZV9maWxlX3R5cGUsXFxuZnMvZXh0NC9uYW1laS5jLTQ1MzctXFx0XFx0XFx0ICAgICBvbGRfZmlkKTtcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy00NTQwLVxcbmZzL2V4dDQvbmFtZWkuYzo0NTQxOlxcdHJldHZhbCA9IGV4dDRfc2V0ZW50KGhhbmRsZSwgXFx1MDAyNm9sZCwgbmV3Lmlub2RlLVxcdTAwM2VpX2lubywgbmV3X2ZpbGVfdHlwZSxcXG5mcy9leHQ0L25hbWVpLmMtNDU0Mi1cXHRcXHRcXHQgICAgIG5ld19maWQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0Mzo0Ni4yNzI3MzA1MTZaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjYxMjI5Mzc3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2UsIGFuZCB3cml0dGVuIGFzIGlmIHRoZXkgd2VyZSBteSBvd246XG5cbioqSW50ZWdyYXRpbmcgc3JjX2ZpZCBpbnRvIGV4dDRfc2V0ZW50KipcblxuUmlnaHQsIHNvIEkgbmVlZCB0byBtb2RpZnkgYGV4dDRfc2V0ZW50YC4gVGhlIGdvYWwgaXMgdG8gaW5jb3Jwb3JhdGUgdGhlIGhhbmRsaW5nIG9mIGBzcmNfZmlkYC4gVGhpcyBmZWVscyBsaWtlIGEgc3RyYWlnaHRmb3J3YXJkLCB0aG91Z2ggcG90ZW50aWFsbHkgZGVsaWNhdGUsIGNoYW5nZS4gQmVzdCB0byBiZSBtZXRpY3Vsb3VzIGhlcmUuIE5vdywgYmVmb3JlIEkganVtcCBpbiwgSSB3YW50IHRvIGNvbmZpcm0gaG93IGBfX2V4dDRfYWRkX2VudHJ5YCBpcyBoYW5kbGluZyBlbnRyaWVzLCBhcyB0aGF0IGlzIGxpa2VseSB0aGUgZnVuY3Rpb24gdGhhdCB3aWxsIGdldCB1cGRhdGVkLiBJJ2xsIG5lZWQgdG8gZG91YmxlIGNoZWNrIHRoZSBpbnRlcmFjdGlvbnMuIEknbSBnb2luZyB0byBzdGFydCB3aXRoIGEgc2FuaXR5IGNoZWNrIHRoZXJlLCBtYWtpbmcgc3VyZSB0byBjb25zaWRlciB0aGUgaW1wbGljYXRpb25zIG9uIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgYW5kIGRpcmVjdG9yeSBlbnRyeSBsYXlvdXQuIEl0J3MgYSBrZXkgZW50cnkgcG9pbnQsIGFuZCB0aGF0J3MgdGhlIGFyZWEgSSBuZWVkIHRvIHVuZGVyc3RhbmQgbW9zdCBjbGVhcmx5LlxuXG5cbiIsIklucHV0VG9rZW5zIjo0ODgxOSwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM1LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA3LTE0VDE5OjQzOjUyLjg4NTAyNjc4NloiLCJTZXEiOjMwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTE1NTIzMTIyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIl9fZXh0NF9hZGRfZW50cnlcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnMvZXh0NC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvZXh0NC9uYW1laS5jPTI0NjU9c3RhdGljIGludCBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBleHQ0X2ZpbGVuYW1lICpmbmFtZSxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy0yNjIxLSAqL1xcbmZzL2V4dDQvbmFtZWkuYzoyNjIyOnN0YXRpYyBpbnQgX19leHQ0X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmRpcixcXG5mcy9leHQ0L25hbWVpLmMtMjYyMy1cXHRcXHRcXHQgIGNvbnN0IHN0cnVjdCBxc3RyICpkX25hbWUsXFxuLS1cXG5mcy9leHQ0L25hbWVpLmM9MjczND1zdGF0aWMgaW50IGV4dDRfYWRkX2VudHJ5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSxcXG4tLVxcbmZzL2V4dDQvbmFtZWkuYy0yNzQwLVxcdFxcdHJldHVybiAtRU5PS0VZO1xcbmZzL2V4dDQvbmFtZWkuYzoyNzQxOlxcdHJldHVybiBfX2V4dDRfYWRkX2VudHJ5KGhhbmRsZSwgZGlyLCBcXHUwMDI2ZGVudHJ5LVxcdTAwM2VkX25hbWUsIGlub2RlLFxcbmZzL2V4dDQvbmFtZWkuYy0yNzQyLVxcdFxcdFxcdFxcdGRlbnRyeS1cXHUwMDNlZF9mc2RhdGEpO1xcbi0tXFxuZnMvZXh0NC9uYW1laS5jPTM3Mzc9aW50IF9fZXh0NF9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLFxcbi0tXFxuZnMvZXh0NC9uYW1laS5jLTM3NTktXFxuZnMvZXh0NC9uYW1laS5jOjM3NjA6XFx0ZXJyID0gX19leHQ0X2FkZF9lbnRyeShoYW5kbGUsIGRpciwgZF9uYW1lLCBpbm9kZSxcXG5mcy9leHQ0L25hbWVpLmMtMzc2MS1cXHRcXHRcXHQgICAgICAgZGVudHJ5ID8gZGVudHJ5LVxcdTAwM2VkX2ZzZGF0YSA6IE5VTEwpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wNy0xNFQxOTo0Mzo1My4wMDA1NTkwMzhaIiwiU2VxIjozMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTUzNTgxNTYwODAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgRVhUNCBQYXRjaCoqXG5cbk9rYXksIEkndmUgcmV2aWV3ZWQgdGhlIGNvZGUuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBsZXQncyBpbmNsdWRlIGBfX2V4dDRfYWRkX2VudHJ5YCBpbiB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgaW52b2x2ZWQsIGp1c3QgdG8gZW5zdXJlIGNvbXByZWhlbnNpdmUgY292ZXJhZ2UuIFNvIHRoYXQncyB0aGUgZmluYWwgbGlzdDpcblxuKiAgIGBleHQ0X2lvY3RsX3NldF9sdWZpZGBcbiogICBgZXh0NF9kaXJkYXRhX3NldF9sdWZpZGBcbiogICBgZXh0NF9kaXJkYXRhX2dldGBcbiogICBgZXh0NF9kaXJkYXRhX3NldGBcbiogICBgZXh0NF9sdWZpZF9zbmFwc2hvdGBcbiogICBgZXh0NF9pbnNlcnRfZGVudHJ5X2RhdGFgXG4qICAgYGV4dDRfaW5pdF9uZXdfZGlyX2RhdGFgXG4qICAgYGR4X2dldF9keF9pbmZvYFxuKiAgIGBleHQ0X2NoZWNrX2R4X3Jvb3RgXG4qICAgYGV4dDRfc2V0ZW50YFxuKiAgIGBfX2V4dDRfYWRkX2VudHJ5YFxuXG5Ob3csIHJlZ2FyZGluZyBjb25maWd1cmF0aW9uLCBteSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgYEVYVDRfRlNgIGlzIHRoZSByZWxldmFudCBjb25maWcuIEhvd2V2ZXIsIEkgYWx3YXlzIGxpa2UgdG8gZG91YmxlLWNoZWNrIHRoZXNlIGFzc3VtcHRpb25zLiBJIHNlZSB0aGUgcGF0Y2ggdG91Y2hlcyBgZnMvZXh0NC9zeXNmcy5jYCwgYWRkaW5nIGEgYGRpcmRhdGFgIGZlYXR1cmUuIEFsc28sIGl0IG1vZGlmaWVzIGBmcy9leHQ0L2Zhc3RfY29tbWl0LmNgIHdpdGggdGhlIGluY2x1c2lvbiBvZiBgRVhUNF9GQ19SRUFTT05fRElSREFUQWAsIGFuZCBpdCBoYW5kbGVzIGRpcmRhdGEgaW4gYGZzL2V4dDQvaW5saW5lLmNgLiBUaGVyZSdzIHRoZSBhZGRpdGlvbiBvZiBgRVhUNF9JT0NfU0VUX0xVRklEYCBpbiBgZnMvZXh0NC9pb2N0bC5jYC4gVGhlbiwgc2lnbmlmaWNhbnQgY2hhbmdlcyBhcmUgcHJlc2VudCBpbiBgZnMvZXh0NC9uYW1laS5jYCwgYW5kIGBleHQ0X2h0cmVlX3N0b3JlX2RpcmVudGAgZ2V0cyBtb2RpZmllZCBpbiBgZnMvZXh0NC9kaXIuY2AuXG5cbkJhc2VkIG9uIHRoaXMgYW5hbHlzaXMsIEknbSBjb25maWRlbnQgdGhhdCBgRVhUNF9GU2AgaXMsIGluIGZhY3QsIHRoZSBvbmx5IGNvbmZpZ3VyYXRpb24gZGVwZW5kZW5jeSBmb3IgdGhpcyBjaGFuZ2UuIEknbSByZWFkeSB0byBzdWJtaXQgbXkgZmluZGluZ3MgYW5kIGNvbmNsdXNpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo0OTQ1MCwiT3V0cHV0VG9rZW5zIjoyNTIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozMzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDctMTRUMTk6NDQ6MDguMzU4NzE4NzI3WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM1MjI0MzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFWFQ0X0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXh0NF9pb2N0bF9zZXRfbHVmaWRcIixcbiAgICBcImV4dDRfZGlyZGF0YV9zZXRfbHVmaWRcIixcbiAgICBcImV4dDRfZGlyZGF0YV9nZXRcIixcbiAgICBcImV4dDRfZGlyZGF0YV9zZXRcIixcbiAgICBcImV4dDRfbHVmaWRfc25hcHNob3RcIixcbiAgICBcImV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhXCIsXG4gICAgXCJleHQ0X2luaXRfbmV3X2Rpcl9kYXRhXCIsXG4gICAgXCJkeF9nZXRfZHhfaW5mb1wiLFxuICAgIFwiZXh0NF9jaGVja19keF9yb290XCIsXG4gICAgXCJleHQ0X3NldGVudFwiLFxuICAgIFwiX19leHQ0X2FkZF9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0NCBmZWF0dXJlIGBkaXJkYXRhYCAoRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEpIGFuZCBhIG5ldyBpb2N0bCBgRVhUNF9JT0NfU0VUX0xVRklEYCB0byBhdHRhY2ggTFVGSUQgZGF0YSB0byBkaXJlY3RvcnkgZW50cmllcy4gSXQgbW9kaWZpZXMgY29yZSBkaXJlY3RvcnkgZW50cnkgcGFyc2luZywgaW5zZXJ0aW9uLCBzcGxpdHRpbmcsIGFuZCByZW5hbWluZyBsb2dpYyB0byBoYW5kbGUgdmFyaWFibGUtbGVuZ3RoIGRhdGEgYXBwZW5kZWQgdG8gZGlyZWN0b3J5IGVudHJpZXMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJFWFQ0X0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiZXh0NF9pb2N0bF9zZXRfbHVmaWRcIixcbiAgICBcImV4dDRfZGlyZGF0YV9zZXRfbHVmaWRcIixcbiAgICBcImV4dDRfZGlyZGF0YV9nZXRcIixcbiAgICBcImV4dDRfZGlyZGF0YV9zZXRcIixcbiAgICBcImV4dDRfbHVmaWRfc25hcHNob3RcIixcbiAgICBcImV4dDRfaW5zZXJ0X2RlbnRyeV9kYXRhXCIsXG4gICAgXCJleHQ0X2luaXRfbmV3X2Rpcl9kYXRhXCIsXG4gICAgXCJkeF9nZXRfZHhfaW5mb1wiLFxuICAgIFwiZXh0NF9jaGVja19keF9yb290XCIsXG4gICAgXCJleHQ0X3NldGVudFwiLFxuICAgIFwiX19leHQ0X2FkZF9lbnRyeVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgZXh0NCBmZWF0dXJlIGBkaXJkYXRhYCAoRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0RJUkRBVEEpIGFuZCBhIG5ldyBpb2N0bCBgRVhUNF9JT0NfU0VUX0xVRklEYCB0byBhdHRhY2ggTFVGSUQgZGF0YSB0byBkaXJlY3RvcnkgZW50cmllcy4gSXQgbW9kaWZpZXMgY29yZSBkaXJlY3RvcnkgZW50cnkgcGFyc2luZywgaW5zZXJ0aW9uLCBzcGxpdHRpbmcsIGFuZCByZW5hbWluZyBsb2dpYyB0byBoYW5kbGUgdmFyaWFibGUtbGVuZ3RoIGRhdGEgYXBwZW5kZWQgdG8gZGlyZWN0b3J5IGVudHJpZXMuIFRoaXMgaXMgYSBzaWduaWZpY2FudCBmdW5jdGlvbmFsIGNoYW5nZSB0byB0aGUgZXh0NCBmaWxlc3lzdGVtIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },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,}