Name: series-workflow87tlv Phase: Succeeded StartedAt: 2026-09-09 10:24:22 +0000 UTC FinishedAt: 2026-09-09 14:53:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[0] Phase: Succeeded StartedAt: 2026-09-09 10:24:22 +0000 UTC FinishedAt: 2026-09-09 11:11:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[0].run-triage Phase: Succeeded StartedAt: 2026-09-09 10:24:22 +0000 UTC FinishedAt: 2026-09-09 11:11:30 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "dd660a0e0fee1bc892e16fdb6abdf92676515175", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "QUOTA", "GFS2_FS", "SECURITY_LANDLOCK" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "dd660a0e0fee1bc892e16fdb6abdf92676515175", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "QUOTA", "GFS2_FS", "SECURITY_LANDLOCK" ], "series_id": "2f6305a7-997e-43d4-9575-8204b7abcd49" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "sb_for_each_inodes", "evict_inodes", "sync_bdevs", "drop_pagecache_sb", "add_dquot_ref", "gfs2_evict_inodes", "hook_sb_delete" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1FVT1RBJiMzNDssCiAgICAmIzM0O0dGUzJfRlMmIzM0OywKICAgICYjMzQ7U0VDVVJJVFlfTEFORExPQ0smIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzYl9mb3JfZWFjaF9pbm9kZXMmIzM0OywKICAgICYjMzQ7ZXZpY3RfaW5vZGVzJiMzNDssCiAgICAmIzM0O3N5bmNfYmRldnMmIzM0OywKICAgICYjMzQ7ZHJvcF9wYWdlY2FjaGVfc2ImIzM0OywKICAgICYjMzQ7YWRkX2RxdW90X3JlZiYjMzQ7LAogICAgJiMzNDtnZnMyX2V2aWN0X2lub2RlcyYjMzQ7LAogICAgJiMzNDtob29rX3NiX2RlbGV0ZSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXG5cbi0gVW5pbml0aWFsaXplZCBtZW1vcnkgLyBLTVNBTiBwZXJzcGVjdGl2ZTpcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxuICAtIEFsbCBjYWxsYmFjayBkYXRhIHBheWxvYWRzIHBhc3NlZCB0byB0aGUgaXRlcmF0b3IgZnVuY3Rpb25zIGFyZSBlaXRoZXIgTlVMTCBvciBwb2ludGVycyB0byBmdWxseSBpbml0aWFsaXplZCB2YXJpYWJsZXMvc3RydWN0dXJlcyAoZS5nLiwgYm9vbGVhbiBjYXN0LCBpbml0aWFsaXplZCBsaW5rZWQgbGlzdCBoZWFkLCBpbnRlZ2VyIHBvaW50ZXIpLlxuICAtIE5vIGtlcm5lbCBkYXRhIGlzIGNvcGllZCBvciBleHBvc2VkIHRvIHVzZXIgc3BhY2UgKG5vIGBjb3B5X3RvX3VzZXJgLCBpb2N0bHMsIG5ldGxpbmsgbWVzc2FnZXMsIGV0Yy4pLlxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cblxuLSBLQVNBTiAvIExPQ0tERVAgcGVyc3BlY3RpdmU6XG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrYCBhbmQgYGlub2RlLVx1MDAzZWlfbG9ja2AsIG9yIHVzZS1hZnRlci1mcmVlL3JhY2UgY29uZGl0aW9ucyBpZiBsaXN0IG5vZGVzIGFyZSBkZWxldGVkIGR1cmluZyB0cmF2ZXJzYWwuIFRoZXNlIGFyZSBmdWxseSBjb3ZlcmVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgYERFQlVHX0xJU1RgLlxuXG5UaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIGZyYW1ld29yayAoc2JfZm9yX2VhY2hfaW5vZGVzKSB3aXRoIGR5bmFtaWMgaXRlcmF0b3IgbGlzdCB0cmFja2luZyAoc19pbm9kZXNfaXRlcnMpIGFuZCB1cGRhdGVzIHRyYXZlcnNhbCBsb29wcyBpbiBWRlMgKGV2aWN0X2lub2RlcywgZHJvcF9jYWNoZXMpLCBibG9jayBkZXZpY2VzIChzeW5jX2JkZXZzKSwgcXVvdGFzIChhZGRfZHF1b3RfcmVmKSwgR0ZTMiAoZ2ZzMl9ldmljdF9pbm9kZXMpLCBhbmQgTGFuZGxvY2sgKGhvb2tfc2JfZGVsZXRlKS4gVGhpcyBzaWduaWZpY2FudGx5IGFsdGVycyBsb2NraW5nLCBsaXN0IG11dGF0aW9uIGR1cmluZyB0cmF2ZXJzYWwsIGFuZCByZWZjb3VudGluZyBhY3Jvc3MgY29yZSBzdWJzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgcmFjZXMsIGxpc3QgY29ycnVwdGlvbnMsIG9yIGRlYWRsb2Nrcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGI0NmUzZDk2YzlhMTcxMDcyMGI4M2IzOWU5ZmZhMTI2Zjk4ODBkNjVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDExOjEwOjQxIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuY1xuaW5kZXggY2Q4MzIzMDgzNzQwNi4uYWU0NzJhMDYyZTUxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2JkZXYuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmRldi5jXG5AQCAtMTMzNiw1NiAmIzQzOzEzMzYsNTMgQEAgdm9pZCBiZGV2X21hcmtfZGVhZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBib29sIHN1cnByaXNlKVxuICAqL1xuIEVYUE9SVF9TWU1CT0xfR1BMKGJkZXZfbWFya19kZWFkKTtcbiBcbi12b2lkIHN5bmNfYmRldnMoYm9vbCB3YWl0KVxuJiM0MztzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXHUwMDNlaV9tYXBwaW5nO1xuLVx0XHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2O1xuJiM0MztcdGJvb2wgd2FpdCA9IChib29sKWRhdGE7XG4mIzQzO1x0c3RydWN0IGJsb2NrX2RldmljZSAqYmRldjtcbiYjNDM7XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbiBcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpIHx8XG4tXHRcdCAgICBtYXBwaW5nLVx1MDAzZW5ycGFnZXMgPT0gMCkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRpZiAobWFwcGluZy1cdTAwM2VucnBhZ2VzID09IDApIHtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAmIzM5O2lub2RlJiMzOTsgc28gaXQgY291bGRuJiMzOTt0IGhhdmUgYmVlblxuJiM0MztcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4mIzQzO1x0ICogc19pbm9kZV9saXN0X2xvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuJiM0MztcdGJkZXYgPSBJX0JERVYoaW5vZGUpO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbiYjNDM7XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbiYjNDM7XHRcdDsgLyogc2tpcCAqL1xuJiM0MztcdH0gZWxzZSBpZiAod2FpdCkge1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICYjMzk7aW5vZGUmIzM5OyBzbyBpdCBjb3VsZG4mIzM5O3QgaGF2ZSBiZWVuXG4tXHRcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrICBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhblxuLVx0XHQgKiBiZSBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXJcbi1cdFx0ICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdFxuLVx0XHQgKiBsYXRlci5cbiYjNDM7XHRcdCAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc29cbiYjNDM7XHRcdCAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nXG4mIzQzO1x0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4mIzQzO1x0XHQgKiBkZXRhaWxzLlxuIFx0XHQgKi9cbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0YmRldiA9IElfQkRFVihpbm9kZSk7XG4tXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2YmRldi1cdTAwM2ViZF9kaXNrLVx1MDAzZW9wZW5fbXV0ZXgpO1xuLVx0XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbi1cdFx0XHQ7IC8qIHNraXAgKi9cbi1cdFx0fSBlbHNlIGlmICh3YWl0KSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBXZSBrZWVwIHRoZSBlcnJvciBzdGF0dXMgb2YgaW5kaXZpZHVhbCBtYXBwaW5nIHNvXG4tXHRcdFx0ICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmdcbi1cdFx0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4tXHRcdFx0ICogZGV0YWlscy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9XG4tXHRcdG11dGV4X3VubG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRcdGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbiYjNDM7XHRpcHV0KGlub2RlKTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbiYjNDM7e1xuJiM0MztcdHNiX2Zvcl9lYWNoX2lub2RlcyhibG9ja2Rldl9zdXBlcmJsb2NrLCBJTk9ERV9JVEVSX05PUk1BTCxcbiYjNDM7XHRcdFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xuIH1cbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2ZzL2Ryb3BfY2FjaGVzLmMgYi9mcy9kcm9wX2NhY2hlcy5jXG5pbmRleCA0OWY1NmE1OThlY2JjLi4wZDQ3NWE1ZmY4Y2ZiIDEwMDY0NFxuLS0tIGEvZnMvZHJvcF9jYWNoZXMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZHJvcF9jYWNoZXMuY1xuQEAgLTE2LDM2ICYjNDM7MTYsMzAgQEBcbiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovXG4gc3RhdGljIGludCBzeXNjdGxfZHJvcF9jYWNoZXM7XG4gXG4tc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxuJiM0MztzdGF0aWMgaW50IGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgbXVzdCBza2lwIGlub2RlcyBpbiB1bnVzdWFsIHN0YXRlLiBXZSBtYXkgYWxzbyBza2lwXG4tXHRcdCAqIGlub2RlcyB3aXRob3V0IHBhZ2VzIGJ1dCB3ZSBkZWxpYmVyYXRlbHkgd29uJiMzOTt0IGluIGNhc2Vcbi1cdFx0ICogd2UgbmVlZCB0byByZXNjaGVkdWxlIHRvIGF2b2lkIHNvZnRsb2NrdXBzLlxuLVx0XHQgKi9cbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSB8fFxuLVx0XHQgICAgKG1hcHBpbmdfZW1wdHkoaW5vZGUtXHUwMDNlaV9tYXBwaW5nKSBcdTAwMjZcdTAwMjYgIW5lZWRfcmVzY2hlZCgpKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRpZiAobWFwcGluZ19lbXB0eShpbm9kZS1cdTAwM2VpX21hcHBpbmcpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbi1cdFx0aW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLVx1MDAzZWlfbWFwcGluZywgMCwgLTEpO1xuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcdH1cbiYjNDM7XG4mIzQzO1x0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0aXB1dCh0b3B1dF9pbm9kZSk7XG4mIzQzO1xuJiM0MztcdGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS1cdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcbiYjNDM7XHRpcHV0KGlub2RlKTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGRyb3BfcGFnZWNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnVudXNlZClcbiYjNDM7e1xuJiM0MztcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRyb3BfY2FjaGVzX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG5kaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDRcbi0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuQEAgLTk5Niw3ICYjNDM7OTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KVxuIFx0XHRzd2l0Y2ggKHRva2VuKSB7XG4gXHRcdGNhc2UgT3B0X2ppZDpcbiBcdFx0XHRyZXQgPSBtYXRjaF9pbnQoXHUwMDI2dG1wWzBdLCBcdTAwMjZvcHRpb24pO1xuLVx0XHRcdGlmIChyZXQgfHwgb3B0aW9uIFx1MDAzYyAwKSBcbiYjNDM7XHRcdFx0aWYgKHJldCB8fCBvcHRpb24gXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGhvc3RkYXRhX2Vycm9yO1xuIFx0XHRcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpKVxuIFx0XHRcdFx0bHMtXHUwMDNlbHNfamlkID0gb3B0aW9uO1xuQEAgLTE3MTksNiAmIzQzOzE3MTksMTkgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4mIzQzO1xuJiM0MztcdF9faWdldChpbm9kZSk7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlwdXQoaW5vZGUpO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogZ2ZzMl9ldmljdF9pbm9kZXMgLSBldmljdCBpbm9kZXMgY29vcGVyYXRpdmVseVxuICAqIEBzYjogdGhlIHN1cGVyYmxvY2tcbkBAIC0xNzQxLDMxICYjNDM7MTc1NCwxMCBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuICAqL1xuIHN0YXRpYyB2b2lkIGdmczJfZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItXHUwMDNlc19mc19pbmZvO1xuIFxuIFx0c2V0X2JpdChTREZfRVZJQ1RJTkcsIFx1MDAyNnNkcC1cdTAwM2VzZF9mbGFncyk7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KHRvcHV0X2lub2RlKTtcbiYjNDM7XHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBnZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuY1xuaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDRcbi0tLSBhL2ZzL2lub2RlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2lub2RlLmNcbkBAIC02OSw2ICYjNDM7NjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0ge1xuIH07XG4gRVhQT1JUX1NZTUJPTChlbXB0eV9hb3BzKTtcbiBcbiYjNDM7c3RydWN0IGlub2RlX2l0ZXIge1xuJiM0MztcdHN0cnVjdCBsaXN0X2hlYWRcdGl0ZXJzX25vZGU7XHQvKiBzYi1cdTAwM2VzX2lub2Rlc19pdGVycyAqL1xuJiM0MztcdHN0cnVjdCBsaXN0X2hlYWRcdCpuZXh0O1x0XHQvKiBuZXh0IG5vZGUgZ29pbmcgdG8gaXRlcmF0ZSAqL1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncztcbiYjNDM7XHRpbm9kZV9pdGVyX2NiIGZ1bmM7XG4mIzQzO1x0dm9pZCAqZGF0YTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0Mzt9O1xuJiM0MztcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfaW5vZGVzKTtcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfdW51c2VkKTtcbiBcbkBAIC02NDEsMTIgJiM0Mzs2NTAsOTYgQEAgdm9pZCBpbm9kZV9zYl9saXN0X2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChpbm9kZV9zYl9saXN0X2FkZCk7XG4gXG4mIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGludCBmbGFncywgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGl0LVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4mIzQzO1x0aXQtXHUwMDNlZnVuYyA9IGZuO1xuJiM0MztcdGl0LVx1MDAzZWRhdGEgPSBkYXRhO1xuJiM0MztcdGl0LVx1MDAzZXJldCA9IDA7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRpdC1cdTAwM2VuZXh0ID0gc2ItXHUwMDNlc19pbm9kZXMubmV4dDtcbiYjNDM7XHRsaXN0X2FkZChcdTAwMjZpdC1cdTAwM2VpdGVyc19ub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfZW5kKHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7e1xuJiM0MztcdGxpc3RfZGVsKFx1MDAyNml0LVx1MDAzZWl0ZXJzX25vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgaW5vZGVfc2JfaXRlcl9uZXh0KHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghaW5vZGUgXHUwMDI2XHUwMDI2IGl0LVx1MDAzZW5leHQgIT0gXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMpIHtcbiYjNDM7XHRcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cdTAwM2VuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7XG4mIzQzO1x0XHRpZiAoaXQtXHUwMDNlZmxhZ3MgXHUwMDI2IElOT0RFX0lURVJfVU5VU0VEKSB7XG4mIzQzO1x0XHRcdGlmIChpY291bnRfcmVhZF9vbmNlKGlub2RlKSkge1xuJiM0MztcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdFx0XHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XG4mIzQzO1x0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAoKGl0LVx1MDAzZWZsYWdzIFx1MDAyNiBJTk9ERV9JVEVSX05PUk1BTCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4mIzQzO1x0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4mIzQzO1x0XHRyZXQgPSBpdC1cdTAwM2VmdW5jKGlub2RlLCBpdC1cdTAwM2VkYXRhKTtcbiYjNDM7XHRcdGlmIChyZXQpIHtcbiYjNDM7XHRcdFx0aXQtXHUwMDNlcmV0ID0gcmV0O1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKG5lZWRfcmVzY2hlZCgpKSB7XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4mIzQzO1x0XHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcyA/IGZhbHNlIDogdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpbm9kZV9pdGVyIGl0O1xuJiM0MztcbiYjNDM7XHRpbm9kZV9zYl9pdGVyX3N0YXJ0KHNiLCBcdTAwMjZpdCwgZmxhZ3MsIGZuLCBkYXRhKTtcbiYjNDM7XHR3aGlsZSAoaW5vZGVfc2JfaXRlcl9uZXh0KFx1MDAyNml0LCBzYikpXG4mIzQzO1x0XHQ7XG4mIzQzO1x0aW5vZGVfc2JfaXRlcl9lbmQoXHUwMDI2aXQsIHNiKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGl0LnJldDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MKHNiX2Zvcl9lYWNoX2lub2Rlcyk7XG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9zYl9saXN0X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIHtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuJiM0MztcdHN0cnVjdCBpbm9kZV9pdGVyICppdDtcbiBcbiBcdGlmICghbGlzdF9lbXB0eShcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpKSB7XG4gXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0LCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycywgaXRlcnNfbm9kZSkge1xuJiM0MztcdFx0XHRpZiAoaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpXG4mIzQzO1x0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGlub2RlLVx1MDAzZWlfc2JfbGlzdC5uZXh0O1xuJiM0MztcdFx0fVxuIFx0XHRsaXN0X2RlbF9pbml0KFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdCk7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdH1cbkBAIC04NjYsNiAmIzQzOzk1OSwxNyBAQCBzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZClcbiBcdH1cbiB9XG4gXG4mIzQzO3N0YXRpYyBpbnQgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRhdGE7XG4mIzQzO1xuJiM0MztcdGlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTtcbiYjNDM7XHRpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4mIzQzO1x0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9scnUsIGRpc3Bvc2UpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIGV2aWN0X2lub2Rlc1x0LSBldmljdCBhbGwgZXZpY3RhYmxlIGlub2RlcyBmb3IgYSBzdXBlcmJsb2NrXG4gICogQHNiOlx0XHRzdXBlcmJsb2NrIHRvIG9wZXJhdGUgb25cbkBAIC04NzcsNDQgJiM0Mzs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXG4gICovXG4gdm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0TElTVF9IRUFEKGRpc3Bvc2UpO1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMIHwgSU5PREVfSVRFUl9VTlVTRUQ7XG4gXG4tYWdhaW46XG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cbi1cdFx0aW5vZGVfc3RhdGVfc2V0KGlub2RlLCBJX0ZSRUVJTkcpO1xuLVx0XHRpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRsaXN0X2FkZChcdTAwMjZpbm9kZS1cdTAwM2VpX2xydSwgXHUwMDI2ZGlzcG9zZSk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIGNhbiBoYXZlIGEgdG9uIG9mIGlub2RlcyB0byBldmljdCBhdCB1bm1vdW50IHRpbWUgZ2l2ZW5cbi1cdFx0ICogZW5vdWdoIG1lbW9yeSwgY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZ28gdG8gc2xlZXAgZm9yIGFcbi1cdFx0ICogYml0IHNvIHdlIGRvbiYjMzk7dCBsaXZlbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0XHRkaXNwb3NlX2xpc3QoXHUwMDI2ZGlzcG9zZSk7XG4tXHRcdFx0Z290byBhZ2Fpbjtcbi1cdFx0fVxuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuJiM0MztcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiLCBcdTAwMjZkaXNwb3NlKTtcbiBcdGRpc3Bvc2VfbGlzdChcdTAwMjZkaXNwb3NlKTtcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwoZXZpY3RfaW5vZGVzKTtcbmRpZmYgLS1naXQgYS9mcy9xdW90YS9kcXVvdC5jIGIvZnMvcXVvdGEvZHF1b3QuY1xuaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDRcbi0tLSBhL2ZzL3F1b3RhL2RxdW90LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3F1b3RhL2RxdW90LmNcbkBAIC0xMDQzLDY0ICYjNDM7MTA0Myw0OCBAQCBzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogVGhpcyByb3V0aW5lIGlzIGd1YXJkZWQgYnkgc191bW91bnQgc2VtYXBob3JlICovXG4tc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuJiM0MztzdGF0aWMgaW50IGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuJiM0MztcdGludCB0eXBlID0gKihpbnQgKilkYXRhO1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbiBcdGludCByZXNlcnZlZCA9IDA7XG4gI2VuZGlmXG4tXHRpbnQgZXJyID0gMDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XG4tXHRcdCAgICAhYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuLVx0XHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRfX2lnZXQoaW5vZGUpO1xuJiM0MztcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuJiM0MztcdCAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRfX2lnZXQoaW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFxuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbi1cdFx0aWYgKHVubGlrZWx5KGlub2RlX2dldF9yc3Zfc3BhY2UoaW5vZGUpIFx1MDAzZSAwKSlcbi1cdFx0XHRyZXNlcnZlZCA9IDE7XG4mIzQzO1x0aWYgKHVubGlrZWx5KGlub2RlX2dldF9yc3Zfc3BhY2UoaW5vZGUpIFx1MDAzZSAwKSlcbiYjNDM7XHRcdHJlc2VydmVkID0gMTtcbiAjZW5kaWZcbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xuLVx0XHRpZiAoZXJyKSB7XG4tXHRcdFx0aXB1dChpbm9kZSk7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAmIzM5O2lub2RlJiMzOTsgc28gaXQgY291bGRuJiMzOTt0IGhhdmUgYmVlblxuLVx0XHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxuLVx0XHQgKiBzX2lub2RlX2xpc3RfbG9jay4gV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW4gYmVcbi1cdFx0ICogaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcbi1cdFx0ICogbGF0ZXIuXG4tXHRcdCAqL1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4tb3V0OlxuJiM0MztcdGVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7XG4gI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVR1xuLVx0aWYgKHJlc2VydmVkKSB7XG4tXHRcdHF1b3RhX2Vycm9yKHNiLCBcJiMzNDtXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgb24gXCYjMzQ7XG4tXHRcdFx0XCYjMzQ7dGh1cyBxdW90YSBpbmZvcm1hdGlvbiBpcyBwcm9iYWJseSBpbmNvbnNpc3RlbnQuIFwmIzM0O1xuLVx0XHRcdFwmIzM0O1BsZWFzZSBydW4gcXVvdGFjaGVjayg4KVwmIzM0Oyk7XG4tXHR9XG4mIzQzO1x0aWYgKHJlc2VydmVkKVxuJiM0MztcdFx0cXVvdGFfZXJyb3Ioc2IsIFwmIzM0O1dyaXRlcyBoYXBwZW5lZCBiZWZvcmUgcXVvdGEgd2FzIHR1cm5lZCBcJiMzNDtcbiYjNDM7XHRcdFx0ICAgIFwmIzM0O29uIHRodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICBcJiMzNDtpbmNvbnNpc3RlbnQuIFBsZWFzZSBydW4gcXVvdGFjaGVjayg4KVwmIzM0Oyk7XG4gI2VuZGlmXG4mIzQzO1x0aXB1dChpbm9kZSk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuJiM0MzsvKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBzX3Vtb3VudCBzZW1hcGhvcmUgKi9cbiYjNDM7c3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsXG4mIzQzO1x0XHRcdFx0ICBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2IsIFx1MDAyNnR5cGUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHJlbW92ZV9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuY1xuaW5kZXggMDVlNDQzMTczMDM4Ny4uM2UwNjkxNTBjNTQ0NSAxMDA2NDRcbi0tLSBhL2ZzL3N1cGVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3N1cGVyLmNcbkBAIC0zODIsNiAmIzQzOzM4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmFsbG9jX3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBpbnQgZmxhZ3MsXG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfcm9vdHNfbG9jayk7XG4gXHRtdXRleF9pbml0KFx1MDAyNnMtXHUwMDNlc19zeW5jX2xvY2spO1xuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlcyk7XG4mIzQzO1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlc19pdGVycyk7XG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdElOSVRfTElTVF9IRUFEKFx1MDAyNnMtXHUwMDNlc19pbm9kZXNfd2IpO1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2cy1cdTAwM2VzX2lub2RlX3dibGlzdF9sb2NrKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmhcbmluZGV4IGY5ZDFlMDVlOGFlNjguLmYzMTc2YWIxMGU2NWYgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZnMuaFxuQEAgLTI5Niw3ICYjNDM7Mjk2LDcgQEAgc3RydWN0IGlhdHRyIHtcbiAgKi9cbiAjZGVmaW5lIEZJTEVTWVNURU1fTUFYX1NUQUNLX0RFUFRIIDJcbiBcbi0vKiogXG4mIzQzOy8qKlxuICAqIGVudW0gcG9zaXRpdmVfYW9wX3JldHVybnMgLSBhb3AgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lmaWMgc2VtYW50aWNzXG4gICpcbiAgKiBAQU9QX1dSSVRFUEFHRV9BQ1RJVkFURTogSW5mb3JtcyB0aGUgY2FsbGVyIHRoYXQgcGFnZSB3cml0ZWJhY2sgaGFzXG5AQCAtMzA2LDcgJiM0MzszMDYsNyBAQCBzdHJ1Y3QgaWF0dHIge1xuICAqIFx0XHRcdCAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyXG4gICogXHRcdFx0ICAgIGZ1dHVyZS4gIE90aGVyIGNhbGxlcnMgbXVzdCBiZSBjYXJlZnVsIHRvIHVubG9ja1xuICAqIFx0XHRcdCAgICB0aGUgcGFnZSBpZiB0aGV5IGdldCB0aGlzIHJldHVybi4gIFJldHVybmVkIGJ5XG4tICogXHRcdFx0ICAgIHdyaXRlcGFnZSgpOyBcbiYjNDM7ICpcdFx0XHQgICAgd3JpdGVwYWdlKCk7XG4gICpcbiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXNcbiAgKiAgXHRcdFx0dW5sb2NrZWQgaXQgYW5kIHRoZSBwYWdlIG1pZ2h0IGhhdmUgYmVlbiB0cnVuY2F0ZWQuXG5AQCAtODcwLDYgJiM0Mzs4NzAsMjEgQEAgc3RydWN0IGlub2RlIHtcbiBcdHZvaWRcdFx0XHQqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovXG4gfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XG4gXG4mIzQzO2VudW0gaW5vZGVfaXRlcl9mbGFnc19lbnVtIHtcbiYjNDM7XHRJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSBcdTAwM2NcdTAwM2MgMSksICAvKiBFeGNsdWRlIGlub2RlcyB3aXRoIChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKS4gKi9cbiYjNDM7XHRJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSBcdTAwM2NcdTAwM2MgMiksICAvKiBPbmx5IHJldHVybiBpbm9kZXMgd2l0aCAoaV9jb3VudCA9PSAwKS4gKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAgICBlbmRcbiYjNDM7ICogIGlub2RlLVx1MDAzZWlfbG9jayAgICAgICAgICAgICAgbG9ja2VkICAgICAgICAgdW5sb2NrZWRcbiYjNDM7ICogIHNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrICAgICAgbG9ja2VkICAgICAgICAgbG9ja2VkXG4mIzQzOyAqL1xuJiM0Mzt0eXBlZGVmIGludCAoKmlub2RlX2l0ZXJfY2IpIChzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTtcbiYjNDM7XG4mIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpO1xuJiM0MztcbiAvKlxuICAqIGlfc3RhdGUgaGFuZGxpbmdcbiAgKlxuQEAgLTEzMTUsOCAmIzQzOzEzMzAsMTAgQEAgc3RydWN0IGZpbGUgKmdldF9maWxlX2FjdGl2ZShzdHJ1Y3QgZmlsZSAqKmYpO1xuIFxuICNkZWZpbmVcdE1BWF9OT05fTEZTXHQoKDFVTFx1MDAzY1x1MDAzYzMxKSAtIDEpXG4gXG4tLyogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMgXG4tICAgbGltaXRzLCBvdGhlcndpc2UgYmFkIHRoaW5ncyBjYW4gaGFwcGVuIGluIFZNLiAqLyBcbiYjNDM7LypcbiYjNDM7ICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXNcbiYjNDM7ICogbGltaXRzLCBvdGhlcndpc2UgYmFkIHRoaW5ncyBjYW4gaGFwcGVuIGluIFZNLlxuJiM0MzsgKi9cbiAjaWYgQklUU19QRVJfTE9ORz09MzJcbiAjZGVmaW5lIE1BWF9MRlNfRklMRVNJWkVcdCgobG9mZl90KVVMT05HX01BWCBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVClcbiAjZWxpZiBCSVRTX1BFUl9MT05HPT02NFxuQEAgLTIyODUsNyAmIzQzOzIzMDIsNyBAQCBpbnQgc3luY19pbm9kZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCk7XG4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUge1xuIFx0Y29uc3QgY2hhciAqbmFtZTtcbiBcdGludCBmc19mbGFncztcbi0jZGVmaW5lIEZTX1JFUVVJUkVTX0RFVlx0XHQxIFxuJiM0MzsjZGVmaW5lIEZTX1JFUVVJUkVTX0RFVlx0XHQxXG4gI2RlZmluZSBGU19CSU5BUllfTU9VTlREQVRBXHQyXG4gI2RlZmluZSBGU19IQVNfU1VCVFlQRVx0XHQ0XG4gI2RlZmluZSBGU19VU0VSTlNfTU9VTlRcdFx0OFx0LyogQ2FuIGJlIG1vdW50ZWQgYnkgdXNlcm5zIHJvb3QgKi9cbkBAIC0yOTA3LDcgJiM0MzsyOTI0LDcgQEAgc3NpemVfdCBfX2tlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpO1xuIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopO1xuIGV4dGVybiBzc2l6ZV90IF9fa2VybmVsX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBsb2ZmX3QgKik7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICogb3Blbl9leGVjKGNvbnN0IGNoYXIgKik7XG4tIFxuJiM0MztcbiAvKiBmcy9kY2FjaGUuYyAtLSBnZW5lcmljIGZzIHN1cHBvcnQgZnVuY3Rpb25zICovXG4gZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTtcbiBleHRlcm4gYm9vbCBwYXRoX2lzX3VuZGVyKGNvbnN0IHN0cnVjdCBwYXRoICosIGNvbnN0IHN0cnVjdCBwYXRoICopO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG5AQCAtMjY5LDkgJiM0MzsyNjksMTAgQEAgc3RydWN0IHN1cGVyX2Jsb2NrIHtcbiBcdCAqL1xuIFx0aW50IHNfc3RhY2tfZGVwdGg7XG4gXG4tXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyAqL1xuJiM0MztcdC8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqL1xuIFx0c3BpbmxvY2tfdFx0XHRcdFx0c19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcbiBcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2RlcztcdC8qIGFsbCBpbm9kZXMgKi9cbiYjNDM7XHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfaXRlcnM7IC8qIGFsbCBpdGVyYXRvcnMgKi9cbiBcbiBcdHNwaW5sb2NrX3RcdFx0XHRcdHNfaW5vZGVfd2JsaXN0X2xvY2s7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfd2I7XHQvKiB3cml0ZWJhY2sgaW5vZGVzICovXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbGFuZGxvY2svZnMuYyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbmluZGV4IDMwYWE2Y2UxMzU5MGEuLjNkY2RlOGNiZmI2YWYgMTAwNjQ0XG4tLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG5AQCAtMTM2OSwxMTAgJiM0MzsxMzY5LDgwIEBAIHN0YXRpYyB2b2lkIGhvb2tfaW5vZGVfZnJlZV9zZWN1cml0eV9yY3Uodm9pZCAqaW5vZGVfc2VjdXJpdHkpXG4gXG4gLyogU3VwZXItYmxvY2sgaG9va3MgKi9cbiBcbi0vKlxuLSAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LlxuLSAqXG4tICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXG4tICovXG4tc3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYilcbiYjNDM7c3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBsYW5kbG9ja19vYmplY3QgKm9iamVjdDtcbiYjNDM7XHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiBcbi1cdGlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpXG4tXHRcdHJldHVybjtcbiYjNDM7XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmlub2RlLVx1MDAzZWlfY291bnQpKSB7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRvYmplY3QgPSByY3VfZGVyZWZlcmVuY2UobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCk7XG4mIzQzO1x0aWYgKCFvYmplY3QpIHtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XHQvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi9cbiYjNDM7XHRfX2lnZXQoaW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gXG4tXHRcdC8qIE9ubHkgaGFuZGxlcyByZWZlcmVuY2VkIGlub2Rlcy4gKi9cbi1cdFx0aWYgKCFpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcbi1cdFx0XHRjb250aW51ZTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2VcbiYjNDM7XHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxuJiM0MztcdCAqIHdpbGwganVzdCB3YWl0IGZvciBpdCB0byBmaW5pc2guXG4mIzQzO1x0ICovXG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRpZiAob2JqZWN0LVx1MDAzZXVuZGVyb2JqID09IGlub2RlKSB7XG4mIzQzO1x0XHRvYmplY3QtXHUwMDNldW5kZXJvYmogPSBOVUxMO1xuJiM0MztcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXG4gXHRcdC8qXG4tXHRcdCAqIFByb3RlY3RzIGFnYWluc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgaW5vZGUgKGUuZy5cbi1cdFx0ICogZnJvbSBnZXRfaW5vZGVfb2JqZWN0KCkpLlxuJiM0MztcdFx0ICogQmVjYXVzZSBvYmplY3QtXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxuJiM0MztcdFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXG4mIzQzO1x0XHQgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXRcbiYjNDM7XHRcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3Qgd2hpbGUgaXQgaXMgbm90IE5VTEwuXG4mIzQzO1x0XHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVx1MDAzZWlfbG9jay5cbiBcdFx0ICovXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3QsIE5VTEwpO1xuIFx0XHQvKlxuLVx0XHQgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZVxuLVx0XHQgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaFxuLVx0XHQgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS1cdTAwM2VzZWN1cml0eSBvciBhXG4tXHRcdCAqIHNlY29uZCBjYWxsIHRvIGlwdXQoKSBmb3IgdGhlIHNhbWUgTGFuZGxvY2sgb2JqZWN0LiAgQWxzb1xuLVx0XHQgKiBjaGVja3MgSV9ORVcgYmVjYXVzZSBzdWNoIGlub2RlIGNhbm5vdCBiZSB0aWVkIHRvIGFuIG9iamVjdC5cbiYjNDM7XHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcbiYjNDM7XHRcdCAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlXG4mIzQzO1x0XHQgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3BcbiYjNDM7XHRcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXG4mIzQzO1x0XHQgKiBvbiB0aGUgaW5vZGUuXG4gXHRcdCAqL1xuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2XG4tXHRcdCAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4mIzQzO1x0XHRpcHV0X25vdF9sYXN0KGlub2RlKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0fVxuIFxuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4tXHRcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0KTtcbi1cdFx0aWYgKCFvYmplY3QpIHtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xuLVx0XHRfX2lnZXQoaW5vZGUpO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRpcHV0KGlub2RlKTtcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHJlbGVhc2VfaW5vZGUoKSBvbmdvaW5nLCB0aGVuIHdlXG4tXHRcdCAqIGFyZSBpbiBjaGFyZ2Ugb2YgY2FsbGluZyBpcHV0KCkgb24gdGhpcyBpbm9kZSwgb3RoZXJ3aXNlIHdlXG4tXHRcdCAqIHdpbGwganVzdCB3YWl0IGZvciBpdCB0byBmaW5pc2guXG4tXHRcdCAqL1xuLVx0XHRzcGluX2xvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRpZiAob2JqZWN0LVx1MDAzZXVuZGVyb2JqID09IGlub2RlKSB7XG4tXHRcdFx0b2JqZWN0LVx1MDAzZXVuZGVyb2JqID0gTlVMTDtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEJlY2F1c2Ugb2JqZWN0LVx1MDAzZXVuZGVyb2JqIHdhcyBub3QgTlVMTCxcbi1cdFx0XHQgKiByZWxlYXNlX2lub2RlKCkgYW5kIGdldF9pbm9kZV9vYmplY3QoKSBndWFyYW50ZWVcbi1cdFx0XHQgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXRcbi1cdFx0XHQgKiBsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLlxuLVx0XHRcdCAqIEl0IGlzIHRoZXJlZm9yZSBub3QgbmVjZXNzYXJ5IHRvIGxvY2sgaW5vZGUtXHUwMDNlaV9sb2NrLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0LCBOVUxMKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcbi1cdFx0XHQgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZVxuLVx0XHRcdCAqIF9faWdldCgpIHJlZmVyZW5jZSB0aGF0IHdlIGp1c3Qgc2V0IGluIHRoaXMgbG9vcFxuLVx0XHRcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXG4tXHRcdFx0ICogb24gdGhlIGlub2RlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlwdXRfbm90X2xhc3QoaW5vZGUpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbi1cdFx0fVxuJiM0MzsvKlxuJiM0MzsgKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cbiYjNDM7ICpcbiYjNDM7ICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUw7XG4gXG4tXHRcdGlmIChwcmV2X2lub2RlKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBvd24gdGhlIF9faWdldCgpIHJlZmVyZW5jZVxuLVx0XHRcdCAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2Vcbi1cdFx0XHQgKiBjYW4gZHJvcCB0aGUgbGlzdCBsb2NrIGFuZCBrbm93IHRoYXQgdGhlIGlub2RlIHdvbiYjMzk7dFxuLVx0XHRcdCAqIGRpc2FwcGVhciBmcm9tIHVuZGVyIHVzIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay5cbi1cdFx0XHQgKi9cbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlXG4tXHRcdFx0ICogcHJldmlvdXMgbG9vcCB3YWxrLCB3aGljaCBpcyBub3QgbmVlZGVkIGFueW1vcmUuXG4tXHRcdFx0ICovXG4tXHRcdFx0aXB1dChwcmV2X2lub2RlKTtcbi1cdFx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0XHR9XG4tXHRcdHByZXZfaW5vZGUgPSBpbm9kZTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcbiBcbi1cdC8qIFB1dHMgdGhlIGlub2RlIHJlZmVyZW5jZSBmcm9tIHRoZSBsYXN0IGxvb3Agd2FsaywgaWYgYW55LiAqL1xuLVx0aWYgKHByZXZfaW5vZGUpXG4tXHRcdGlwdXQocHJldl9pbm9kZSk7XG4gXHQvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqL1xuIFx0d2FpdF92YXJfZXZlbnQoXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXHUwMDNlaW5vZGVfcmVmcyxcbiBcdFx0ICAgICAgICFhdG9taWNfbG9uZ19yZWFkKFx1MDAyNmxhbmRsb2NrX3N1cGVyYmxvY2soc2IpLVx1MDAzZWlub2RlX3JlZnMpKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtRVU9UQSYjMzQ7LAogICAgJiMzNDtHRlMyX0ZTJiMzNDssCiAgICAmIzM0O1NFQ1VSSVRZX0xBTkRMT0NLJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c2JfZm9yX2VhY2hfaW5vZGVzJiMzNDssCiAgICAmIzM0O2V2aWN0X2lub2RlcyYjMzQ7LAogICAgJiMzNDtzeW5jX2JkZXZzJiMzNDssCiAgICAmIzM0O2Ryb3BfcGFnZWNhY2hlX3NiJiMzNDssCiAgICAmIzM0O2FkZF9kcXVvdF9yZWYmIzM0OywKICAgICYjMzQ7Z2ZzMl9ldmljdF9pbm9kZXMmIzM0OywKICAgICYjMzQ7aG9va19zYl9kZWxldGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBmcmFtZXdvcmsgKHNiX2Zvcl9lYWNoX2lub2Rlcykgd2l0aCBkeW5hbWljIGl0ZXJhdG9yIGxpc3QgdHJhY2tpbmcgKHNfaW5vZGVzX2l0ZXJzKSBhbmQgdXBkYXRlcyB0cmF2ZXJzYWwgbG9vcHMgaW4gVkZTIChldmljdF9pbm9kZXMsIGRyb3BfY2FjaGVzKSwgYmxvY2sgZGV2aWNlcyAoc3luY19iZGV2cyksIHF1b3RhcyAoYWRkX2RxdW90X3JlZiksIEdGUzIgKGdmczJfZXZpY3RfaW5vZGVzKSwgYW5kIExhbmRsb2NrIChob29rX3NiX2RlbGV0ZSkuIFRoaXMgc2lnbmlmaWNhbnRseSBhbHRlcnMgbG9ja2luZywgbGlzdCBtdXRhdGlvbiBkdXJpbmcgdHJhdmVyc2FsLCBhbmQgcmVmY291bnRpbmcgYWNyb3NzIGNvcmUgc3Vic3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIHJhY2VzLCBsaXN0IGNvcnJ1cHRpb25zLCBvciBkZWFkbG9ja3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiNDZlM2Q5NmM5YTE3MTA3MjBiODNiMzllOWZmYTEyNmY5ODgwZDY1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAxMToxMDo0MSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuYwppbmRleCBjZDgzMjMwODM3NDA2Li5hZTQ3MmEwNjJlNTFjIDEwMDY0NAotLS0gYS9ibG9jay9iZGV2LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmRldi5jCkBAIC0xMzM2LDU2ICYjNDM7MTMzNiw1MyBAQCB2b2lkIGJkZXZfbWFya19kZWFkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGJvb2wgc3VycHJpc2UpCiAgKi8KIEVYUE9SVF9TWU1CT0xfR1BMKGJkZXZfbWFya19kZWFkKTsKIAotdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdCkKJiM0MztzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrKCZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLSZndDtpX21hcHBpbmc7Ci0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CWJvb2wgd2FpdCA9IChib29sKWRhdGE7CiYjNDM7CXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtJmd0O2lfbWFwcGluZzsKIAotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fAotCQkgICAgbWFwcGluZy0mZ3Q7bnJwYWdlcyA9PSAwKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKG1hcHBpbmctJmd0O25ycGFnZXMgPT0gMCkgewogCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KJiM0MzsJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKJiM0MzsJICogc19pbm9kZV9saXN0X2xvY2suCiYjNDM7CSAqLwomIzQzOwlfX2lnZXQoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJYmRldiA9IElfQkRFVihpbm9kZSk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2JkZXYtJmd0O2JkX29wZW5lcnMpKSB7CiYjNDM7CQk7IC8qIHNraXAgKi8KJiM0MzsJfSBlbHNlIGlmICh3YWl0KSB7CiAJCS8qCi0JCSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KLQkJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKLQkJICogc19pbm9kZV9saXN0X2xvY2sgIFdlIGNhbm5vdCBpcHV0IHRoZSBpbm9kZSBub3cgYXMgd2UgY2FuCi0JCSAqIGJlIGhvbGRpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIGFuZCB3ZSBjYW5ub3QgaXB1dCBpdCB1bmRlcgotCQkgKiBzX2lub2RlX2xpc3RfbG9jay4gU28gd2Uga2VlcCB0aGUgcmVmZXJlbmNlIGFuZCBpcHV0IGl0Ci0JCSAqIGxhdGVyLgomIzQzOwkJICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzbwomIzQzOwkJICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmcKJiM0MzsJCSAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3IKJiM0MzsJCSAqIGRldGFpbHMuCiAJCSAqLwotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQliZGV2ID0gSV9CREVWKGlub2RlKTsKLQotCQltdXRleF9sb2NrKCZhbXA7YmRldi0mZ3Q7YmRfZGlzay0mZ3Q7b3Blbl9tdXRleCk7Ci0JCWlmICghYXRvbWljX3JlYWQoJmFtcDtiZGV2LSZndDtiZF9vcGVuZXJzKSkgewotCQkJOyAvKiBza2lwICovCi0JCX0gZWxzZSBpZiAod2FpdCkgewotCQkJLyoKLQkJCSAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc28KLQkJCSAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nCi0JCQkgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yCi0JCQkgKiBkZXRhaWxzLgotCQkJICovCi0JCQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfQotCQltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKLQotCQlzcGluX2xvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dChvbGRfaW5vZGUpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgc3luY19iZGV2cyhib29sIHdhaXQpCiYjNDM7ewomIzQzOwlzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsCiYjNDM7CQkJICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmMKaW5kZXggNDlmNTZhNTk4ZWNiYy4uMGQ0NzVhNWZmOGNmYiAxMDA2NDQKLS0tIGEvZnMvZHJvcF9jYWNoZXMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9kcm9wX2NhY2hlcy5jCkBAIC0xNiwzNiAmIzQzOzE2LDMwIEBACiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovCiBzdGF0aWMgaW50IHN5c2N0bF9kcm9wX2NhY2hlczsKIAotc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3N0YXRpYyBpbnQgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkvKgotCQkgKiBXZSBtdXN0IHNraXAgaW5vZGVzIGluIHVudXN1YWwgc3RhdGUuIFdlIG1heSBhbHNvIHNraXAKLQkJICogaW5vZGVzIHdpdGhvdXQgcGFnZXMgYnV0IHdlIGRlbGliZXJhdGVseSB3b24mIzM5O3QgaW4gY2FzZQotCQkgKiB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgdG8gYXZvaWQgc29mdGxvY2t1cHMuCi0JCSAqLwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHwKLQkJICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpICZhbXA7JmFtcDsgIW5lZWRfcmVzY2hlZCgpKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCV9faWdldChpbm9kZSk7CiYjNDM7CWlmIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpKSB7CiAJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQotCQlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtJmd0O2lfbWFwcGluZywgMCwgLTEpOwotCQlpcHV0KHRvcHV0X2lub2RlKTsKLQkJdG9wdXRfaW5vZGUgPSBpbm9kZTsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwogCX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CiYjNDM7CWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0mZ3Q7aV9tYXBwaW5nLCAwLCAtMSk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3sKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTk5Niw3ICYjNDM7OTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KQogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCWNhc2UgT3B0X2ppZDoKIAkJCXJldCA9IG1hdGNoX2ludCgmYW1wO3RtcFswXSwgJmFtcDtvcHRpb24pOwotCQkJaWYgKHJldCB8fCBvcHRpb24gJmx0OyAwKSAKJiM0MzsJCQlpZiAocmV0IHx8IG9wdGlvbiAmbHQ7IDApCiAJCQkJZ290byBob3N0ZGF0YV9lcnJvcjsKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpKQogCQkJCWxzLSZndDtsc19qaWQgPSBvcHRpb247CkBAIC0xNzE5LDYgJiM0MzsxNzE5LDE5IEBAIHN0YXRpYyBpbnQgZ2ZzMl9tZXRhX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50IGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtJmd0O2lfc2I7CiYjNDM7CiYjNDM7CV9faWdldChpbm9kZSk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZ2ZzMl9ldmljdF9pbm9kZXMgLSBldmljdCBpbm9kZXMgY29vcGVyYXRpdmVseQogICogQHNiOiB0aGUgc3VwZXJibG9jawpAQCAtMTc0MSwzMSAmIzQzOzE3NTQsMTAgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYykKICAqLwogc3RhdGljIHZvaWQgZ2ZzMl9ldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqdG9wdXRfaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItJmd0O3NfZnNfaW5mbzsKIAogCXNldF9iaXQoU0RGX0VWSUNUSU5HLCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgJmFtcDsmYW1wOwotCQkgICAgIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCi0JCWlwdXQodG9wdXRfaW5vZGUpOwotCQl0b3B1dF9pbm9kZSA9IGlub2RlOwotCi0JCWNvbmRfcmVzY2hlZCgpOwotCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CXNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbm9kZS5jCkBAIC02OSw2ICYjNDM7NjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0gewogfTsKIEVYUE9SVF9TWU1CT0woZW1wdHlfYW9wcyk7CiAKJiM0MztzdHJ1Y3QgaW5vZGVfaXRlciB7CiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJaXRlcnNfbm9kZTsJLyogc2ItJmd0O3NfaW5vZGVzX2l0ZXJzICovCiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJKm5leHQ7CQkvKiBuZXh0IG5vZGUgZ29pbmcgdG8gaXRlcmF0ZSAqLwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWlub2RlX2l0ZXJfY2IgZnVuYzsKJiM0MzsJdm9pZCAqZGF0YTsKJiM0MzsJaW50IHJldDsKJiM0Mzt9OwomIzQzOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfdW51c2VkKTsKIApAQCAtNjQxLDEyICYjNDM7NjUwLDk2IEBAIHZvaWQgaW5vZGVfc2JfbGlzdF9hZGQoc3RydWN0IGlub2RlICppbm9kZSkKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTsKIAomIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LAomIzQzOwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlpdC0mZ3Q7ZmxhZ3MgPSBmbGFnczsKJiM0MzsJaXQtJmd0O2Z1bmMgPSBmbjsKJiM0MzsJaXQtJmd0O2RhdGEgPSBkYXRhOwomIzQzOwlpdC0mZ3Q7cmV0ID0gMDsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaXQtJmd0O25leHQgPSBzYi0mZ3Q7c19pbm9kZXMubmV4dDsKJiM0MzsJbGlzdF9hZGQoJmFtcDtpdC0mZ3Q7aXRlcnNfbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX2VuZChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiYjNDM7ewomIzQzOwlsaXN0X2RlbCgmYW1wO2l0LSZndDtpdGVyc19ub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3sKJiM0MzsJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXdoaWxlICghaW5vZGUgJmFtcDsmYW1wOyBpdC0mZ3Q7bmV4dCAhPSAmYW1wO3NiLSZndDtzX2lub2RlcykgewomIzQzOwkJaW5vZGUgPSBsaXN0X2VudHJ5KGl0LSZndDtuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7CiYjNDM7CQlpZiAoaXQtJmd0O2ZsYWdzICZhbXA7IElOT0RFX0lURVJfVU5VU0VEKSB7CiYjNDM7CQkJaWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7CiYjNDM7CQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoKGl0LSZndDtmbGFncyAmYW1wOyBJTk9ERV9JVEVSX05PUk1BTCkgJmFtcDsmYW1wOwomIzQzOwkJICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7CiYjNDM7CQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpdC0mZ3Q7bmV4dCA9IGl0LSZndDtuZXh0LSZndDtuZXh0OwomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaXQtJmd0O25leHQgPSBpdC0mZ3Q7bmV4dC0mZ3Q7bmV4dDsKJiM0MzsJCXJldCA9IGl0LSZndDtmdW5jKGlub2RlLCBpdC0mZ3Q7ZGF0YSk7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJaXQtJmd0O3JldCA9IHJldDsKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKJiM0MzsJCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQkJY29uZF9yZXNjaGVkKCk7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gaXQtJmd0O25leHQgPT0gJmFtcDtzYi0mZ3Q7c19pbm9kZXMgPyBmYWxzZSA6IHRydWU7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciBpdDsKJiM0MzsKJiM0MzsJaW5vZGVfc2JfaXRlcl9zdGFydChzYiwgJmFtcDtpdCwgZmxhZ3MsIGZuLCBkYXRhKTsKJiM0MzsJd2hpbGUgKGlub2RlX3NiX2l0ZXJfbmV4dCgmYW1wO2l0LCBzYikpCiYjNDM7CQk7CiYjNDM7CWlub2RlX3NiX2l0ZXJfZW5kKCZhbXA7aXQsIHNiKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGl0LnJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpOwomIzQzOwogc3RhdGljIGlubGluZSB2b2lkIGlub2RlX3NiX2xpc3RfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciAqaXQ7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KSkgewogCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpdCwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMsIGl0ZXJzX25vZGUpIHsKJiM0MzsJCQlpZiAoaXQtJmd0O25leHQgPT0gJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KQomIzQzOwkJCQlpdC0mZ3Q7bmV4dCA9IGlub2RlLSZndDtpX3NiX2xpc3QubmV4dDsKJiM0MzsJCX0KIAkJbGlzdF9kZWxfaW5pdCgmYW1wO2lub2RlLSZndDtpX3NiX2xpc3QpOwogCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJfQpAQCAtODY2LDYgJiM0Mzs5NTksMTcgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAJfQogfQogCiYjNDM7c3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCAqZGlzcG9zZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGF0YTsKJiM0MzsKJiM0MzsJaW5vZGVfc3RhdGVfc2V0KGlub2RlLCBJX0ZSRUVJTkcpOwomIzQzOwlpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlsaXN0X2FkZCgmYW1wO2lub2RlLSZndDtpX2xydSwgZGlzcG9zZSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZXZpY3RfaW5vZGVzCS0gZXZpY3QgYWxsIGV2aWN0YWJsZSBpbm9kZXMgZm9yIGEgc3VwZXJibG9jawogICogQHNiOgkJc3VwZXJibG9jayB0byBvcGVyYXRlIG9uCkBAIC04NzcsNDQgJiM0Mzs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAgKi8KIHZvaWQgZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAlMSVNUX0hFQUQoZGlzcG9zZSk7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMIHwgSU5PREVfSVRFUl9VTlVTRUQ7CiAKLWFnYWluOgotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKLQotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGljb3VudF9yZWFkKGlub2RlKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTsKLQkJaW5vZGVfbHJ1X2xpc3RfZGVsKGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJbGlzdF9hZGQoJmFtcDtpbm9kZS0mZ3Q7aV9scnUsICZhbXA7ZGlzcG9zZSk7Ci0KLQkJLyoKLQkJICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlbgotCQkgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYQotCQkgKiBiaXQgc28gd2UgZG9uJiMzOTt0IGxpdmVsb2NrLgotCQkgKi8KLQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCWRpc3Bvc2VfbGlzdCgmYW1wO2Rpc3Bvc2UpOwotCQkJZ290byBhZ2FpbjsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0KJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsICZhbXA7ZGlzcG9zZSk7CiAJZGlzcG9zZV9saXN0KCZhbXA7ZGlzcG9zZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChldmljdF9pbm9kZXMpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvZHF1b3QuYyBiL2ZzL3F1b3RhL2RxdW90LmMKaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvZHF1b3QuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9xdW90YS9kcXVvdC5jCkBAIC0xMDQzLDY0ICYjNDM7MTA0Myw0OCBAQCBzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwotc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKm9sZF9pbm9kZSA9IE5VTEw7CiYjNDM7CWludCB0eXBlID0gKihpbnQgKilkYXRhOwomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVRwogCWludCByZXNlcnZlZCA9IDA7CiAjZW5kaWYKLQlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8Ci0JCSAgICAhYXRvbWljX3JlYWQoJmFtcDtpbm9kZS0mZ3Q7aV93cml0ZWNvdW50KSB8fAotCQkgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX3dyaXRlY291bnQpIHx8CiYjNDM7CSAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHsKIAkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHCi0JCWlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSAmZ3Q7IDApKQotCQkJcmVzZXJ2ZWQgPSAxOwomIzQzOwlpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgJmd0OyAwKSkKJiM0MzsJCXJlc2VydmVkID0gMTsKICNlbmRpZgotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCWVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7Ci0JCWlmIChlcnIpIHsKLQkJCWlwdXQoaW5vZGUpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICYjMzk7aW5vZGUmIzM5OyBzbyBpdCBjb3VsZG4mIzM5O3QgaGF2ZSBiZWVuCi0JCSAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlCi0JCSAqIHNfaW5vZGVfbGlzdF9sb2NrLiBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbiBiZQotCQkgKiBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXIKLQkJICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdAotCQkgKiBsYXRlci4KLQkJICovCi0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWlwdXQob2xkX2lub2RlKTsKLW91dDoKJiM0MzsJZXJyID0gX19kcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUcKLQlpZiAocmVzZXJ2ZWQpIHsKLQkJcXVvdGFfZXJyb3Ioc2IsICYjMzQ7V3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uICYjMzQ7Ci0JCQkmIzM0O3RodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiAmIzM0OwotCQkJJiMzNDtQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7Ci0JfQomIzQzOwlpZiAocmVzZXJ2ZWQpCiYjNDM7CQlxdW90YV9lcnJvcihzYiwgJiMzNDtXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgJiMzNDsKJiM0MzsJCQkgICAgJiMzNDtvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5ICYjMzQ7CiYjNDM7CQkJICAgICYjMzQ7aW5jb25zaXN0ZW50LiBQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7CiAjZW5kaWYKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIAomIzQzOy8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLAomIzQzOwkJCQkgIGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYiwgJmFtcDt0eXBlKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAwNWU0NDMxNzMwMzg3Li4zZTA2OTE1MGM1NDQ1IDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3N1cGVyLmMKQEAgLTM4Miw2ICYjNDM7MzgyLDcgQEAgc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsIGludCBmbGFncywKIAlzcGluX2xvY2tfaW5pdCgmYW1wO3MtJmd0O3Nfcm9vdHNfbG9jayk7CiAJbXV0ZXhfaW5pdCgmYW1wO3MtJmd0O3Nfc3luY19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmYW1wO3MtJmd0O3NfaW5vZGVzKTsKJiM0MzsJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc19pdGVycyk7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc193Yik7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX3dibGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBmOWQxZTA1ZThhZTY4Li5mMzE3NmFiMTBlNjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yOTYsNyAmIzQzOzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7CiAgKi8KICNkZWZpbmUgRklMRVNZU1RFTV9NQVhfU1RBQ0tfREVQVEggMgogCi0vKiogCiYjNDM7LyoqCiAgKiBlbnVtIHBvc2l0aXZlX2FvcF9yZXR1cm5zIC0gYW9wIHJldHVybiBjb2RlcyB3aXRoIHNwZWNpZmljIHNlbWFudGljcwogICoKICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXMKQEAgLTMwNiw3ICYjNDM7MzA2LDcgQEAgc3RydWN0IGlhdHRyIHsKICAqIAkJCSAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyCiAgKiAJCQkgICAgZnV0dXJlLiAgT3RoZXIgY2FsbGVycyBtdXN0IGJlIGNhcmVmdWwgdG8gdW5sb2NrCiAgKiAJCQkgICAgdGhlIHBhZ2UgaWYgdGhleSBnZXQgdGhpcyByZXR1cm4uICBSZXR1cm5lZCBieQotICogCQkJICAgIHdyaXRlcGFnZSgpOyAKJiM0MzsgKgkJCSAgICB3cml0ZXBhZ2UoKTsKICAqCiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXMKICAqICAJCQl1bmxvY2tlZCBpdCBhbmQgdGhlIHBhZ2UgbWlnaHQgaGF2ZSBiZWVuIHRydW5jYXRlZC4KQEAgLTg3MCw2ICYjNDM7ODcwLDIxIEBAIHN0cnVjdCBpbm9kZSB7CiAJdm9pZAkJCSppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi8KIH0gX19yYW5kb21pemVfbGF5b3V0OwogCiYjNDM7ZW51bSBpbm9kZV9pdGVyX2ZsYWdzX2VudW0gewomIzQzOwlJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSAmbHQ7Jmx0OyAxKSwgIC8qIEV4Y2x1ZGUgaW5vZGVzIHdpdGggKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpLiAqLwomIzQzOwlJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSAmbHQ7Jmx0OyAyKSwgIC8qIE9ubHkgcmV0dXJuIGlub2RlcyB3aXRoIChpX2NvdW50ID09IDApLiAqLwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kCiYjNDM7ICogIGlub2RlLSZndDtpX2xvY2sgICAgICAgICAgICAgIGxvY2tlZCAgICAgICAgIHVubG9ja2VkCiYjNDM7ICogIHNiLSZndDtzX2lub2RlX2xpc3RfbG9jayAgICAgIGxvY2tlZCAgICAgICAgIGxvY2tlZAomIzQzOyAqLwomIzQzO3R5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopOwomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpOwomIzQzOwogLyoKICAqIGlfc3RhdGUgaGFuZGxpbmcKICAqCkBAIC0xMzE1LDggJiM0MzsxMzMwLDEwIEBAIHN0cnVjdCBmaWxlICpnZXRfZmlsZV9hY3RpdmUoc3RydWN0IGZpbGUgKipmKTsKIAogI2RlZmluZQlNQVhfTk9OX0xGUwkoKDFVTCZsdDsmbHQ7MzEpIC0gMSkKIAotLyogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMgCi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIAomIzQzOy8qCiYjNDM7ICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMKJiM0MzsgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uCiYjNDM7ICovCiAjaWYgQklUU19QRVJfTE9ORz09MzIKICNkZWZpbmUgTUFYX0xGU19GSUxFU0laRQkoKGxvZmZfdClVTE9OR19NQVggJmx0OyZsdDsgUEFHRV9TSElGVCkKICNlbGlmIEJJVFNfUEVSX0xPTkc9PTY0CkBAIC0yMjg1LDcgJiM0MzsyMzAyLDcgQEAgaW50IHN5bmNfaW5vZGVfbWV0YWRhdGEoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhaXQpOwogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGZzX2ZsYWdzOwotI2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEgCiYjNDM7I2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEKICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQQkyCiAjZGVmaW5lIEZTX0hBU19TVUJUWVBFCQk0CiAjZGVmaW5lIEZTX1VTRVJOU19NT1VOVAkJOAkvKiBDYW4gYmUgbW91bnRlZCBieSB1c2VybnMgcm9vdCAqLwpAQCAtMjkwNyw3ICYjNDM7MjkyNCw3IEBAIHNzaXplX3QgX19rZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKTsKIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopOwogZXh0ZXJuIHNzaXplX3QgX19rZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqIG9wZW5fZXhlYyhjb25zdCBjaGFyICopOwotIAomIzQzOwogLyogZnMvZGNhY2hlLmMgLS0gZ2VuZXJpYyBmcyBzdXBwb3J0IGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBib29sIHBhdGhfaXNfdW5kZXIoY29uc3Qgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IHBhdGggKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmgKaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaApAQCAtMjY5LDkgJiM0MzsyNjksMTAgQEAgc3RydWN0IHN1cGVyX2Jsb2NrIHsKIAkgKi8KIAlpbnQgc19zdGFja19kZXB0aDsKIAotCS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzICovCiYjNDM7CS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqLwogCXNwaW5sb2NrX3QJCQkJc19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkJc19pbm9kZXM7CS8qIGFsbCBpbm9kZXMgKi8KJiM0MzsJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX2l0ZXJzOyAvKiBhbGwgaXRlcmF0b3JzICovCiAKIAlzcGlubG9ja190CQkJCXNfaW5vZGVfd2JsaXN0X2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX3diOwkvKiB3cml0ZWJhY2sgaW5vZGVzICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuYwppbmRleCAzMGFhNmNlMTM1OTBhLi4zZGNkZThjYmZiNmFmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jCiYjNDM7JiM0MzsmIzQzOyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmMKQEAgLTEzNjksMTEwICYjNDM7MTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KQogCiAvKiBTdXBlci1ibG9jayBob29rcyAqLwogCi0vKgotICogUmVsZWFzZSB0aGUgaW5vZGVzIHVzZWQgaW4gYSBzZWN1cml0eSBwb2xpY3kuCi0gKgotICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCi0gKi8KLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpCiYjNDM7c3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbGFuZGxvY2tfb2JqZWN0ICpvYmplY3Q7CiYjNDM7CXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0mZ3Q7aV9zYjsKIAotCWlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX2NvdW50KSkgewomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiAKLQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7c2ItJmd0O3NfaW5vZGVzLCBpX3NiX2xpc3QpIHsKLQkJc3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0OwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktJmd0O29iamVjdCk7CiYjNDM7CWlmICghb2JqZWN0KSB7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwkvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi8KJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAotCQkvKiBPbmx5IGhhbmRsZXMgcmVmZXJlbmNlZCBpbm9kZXMuICovCi0JCWlmICghaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKJiM0MzsJLyoKJiM0MzsJICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZQomIzQzOwkgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZQomIzQzOwkgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJc3Bpbl9sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKJiM0MzsJaWYgKG9iamVjdC0mZ3Q7dW5kZXJvYmogPT0gaW5vZGUpIHsKJiM0MzsJCW9iamVjdC0mZ3Q7dW5kZXJvYmogPSBOVUxMOwomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJLyoKLQkJICogUHJvdGVjdHMgYWdhaW5zdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiBpbm9kZSAoZS5nLgotCQkgKiBmcm9tIGdldF9pbm9kZV9vYmplY3QoKSkuCiYjNDM7CQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAomIzQzOwkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCiYjNDM7CQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKJiM0MzsJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgomIzQzOwkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgogCQkgKi8KLQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwogCQkvKgotCQkgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZQotCQkgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaAotCQkgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS0mZ3Q7c2VjdXJpdHkgb3IgYQotCQkgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc28KLQkJICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuCiYjNDM7CQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzCiYjNDM7CQkgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZQomIzQzOwkJICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wCiYjNDM7CQkgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlcwomIzQzOwkJICogb24gdGhlIGlub2RlLgogCQkgKi8KLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7Ci0JCSAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQomIzQzOwkJaXB1dF9ub3RfbGFzdChpbm9kZSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJfQogCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJb2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0KTsKLQkJaWYgKCFvYmplY3QpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqLwotCQlfX2lnZXQoaW5vZGUpOwotCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2UKLQkJICogYXJlIGluIGNoYXJnZSBvZiBjYWxsaW5nIGlwdXQoKSBvbiB0aGlzIGlub2RlLCBvdGhlcndpc2Ugd2UKLQkJICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KLQkJICovCi0JCXNwaW5fbG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7Ci0JCWlmIChvYmplY3QtJmd0O3VuZGVyb2JqID09IGlub2RlKSB7Ci0JCQlvYmplY3QtJmd0O3VuZGVyb2JqID0gTlVMTDsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkJCS8qCi0JCQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAotCQkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCi0JCQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKLQkJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgotCQkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgotCQkJICovCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwotCQkJLyoKLQkJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXMKLQkJCSAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlCi0JCQkgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3AKLQkJCSAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzCi0JCQkgKiBvbiB0aGUgaW5vZGUuCi0JCQkgKi8KLQkJCWlwdXRfbm90X2xhc3QoaW5vZGUpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCX0KJiM0MzsvKgomIzQzOyAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LgomIzQzOyAqCiYjNDM7ICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMOwogCi0JCWlmIChwcmV2X2lub2RlKSB7Ci0JCQkvKgotCQkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgb3duIHRoZSBfX2lnZXQoKSByZWZlcmVuY2UKLQkJCSAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2UKLQkJCSAqIGNhbiBkcm9wIHRoZSBsaXN0IGxvY2sgYW5kIGtub3cgdGhhdCB0aGUgaW5vZGUgd29uJiMzOTt0Ci0JCQkgKiBkaXNhcHBlYXIgZnJvbSB1bmRlciB1cyB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuCi0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJCS8qCi0JCQkgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlCi0JCQkgKiBwcmV2aW91cyBsb29wIHdhbGssIHdoaWNoIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KLQkJCSAqLwotCQkJaXB1dChwcmV2X2lub2RlKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJfQotCQlwcmV2X2lub2RlID0gaW5vZGU7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaWYgKCFsYW5kbG9ja19pbml0aWFsaXplZCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiAKLQkvKiBQdXRzIHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGUgbGFzdCBsb29wIHdhbGssIGlmIGFueS4gKi8KLQlpZiAocHJldl9pbm9kZSkKLQkJaXB1dChwcmV2X2lub2RlKTsKIAkvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqLwogCXdhaXRfdmFyX2V2ZW50KCZhbXA7bGFuZGxvY2tfc3VwZXJibG9jayhzYiktJmd0O2lub2RlX3JlZnMsCiAJCSAgICAgICAhYXRvbWljX2xvbmdfcmVhZCgmYW1wO2xhbmRsb2NrX3N1cGVyYmxvY2soc2IpLSZndDtpbm9kZV9yZWZzKSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExOTk3CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogNTIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggU2VyaWVzOiBXb3J0aEZ1enppbmcgPSBUcnVlKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBzZXJpZXMuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0JiMzOTtzIGludHJvZHVjaW5nIGEgbmV3LCBnZW5lcmljIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gb24gc3VwZXJibG9ja3MuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgZnVuY3Rpb24sIGFsb25nc2lkZSBpdHMgcmVsYXRlZCBpdGVyYXRvciBmdW5jdGlvbnMuIEl0IGxvb2tzIGxpa2UgYSBzdWJzdGFudGlhbCByZWZhY3RvcmluZywgdG91Y2hpbmcgYSB2YXJpZXR5IG9mIGNydWNpYWwgc3Vic3lzdGVtcy4KCkxldCBtZSBicmVhayBkb3duIHRoZSBjaGFuZ2VzIEkmIzM5O20gc2VlaW5nLiBUaGlzIHBhdGNoIHVwZGF0ZXMgYSBidW5jaCBvZiBjYWxsIHNpdGVzIGFjcm9zcyB0aGUgVkZTIGxheWVyLCB0aGUgYmxvY2sgbGF5ZXIsIEdGUzIsIFF1b3RhLCBhbmQgZXZlbiBMYW5kbG9jayEgU3BlY2lmaWNhbGx5LCBJJiMzOTttIHNlZWluZyBtb2RpZmljYXRpb25zIGluIGBibG9jay9iZGV2LmNgLCBgZnMvZHJvcF9jYWNoZXMuY2AsIGBmcy9nZnMyL29wc19mc3R5cGUuY2AsIGBmcy9pbm9kZS5jYCAodGhpcyBvbmUmIzM5O3MgKmtleSopLCBgZnMvcXVvdGEvZHF1b3QuY2AsIGBmcy9zdXBlci5jYCwgYWxvbmcgd2l0aCB1cGRhdGVzIHRvIGluY2x1ZGUgZmlsZXMgbGlrZSBgaW5jbHVkZS9saW51eC9mcy5oYCBhbmQgYGluY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaGAsIGFuZCBldmVuIGEgc2VjdXJpdHkgbW9kdWxlLCBgc2VjdXJpdHkvbGFuZGxvY2svZnMuY2AuCgpNeSBwcmltYXJ5IGNvbmNlcm4gd2l0aCB0aGlzIGtpbmQgb2YgY2hhbmdlIGlzIHdoZXRoZXIgaXQgaW50cm9kdWNlcyBhbnkgdnVsbmVyYWJpbGl0aWVzLiBXZSBrbm93IHRoYXQgYW55IG1vZGlmaWNhdGlvbiB0byBjb3JlIFZGUyBjYW4gbGVhZCB0byB2dWxuZXJhYmlsaXRpZXMsIGFuZCB0aGlzIGRlZmluaXRlbHkgdG91Y2hlcyBjb3JlIFZGUzogYGZzL2lub2RlLmNgLCBgZnMvc3VwZXIuY2AsIGBmcy9kcm9wX2NhY2hlcy5jYCwgYGJsb2NrL2JkZXYuY2AsIGBmcy9xdW90YS9kcXVvdC5jYCwgYHNlY3VyaXR5L2xhbmRsb2NrL2ZzLmNgLiBBbHNvLCBpdCYjMzk7cyBpbnRyb2R1Y2luZyBhIG5ldyBsaXN0IHRyYXZlcnNhbC9pdGVyYXRvciB0cmFja2luZyBsb2dpYyAod2l0aCBgc19pbm9kZXNfaXRlcnNgIGFuZCBpdHMgcmVsYXRlZCBmdW5jdGlvbnMpLiBUaGlzIGludm9sdmVzIGxvY2tpbmcgd2l0aCBgc19pbm9kZV9saXN0X2xvY2tgIGFuZCBgaW5vZGUtJmd0O2lfbG9ja2AsIGFzIHdlbGwgYXMgY2FsbGJhY2sgc2VtYW50aWNzIGFuZCByZWZjb3VudCBtYW5pcHVsYXRpb24gd2l0aCBgX19pZ2V0YCBhbmQgYGlwdXRgLiBBbGwgb2YgdGhlc2UgdGhpbmdzIGFyZSBwcmltZSBjYW5kaWRhdGVzIGZvciBmdXp6aW5nLCB3aGljaCBtZWFucyB0aGUgY29kZSBpcyAqY29yZSByZWFjaGFibGUgZXhlY3V0YWJsZSouIFRoaXMga2luZCBvZiByZWZhY3RvcmluZyBjb3VsZCByZXZlYWwgc3VidGxlIHJhY2UgY29uZGl0aW9ucywgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLCBvciBldmVuIGxvZ2ljIGVycm9ycyB0aGF0IHdvdWxkbiYjMzk7dCBub3JtYWxseSBhcHBlYXIuCgpUaGVyZWZvcmUsIG15IGNvbmNsdXNpb24gaXMgY2xlYXI6IGBXb3J0aEZ1enppbmcgPSB0cnVlYC4gSSBuZWVkIHRvIGRpZyBpbnRvIHRoaXMgdGhvcm91Z2hseS4gSSBzaG91bGQgcHJvYmFibHkgdXNlIGBncmVwcGVyYCAob3Igc2ltaWxhciB0b29scykgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb25zIGFuZCBpbnNwZWN0IHRoZSBzb3VyY2UgY29kZSBmdXJ0aGVyLiBUaGlzIHJlcXVpcmVzIGNhcmVmdWwgY29uc2lkZXJhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzYl9mb3JfZWFjaF9pbm9kZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YmxvY2svYmRldi5jPTEzODI9dm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbmJsb2NrL2JkZXYuYy0xMzgzLXtcbmJsb2NrL2JkZXYuYzoxMzg0Olx0c2JfZm9yX2VhY2hfaW5vZGVzKGJsb2NrZGV2X3N1cGVyYmxvY2ssIElOT0RFX0lURVJfTk9STUFMLFxuYmxvY2svYmRldi5jLTEzODUtXHRcdFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xuLS1cbmZzL2Ryb3BfY2FjaGVzLmM9NDA9c3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxuZnMvZHJvcF9jYWNoZXMuYy00MS17XG5mcy9kcm9wX2NhY2hlcy5jOjQyOlx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG5mcy9kcm9wX2NhY2hlcy5jLTQzLX1cbi0tXG5mcy9nZnMyL29wc19mc3R5cGUuYz0xNzU1PXN0YXRpYyB2b2lkIGdmczJfZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZ2ZzMi9vcHNfZnN0eXBlLmMtMTc1OS1cdHNldF9iaXQoU0RGX0VWSUNUSU5HLCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpO1xuZnMvZ2ZzMi9vcHNfZnN0eXBlLmM6MTc2MDpcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG5mcy9nZnMyL29wc19mc3R5cGUuYy0xNzYxLX1cbi0tXG5mcy9pbm9kZS5jPTY3MT1zdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuLS1cbmZzL2lub2RlLmMtNzE3LVxuZnMvaW5vZGUuYzo3MTg6aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG5mcy9pbm9kZS5jLTcxOS1cdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXG4tLVxuZnMvaW5vZGUuYy03MjktfVxuZnMvaW5vZGUuYzo3MzA6RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpO1xuZnMvaW5vZGUuYy03MzEtXG4tLVxuZnMvaW5vZGUuYz05ODI9dm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi0tXG5mcy9pbm9kZS5jLTk4Ni1cbmZzL2lub2RlLmM6OTg3Olx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsIFx1MDAyNmRpc3Bvc2UpO1xuZnMvaW5vZGUuYy05ODgtXHRkaXNwb3NlX2xpc3QoXHUwMDI2ZGlzcG9zZSk7XG4tLVxuZnMvcXVvdGEvZHF1b3QuYz0xMDgyPXN0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcbmZzL3F1b3RhL2RxdW90LmMtMTA4My17XG5mcy9xdW90YS9kcXVvdC5jOjEwODQ6XHRyZXR1cm4gc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCxcbmZzL3F1b3RhL2RxdW90LmMtMTA4NS1cdFx0XHRcdCAgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiLCBcdTAwMjZ0eXBlKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2ZzLmg9ODgzPXR5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopO1xuaW5jbHVkZS9saW51eC9mcy5oLTg4NC1cbmluY2x1ZGUvbGludXgvZnMuaDo4ODU6aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG5pbmNsdWRlL2xpbnV4L2ZzLmgtODg2LVx0XHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSk7XG4tLVxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYz0xNDM3PXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXG4tLVxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYy0xNDQzLVxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYzoxNDQ0Olx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG5zZWN1cml0eS9sYW5kbG9jay9mcy5jLTE0NDUtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5ODUKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgSW5vZGUgSXRlcmF0b3IqKgoKT2theSwgc28gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGUgaXRlcmF0b3IgZm9yIGlub2RlcyBpbiBgZnMvaW5vZGUuY2AgYWN0dWFsbHkgd29ya3MuIEkgd2FudCB0byBzcGVjaWZpY2FsbHkgdW5kZXJzdGFuZCBpdHMgaW1wbGVtZW50YXRpb24gYW5kLCBtb3JlIGltcG9ydGFudGx5LCBob3cgaXQmIzM5O3MgYmVpbmcgKnVzZWQqLiBJcyBpdCBhIGNsYXNzaWMgaXRlcmF0b3IgcGF0dGVybiwgb3IgaXMgdGhlcmUgc29tZSBjdXN0b20gc3BpbiBvbiBpdCB0byBvcHRpbWl6ZSBmb3IgZmlsZSBzeXN0ZW0gYWNjZXNzIHBhdHRlcm5zPyBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaW1wbGljYXRpb25zIOKAkyBkb2VzIHRoZSBpdGVyYXRpb24gaGFuZGxlIGxvY2tpbmcgY29ycmVjdGx5IGFjcm9zcyBtdWx0aXBsZSB0aHJlYWRzIG9yIHByb2Nlc3NlcyBhY2Nlc3NpbmcgdGhlIGlub2RlIHRhYmxlPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyB0aGF0IHNwcmluZyB0byBtaW5kIHdoZW4gc2VlaW5nIGhvdyBpdCYjMzk7cyBsYWlkIG91dD8gSSBuZWVkIHRvIGFuYWx5emUgaXRzIHVzYWdlIGNvbnRleHQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFjY2VzcyBpdCBpcyBiZWluZyB1c2VkIGZvciwgYW5kIHRoZSBpbXBhY3Qgb2YgdGhlIGl0ZXJhdG9ycyBwZXJmb3JtYW5jZSBpbiB0aGVzZSBzaXR1YXRpb25zLiBUaW1lIHRvIHN0YXJ0IGRpZ2dpbmcuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lub2RlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY0NTpcdFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gNjQ2Olx0XG4gNjQ3Olx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIDY0ODpcdFx0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9zYl9saXN0LCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlcyk7XG4gNjQ5Olx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gNjUwOlx0fVxuIDY1MTpcdEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTtcbiA2NTI6XHRcbiA2NTM6XHRzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX3N0YXJ0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZV9pdGVyICppdCxcbiA2NTQ6XHRcdFx0XHRcdHVuc2lnbmVkIGludCBmbGFncywgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbiA2NTU6XHR7XG4gNjU2Olx0XHRpdC1cdTAwM2VmbGFncyA9IGZsYWdzO1xuIDY1NzpcdFx0aXQtXHUwMDNlZnVuYyA9IGZuO1xuIDY1ODpcdFx0aXQtXHUwMDNlZGF0YSA9IGRhdGE7XG4gNjU5Olx0XHRpdC1cdTAwM2VyZXQgPSAwO1xuIDY2MDpcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiA2NjE6XHRcdGl0LVx1MDAzZW5leHQgPSBzYi1cdTAwM2VzX2lub2Rlcy5uZXh0O1xuIDY2MjpcdFx0bGlzdF9hZGQoXHUwMDI2aXQtXHUwMDNlaXRlcnNfbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXNfaXRlcnMpO1xuIDY2MzpcdH1cbiA2NjQ6XHRcbiA2NjU6XHRzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX2VuZChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gNjY2Olx0e1xuIDY2NzpcdFx0bGlzdF9kZWwoXHUwMDI2aXQtXHUwMDNlaXRlcnNfbm9kZSk7XG4gNjY4Olx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gNjY5Olx0fVxuIDY3MDpcdFxuIDY3MTpcdHN0YXRpYyBib29sIGlub2RlX3NiX2l0ZXJfbmV4dChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gNjcyOlx0e1xuIDY3MzpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XG4gNjc0Olx0XHRpbnQgcmV0O1xuIDY3NTpcdFxuIDY3NjpcdFx0d2hpbGUgKCFpbm9kZSBcdTAwMjZcdTAwMjYgaXQtXHUwMDNlbmV4dCAhPSBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlcykge1xuIDY3NzpcdFx0XHRpbm9kZSA9IGxpc3RfZW50cnkoaXQtXHUwMDNlbmV4dCwgc3RydWN0IGlub2RlLCBpX3NiX2xpc3QpO1xuIDY3ODpcdFx0XHRpZiAoaXQtXHUwMDNlZmxhZ3MgXHUwMDI2IElOT0RFX0lURVJfVU5VU0VEKSB7XG4gNjc5Olx0XHRcdFx0aWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7XG4gNjgwOlx0XHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuIDY4MTpcdFx0XHRcdFx0Y29udGludWU7XG4gNjgyOlx0XHRcdFx0fVxuIDY4MzpcdFxuIDY4NDpcdFx0XHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIDY4NTpcdFx0XHRcdGlmIChpY291bnRfcmVhZChpbm9kZSkpIHtcbiA2ODY6XHRcdFx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gNjg3Olx0XHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuIDY4ODpcdFx0XHRcdFx0Y29udGludWU7XG4gNjg5Olx0XHRcdFx0fVxuIDY5MDpcdFx0XHR9IGVsc2Uge1xuIDY5MTpcdFx0XHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIDY5MjpcdFx0XHR9XG4gNjkzOlx0XG4gNjk0Olx0XHRcdGlmICgoaXQtXHUwMDNlZmxhZ3MgXHUwMDI2IElOT0RFX0lURVJfTk9STUFMKSBcdTAwMjZcdTAwMjZcbiA2OTU6XHRcdFx0ICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpKSkge1xuIDY5NjpcdFx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gNjk3Olx0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbiA2OTg6XHRcdFx0XHRjb250aW51ZTtcbiA2OTk6XHRcdFx0fVxuIDcwMDpcdFxuIDcwMTpcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuIDcwMjpcdFx0XHRyZXQgPSBpdC1cdTAwM2VmdW5jKGlub2RlLCBpdC1cdTAwM2VkYXRhKTtcbiA3MDM6XHRcdFx0aWYgKHJldCkge1xuIDcwNDpcdFx0XHRcdGl0LVx1MDAzZXJldCA9IHJldDtcbiA3MDU6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNzA2Olx0XHRcdH1cbiA3MDc6XHRcbiA3MDg6XHRcdFx0aWYgKG5lZWRfcmVzY2hlZCgpKSB7XG4gNzA5Olx0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIDcxMDpcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuIDcxMTpcdFx0XHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gNzEyOlx0XHRcdH1cbiA3MTM6XHRcdH1cbiA3MTQ6XHRcbiA3MTU6XHRcdHJldHVybiBpdC1cdTAwM2VuZXh0ID09IFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzID8gZmFsc2UgOiB0cnVlO1xuIDcxNjpcdH1cbiA3MTc6XHRcbiA3MTg6XHRpbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcbiA3MTk6XHRcdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXG4gNzIwOlx0e1xuIDcyMTpcdFx0c3RydWN0IGlub2RlX2l0ZXIgaXQ7XG4gNzIyOlx0XG4gNzIzOlx0XHRpbm9kZV9zYl9pdGVyX3N0YXJ0KHNiLCBcdTAwMjZpdCwgZmxhZ3MsIGZuLCBkYXRhKTtcbiA3MjQ6XHRcdHdoaWxlIChpbm9kZV9zYl9pdGVyX25leHQoXHUwMDI2aXQsIHNiKSlcbiA3MjU6XHRcdFx0O1xuIDcyNjpcdFx0aW5vZGVfc2JfaXRlcl9lbmQoXHUwMDI2aXQsIHNiKTtcbiA3Mjc6XHRcbiA3Mjg6XHRcdHJldHVybiBpdC5yZXQ7XG4gNzI5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1NDgwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNTQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpdmluZyBpbnRvIHRoaXMgbmV3IGl0ZXJhdG9yJiMzOTtzIGludHJpY2FjaWVzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBjbG9zZWx5IGF0IGBzYl9mb3JfZWFjaF9pbm9kZXNgLiBSaWdodCBhd2F5LCB0aGUgYGlub2RlX3NiX2l0ZXJfbmV4dCgpYCBmdW5jdGlvbiBncmFicyBhbiBgaW5vZGVgIGZyb20gYSBsaXN0IHVzaW5nIGBsaXN0X2VudHJ5YC4gIEl0IGNoZWNrcyBmbGFncywgcG90ZW50aWFsbHkgYWNxdWlyZXMgYGlub2RlLSZndDtpX2xvY2tgIChkZXBlbmRpbmcgb24gdGhlIGNvZGUgcGF0aCksIGFuZCB0aGVuIGNhbGxzIGBpdC0mZ3Q7ZnVuY2Agd2l0aCB0aGUgYGlub2RlYCBhbmQgYGl0LSZndDtkYXRhYC4gIFN0YW5kYXJkIHN0dWZmLCBidXQgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIGxvY2tpbmcgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4KCk5vdywgYGlub2RlX3NiX2xpc3RfZGVsYCBpbiBgZnMvaW5vZGUuY2AuIEkgc2VlIGl0IHJlbW92aW5nIGFuIGlub2RlIGZyb20gdGhlIHN1cGVyYmxvY2smIzM5O3MgaW5vZGUgbGlzdC4gQW5kIGhlcmUmIzM5O3MgdGhlIGtpY2tlcjogaXQgaXRlcmF0ZXMgKnRocm91Z2gqIHRoZSBgc19pbm9kZXNfaXRlcnNgIGxpc3Qgb24gdGhlIHN1cGVyYmxvY2suICBJZiBpdCBmaW5kcyBhbiBpdGVyYXRvciBwb2ludGluZyBhdCB0aGUgaW5vZGUgYmVpbmcgZGVsZXRlZCwgaXQgdXBkYXRlcyBgaXQtJmd0O25leHRgISBUaGlzIGlzIGNyaXRpY2FsLiBEdXJpbmcgdGhvc2UgaXRlcmF0aW9uIGNhbGxiYWNrcywgdGhlIGNvZGUgZHJvcHMgYGlub2RlLSZndDtpX2xvY2tgIGFuZCBgc2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrYCwgZG9lcyBzb21lIHdvcmsgKHRoaW5ncyBsaWtlIGBfX2lnZXRgLCBgaXB1dGAsIGV2ZW4gYGludmFsaWRhdGVfbWFwcGluZ19wYWdlc2AsIGFuZCBmaWxlIG9wZXJhdGlvbnMpLCBhbmQgdGhlbiByZWFjcXVpcmVzIGBzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2tgIGJlZm9yZSByZXR1cm5pbmcuCgpUaGUgaW1wbGljYXRpb25zIGFyZSBodWdlLiAgQW4gaW5vZGUgY2FuIGJlIGRlbGV0ZWQgKndoaWxlKiB0aGUgbG9jayBpcyBkcm9wcGVkLiBXaGVuIHRoYXQgaGFwcGVucywgYGlub2RlX3NiX2xpc3RfZGVsYCAqdXBkYXRlcyB0aGUgaXRlcmF0b3ImIzM5O3MgbmV4dCBwb2ludGVyKiwgc28gdGhhdCBpdCBpc24mIzM5O3Qgb3JwaGFuZWQuIEl0JiMzOTtzIGNsZXZlcmx5IGhhbmRsaW5nIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIFRoaXMgaXRlcmF0b3IgbWVjaGFuaXNtIGlzIGJyYW5kIG5ldyBhbmQgdG91Y2hlcyBzdXBlcmJsb2NrIGlub2RlIGxpc3QgbG9ja2luZywgcmVmY291bnRpbmcsIGFuZCB0cmF2ZXJzYWwgYWNyb3NzIFZGUywgcXVvdGEsIExhbmRsb2NrLCBHRlMyLCBhbmQgZXZlbiBibG9jayBkZXZpY2VzIQoKU28sIHdoaWNoIGNvbmZpZ3VyYXRpb25zIGFyZSBsaWtlbHkgdG8gYmUgcmVsZXZhbnQ/ICBgZnMvaW5vZGUuY2AsIGBmcy9zdXBlci5jYCwgYGJsb2NrL2JkZXYuY2AsIGFuZCBgZnMvZHJvcF9jYWNoZXMuY2AgYXJlIGFsd2F5cyB0aGVyZS4gQnV0IHdoYXQgYWJvdXQgdGhlIG1vZHVsZXM/ICBgZnMvcXVvdGEvZHF1b3QuY2AgZGVwZW5kcyBvbiBgQ09ORklHX1FVT1RBYCwgYGZzL2dmczJgIGRlcGVuZHMgb24gYENPTkZJR19HRlMyX0ZTYCwgYW5kIGBzZWN1cml0eS9sYW5kbG9ja2AgZGVwZW5kcyBvbiBgQ09ORklHX1NFQ1VSSVRZX0xBTkRMT0NLYC4KCkkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBmb3IgUXVvdGEsIExhbmRsb2NrLCBhbmQgR0ZTMiBqdXN0IHRvIGNvbmZpcm0gdGhlc2UgZGVwZW5kZW5jaWVzIGFuZCBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzLiBUaGlzIHJlcXVpcmVzIG1vcmUgdGhvcm91Z2ggYW5hbHlzaXMsIGJ1dCB0aGlzIGl0ZXJhdG9yIHNlZW1zIG5vdmVsIGFuZCBoaWdobHkgcmVsZXZhbnQgdG8gY29uY3VycmVudCBmaWxlc3lzdGVtIHN0cnVjdHVyZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIChRVU9UQXxTRUNVUklUWV9MQU5ETE9DS3xHRlMyX0ZTKVxcYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9nZnMyL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmZzL2dmczIvS2NvbmZpZzoyOmNvbmZpZyBHRlMyX0ZTXG5mcy9nZnMyL0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O0dGUzIgZmlsZSBzeXN0ZW0gc3VwcG9ydFwmIzM0O1xuLS1cbmZzL3F1b3RhL0tjb25maWctNS1cbmZzL3F1b3RhL0tjb25maWc6Njpjb25maWcgUVVPVEFcbmZzL3F1b3RhL0tjb25maWctNy1cdGJvb2wgXCYjMzQ7UXVvdGEgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NzExCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqS2VybmVsIFNlY3VyaXR5IEV4cGxvcmF0aW9uKioKCkFscmlnaHQsIGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAgaW50byB0aGlzIHByb2JsZW0sIEkgbmVlZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzLiBTZWN1cml0eSBpcyBhbHdheXMgcGFyYW1vdW50LCBhbmQgbGFuZGxvY2sgaXMgYSBsaWtlbHkgYXJlYSB0byBzY3J1dGluaXplLiBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgaWYgdGhlIGlzc3VlIGludGVyc2VjdHMgd2l0aCBsYW5kbG9jayYjMzk7cyBjYXBhYmlsaXRpZXMuIFNwZWNpZmljYWxseSwgZG9lcyBzb21ldGhpbmcgY2hhbmdlIGF0IHRoZSBsYW5kbG9jayBsZXZlbCB0aGF0IG1pZ2h0IGNvbnRyaWJ1dGU/IEl0JiMzOTtzIGVhc3kgdG8gZ2V0IHR1bm5lbCB2aXNpb24gd2hlbiBkZWJ1Z2dpbmcuCgpUaGVuLCBvZiBjb3Vyc2UsIEkgc2hvdWxkIGxvb2sgYXQgdGhlIEtjb25maWcgb3B0aW9ucyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEFyZSB0aGVyZSBhbnkgcmVsZXZhbnQgc2VjdXJpdHkgZmVhdHVyZXMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgZW5hYmxlZCBpbiBhIHdheSB0aGF0IGNvdWxkIGFmZmVjdCB0aGlzIHNpdHVhdGlvbj8gTWF5YmUgSSBjYW4gY2hhbmdlIHRoZW0gdG8gdmVyaWZ5IHRoZSBiZWhhdmlvdXIuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7bSBub3Qgd29ya2luZyB3aXRoIGFuIHVudXN1YWwsIG9yIG5vbi1kZWZhdWx0LCBidWlsZCBiZWZvcmUgSSBzdGFydCBjaGFzaW5nIGdob3N0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFNFQ1VSSVRZX0xBTkRMT0NLJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7c2VjdXJpdHkvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3NlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMi1cbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWc6Mzpjb25maWcgU0VDVVJJVFlfTEFORExPQ0tcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctNC1cdGJvb2wgXCYjMzQ7TGFuZGxvY2sgc3VwcG9ydFwmIzM0O1xuLS1cbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMjMtXG5zZWN1cml0eS9sYW5kbG9jay9LY29uZmlnOjI0OmNvbmZpZyBTRUNVUklUWV9MQU5ETE9DS19MT0dcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMjUtXHRib29sXG4tLVxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZy0yOC1cbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWc6Mjk6Y29uZmlnIFNFQ1VSSVRZX0xBTkRMT0NLX0tVTklUX1RFU1RcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMzAtXHRib29sIFwmIzM0O0tVbml0IHRlc3RzIGZvciBMYW5kbG9ja1wmIzM0OyBpZiAhS1VOSVRfQUxMX1RFU1RTXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjExPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3MTEwCgkJCQkJCQlvdXRwdXQ6IDIzMQoJCQkJCQkJdGhvdWdodHM6IDg5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFN0cmF0ZWd5IGZvciBLZXJuZWwgUGF0Y2ggQW5hbHlzaXMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBpZGVudGlmeSBhbmQganVzdGlmeSBmdXp6aW5nIHRoaXMgcGF0Y2guIEZpcnN0LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGtlcm5lbCBmdW5jdGlvbnMgaW50cm9kdWNlZCBvciBzaWduaWZpY2FudGx5IGFsdGVyZWQuIExvb2tzIGxpa2UgdGhlIHBhdGNoIHRvdWNoZXMgc2V2ZXJhbCBhcmVhczogYmxvY2sgZGV2aWNlcyAoYGJkZXYuY2ApLCBwYWdlIGNhY2hlIChgZHJvcF9jYWNoZXMuY2ApLCBHRlMyIGZpbGVzeXN0ZW1zIChgZ2ZzMi9vcHNfZnN0eXBlLmNgKSwgZ2VuZXJhbCBpbm9kZXMgKGBpbm9kZS5jYCksIHF1b3RhcyAoYHF1b3RhL2RxdW90LmNgKSwgYW5kIExhbmRsb2NrIHNlY3VyaXR5IChgc2VjdXJpdHkvbGFuZGxvY2svZnMuY2ApLgoKSSYjMzk7dmUgZXh0cmFjdGVkIHRoZSBrZXkgZnVuY3Rpb25zIGZyb20gdGhlIHBhdGNoIHRoYXQgc2VlbSByZWxldmFudC4gSSYjMzk7dmUgc3BlY2lmaWNhbGx5IHRhcmdldGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiB1YmlxdWl0b3VzLCBsb3ctbGV2ZWwga2VybmVsIHJvdXRpbmVzLiBJJiMzOTttIGxvb2tpbmcgZm9yIGVudHJ5IHBvaW50cyBvciBpdGVyYXRvcnMgdGhhdCBkaXJlY3RseSBleGVyY2lzZSB0aGUgY2hhbmdlZCBjb2RlLiBCYXNlZCBvbiBteSBhbmFseXNpcywgdGhlc2UgZnVuY3Rpb25zIHN0YW5kIG91dDogYHNiX2Zvcl9lYWNoX2lub2Rlc2AsIGBldmljdF9pbm9kZXNgLCBgZHJvcF9wYWdlY2FjaGVfc2JgLCBgc3luY19iZGV2c2AsIGBhZGRfZHF1b3RfcmVmYCwgYGdmczJfZXZpY3RfaW5vZGVzYCwgYW5kIGBob29rX3NiX2RlbGV0ZWAuCgpOb3csIHRoZXNlIGFyZW4mIzM5O3QgeW91ciB0eXBpY2FsIGxpZmVjeWNsZSBob3QtcGF0aHM7IHRoZXkmIzM5O3JlIHZlcnkgc3BlY2lmaWMgVkZTLCBmaWxlc3lzdGVtLCBvciBzZWN1cml0eSBlbnRyeSBwb2ludHMgYW5kIGl0ZXJhdG9ycy4gU28sIEkga25vdyB0aGV5JiMzOTtyZSBub3QgZ29pbmcgdG8gYmUgbWFzc2l2ZWx5IGNhbGxlZCBldmVyeXdoZXJlLCBidXQgdGhleSBsaWtlbHkgYXJlIGVudHJ5IHBvaW50cyB0aGF0IHdpbGwgZXhlcmNpc2UgdGhpcyBjb2RlLgoKSSYjMzk7dmUgYWxzbyBpZGVudGlmaWVkIHRoZSByZWxldmFudCBrZXJuZWwgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgYWZmZWN0ZWQ6IGBRVU9UQWAsIGBHRlMyX0ZTYCwgYW5kIGBTRUNVUklUWV9MQU5ETE9DS2AuCgpOb3csIHRvIHNvbGlkaWZ5IHRoaXMsIEkgbmVlZCB0byBhcnRpY3VsYXRlIHdoeSB0aGlzIHdhcnJhbnRzIGZ1enppbmcuIFRoaXMgcGF0Y2ggaXMgcmVmYWN0b3Jpbmcgc3VwZXJibG9jayBpbm9kZSBsaXN0IGl0ZXJhdGlvbiBhY3Jvc3MgbXVsdGlwbGUgYXJlYXMsIGludHJvZHVjaW5nIGBzYl9mb3JfZWFjaF9pbm9kZXNgIGFuZCBhbiBhY3RpdmUgaXRlcmF0b3IgbWVjaGFuaXNtIChgc19pbm9kZXNfaXRlcnNgKS4gVGhpcyBjaGFuZ2UgaW1wbGllcyBhbHRlcmF0aW9ucyB0byBsb2NraW5nLCBsaXN0IHRyYXZlcnNhbCwgYW5kIGNvbmN1cnJlbnQgaW5vZGUgZGVsZXRpb24vZXZpY3Rpb24gc2VtYW50aWNzLiBUaGF0JiMzOTtzIGEgaHVnZSByZWQgZmxhZzogcmFjZSBjb25kaXRpb25zLCBsaXN0IGNvcnJ1cHRpb24sIGFuZCBsb2NraW5nIGlzc3VlcyBhcmUgYWxsIGxpa2VseSBoZXJlLgoKR2l2ZW4gYWxsIHRoaXMsIEkmIzM5O20gY29uZmlkZW50IGluIHNheWluZyB0aGF0IHRoaXMgcGF0Y2ggaXMgd29ydGggZnV6emluZy4gSSYjMzk7dmUgZ2F0aGVyZWQgYSBjbGVhciByZWFzb25pbmcsIGlkZW50aWZpZWQgdGhlIGZ1bmN0aW9ucywgYW5kIGxpc3RlZCByZWxldmFudCBjb25maWd1cmF0aW9ucy4gSSBjYW4gbm93IGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuIEkgYW0gcmVhZHkgdG8gbW92ZSBvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1FVT1RBJiMzNDssCiAgICAmIzM0O0dGUzJfRlMmIzM0OywKICAgICYjMzQ7U0VDVVJJVFlfTEFORExPQ0smIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzYl9mb3JfZWFjaF9pbm9kZXMmIzM0OywKICAgICYjMzQ7ZXZpY3RfaW5vZGVzJiMzNDssCiAgICAmIzM0O3N5bmNfYmRldnMmIzM0OywKICAgICYjMzQ7ZHJvcF9wYWdlY2FjaGVfc2ImIzM0OywKICAgICYjMzQ7YWRkX2RxdW90X3JlZiYjMzQ7LAogICAgJiMzNDtnZnMyX2V2aWN0X2lub2RlcyYjMzQ7LAogICAgJiMzNDtob29rX3NiX2RlbGV0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIGZyYW1ld29yayAoc2JfZm9yX2VhY2hfaW5vZGVzKSB3aXRoIGR5bmFtaWMgaXRlcmF0b3IgbGlzdCB0cmFja2luZyAoc19pbm9kZXNfaXRlcnMpIGFuZCB1cGRhdGVzIHRyYXZlcnNhbCBsb29wcyBpbiBWRlMgKGV2aWN0X2lub2RlcywgZHJvcF9jYWNoZXMpLCBibG9jayBkZXZpY2VzIChzeW5jX2JkZXZzKSwgcXVvdGFzIChhZGRfZHF1b3RfcmVmKSwgR0ZTMiAoZ2ZzMl9ldmljdF9pbm9kZXMpLCBhbmQgTGFuZGxvY2sgKGhvb2tfc2JfZGVsZXRlKS4gVGhpcyBzaWduaWZpY2FudGx5IGFsdGVycyBsb2NraW5nLCBsaXN0IG11dGF0aW9uIGR1cmluZyB0cmF2ZXJzYWwsIGFuZCByZWZjb3VudGluZyBhY3Jvc3MgY29yZSBzdWJzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgcmFjZXMsIGxpc3QgY29ycnVwdGlvbnMsIG9yIGRlYWRsb2Nrcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7UVVPVEEmIzM0OywKICAgICYjMzQ7R0ZTMl9GUyYjMzQ7LAogICAgJiMzNDtTRUNVUklUWV9MQU5ETE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NiX2Zvcl9lYWNoX2lub2RlcyYjMzQ7LAogICAgJiMzNDtldmljdF9pbm9kZXMmIzM0OywKICAgICYjMzQ7c3luY19iZGV2cyYjMzQ7LAogICAgJiMzNDtkcm9wX3BhZ2VjYWNoZV9zYiYjMzQ7LAogICAgJiMzNDthZGRfZHF1b3RfcmVmJiMzNDssCiAgICAmIzM0O2dmczJfZXZpY3RfaW5vZGVzJiMzNDssCiAgICAmIzM0O2hvb2tfc2JfZGVsZXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gZnJhbWV3b3JrIChzYl9mb3JfZWFjaF9pbm9kZXMpIHdpdGggZHluYW1pYyBpdGVyYXRvciBsaXN0IHRyYWNraW5nIChzX2lub2Rlc19pdGVycykgYW5kIHVwZGF0ZXMgdHJhdmVyc2FsIGxvb3BzIGluIFZGUyAoZXZpY3RfaW5vZGVzLCBkcm9wX2NhY2hlcyksIGJsb2NrIGRldmljZXMgKHN5bmNfYmRldnMpLCBxdW90YXMgKGFkZF9kcXVvdF9yZWYpLCBHRlMyIChnZnMyX2V2aWN0X2lub2RlcyksIGFuZCBMYW5kbG9jayAoaG9va19zYl9kZWxldGUpLiBUaGlzIHNpZ25pZmljYW50bHkgYWx0ZXJzIGxvY2tpbmcsIGxpc3QgbXV0YXRpb24gZHVyaW5nIHRyYXZlcnNhbCwgYW5kIHJlZmNvdW50aW5nIGFjcm9zcyBjb3JlIHN1YnN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciByYWNlcywgbGlzdCBjb3JydXB0aW9ucywgb3IgZGVhZGxvY2tzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjExPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBpbnRlcm5hbCBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gYWNyb3NzIHNldmVyYWwgc3Vic3lzdGVtcyAoYmxvY2ssIGRyb3BfY2FjaGVzLCBnZnMyLCB2ZnMgaW5vZGUsIHF1b3RhLCBsYW5kbG9jaykgYnkgaW50cm9kdWNpbmcgYSBnZW5lcmljIGhlbHBlciBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGFuZCBpdGVyYXRvciBzdHJ1Y3R1cmUgYHN0cnVjdCBpbm9kZV9pdGVyYC5cblxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxuICAtIFRoZSBuZXdseSBpbnRyb2R1Y2VkIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IGlub2RlX2l0ZXJgIGluIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGlub2RlX3NiX2l0ZXJfc3RhcnQoKWAuXG4gIC0gQWxsIGNhbGxiYWNrIGRhdGEgcGF5bG9hZHMgcGFzc2VkIHRvIHRoZSBpdGVyYXRvciBmdW5jdGlvbnMgYXJlIGVpdGhlciBOVUxMIG9yIHBvaW50ZXJzIHRvIGZ1bGx5IGluaXRpYWxpemVkIHZhcmlhYmxlcy9zdHJ1Y3R1cmVzIChlLmcuLCBib29sZWFuIGNhc3QsIGluaXRpYWxpemVkIGxpbmtlZCBsaXN0IGhlYWQsIGludGVnZXIgcG9pbnRlcikuXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXG4gIC0gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgY29uZGl0aW9uYWwgYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcbiAgLSBQb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCByZWxhdGUgdG8gbGlzdCBtYW5pcHVsYXRpb24sIHJlZmNvdW50aW5nIChgX19pZ2V0YC9gaXB1dGApLCBsb2NraW5nIHNlbWFudGljcyB1bmRlciBgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2tgIGFuZCBgaW5vZGUtXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXG5cblRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiNDZlM2Q5NmM5YTE3MTA3MjBiODNiMzllOWZmYTEyNmY5ODgwZDY1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAxMToxMDo0MSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuYwppbmRleCBjZDgzMjMwODM3NDA2Li5hZTQ3MmEwNjJlNTFjIDEwMDY0NAotLS0gYS9ibG9jay9iZGV2LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmRldi5jCkBAIC0xMzM2LDU2ICYjNDM7MTMzNiw1MyBAQCB2b2lkIGJkZXZfbWFya19kZWFkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGJvb2wgc3VycHJpc2UpCiAgKi8KIEVYUE9SVF9TWU1CT0xfR1BMKGJkZXZfbWFya19kZWFkKTsKIAotdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdCkKJiM0MztzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrKCZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLSZndDtpX21hcHBpbmc7Ci0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CWJvb2wgd2FpdCA9IChib29sKWRhdGE7CiYjNDM7CXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtJmd0O2lfbWFwcGluZzsKIAotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fAotCQkgICAgbWFwcGluZy0mZ3Q7bnJwYWdlcyA9PSAwKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKG1hcHBpbmctJmd0O25ycGFnZXMgPT0gMCkgewogCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KJiM0MzsJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKJiM0MzsJICogc19pbm9kZV9saXN0X2xvY2suCiYjNDM7CSAqLwomIzQzOwlfX2lnZXQoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJYmRldiA9IElfQkRFVihpbm9kZSk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2JkZXYtJmd0O2JkX29wZW5lcnMpKSB7CiYjNDM7CQk7IC8qIHNraXAgKi8KJiM0MzsJfSBlbHNlIGlmICh3YWl0KSB7CiAJCS8qCi0JCSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KLQkJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKLQkJICogc19pbm9kZV9saXN0X2xvY2sgIFdlIGNhbm5vdCBpcHV0IHRoZSBpbm9kZSBub3cgYXMgd2UgY2FuCi0JCSAqIGJlIGhvbGRpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIGFuZCB3ZSBjYW5ub3QgaXB1dCBpdCB1bmRlcgotCQkgKiBzX2lub2RlX2xpc3RfbG9jay4gU28gd2Uga2VlcCB0aGUgcmVmZXJlbmNlIGFuZCBpcHV0IGl0Ci0JCSAqIGxhdGVyLgomIzQzOwkJICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzbwomIzQzOwkJICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmcKJiM0MzsJCSAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3IKJiM0MzsJCSAqIGRldGFpbHMuCiAJCSAqLwotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQliZGV2ID0gSV9CREVWKGlub2RlKTsKLQotCQltdXRleF9sb2NrKCZhbXA7YmRldi0mZ3Q7YmRfZGlzay0mZ3Q7b3Blbl9tdXRleCk7Ci0JCWlmICghYXRvbWljX3JlYWQoJmFtcDtiZGV2LSZndDtiZF9vcGVuZXJzKSkgewotCQkJOyAvKiBza2lwICovCi0JCX0gZWxzZSBpZiAod2FpdCkgewotCQkJLyoKLQkJCSAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc28KLQkJCSAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nCi0JCQkgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yCi0JCQkgKiBkZXRhaWxzLgotCQkJICovCi0JCQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfQotCQltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKLQotCQlzcGluX2xvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dChvbGRfaW5vZGUpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgc3luY19iZGV2cyhib29sIHdhaXQpCiYjNDM7ewomIzQzOwlzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsCiYjNDM7CQkJICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmMKaW5kZXggNDlmNTZhNTk4ZWNiYy4uMGQ0NzVhNWZmOGNmYiAxMDA2NDQKLS0tIGEvZnMvZHJvcF9jYWNoZXMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9kcm9wX2NhY2hlcy5jCkBAIC0xNiwzNiAmIzQzOzE2LDMwIEBACiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovCiBzdGF0aWMgaW50IHN5c2N0bF9kcm9wX2NhY2hlczsKIAotc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3N0YXRpYyBpbnQgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkvKgotCQkgKiBXZSBtdXN0IHNraXAgaW5vZGVzIGluIHVudXN1YWwgc3RhdGUuIFdlIG1heSBhbHNvIHNraXAKLQkJICogaW5vZGVzIHdpdGhvdXQgcGFnZXMgYnV0IHdlIGRlbGliZXJhdGVseSB3b24mIzM5O3QgaW4gY2FzZQotCQkgKiB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgdG8gYXZvaWQgc29mdGxvY2t1cHMuCi0JCSAqLwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHwKLQkJICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpICZhbXA7JmFtcDsgIW5lZWRfcmVzY2hlZCgpKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCV9faWdldChpbm9kZSk7CiYjNDM7CWlmIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpKSB7CiAJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQotCQlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtJmd0O2lfbWFwcGluZywgMCwgLTEpOwotCQlpcHV0KHRvcHV0X2lub2RlKTsKLQkJdG9wdXRfaW5vZGUgPSBpbm9kZTsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwogCX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CiYjNDM7CWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0mZ3Q7aV9tYXBwaW5nLCAwLCAtMSk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3sKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTk5Niw3ICYjNDM7OTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KQogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCWNhc2UgT3B0X2ppZDoKIAkJCXJldCA9IG1hdGNoX2ludCgmYW1wO3RtcFswXSwgJmFtcDtvcHRpb24pOwotCQkJaWYgKHJldCB8fCBvcHRpb24gJmx0OyAwKSAKJiM0MzsJCQlpZiAocmV0IHx8IG9wdGlvbiAmbHQ7IDApCiAJCQkJZ290byBob3N0ZGF0YV9lcnJvcjsKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpKQogCQkJCWxzLSZndDtsc19qaWQgPSBvcHRpb247CkBAIC0xNzE5LDYgJiM0MzsxNzE5LDE5IEBAIHN0YXRpYyBpbnQgZ2ZzMl9tZXRhX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50IGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtJmd0O2lfc2I7CiYjNDM7CiYjNDM7CV9faWdldChpbm9kZSk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZ2ZzMl9ldmljdF9pbm9kZXMgLSBldmljdCBpbm9kZXMgY29vcGVyYXRpdmVseQogICogQHNiOiB0aGUgc3VwZXJibG9jawpAQCAtMTc0MSwzMSAmIzQzOzE3NTQsMTAgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYykKICAqLwogc3RhdGljIHZvaWQgZ2ZzMl9ldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqdG9wdXRfaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItJmd0O3NfZnNfaW5mbzsKIAogCXNldF9iaXQoU0RGX0VWSUNUSU5HLCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgJmFtcDsmYW1wOwotCQkgICAgIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCi0JCWlwdXQodG9wdXRfaW5vZGUpOwotCQl0b3B1dF9pbm9kZSA9IGlub2RlOwotCi0JCWNvbmRfcmVzY2hlZCgpOwotCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CXNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbm9kZS5jCkBAIC02OSw2ICYjNDM7NjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0gewogfTsKIEVYUE9SVF9TWU1CT0woZW1wdHlfYW9wcyk7CiAKJiM0MztzdHJ1Y3QgaW5vZGVfaXRlciB7CiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJaXRlcnNfbm9kZTsJLyogc2ItJmd0O3NfaW5vZGVzX2l0ZXJzICovCiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJKm5leHQ7CQkvKiBuZXh0IG5vZGUgZ29pbmcgdG8gaXRlcmF0ZSAqLwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWlub2RlX2l0ZXJfY2IgZnVuYzsKJiM0MzsJdm9pZCAqZGF0YTsKJiM0MzsJaW50IHJldDsKJiM0Mzt9OwomIzQzOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfdW51c2VkKTsKIApAQCAtNjQxLDEyICYjNDM7NjUwLDk2IEBAIHZvaWQgaW5vZGVfc2JfbGlzdF9hZGQoc3RydWN0IGlub2RlICppbm9kZSkKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTsKIAomIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LAomIzQzOwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlpdC0mZ3Q7ZmxhZ3MgPSBmbGFnczsKJiM0MzsJaXQtJmd0O2Z1bmMgPSBmbjsKJiM0MzsJaXQtJmd0O2RhdGEgPSBkYXRhOwomIzQzOwlpdC0mZ3Q7cmV0ID0gMDsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaXQtJmd0O25leHQgPSBzYi0mZ3Q7c19pbm9kZXMubmV4dDsKJiM0MzsJbGlzdF9hZGQoJmFtcDtpdC0mZ3Q7aXRlcnNfbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX2VuZChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiYjNDM7ewomIzQzOwlsaXN0X2RlbCgmYW1wO2l0LSZndDtpdGVyc19ub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3sKJiM0MzsJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXdoaWxlICghaW5vZGUgJmFtcDsmYW1wOyBpdC0mZ3Q7bmV4dCAhPSAmYW1wO3NiLSZndDtzX2lub2RlcykgewomIzQzOwkJaW5vZGUgPSBsaXN0X2VudHJ5KGl0LSZndDtuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7CiYjNDM7CQlpZiAoaXQtJmd0O2ZsYWdzICZhbXA7IElOT0RFX0lURVJfVU5VU0VEKSB7CiYjNDM7CQkJaWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7CiYjNDM7CQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoKGl0LSZndDtmbGFncyAmYW1wOyBJTk9ERV9JVEVSX05PUk1BTCkgJmFtcDsmYW1wOwomIzQzOwkJICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7CiYjNDM7CQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpdC0mZ3Q7bmV4dCA9IGl0LSZndDtuZXh0LSZndDtuZXh0OwomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaXQtJmd0O25leHQgPSBpdC0mZ3Q7bmV4dC0mZ3Q7bmV4dDsKJiM0MzsJCXJldCA9IGl0LSZndDtmdW5jKGlub2RlLCBpdC0mZ3Q7ZGF0YSk7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJaXQtJmd0O3JldCA9IHJldDsKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKJiM0MzsJCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQkJY29uZF9yZXNjaGVkKCk7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gaXQtJmd0O25leHQgPT0gJmFtcDtzYi0mZ3Q7c19pbm9kZXMgPyBmYWxzZSA6IHRydWU7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciBpdDsKJiM0MzsKJiM0MzsJaW5vZGVfc2JfaXRlcl9zdGFydChzYiwgJmFtcDtpdCwgZmxhZ3MsIGZuLCBkYXRhKTsKJiM0MzsJd2hpbGUgKGlub2RlX3NiX2l0ZXJfbmV4dCgmYW1wO2l0LCBzYikpCiYjNDM7CQk7CiYjNDM7CWlub2RlX3NiX2l0ZXJfZW5kKCZhbXA7aXQsIHNiKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGl0LnJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpOwomIzQzOwogc3RhdGljIGlubGluZSB2b2lkIGlub2RlX3NiX2xpc3RfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciAqaXQ7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KSkgewogCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpdCwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMsIGl0ZXJzX25vZGUpIHsKJiM0MzsJCQlpZiAoaXQtJmd0O25leHQgPT0gJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KQomIzQzOwkJCQlpdC0mZ3Q7bmV4dCA9IGlub2RlLSZndDtpX3NiX2xpc3QubmV4dDsKJiM0MzsJCX0KIAkJbGlzdF9kZWxfaW5pdCgmYW1wO2lub2RlLSZndDtpX3NiX2xpc3QpOwogCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJfQpAQCAtODY2LDYgJiM0Mzs5NTksMTcgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAJfQogfQogCiYjNDM7c3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCAqZGlzcG9zZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGF0YTsKJiM0MzsKJiM0MzsJaW5vZGVfc3RhdGVfc2V0KGlub2RlLCBJX0ZSRUVJTkcpOwomIzQzOwlpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlsaXN0X2FkZCgmYW1wO2lub2RlLSZndDtpX2xydSwgZGlzcG9zZSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZXZpY3RfaW5vZGVzCS0gZXZpY3QgYWxsIGV2aWN0YWJsZSBpbm9kZXMgZm9yIGEgc3VwZXJibG9jawogICogQHNiOgkJc3VwZXJibG9jayB0byBvcGVyYXRlIG9uCkBAIC04NzcsNDQgJiM0Mzs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAgKi8KIHZvaWQgZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAlMSVNUX0hFQUQoZGlzcG9zZSk7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMIHwgSU5PREVfSVRFUl9VTlVTRUQ7CiAKLWFnYWluOgotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKLQotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGljb3VudF9yZWFkKGlub2RlKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTsKLQkJaW5vZGVfbHJ1X2xpc3RfZGVsKGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJbGlzdF9hZGQoJmFtcDtpbm9kZS0mZ3Q7aV9scnUsICZhbXA7ZGlzcG9zZSk7Ci0KLQkJLyoKLQkJICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlbgotCQkgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYQotCQkgKiBiaXQgc28gd2UgZG9uJiMzOTt0IGxpdmVsb2NrLgotCQkgKi8KLQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCWRpc3Bvc2VfbGlzdCgmYW1wO2Rpc3Bvc2UpOwotCQkJZ290byBhZ2FpbjsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0KJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsICZhbXA7ZGlzcG9zZSk7CiAJZGlzcG9zZV9saXN0KCZhbXA7ZGlzcG9zZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChldmljdF9pbm9kZXMpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvZHF1b3QuYyBiL2ZzL3F1b3RhL2RxdW90LmMKaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvZHF1b3QuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9xdW90YS9kcXVvdC5jCkBAIC0xMDQzLDY0ICYjNDM7MTA0Myw0OCBAQCBzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwotc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKm9sZF9pbm9kZSA9IE5VTEw7CiYjNDM7CWludCB0eXBlID0gKihpbnQgKilkYXRhOwomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVRwogCWludCByZXNlcnZlZCA9IDA7CiAjZW5kaWYKLQlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8Ci0JCSAgICAhYXRvbWljX3JlYWQoJmFtcDtpbm9kZS0mZ3Q7aV93cml0ZWNvdW50KSB8fAotCQkgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX3dyaXRlY291bnQpIHx8CiYjNDM7CSAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHsKIAkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHCi0JCWlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSAmZ3Q7IDApKQotCQkJcmVzZXJ2ZWQgPSAxOwomIzQzOwlpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgJmd0OyAwKSkKJiM0MzsJCXJlc2VydmVkID0gMTsKICNlbmRpZgotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCWVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7Ci0JCWlmIChlcnIpIHsKLQkJCWlwdXQoaW5vZGUpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICYjMzk7aW5vZGUmIzM5OyBzbyBpdCBjb3VsZG4mIzM5O3QgaGF2ZSBiZWVuCi0JCSAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlCi0JCSAqIHNfaW5vZGVfbGlzdF9sb2NrLiBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbiBiZQotCQkgKiBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXIKLQkJICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdAotCQkgKiBsYXRlci4KLQkJICovCi0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWlwdXQob2xkX2lub2RlKTsKLW91dDoKJiM0MzsJZXJyID0gX19kcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUcKLQlpZiAocmVzZXJ2ZWQpIHsKLQkJcXVvdGFfZXJyb3Ioc2IsICYjMzQ7V3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uICYjMzQ7Ci0JCQkmIzM0O3RodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiAmIzM0OwotCQkJJiMzNDtQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7Ci0JfQomIzQzOwlpZiAocmVzZXJ2ZWQpCiYjNDM7CQlxdW90YV9lcnJvcihzYiwgJiMzNDtXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgJiMzNDsKJiM0MzsJCQkgICAgJiMzNDtvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5ICYjMzQ7CiYjNDM7CQkJICAgICYjMzQ7aW5jb25zaXN0ZW50LiBQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7CiAjZW5kaWYKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIAomIzQzOy8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLAomIzQzOwkJCQkgIGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYiwgJmFtcDt0eXBlKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAwNWU0NDMxNzMwMzg3Li4zZTA2OTE1MGM1NDQ1IDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3N1cGVyLmMKQEAgLTM4Miw2ICYjNDM7MzgyLDcgQEAgc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsIGludCBmbGFncywKIAlzcGluX2xvY2tfaW5pdCgmYW1wO3MtJmd0O3Nfcm9vdHNfbG9jayk7CiAJbXV0ZXhfaW5pdCgmYW1wO3MtJmd0O3Nfc3luY19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmYW1wO3MtJmd0O3NfaW5vZGVzKTsKJiM0MzsJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc19pdGVycyk7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc193Yik7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX3dibGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBmOWQxZTA1ZThhZTY4Li5mMzE3NmFiMTBlNjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yOTYsNyAmIzQzOzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7CiAgKi8KICNkZWZpbmUgRklMRVNZU1RFTV9NQVhfU1RBQ0tfREVQVEggMgogCi0vKiogCiYjNDM7LyoqCiAgKiBlbnVtIHBvc2l0aXZlX2FvcF9yZXR1cm5zIC0gYW9wIHJldHVybiBjb2RlcyB3aXRoIHNwZWNpZmljIHNlbWFudGljcwogICoKICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXMKQEAgLTMwNiw3ICYjNDM7MzA2LDcgQEAgc3RydWN0IGlhdHRyIHsKICAqIAkJCSAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyCiAgKiAJCQkgICAgZnV0dXJlLiAgT3RoZXIgY2FsbGVycyBtdXN0IGJlIGNhcmVmdWwgdG8gdW5sb2NrCiAgKiAJCQkgICAgdGhlIHBhZ2UgaWYgdGhleSBnZXQgdGhpcyByZXR1cm4uICBSZXR1cm5lZCBieQotICogCQkJICAgIHdyaXRlcGFnZSgpOyAKJiM0MzsgKgkJCSAgICB3cml0ZXBhZ2UoKTsKICAqCiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXMKICAqICAJCQl1bmxvY2tlZCBpdCBhbmQgdGhlIHBhZ2UgbWlnaHQgaGF2ZSBiZWVuIHRydW5jYXRlZC4KQEAgLTg3MCw2ICYjNDM7ODcwLDIxIEBAIHN0cnVjdCBpbm9kZSB7CiAJdm9pZAkJCSppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi8KIH0gX19yYW5kb21pemVfbGF5b3V0OwogCiYjNDM7ZW51bSBpbm9kZV9pdGVyX2ZsYWdzX2VudW0gewomIzQzOwlJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSAmbHQ7Jmx0OyAxKSwgIC8qIEV4Y2x1ZGUgaW5vZGVzIHdpdGggKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpLiAqLwomIzQzOwlJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSAmbHQ7Jmx0OyAyKSwgIC8qIE9ubHkgcmV0dXJuIGlub2RlcyB3aXRoIChpX2NvdW50ID09IDApLiAqLwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kCiYjNDM7ICogIGlub2RlLSZndDtpX2xvY2sgICAgICAgICAgICAgIGxvY2tlZCAgICAgICAgIHVubG9ja2VkCiYjNDM7ICogIHNiLSZndDtzX2lub2RlX2xpc3RfbG9jayAgICAgIGxvY2tlZCAgICAgICAgIGxvY2tlZAomIzQzOyAqLwomIzQzO3R5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopOwomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpOwomIzQzOwogLyoKICAqIGlfc3RhdGUgaGFuZGxpbmcKICAqCkBAIC0xMzE1LDggJiM0MzsxMzMwLDEwIEBAIHN0cnVjdCBmaWxlICpnZXRfZmlsZV9hY3RpdmUoc3RydWN0IGZpbGUgKipmKTsKIAogI2RlZmluZQlNQVhfTk9OX0xGUwkoKDFVTCZsdDsmbHQ7MzEpIC0gMSkKIAotLyogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMgCi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIAomIzQzOy8qCiYjNDM7ICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMKJiM0MzsgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uCiYjNDM7ICovCiAjaWYgQklUU19QRVJfTE9ORz09MzIKICNkZWZpbmUgTUFYX0xGU19GSUxFU0laRQkoKGxvZmZfdClVTE9OR19NQVggJmx0OyZsdDsgUEFHRV9TSElGVCkKICNlbGlmIEJJVFNfUEVSX0xPTkc9PTY0CkBAIC0yMjg1LDcgJiM0MzsyMzAyLDcgQEAgaW50IHN5bmNfaW5vZGVfbWV0YWRhdGEoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhaXQpOwogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGZzX2ZsYWdzOwotI2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEgCiYjNDM7I2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEKICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQQkyCiAjZGVmaW5lIEZTX0hBU19TVUJUWVBFCQk0CiAjZGVmaW5lIEZTX1VTRVJOU19NT1VOVAkJOAkvKiBDYW4gYmUgbW91bnRlZCBieSB1c2VybnMgcm9vdCAqLwpAQCAtMjkwNyw3ICYjNDM7MjkyNCw3IEBAIHNzaXplX3QgX19rZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKTsKIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopOwogZXh0ZXJuIHNzaXplX3QgX19rZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqIG9wZW5fZXhlYyhjb25zdCBjaGFyICopOwotIAomIzQzOwogLyogZnMvZGNhY2hlLmMgLS0gZ2VuZXJpYyBmcyBzdXBwb3J0IGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBib29sIHBhdGhfaXNfdW5kZXIoY29uc3Qgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IHBhdGggKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmgKaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaApAQCAtMjY5LDkgJiM0MzsyNjksMTAgQEAgc3RydWN0IHN1cGVyX2Jsb2NrIHsKIAkgKi8KIAlpbnQgc19zdGFja19kZXB0aDsKIAotCS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzICovCiYjNDM7CS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqLwogCXNwaW5sb2NrX3QJCQkJc19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkJc19pbm9kZXM7CS8qIGFsbCBpbm9kZXMgKi8KJiM0MzsJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX2l0ZXJzOyAvKiBhbGwgaXRlcmF0b3JzICovCiAKIAlzcGlubG9ja190CQkJCXNfaW5vZGVfd2JsaXN0X2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX3diOwkvKiB3cml0ZWJhY2sgaW5vZGVzICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuYwppbmRleCAzMGFhNmNlMTM1OTBhLi4zZGNkZThjYmZiNmFmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jCiYjNDM7JiM0MzsmIzQzOyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmMKQEAgLTEzNjksMTEwICYjNDM7MTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KQogCiAvKiBTdXBlci1ibG9jayBob29rcyAqLwogCi0vKgotICogUmVsZWFzZSB0aGUgaW5vZGVzIHVzZWQgaW4gYSBzZWN1cml0eSBwb2xpY3kuCi0gKgotICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCi0gKi8KLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpCiYjNDM7c3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbGFuZGxvY2tfb2JqZWN0ICpvYmplY3Q7CiYjNDM7CXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0mZ3Q7aV9zYjsKIAotCWlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX2NvdW50KSkgewomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiAKLQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7c2ItJmd0O3NfaW5vZGVzLCBpX3NiX2xpc3QpIHsKLQkJc3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0OwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktJmd0O29iamVjdCk7CiYjNDM7CWlmICghb2JqZWN0KSB7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwkvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi8KJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAotCQkvKiBPbmx5IGhhbmRsZXMgcmVmZXJlbmNlZCBpbm9kZXMuICovCi0JCWlmICghaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKJiM0MzsJLyoKJiM0MzsJICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZQomIzQzOwkgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZQomIzQzOwkgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJc3Bpbl9sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKJiM0MzsJaWYgKG9iamVjdC0mZ3Q7dW5kZXJvYmogPT0gaW5vZGUpIHsKJiM0MzsJCW9iamVjdC0mZ3Q7dW5kZXJvYmogPSBOVUxMOwomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJLyoKLQkJICogUHJvdGVjdHMgYWdhaW5zdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiBpbm9kZSAoZS5nLgotCQkgKiBmcm9tIGdldF9pbm9kZV9vYmplY3QoKSkuCiYjNDM7CQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAomIzQzOwkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCiYjNDM7CQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKJiM0MzsJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgomIzQzOwkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgogCQkgKi8KLQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwogCQkvKgotCQkgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZQotCQkgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaAotCQkgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS0mZ3Q7c2VjdXJpdHkgb3IgYQotCQkgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc28KLQkJICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuCiYjNDM7CQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzCiYjNDM7CQkgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZQomIzQzOwkJICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wCiYjNDM7CQkgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlcwomIzQzOwkJICogb24gdGhlIGlub2RlLgogCQkgKi8KLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7Ci0JCSAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQomIzQzOwkJaXB1dF9ub3RfbGFzdChpbm9kZSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJfQogCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJb2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0KTsKLQkJaWYgKCFvYmplY3QpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqLwotCQlfX2lnZXQoaW5vZGUpOwotCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2UKLQkJICogYXJlIGluIGNoYXJnZSBvZiBjYWxsaW5nIGlwdXQoKSBvbiB0aGlzIGlub2RlLCBvdGhlcndpc2Ugd2UKLQkJICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KLQkJICovCi0JCXNwaW5fbG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7Ci0JCWlmIChvYmplY3QtJmd0O3VuZGVyb2JqID09IGlub2RlKSB7Ci0JCQlvYmplY3QtJmd0O3VuZGVyb2JqID0gTlVMTDsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkJCS8qCi0JCQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAotCQkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCi0JCQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKLQkJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgotCQkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgotCQkJICovCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwotCQkJLyoKLQkJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXMKLQkJCSAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlCi0JCQkgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3AKLQkJCSAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzCi0JCQkgKiBvbiB0aGUgaW5vZGUuCi0JCQkgKi8KLQkJCWlwdXRfbm90X2xhc3QoaW5vZGUpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCX0KJiM0MzsvKgomIzQzOyAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LgomIzQzOyAqCiYjNDM7ICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMOwogCi0JCWlmIChwcmV2X2lub2RlKSB7Ci0JCQkvKgotCQkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgb3duIHRoZSBfX2lnZXQoKSByZWZlcmVuY2UKLQkJCSAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2UKLQkJCSAqIGNhbiBkcm9wIHRoZSBsaXN0IGxvY2sgYW5kIGtub3cgdGhhdCB0aGUgaW5vZGUgd29uJiMzOTt0Ci0JCQkgKiBkaXNhcHBlYXIgZnJvbSB1bmRlciB1cyB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuCi0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJCS8qCi0JCQkgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlCi0JCQkgKiBwcmV2aW91cyBsb29wIHdhbGssIHdoaWNoIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KLQkJCSAqLwotCQkJaXB1dChwcmV2X2lub2RlKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJfQotCQlwcmV2X2lub2RlID0gaW5vZGU7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaWYgKCFsYW5kbG9ja19pbml0aWFsaXplZCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiAKLQkvKiBQdXRzIHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGUgbGFzdCBsb29wIHdhbGssIGlmIGFueS4gKi8KLQlpZiAocHJldl9pbm9kZSkKLQkJaXB1dChwcmV2X2lub2RlKTsKIAkvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqLwogCXdhaXRfdmFyX2V2ZW50KCZhbXA7bGFuZGxvY2tfc3VwZXJibG9jayhzYiktJmd0O2lub2RlX3JlZnMsCiAJCSAgICAgICAhYXRvbWljX2xvbmdfcmVhZCgmYW1wO2xhbmRsb2NrX3N1cGVyYmxvY2soc2IpLSZndDtpbm9kZV9yZWZzKSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTIwOQoJCQkJCQkJb3V0cHV0OiAzNDEKCQkJCQkJCXRob3VnaHRzOiAyMjY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEV2YWx1YXRpb246IFBhdGNoIEludHJvZHVjaW5nIGBzYl9mb3JfZWFjaF9pbm9kZXNgKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2gsIHdoaWNoIGludHJvZHVjZXMgYSBuZXcgaXRlcmF0b3IgZm9yIGlub2RlcyB3aXRoaW4gYSBzdXBlcmJsb2NrLCB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24sIG9yIGlmIGl0JiMzOTtzIHN1ZmZpY2llbnRseSBjb3ZlcmVkIGJ5IGV4aXN0aW5nIEtBU0FOIGFuZCBvdGhlciBkZWJ1Z2dpbmcgdG9vbHMuCgpGaXJzdCwgSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIHBhdGNoIGl0c2VsZi4gSXQmIzM5O3MgZXNzZW50aWFsbHkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24sIGBzYl9mb3JfZWFjaF9pbm9kZXNgLCBhbmQgYW4gYXNzb2NpYXRlZCBpdGVyYXRvciBzdHJ1Y3R1cmUsIGBpbm9kZV9pdGVyYCwgdG8gc3RyZWFtbGluZSBpdGVyYXRpb24gdGhyb3VnaCB0aGUgYHNfaW5vZGVzYCBsaXN0IG9mIGEgc3VwZXJibG9jay4gU2V2ZXJhbCBleGlzdGluZyBmdW5jdGlvbnMgdGhhdCBpdGVyYXRlIGlub2RlcyBhcmUgYmVpbmcgcmVmYWN0b3JlZCB0byB1c2UgdGhpcyBuZXcgaXRlcmF0b3IuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYSBgc19pbm9kZXNfaXRlcnNgIGxpc3QgdG8gdGhlIGBzdXBlcl9ibG9ja2Agc3RydWN0dXJlIHRvIHRyYWNrIHRoZSBpdGVyYXRvcnMuCgpOb3csIGxldCYjMzk7cyBkcmlsbCBkb3duIGludG8gdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLCBpbmZvIGxlYWtzLCBvciBhbnkgb3RoZXIgS01TQU4tc3BlY2lmaWMgY29uY2VybnMuCgpJJiMzOTt2ZSBleGFtaW5lZCB0aGUgY29kZSBjbG9zZWx5LiBUaGUgYGlub2RlX2l0ZXJgIHN0cnVjdHVyZSBpdHNlbGYgaXMgc3RhY2stYWxsb2NhdGVkIHdpdGhpbiB0aGUgYHNiX2Zvcl9lYWNoX2lub2Rlc2AgZnVuY3Rpb24sIGFuZCBhbGwgaXRzIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aGluIHRoZSBgaW5vZGVfc2JfaXRlcl9zdGFydGAgZnVuY3Rpb24uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyB3aXRoaW4gdGhlIGl0ZXJhdG9yLiBTcGVjaWZpY2FsbHksIHRoZSBwYXRjaCBkb2VzIG5vdCBjb3B5IGFueSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLiBJdCBhbHNvIGxvb2tzIGxpa2UgdGhlIGBkYXRhYCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBlaXRoZXIgYSBudWxsIHBvaW50ZXIsIG9yIGFuIGluaXRpYWxpemVkIHZhcmlhYmxlLiBUaGUgYGlub2RlX3NiX2l0ZXJfbmV4dGAgZnVuY3Rpb24mIzM5O3MgbG9naWMgaXMgY2xlYXIsIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2dpY2FsIGJ1ZyBpbiBpdCwgaXQgaXMgbm90IGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLgoKU28sIGFtIEkgc2VlaW5nIGFueXRoaW5nIHRoYXQgd291bGQgZmFsbCBpbnRvIHRoZSBjYXRlZ29yaWVzIHdoZXJlIEtNU0FOIGlzIHNwZWNpZmljYWxseSBuZWVkZWQ/IE5vLCBub3QgcmVhbGx5LiBUaGUgcHJpbWFyeSByaXNrcyBhcHBlYXIgdG8gYmUgcmVsYXRlZCB0byBjb25jdXJyZW5jeSwgbG9ja2luZywgYW5kIHBvdGVudGlhbGx5IHVzZS1hZnRlci1mcmVlIGJ1Z3MuIFRoaW5ncyBsaWtlIGRyb3BwaW5nIGFuZCByZXRha2luZyB0aGUgYHNfaW5vZGVfbGlzdF9sb2NrYCB3aGlsZSBgaXQtJmd0O25leHRgIGlzIHVwZGF0ZWQuIFRoZXNlIGtpbmRzIG9mIGJ1Z3MgYXJlIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIEtBU0FOLCBMT0NLREVQLCBhbmQgdGhlIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgaW5mcmFzdHJ1Y3R1cmUuCgpJJiMzOTt2ZSByZXZpZXdlZCB0aGUgZ3VpZGVsaW5lcy4gSSBuZWVkIHRvIGFzayBteXNlbGY6IERvZXMgdGhpcyBwYXRjaCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5OgoxLiAgS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlPyBOby4KMi4gIENvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm8uCjMuICBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQ/IE5vLgo0LiAgQm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzPyBOby4KClRoZXJlZm9yZSwgdGhpcyBwYXRjaCBkb2VzIG5vdCBleHBvc2UgYW55IG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gQWxsIHN0cnVjdHVyZXMgdG91Y2hlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IGluaXRpYWxpemVkIGFuZCB0aGUgaW50cm9kdWNlZCBidWdzIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOIGFuZCB0aGUgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gTm8gS01TQU4gaXMgbmVlZGVkLgoKSSYjMzk7bSBjb21mb3J0YWJsZSBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYCBmb3IgdGhpcyBwYXRjaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBpbnRlcm5hbCBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gYWNyb3NzIHNldmVyYWwgc3Vic3lzdGVtcyAoYmxvY2ssIGRyb3BfY2FjaGVzLCBnZnMyLCB2ZnMgaW5vZGUsIHF1b3RhLCBsYW5kbG9jaykgYnkgaW50cm9kdWNpbmcgYSBnZW5lcmljIGhlbHBlciBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGFuZCBpdGVyYXRvciBzdHJ1Y3R1cmUgYHN0cnVjdCBpbm9kZV9pdGVyYC5cblxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxuICAtIFRoZSBuZXdseSBpbnRyb2R1Y2VkIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IGlub2RlX2l0ZXJgIGluIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGlub2RlX3NiX2l0ZXJfc3RhcnQoKWAuXG4gIC0gQWxsIGNhbGxiYWNrIGRhdGEgcGF5bG9hZHMgcGFzc2VkIHRvIHRoZSBpdGVyYXRvciBmdW5jdGlvbnMgYXJlIGVpdGhlciBOVUxMIG9yIHBvaW50ZXJzIHRvIGZ1bGx5IGluaXRpYWxpemVkIHZhcmlhYmxlcy9zdHJ1Y3R1cmVzIChlLmcuLCBib29sZWFuIGNhc3QsIGluaXRpYWxpemVkIGxpbmtlZCBsaXN0IGhlYWQsIGludGVnZXIgcG9pbnRlcikuXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXG4gIC0gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgY29uZGl0aW9uYWwgYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcbiAgLSBQb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCByZWxhdGUgdG8gbGlzdCBtYW5pcHVsYXRpb24sIHJlZmNvdW50aW5nIChgX19pZ2V0YC9gaXB1dGApLCBsb2NraW5nIHNlbWFudGljcyB1bmRlciBgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2tgIGFuZCBgaW5vZGUtXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXG5cblRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGludGVybmFsIHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIG1lY2hhbmlzbSBhY3Jvc3Mgc2V2ZXJhbCBzdWJzeXN0ZW1zIChibG9jaywgZHJvcF9jYWNoZXMsIGdmczIsIHZmcyBpbm9kZSwgcXVvdGEsIGxhbmRsb2NrKSBieSBpbnRyb2R1Y2luZyBhIGdlbmVyaWMgaGVscGVyIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgYW5kIGl0ZXJhdG9yIHN0cnVjdHVyZSBgc3RydWN0IGlub2RlX2l0ZXJgLlxuXG4tIFVuaW5pdGlhbGl6ZWQgbWVtb3J5IC8gS01TQU4gcGVyc3BlY3RpdmU6XG4gIC0gVGhlIG5ld2x5IGludHJvZHVjZWQgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgaW5vZGVfaXRlcmAgaW4gYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgaW5vZGVfc2JfaXRlcl9zdGFydCgpYC5cbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cbiAgLSBObyBrZXJuZWwgZGF0YSBpcyBjb3BpZWQgb3IgZXhwb3NlZCB0byB1c2VyIHNwYWNlIChubyBgY29weV90b191c2VyYCwgaW9jdGxzLCBuZXRsaW5rIG1lc3NhZ2VzLCBldGMuKS5cbiAgLSBObyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBjb25kaXRpb25hbCBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGludHJvZHVjZWQuXG5cbi0gS0FTQU4gLyBMT0NLREVQIHBlcnNwZWN0aXZlOlxuICAtIFBvdGVudGlhbCBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHJlbGF0ZSB0byBsaXN0IG1hbmlwdWxhdGlvbiwgcmVmY291bnRpbmcgKGBfX2lnZXRgL2BpcHV0YCksIGxvY2tpbmcgc2VtYW50aWNzIHVuZGVyIGBzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cdTAwM2VpX2xvY2tgLCBvciB1c2UtYWZ0ZXItZnJlZS9yYWNlIGNvbmRpdGlvbnMgaWYgbGlzdCBub2RlcyBhcmUgZGVsZXRlZCBkdXJpbmcgdHJhdmVyc2FsLiBUaGVzZSBhcmUgZnVsbHkgY292ZXJlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIGBERUJVR19MSVNUYC5cblxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NDMuMjg4ODE1NTg1WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzUzNjM4NzI2NTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUVVPVEFcIixcbiAgICBcIkdGUzJfRlNcIixcbiAgICBcIlNFQ1VSSVRZX0xBTkRMT0NLXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic2JfZm9yX2VhY2hfaW5vZGVzXCIsXG4gICAgXCJldmljdF9pbm9kZXNcIixcbiAgICBcInN5bmNfYmRldnNcIixcbiAgICBcImRyb3BfcGFnZWNhY2hlX3NiXCIsXG4gICAgXCJhZGRfZHF1b3RfcmVmXCIsXG4gICAgXCJnZnMyX2V2aWN0X2lub2Rlc1wiLFxuICAgIFwiaG9va19zYl9kZWxldGVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXFxuXFxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxcbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXFxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG5cXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcXG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXFxuXFxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIGZyYW1ld29yayAoc2JfZm9yX2VhY2hfaW5vZGVzKSB3aXRoIGR5bmFtaWMgaXRlcmF0b3IgbGlzdCB0cmFja2luZyAoc19pbm9kZXNfaXRlcnMpIGFuZCB1cGRhdGVzIHRyYXZlcnNhbCBsb29wcyBpbiBWRlMgKGV2aWN0X2lub2RlcywgZHJvcF9jYWNoZXMpLCBibG9jayBkZXZpY2VzIChzeW5jX2JkZXZzKSwgcXVvdGFzIChhZGRfZHF1b3RfcmVmKSwgR0ZTMiAoZ2ZzMl9ldmljdF9pbm9kZXMpLCBhbmQgTGFuZGxvY2sgKGhvb2tfc2JfZGVsZXRlKS4gVGhpcyBzaWduaWZpY2FudGx5IGFsdGVycyBsb2NraW5nLCBsaXN0IG11dGF0aW9uIGR1cmluZyB0cmF2ZXJzYWwsIGFuZCByZWZjb3VudGluZyBhY3Jvc3MgY29yZSBzdWJzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgcmFjZXMsIGxpc3QgY29ycnVwdGlvbnMsIG9yIGRlYWRsb2Nrcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NDMuMjg4ODIwOTk1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTA0MDE3NTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYjQ2ZTNkOTZjOWExNzEwNzIwYjgzYjM5ZTlmZmExMjZmOTg4MGQ2NVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIFNlcCA5IDExOjEwOjQxIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuY1xcbmluZGV4IGNkODMyMzA4Mzc0MDYuLmFlNDcyYTA2MmU1MWMgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmRldi5jXFxuKysrIGIvYmxvY2svYmRldi5jXFxuQEAgLTEzMzYsNTYgKzEzMzYsNTMgQEAgdm9pZCBiZGV2X21hcmtfZGVhZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBib29sIHN1cnByaXNlKVxcbiAgKi9cXG4gRVhQT1JUX1NZTUJPTF9HUEwoYmRldl9tYXJrX2RlYWQpO1xcbiBcXG4tdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcXG4rc3RhdGljIGludCBzeW5jX2JkZXZzX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcXG4ge1xcbi1cXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVxcdTAwM2VpX21hcHBpbmc7XFxuLVxcdFxcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XFxuK1xcdGJvb2wgd2FpdCA9IChib29sKWRhdGE7XFxuK1xcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XFxuK1xcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXFx1MDAzZWlfbWFwcGluZztcXG4gXFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fFxcbi1cXHRcXHQgICAgbWFwcGluZy1cXHUwMDNlbnJwYWdlcyA9PSAwKSB7XFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0X19pZ2V0KGlub2RlKTtcXG4rXFx0aWYgKG1hcHBpbmctXFx1MDAzZW5ycGFnZXMgPT0gMCkge1xcbiBcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICdpbm9kZScgc28gaXQgY291bGRuJ3QgaGF2ZSBiZWVuXFxuK1xcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXFxuK1xcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLlxcbitcXHQgKi9cXG4rXFx0X19pZ2V0KGlub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRiZGV2ID0gSV9CREVWKGlub2RlKTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmJkZXYtXFx1MDAzZWJkX2Rpc2stXFx1MDAzZW9wZW5fbXV0ZXgpO1xcbitcXHRpZiAoIWF0b21pY19yZWFkKFxcdTAwMjZiZGV2LVxcdTAwM2ViZF9vcGVuZXJzKSkge1xcbitcXHRcXHQ7IC8qIHNraXAgKi9cXG4rXFx0fSBlbHNlIGlmICh3YWl0KSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJ2lub2RlJyBzbyBpdCBjb3VsZG4ndCBoYXZlIGJlZW5cXG4tXFx0XFx0ICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGVcXG4tXFx0XFx0ICogc19pbm9kZV9saXN0X2xvY2sgIFdlIGNhbm5vdCBpcHV0IHRoZSBpbm9kZSBub3cgYXMgd2UgY2FuXFxuLVxcdFxcdCAqIGJlIGhvbGRpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIGFuZCB3ZSBjYW5ub3QgaXB1dCBpdCB1bmRlclxcbi1cXHRcXHQgKiBzX2lub2RlX2xpc3RfbG9jay4gU28gd2Uga2VlcCB0aGUgcmVmZXJlbmNlIGFuZCBpcHV0IGl0XFxuLVxcdFxcdCAqIGxhdGVyLlxcbitcXHRcXHQgKiBXZSBrZWVwIHRoZSBlcnJvciBzdGF0dXMgb2YgaW5kaXZpZHVhbCBtYXBwaW5nIHNvXFxuK1xcdFxcdCAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nXFxuK1xcdFxcdCAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3JcXG4rXFx0XFx0ICogZGV0YWlscy5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdGlwdXQob2xkX2lub2RlKTtcXG4tXFx0XFx0b2xkX2lub2RlID0gaW5vZGU7XFxuLVxcdFxcdGJkZXYgPSBJX0JERVYoaW5vZGUpO1xcbi1cXG4tXFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2YmRldi1cXHUwMDNlYmRfZGlzay1cXHUwMDNlb3Blbl9tdXRleCk7XFxuLVxcdFxcdGlmICghYXRvbWljX3JlYWQoXFx1MDAyNmJkZXYtXFx1MDAzZWJkX29wZW5lcnMpKSB7XFxuLVxcdFxcdFxcdDsgLyogc2tpcCAqL1xcbi1cXHRcXHR9IGVsc2UgaWYgKHdhaXQpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzb1xcbi1cXHRcXHRcXHQgKiB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY2F0Y2ggdGhlIHdyaXRlYmFjayBlcnJvciB1c2luZ1xcbi1cXHRcXHRcXHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXFxuLVxcdFxcdFxcdCAqIGRldGFpbHMuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4tXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0ZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbi1cXHRcXHR9XFxuLVxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2YmRldi1cXHUwMDNlYmRfZGlzay1cXHUwMDNlb3Blbl9tdXRleCk7XFxuLVxcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0XFx0ZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXHRpcHV0KG9sZF9pbm9kZSk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2YmRldi1cXHUwMDNlYmRfZGlzay1cXHUwMDNlb3Blbl9tdXRleCk7XFxuK1xcdGlwdXQoaW5vZGUpO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcXG4re1xcbitcXHRzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsXFxuK1xcdFxcdFxcdCAgIHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYiwgKHZvaWQgKil3YWl0KTtcXG4gfVxcbiBcXG4gLypcXG5kaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmNcXG5pbmRleCA0OWY1NmE1OThlY2JjLi4wZDQ3NWE1ZmY4Y2ZiIDEwMDY0NFxcbi0tLSBhL2ZzL2Ryb3BfY2FjaGVzLmNcXG4rKysgYi9mcy9kcm9wX2NhY2hlcy5jXFxuQEAgLTE2LDM2ICsxNiwzMCBAQFxcbiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovXFxuIHN0YXRpYyBpbnQgc3lzY3RsX2Ryb3BfY2FjaGVzO1xcbiBcXG4tc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxcbitzdGF0aWMgaW50IGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XFxuK1xcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIG11c3Qgc2tpcCBpbm9kZXMgaW4gdW51c3VhbCBzdGF0ZS4gV2UgbWF5IGFsc28gc2tpcFxcbi1cXHRcXHQgKiBpbm9kZXMgd2l0aG91dCBwYWdlcyBidXQgd2UgZGVsaWJlcmF0ZWx5IHdvbid0IGluIGNhc2VcXG4tXFx0XFx0ICogd2UgbmVlZCB0byByZXNjaGVkdWxlIHRvIGF2b2lkIHNvZnRsb2NrdXBzLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHxcXG4tXFx0XFx0ICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLVxcdTAwM2VpX21hcHBpbmcpIFxcdTAwMjZcXHUwMDI2ICFuZWVkX3Jlc2NoZWQoKSkpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRfX2lnZXQoaW5vZGUpO1xcbitcXHRpZiAobWFwcGluZ19lbXB0eShpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKSkge1xcbiBcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXG4tXFx0XFx0aW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLVxcdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcXG4tXFx0XFx0aXB1dCh0b3B1dF9pbm9kZSk7XFxuLVxcdFxcdHRvcHV0X2lub2RlID0gaW5vZGU7XFxuLVxcbi1cXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0fVxcbitcXG4rXFx0X19pZ2V0KGlub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbiBcXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0aXB1dCh0b3B1dF9pbm9kZSk7XFxuK1xcbitcXHRpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtXFx1MDAzZWlfbWFwcGluZywgMCwgLTEpO1xcbitcXHRpcHV0KGlub2RlKTtcXG4rXFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXFxuK3tcXG4rXFx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcXG5kaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xcbmluZGV4IDcxOGUwZGE3ZGZjZTAuLmFjZGJmOWNhNDRhM2YgMTAwNjQ0XFxuLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmNcXG4rKysgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xcbkBAIC05OTYsNyArOTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KVxcbiBcXHRcXHRzd2l0Y2ggKHRva2VuKSB7XFxuIFxcdFxcdGNhc2UgT3B0X2ppZDpcXG4gXFx0XFx0XFx0cmV0ID0gbWF0Y2hfaW50KFxcdTAwMjZ0bXBbMF0sIFxcdTAwMjZvcHRpb24pO1xcbi1cXHRcXHRcXHRpZiAocmV0IHx8IG9wdGlvbiBcXHUwMDNjIDApIFxcbitcXHRcXHRcXHRpZiAocmV0IHx8IG9wdGlvbiBcXHUwMDNjIDApXFxuIFxcdFxcdFxcdFxcdGdvdG8gaG9zdGRhdGFfZXJyb3I7XFxuIFxcdFxcdFxcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCBcXHUwMDI2c2RwLVxcdTAwM2VzZF9mbGFncykpXFxuIFxcdFxcdFxcdFxcdGxzLVxcdTAwM2Vsc19qaWQgPSBvcHRpb247XFxuQEAgLTE3MTksNiArMTcxOSwxOSBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxcbit7XFxuK1xcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4rXFxuK1xcdF9faWdldChpbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcbitcXHRpcHV0KGlub2RlKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gLyoqXFxuICAqIGdmczJfZXZpY3RfaW5vZGVzIC0gZXZpY3QgaW5vZGVzIGNvb3BlcmF0aXZlbHlcXG4gICogQHNiOiB0aGUgc3VwZXJibG9ja1xcbkBAIC0xNzQxLDMxICsxNzU0LDEwIEBAIHN0YXRpYyBpbnQgZ2ZzMl9tZXRhX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuICAqL1xcbiBzdGF0aWMgdm9pZCBnZnMyX2V2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItXFx1MDAzZXNfZnNfaW5mbztcXG4gXFxuIFxcdHNldF9iaXQoU0RGX0VWSUNUSU5HLCBcXHUwMDI2c2RwLVxcdTAwM2VzZF9mbGFncyk7XFxuLVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFxcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgIW5lZWRfcmVzY2hlZCgpKSB7XFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0X19pZ2V0KGlub2RlKTtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFxuLVxcdFxcdGlwdXQodG9wdXRfaW5vZGUpO1xcbi1cXHRcXHR0b3B1dF9pbm9kZSA9IGlub2RlO1xcbi1cXG4tXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0aXB1dCh0b3B1dF9pbm9kZSk7XFxuK1xcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuY1xcbmluZGV4IGJhN2RhMzliZTRhMzEuLjA3YTVmNDg2NDFhZjggMTAwNjQ0XFxuLS0tIGEvZnMvaW5vZGUuY1xcbisrKyBiL2ZzL2lub2RlLmNcXG5AQCAtNjksNiArNjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0ge1xcbiB9O1xcbiBFWFBPUlRfU1lNQk9MKGVtcHR5X2FvcHMpO1xcbiBcXG4rc3RydWN0IGlub2RlX2l0ZXIge1xcbitcXHRzdHJ1Y3QgbGlzdF9oZWFkXFx0aXRlcnNfbm9kZTtcXHQvKiBzYi1cXHUwMDNlc19pbm9kZXNfaXRlcnMgKi9cXG4rXFx0c3RydWN0IGxpc3RfaGVhZFxcdCpuZXh0O1xcdFxcdC8qIG5leHQgbm9kZSBnb2luZyB0byBpdGVyYXRlICovXFxuK1xcdHVuc2lnbmVkIGludCBmbGFncztcXG4rXFx0aW5vZGVfaXRlcl9jYiBmdW5jO1xcbitcXHR2b2lkICpkYXRhO1xcbitcXHRpbnQgcmV0O1xcbit9O1xcbitcXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7XFxuIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBucl91bnVzZWQpO1xcbiBcXG5AQCAtNjQxLDEyICs2NTAsOTYgQEAgdm9pZCBpbm9kZV9zYl9saXN0X2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTtcXG4gXFxuK3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXFxuK3tcXG4rXFx0aXQtXFx1MDAzZWZsYWdzID0gZmxhZ3M7XFxuK1xcdGl0LVxcdTAwM2VmdW5jID0gZm47XFxuK1xcdGl0LVxcdTAwM2VkYXRhID0gZGF0YTtcXG4rXFx0aXQtXFx1MDAzZXJldCA9IDA7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0aXQtXFx1MDAzZW5leHQgPSBzYi1cXHUwMDNlc19pbm9kZXMubmV4dDtcXG4rXFx0bGlzdF9hZGQoXFx1MDAyNml0LVxcdTAwM2VpdGVyc19ub2RlLCBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9lbmQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbit7XFxuK1xcdGxpc3RfZGVsKFxcdTAwMjZpdC1cXHUwMDNlaXRlcnNfbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbit7XFxuK1xcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0d2hpbGUgKCFpbm9kZSBcXHUwMDI2XFx1MDAyNiBpdC1cXHUwMDNlbmV4dCAhPSBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzKSB7XFxuK1xcdFxcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cXHUwMDNlbmV4dCwgc3RydWN0IGlub2RlLCBpX3NiX2xpc3QpO1xcbitcXHRcXHRpZiAoaXQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU5PREVfSVRFUl9VTlVTRUQpIHtcXG4rXFx0XFx0XFx0aWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7XFxuK1xcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRcXHRcXHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XFxuK1xcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0XFx0XFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpdC1cXHUwMDNlbmV4dC1cXHUwMDNlbmV4dDtcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKChpdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJTk9ERV9JVEVSX05PUk1BTCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkpIHtcXG4rXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRcXHRcXHRpdC1cXHUwMDNlbmV4dCA9IGl0LVxcdTAwM2VuZXh0LVxcdTAwM2VuZXh0O1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpdC1cXHUwMDNlbmV4dC1cXHUwMDNlbmV4dDtcXG4rXFx0XFx0cmV0ID0gaXQtXFx1MDAzZWZ1bmMoaW5vZGUsIGl0LVxcdTAwM2VkYXRhKTtcXG4rXFx0XFx0aWYgKHJldCkge1xcbitcXHRcXHRcXHRpdC1cXHUwMDNlcmV0ID0gcmV0O1xcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xcbitcXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuK1xcdFxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gaXQtXFx1MDAzZW5leHQgPT0gXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlcyA/IGZhbHNlIDogdHJ1ZTtcXG4rfVxcbitcXG4raW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuK1xcdFxcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdHN0cnVjdCBpbm9kZV9pdGVyIGl0O1xcbitcXG4rXFx0aW5vZGVfc2JfaXRlcl9zdGFydChzYiwgXFx1MDAyNml0LCBmbGFncywgZm4sIGRhdGEpO1xcbitcXHR3aGlsZSAoaW5vZGVfc2JfaXRlcl9uZXh0KFxcdTAwMjZpdCwgc2IpKVxcbitcXHRcXHQ7XFxuK1xcdGlub2RlX3NiX2l0ZXJfZW5kKFxcdTAwMjZpdCwgc2IpO1xcbitcXG4rXFx0cmV0dXJuIGl0LnJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MKHNiX2Zvcl9lYWNoX2lub2Rlcyk7XFxuK1xcbiBzdGF0aWMgaW5saW5lIHZvaWQgaW5vZGVfc2JfbGlzdF9kZWwoc3RydWN0IGlub2RlICppbm9kZSlcXG4ge1xcbiBcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXFx1MDAzZWlfc2I7XFxuK1xcdHN0cnVjdCBpbm9kZV9pdGVyICppdDtcXG4gXFxuIFxcdGlmICghbGlzdF9lbXB0eShcXHUwMDI2aW5vZGUtXFx1MDAzZWlfc2JfbGlzdCkpIHtcXG4gXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0LCBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzX2l0ZXJzLCBpdGVyc19ub2RlKSB7XFxuK1xcdFxcdFxcdGlmIChpdC1cXHUwMDNlbmV4dCA9PSBcXHUwMDI2aW5vZGUtXFx1MDAzZWlfc2JfbGlzdClcXG4rXFx0XFx0XFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpbm9kZS1cXHUwMDNlaV9zYl9saXN0Lm5leHQ7XFxuK1xcdFxcdH1cXG4gXFx0XFx0bGlzdF9kZWxfaW5pdChcXHUwMDI2aW5vZGUtXFx1MDAzZWlfc2JfbGlzdCk7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiBcXHR9XFxuQEAgLTg2Niw2ICs5NTksMTcgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXFxuIFxcdH1cXG4gfVxcbiBcXG4rc3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRhdGE7XFxuK1xcbitcXHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XFxuK1xcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0bGlzdF9hZGQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xydSwgZGlzcG9zZSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbiAvKipcXG4gICogZXZpY3RfaW5vZGVzXFx0LSBldmljdCBhbGwgZXZpY3RhYmxlIGlub2RlcyBmb3IgYSBzdXBlcmJsb2NrXFxuICAqIEBzYjpcXHRcXHRzdXBlcmJsb2NrIHRvIG9wZXJhdGUgb25cXG5AQCAtODc3LDQ0ICs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXFxuICAqL1xcbiB2b2lkIGV2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcdExJU1RfSEVBRChkaXNwb3NlKTtcXG4rXFx0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUwgfCBJTk9ERV9JVEVSX1VOVVNFRDtcXG4gXFxuLWFnYWluOlxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpXFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0aWYgKGljb3VudF9yZWFkKGlub2RlKSkge1xcbi1cXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkge1xcbi1cXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XFxuLVxcdFxcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0bGlzdF9hZGQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xydSwgXFx1MDAyNmRpc3Bvc2UpO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlblxcbi1cXHRcXHQgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYVxcbi1cXHRcXHQgKiBiaXQgc28gd2UgZG9uJ3QgbGl2ZWxvY2suXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbi1cXHRcXHRcXHRkaXNwb3NlX2xpc3QoXFx1MDAyNmRpc3Bvc2UpO1xcbi1cXHRcXHRcXHRnb3RvIGFnYWluO1xcbi1cXHRcXHR9XFxuLVxcdH1cXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcbitcXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYiwgXFx1MDAyNmRpc3Bvc2UpO1xcbiBcXHRkaXNwb3NlX2xpc3QoXFx1MDAyNmRpc3Bvc2UpO1xcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGV2aWN0X2lub2Rlcyk7XFxuZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL2RxdW90LmMgYi9mcy9xdW90YS9kcXVvdC5jXFxuaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDRcXG4tLS0gYS9mcy9xdW90YS9kcXVvdC5jXFxuKysrIGIvZnMvcXVvdGEvZHF1b3QuY1xcbkBAIC0xMDQzLDY0ICsxMDQzLDQ4IEBAIHN0YXRpYyBpbnQgZHFpbml0X25lZWRlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSlcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqL1xcbi1zdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXFxuK3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXFxuIHtcXG4tXFx0c3RydWN0IGlub2RlICppbm9kZSwgKm9sZF9pbm9kZSA9IE5VTEw7XFxuK1xcdGludCB0eXBlID0gKihpbnQgKilkYXRhO1xcbitcXHRpbnQgZXJyID0gMDtcXG4rXFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVxcdTAwM2VpX3NiO1xcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXFxuIFxcdGludCByZXNlcnZlZCA9IDA7XFxuICNlbmRpZlxcbi1cXHRpbnQgZXJyID0gMDtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdGlmICgoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XFxuLVxcdFxcdCAgICAhYXRvbWljX3JlYWQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX3dyaXRlY291bnQpIHx8XFxuLVxcdFxcdCAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRfX2lnZXQoaW5vZGUpO1xcbitcXHRpZiAoIWF0b21pY19yZWFkKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV93cml0ZWNvdW50KSB8fFxcbitcXHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRfX2lnZXQoaW5vZGUpO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiBcXG4gI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVR1xcbi1cXHRcXHRpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgXFx1MDAzZSAwKSlcXG4tXFx0XFx0XFx0cmVzZXJ2ZWQgPSAxO1xcbitcXHRpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgXFx1MDAzZSAwKSlcXG4rXFx0XFx0cmVzZXJ2ZWQgPSAxO1xcbiAjZW5kaWZcXG4tXFx0XFx0aXB1dChvbGRfaW5vZGUpO1xcbi1cXHRcXHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xcbi1cXHRcXHRpZiAoZXJyKSB7XFxuLVxcdFxcdFxcdGlwdXQoaW5vZGUpO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxcbi1cXHRcXHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxcbi1cXHRcXHQgKiBzX2lub2RlX2xpc3RfbG9jay4gV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW4gYmVcXG4tXFx0XFx0ICogaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXFxuLVxcdFxcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcXG4tXFx0XFx0ICogbGF0ZXIuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRvbGRfaW5vZGUgPSBpbm9kZTtcXG4tXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0aXB1dChvbGRfaW5vZGUpO1xcbi1vdXQ6XFxuK1xcdGVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7XFxuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcXG4tXFx0aWYgKHJlc2VydmVkKSB7XFxuLVxcdFxcdHF1b3RhX2Vycm9yKHNiLCBcXFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uIFxcXCJcXG4tXFx0XFx0XFx0XFxcInRodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiBcXFwiXFxuLVxcdFxcdFxcdFxcXCJQbGVhc2UgcnVuIHF1b3RhY2hlY2soOClcXFwiKTtcXG4tXFx0fVxcbitcXHRpZiAocmVzZXJ2ZWQpXFxuK1xcdFxcdHF1b3RhX2Vycm9yKHNiLCBcXFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIFxcXCJcXG4rXFx0XFx0XFx0ICAgIFxcXCJvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5IFxcXCJcXG4rXFx0XFx0XFx0ICAgIFxcXCJpbmNvbnNpc3RlbnQuIFBsZWFzZSBydW4gcXVvdGFjaGVjayg4KVxcXCIpO1xcbiAjZW5kaWZcXG4rXFx0aXB1dChpbm9kZSk7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG4rLyogVGhpcyByb3V0aW5lIGlzIGd1YXJkZWQgYnkgc191bW91bnQgc2VtYXBob3JlICovXFxuK3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcXG4re1xcbitcXHRyZXR1cm4gc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCxcXG4rXFx0XFx0XFx0XFx0ICBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2IsIFxcdTAwMjZ0eXBlKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgcmVtb3ZlX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcXG4ge1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuY1xcbmluZGV4IDA1ZTQ0MzE3MzAzODcuLjNlMDY5MTUwYzU0NDUgMTAwNjQ0XFxuLS0tIGEvZnMvc3VwZXIuY1xcbisrKyBiL2ZzL3N1cGVyLmNcXG5AQCAtMzgyLDYgKzM4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmFsbG9jX3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBpbnQgZmxhZ3MsXFxuIFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzLVxcdTAwM2VzX3Jvb3RzX2xvY2spO1xcbiBcXHRtdXRleF9pbml0KFxcdTAwMjZzLVxcdTAwM2VzX3N5bmNfbG9jayk7XFxuIFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzLVxcdTAwM2VzX2lub2Rlcyk7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzLVxcdTAwM2VzX2lub2Rlc19pdGVycyk7XFxuIFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzLVxcdTAwM2VzX2lub2Rlc193Yik7XFxuIFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzLVxcdTAwM2VzX2lub2RlX3dibGlzdF9sb2NrKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oXFxuaW5kZXggZjlkMWUwNWU4YWU2OC4uZjMxNzZhYjEwZTY1ZiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmhcXG5AQCAtMjk2LDcgKzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7XFxuICAqL1xcbiAjZGVmaW5lIEZJTEVTWVNURU1fTUFYX1NUQUNLX0RFUFRIIDJcXG4gXFxuLS8qKiBcXG4rLyoqXFxuICAqIGVudW0gcG9zaXRpdmVfYW9wX3JldHVybnMgLSBhb3AgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lmaWMgc2VtYW50aWNzXFxuICAqXFxuICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXNcXG5AQCAtMzA2LDcgKzMwNiw3IEBAIHN0cnVjdCBpYXR0ciB7XFxuICAqIFxcdFxcdFxcdCAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyXFxuICAqIFxcdFxcdFxcdCAgICBmdXR1cmUuICBPdGhlciBjYWxsZXJzIG11c3QgYmUgY2FyZWZ1bCB0byB1bmxvY2tcXG4gICogXFx0XFx0XFx0ICAgIHRoZSBwYWdlIGlmIHRoZXkgZ2V0IHRoaXMgcmV0dXJuLiAgUmV0dXJuZWQgYnlcXG4tICogXFx0XFx0XFx0ICAgIHdyaXRlcGFnZSgpOyBcXG4rICpcXHRcXHRcXHQgICAgd3JpdGVwYWdlKCk7XFxuICAqXFxuICAqIEBBT1BfVFJVTkNBVEVEX1BBR0U6IFRoZSBBT1AgbWV0aG9kIHRoYXQgd2FzIGhhbmRlZCBhIGxvY2tlZCBwYWdlIGhhc1xcbiAgKiAgXFx0XFx0XFx0dW5sb2NrZWQgaXQgYW5kIHRoZSBwYWdlIG1pZ2h0IGhhdmUgYmVlbiB0cnVuY2F0ZWQuXFxuQEAgLTg3MCw2ICs4NzAsMjEgQEAgc3RydWN0IGlub2RlIHtcXG4gXFx0dm9pZFxcdFxcdFxcdCppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi9cXG4gfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XFxuIFxcbitlbnVtIGlub2RlX2l0ZXJfZmxhZ3NfZW51bSB7XFxuK1xcdElOT0RFX0lURVJfTk9STUFMID0gKDFVIFxcdTAwM2NcXHUwMDNjIDEpLCAgLyogRXhjbHVkZSBpbm9kZXMgd2l0aCAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkuICovXFxuK1xcdElOT0RFX0lURVJfVU5VU0VEID0gKDFVIFxcdTAwM2NcXHUwMDNjIDIpLCAgLyogT25seSByZXR1cm4gaW5vZGVzIHdpdGggKGlfY291bnQgPT0gMCkuICovXFxuK307XFxuK1xcbisvKlxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kXFxuKyAqICBpbm9kZS1cXHUwMDNlaV9sb2NrICAgICAgICAgICAgICBsb2NrZWQgICAgICAgICB1bmxvY2tlZFxcbisgKiAgc2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrICAgICAgbG9ja2VkICAgICAgICAgbG9ja2VkXFxuKyAqL1xcbit0eXBlZGVmIGludCAoKmlub2RlX2l0ZXJfY2IpIChzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTtcXG4rXFxuK2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLFxcbitcXHRcXHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSk7XFxuK1xcbiAvKlxcbiAgKiBpX3N0YXRlIGhhbmRsaW5nXFxuICAqXFxuQEAgLTEzMTUsOCArMTMzMCwxMCBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X2ZpbGVfYWN0aXZlKHN0cnVjdCBmaWxlICoqZik7XFxuIFxcbiAjZGVmaW5lXFx0TUFYX05PTl9MRlNcXHQoKDFVTFxcdTAwM2NcXHUwMDNjMzEpIC0gMSlcXG4gXFxuLS8qIFBhZ2UgY2FjaGUgbGltaXQuIFRoZSBmaWxlc3lzdGVtcyBzaG91bGQgcHV0IHRoYXQgaW50byB0aGVpciBzX21heGJ5dGVzIFxcbi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIFxcbisvKlxcbisgKiBQYWdlIGNhY2hlIGxpbWl0LiBUaGUgZmlsZXN5c3RlbXMgc2hvdWxkIHB1dCB0aGF0IGludG8gdGhlaXIgc19tYXhieXRlc1xcbisgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uXFxuKyAqL1xcbiAjaWYgQklUU19QRVJfTE9ORz09MzJcXG4gI2RlZmluZSBNQVhfTEZTX0ZJTEVTSVpFXFx0KChsb2ZmX3QpVUxPTkdfTUFYIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpXFxuICNlbGlmIEJJVFNfUEVSX0xPTkc9PTY0XFxuQEAgLTIyODUsNyArMjMwMiw3IEBAIGludCBzeW5jX2lub2RlX21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KTtcXG4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUge1xcbiBcXHRjb25zdCBjaGFyICpuYW1lO1xcbiBcXHRpbnQgZnNfZmxhZ3M7XFxuLSNkZWZpbmUgRlNfUkVRVUlSRVNfREVWXFx0XFx0MSBcXG4rI2RlZmluZSBGU19SRVFVSVJFU19ERVZcXHRcXHQxXFxuICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQVxcdDJcXG4gI2RlZmluZSBGU19IQVNfU1VCVFlQRVxcdFxcdDRcXG4gI2RlZmluZSBGU19VU0VSTlNfTU9VTlRcXHRcXHQ4XFx0LyogQ2FuIGJlIG1vdW50ZWQgYnkgdXNlcm5zIHJvb3QgKi9cXG5AQCAtMjkwNyw3ICsyOTI0LDcgQEAgc3NpemVfdCBfX2tlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpO1xcbiBleHRlcm4gc3NpemVfdCBrZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTtcXG4gZXh0ZXJuIHNzaXplX3QgX19rZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTtcXG4gZXh0ZXJuIHN0cnVjdCBmaWxlICogb3Blbl9leGVjKGNvbnN0IGNoYXIgKik7XFxuLSBcXG4rXFxuIC8qIGZzL2RjYWNoZS5jIC0tIGdlbmVyaWMgZnMgc3VwcG9ydCBmdW5jdGlvbnMgKi9cXG4gZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTtcXG4gZXh0ZXJuIGJvb2wgcGF0aF9pc191bmRlcihjb25zdCBzdHJ1Y3QgcGF0aCAqLCBjb25zdCBzdHJ1Y3QgcGF0aCAqKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXFxuaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhcXG5AQCAtMjY5LDkgKzI2OSwxMCBAQCBzdHJ1Y3Qgc3VwZXJfYmxvY2sge1xcbiBcXHQgKi9cXG4gXFx0aW50IHNfc3RhY2tfZGVwdGg7XFxuIFxcbi1cXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyAqL1xcbitcXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyBhbmQgc19pbm9kZXNfaXRlcnMgKi9cXG4gXFx0c3BpbmxvY2tfdFxcdFxcdFxcdFxcdHNfaW5vZGVfbGlzdF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7XFxuIFxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRcXHRzX2lub2RlcztcXHQvKiBhbGwgaW5vZGVzICovXFxuK1xcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRcXHRzX2lub2Rlc19pdGVyczsgLyogYWxsIGl0ZXJhdG9ycyAqL1xcbiBcXG4gXFx0c3BpbmxvY2tfdFxcdFxcdFxcdFxcdHNfaW5vZGVfd2JsaXN0X2xvY2s7XFxuIFxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRcXHRzX2lub2Rlc193YjtcXHQvKiB3cml0ZWJhY2sgaW5vZGVzICovXFxuZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmMgYi9zZWN1cml0eS9sYW5kbG9jay9mcy5jXFxuaW5kZXggMzBhYTZjZTEzNTkwYS4uM2RjZGU4Y2JmYjZhZiAxMDA2NDRcXG4tLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jXFxuKysrIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuY1xcbkBAIC0xMzY5LDExMCArMTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KVxcbiBcXG4gLyogU3VwZXItYmxvY2sgaG9va3MgKi9cXG4gXFxuLS8qXFxuLSAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5Llxcbi0gKlxcbi0gKiBDZi4gZnNub3RpZnlfdW5tb3VudF9pbm9kZXMoKSBhbmQgZXZpY3RfaW5vZGVzKClcXG4tICovXFxuLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXFxuK3N0YXRpYyBpbnQgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpwcmV2X2lub2RlID0gTlVMTDtcXG4rXFx0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xcbitcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXFx1MDAzZWlfc2I7XFxuIFxcbi1cXHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxcbi1cXHRcXHRyZXR1cm47XFxuK1xcdGlmICghYXRvbWljX3JlYWQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX2NvdW50KSkge1xcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRzdHJ1Y3QgbGFuZGxvY2tfb2JqZWN0ICpvYmplY3Q7XFxuK1xcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0b2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cXHUwMDNlb2JqZWN0KTtcXG4rXFx0aWYgKCFvYmplY3QpIHtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFx0LyogS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhpcyBpbm9kZSB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuICovXFxuK1xcdF9faWdldChpbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gXFxuLVxcdFxcdC8qIE9ubHkgaGFuZGxlcyByZWZlcmVuY2VkIGlub2Rlcy4gKi9cXG4tXFx0XFx0aWYgKCFpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2VcXG4rXFx0ICogYXJlIGluIGNoYXJnZSBvZiBjYWxsaW5nIGlwdXQoKSBvbiB0aGlzIGlub2RlLCBvdGhlcndpc2Ugd2VcXG4rXFx0ICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC5cXG4rXFx0ICovXFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2b2JqZWN0LVxcdTAwM2Vsb2NrKTtcXG4rXFx0aWYgKG9iamVjdC1cXHUwMDNldW5kZXJvYmogPT0gaW5vZGUpIHtcXG4rXFx0XFx0b2JqZWN0LVxcdTAwM2V1bmRlcm9iaiA9IE5VTEw7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZvYmplY3QtXFx1MDAzZWxvY2spO1xcbitcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFByb3RlY3RzIGFnYWluc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgaW5vZGUgKGUuZy5cXG4tXFx0XFx0ICogZnJvbSBnZXRfaW5vZGVfb2JqZWN0KCkpLlxcbitcXHRcXHQgKiBCZWNhdXNlIG9iamVjdC1cXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxcbitcXHRcXHQgKiByZWxlYXNlX2lub2RlKCkgYW5kIGdldF9pbm9kZV9vYmplY3QoKSBndWFyYW50ZWVcXG4rXFx0XFx0ICogdGhhdCBpdCBpcyBzYWZlIHRvIHJlc2V0XFxuK1xcdFxcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cXHUwMDNlb2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLlxcbitcXHRcXHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVxcdTAwM2VpX2xvY2suXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVxcdTAwM2VvYmplY3QsIE5VTEwpO1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZVxcbi1cXHRcXHQgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaFxcbi1cXHRcXHQgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS1cXHUwMDNlc2VjdXJpdHkgb3IgYVxcbi1cXHRcXHQgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc29cXG4tXFx0XFx0ICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuXFxuK1xcdFxcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcXG4rXFx0XFx0ICogb3JpZ2luYWxseSBzZXQgdXAgYnkgZ2V0X2lub2RlX29iamVjdCgpIGFuZCB0aGVcXG4rXFx0XFx0ICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wXFxuK1xcdFxcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXFxuK1xcdFxcdCAqIG9uIHRoZSBpbm9kZS5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2XFxuLVxcdFxcdCAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbitcXHRcXHRpcHV0X25vdF9sYXN0KGlub2RlKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNm9iamVjdC1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuLVxcdFxcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXFx1MDAzZW9iamVjdCk7XFxuLVxcdFxcdGlmICghb2JqZWN0KSB7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbi1cXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcdFxcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xcbi1cXHRcXHRfX2lnZXQoaW5vZGUpO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRpcHV0KGlub2RlKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZVxcbi1cXHRcXHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxcbi1cXHRcXHQgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZvYmplY3QtXFx1MDAzZWxvY2spO1xcbi1cXHRcXHRpZiAob2JqZWN0LVxcdTAwM2V1bmRlcm9iaiA9PSBpbm9kZSkge1xcbi1cXHRcXHRcXHRvYmplY3QtXFx1MDAzZXVuZGVyb2JqID0gTlVMTDtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNm9iamVjdC1cXHUwMDNlbG9jayk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQmVjYXVzZSBvYmplY3QtXFx1MDAzZXVuZGVyb2JqIHdhcyBub3QgTlVMTCxcXG4tXFx0XFx0XFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXFxuLVxcdFxcdFxcdCAqIHRoYXQgaXQgaXMgc2FmZSB0byByZXNldFxcbi1cXHRcXHRcXHQgKiBsYW5kbG9ja19pbm9kZShpbm9kZSktXFx1MDAzZW9iamVjdCB3aGlsZSBpdCBpcyBub3QgTlVMTC5cXG4tXFx0XFx0XFx0ICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS1cXHUwMDNlaV9sb2NrLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cXHUwMDNlb2JqZWN0LCBOVUxMKTtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQXQgdGhpcyBwb2ludCwgd2Ugb3duIHRoZSBpaG9sZCgpIHJlZmVyZW5jZSB0aGF0IHdhc1xcbi1cXHRcXHRcXHQgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZVxcbi1cXHRcXHRcXHQgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3BcXG4tXFx0XFx0XFx0ICogd2Fsay4gIFRoZXJlZm9yZSB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHJlZmVyZW5jZXNcXG4tXFx0XFx0XFx0ICogb24gdGhlIGlub2RlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aXB1dF9ub3RfbGFzdChpbm9kZSk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZvYmplY3QtXFx1MDAzZWxvY2spO1xcbi1cXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4tXFx0XFx0fVxcbisvKlxcbisgKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cXG4rICpcXG4rICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMO1xcbiBcXG4tXFx0XFx0aWYgKHByZXZfaW5vZGUpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgb3duIHRoZSBfX2lnZXQoKSByZWZlcmVuY2VcXG4tXFx0XFx0XFx0ICogdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3Agd2Fsay4gIFRoZXJlZm9yZSB3ZVxcbi1cXHRcXHRcXHQgKiBjYW4gZHJvcCB0aGUgbGlzdCBsb2NrIGFuZCBrbm93IHRoYXQgdGhlIGlub2RlIHdvbid0XFxuLVxcdFxcdFxcdCAqIGRpc2FwcGVhciBmcm9tIHVuZGVyIHVzIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlXFxuLVxcdFxcdFxcdCAqIHByZXZpb3VzIGxvb3Agd2Fsaywgd2hpY2ggaXMgbm90IG5lZWRlZCBhbnltb3JlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aXB1dChwcmV2X2lub2RlKTtcXG4tXFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuLVxcdFxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRwcmV2X2lub2RlID0gaW5vZGU7XFxuLVxcdH1cXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcdGlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGhvb2tfc2JfZGVsZXRlX2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xcbiBcXG4tXFx0LyogUHV0cyB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlIGxhc3QgbG9vcCB3YWxrLCBpZiBhbnkuICovXFxuLVxcdGlmIChwcmV2X2lub2RlKVxcbi1cXHRcXHRpcHV0KHByZXZfaW5vZGUpO1xcbiBcXHQvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqL1xcbiBcXHR3YWl0X3Zhcl9ldmVudChcXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXFx1MDAzZWlub2RlX3JlZnMsXFxuIFxcdFxcdCAgICAgICAhYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXFx1MDAzZWlub2RlX3JlZnMpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NDQuNzkzNjg3NTkzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMjQxMTI2MjU5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJRVU9UQVwiLFxuICAgIFwiR0ZTMl9GU1wiLFxuICAgIFwiU0VDVVJJVFlfTEFORExPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzYl9mb3JfZWFjaF9pbm9kZXNcIixcbiAgICBcImV2aWN0X2lub2Rlc1wiLFxuICAgIFwic3luY19iZGV2c1wiLFxuICAgIFwiZHJvcF9wYWdlY2FjaGVfc2JcIixcbiAgICBcImFkZF9kcXVvdF9yZWZcIixcbiAgICBcImdmczJfZXZpY3RfaW5vZGVzXCIsXG4gICAgXCJob29rX3NiX2RlbGV0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gZnJhbWV3b3JrIChzYl9mb3JfZWFjaF9pbm9kZXMpIHdpdGggZHluYW1pYyBpdGVyYXRvciBsaXN0IHRyYWNraW5nIChzX2lub2Rlc19pdGVycykgYW5kIHVwZGF0ZXMgdHJhdmVyc2FsIGxvb3BzIGluIFZGUyAoZXZpY3RfaW5vZGVzLCBkcm9wX2NhY2hlcyksIGJsb2NrIGRldmljZXMgKHN5bmNfYmRldnMpLCBxdW90YXMgKGFkZF9kcXVvdF9yZWYpLCBHRlMyIChnZnMyX2V2aWN0X2lub2RlcyksIGFuZCBMYW5kbG9jayAoaG9va19zYl9kZWxldGUpLiBUaGlzIHNpZ25pZmljYW50bHkgYWx0ZXJzIGxvY2tpbmcsIGxpc3QgbXV0YXRpb24gZHVyaW5nIHRyYXZlcnNhbCwgYW5kIHJlZmNvdW50aW5nIGFjcm9zcyBjb3JlIHN1YnN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciByYWNlcywgbGlzdCBjb3JydXB0aW9ucywgb3IgZGVhZGxvY2tzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI0NmUzZDk2YzlhMTcxMDcyMGI4M2IzOWU5ZmZhMTI2Zjk4ODBkNjVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDExOjEwOjQxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmRldi5jIGIvYmxvY2svYmRldi5jXG5pbmRleCBjZDgzMjMwODM3NDA2Li5hZTQ3MmEwNjJlNTFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmRldi5jXG4rKysgYi9ibG9jay9iZGV2LmNcbkBAIC0xMzM2LDU2ICsxMzM2LDUzIEBAIHZvaWQgYmRldl9tYXJrX2RlYWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgYm9vbCBzdXJwcmlzZSlcbiAgKi9cbiBFWFBPUlRfU1lNQk9MX0dQTChiZGV2X21hcmtfZGVhZCk7XG4gXG4tdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbitzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXHUwMDNlaV9tYXBwaW5nO1xuLVx0XHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2O1xuK1x0Ym9vbCB3YWl0ID0gKGJvb2wpZGF0YTtcbitcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbiBcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpIHx8XG4tXHRcdCAgICBtYXBwaW5nLVx1MDAzZW5ycGFnZXMgPT0gMCkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbitcdGlmIChtYXBwaW5nLVx1MDAzZW5ycGFnZXMgPT0gMCkge1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxuK1x0ICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGVcbitcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLlxuK1x0ICovXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0YmRldiA9IElfQkRFVihpbm9kZSk7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbitcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2YmRldi1cdTAwM2ViZF9vcGVuZXJzKSkge1xuK1x0XHQ7IC8qIHNraXAgKi9cbitcdH0gZWxzZSBpZiAod2FpdCkge1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICdpbm9kZScgc28gaXQgY291bGRuJ3QgaGF2ZSBiZWVuXG4tXHRcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrICBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhblxuLVx0XHQgKiBiZSBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXJcbi1cdFx0ICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdFxuLVx0XHQgKiBsYXRlci5cbitcdFx0ICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzb1xuK1x0XHQgKiB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY2F0Y2ggdGhlIHdyaXRlYmFjayBlcnJvciB1c2luZ1xuK1x0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4rXHRcdCAqIGRldGFpbHMuXG4gXHRcdCAqL1xuLVx0XHRpcHV0KG9sZF9pbm9kZSk7XG4tXHRcdG9sZF9pbm9kZSA9IGlub2RlO1xuLVx0XHRiZGV2ID0gSV9CREVWKGlub2RlKTtcbi1cbi1cdFx0bXV0ZXhfbG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4tXHRcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2YmRldi1cdTAwM2ViZF9vcGVuZXJzKSkge1xuLVx0XHRcdDsgLyogc2tpcCAqL1xuLVx0XHR9IGVsc2UgaWYgKHdhaXQpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc29cbi1cdFx0XHQgKiB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY2F0Y2ggdGhlIHdyaXRlYmFjayBlcnJvciB1c2luZ1xuLVx0XHRcdCAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3Jcbi1cdFx0XHQgKiBkZXRhaWxzLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4tXHRcdH1cbi1cdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbi1cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuK1x0fSBlbHNlIHtcbitcdFx0ZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGlwdXQob2xkX2lub2RlKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4rXHRpcHV0KGlub2RlKTtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIHN5bmNfYmRldnMoYm9vbCB3YWl0KVxuK3tcbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhibG9ja2Rldl9zdXBlcmJsb2NrLCBJTk9ERV9JVEVSX05PUk1BTCxcbitcdFx0XHQgICBzeW5jX2JkZXZzX2lub2RlX2l0ZXJfY2IsICh2b2lkICopd2FpdCk7XG4gfVxuIFxuIC8qXG5kaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmNcbmluZGV4IDQ5ZjU2YTU5OGVjYmMuLjBkNDc1YTVmZjhjZmIgMTAwNjQ0XG4tLS0gYS9mcy9kcm9wX2NhY2hlcy5jXG4rKysgYi9mcy9kcm9wX2NhY2hlcy5jXG5AQCAtMTYsMzYgKzE2LDMwIEBAXG4gLyogQSBnbG9iYWwgdmFyaWFibGUgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGtlZXBzIHRoZSBjb2RlIHNpbXBsZSAqL1xuIHN0YXRpYyBpbnQgc3lzY3RsX2Ryb3BfY2FjaGVzO1xuIFxuLXN0YXRpYyB2b2lkIGRyb3BfcGFnZWNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnVudXNlZClcbitzdGF0aWMgaW50IGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHQvKlxuLVx0XHQgKiBXZSBtdXN0IHNraXAgaW5vZGVzIGluIHVudXN1YWwgc3RhdGUuIFdlIG1heSBhbHNvIHNraXBcbi1cdFx0ICogaW5vZGVzIHdpdGhvdXQgcGFnZXMgYnV0IHdlIGRlbGliZXJhdGVseSB3b24ndCBpbiBjYXNlXG4tXHRcdCAqIHdlIG5lZWQgdG8gcmVzY2hlZHVsZSB0byBhdm9pZCBzb2Z0bG9ja3Vwcy5cbi1cdFx0ICovXG4tXHRcdGlmICgoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHxcbi1cdFx0ICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLVx1MDAzZWlfbWFwcGluZykgXHUwMDI2XHUwMDI2ICFuZWVkX3Jlc2NoZWQoKSkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdF9faWdldChpbm9kZSk7XG4rXHRpZiAobWFwcGluZ19lbXB0eShpbm9kZS1cdTAwM2VpX21hcHBpbmcpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbi1cdFx0aW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLVx1MDAzZWlfbWFwcGluZywgMCwgLTEpO1xuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuIFx0fVxuK1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KHRvcHV0X2lub2RlKTtcbitcbitcdGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS1cdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcbitcdGlwdXQoaW5vZGUpO1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXG4re1xuK1x0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcbmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19mc3R5cGUuYyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG5pbmRleCA3MThlMGRhN2RmY2UwLi5hY2RiZjljYTQ0YTNmIDEwMDY0NFxuLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmNcbisrKyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG5AQCAtOTk2LDcgKzk5Niw3IEBAIHN0YXRpYyBpbnQgZ2ZzMl9sbV9tb3VudChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHNpbGVudClcbiBcdFx0c3dpdGNoICh0b2tlbikge1xuIFx0XHRjYXNlIE9wdF9qaWQ6XG4gXHRcdFx0cmV0ID0gbWF0Y2hfaW50KFx1MDAyNnRtcFswXSwgXHUwMDI2b3B0aW9uKTtcbi1cdFx0XHRpZiAocmV0IHx8IG9wdGlvbiBcdTAwM2MgMCkgXG4rXHRcdFx0aWYgKHJldCB8fCBvcHRpb24gXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGhvc3RkYXRhX2Vycm9yO1xuIFx0XHRcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpKVxuIFx0XHRcdFx0bHMtXHUwMDNlbHNfamlkID0gb3B0aW9uO1xuQEAgLTE3MTksNiArMTcxOSwxOSBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyBpbnQgZ2ZzMl9ldmljdF9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnVudXNlZClcbit7XG4rXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbitcbitcdF9faWdldChpbm9kZSk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1xuK1x0aXB1dChpbm9kZSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIC8qKlxuICAqIGdmczJfZXZpY3RfaW5vZGVzIC0gZXZpY3QgaW5vZGVzIGNvb3BlcmF0aXZlbHlcbiAgKiBAc2I6IHRoZSBzdXBlcmJsb2NrXG5AQCAtMTc0MSwzMSArMTc1NCwxMCBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuICAqL1xuIHN0YXRpYyB2b2lkIGdmczJfZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItXHUwMDNlc19mc19pbmZvO1xuIFxuIFx0c2V0X2JpdChTREZfRVZJQ1RJTkcsIFx1MDAyNnNkcC1cdTAwM2VzZF9mbGFncyk7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KHRvcHV0X2lub2RlKTtcbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jXG5pbmRleCBiYTdkYTM5YmU0YTMxLi4wN2E1ZjQ4NjQxYWY4IDEwMDY0NFxuLS0tIGEvZnMvaW5vZGUuY1xuKysrIGIvZnMvaW5vZGUuY1xuQEAgLTY5LDYgKzY5LDE1IEBAIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZW1wdHlfYW9wcyA9IHtcbiB9O1xuIEVYUE9SVF9TWU1CT0woZW1wdHlfYW9wcyk7XG4gXG4rc3RydWN0IGlub2RlX2l0ZXIge1xuK1x0c3RydWN0IGxpc3RfaGVhZFx0aXRlcnNfbm9kZTtcdC8qIHNiLVx1MDAzZXNfaW5vZGVzX2l0ZXJzICovXG4rXHRzdHJ1Y3QgbGlzdF9oZWFkXHQqbmV4dDtcdFx0LyogbmV4dCBub2RlIGdvaW5nIHRvIGl0ZXJhdGUgKi9cbitcdHVuc2lnbmVkIGludCBmbGFncztcbitcdGlub2RlX2l0ZXJfY2IgZnVuYztcbitcdHZvaWQgKmRhdGE7XG4rXHRpbnQgcmV0O1xuK307XG4rXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7XG4gc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX3VudXNlZCk7XG4gXG5AQCAtNjQxLDEyICs2NTAsOTYgQEAgdm9pZCBpbm9kZV9zYl9saXN0X2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChpbm9kZV9zYl9saXN0X2FkZCk7XG4gXG4rc3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9zdGFydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsXG4rXHRcdFx0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXG4re1xuK1x0aXQtXHUwMDNlZmxhZ3MgPSBmbGFncztcbitcdGl0LVx1MDAzZWZ1bmMgPSBmbjtcbitcdGl0LVx1MDAzZWRhdGEgPSBkYXRhO1xuK1x0aXQtXHUwMDNlcmV0ID0gMDtcbitcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRpdC1cdTAwM2VuZXh0ID0gc2ItXHUwMDNlc19pbm9kZXMubmV4dDtcbitcdGxpc3RfYWRkKFx1MDAyNml0LVx1MDAzZWl0ZXJzX25vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9lbmQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3tcbitcdGxpc3RfZGVsKFx1MDAyNml0LVx1MDAzZWl0ZXJzX25vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK31cbitcbitzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3tcbitcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xuK1x0aW50IHJldDtcbitcbitcdHdoaWxlICghaW5vZGUgXHUwMDI2XHUwMDI2IGl0LVx1MDAzZW5leHQgIT0gXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMpIHtcbitcdFx0aW5vZGUgPSBsaXN0X2VudHJ5KGl0LVx1MDAzZW5leHQsIHN0cnVjdCBpbm9kZSwgaV9zYl9saXN0KTtcbitcdFx0aWYgKGl0LVx1MDAzZWZsYWdzIFx1MDAyNiBJTk9ERV9JVEVSX1VOVVNFRCkge1xuK1x0XHRcdGlmIChpY291bnRfcmVhZF9vbmNlKGlub2RlKSkge1xuK1x0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcbitcdFx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0XHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XG4rXHRcdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcdFx0fSBlbHNlIHtcbitcdFx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0fVxuK1xuK1x0XHRpZiAoKGl0LVx1MDAzZWZsYWdzIFx1MDAyNiBJTk9ERV9JVEVSX05PUk1BTCkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkpIHtcbitcdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcbitcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbitcdFx0cmV0ID0gaXQtXHUwMDNlZnVuYyhpbm9kZSwgaXQtXHUwMDNlZGF0YSk7XG4rXHRcdGlmIChyZXQpIHtcbitcdFx0XHRpdC1cdTAwM2VyZXQgPSByZXQ7XG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xuK1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbitcdFx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcyA/IGZhbHNlIDogdHJ1ZTtcbit9XG4rXG4raW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4rXHRcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxuK3tcbitcdHN0cnVjdCBpbm9kZV9pdGVyIGl0O1xuK1xuK1x0aW5vZGVfc2JfaXRlcl9zdGFydChzYiwgXHUwMDI2aXQsIGZsYWdzLCBmbiwgZGF0YSk7XG4rXHR3aGlsZSAoaW5vZGVfc2JfaXRlcl9uZXh0KFx1MDAyNml0LCBzYikpXG4rXHRcdDtcbitcdGlub2RlX3NiX2l0ZXJfZW5kKFx1MDAyNml0LCBzYik7XG4rXG4rXHRyZXR1cm4gaXQucmV0O1xuK31cbitFWFBPUlRfU1lNQk9MKHNiX2Zvcl9lYWNoX2lub2Rlcyk7XG4rXG4gc3RhdGljIGlubGluZSB2b2lkIGlub2RlX3NiX2xpc3RfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4ge1xuIFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4rXHRzdHJ1Y3QgaW5vZGVfaXRlciAqaXQ7XG4gXG4gXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2aW5vZGUtXHUwMDNlaV9zYl9saXN0KSkge1xuIFx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0LCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycywgaXRlcnNfbm9kZSkge1xuK1x0XHRcdGlmIChpdC1cdTAwM2VuZXh0ID09IFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdClcbitcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpbm9kZS1cdTAwM2VpX3NiX2xpc3QubmV4dDtcbitcdFx0fVxuIFx0XHRsaXN0X2RlbF9pbml0KFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdCk7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdH1cbkBAIC04NjYsNiArOTU5LDE3IEBAIHN0YXRpYyB2b2lkIGRpc3Bvc2VfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKVxuIFx0fVxuIH1cbiBcbitzdGF0aWMgaW50IGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG4re1xuK1x0c3RydWN0IGxpc3RfaGVhZCAqZGlzcG9zZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGF0YTtcbitcbitcdGlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTtcbitcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9scnUsIGRpc3Bvc2UpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIC8qKlxuICAqIGV2aWN0X2lub2Rlc1x0LSBldmljdCBhbGwgZXZpY3RhYmxlIGlub2RlcyBmb3IgYSBzdXBlcmJsb2NrXG4gICogQHNiOlx0XHRzdXBlcmJsb2NrIHRvIG9wZXJhdGUgb25cbkBAIC04NzcsNDQgKzk4MSwxMCBAQCBzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZClcbiAgKi9cbiB2b2lkIGV2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRMSVNUX0hFQUQoZGlzcG9zZSk7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJTk9ERV9JVEVSX05PUk1BTCB8IElOT0RFX0lURVJfVU5VU0VEO1xuIFxuLWFnYWluOlxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0aWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKGljb3VudF9yZWFkKGlub2RlKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXG4tXHRcdGlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTtcbi1cdFx0aW5vZGVfbHJ1X2xpc3RfZGVsKGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9scnUsIFx1MDAyNmRpc3Bvc2UpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gaGF2ZSBhIHRvbiBvZiBpbm9kZXMgdG8gZXZpY3QgYXQgdW5tb3VudCB0aW1lIGdpdmVuXG4tXHRcdCAqIGVub3VnaCBtZW1vcnksIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGdvIHRvIHNsZWVwIGZvciBhXG4tXHRcdCAqIGJpdCBzbyB3ZSBkb24ndCBsaXZlbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0XHRkaXNwb3NlX2xpc3QoXHUwMDI2ZGlzcG9zZSk7XG4tXHRcdFx0Z290byBhZ2Fpbjtcbi1cdFx0fVxuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuK1x0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsIFx1MDAyNmRpc3Bvc2UpO1xuIFx0ZGlzcG9zZV9saXN0KFx1MDAyNmRpc3Bvc2UpO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChldmljdF9pbm9kZXMpO1xuZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL2RxdW90LmMgYi9mcy9xdW90YS9kcXVvdC5jXG5pbmRleCAyMDRhZmM1ZTk4NGJjLi43N2M2ODE0OWQ0YWU0IDEwMDY0NFxuLS0tIGEvZnMvcXVvdGEvZHF1b3QuY1xuKysrIGIvZnMvcXVvdGEvZHF1b3QuY1xuQEAgLTEwNDMsNjQgKzEwNDMsNDggQEAgc3RhdGljIGludCBkcWluaXRfbmVlZGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqL1xuLXN0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcbitzdGF0aWMgaW50IGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuK1x0aW50IHR5cGUgPSAqKGludCAqKWRhdGE7XG4rXHRpbnQgZXJyID0gMDtcbitcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbiBcdGludCByZXNlcnZlZCA9IDA7XG4gI2VuZGlmXG4tXHRpbnQgZXJyID0gMDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XG4tXHRcdCAgICAhYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuLVx0XHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRfX2lnZXQoaW5vZGUpO1xuK1x0aWYgKCFhdG9taWNfcmVhZChcdTAwMjZpbm9kZS1cdTAwM2VpX3dyaXRlY291bnQpIHx8XG4rXHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXG4tXHRcdGlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSBcdTAwM2UgMCkpXG4tXHRcdFx0cmVzZXJ2ZWQgPSAxO1xuK1x0aWYgKHVubGlrZWx5KGlub2RlX2dldF9yc3Zfc3BhY2UoaW5vZGUpIFx1MDAzZSAwKSlcbitcdFx0cmVzZXJ2ZWQgPSAxO1xuICNlbmRpZlxuLVx0XHRpcHV0KG9sZF9pbm9kZSk7XG4tXHRcdGVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7XG4tXHRcdGlmIChlcnIpIHtcbi1cdFx0XHRpcHV0KGlub2RlKTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICdpbm9kZScgc28gaXQgY291bGRuJ3QgaGF2ZSBiZWVuXG4tXHRcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbiBiZVxuLVx0XHQgKiBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXJcbi1cdFx0ICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdFxuLVx0XHQgKiBsYXRlci5cbi1cdFx0ICovXG4tXHRcdG9sZF9pbm9kZSA9IGlub2RlO1xuLVx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGlwdXQob2xkX2lub2RlKTtcbi1vdXQ6XG4rXHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbi1cdGlmIChyZXNlcnZlZCkge1xuLVx0XHRxdW90YV9lcnJvcihzYiwgXCJXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgb24gXCJcbi1cdFx0XHRcInRodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiBcIlxuLVx0XHRcdFwiUGxlYXNlIHJ1biBxdW90YWNoZWNrKDgpXCIpO1xuLVx0fVxuK1x0aWYgKHJlc2VydmVkKVxuK1x0XHRxdW90YV9lcnJvcihzYiwgXCJXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgXCJcbitcdFx0XHQgICAgXCJvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5IFwiXG4rXHRcdFx0ICAgIFwiaW5jb25zaXN0ZW50LiBQbGVhc2UgcnVuIHF1b3RhY2hlY2soOClcIik7XG4gI2VuZGlmXG4rXHRpcHV0KGlub2RlKTtcbitcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbisvKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBzX3Vtb3VudCBzZW1hcGhvcmUgKi9cbitzdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4re1xuK1x0cmV0dXJuIHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsXG4rXHRcdFx0XHQgIGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYiwgXHUwMDI2dHlwZSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHJlbW92ZV9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuY1xuaW5kZXggMDVlNDQzMTczMDM4Ny4uM2UwNjkxNTBjNTQ0NSAxMDA2NDRcbi0tLSBhL2ZzL3N1cGVyLmNcbisrKyBiL2ZzL3N1cGVyLmNcbkBAIC0zODIsNiArMzgyLDcgQEAgc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsIGludCBmbGFncyxcbiBcdHNwaW5fbG9ja19pbml0KFx1MDAyNnMtXHUwMDNlc19yb290c19sb2NrKTtcbiBcdG11dGV4X2luaXQoXHUwMDI2cy1cdTAwM2VzX3N5bmNfbG9jayk7XG4gXHRJTklUX0xJU1RfSEVBRChcdTAwMjZzLVx1MDAzZXNfaW5vZGVzKTtcbitcdElOSVRfTElTVF9IRUFEKFx1MDAyNnMtXHUwMDNlc19pbm9kZXNfaXRlcnMpO1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2cy1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXHRJTklUX0xJU1RfSEVBRChcdTAwMjZzLVx1MDAzZXNfaW5vZGVzX3diKTtcbiBcdHNwaW5fbG9ja19pbml0KFx1MDAyNnMtXHUwMDNlc19pbm9kZV93Ymxpc3RfbG9jayk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oXG5pbmRleCBmOWQxZTA1ZThhZTY4Li5mMzE3NmFiMTBlNjVmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmhcbkBAIC0yOTYsNyArMjk2LDcgQEAgc3RydWN0IGlhdHRyIHtcbiAgKi9cbiAjZGVmaW5lIEZJTEVTWVNURU1fTUFYX1NUQUNLX0RFUFRIIDJcbiBcbi0vKiogXG4rLyoqXG4gICogZW51bSBwb3NpdGl2ZV9hb3BfcmV0dXJucyAtIGFvcCByZXR1cm4gY29kZXMgd2l0aCBzcGVjaWZpYyBzZW1hbnRpY3NcbiAgKlxuICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXNcbkBAIC0zMDYsNyArMzA2LDcgQEAgc3RydWN0IGlhdHRyIHtcbiAgKiBcdFx0XHQgICAgYmUgYSBjYW5kaWRhdGUgZm9yIHdyaXRlYmFjayBhZ2FpbiBpbiB0aGUgbmVhclxuICAqIFx0XHRcdCAgICBmdXR1cmUuICBPdGhlciBjYWxsZXJzIG11c3QgYmUgY2FyZWZ1bCB0byB1bmxvY2tcbiAgKiBcdFx0XHQgICAgdGhlIHBhZ2UgaWYgdGhleSBnZXQgdGhpcyByZXR1cm4uICBSZXR1cm5lZCBieVxuLSAqIFx0XHRcdCAgICB3cml0ZXBhZ2UoKTsgXG4rICpcdFx0XHQgICAgd3JpdGVwYWdlKCk7XG4gICpcbiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXNcbiAgKiAgXHRcdFx0dW5sb2NrZWQgaXQgYW5kIHRoZSBwYWdlIG1pZ2h0IGhhdmUgYmVlbiB0cnVuY2F0ZWQuXG5AQCAtODcwLDYgKzg3MCwyMSBAQCBzdHJ1Y3QgaW5vZGUge1xuIFx0dm9pZFx0XHRcdCppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi9cbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbitlbnVtIGlub2RlX2l0ZXJfZmxhZ3NfZW51bSB7XG4rXHRJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSBcdTAwM2NcdTAwM2MgMSksICAvKiBFeGNsdWRlIGlub2RlcyB3aXRoIChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKS4gKi9cbitcdElOT0RFX0lURVJfVU5VU0VEID0gKDFVIFx1MDAzY1x1MDAzYyAyKSwgIC8qIE9ubHkgcmV0dXJuIGlub2RlcyB3aXRoIChpX2NvdW50ID09IDApLiAqL1xuK307XG4rXG4rLypcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kXG4rICogIGlub2RlLVx1MDAzZWlfbG9jayAgICAgICAgICAgICAgbG9ja2VkICAgICAgICAgdW5sb2NrZWRcbisgKiAgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2sgICAgICBsb2NrZWQgICAgICAgICBsb2NrZWRcbisgKi9cbit0eXBlZGVmIGludCAoKmlub2RlX2l0ZXJfY2IpIChzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTtcbitcbitpbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpO1xuK1xuIC8qXG4gICogaV9zdGF0ZSBoYW5kbGluZ1xuICAqXG5AQCAtMTMxNSw4ICsxMzMwLDEwIEBAIHN0cnVjdCBmaWxlICpnZXRfZmlsZV9hY3RpdmUoc3RydWN0IGZpbGUgKipmKTtcbiBcbiAjZGVmaW5lXHRNQVhfTk9OX0xGU1x0KCgxVUxcdTAwM2NcdTAwM2MzMSkgLSAxKVxuIFxuLS8qIFBhZ2UgY2FjaGUgbGltaXQuIFRoZSBmaWxlc3lzdGVtcyBzaG91bGQgcHV0IHRoYXQgaW50byB0aGVpciBzX21heGJ5dGVzIFxuLSAgIGxpbWl0cywgb3RoZXJ3aXNlIGJhZCB0aGluZ3MgY2FuIGhhcHBlbiBpbiBWTS4gKi8gXG4rLypcbisgKiBQYWdlIGNhY2hlIGxpbWl0LiBUaGUgZmlsZXN5c3RlbXMgc2hvdWxkIHB1dCB0aGF0IGludG8gdGhlaXIgc19tYXhieXRlc1xuKyAqIGxpbWl0cywgb3RoZXJ3aXNlIGJhZCB0aGluZ3MgY2FuIGhhcHBlbiBpbiBWTS5cbisgKi9cbiAjaWYgQklUU19QRVJfTE9ORz09MzJcbiAjZGVmaW5lIE1BWF9MRlNfRklMRVNJWkVcdCgobG9mZl90KVVMT05HX01BWCBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVClcbiAjZWxpZiBCSVRTX1BFUl9MT05HPT02NFxuQEAgLTIyODUsNyArMjMwMiw3IEBAIGludCBzeW5jX2lub2RlX21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KTtcbiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB7XG4gXHRjb25zdCBjaGFyICpuYW1lO1xuIFx0aW50IGZzX2ZsYWdzO1xuLSNkZWZpbmUgRlNfUkVRVUlSRVNfREVWXHRcdDEgXG4rI2RlZmluZSBGU19SRVFVSVJFU19ERVZcdFx0MVxuICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQVx0MlxuICNkZWZpbmUgRlNfSEFTX1NVQlRZUEVcdFx0NFxuICNkZWZpbmUgRlNfVVNFUk5TX01PVU5UXHRcdDhcdC8qIENhbiBiZSBtb3VudGVkIGJ5IHVzZXJucyByb290ICovXG5AQCAtMjkwNyw3ICsyOTI0LDcgQEAgc3NpemVfdCBfX2tlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpO1xuIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopO1xuIGV4dGVybiBzc2l6ZV90IF9fa2VybmVsX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBsb2ZmX3QgKik7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICogb3Blbl9leGVjKGNvbnN0IGNoYXIgKik7XG4tIFxuK1xuIC8qIGZzL2RjYWNoZS5jIC0tIGdlbmVyaWMgZnMgc3VwcG9ydCBmdW5jdGlvbnMgKi9cbiBleHRlcm4gYm9vbCBpc19zdWJkaXIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgZGVudHJ5ICopO1xuIGV4dGVybiBib29sIHBhdGhfaXNfdW5kZXIoY29uc3Qgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IHBhdGggKik7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG5pbmRleCBlY2Q5NmFlYjFjZWU3Li4xZjgxY2MyMTliOGVlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhcbkBAIC0yNjksOSArMjY5LDEwIEBAIHN0cnVjdCBzdXBlcl9ibG9jayB7XG4gXHQgKi9cbiBcdGludCBzX3N0YWNrX2RlcHRoO1xuIFxuLVx0Lyogc19pbm9kZV9saXN0X2xvY2sgcHJvdGVjdHMgc19pbm9kZXMgKi9cbitcdC8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqL1xuIFx0c3BpbmxvY2tfdFx0XHRcdFx0c19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcbiBcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2RlcztcdC8qIGFsbCBpbm9kZXMgKi9cbitcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2Rlc19pdGVyczsgLyogYWxsIGl0ZXJhdG9ycyAqL1xuIFxuIFx0c3BpbmxvY2tfdFx0XHRcdFx0c19pbm9kZV93Ymxpc3RfbG9jaztcbiBcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2Rlc193YjtcdC8qIHdyaXRlYmFjayBpbm9kZXMgKi9cbmRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuY1xuaW5kZXggMzBhYTZjZTEzNTkwYS4uM2RjZGU4Y2JmYjZhZiAxMDA2NDRcbi0tLSBhL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbisrKyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbkBAIC0xMzY5LDExMCArMTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KVxuIFxuIC8qIFN1cGVyLWJsb2NrIGhvb2tzICovXG4gXG4tLypcbi0gKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cbi0gKlxuLSAqIENmLiBmc25vdGlmeV91bm1vdW50X2lub2RlcygpIGFuZCBldmljdF9pbm9kZXMoKVxuLSAqL1xuLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXG4rc3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMO1xuK1x0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xuK1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gXG4tXHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxuLVx0XHRyZXR1cm47XG4rXHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmlub2RlLVx1MDAzZWlfY291bnQpKSB7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0b2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3QpO1xuK1x0aWYgKCFvYmplY3QpIHtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1x0LyogS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhpcyBpbm9kZSB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuICovXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiBcbi1cdFx0LyogT25seSBoYW5kbGVzIHJlZmVyZW5jZWQgaW5vZGVzLiAqL1xuLVx0XHRpZiAoIWljb3VudF9yZWFkX29uY2UoaW5vZGUpKVxuLVx0XHRcdGNvbnRpbnVlO1xuK1x0LypcbitcdCAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2VcbitcdCAqIGFyZSBpbiBjaGFyZ2Ugb2YgY2FsbGluZyBpcHV0KCkgb24gdGhpcyBpbm9kZSwgb3RoZXJ3aXNlIHdlXG4rXHQgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLlxuK1x0ICovXG4rXHRzcGluX2xvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuK1x0aWYgKG9iamVjdC1cdTAwM2V1bmRlcm9iaiA9PSBpbm9kZSkge1xuK1x0XHRvYmplY3QtXHUwMDNldW5kZXJvYmogPSBOVUxMO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFxuIFx0XHQvKlxuLVx0XHQgKiBQcm90ZWN0cyBhZ2FpbnN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIGlub2RlIChlLmcuXG4tXHRcdCAqIGZyb20gZ2V0X2lub2RlX29iamVjdCgpKS5cbitcdFx0ICogQmVjYXVzZSBvYmplY3QtXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxuK1x0XHQgKiByZWxlYXNlX2lub2RlKCkgYW5kIGdldF9pbm9kZV9vYmplY3QoKSBndWFyYW50ZWVcbitcdFx0ICogdGhhdCBpdCBpcyBzYWZlIHRvIHJlc2V0XG4rXHRcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3Qgd2hpbGUgaXQgaXMgbm90IE5VTEwuXG4rXHRcdCAqIEl0IGlzIHRoZXJlZm9yZSBub3QgbmVjZXNzYXJ5IHRvIGxvY2sgaW5vZGUtXHUwMDNlaV9sb2NrLlxuIFx0XHQgKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0LCBOVUxMKTtcbiBcdFx0Lypcbi1cdFx0ICogQ2hlY2tzIElfRlJFRUlORyBhbmQgSV9XSUxMX0ZSRUUgIHRvIHByb3RlY3QgYWdhaW5zdCBhIHJhY2Vcbi1cdFx0ICogY29uZGl0aW9uIHdoZW4gcmVsZWFzZV9pbm9kZSgpIGp1c3QgY2FsbGVkIGlwdXQoKSwgd2hpY2hcbi1cdFx0ICogY291bGQgbGVhZCB0byBhIE5VTEwgZGVyZWZlcmVuY2Ugb2YgaW5vZGUtXHUwMDNlc2VjdXJpdHkgb3IgYVxuLVx0XHQgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc29cbi1cdFx0ICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuXG4rXHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcbitcdFx0ICogb3JpZ2luYWxseSBzZXQgdXAgYnkgZ2V0X2lub2RlX29iamVjdCgpIGFuZCB0aGVcbitcdFx0ICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wXG4rXHRcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXG4rXHRcdCAqIG9uIHRoZSBpbm9kZS5cbiBcdFx0ICovXG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjZcbi1cdFx0ICAgIChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbitcdFx0aXB1dF9ub3RfbGFzdChpbm9kZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4tXHRcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0KTtcbi1cdFx0aWYgKCFvYmplY3QpIHtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xuLVx0XHRfX2lnZXQoaW5vZGUpO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0aXB1dChpbm9kZSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHJlbGVhc2VfaW5vZGUoKSBvbmdvaW5nLCB0aGVuIHdlXG4tXHRcdCAqIGFyZSBpbiBjaGFyZ2Ugb2YgY2FsbGluZyBpcHV0KCkgb24gdGhpcyBpbm9kZSwgb3RoZXJ3aXNlIHdlXG4tXHRcdCAqIHdpbGwganVzdCB3YWl0IGZvciBpdCB0byBmaW5pc2guXG4tXHRcdCAqL1xuLVx0XHRzcGluX2xvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRpZiAob2JqZWN0LVx1MDAzZXVuZGVyb2JqID09IGlub2RlKSB7XG4tXHRcdFx0b2JqZWN0LVx1MDAzZXVuZGVyb2JqID0gTlVMTDtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gMDtcbit9XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBCZWNhdXNlIG9iamVjdC1cdTAwM2V1bmRlcm9iaiB3YXMgbm90IE5VTEwsXG4tXHRcdFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXG4tXHRcdFx0ICogdGhhdCBpdCBpcyBzYWZlIHRvIHJlc2V0XG4tXHRcdFx0ICogbGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCB3aGlsZSBpdCBpcyBub3QgTlVMTC5cbi1cdFx0XHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVx1MDAzZWlfbG9jay5cbi1cdFx0XHQgKi9cbi1cdFx0XHRyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCwgTlVMTCk7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzXG4tXHRcdFx0ICogb3JpZ2luYWxseSBzZXQgdXAgYnkgZ2V0X2lub2RlX29iamVjdCgpIGFuZCB0aGVcbi1cdFx0XHQgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3Bcbi1cdFx0XHQgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlc1xuLVx0XHRcdCAqIG9uIHRoZSBpbm9kZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpcHV0X25vdF9sYXN0KGlub2RlKTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4tXHRcdH1cbisvKlxuKyAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LlxuKyAqXG4rICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXG4rICovXG4rc3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYilcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJTk9ERV9JVEVSX05PUk1BTDtcbiBcbi1cdFx0aWYgKHByZXZfaW5vZGUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIG93biB0aGUgX19pZ2V0KCkgcmVmZXJlbmNlXG4tXHRcdFx0ICogdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3Agd2Fsay4gIFRoZXJlZm9yZSB3ZVxuLVx0XHRcdCAqIGNhbiBkcm9wIHRoZSBsaXN0IGxvY2sgYW5kIGtub3cgdGhhdCB0aGUgaW5vZGUgd29uJ3Rcbi1cdFx0XHQgKiBkaXNhcHBlYXIgZnJvbSB1bmRlciB1cyB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuXG4tXHRcdFx0ICovXG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogV2UgY2FuIG5vdyBhY3R1YWxseSBwdXQgdGhlIGlub2RlIHJlZmVyZW5jZSBmcm9tIHRoZVxuLVx0XHRcdCAqIHByZXZpb3VzIGxvb3Agd2Fsaywgd2hpY2ggaXMgbm90IG5lZWRlZCBhbnltb3JlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlwdXQocHJldl9pbm9kZSk7XG4tXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRwcmV2X2lub2RlID0gaW5vZGU7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcbiBcbi1cdC8qIFB1dHMgdGhlIGlub2RlIHJlZmVyZW5jZSBmcm9tIHRoZSBsYXN0IGxvb3Agd2FsaywgaWYgYW55LiAqL1xuLVx0aWYgKHByZXZfaW5vZGUpXG4tXHRcdGlwdXQocHJldl9pbm9kZSk7XG4gXHQvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqL1xuIFx0d2FpdF92YXJfZXZlbnQoXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXHUwMDNlaW5vZGVfcmVmcyxcbiBcdFx0ICAgICAgICFhdG9taWNfbG9uZ19yZWFkKFx1MDAyNmxhbmRsb2NrX3N1cGVyYmxvY2soc2IpLVx1MDAzZWlub2RlX3JlZnMpKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjQ0Ljc5MzY4ODg5M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU1NTE3NTQxMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBTZXJpZXM6IFdvcnRoRnV6emluZyA9IFRydWUqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBzZXJpZXMuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0J3MgaW50cm9kdWNpbmcgYSBuZXcsIGdlbmVyaWMgaW5vZGUgaXRlcmF0aW9uIG1lY2hhbmlzbSBvbiBzdXBlcmJsb2Nrcy4gVGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byBiZSB0aGUgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBmdW5jdGlvbiwgYWxvbmdzaWRlIGl0cyByZWxhdGVkIGl0ZXJhdG9yIGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSBhIHN1YnN0YW50aWFsIHJlZmFjdG9yaW5nLCB0b3VjaGluZyBhIHZhcmlldHkgb2YgY3J1Y2lhbCBzdWJzeXN0ZW1zLlxuXG5MZXQgbWUgYnJlYWsgZG93biB0aGUgY2hhbmdlcyBJJ20gc2VlaW5nLiBUaGlzIHBhdGNoIHVwZGF0ZXMgYSBidW5jaCBvZiBjYWxsIHNpdGVzIGFjcm9zcyB0aGUgVkZTIGxheWVyLCB0aGUgYmxvY2sgbGF5ZXIsIEdGUzIsIFF1b3RhLCBhbmQgZXZlbiBMYW5kbG9jayEgU3BlY2lmaWNhbGx5LCBJJ20gc2VlaW5nIG1vZGlmaWNhdGlvbnMgaW4gYGJsb2NrL2JkZXYuY2AsIGBmcy9kcm9wX2NhY2hlcy5jYCwgYGZzL2dmczIvb3BzX2ZzdHlwZS5jYCwgYGZzL2lub2RlLmNgICh0aGlzIG9uZSdzICprZXkqKSwgYGZzL3F1b3RhL2RxdW90LmNgLCBgZnMvc3VwZXIuY2AsIGFsb25nIHdpdGggdXBkYXRlcyB0byBpbmNsdWRlIGZpbGVzIGxpa2UgYGluY2x1ZGUvbGludXgvZnMuaGAgYW5kIGBpbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhgLCBhbmQgZXZlbiBhIHNlY3VyaXR5IG1vZHVsZSwgYHNlY3VyaXR5L2xhbmRsb2NrL2ZzLmNgLlxuXG5NeSBwcmltYXJ5IGNvbmNlcm4gd2l0aCB0aGlzIGtpbmQgb2YgY2hhbmdlIGlzIHdoZXRoZXIgaXQgaW50cm9kdWNlcyBhbnkgdnVsbmVyYWJpbGl0aWVzLiBXZSBrbm93IHRoYXQgYW55IG1vZGlmaWNhdGlvbiB0byBjb3JlIFZGUyBjYW4gbGVhZCB0byB2dWxuZXJhYmlsaXRpZXMsIGFuZCB0aGlzIGRlZmluaXRlbHkgdG91Y2hlcyBjb3JlIFZGUzogYGZzL2lub2RlLmNgLCBgZnMvc3VwZXIuY2AsIGBmcy9kcm9wX2NhY2hlcy5jYCwgYGJsb2NrL2JkZXYuY2AsIGBmcy9xdW90YS9kcXVvdC5jYCwgYHNlY3VyaXR5L2xhbmRsb2NrL2ZzLmNgLiBBbHNvLCBpdCdzIGludHJvZHVjaW5nIGEgbmV3IGxpc3QgdHJhdmVyc2FsL2l0ZXJhdG9yIHRyYWNraW5nIGxvZ2ljICh3aXRoIGBzX2lub2Rlc19pdGVyc2AgYW5kIGl0cyByZWxhdGVkIGZ1bmN0aW9ucykuIFRoaXMgaW52b2x2ZXMgbG9ja2luZyB3aXRoIGBzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cdTAwM2VpX2xvY2tgLCBhcyB3ZWxsIGFzIGNhbGxiYWNrIHNlbWFudGljcyBhbmQgcmVmY291bnQgbWFuaXB1bGF0aW9uIHdpdGggYF9faWdldGAgYW5kIGBpcHV0YC4gQWxsIG9mIHRoZXNlIHRoaW5ncyBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZnV6emluZywgd2hpY2ggbWVhbnMgdGhlIGNvZGUgaXMgKmNvcmUgcmVhY2hhYmxlIGV4ZWN1dGFibGUqLiBUaGlzIGtpbmQgb2YgcmVmYWN0b3JpbmcgY291bGQgcmV2ZWFsIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMsIG1lbW9yeSBjb3JydXB0aW9uIGlzc3Vlcywgb3IgZXZlbiBsb2dpYyBlcnJvcnMgdGhhdCB3b3VsZG4ndCBub3JtYWxseSBhcHBlYXIuXG5cblRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyBjbGVhcjogYFdvcnRoRnV6emluZyA9IHRydWVgLiBJIG5lZWQgdG8gZGlnIGludG8gdGhpcyB0aG9yb3VnaGx5LiBJIHNob3VsZCBwcm9iYWJseSB1c2UgYGdyZXBwZXJgIChvciBzaW1pbGFyIHRvb2xzKSB0byBjaGVjayB0aGUgY29uZmlndXJhdGlvbnMgYW5kIGluc3BlY3QgdGhlIHNvdXJjZSBjb2RlIGZ1cnRoZXIuIFRoaXMgcmVxdWlyZXMgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTk5NywiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjUwLjM0NTQ0NTgxOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODQzNjA5MzQzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNiX2Zvcl9lYWNoX2lub2Rlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJibG9jay9iZGV2LmM9MTM4Mj12b2lkIHN5bmNfYmRldnMoYm9vbCB3YWl0KVxcbmJsb2NrL2JkZXYuYy0xMzgzLXtcXG5ibG9jay9iZGV2LmM6MTM4NDpcXHRzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsXFxuYmxvY2svYmRldi5jLTEzODUtXFx0XFx0XFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xcbi0tXFxuZnMvZHJvcF9jYWNoZXMuYz00MD1zdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXFxuZnMvZHJvcF9jYWNoZXMuYy00MS17XFxuZnMvZHJvcF9jYWNoZXMuYzo0MjpcXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLCBkcm9wX3BhZ2VjYWNoZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcXG5mcy9kcm9wX2NhY2hlcy5jLTQzLX1cXG4tLVxcbmZzL2dmczIvb3BzX2ZzdHlwZS5jPTE3NTU9c3RhdGljIHZvaWQgZ2ZzMl9ldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2dmczIvb3BzX2ZzdHlwZS5jLTE3NTktXFx0c2V0X2JpdChTREZfRVZJQ1RJTkcsIFxcdTAwMjZzZHAtXFx1MDAzZXNkX2ZsYWdzKTtcXG5mcy9nZnMyL29wc19mc3R5cGUuYzoxNzYwOlxcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XFxuZnMvZ2ZzMi9vcHNfZnN0eXBlLmMtMTc2MS19XFxuLS1cXG5mcy9pbm9kZS5jPTY3MT1zdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvaW5vZGUuYy03MTctXFxuZnMvaW5vZGUuYzo3MTg6aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuZnMvaW5vZGUuYy03MTktXFx0XFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXFxuLS1cXG5mcy9pbm9kZS5jLTcyOS19XFxuZnMvaW5vZGUuYzo3MzA6RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpO1xcbmZzL2lub2RlLmMtNzMxLVxcbi0tXFxuZnMvaW5vZGUuYz05ODI9dm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2lub2RlLmMtOTg2LVxcbmZzL2lub2RlLmM6OTg3OlxcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiLCBcXHUwMDI2ZGlzcG9zZSk7XFxuZnMvaW5vZGUuYy05ODgtXFx0ZGlzcG9zZV9saXN0KFxcdTAwMjZkaXNwb3NlKTtcXG4tLVxcbmZzL3F1b3RhL2RxdW90LmM9MTA4Mj1zdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXFxuZnMvcXVvdGEvZHF1b3QuYy0xMDgzLXtcXG5mcy9xdW90YS9kcXVvdC5jOjEwODQ6XFx0cmV0dXJuIHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsXFxuZnMvcXVvdGEvZHF1b3QuYy0xMDg1LVxcdFxcdFxcdFxcdCAgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiLCBcXHUwMDI2dHlwZSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZzLmg9ODgzPXR5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopO1xcbmluY2x1ZGUvbGludXgvZnMuaC04ODQtXFxuaW5jbHVkZS9saW51eC9mcy5oOjg4NTppbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcXG5pbmNsdWRlL2xpbnV4L2ZzLmgtODg2LVxcdFxcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKTtcXG4tLVxcbnNlY3VyaXR5L2xhbmRsb2NrL2ZzLmM9MTQzNz1zdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxcbi0tXFxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYy0xNDQzLVxcbnNlY3VyaXR5L2xhbmRsb2NrL2ZzLmM6MTQ0NDpcXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcXG5zZWN1cml0eS9sYW5kbG9jay9mcy5jLTE0NDUtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjUyLjE4OTA2MDQyMVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyNzcxNTAyMTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBJbm9kZSBJdGVyYXRvcioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgdGhlIGl0ZXJhdG9yIGZvciBpbm9kZXMgaW4gYGZzL2lub2RlLmNgIGFjdHVhbGx5IHdvcmtzLiBJIHdhbnQgdG8gc3BlY2lmaWNhbGx5IHVuZGVyc3RhbmQgaXRzIGltcGxlbWVudGF0aW9uIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgaG93IGl0J3MgYmVpbmcgKnVzZWQqLiBJcyBpdCBhIGNsYXNzaWMgaXRlcmF0b3IgcGF0dGVybiwgb3IgaXMgdGhlcmUgc29tZSBjdXN0b20gc3BpbiBvbiBpdCB0byBvcHRpbWl6ZSBmb3IgZmlsZSBzeXN0ZW0gYWNjZXNzIHBhdHRlcm5zPyBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gYW55IHBvdGVudGlhbCBjb25jdXJyZW5jeSBpbXBsaWNhdGlvbnMg4oCTIGRvZXMgdGhlIGl0ZXJhdGlvbiBoYW5kbGUgbG9ja2luZyBjb3JyZWN0bHkgYWNyb3NzIG11bHRpcGxlIHRocmVhZHMgb3IgcHJvY2Vzc2VzIGFjY2Vzc2luZyB0aGUgaW5vZGUgdGFibGU/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIHRoYXQgc3ByaW5nIHRvIG1pbmQgd2hlbiBzZWVpbmcgaG93IGl0J3MgbGFpZCBvdXQ/IEkgbmVlZCB0byBhbmFseXplIGl0cyB1c2FnZSBjb250ZXh0IHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhY2Nlc3MgaXQgaXMgYmVpbmcgdXNlZCBmb3IsIGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBpdGVyYXRvcnMgcGVyZm9ybWFuY2UgaW4gdGhlc2Ugc2l0dWF0aW9ucy4gVGltZSB0byBzdGFydCBkaWdnaW5nLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzOTg1LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NTQuNDY2MjEzMjAzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzMzkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lub2RlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjQ1LFxuICBcIkxpbmVDb3VudFwiOiA4NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjQ1OlxcdFxcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4gNjQ2OlxcdFxcbiA2NDc6XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiA2NDg6XFx0XFx0bGlzdF9hZGQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX3NiX2xpc3QsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMpO1xcbiA2NDk6XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIDY1MDpcXHR9XFxuIDY1MTpcXHRFWFBPUlRfU1lNQk9MX0dQTChpbm9kZV9zYl9saXN0X2FkZCk7XFxuIDY1MjpcXHRcXG4gNjUzOlxcdHN0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxcbiA2NTQ6XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgaW50IGZsYWdzLCBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxcbiA2NTU6XFx0e1xcbiA2NTY6XFx0XFx0aXQtXFx1MDAzZWZsYWdzID0gZmxhZ3M7XFxuIDY1NzpcXHRcXHRpdC1cXHUwMDNlZnVuYyA9IGZuO1xcbiA2NTg6XFx0XFx0aXQtXFx1MDAzZWRhdGEgPSBkYXRhO1xcbiA2NTk6XFx0XFx0aXQtXFx1MDAzZXJldCA9IDA7XFxuIDY2MDpcXHRcXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIDY2MTpcXHRcXHRpdC1cXHUwMDNlbmV4dCA9IHNiLVxcdTAwM2VzX2lub2Rlcy5uZXh0O1xcbiA2NjI6XFx0XFx0bGlzdF9hZGQoXFx1MDAyNml0LVxcdTAwM2VpdGVyc19ub2RlLCBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcXG4gNjYzOlxcdH1cXG4gNjY0OlxcdFxcbiA2NjU6XFx0c3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9lbmQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiA2NjY6XFx0e1xcbiA2Njc6XFx0XFx0bGlzdF9kZWwoXFx1MDAyNml0LVxcdTAwM2VpdGVyc19ub2RlKTtcXG4gNjY4OlxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiA2Njk6XFx0fVxcbiA2NzA6XFx0XFxuIDY3MTpcXHRzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiA2NzI6XFx0e1xcbiA2NzM6XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XFxuIDY3NDpcXHRcXHRpbnQgcmV0O1xcbiA2NzU6XFx0XFxuIDY3NjpcXHRcXHR3aGlsZSAoIWlub2RlIFxcdTAwMjZcXHUwMDI2IGl0LVxcdTAwM2VuZXh0ICE9IFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMpIHtcXG4gNjc3OlxcdFxcdFxcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cXHUwMDNlbmV4dCwgc3RydWN0IGlub2RlLCBpX3NiX2xpc3QpO1xcbiA2Nzg6XFx0XFx0XFx0aWYgKGl0LVxcdTAwM2VmbGFncyBcXHUwMDI2IElOT0RFX0lURVJfVU5VU0VEKSB7XFxuIDY3OTpcXHRcXHRcXHRcXHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpIHtcXG4gNjgwOlxcdFxcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuIDY4MTpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNjgyOlxcdFxcdFxcdFxcdH1cXG4gNjgzOlxcdFxcbiA2ODQ6XFx0XFx0XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gNjg1OlxcdFxcdFxcdFxcdGlmIChpY291bnRfcmVhZChpbm9kZSkpIHtcXG4gNjg2OlxcdFxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gNjg3OlxcdFxcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuIDY4ODpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNjg5OlxcdFxcdFxcdFxcdH1cXG4gNjkwOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDY5MTpcXHRcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbiA2OTI6XFx0XFx0XFx0fVxcbiA2OTM6XFx0XFxuIDY5NDpcXHRcXHRcXHRpZiAoKGl0LVxcdTAwM2VmbGFncyBcXHUwMDI2IElOT0RFX0lURVJfTk9STUFMKSBcXHUwMDI2XFx1MDAyNlxcbiA2OTU6XFx0XFx0XFx0ICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkpIHtcXG4gNjk2OlxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gNjk3OlxcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuIDY5ODpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNjk5OlxcdFxcdFxcdH1cXG4gNzAwOlxcdFxcbiA3MDE6XFx0XFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpdC1cXHUwMDNlbmV4dC1cXHUwMDNlbmV4dDtcXG4gNzAyOlxcdFxcdFxcdHJldCA9IGl0LVxcdTAwM2VmdW5jKGlub2RlLCBpdC1cXHUwMDNlZGF0YSk7XFxuIDcwMzpcXHRcXHRcXHRpZiAocmV0KSB7XFxuIDcwNDpcXHRcXHRcXHRcXHRpdC1cXHUwMDNlcmV0ID0gcmV0O1xcbiA3MDU6XFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA3MDY6XFx0XFx0XFx0fVxcbiA3MDc6XFx0XFxuIDcwODpcXHRcXHRcXHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcXG4gNzA5OlxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiA3MTA6XFx0XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIDcxMTpcXHRcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIDcxMjpcXHRcXHRcXHR9XFxuIDcxMzpcXHRcXHR9XFxuIDcxNDpcXHRcXG4gNzE1OlxcdFxcdHJldHVybiBpdC1cXHUwMDNlbmV4dCA9PSBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzID8gZmFsc2UgOiB0cnVlO1xcbiA3MTY6XFx0fVxcbiA3MTc6XFx0XFxuIDcxODpcXHRpbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcXG4gNzE5OlxcdFxcdFxcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxcbiA3MjA6XFx0e1xcbiA3MjE6XFx0XFx0c3RydWN0IGlub2RlX2l0ZXIgaXQ7XFxuIDcyMjpcXHRcXG4gNzIzOlxcdFxcdGlub2RlX3NiX2l0ZXJfc3RhcnQoc2IsIFxcdTAwMjZpdCwgZmxhZ3MsIGZuLCBkYXRhKTtcXG4gNzI0OlxcdFxcdHdoaWxlIChpbm9kZV9zYl9pdGVyX25leHQoXFx1MDAyNml0LCBzYikpXFxuIDcyNTpcXHRcXHRcXHQ7XFxuIDcyNjpcXHRcXHRpbm9kZV9zYl9pdGVyX2VuZChcXHUwMDI2aXQsIHNiKTtcXG4gNzI3OlxcdFxcbiA3Mjg6XFx0XFx0cmV0dXJuIGl0LnJldDtcXG4gNzI5OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NTQuNDY2MzU5NTU0WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDY4NTY4MTg4NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgaW50byB0aGlzIG5ldyBpdGVyYXRvcidzIGludHJpY2FjaWVzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgY2xvc2VseSBhdCBgc2JfZm9yX2VhY2hfaW5vZGVzYC4gUmlnaHQgYXdheSwgdGhlIGBpbm9kZV9zYl9pdGVyX25leHQoKWAgZnVuY3Rpb24gZ3JhYnMgYW4gYGlub2RlYCBmcm9tIGEgbGlzdCB1c2luZyBgbGlzdF9lbnRyeWAuICBJdCBjaGVja3MgZmxhZ3MsIHBvdGVudGlhbGx5IGFjcXVpcmVzIGBpbm9kZS1cdTAwM2VpX2xvY2tgIChkZXBlbmRpbmcgb24gdGhlIGNvZGUgcGF0aCksIGFuZCB0aGVuIGNhbGxzIGBpdC1cdTAwM2VmdW5jYCB3aXRoIHRoZSBgaW5vZGVgIGFuZCBgaXQtXHUwMDNlZGF0YWAuICBTdGFuZGFyZCBzdHVmZiwgYnV0IHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBsb2NraW5nIGlzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuXG5cbk5vdywgYGlub2RlX3NiX2xpc3RfZGVsYCBpbiBgZnMvaW5vZGUuY2AuIEkgc2VlIGl0IHJlbW92aW5nIGFuIGlub2RlIGZyb20gdGhlIHN1cGVyYmxvY2sncyBpbm9kZSBsaXN0LiBBbmQgaGVyZSdzIHRoZSBraWNrZXI6IGl0IGl0ZXJhdGVzICp0aHJvdWdoKiB0aGUgYHNfaW5vZGVzX2l0ZXJzYCBsaXN0IG9uIHRoZSBzdXBlcmJsb2NrLiAgSWYgaXQgZmluZHMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgYXQgdGhlIGlub2RlIGJlaW5nIGRlbGV0ZWQsIGl0IHVwZGF0ZXMgYGl0LVx1MDAzZW5leHRgISBUaGlzIGlzIGNyaXRpY2FsLiBEdXJpbmcgdGhvc2UgaXRlcmF0aW9uIGNhbGxiYWNrcywgdGhlIGNvZGUgZHJvcHMgYGlub2RlLVx1MDAzZWlfbG9ja2AgYW5kIGBzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AsIGRvZXMgc29tZSB3b3JrICh0aGluZ3MgbGlrZSBgX19pZ2V0YCwgYGlwdXRgLCBldmVuIGBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXNgLCBhbmQgZmlsZSBvcGVyYXRpb25zKSwgYW5kIHRoZW4gcmVhY3F1aXJlcyBgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2tgIGJlZm9yZSByZXR1cm5pbmcuXG5cblRoZSBpbXBsaWNhdGlvbnMgYXJlIGh1Z2UuICBBbiBpbm9kZSBjYW4gYmUgZGVsZXRlZCAqd2hpbGUqIHRoZSBsb2NrIGlzIGRyb3BwZWQuIFdoZW4gdGhhdCBoYXBwZW5zLCBgaW5vZGVfc2JfbGlzdF9kZWxgICp1cGRhdGVzIHRoZSBpdGVyYXRvcidzIG5leHQgcG9pbnRlciosIHNvIHRoYXQgaXQgaXNuJ3Qgb3JwaGFuZWQuIEl0J3MgY2xldmVybHkgaGFuZGxpbmcgY29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi4gVGhpcyBpdGVyYXRvciBtZWNoYW5pc20gaXMgYnJhbmQgbmV3IGFuZCB0b3VjaGVzIHN1cGVyYmxvY2sgaW5vZGUgbGlzdCBsb2NraW5nLCByZWZjb3VudGluZywgYW5kIHRyYXZlcnNhbCBhY3Jvc3MgVkZTLCBxdW90YSwgTGFuZGxvY2ssIEdGUzIsIGFuZCBldmVuIGJsb2NrIGRldmljZXMhXG5cblNvLCB3aGljaCBjb25maWd1cmF0aW9ucyBhcmUgbGlrZWx5IHRvIGJlIHJlbGV2YW50PyAgYGZzL2lub2RlLmNgLCBgZnMvc3VwZXIuY2AsIGBibG9jay9iZGV2LmNgLCBhbmQgYGZzL2Ryb3BfY2FjaGVzLmNgIGFyZSBhbHdheXMgdGhlcmUuIEJ1dCB3aGF0IGFib3V0IHRoZSBtb2R1bGVzPyAgYGZzL3F1b3RhL2RxdW90LmNgIGRlcGVuZHMgb24gYENPTkZJR19RVU9UQWAsIGBmcy9nZnMyYCBkZXBlbmRzIG9uIGBDT05GSUdfR0ZTMl9GU2AsIGFuZCBgc2VjdXJpdHkvbGFuZGxvY2tgIGRlcGVuZHMgb24gYENPTkZJR19TRUNVUklUWV9MQU5ETE9DS2AuXG5cbkknbSBnb2luZyB0byBxdWlja2x5IGNoZWNrIHRoZSBLY29uZmlnIGZpbGVzIGZvciBRdW90YSwgTGFuZGxvY2ssIGFuZCBHRlMyIGp1c3QgdG8gY29uZmlybSB0aGVzZSBkZXBlbmRlbmNpZXMgYW5kIG1ha2Ugc3VyZSBJJ20gbm90IG1pc3NpbmcgYW55dGhpbmcgb2J2aW91cy4gVGhpcyByZXF1aXJlcyBtb3JlIHRob3JvdWdoIGFuYWx5c2lzLCBidXQgdGhpcyBpdGVyYXRvciBzZWVtcyBub3ZlbCBhbmQgaGlnaGx5IHJlbGV2YW50IHRvIGNvbmN1cnJlbnQgZmlsZXN5c3RlbSBzdHJ1Y3R1cmVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTQ4MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjU5LjE1MjA0NDUzOFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzg4MjAyMTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIChRVU9UQXxTRUNVUklUWV9MQU5ETE9DS3xHRlMyX0ZTKVxcXFxiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9nZnMyL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9nZnMyL0tjb25maWc6Mjpjb25maWcgR0ZTMl9GU1xcbmZzL2dmczIvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJHRlMyIGZpbGUgc3lzdGVtIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9xdW90YS9LY29uZmlnLTUtXFxuZnMvcXVvdGEvS2NvbmZpZzo2OmNvbmZpZyBRVU9UQVxcbmZzL3F1b3RhL0tjb25maWctNy1cXHRib29sIFxcXCJRdW90YSBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMToxMDo1OS4yOTA4NzM1NTZaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxOTY2MjAzODgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipLZXJuZWwgU2VjdXJpdHkgRXhwbG9yYXRpb24qKlxuXG5BbHJpZ2h0LCBiZWZvcmUgSSBkaXZlIHRvbyBkZWVwIGludG8gdGhpcyBwcm9ibGVtLCBJIG5lZWQgdG8gdGFrZSBhIHN0ZXAgYmFjayBhbmQgbWFrZSBzdXJlIEknbSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzLiBTZWN1cml0eSBpcyBhbHdheXMgcGFyYW1vdW50LCBhbmQgbGFuZGxvY2sgaXMgYSBsaWtlbHkgYXJlYSB0byBzY3J1dGluaXplLiBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgaWYgdGhlIGlzc3VlIGludGVyc2VjdHMgd2l0aCBsYW5kbG9jaydzIGNhcGFiaWxpdGllcy4gU3BlY2lmaWNhbGx5LCBkb2VzIHNvbWV0aGluZyBjaGFuZ2UgYXQgdGhlIGxhbmRsb2NrIGxldmVsIHRoYXQgbWlnaHQgY29udHJpYnV0ZT8gSXQncyBlYXN5IHRvIGdldCB0dW5uZWwgdmlzaW9uIHdoZW4gZGVidWdnaW5nLlxuXG5UaGVuLCBvZiBjb3Vyc2UsIEkgc2hvdWxkIGxvb2sgYXQgdGhlIEtjb25maWcgb3B0aW9ucyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEFyZSB0aGVyZSBhbnkgcmVsZXZhbnQgc2VjdXJpdHkgZmVhdHVyZXMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgZW5hYmxlZCBpbiBhIHdheSB0aGF0IGNvdWxkIGFmZmVjdCB0aGlzIHNpdHVhdGlvbj8gTWF5YmUgSSBjYW4gY2hhbmdlIHRoZW0gdG8gdmVyaWZ5IHRoZSBiZWhhdmlvdXIuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIG5vdCB3b3JraW5nIHdpdGggYW4gdW51c3VhbCwgb3Igbm9uLWRlZmF1bHQsIGJ1aWxkIGJlZm9yZSBJIHN0YXJ0IGNoYXNpbmcgZ2hvc3RzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjcxMSwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjAxLjI1NzA3OTQ4OVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjczNjUxMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFNFQ1VSSVRZX0xBTkRMT0NLXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInNlY3VyaXR5L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJzZWN1cml0eS9sYW5kbG9jay9LY29uZmlnLTItXFxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZzozOmNvbmZpZyBTRUNVUklUWV9MQU5ETE9DS1xcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctNC1cXHRib29sIFxcXCJMYW5kbG9jayBzdXBwb3J0XFxcIlxcbi0tXFxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZy0yMy1cXG5zZWN1cml0eS9sYW5kbG9jay9LY29uZmlnOjI0OmNvbmZpZyBTRUNVUklUWV9MQU5ETE9DS19MT0dcXG5zZWN1cml0eS9sYW5kbG9jay9LY29uZmlnLTI1LVxcdGJvb2xcXG4tLVxcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMjgtXFxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZzoyOTpjb25maWcgU0VDVVJJVFlfTEFORExPQ0tfS1VOSVRfVEVTVFxcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMzAtXFx0Ym9vbCBcXFwiS1VuaXQgdGVzdHMgZm9yIExhbmRsb2NrXFxcIiBpZiAhS1VOSVRfQUxMX1RFU1RTXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjAxLjMyNDQ1MDM2OFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1ODAyNzM3Mzk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgU3RyYXRlZ3kgZm9yIEtlcm5lbCBQYXRjaCBBbmFseXNpcyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBpZGVudGlmeSBhbmQganVzdGlmeSBmdXp6aW5nIHRoaXMgcGF0Y2guIEZpcnN0LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGtlcm5lbCBmdW5jdGlvbnMgaW50cm9kdWNlZCBvciBzaWduaWZpY2FudGx5IGFsdGVyZWQuIExvb2tzIGxpa2UgdGhlIHBhdGNoIHRvdWNoZXMgc2V2ZXJhbCBhcmVhczogYmxvY2sgZGV2aWNlcyAoYGJkZXYuY2ApLCBwYWdlIGNhY2hlIChgZHJvcF9jYWNoZXMuY2ApLCBHRlMyIGZpbGVzeXN0ZW1zIChgZ2ZzMi9vcHNfZnN0eXBlLmNgKSwgZ2VuZXJhbCBpbm9kZXMgKGBpbm9kZS5jYCksIHF1b3RhcyAoYHF1b3RhL2RxdW90LmNgKSwgYW5kIExhbmRsb2NrIHNlY3VyaXR5IChgc2VjdXJpdHkvbGFuZGxvY2svZnMuY2ApLlxuXG5JJ3ZlIGV4dHJhY3RlZCB0aGUga2V5IGZ1bmN0aW9ucyBmcm9tIHRoZSBwYXRjaCB0aGF0IHNlZW0gcmVsZXZhbnQuIEkndmUgc3BlY2lmaWNhbGx5IHRhcmdldGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiB1YmlxdWl0b3VzLCBsb3ctbGV2ZWwga2VybmVsIHJvdXRpbmVzLiBJJ20gbG9va2luZyBmb3IgZW50cnkgcG9pbnRzIG9yIGl0ZXJhdG9ycyB0aGF0IGRpcmVjdGx5IGV4ZXJjaXNlIHRoZSBjaGFuZ2VkIGNvZGUuIEJhc2VkIG9uIG15IGFuYWx5c2lzLCB0aGVzZSBmdW5jdGlvbnMgc3RhbmQgb3V0OiBgc2JfZm9yX2VhY2hfaW5vZGVzYCwgYGV2aWN0X2lub2Rlc2AsIGBkcm9wX3BhZ2VjYWNoZV9zYmAsIGBzeW5jX2JkZXZzYCwgYGFkZF9kcXVvdF9yZWZgLCBgZ2ZzMl9ldmljdF9pbm9kZXNgLCBhbmQgYGhvb2tfc2JfZGVsZXRlYC5cblxuTm93LCB0aGVzZSBhcmVuJ3QgeW91ciB0eXBpY2FsIGxpZmVjeWNsZSBob3QtcGF0aHM7IHRoZXkncmUgdmVyeSBzcGVjaWZpYyBWRlMsIGZpbGVzeXN0ZW0sIG9yIHNlY3VyaXR5IGVudHJ5IHBvaW50cyBhbmQgaXRlcmF0b3JzLiBTbywgSSBrbm93IHRoZXkncmUgbm90IGdvaW5nIHRvIGJlIG1hc3NpdmVseSBjYWxsZWQgZXZlcnl3aGVyZSwgYnV0IHRoZXkgbGlrZWx5IGFyZSBlbnRyeSBwb2ludHMgdGhhdCB3aWxsIGV4ZXJjaXNlIHRoaXMgY29kZS5cblxuSSd2ZSBhbHNvIGlkZW50aWZpZWQgdGhlIHJlbGV2YW50IGtlcm5lbCBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBhZmZlY3RlZDogYFFVT1RBYCwgYEdGUzJfRlNgLCBhbmQgYFNFQ1VSSVRZX0xBTkRMT0NLYC5cblxuTm93LCB0byBzb2xpZGlmeSB0aGlzLCBJIG5lZWQgdG8gYXJ0aWN1bGF0ZSB3aHkgdGhpcyB3YXJyYW50cyBmdXp6aW5nLiBUaGlzIHBhdGNoIGlzIHJlZmFjdG9yaW5nIHN1cGVyYmxvY2sgaW5vZGUgbGlzdCBpdGVyYXRpb24gYWNyb3NzIG11bHRpcGxlIGFyZWFzLCBpbnRyb2R1Y2luZyBgc2JfZm9yX2VhY2hfaW5vZGVzYCBhbmQgYW4gYWN0aXZlIGl0ZXJhdG9yIG1lY2hhbmlzbSAoYHNfaW5vZGVzX2l0ZXJzYCkuIFRoaXMgY2hhbmdlIGltcGxpZXMgYWx0ZXJhdGlvbnMgdG8gbG9ja2luZywgbGlzdCB0cmF2ZXJzYWwsIGFuZCBjb25jdXJyZW50IGlub2RlIGRlbGV0aW9uL2V2aWN0aW9uIHNlbWFudGljcy4gVGhhdCdzIGEgaHVnZSByZWQgZmxhZzogcmFjZSBjb25kaXRpb25zLCBsaXN0IGNvcnJ1cHRpb24sIGFuZCBsb2NraW5nIGlzc3VlcyBhcmUgYWxsIGxpa2VseSBoZXJlLlxuXG5HaXZlbiBhbGwgdGhpcywgSSdtIGNvbmZpZGVudCBpbiBzYXlpbmcgdGhhdCB0aGlzIHBhdGNoIGlzIHdvcnRoIGZ1enppbmcuIEkndmUgZ2F0aGVyZWQgYSBjbGVhciByZWFzb25pbmcsIGlkZW50aWZpZWQgdGhlIGZ1bmN0aW9ucywgYW5kIGxpc3RlZCByZWxldmFudCBjb25maWd1cmF0aW9ucy4gSSBjYW4gbm93IGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuIEkgYW0gcmVhZHkgdG8gbW92ZSBvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcxMTAsIk91dHB1dFRva2VucyI6MjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODkzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjA3LjEyNzE5MTIyMloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3NzU1NTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJRVU9UQVwiLFxuICAgIFwiR0ZTMl9GU1wiLFxuICAgIFwiU0VDVVJJVFlfTEFORExPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzYl9mb3JfZWFjaF9pbm9kZXNcIixcbiAgICBcImV2aWN0X2lub2Rlc1wiLFxuICAgIFwic3luY19iZGV2c1wiLFxuICAgIFwiZHJvcF9wYWdlY2FjaGVfc2JcIixcbiAgICBcImFkZF9kcXVvdF9yZWZcIixcbiAgICBcImdmczJfZXZpY3RfaW5vZGVzXCIsXG4gICAgXCJob29rX3NiX2RlbGV0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gZnJhbWV3b3JrIChzYl9mb3JfZWFjaF9pbm9kZXMpIHdpdGggZHluYW1pYyBpdGVyYXRvciBsaXN0IHRyYWNraW5nIChzX2lub2Rlc19pdGVycykgYW5kIHVwZGF0ZXMgdHJhdmVyc2FsIGxvb3BzIGluIFZGUyAoZXZpY3RfaW5vZGVzLCBkcm9wX2NhY2hlcyksIGJsb2NrIGRldmljZXMgKHN5bmNfYmRldnMpLCBxdW90YXMgKGFkZF9kcXVvdF9yZWYpLCBHRlMyIChnZnMyX2V2aWN0X2lub2RlcyksIGFuZCBMYW5kbG9jayAoaG9va19zYl9kZWxldGUpLiBUaGlzIHNpZ25pZmljYW50bHkgYWx0ZXJzIGxvY2tpbmcsIGxpc3QgbXV0YXRpb24gZHVyaW5nIHRyYXZlcnNhbCwgYW5kIHJlZmNvdW50aW5nIGFjcm9zcyBjb3JlIHN1YnN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciByYWNlcywgbGlzdCBjb3JydXB0aW9ucywgb3IgZGVhZGxvY2tzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlFVT1RBXCIsXG4gICAgXCJHRlMyX0ZTXCIsXG4gICAgXCJTRUNVUklUWV9MQU5ETE9DS1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNiX2Zvcl9lYWNoX2lub2Rlc1wiLFxuICAgIFwiZXZpY3RfaW5vZGVzXCIsXG4gICAgXCJzeW5jX2JkZXZzXCIsXG4gICAgXCJkcm9wX3BhZ2VjYWNoZV9zYlwiLFxuICAgIFwiYWRkX2RxdW90X3JlZlwiLFxuICAgIFwiZ2ZzMl9ldmljdF9pbm9kZXNcIixcbiAgICBcImhvb2tfc2JfZGVsZXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBmcmFtZXdvcmsgKHNiX2Zvcl9lYWNoX2lub2Rlcykgd2l0aCBkeW5hbWljIGl0ZXJhdG9yIGxpc3QgdHJhY2tpbmcgKHNfaW5vZGVzX2l0ZXJzKSBhbmQgdXBkYXRlcyB0cmF2ZXJzYWwgbG9vcHMgaW4gVkZTIChldmljdF9pbm9kZXMsIGRyb3BfY2FjaGVzKSwgYmxvY2sgZGV2aWNlcyAoc3luY19iZGV2cyksIHF1b3RhcyAoYWRkX2RxdW90X3JlZiksIEdGUzIgKGdmczJfZXZpY3RfaW5vZGVzKSwgYW5kIExhbmRsb2NrIChob29rX3NiX2RlbGV0ZSkuIFRoaXMgc2lnbmlmaWNhbnRseSBhbHRlcnMgbG9ja2luZywgbGlzdCBtdXRhdGlvbiBkdXJpbmcgdHJhdmVyc2FsLCBhbmQgcmVmY291bnRpbmcgYWNyb3NzIGNvcmUgc3Vic3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIHJhY2VzLCBsaXN0IGNvcnJ1cHRpb25zLCBvciBkZWFkbG9ja3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjA3LjIwNDk1NDcxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTQ0NzcyNDA5NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjA3LjIwNTUwNDkzWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTE0NDcxNjkxODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXFxuXFxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxcbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXFxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG5cXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcXG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXFxuXFxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiNDZlM2Q5NmM5YTE3MTA3MjBiODNiMzllOWZmYTEyNmY5ODgwZDY1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBTZXAgOSAxMToxMDo0MSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuY1xuaW5kZXggY2Q4MzIzMDgzNzQwNi4uYWU0NzJhMDYyZTUxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2JkZXYuY1xuKysrIGIvYmxvY2svYmRldi5jXG5AQCAtMTMzNiw1NiArMTMzNiw1MyBAQCB2b2lkIGJkZXZfbWFya19kZWFkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGJvb2wgc3VycHJpc2UpXG4gICovXG4gRVhQT1JUX1NZTUJPTF9HUEwoYmRldl9tYXJrX2RlYWQpO1xuIFxuLXZvaWQgc3luY19iZGV2cyhib29sIHdhaXQpXG4rc3RhdGljIGludCBzeW5jX2JkZXZzX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbi1cdFx0c3RydWN0IGJsb2NrX2RldmljZSAqYmRldjtcbitcdGJvb2wgd2FpdCA9IChib29sKWRhdGE7XG4rXHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2O1xuK1x0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS1cdTAwM2VpX21hcHBpbmc7XG4gXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fFxuLVx0XHQgICAgbWFwcGluZy1cdTAwM2VucnBhZ2VzID09IDApIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdF9faWdldChpbm9kZSk7XG4rXHRpZiAobWFwcGluZy1cdTAwM2VucnBhZ2VzID09IDApIHtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJ2lub2RlJyBzbyBpdCBjb3VsZG4ndCBoYXZlIGJlZW5cbitcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4rXHQgKiBzX2lub2RlX2xpc3RfbG9jay5cbitcdCAqL1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdGJkZXYgPSBJX0JERVYoaW5vZGUpO1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4rXHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbitcdFx0OyAvKiBza2lwICovXG4rXHR9IGVsc2UgaWYgKHdhaXQpIHtcbiBcdFx0Lypcbi1cdFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxuLVx0XHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxuLVx0XHQgKiBzX2lub2RlX2xpc3RfbG9jayAgV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW5cbi1cdFx0ICogYmUgaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcbi1cdFx0ICogbGF0ZXIuXG4rXHRcdCAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc29cbitcdFx0ICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmdcbitcdFx0ICogZnN5bmMoMikuIFNlZSBmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycygpIGZvclxuK1x0XHQgKiBkZXRhaWxzLlxuIFx0XHQgKi9cbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0YmRldiA9IElfQkRFVihpbm9kZSk7XG4tXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2YmRldi1cdTAwM2ViZF9kaXNrLVx1MDAzZW9wZW5fbXV0ZXgpO1xuLVx0XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbi1cdFx0XHQ7IC8qIHNraXAgKi9cbi1cdFx0fSBlbHNlIGlmICh3YWl0KSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBXZSBrZWVwIHRoZSBlcnJvciBzdGF0dXMgb2YgaW5kaXZpZHVhbCBtYXBwaW5nIHNvXG4tXHRcdFx0ICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmdcbi1cdFx0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4tXHRcdFx0ICogZGV0YWlscy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9XG4tXHRcdG11dGV4X3VubG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0ZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbitcdH0gZWxzZSB7XG4rXHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2YmRldi1cdTAwM2ViZF9kaXNrLVx1MDAzZW9wZW5fbXV0ZXgpO1xuK1x0aXB1dChpbm9kZSk7XG4rXG4rXHRzcGluX2xvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbit7XG4rXHRzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsXG4rXHRcdFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xuIH1cbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2ZzL2Ryb3BfY2FjaGVzLmMgYi9mcy9kcm9wX2NhY2hlcy5jXG5pbmRleCA0OWY1NmE1OThlY2JjLi4wZDQ3NWE1ZmY4Y2ZiIDEwMDY0NFxuLS0tIGEvZnMvZHJvcF9jYWNoZXMuY1xuKysrIGIvZnMvZHJvcF9jYWNoZXMuY1xuQEAgLTE2LDM2ICsxNiwzMCBAQFxuIC8qIEEgZ2xvYmFsIHZhcmlhYmxlIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBrZWVwcyB0aGUgY29kZSBzaW1wbGUgKi9cbiBzdGF0aWMgaW50IHN5c2N0bF9kcm9wX2NhY2hlcztcbiBcbi1zdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXG4rc3RhdGljIGludCBkcm9wX3BhZ2VjYWNoZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnVudXNlZClcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqdG9wdXRfaW5vZGUgPSBOVUxMO1xuK1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgbXVzdCBza2lwIGlub2RlcyBpbiB1bnVzdWFsIHN0YXRlLiBXZSBtYXkgYWxzbyBza2lwXG4tXHRcdCAqIGlub2RlcyB3aXRob3V0IHBhZ2VzIGJ1dCB3ZSBkZWxpYmVyYXRlbHkgd29uJ3QgaW4gY2FzZVxuLVx0XHQgKiB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgdG8gYXZvaWQgc29mdGxvY2t1cHMuXG4tXHRcdCAqL1xuLVx0XHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XG4tXHRcdCAgICAobWFwcGluZ19lbXB0eShpbm9kZS1cdTAwM2VpX21hcHBpbmcpIFx1MDAyNlx1MDAyNiAhbmVlZF9yZXNjaGVkKCkpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRfX2lnZXQoaW5vZGUpO1xuK1x0aWYgKG1hcHBpbmdfZW1wdHkoaW5vZGUtXHUwMDNlaV9tYXBwaW5nKSkge1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXG4tXHRcdGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS1cdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcbi1cdFx0aXB1dCh0b3B1dF9pbm9kZSk7XG4tXHRcdHRvcHV0X2lub2RlID0gaW5vZGU7XG4tXG4tXHRcdGNvbmRfcmVzY2hlZCgpO1xuLVx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbiBcdH1cbitcbitcdF9faWdldChpbm9kZSk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0aXB1dCh0b3B1dF9pbm9kZSk7XG4rXG4rXHRpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtXHUwMDNlaV9tYXBwaW5nLCAwLCAtMSk7XG4rXHRpcHV0KGlub2RlKTtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxuK3tcbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRyb3BfY2FjaGVzX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG5kaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDRcbi0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG4rKysgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuQEAgLTk5Niw3ICs5OTYsNyBAQCBzdGF0aWMgaW50IGdmczJfbG1fbW91bnQoc3RydWN0IGdmczJfc2JkICpzZHAsIGludCBzaWxlbnQpXG4gXHRcdHN3aXRjaCAodG9rZW4pIHtcbiBcdFx0Y2FzZSBPcHRfamlkOlxuIFx0XHRcdHJldCA9IG1hdGNoX2ludChcdTAwMjZ0bXBbMF0sIFx1MDAyNm9wdGlvbik7XG4tXHRcdFx0aWYgKHJldCB8fCBvcHRpb24gXHUwMDNjIDApIFxuK1x0XHRcdGlmIChyZXQgfHwgb3B0aW9uIFx1MDAzYyAwKVxuIFx0XHRcdFx0Z290byBob3N0ZGF0YV9lcnJvcjtcbiBcdFx0XHRpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNERl9OT0pPVVJOQUxJRCwgXHUwMDI2c2RwLVx1MDAzZXNkX2ZsYWdzKSlcbiBcdFx0XHRcdGxzLVx1MDAzZWxzX2ppZCA9IG9wdGlvbjtcbkBAIC0xNzE5LDYgKzE3MTksMTkgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdHJldHVybiAwO1xuIH1cbiBcbitzdGF0aWMgaW50IGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpXG4re1xuK1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4rXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcbitcdGlwdXQoaW5vZGUpO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKipcbiAgKiBnZnMyX2V2aWN0X2lub2RlcyAtIGV2aWN0IGlub2RlcyBjb29wZXJhdGl2ZWx5XG4gICogQHNiOiB0aGUgc3VwZXJibG9ja1xuQEAgLTE3NDEsMzEgKzE3NTQsMTAgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiAgKi9cbiBzdGF0aWMgdm9pZCBnZnMyX2V2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLVx1MDAzZXNfZnNfaW5mbztcbiBcbiBcdHNldF9iaXQoU0RGX0VWSUNUSU5HLCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmICgoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAhbmVlZF9yZXNjaGVkKCkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdF9faWdldChpbm9kZSk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbi1cdFx0aXB1dCh0b3B1dF9pbm9kZSk7XG4tXHRcdHRvcHV0X2lub2RlID0gaW5vZGU7XG4tXG4tXHRcdGNvbmRfcmVzY2hlZCgpO1xuLVx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0aXB1dCh0b3B1dF9pbm9kZSk7XG4rXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBnZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuY1xuaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDRcbi0tLSBhL2ZzL2lub2RlLmNcbisrKyBiL2ZzL2lub2RlLmNcbkBAIC02OSw2ICs2OSwxNSBAQCBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGVtcHR5X2FvcHMgPSB7XG4gfTtcbiBFWFBPUlRfU1lNQk9MKGVtcHR5X2FvcHMpO1xuIFxuK3N0cnVjdCBpbm9kZV9pdGVyIHtcbitcdHN0cnVjdCBsaXN0X2hlYWRcdGl0ZXJzX25vZGU7XHQvKiBzYi1cdTAwM2VzX2lub2Rlc19pdGVycyAqL1xuK1x0c3RydWN0IGxpc3RfaGVhZFx0Km5leHQ7XHRcdC8qIG5leHQgbm9kZSBnb2luZyB0byBpdGVyYXRlICovXG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XG4rXHRpbm9kZV9pdGVyX2NiIGZ1bmM7XG4rXHR2b2lkICpkYXRhO1xuK1x0aW50IHJldDtcbit9O1xuK1xuIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBucl9pbm9kZXMpO1xuIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBucl91bnVzZWQpO1xuIFxuQEAgLTY0MSwxMiArNjUwLDk2IEBAIHZvaWQgaW5vZGVfc2JfbGlzdF9hZGQoc3RydWN0IGlub2RlICppbm9kZSlcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5vZGVfc2JfbGlzdF9hZGQpO1xuIFxuK3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxuK1x0XHRcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxuK3tcbitcdGl0LVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4rXHRpdC1cdTAwM2VmdW5jID0gZm47XG4rXHRpdC1cdTAwM2VkYXRhID0gZGF0YTtcbitcdGl0LVx1MDAzZXJldCA9IDA7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0aXQtXHUwMDNlbmV4dCA9IHNiLVx1MDAzZXNfaW5vZGVzLm5leHQ7XG4rXHRsaXN0X2FkZChcdTAwMjZpdC1cdTAwM2VpdGVyc19ub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfZW5kKHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbit7XG4rXHRsaXN0X2RlbChcdTAwMjZpdC1cdTAwM2VpdGVyc19ub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgaW5vZGVfc2JfaXRlcl9uZXh0KHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbit7XG4rXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDtcbitcdGludCByZXQ7XG4rXG4rXHR3aGlsZSAoIWlub2RlIFx1MDAyNlx1MDAyNiBpdC1cdTAwM2VuZXh0ICE9IFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzKSB7XG4rXHRcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cdTAwM2VuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7XG4rXHRcdGlmIChpdC1cdTAwM2VmbGFncyBcdTAwMjYgSU5PREVfSVRFUl9VTlVTRUQpIHtcbitcdFx0XHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpIHtcbitcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdFx0aWYgKGljb3VudF9yZWFkKGlub2RlKSkge1xuK1x0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdH1cbitcbitcdFx0aWYgKChpdC1cdTAwM2VmbGFncyBcdTAwMjYgSU5PREVfSVRFUl9OT1JNQUwpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7XG4rXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdHJldCA9IGl0LVx1MDAzZWZ1bmMoaW5vZGUsIGl0LVx1MDAzZWRhdGEpO1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0aXQtXHUwMDNlcmV0ID0gcmV0O1xuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0fVxuK1xuK1x0XHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcbitcdFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIGl0LVx1MDAzZW5leHQgPT0gXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMgPyBmYWxzZSA6IHRydWU7XG4rfVxuK1xuK2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbit7XG4rXHRzdHJ1Y3QgaW5vZGVfaXRlciBpdDtcbitcbitcdGlub2RlX3NiX2l0ZXJfc3RhcnQoc2IsIFx1MDAyNml0LCBmbGFncywgZm4sIGRhdGEpO1xuK1x0d2hpbGUgKGlub2RlX3NiX2l0ZXJfbmV4dChcdTAwMjZpdCwgc2IpKVxuK1x0XHQ7XG4rXHRpbm9kZV9zYl9pdGVyX2VuZChcdTAwMjZpdCwgc2IpO1xuK1xuK1x0cmV0dXJuIGl0LnJldDtcbit9XG4rRVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpO1xuK1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9zYl9saXN0X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIHtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuK1x0c3RydWN0IGlub2RlX2l0ZXIgKml0O1xuIFxuIFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdCkpIHtcbiBcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeShpdCwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXNfaXRlcnMsIGl0ZXJzX25vZGUpIHtcbitcdFx0XHRpZiAoaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpXG4rXHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaW5vZGUtXHUwMDNlaV9zYl9saXN0Lm5leHQ7XG4rXHRcdH1cbiBcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpO1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXHR9XG5AQCAtODY2LDYgKzk1OSwxNyBAQCBzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZClcbiBcdH1cbiB9XG4gXG4rc3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuK3tcbitcdHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRhdGE7XG4rXG4rXHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XG4rXHRpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdGxpc3RfYWRkKFx1MDAyNmlub2RlLVx1MDAzZWlfbHJ1LCBkaXNwb3NlKTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKipcbiAgKiBldmljdF9pbm9kZXNcdC0gZXZpY3QgYWxsIGV2aWN0YWJsZSBpbm9kZXMgZm9yIGEgc3VwZXJibG9ja1xuICAqIEBzYjpcdFx0c3VwZXJibG9jayB0byBvcGVyYXRlIG9uXG5AQCAtODc3LDQ0ICs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXG4gICovXG4gdm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0TElTVF9IRUFEKGRpc3Bvc2UpO1xuK1x0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUwgfCBJTk9ERV9JVEVSX1VOVVNFRDtcbiBcbi1hZ2Fpbjpcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdGlmIChpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmIChpY291bnRfcmVhZChpbm9kZSkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XG4tXHRcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGxpc3RfYWRkKFx1MDAyNmlub2RlLVx1MDAzZWlfbHJ1LCBcdTAwMjZkaXNwb3NlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlblxuLVx0XHQgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYVxuLVx0XHQgKiBiaXQgc28gd2UgZG9uJ3QgbGl2ZWxvY2suXG4tXHRcdCAqL1xuLVx0XHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdFx0ZGlzcG9zZV9saXN0KFx1MDAyNmRpc3Bvc2UpO1xuLVx0XHRcdGdvdG8gYWdhaW47XG4tXHRcdH1cbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiLCBcdTAwMjZkaXNwb3NlKTtcbiBcdGRpc3Bvc2VfbGlzdChcdTAwMjZkaXNwb3NlKTtcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwoZXZpY3RfaW5vZGVzKTtcbmRpZmYgLS1naXQgYS9mcy9xdW90YS9kcXVvdC5jIGIvZnMvcXVvdGEvZHF1b3QuY1xuaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDRcbi0tLSBhL2ZzL3F1b3RhL2RxdW90LmNcbisrKyBiL2ZzL3F1b3RhL2RxdW90LmNcbkBAIC0xMDQzLDY0ICsxMDQzLDQ4IEBAIHN0YXRpYyBpbnQgZHFpbml0X25lZWRlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSlcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBzX3Vtb3VudCBzZW1hcGhvcmUgKi9cbi1zdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4rc3RhdGljIGludCBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDtcbitcdGludCB0eXBlID0gKihpbnQgKilkYXRhO1xuK1x0aW50IGVyciA9IDA7XG4rXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXG4gXHRpbnQgcmVzZXJ2ZWQgPSAwO1xuICNlbmRpZlxuLVx0aW50IGVyciA9IDA7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSB8fFxuLVx0XHQgICAgIWF0b21pY19yZWFkKFx1MDAyNmlub2RlLVx1MDAzZWlfd3JpdGVjb3VudCkgfHxcbi1cdFx0ICAgICFkcWluaXRfbmVlZGVkKGlub2RlLCB0eXBlKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbitcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuK1x0ICAgICFkcWluaXRfbmVlZGVkKGlub2RlLCB0eXBlKSkge1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXG4gI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVR1xuLVx0XHRpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgXHUwMDNlIDApKVxuLVx0XHRcdHJlc2VydmVkID0gMTtcbitcdGlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSBcdTAwM2UgMCkpXG4rXHRcdHJlc2VydmVkID0gMTtcbiAjZW5kaWZcbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xuLVx0XHRpZiAoZXJyKSB7XG4tXHRcdFx0aXB1dChpbm9kZSk7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxuLVx0XHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxuLVx0XHQgKiBzX2lub2RlX2xpc3RfbG9jay4gV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW4gYmVcbi1cdFx0ICogaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcbi1cdFx0ICogbGF0ZXIuXG4tXHRcdCAqL1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4tb3V0OlxuK1x0ZXJyID0gX19kcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTtcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXG4tXHRpZiAocmVzZXJ2ZWQpIHtcbi1cdFx0cXVvdGFfZXJyb3Ioc2IsIFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uIFwiXG4tXHRcdFx0XCJ0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5IGluY29uc2lzdGVudC4gXCJcbi1cdFx0XHRcIlBsZWFzZSBydW4gcXVvdGFjaGVjayg4KVwiKTtcbi1cdH1cbitcdGlmIChyZXNlcnZlZClcbitcdFx0cXVvdGFfZXJyb3Ioc2IsIFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIFwiXG4rXHRcdFx0ICAgIFwib24gdGh1cyBxdW90YSBpbmZvcm1hdGlvbiBpcyBwcm9iYWJseSBcIlxuK1x0XHRcdCAgICBcImluY29uc2lzdGVudC4gUGxlYXNlIHJ1biBxdW90YWNoZWNrKDgpXCIpO1xuICNlbmRpZlxuK1x0aXB1dChpbm9kZSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4rLyogVGhpcyByb3V0aW5lIGlzIGd1YXJkZWQgYnkgc191bW91bnQgc2VtYXBob3JlICovXG4rc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuK3tcbitcdHJldHVybiBzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLFxuK1x0XHRcdFx0ICBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2IsIFx1MDAyNnR5cGUpO1xuK31cbitcbiBzdGF0aWMgdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG5kaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmNcbmluZGV4IDA1ZTQ0MzE3MzAzODcuLjNlMDY5MTUwYzU0NDUgMTAwNjQ0XG4tLS0gYS9mcy9zdXBlci5jXG4rKysgYi9mcy9zdXBlci5jXG5AQCAtMzgyLDYgKzM4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmFsbG9jX3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBpbnQgZmxhZ3MsXG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfcm9vdHNfbG9jayk7XG4gXHRtdXRleF9pbml0KFx1MDAyNnMtXHUwMDNlc19zeW5jX2xvY2spO1xuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlcyk7XG4rXHRJTklUX0xJU1RfSEVBRChcdTAwMjZzLVx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcbiBcdHNwaW5fbG9ja19pbml0KFx1MDAyNnMtXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlc193Yik7XG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfaW5vZGVfd2JsaXN0X2xvY2spO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaFxuaW5kZXggZjlkMWUwNWU4YWU2OC4uZjMxNzZhYjEwZTY1ZiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnMuaFxuKysrIGIvaW5jbHVkZS9saW51eC9mcy5oXG5AQCAtMjk2LDcgKzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7XG4gICovXG4gI2RlZmluZSBGSUxFU1lTVEVNX01BWF9TVEFDS19ERVBUSCAyXG4gXG4tLyoqIFxuKy8qKlxuICAqIGVudW0gcG9zaXRpdmVfYW9wX3JldHVybnMgLSBhb3AgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lmaWMgc2VtYW50aWNzXG4gICpcbiAgKiBAQU9QX1dSSVRFUEFHRV9BQ1RJVkFURTogSW5mb3JtcyB0aGUgY2FsbGVyIHRoYXQgcGFnZSB3cml0ZWJhY2sgaGFzXG5AQCAtMzA2LDcgKzMwNiw3IEBAIHN0cnVjdCBpYXR0ciB7XG4gICogXHRcdFx0ICAgIGJlIGEgY2FuZGlkYXRlIGZvciB3cml0ZWJhY2sgYWdhaW4gaW4gdGhlIG5lYXJcbiAgKiBcdFx0XHQgICAgZnV0dXJlLiAgT3RoZXIgY2FsbGVycyBtdXN0IGJlIGNhcmVmdWwgdG8gdW5sb2NrXG4gICogXHRcdFx0ICAgIHRoZSBwYWdlIGlmIHRoZXkgZ2V0IHRoaXMgcmV0dXJuLiAgUmV0dXJuZWQgYnlcbi0gKiBcdFx0XHQgICAgd3JpdGVwYWdlKCk7IFxuKyAqXHRcdFx0ICAgIHdyaXRlcGFnZSgpO1xuICAqXG4gICogQEFPUF9UUlVOQ0FURURfUEFHRTogVGhlIEFPUCBtZXRob2QgdGhhdCB3YXMgaGFuZGVkIGEgbG9ja2VkIHBhZ2UgaGFzXG4gICogIFx0XHRcdHVubG9ja2VkIGl0IGFuZCB0aGUgcGFnZSBtaWdodCBoYXZlIGJlZW4gdHJ1bmNhdGVkLlxuQEAgLTg3MCw2ICs4NzAsMjEgQEAgc3RydWN0IGlub2RlIHtcbiBcdHZvaWRcdFx0XHQqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovXG4gfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XG4gXG4rZW51bSBpbm9kZV9pdGVyX2ZsYWdzX2VudW0ge1xuK1x0SU5PREVfSVRFUl9OT1JNQUwgPSAoMVUgXHUwMDNjXHUwMDNjIDEpLCAgLyogRXhjbHVkZSBpbm9kZXMgd2l0aCAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkuICovXG4rXHRJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSBcdTAwM2NcdTAwM2MgMiksICAvKiBPbmx5IHJldHVybiBpbm9kZXMgd2l0aCAoaV9jb3VudCA9PSAwKS4gKi9cbit9O1xuK1xuKy8qXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICAgICAgICAgIGVuZFxuKyAqICBpbm9kZS1cdTAwM2VpX2xvY2sgICAgICAgICAgICAgIGxvY2tlZCAgICAgICAgIHVubG9ja2VkXG4rICogIHNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrICAgICAgbG9ja2VkICAgICAgICAgbG9ja2VkXG4rICovXG4rdHlwZWRlZiBpbnQgKCppbm9kZV9pdGVyX2NiKSAoc3RydWN0IGlub2RlICosIHZvaWQgKik7XG4rXG4raW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4rXHRcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKTtcbitcbiAvKlxuICAqIGlfc3RhdGUgaGFuZGxpbmdcbiAgKlxuQEAgLTEzMTUsOCArMTMzMCwxMCBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X2ZpbGVfYWN0aXZlKHN0cnVjdCBmaWxlICoqZik7XG4gXG4gI2RlZmluZVx0TUFYX05PTl9MRlNcdCgoMVVMXHUwMDNjXHUwMDNjMzEpIC0gMSlcbiBcbi0vKiBQYWdlIGNhY2hlIGxpbWl0LiBUaGUgZmlsZXN5c3RlbXMgc2hvdWxkIHB1dCB0aGF0IGludG8gdGhlaXIgc19tYXhieXRlcyBcbi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIFxuKy8qXG4rICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXNcbisgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uXG4rICovXG4gI2lmIEJJVFNfUEVSX0xPTkc9PTMyXG4gI2RlZmluZSBNQVhfTEZTX0ZJTEVTSVpFXHQoKGxvZmZfdClVTE9OR19NQVggXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpXG4gI2VsaWYgQklUU19QRVJfTE9ORz09NjRcbkBAIC0yMjg1LDcgKzIzMDIsNyBAQCBpbnQgc3luY19pbm9kZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCk7XG4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUge1xuIFx0Y29uc3QgY2hhciAqbmFtZTtcbiBcdGludCBmc19mbGFncztcbi0jZGVmaW5lIEZTX1JFUVVJUkVTX0RFVlx0XHQxIFxuKyNkZWZpbmUgRlNfUkVRVUlSRVNfREVWXHRcdDFcbiAjZGVmaW5lIEZTX0JJTkFSWV9NT1VOVERBVEFcdDJcbiAjZGVmaW5lIEZTX0hBU19TVUJUWVBFXHRcdDRcbiAjZGVmaW5lIEZTX1VTRVJOU19NT1VOVFx0XHQ4XHQvKiBDYW4gYmUgbW91bnRlZCBieSB1c2VybnMgcm9vdCAqL1xuQEAgLTI5MDcsNyArMjkyNCw3IEBAIHNzaXplX3QgX19rZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKTtcbiBleHRlcm4gc3NpemVfdCBrZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTtcbiBleHRlcm4gc3NpemVfdCBfX2tlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqIG9wZW5fZXhlYyhjb25zdCBjaGFyICopO1xuLSBcbitcbiAvKiBmcy9kY2FjaGUuYyAtLSBnZW5lcmljIGZzIHN1cHBvcnQgZnVuY3Rpb25zICovXG4gZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTtcbiBleHRlcm4gYm9vbCBwYXRoX2lzX3VuZGVyKGNvbnN0IHN0cnVjdCBwYXRoICosIGNvbnN0IHN0cnVjdCBwYXRoICopO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuKysrIGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG5AQCAtMjY5LDkgKzI2OSwxMCBAQCBzdHJ1Y3Qgc3VwZXJfYmxvY2sge1xuIFx0ICovXG4gXHRpbnQgc19zdGFja19kZXB0aDtcbiBcbi1cdC8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzICovXG4rXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyBhbmQgc19pbm9kZXNfaXRlcnMgKi9cbiBcdHNwaW5sb2NrX3RcdFx0XHRcdHNfaW5vZGVfbGlzdF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXM7XHQvKiBhbGwgaW5vZGVzICovXG4rXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfaXRlcnM7IC8qIGFsbCBpdGVyYXRvcnMgKi9cbiBcbiBcdHNwaW5sb2NrX3RcdFx0XHRcdHNfaW5vZGVfd2JsaXN0X2xvY2s7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfd2I7XHQvKiB3cml0ZWJhY2sgaW5vZGVzICovXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbGFuZGxvY2svZnMuYyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbmluZGV4IDMwYWE2Y2UxMzU5MGEuLjNkY2RlOGNiZmI2YWYgMTAwNjQ0XG4tLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG4rKysgYi9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG5AQCAtMTM2OSwxMTAgKzEzNjksODAgQEAgc3RhdGljIHZvaWQgaG9va19pbm9kZV9mcmVlX3NlY3VyaXR5X3JjdSh2b2lkICppbm9kZV9zZWN1cml0eSlcbiBcbiAvKiBTdXBlci1ibG9jayBob29rcyAqL1xuIFxuLS8qXG4tICogUmVsZWFzZSB0aGUgaW5vZGVzIHVzZWQgaW4gYSBzZWN1cml0eSBwb2xpY3kuXG4tICpcbi0gKiBDZi4gZnNub3RpZnlfdW5tb3VudF9pbm9kZXMoKSBhbmQgZXZpY3RfaW5vZGVzKClcbi0gKi9cbi1zdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxuK3N0YXRpYyBpbnQgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpwcmV2X2lub2RlID0gTlVMTDtcbitcdHN0cnVjdCBsYW5kbG9ja19vYmplY3QgKm9iamVjdDtcbitcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuIFxuLVx0aWYgKCFsYW5kbG9ja19pbml0aWFsaXplZClcbi1cdFx0cmV0dXJuO1xuK1x0aWYgKCFhdG9taWNfcmVhZChcdTAwMjZpbm9kZS1cdTAwM2VpX2NvdW50KSkge1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHN0cnVjdCBsYW5kbG9ja19vYmplY3QgKm9iamVjdDtcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0KTtcbitcdGlmICghb2JqZWN0KSB7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gXG4tXHRcdC8qIE9ubHkgaGFuZGxlcyByZWZlcmVuY2VkIGlub2Rlcy4gKi9cbi1cdFx0aWYgKCFpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcbi1cdFx0XHRjb250aW51ZTtcbitcdC8qXG4rXHQgKiBJZiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHJlbGVhc2VfaW5vZGUoKSBvbmdvaW5nLCB0aGVuIHdlXG4rXHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxuK1x0ICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC5cbitcdCAqL1xuK1x0c3Bpbl9sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbitcdGlmIChvYmplY3QtXHUwMDNldW5kZXJvYmogPT0gaW5vZGUpIHtcbitcdFx0b2JqZWN0LVx1MDAzZXVuZGVyb2JqID0gTlVMTDtcbitcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdFx0Lypcbi1cdFx0ICogUHJvdGVjdHMgYWdhaW5zdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiBpbm9kZSAoZS5nLlxuLVx0XHQgKiBmcm9tIGdldF9pbm9kZV9vYmplY3QoKSkuXG4rXHRcdCAqIEJlY2F1c2Ugb2JqZWN0LVx1MDAzZXVuZGVyb2JqIHdhcyBub3QgTlVMTCxcbitcdFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXG4rXHRcdCAqIHRoYXQgaXQgaXMgc2FmZSB0byByZXNldFxuK1x0XHQgKiBsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLlxuK1x0XHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVx1MDAzZWlfbG9jay5cbiBcdFx0ICovXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCwgTlVMTCk7XG4gXHRcdC8qXG4tXHRcdCAqIENoZWNrcyBJX0ZSRUVJTkcgYW5kIElfV0lMTF9GUkVFICB0byBwcm90ZWN0IGFnYWluc3QgYSByYWNlXG4tXHRcdCAqIGNvbmRpdGlvbiB3aGVuIHJlbGVhc2VfaW5vZGUoKSBqdXN0IGNhbGxlZCBpcHV0KCksIHdoaWNoXG4tXHRcdCAqIGNvdWxkIGxlYWQgdG8gYSBOVUxMIGRlcmVmZXJlbmNlIG9mIGlub2RlLVx1MDAzZXNlY3VyaXR5IG9yIGFcbi1cdFx0ICogc2Vjb25kIGNhbGwgdG8gaXB1dCgpIGZvciB0aGUgc2FtZSBMYW5kbG9jayBvYmplY3QuICBBbHNvXG4tXHRcdCAqIGNoZWNrcyBJX05FVyBiZWNhdXNlIHN1Y2ggaW5vZGUgY2Fubm90IGJlIHRpZWQgdG8gYW4gb2JqZWN0LlxuK1x0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzXG4rXHRcdCAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlXG4rXHRcdCAqIF9faWdldCgpIHJlZmVyZW5jZSB0aGF0IHdlIGp1c3Qgc2V0IGluIHRoaXMgbG9vcFxuK1x0XHQgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlc1xuK1x0XHQgKiBvbiB0aGUgaW5vZGUuXG4gXHRcdCAqL1xuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2XG4tXHRcdCAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4rXHRcdGlwdXRfbm90X2xhc3QoaW5vZGUpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdH1cbiBcbi1cdFx0cmN1X3JlYWRfbG9jaygpO1xuLVx0XHRvYmplY3QgPSByY3VfZGVyZWZlcmVuY2UobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCk7XG4tXHRcdGlmICghb2JqZWN0KSB7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHQvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi9cbi1cdFx0X19pZ2V0KGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdGlwdXQoaW5vZGUpO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZVxuLVx0XHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxuLVx0XHQgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLlxuLVx0XHQgKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbi1cdFx0aWYgKG9iamVjdC1cdTAwM2V1bmRlcm9iaiA9PSBpbm9kZSkge1xuLVx0XHRcdG9iamVjdC1cdTAwM2V1bmRlcm9iaiA9IE5VTEw7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQmVjYXVzZSBvYmplY3QtXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxuLVx0XHRcdCAqIHJlbGVhc2VfaW5vZGUoKSBhbmQgZ2V0X2lub2RlX29iamVjdCgpIGd1YXJhbnRlZVxuLVx0XHRcdCAqIHRoYXQgaXQgaXMgc2FmZSB0byByZXNldFxuLVx0XHRcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3Qgd2hpbGUgaXQgaXMgbm90IE5VTEwuXG4tXHRcdFx0ICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS1cdTAwM2VpX2xvY2suXG4tXHRcdFx0ICovXG4tXHRcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3QsIE5VTEwpO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogQXQgdGhpcyBwb2ludCwgd2Ugb3duIHRoZSBpaG9sZCgpIHJlZmVyZW5jZSB0aGF0IHdhc1xuLVx0XHRcdCAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlXG4tXHRcdFx0ICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wXG4tXHRcdFx0ICogd2Fsay4gIFRoZXJlZm9yZSB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHJlZmVyZW5jZXNcbi1cdFx0XHQgKiBvbiB0aGUgaW5vZGUuXG4tXHRcdFx0ICovXG4tXHRcdFx0aXB1dF9ub3RfbGFzdChpbm9kZSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuLVx0XHR9XG4rLypcbisgKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cbisgKlxuKyAqIENmLiBmc25vdGlmeV91bm1vdW50X2lub2RlcygpIGFuZCBldmljdF9pbm9kZXMoKVxuKyAqL1xuK3N0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXG4re1xuK1x0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUw7XG4gXG4tXHRcdGlmIChwcmV2X2lub2RlKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBvd24gdGhlIF9faWdldCgpIHJlZmVyZW5jZVxuLVx0XHRcdCAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2Vcbi1cdFx0XHQgKiBjYW4gZHJvcCB0aGUgbGlzdCBsb2NrIGFuZCBrbm93IHRoYXQgdGhlIGlub2RlIHdvbid0XG4tXHRcdFx0ICogZGlzYXBwZWFyIGZyb20gdW5kZXIgdXMgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFdlIGNhbiBub3cgYWN0dWFsbHkgcHV0IHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGVcbi1cdFx0XHQgKiBwcmV2aW91cyBsb29wIHdhbGssIHdoaWNoIGlzIG5vdCBuZWVkZWQgYW55bW9yZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpcHV0KHByZXZfaW5vZGUpO1xuLVx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuLVx0XHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRcdH1cbi1cdFx0cHJldl9pbm9kZSA9IGlub2RlO1xuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0aWYgKCFsYW5kbG9ja19pbml0aWFsaXplZClcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG4gXG4tXHQvKiBQdXRzIHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGUgbGFzdCBsb29wIHdhbGssIGlmIGFueS4gKi9cbi1cdGlmIChwcmV2X2lub2RlKVxuLVx0XHRpcHV0KHByZXZfaW5vZGUpO1xuIFx0LyogV2FpdHMgZm9yIHBlbmRpbmcgaXB1dCgpIGluIHJlbGVhc2VfaW5vZGUoKS4gKi9cbiBcdHdhaXRfdmFyX2V2ZW50KFx1MDAyNmxhbmRsb2NrX3N1cGVyYmxvY2soc2IpLVx1MDAzZWlub2RlX3JlZnMsXG4gXHRcdCAgICAgICAhYXRvbWljX2xvbmdfcmVhZChcdTAwMjZsYW5kbG9ja19zdXBlcmJsb2NrKHNiKS1cdTAwM2Vpbm9kZV9yZWZzKSk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMToxMTowNy4yMDU1MDcxMVoiLCJTZXEiOjE1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTQ0NzE0NDUzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBFdmFsdWF0aW9uOiBQYXRjaCBJbnRyb2R1Y2luZyBgc2JfZm9yX2VhY2hfaW5vZGVzYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCwgd2hpY2ggaW50cm9kdWNlcyBhIG5ldyBpdGVyYXRvciBmb3IgaW5vZGVzIHdpdGhpbiBhIHN1cGVyYmxvY2ssIHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiwgb3IgaWYgaXQncyBzdWZmaWNpZW50bHkgY292ZXJlZCBieSBleGlzdGluZyBLQVNBTiBhbmQgb3RoZXIgZGVidWdnaW5nIHRvb2xzLlxuXG5GaXJzdCwgSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIHBhdGNoIGl0c2VsZi4gSXQncyBlc3NlbnRpYWxseSBpbnRyb2R1Y2luZyBhIGhlbHBlciBmdW5jdGlvbiwgYHNiX2Zvcl9lYWNoX2lub2Rlc2AsIGFuZCBhbiBhc3NvY2lhdGVkIGl0ZXJhdG9yIHN0cnVjdHVyZSwgYGlub2RlX2l0ZXJgLCB0byBzdHJlYW1saW5lIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBgc19pbm9kZXNgIGxpc3Qgb2YgYSBzdXBlcmJsb2NrLiBTZXZlcmFsIGV4aXN0aW5nIGZ1bmN0aW9ucyB0aGF0IGl0ZXJhdGUgaW5vZGVzIGFyZSBiZWluZyByZWZhY3RvcmVkIHRvIHVzZSB0aGlzIG5ldyBpdGVyYXRvci4gVGhlIHBhdGNoIGFsc28gYWRkcyBhIGBzX2lub2Rlc19pdGVyc2AgbGlzdCB0byB0aGUgYHN1cGVyX2Jsb2NrYCBzdHJ1Y3R1cmUgdG8gdHJhY2sgdGhlIGl0ZXJhdG9ycy5cblxuTm93LCBsZXQncyBkcmlsbCBkb3duIGludG8gdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLCBpbmZvIGxlYWtzLCBvciBhbnkgb3RoZXIgS01TQU4tc3BlY2lmaWMgY29uY2VybnMuXG5cbkkndmUgZXhhbWluZWQgdGhlIGNvZGUgY2xvc2VseS4gVGhlIGBpbm9kZV9pdGVyYCBzdHJ1Y3R1cmUgaXRzZWxmIGlzIHN0YWNrLWFsbG9jYXRlZCB3aXRoaW4gdGhlIGBzYl9mb3JfZWFjaF9pbm9kZXNgIGZ1bmN0aW9uLCBhbmQgYWxsIGl0cyBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgYGlub2RlX3NiX2l0ZXJfc3RhcnRgIGZ1bmN0aW9uLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgd2l0aGluIHRoZSBpdGVyYXRvci4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggZG9lcyBub3QgY29weSBhbnkga2VybmVsIGRhdGEgdG8gdXNlciBzcGFjZS4gSXQgYWxzbyBsb29rcyBsaWtlIHRoZSBgZGF0YWAgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgZWl0aGVyIGEgbnVsbCBwb2ludGVyLCBvciBhbiBpbml0aWFsaXplZCB2YXJpYWJsZS4gVGhlIGBpbm9kZV9zYl9pdGVyX25leHRgIGZ1bmN0aW9uJ3MgbG9naWMgaXMgY2xlYXIsIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2dpY2FsIGJ1ZyBpbiBpdCwgaXQgaXMgbm90IGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLlxuXG5TbywgYW0gSSBzZWVpbmcgYW55dGhpbmcgdGhhdCB3b3VsZCBmYWxsIGludG8gdGhlIGNhdGVnb3JpZXMgd2hlcmUgS01TQU4gaXMgc3BlY2lmaWNhbGx5IG5lZWRlZD8gTm8sIG5vdCByZWFsbHkuIFRoZSBwcmltYXJ5IHJpc2tzIGFwcGVhciB0byBiZSByZWxhdGVkIHRvIGNvbmN1cnJlbmN5LCBsb2NraW5nLCBhbmQgcG90ZW50aWFsbHkgdXNlLWFmdGVyLWZyZWUgYnVncy4gVGhpbmdzIGxpa2UgZHJvcHBpbmcgYW5kIHJldGFraW5nIHRoZSBgc19pbm9kZV9saXN0X2xvY2tgIHdoaWxlIGBpdC1cdTAwM2VuZXh0YCBpcyB1cGRhdGVkLiBUaGVzZSBraW5kcyBvZiBidWdzIGFyZSB0aGUgYnJlYWQgYW5kIGJ1dHRlciBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGluZnJhc3RydWN0dXJlLlxuXG5JJ3ZlIHJldmlld2VkIHRoZSBndWlkZWxpbmVzLiBJIG5lZWQgdG8gYXNrIG15c2VsZjogRG9lcyB0aGlzIHBhdGNoIGludHJvZHVjZSBvciBtb2RpZnk6XG4xLiAgS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlPyBOby5cbjIuICBDb25kaXRpb25hbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vLlxuMy4gIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZD8gTm8uXG40LiAgQm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzPyBOby5cblxuVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXMgbm90IGV4cG9zZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBBbGwgc3RydWN0dXJlcyB0b3VjaGVkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIHRoZSBpbnRyb2R1Y2VkIGJ1Z3MgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBObyBLTVNBTiBpcyBuZWVkZWQuXG5cbkknbSBjb21mb3J0YWJsZSBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYCBmb3IgdGhpcyBwYXRjaC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEyMDksIk91dHB1dFRva2VucyI6MzQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjI2NSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjE4LjY1MjY1NTQ1NFoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NzIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBpbnRlcm5hbCBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gYWNyb3NzIHNldmVyYWwgc3Vic3lzdGVtcyAoYmxvY2ssIGRyb3BfY2FjaGVzLCBnZnMyLCB2ZnMgaW5vZGUsIHF1b3RhLCBsYW5kbG9jaykgYnkgaW50cm9kdWNpbmcgYSBnZW5lcmljIGhlbHBlciBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGFuZCBpdGVyYXRvciBzdHJ1Y3R1cmUgYHN0cnVjdCBpbm9kZV9pdGVyYC5cXG5cXG4tIFVuaW5pdGlhbGl6ZWQgbWVtb3J5IC8gS01TQU4gcGVyc3BlY3RpdmU6XFxuICAtIFRoZSBuZXdseSBpbnRyb2R1Y2VkIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IGlub2RlX2l0ZXJgIGluIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGlub2RlX3NiX2l0ZXJfc3RhcnQoKWAuXFxuICAtIEFsbCBjYWxsYmFjayBkYXRhIHBheWxvYWRzIHBhc3NlZCB0byB0aGUgaXRlcmF0b3IgZnVuY3Rpb25zIGFyZSBlaXRoZXIgTlVMTCBvciBwb2ludGVycyB0byBmdWxseSBpbml0aWFsaXplZCB2YXJpYWJsZXMvc3RydWN0dXJlcyAoZS5nLiwgYm9vbGVhbiBjYXN0LCBpbml0aWFsaXplZCBsaW5rZWQgbGlzdCBoZWFkLCBpbnRlZ2VyIHBvaW50ZXIpLlxcbiAgLSBObyBrZXJuZWwgZGF0YSBpcyBjb3BpZWQgb3IgZXhwb3NlZCB0byB1c2VyIHNwYWNlIChubyBgY29weV90b191c2VyYCwgaW9jdGxzLCBuZXRsaW5rIG1lc3NhZ2VzLCBldGMuKS5cXG4gIC0gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgY29uZGl0aW9uYWwgYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxcblxcbi0gS0FTQU4gLyBMT0NLREVQIHBlcnNwZWN0aXZlOlxcbiAgLSBQb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCByZWxhdGUgdG8gbGlzdCBtYW5pcHVsYXRpb24sIHJlZmNvdW50aW5nIChgX19pZ2V0YC9gaXB1dGApLCBsb2NraW5nIHNlbWFudGljcyB1bmRlciBgc2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrYCBhbmQgYGlub2RlLVxcdTAwM2VpX2xvY2tgLCBvciB1c2UtYWZ0ZXItZnJlZS9yYWNlIGNvbmRpdGlvbnMgaWYgbGlzdCBub2RlcyBhcmUgZGVsZXRlZCBkdXJpbmcgdHJhdmVyc2FsLiBUaGVzZSBhcmUgZnVsbHkgY292ZXJlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIGBERUJVR19MSVNUYC5cXG5cXG5UaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXFxuXFxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxcbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXFxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG5cXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcXG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXFxuXFxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-09 10:24:22 +0000 UTC FinishedAt: 2026-09-09 11:11:20 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "dd660a0e0fee1bc892e16fdb6abdf92676515175", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "QUOTA", "GFS2_FS", "SECURITY_LANDLOCK" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "dd660a0e0fee1bc892e16fdb6abdf92676515175", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "QUOTA", "GFS2_FS", "SECURITY_LANDLOCK" ], "series_id": "2f6305a7-997e-43d4-9575-8204b7abcd49" }, "track": "KASAN", "fuzz": { "focus": [ "fs" ], "focus_symbols": [ "sb_for_each_inodes", "evict_inodes", "sync_bdevs", "drop_pagecache_sb", "add_dquot_ref", "gfs2_evict_inodes", "hook_sb_delete" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1FVT1RBJiMzNDssCiAgICAmIzM0O0dGUzJfRlMmIzM0OywKICAgICYjMzQ7U0VDVVJJVFlfTEFORExPQ0smIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzYl9mb3JfZWFjaF9pbm9kZXMmIzM0OywKICAgICYjMzQ7ZXZpY3RfaW5vZGVzJiMzNDssCiAgICAmIzM0O3N5bmNfYmRldnMmIzM0OywKICAgICYjMzQ7ZHJvcF9wYWdlY2FjaGVfc2ImIzM0OywKICAgICYjMzQ7YWRkX2RxdW90X3JlZiYjMzQ7LAogICAgJiMzNDtnZnMyX2V2aWN0X2lub2RlcyYjMzQ7LAogICAgJiMzNDtob29rX3NiX2RlbGV0ZSYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXG5cbi0gVW5pbml0aWFsaXplZCBtZW1vcnkgLyBLTVNBTiBwZXJzcGVjdGl2ZTpcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxuICAtIEFsbCBjYWxsYmFjayBkYXRhIHBheWxvYWRzIHBhc3NlZCB0byB0aGUgaXRlcmF0b3IgZnVuY3Rpb25zIGFyZSBlaXRoZXIgTlVMTCBvciBwb2ludGVycyB0byBmdWxseSBpbml0aWFsaXplZCB2YXJpYWJsZXMvc3RydWN0dXJlcyAoZS5nLiwgYm9vbGVhbiBjYXN0LCBpbml0aWFsaXplZCBsaW5rZWQgbGlzdCBoZWFkLCBpbnRlZ2VyIHBvaW50ZXIpLlxuICAtIE5vIGtlcm5lbCBkYXRhIGlzIGNvcGllZCBvciBleHBvc2VkIHRvIHVzZXIgc3BhY2UgKG5vIGBjb3B5X3RvX3VzZXJgLCBpb2N0bHMsIG5ldGxpbmsgbWVzc2FnZXMsIGV0Yy4pLlxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cblxuLSBLQVNBTiAvIExPQ0tERVAgcGVyc3BlY3RpdmU6XG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrYCBhbmQgYGlub2RlLVx1MDAzZWlfbG9ja2AsIG9yIHVzZS1hZnRlci1mcmVlL3JhY2UgY29uZGl0aW9ucyBpZiBsaXN0IG5vZGVzIGFyZSBkZWxldGVkIGR1cmluZyB0cmF2ZXJzYWwuIFRoZXNlIGFyZSBmdWxseSBjb3ZlcmVkIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgYERFQlVHX0xJU1RgLlxuXG5UaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIGZyYW1ld29yayAoc2JfZm9yX2VhY2hfaW5vZGVzKSB3aXRoIGR5bmFtaWMgaXRlcmF0b3IgbGlzdCB0cmFja2luZyAoc19pbm9kZXNfaXRlcnMpIGFuZCB1cGRhdGVzIHRyYXZlcnNhbCBsb29wcyBpbiBWRlMgKGV2aWN0X2lub2RlcywgZHJvcF9jYWNoZXMpLCBibG9jayBkZXZpY2VzIChzeW5jX2JkZXZzKSwgcXVvdGFzIChhZGRfZHF1b3RfcmVmKSwgR0ZTMiAoZ2ZzMl9ldmljdF9pbm9kZXMpLCBhbmQgTGFuZGxvY2sgKGhvb2tfc2JfZGVsZXRlKS4gVGhpcyBzaWduaWZpY2FudGx5IGFsdGVycyBsb2NraW5nLCBsaXN0IG11dGF0aW9uIGR1cmluZyB0cmF2ZXJzYWwsIGFuZCByZWZjb3VudGluZyBhY3Jvc3MgY29yZSBzdWJzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgcmFjZXMsIGxpc3QgY29ycnVwdGlvbnMsIG9yIGRlYWRsb2Nrcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IGI0NmUzZDk2YzlhMTcxMDcyMGI4M2IzOWU5ZmZhMTI2Zjk4ODBkNjVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDExOjEwOjQxIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuY1xuaW5kZXggY2Q4MzIzMDgzNzQwNi4uYWU0NzJhMDYyZTUxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2JkZXYuY1xuJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmRldi5jXG5AQCAtMTMzNiw1NiAmIzQzOzEzMzYsNTMgQEAgdm9pZCBiZGV2X21hcmtfZGVhZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBib29sIHN1cnByaXNlKVxuICAqL1xuIEVYUE9SVF9TWU1CT0xfR1BMKGJkZXZfbWFya19kZWFkKTtcbiBcbi12b2lkIHN5bmNfYmRldnMoYm9vbCB3YWl0KVxuJiM0MztzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXHUwMDNlaV9tYXBwaW5nO1xuLVx0XHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2O1xuJiM0MztcdGJvb2wgd2FpdCA9IChib29sKWRhdGE7XG4mIzQzO1x0c3RydWN0IGJsb2NrX2RldmljZSAqYmRldjtcbiYjNDM7XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbiBcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpIHx8XG4tXHRcdCAgICBtYXBwaW5nLVx1MDAzZW5ycGFnZXMgPT0gMCkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRpZiAobWFwcGluZy1cdTAwM2VucnBhZ2VzID09IDApIHtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAmIzM5O2lub2RlJiMzOTsgc28gaXQgY291bGRuJiMzOTt0IGhhdmUgYmVlblxuJiM0MztcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4mIzQzO1x0ICogc19pbm9kZV9saXN0X2xvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuJiM0MztcdGJkZXYgPSBJX0JERVYoaW5vZGUpO1xuJiM0MztcbiYjNDM7XHRtdXRleF9sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbiYjNDM7XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbiYjNDM7XHRcdDsgLyogc2tpcCAqL1xuJiM0MztcdH0gZWxzZSBpZiAod2FpdCkge1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICYjMzk7aW5vZGUmIzM5OyBzbyBpdCBjb3VsZG4mIzM5O3QgaGF2ZSBiZWVuXG4tXHRcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrICBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhblxuLVx0XHQgKiBiZSBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXJcbi1cdFx0ICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdFxuLVx0XHQgKiBsYXRlci5cbiYjNDM7XHRcdCAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc29cbiYjNDM7XHRcdCAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nXG4mIzQzO1x0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4mIzQzO1x0XHQgKiBkZXRhaWxzLlxuIFx0XHQgKi9cbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0YmRldiA9IElfQkRFVihpbm9kZSk7XG4tXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2YmRldi1cdTAwM2ViZF9kaXNrLVx1MDAzZW9wZW5fbXV0ZXgpO1xuLVx0XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbi1cdFx0XHQ7IC8qIHNraXAgKi9cbi1cdFx0fSBlbHNlIGlmICh3YWl0KSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBXZSBrZWVwIHRoZSBlcnJvciBzdGF0dXMgb2YgaW5kaXZpZHVhbCBtYXBwaW5nIHNvXG4tXHRcdFx0ICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmdcbi1cdFx0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4tXHRcdFx0ICogZGV0YWlscy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9XG4tXHRcdG11dGV4X3VubG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRcdGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4mIzQzO1x0bXV0ZXhfdW5sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbiYjNDM7XHRpcHV0KGlub2RlKTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7dm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbiYjNDM7e1xuJiM0MztcdHNiX2Zvcl9lYWNoX2lub2RlcyhibG9ja2Rldl9zdXBlcmJsb2NrLCBJTk9ERV9JVEVSX05PUk1BTCxcbiYjNDM7XHRcdFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xuIH1cbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2ZzL2Ryb3BfY2FjaGVzLmMgYi9mcy9kcm9wX2NhY2hlcy5jXG5pbmRleCA0OWY1NmE1OThlY2JjLi4wZDQ3NWE1ZmY4Y2ZiIDEwMDY0NFxuLS0tIGEvZnMvZHJvcF9jYWNoZXMuY1xuJiM0MzsmIzQzOyYjNDM7IGIvZnMvZHJvcF9jYWNoZXMuY1xuQEAgLTE2LDM2ICYjNDM7MTYsMzAgQEBcbiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovXG4gc3RhdGljIGludCBzeXNjdGxfZHJvcF9jYWNoZXM7XG4gXG4tc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxuJiM0MztzdGF0aWMgaW50IGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgbXVzdCBza2lwIGlub2RlcyBpbiB1bnVzdWFsIHN0YXRlLiBXZSBtYXkgYWxzbyBza2lwXG4tXHRcdCAqIGlub2RlcyB3aXRob3V0IHBhZ2VzIGJ1dCB3ZSBkZWxpYmVyYXRlbHkgd29uJiMzOTt0IGluIGNhc2Vcbi1cdFx0ICogd2UgbmVlZCB0byByZXNjaGVkdWxlIHRvIGF2b2lkIHNvZnRsb2NrdXBzLlxuLVx0XHQgKi9cbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSB8fFxuLVx0XHQgICAgKG1hcHBpbmdfZW1wdHkoaW5vZGUtXHUwMDNlaV9tYXBwaW5nKSBcdTAwMjZcdTAwMjYgIW5lZWRfcmVzY2hlZCgpKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRpZiAobWFwcGluZ19lbXB0eShpbm9kZS1cdTAwM2VpX21hcHBpbmcpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbi1cdFx0aW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLVx1MDAzZWlfbWFwcGluZywgMCwgLTEpO1xuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiBcdH1cbiYjNDM7XG4mIzQzO1x0X19pZ2V0KGlub2RlKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0aXB1dCh0b3B1dF9pbm9kZSk7XG4mIzQzO1xuJiM0MztcdGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS1cdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcbiYjNDM7XHRpcHV0KGlub2RlKTtcbiYjNDM7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGRyb3BfcGFnZWNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnVudXNlZClcbiYjNDM7e1xuJiM0MztcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRyb3BfY2FjaGVzX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG5kaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDRcbi0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuQEAgLTk5Niw3ICYjNDM7OTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KVxuIFx0XHRzd2l0Y2ggKHRva2VuKSB7XG4gXHRcdGNhc2UgT3B0X2ppZDpcbiBcdFx0XHRyZXQgPSBtYXRjaF9pbnQoXHUwMDI2dG1wWzBdLCBcdTAwMjZvcHRpb24pO1xuLVx0XHRcdGlmIChyZXQgfHwgb3B0aW9uIFx1MDAzYyAwKSBcbiYjNDM7XHRcdFx0aWYgKHJldCB8fCBvcHRpb24gXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGhvc3RkYXRhX2Vycm9yO1xuIFx0XHRcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpKVxuIFx0XHRcdFx0bHMtXHUwMDNlbHNfamlkID0gb3B0aW9uO1xuQEAgLTE3MTksNiAmIzQzOzE3MTksMTkgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4mIzQzO1xuJiM0MztcdF9faWdldChpbm9kZSk7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlwdXQoaW5vZGUpO1xuJiM0MztcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4gLyoqXG4gICogZ2ZzMl9ldmljdF9pbm9kZXMgLSBldmljdCBpbm9kZXMgY29vcGVyYXRpdmVseVxuICAqIEBzYjogdGhlIHN1cGVyYmxvY2tcbkBAIC0xNzQxLDMxICYjNDM7MTc1NCwxMCBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuICAqL1xuIHN0YXRpYyB2b2lkIGdmczJfZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItXHUwMDNlc19mc19pbmZvO1xuIFxuIFx0c2V0X2JpdChTREZfRVZJQ1RJTkcsIFx1MDAyNnNkcC1cdTAwM2VzZF9mbGFncyk7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KHRvcHV0X2lub2RlKTtcbiYjNDM7XHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBnZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuY1xuaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDRcbi0tLSBhL2ZzL2lub2RlLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2lub2RlLmNcbkBAIC02OSw2ICYjNDM7NjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0ge1xuIH07XG4gRVhQT1JUX1NZTUJPTChlbXB0eV9hb3BzKTtcbiBcbiYjNDM7c3RydWN0IGlub2RlX2l0ZXIge1xuJiM0MztcdHN0cnVjdCBsaXN0X2hlYWRcdGl0ZXJzX25vZGU7XHQvKiBzYi1cdTAwM2VzX2lub2Rlc19pdGVycyAqL1xuJiM0MztcdHN0cnVjdCBsaXN0X2hlYWRcdCpuZXh0O1x0XHQvKiBuZXh0IG5vZGUgZ29pbmcgdG8gaXRlcmF0ZSAqL1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncztcbiYjNDM7XHRpbm9kZV9pdGVyX2NiIGZ1bmM7XG4mIzQzO1x0dm9pZCAqZGF0YTtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0Mzt9O1xuJiM0MztcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfaW5vZGVzKTtcbiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfdW51c2VkKTtcbiBcbkBAIC02NDEsMTIgJiM0Mzs2NTAsOTYgQEAgdm9pZCBpbm9kZV9zYl9saXN0X2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChpbm9kZV9zYl9saXN0X2FkZCk7XG4gXG4mIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxuJiM0MztcdFx0XHRcdHVuc2lnbmVkIGludCBmbGFncywgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdGl0LVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4mIzQzO1x0aXQtXHUwMDNlZnVuYyA9IGZuO1xuJiM0MztcdGl0LVx1MDAzZWRhdGEgPSBkYXRhO1xuJiM0MztcdGl0LVx1MDAzZXJldCA9IDA7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRpdC1cdTAwM2VuZXh0ID0gc2ItXHUwMDNlc19pbm9kZXMubmV4dDtcbiYjNDM7XHRsaXN0X2FkZChcdTAwMjZpdC1cdTAwM2VpdGVyc19ub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycyk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfZW5kKHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7e1xuJiM0MztcdGxpc3RfZGVsKFx1MDAyNml0LVx1MDAzZWl0ZXJzX25vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgaW5vZGVfc2JfaXRlcl9uZXh0KHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdHdoaWxlICghaW5vZGUgXHUwMDI2XHUwMDI2IGl0LVx1MDAzZW5leHQgIT0gXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMpIHtcbiYjNDM7XHRcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cdTAwM2VuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7XG4mIzQzO1x0XHRpZiAoaXQtXHUwMDNlZmxhZ3MgXHUwMDI2IElOT0RFX0lURVJfVU5VU0VEKSB7XG4mIzQzO1x0XHRcdGlmIChpY291bnRfcmVhZF9vbmNlKGlub2RlKSkge1xuJiM0MztcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4mIzQzO1x0XHRcdFx0Y29udGludWU7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdFx0XHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XG4mIzQzO1x0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuJiM0MztcdFx0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0XHR9XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAoKGl0LVx1MDAzZWZsYWdzIFx1MDAyNiBJTk9ERV9JVEVSX05PUk1BTCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0XHQgICAgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4mIzQzO1x0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4mIzQzO1x0XHRcdGNvbnRpbnVlO1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4mIzQzO1x0XHRyZXQgPSBpdC1cdTAwM2VmdW5jKGlub2RlLCBpdC1cdTAwM2VkYXRhKTtcbiYjNDM7XHRcdGlmIChyZXQpIHtcbiYjNDM7XHRcdFx0aXQtXHUwMDNlcmV0ID0gcmV0O1xuJiM0MztcdFx0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKG5lZWRfcmVzY2hlZCgpKSB7XG4mIzQzO1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4mIzQzO1x0XHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRyZXR1cm4gaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcyA/IGZhbHNlIDogdHJ1ZTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4mIzQzO1x0XHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBpbm9kZV9pdGVyIGl0O1xuJiM0MztcbiYjNDM7XHRpbm9kZV9zYl9pdGVyX3N0YXJ0KHNiLCBcdTAwMjZpdCwgZmxhZ3MsIGZuLCBkYXRhKTtcbiYjNDM7XHR3aGlsZSAoaW5vZGVfc2JfaXRlcl9uZXh0KFx1MDAyNml0LCBzYikpXG4mIzQzO1x0XHQ7XG4mIzQzO1x0aW5vZGVfc2JfaXRlcl9lbmQoXHUwMDI2aXQsIHNiKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGl0LnJldDtcbiYjNDM7fVxuJiM0MztFWFBPUlRfU1lNQk9MKHNiX2Zvcl9lYWNoX2lub2Rlcyk7XG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9zYl9saXN0X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIHtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuJiM0MztcdHN0cnVjdCBpbm9kZV9pdGVyICppdDtcbiBcbiBcdGlmICghbGlzdF9lbXB0eShcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpKSB7XG4gXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4mIzQzO1x0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0LCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycywgaXRlcnNfbm9kZSkge1xuJiM0MztcdFx0XHRpZiAoaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpXG4mIzQzO1x0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGlub2RlLVx1MDAzZWlfc2JfbGlzdC5uZXh0O1xuJiM0MztcdFx0fVxuIFx0XHRsaXN0X2RlbF9pbml0KFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdCk7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdH1cbkBAIC04NjYsNiAmIzQzOzk1OSwxNyBAQCBzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZClcbiBcdH1cbiB9XG4gXG4mIzQzO3N0YXRpYyBpbnQgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRhdGE7XG4mIzQzO1xuJiM0MztcdGlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTtcbiYjNDM7XHRpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4mIzQzO1x0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9scnUsIGRpc3Bvc2UpO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIC8qKlxuICAqIGV2aWN0X2lub2Rlc1x0LSBldmljdCBhbGwgZXZpY3RhYmxlIGlub2RlcyBmb3IgYSBzdXBlcmJsb2NrXG4gICogQHNiOlx0XHRzdXBlcmJsb2NrIHRvIG9wZXJhdGUgb25cbkBAIC04NzcsNDQgJiM0Mzs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXG4gICovXG4gdm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0TElTVF9IRUFEKGRpc3Bvc2UpO1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMIHwgSU5PREVfSVRFUl9VTlVTRUQ7XG4gXG4tYWdhaW46XG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpXG4tXHRcdFx0Y29udGludWU7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cbi1cdFx0aW5vZGVfc3RhdGVfc2V0KGlub2RlLCBJX0ZSRUVJTkcpO1xuLVx0XHRpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRsaXN0X2FkZChcdTAwMjZpbm9kZS1cdTAwM2VpX2xydSwgXHUwMDI2ZGlzcG9zZSk7XG4tXG4tXHRcdC8qXG4tXHRcdCAqIFdlIGNhbiBoYXZlIGEgdG9uIG9mIGlub2RlcyB0byBldmljdCBhdCB1bm1vdW50IHRpbWUgZ2l2ZW5cbi1cdFx0ICogZW5vdWdoIG1lbW9yeSwgY2hlY2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gZ28gdG8gc2xlZXAgZm9yIGFcbi1cdFx0ICogYml0IHNvIHdlIGRvbiYjMzk7dCBsaXZlbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0XHRkaXNwb3NlX2xpc3QoXHUwMDI2ZGlzcG9zZSk7XG4tXHRcdFx0Z290byBhZ2Fpbjtcbi1cdFx0fVxuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuJiM0MztcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiLCBcdTAwMjZkaXNwb3NlKTtcbiBcdGRpc3Bvc2VfbGlzdChcdTAwMjZkaXNwb3NlKTtcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwoZXZpY3RfaW5vZGVzKTtcbmRpZmYgLS1naXQgYS9mcy9xdW90YS9kcXVvdC5jIGIvZnMvcXVvdGEvZHF1b3QuY1xuaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDRcbi0tLSBhL2ZzL3F1b3RhL2RxdW90LmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3F1b3RhL2RxdW90LmNcbkBAIC0xMDQzLDY0ICYjNDM7MTA0Myw0OCBAQCBzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tLyogVGhpcyByb3V0aW5lIGlzIGd1YXJkZWQgYnkgc191bW91bnQgc2VtYXBob3JlICovXG4tc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuJiM0MztzdGF0aWMgaW50IGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuJiM0MztcdGludCB0eXBlID0gKihpbnQgKilkYXRhO1xuJiM0MztcdGludCBlcnIgPSAwO1xuJiM0MztcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbiBcdGludCByZXNlcnZlZCA9IDA7XG4gI2VuZGlmXG4tXHRpbnQgZXJyID0gMDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XG4tXHRcdCAgICAhYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuLVx0XHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRfX2lnZXQoaW5vZGUpO1xuJiM0MztcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuJiM0MztcdCAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRfX2lnZXQoaW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4mIzQzO1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFxuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbi1cdFx0aWYgKHVubGlrZWx5KGlub2RlX2dldF9yc3Zfc3BhY2UoaW5vZGUpIFx1MDAzZSAwKSlcbi1cdFx0XHRyZXNlcnZlZCA9IDE7XG4mIzQzO1x0aWYgKHVubGlrZWx5KGlub2RlX2dldF9yc3Zfc3BhY2UoaW5vZGUpIFx1MDAzZSAwKSlcbiYjNDM7XHRcdHJlc2VydmVkID0gMTtcbiAjZW5kaWZcbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xuLVx0XHRpZiAoZXJyKSB7XG4tXHRcdFx0aXB1dChpbm9kZSk7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAmIzM5O2lub2RlJiMzOTsgc28gaXQgY291bGRuJiMzOTt0IGhhdmUgYmVlblxuLVx0XHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxuLVx0XHQgKiBzX2lub2RlX2xpc3RfbG9jay4gV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW4gYmVcbi1cdFx0ICogaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcbi1cdFx0ICogbGF0ZXIuXG4tXHRcdCAqL1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4tb3V0OlxuJiM0MztcdGVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7XG4gI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVR1xuLVx0aWYgKHJlc2VydmVkKSB7XG4tXHRcdHF1b3RhX2Vycm9yKHNiLCBcJiMzNDtXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgb24gXCYjMzQ7XG4tXHRcdFx0XCYjMzQ7dGh1cyBxdW90YSBpbmZvcm1hdGlvbiBpcyBwcm9iYWJseSBpbmNvbnNpc3RlbnQuIFwmIzM0O1xuLVx0XHRcdFwmIzM0O1BsZWFzZSBydW4gcXVvdGFjaGVjayg4KVwmIzM0Oyk7XG4tXHR9XG4mIzQzO1x0aWYgKHJlc2VydmVkKVxuJiM0MztcdFx0cXVvdGFfZXJyb3Ioc2IsIFwmIzM0O1dyaXRlcyBoYXBwZW5lZCBiZWZvcmUgcXVvdGEgd2FzIHR1cm5lZCBcJiMzNDtcbiYjNDM7XHRcdFx0ICAgIFwmIzM0O29uIHRodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICBcJiMzNDtpbmNvbnNpc3RlbnQuIFBsZWFzZSBydW4gcXVvdGFjaGVjayg4KVwmIzM0Oyk7XG4gI2VuZGlmXG4mIzQzO1x0aXB1dChpbm9kZSk7XG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuJiM0MzsvKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBzX3Vtb3VudCBzZW1hcGhvcmUgKi9cbiYjNDM7c3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsXG4mIzQzO1x0XHRcdFx0ICBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2IsIFx1MDAyNnR5cGUpO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyB2b2lkIHJlbW92ZV9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuY1xuaW5kZXggMDVlNDQzMTczMDM4Ny4uM2UwNjkxNTBjNTQ0NSAxMDA2NDRcbi0tLSBhL2ZzL3N1cGVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3N1cGVyLmNcbkBAIC0zODIsNiAmIzQzOzM4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmFsbG9jX3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBpbnQgZmxhZ3MsXG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfcm9vdHNfbG9jayk7XG4gXHRtdXRleF9pbml0KFx1MDAyNnMtXHUwMDNlc19zeW5jX2xvY2spO1xuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlcyk7XG4mIzQzO1x0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlc19pdGVycyk7XG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdElOSVRfTElTVF9IRUFEKFx1MDAyNnMtXHUwMDNlc19pbm9kZXNfd2IpO1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2cy1cdTAwM2VzX2lub2RlX3dibGlzdF9sb2NrKTtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmhcbmluZGV4IGY5ZDFlMDVlOGFlNjguLmYzMTc2YWIxMGU2NWYgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZnMuaFxuQEAgLTI5Niw3ICYjNDM7Mjk2LDcgQEAgc3RydWN0IGlhdHRyIHtcbiAgKi9cbiAjZGVmaW5lIEZJTEVTWVNURU1fTUFYX1NUQUNLX0RFUFRIIDJcbiBcbi0vKiogXG4mIzQzOy8qKlxuICAqIGVudW0gcG9zaXRpdmVfYW9wX3JldHVybnMgLSBhb3AgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lmaWMgc2VtYW50aWNzXG4gICpcbiAgKiBAQU9QX1dSSVRFUEFHRV9BQ1RJVkFURTogSW5mb3JtcyB0aGUgY2FsbGVyIHRoYXQgcGFnZSB3cml0ZWJhY2sgaGFzXG5AQCAtMzA2LDcgJiM0MzszMDYsNyBAQCBzdHJ1Y3QgaWF0dHIge1xuICAqIFx0XHRcdCAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyXG4gICogXHRcdFx0ICAgIGZ1dHVyZS4gIE90aGVyIGNhbGxlcnMgbXVzdCBiZSBjYXJlZnVsIHRvIHVubG9ja1xuICAqIFx0XHRcdCAgICB0aGUgcGFnZSBpZiB0aGV5IGdldCB0aGlzIHJldHVybi4gIFJldHVybmVkIGJ5XG4tICogXHRcdFx0ICAgIHdyaXRlcGFnZSgpOyBcbiYjNDM7ICpcdFx0XHQgICAgd3JpdGVwYWdlKCk7XG4gICpcbiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXNcbiAgKiAgXHRcdFx0dW5sb2NrZWQgaXQgYW5kIHRoZSBwYWdlIG1pZ2h0IGhhdmUgYmVlbiB0cnVuY2F0ZWQuXG5AQCAtODcwLDYgJiM0Mzs4NzAsMjEgQEAgc3RydWN0IGlub2RlIHtcbiBcdHZvaWRcdFx0XHQqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovXG4gfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XG4gXG4mIzQzO2VudW0gaW5vZGVfaXRlcl9mbGFnc19lbnVtIHtcbiYjNDM7XHRJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSBcdTAwM2NcdTAwM2MgMSksICAvKiBFeGNsdWRlIGlub2RlcyB3aXRoIChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKS4gKi9cbiYjNDM7XHRJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSBcdTAwM2NcdTAwM2MgMiksICAvKiBPbmx5IHJldHVybiBpbm9kZXMgd2l0aCAoaV9jb3VudCA9PSAwKS4gKi9cbiYjNDM7fTtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAgICBlbmRcbiYjNDM7ICogIGlub2RlLVx1MDAzZWlfbG9jayAgICAgICAgICAgICAgbG9ja2VkICAgICAgICAgdW5sb2NrZWRcbiYjNDM7ICogIHNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrICAgICAgbG9ja2VkICAgICAgICAgbG9ja2VkXG4mIzQzOyAqL1xuJiM0Mzt0eXBlZGVmIGludCAoKmlub2RlX2l0ZXJfY2IpIChzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTtcbiYjNDM7XG4mIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLFxuJiM0MztcdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpO1xuJiM0MztcbiAvKlxuICAqIGlfc3RhdGUgaGFuZGxpbmdcbiAgKlxuQEAgLTEzMTUsOCAmIzQzOzEzMzAsMTAgQEAgc3RydWN0IGZpbGUgKmdldF9maWxlX2FjdGl2ZShzdHJ1Y3QgZmlsZSAqKmYpO1xuIFxuICNkZWZpbmVcdE1BWF9OT05fTEZTXHQoKDFVTFx1MDAzY1x1MDAzYzMxKSAtIDEpXG4gXG4tLyogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMgXG4tICAgbGltaXRzLCBvdGhlcndpc2UgYmFkIHRoaW5ncyBjYW4gaGFwcGVuIGluIFZNLiAqLyBcbiYjNDM7LypcbiYjNDM7ICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXNcbiYjNDM7ICogbGltaXRzLCBvdGhlcndpc2UgYmFkIHRoaW5ncyBjYW4gaGFwcGVuIGluIFZNLlxuJiM0MzsgKi9cbiAjaWYgQklUU19QRVJfTE9ORz09MzJcbiAjZGVmaW5lIE1BWF9MRlNfRklMRVNJWkVcdCgobG9mZl90KVVMT05HX01BWCBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVClcbiAjZWxpZiBCSVRTX1BFUl9MT05HPT02NFxuQEAgLTIyODUsNyAmIzQzOzIzMDIsNyBAQCBpbnQgc3luY19pbm9kZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCk7XG4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUge1xuIFx0Y29uc3QgY2hhciAqbmFtZTtcbiBcdGludCBmc19mbGFncztcbi0jZGVmaW5lIEZTX1JFUVVJUkVTX0RFVlx0XHQxIFxuJiM0MzsjZGVmaW5lIEZTX1JFUVVJUkVTX0RFVlx0XHQxXG4gI2RlZmluZSBGU19CSU5BUllfTU9VTlREQVRBXHQyXG4gI2RlZmluZSBGU19IQVNfU1VCVFlQRVx0XHQ0XG4gI2RlZmluZSBGU19VU0VSTlNfTU9VTlRcdFx0OFx0LyogQ2FuIGJlIG1vdW50ZWQgYnkgdXNlcm5zIHJvb3QgKi9cbkBAIC0yOTA3LDcgJiM0MzsyOTI0LDcgQEAgc3NpemVfdCBfX2tlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpO1xuIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopO1xuIGV4dGVybiBzc2l6ZV90IF9fa2VybmVsX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBsb2ZmX3QgKik7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICogb3Blbl9leGVjKGNvbnN0IGNoYXIgKik7XG4tIFxuJiM0MztcbiAvKiBmcy9kY2FjaGUuYyAtLSBnZW5lcmljIGZzIHN1cHBvcnQgZnVuY3Rpb25zICovXG4gZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTtcbiBleHRlcm4gYm9vbCBwYXRoX2lzX3VuZGVyKGNvbnN0IHN0cnVjdCBwYXRoICosIGNvbnN0IHN0cnVjdCBwYXRoICopO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG5AQCAtMjY5LDkgJiM0MzsyNjksMTAgQEAgc3RydWN0IHN1cGVyX2Jsb2NrIHtcbiBcdCAqL1xuIFx0aW50IHNfc3RhY2tfZGVwdGg7XG4gXG4tXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyAqL1xuJiM0MztcdC8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqL1xuIFx0c3BpbmxvY2tfdFx0XHRcdFx0c19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcbiBcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2RlcztcdC8qIGFsbCBpbm9kZXMgKi9cbiYjNDM7XHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfaXRlcnM7IC8qIGFsbCBpdGVyYXRvcnMgKi9cbiBcbiBcdHNwaW5sb2NrX3RcdFx0XHRcdHNfaW5vZGVfd2JsaXN0X2xvY2s7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfd2I7XHQvKiB3cml0ZWJhY2sgaW5vZGVzICovXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbGFuZGxvY2svZnMuYyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbmluZGV4IDMwYWE2Y2UxMzU5MGEuLjNkY2RlOGNiZmI2YWYgMTAwNjQ0XG4tLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG5AQCAtMTM2OSwxMTAgJiM0MzsxMzY5LDgwIEBAIHN0YXRpYyB2b2lkIGhvb2tfaW5vZGVfZnJlZV9zZWN1cml0eV9yY3Uodm9pZCAqaW5vZGVfc2VjdXJpdHkpXG4gXG4gLyogU3VwZXItYmxvY2sgaG9va3MgKi9cbiBcbi0vKlxuLSAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LlxuLSAqXG4tICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXG4tICovXG4tc3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYilcbiYjNDM7c3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMO1xuJiM0MztcdHN0cnVjdCBsYW5kbG9ja19vYmplY3QgKm9iamVjdDtcbiYjNDM7XHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiBcbi1cdGlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpXG4tXHRcdHJldHVybjtcbiYjNDM7XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmlub2RlLVx1MDAzZWlfY291bnQpKSB7XG4mIzQzO1x0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xuJiM0MztcdHJjdV9yZWFkX2xvY2soKTtcbiYjNDM7XHRvYmplY3QgPSByY3VfZGVyZWZlcmVuY2UobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCk7XG4mIzQzO1x0aWYgKCFvYmplY3QpIHtcbiYjNDM7XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuJiM0MztcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XHQvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi9cbiYjNDM7XHRfX2lnZXQoaW5vZGUpO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gXG4tXHRcdC8qIE9ubHkgaGFuZGxlcyByZWZlcmVuY2VkIGlub2Rlcy4gKi9cbi1cdFx0aWYgKCFpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcbi1cdFx0XHRjb250aW51ZTtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2VcbiYjNDM7XHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxuJiM0MztcdCAqIHdpbGwganVzdCB3YWl0IGZvciBpdCB0byBmaW5pc2guXG4mIzQzO1x0ICovXG4mIzQzO1x0c3Bpbl9sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbiYjNDM7XHRpZiAob2JqZWN0LVx1MDAzZXVuZGVyb2JqID09IGlub2RlKSB7XG4mIzQzO1x0XHRvYmplY3QtXHUwMDNldW5kZXJvYmogPSBOVUxMO1xuJiM0MztcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4gXG4gXHRcdC8qXG4tXHRcdCAqIFByb3RlY3RzIGFnYWluc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgaW5vZGUgKGUuZy5cbi1cdFx0ICogZnJvbSBnZXRfaW5vZGVfb2JqZWN0KCkpLlxuJiM0MztcdFx0ICogQmVjYXVzZSBvYmplY3QtXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxuJiM0MztcdFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXG4mIzQzO1x0XHQgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXRcbiYjNDM7XHRcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3Qgd2hpbGUgaXQgaXMgbm90IE5VTEwuXG4mIzQzO1x0XHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVx1MDAzZWlfbG9jay5cbiBcdFx0ICovXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3QsIE5VTEwpO1xuIFx0XHQvKlxuLVx0XHQgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZVxuLVx0XHQgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaFxuLVx0XHQgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS1cdTAwM2VzZWN1cml0eSBvciBhXG4tXHRcdCAqIHNlY29uZCBjYWxsIHRvIGlwdXQoKSBmb3IgdGhlIHNhbWUgTGFuZGxvY2sgb2JqZWN0LiAgQWxzb1xuLVx0XHQgKiBjaGVja3MgSV9ORVcgYmVjYXVzZSBzdWNoIGlub2RlIGNhbm5vdCBiZSB0aWVkIHRvIGFuIG9iamVjdC5cbiYjNDM7XHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcbiYjNDM7XHRcdCAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlXG4mIzQzO1x0XHQgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3BcbiYjNDM7XHRcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXG4mIzQzO1x0XHQgKiBvbiB0aGUgaW5vZGUuXG4gXHRcdCAqL1xuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2XG4tXHRcdCAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4mIzQzO1x0XHRpcHV0X25vdF9sYXN0KGlub2RlKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuJiM0MztcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0fVxuIFxuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4tXHRcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0KTtcbi1cdFx0aWYgKCFvYmplY3QpIHtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xuLVx0XHRfX2lnZXQoaW5vZGUpO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRpcHV0KGlub2RlKTtcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHJlbGVhc2VfaW5vZGUoKSBvbmdvaW5nLCB0aGVuIHdlXG4tXHRcdCAqIGFyZSBpbiBjaGFyZ2Ugb2YgY2FsbGluZyBpcHV0KCkgb24gdGhpcyBpbm9kZSwgb3RoZXJ3aXNlIHdlXG4tXHRcdCAqIHdpbGwganVzdCB3YWl0IGZvciBpdCB0byBmaW5pc2guXG4tXHRcdCAqL1xuLVx0XHRzcGluX2xvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRpZiAob2JqZWN0LVx1MDAzZXVuZGVyb2JqID09IGlub2RlKSB7XG4tXHRcdFx0b2JqZWN0LVx1MDAzZXVuZGVyb2JqID0gTlVMTDtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiBcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEJlY2F1c2Ugb2JqZWN0LVx1MDAzZXVuZGVyb2JqIHdhcyBub3QgTlVMTCxcbi1cdFx0XHQgKiByZWxlYXNlX2lub2RlKCkgYW5kIGdldF9pbm9kZV9vYmplY3QoKSBndWFyYW50ZWVcbi1cdFx0XHQgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXRcbi1cdFx0XHQgKiBsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLlxuLVx0XHRcdCAqIEl0IGlzIHRoZXJlZm9yZSBub3QgbmVjZXNzYXJ5IHRvIGxvY2sgaW5vZGUtXHUwMDNlaV9sb2NrLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHJjdV9hc3NpZ25fcG9pbnRlcihsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0LCBOVUxMKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcbi1cdFx0XHQgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZVxuLVx0XHRcdCAqIF9faWdldCgpIHJlZmVyZW5jZSB0aGF0IHdlIGp1c3Qgc2V0IGluIHRoaXMgbG9vcFxuLVx0XHRcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXG4tXHRcdFx0ICogb24gdGhlIGlub2RlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlwdXRfbm90X2xhc3QoaW5vZGUpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbi1cdFx0fVxuJiM0MzsvKlxuJiM0MzsgKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cbiYjNDM7ICpcbiYjNDM7ICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxuJiM0Mzt7XG4mIzQzO1x0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUw7XG4gXG4tXHRcdGlmIChwcmV2X2lub2RlKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBvd24gdGhlIF9faWdldCgpIHJlZmVyZW5jZVxuLVx0XHRcdCAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2Vcbi1cdFx0XHQgKiBjYW4gZHJvcCB0aGUgbGlzdCBsb2NrIGFuZCBrbm93IHRoYXQgdGhlIGlub2RlIHdvbiYjMzk7dFxuLVx0XHRcdCAqIGRpc2FwcGVhciBmcm9tIHVuZGVyIHVzIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay5cbi1cdFx0XHQgKi9cbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlXG4tXHRcdFx0ICogcHJldmlvdXMgbG9vcCB3YWxrLCB3aGljaCBpcyBub3QgbmVlZGVkIGFueW1vcmUuXG4tXHRcdFx0ICovXG4tXHRcdFx0aXB1dChwcmV2X2lub2RlKTtcbi1cdFx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0XHR9XG4tXHRcdHByZXZfaW5vZGUgPSBpbm9kZTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiYjNDM7XHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcbiBcbi1cdC8qIFB1dHMgdGhlIGlub2RlIHJlZmVyZW5jZSBmcm9tIHRoZSBsYXN0IGxvb3Agd2FsaywgaWYgYW55LiAqL1xuLVx0aWYgKHByZXZfaW5vZGUpXG4tXHRcdGlwdXQocHJldl9pbm9kZSk7XG4gXHQvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqL1xuIFx0d2FpdF92YXJfZXZlbnQoXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXHUwMDNlaW5vZGVfcmVmcyxcbiBcdFx0ICAgICAgICFhdG9taWNfbG9uZ19yZWFkKFx1MDAyNmxhbmRsb2NrX3N1cGVyYmxvY2soc2IpLVx1MDAzZWlub2RlX3JlZnMpKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtRVU9UQSYjMzQ7LAogICAgJiMzNDtHRlMyX0ZTJiMzNDssCiAgICAmIzM0O1NFQ1VSSVRZX0xBTkRMT0NLJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c2JfZm9yX2VhY2hfaW5vZGVzJiMzNDssCiAgICAmIzM0O2V2aWN0X2lub2RlcyYjMzQ7LAogICAgJiMzNDtzeW5jX2JkZXZzJiMzNDssCiAgICAmIzM0O2Ryb3BfcGFnZWNhY2hlX3NiJiMzNDssCiAgICAmIzM0O2FkZF9kcXVvdF9yZWYmIzM0OywKICAgICYjMzQ7Z2ZzMl9ldmljdF9pbm9kZXMmIzM0OywKICAgICYjMzQ7aG9va19zYl9kZWxldGUmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBmcmFtZXdvcmsgKHNiX2Zvcl9lYWNoX2lub2Rlcykgd2l0aCBkeW5hbWljIGl0ZXJhdG9yIGxpc3QgdHJhY2tpbmcgKHNfaW5vZGVzX2l0ZXJzKSBhbmQgdXBkYXRlcyB0cmF2ZXJzYWwgbG9vcHMgaW4gVkZTIChldmljdF9pbm9kZXMsIGRyb3BfY2FjaGVzKSwgYmxvY2sgZGV2aWNlcyAoc3luY19iZGV2cyksIHF1b3RhcyAoYWRkX2RxdW90X3JlZiksIEdGUzIgKGdmczJfZXZpY3RfaW5vZGVzKSwgYW5kIExhbmRsb2NrIChob29rX3NiX2RlbGV0ZSkuIFRoaXMgc2lnbmlmaWNhbnRseSBhbHRlcnMgbG9ja2luZywgbGlzdCBtdXRhdGlvbiBkdXJpbmcgdHJhdmVyc2FsLCBhbmQgcmVmY291bnRpbmcgYWNyb3NzIGNvcmUgc3Vic3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIHJhY2VzLCBsaXN0IGNvcnJ1cHRpb25zLCBvciBkZWFkbG9ja3MuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiNDZlM2Q5NmM5YTE3MTA3MjBiODNiMzllOWZmYTEyNmY5ODgwZDY1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAxMToxMDo0MSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuYwppbmRleCBjZDgzMjMwODM3NDA2Li5hZTQ3MmEwNjJlNTFjIDEwMDY0NAotLS0gYS9ibG9jay9iZGV2LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmRldi5jCkBAIC0xMzM2LDU2ICYjNDM7MTMzNiw1MyBAQCB2b2lkIGJkZXZfbWFya19kZWFkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGJvb2wgc3VycHJpc2UpCiAgKi8KIEVYUE9SVF9TWU1CT0xfR1BMKGJkZXZfbWFya19kZWFkKTsKIAotdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdCkKJiM0MztzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrKCZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLSZndDtpX21hcHBpbmc7Ci0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CWJvb2wgd2FpdCA9IChib29sKWRhdGE7CiYjNDM7CXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtJmd0O2lfbWFwcGluZzsKIAotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fAotCQkgICAgbWFwcGluZy0mZ3Q7bnJwYWdlcyA9PSAwKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKG1hcHBpbmctJmd0O25ycGFnZXMgPT0gMCkgewogCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KJiM0MzsJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKJiM0MzsJICogc19pbm9kZV9saXN0X2xvY2suCiYjNDM7CSAqLwomIzQzOwlfX2lnZXQoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJYmRldiA9IElfQkRFVihpbm9kZSk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2JkZXYtJmd0O2JkX29wZW5lcnMpKSB7CiYjNDM7CQk7IC8qIHNraXAgKi8KJiM0MzsJfSBlbHNlIGlmICh3YWl0KSB7CiAJCS8qCi0JCSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KLQkJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKLQkJICogc19pbm9kZV9saXN0X2xvY2sgIFdlIGNhbm5vdCBpcHV0IHRoZSBpbm9kZSBub3cgYXMgd2UgY2FuCi0JCSAqIGJlIGhvbGRpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIGFuZCB3ZSBjYW5ub3QgaXB1dCBpdCB1bmRlcgotCQkgKiBzX2lub2RlX2xpc3RfbG9jay4gU28gd2Uga2VlcCB0aGUgcmVmZXJlbmNlIGFuZCBpcHV0IGl0Ci0JCSAqIGxhdGVyLgomIzQzOwkJICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzbwomIzQzOwkJICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmcKJiM0MzsJCSAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3IKJiM0MzsJCSAqIGRldGFpbHMuCiAJCSAqLwotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQliZGV2ID0gSV9CREVWKGlub2RlKTsKLQotCQltdXRleF9sb2NrKCZhbXA7YmRldi0mZ3Q7YmRfZGlzay0mZ3Q7b3Blbl9tdXRleCk7Ci0JCWlmICghYXRvbWljX3JlYWQoJmFtcDtiZGV2LSZndDtiZF9vcGVuZXJzKSkgewotCQkJOyAvKiBza2lwICovCi0JCX0gZWxzZSBpZiAod2FpdCkgewotCQkJLyoKLQkJCSAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc28KLQkJCSAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nCi0JCQkgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yCi0JCQkgKiBkZXRhaWxzLgotCQkJICovCi0JCQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfQotCQltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKLQotCQlzcGluX2xvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dChvbGRfaW5vZGUpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgc3luY19iZGV2cyhib29sIHdhaXQpCiYjNDM7ewomIzQzOwlzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsCiYjNDM7CQkJICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmMKaW5kZXggNDlmNTZhNTk4ZWNiYy4uMGQ0NzVhNWZmOGNmYiAxMDA2NDQKLS0tIGEvZnMvZHJvcF9jYWNoZXMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9kcm9wX2NhY2hlcy5jCkBAIC0xNiwzNiAmIzQzOzE2LDMwIEBACiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovCiBzdGF0aWMgaW50IHN5c2N0bF9kcm9wX2NhY2hlczsKIAotc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3N0YXRpYyBpbnQgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkvKgotCQkgKiBXZSBtdXN0IHNraXAgaW5vZGVzIGluIHVudXN1YWwgc3RhdGUuIFdlIG1heSBhbHNvIHNraXAKLQkJICogaW5vZGVzIHdpdGhvdXQgcGFnZXMgYnV0IHdlIGRlbGliZXJhdGVseSB3b24mIzM5O3QgaW4gY2FzZQotCQkgKiB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgdG8gYXZvaWQgc29mdGxvY2t1cHMuCi0JCSAqLwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHwKLQkJICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpICZhbXA7JmFtcDsgIW5lZWRfcmVzY2hlZCgpKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCV9faWdldChpbm9kZSk7CiYjNDM7CWlmIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpKSB7CiAJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQotCQlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtJmd0O2lfbWFwcGluZywgMCwgLTEpOwotCQlpcHV0KHRvcHV0X2lub2RlKTsKLQkJdG9wdXRfaW5vZGUgPSBpbm9kZTsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwogCX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CiYjNDM7CWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0mZ3Q7aV9tYXBwaW5nLCAwLCAtMSk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3sKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTk5Niw3ICYjNDM7OTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KQogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCWNhc2UgT3B0X2ppZDoKIAkJCXJldCA9IG1hdGNoX2ludCgmYW1wO3RtcFswXSwgJmFtcDtvcHRpb24pOwotCQkJaWYgKHJldCB8fCBvcHRpb24gJmx0OyAwKSAKJiM0MzsJCQlpZiAocmV0IHx8IG9wdGlvbiAmbHQ7IDApCiAJCQkJZ290byBob3N0ZGF0YV9lcnJvcjsKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpKQogCQkJCWxzLSZndDtsc19qaWQgPSBvcHRpb247CkBAIC0xNzE5LDYgJiM0MzsxNzE5LDE5IEBAIHN0YXRpYyBpbnQgZ2ZzMl9tZXRhX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50IGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtJmd0O2lfc2I7CiYjNDM7CiYjNDM7CV9faWdldChpbm9kZSk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZ2ZzMl9ldmljdF9pbm9kZXMgLSBldmljdCBpbm9kZXMgY29vcGVyYXRpdmVseQogICogQHNiOiB0aGUgc3VwZXJibG9jawpAQCAtMTc0MSwzMSAmIzQzOzE3NTQsMTAgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYykKICAqLwogc3RhdGljIHZvaWQgZ2ZzMl9ldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqdG9wdXRfaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItJmd0O3NfZnNfaW5mbzsKIAogCXNldF9iaXQoU0RGX0VWSUNUSU5HLCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgJmFtcDsmYW1wOwotCQkgICAgIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCi0JCWlwdXQodG9wdXRfaW5vZGUpOwotCQl0b3B1dF9pbm9kZSA9IGlub2RlOwotCi0JCWNvbmRfcmVzY2hlZCgpOwotCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CXNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbm9kZS5jCkBAIC02OSw2ICYjNDM7NjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0gewogfTsKIEVYUE9SVF9TWU1CT0woZW1wdHlfYW9wcyk7CiAKJiM0MztzdHJ1Y3QgaW5vZGVfaXRlciB7CiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJaXRlcnNfbm9kZTsJLyogc2ItJmd0O3NfaW5vZGVzX2l0ZXJzICovCiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJKm5leHQ7CQkvKiBuZXh0IG5vZGUgZ29pbmcgdG8gaXRlcmF0ZSAqLwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWlub2RlX2l0ZXJfY2IgZnVuYzsKJiM0MzsJdm9pZCAqZGF0YTsKJiM0MzsJaW50IHJldDsKJiM0Mzt9OwomIzQzOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfdW51c2VkKTsKIApAQCAtNjQxLDEyICYjNDM7NjUwLDk2IEBAIHZvaWQgaW5vZGVfc2JfbGlzdF9hZGQoc3RydWN0IGlub2RlICppbm9kZSkKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTsKIAomIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LAomIzQzOwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlpdC0mZ3Q7ZmxhZ3MgPSBmbGFnczsKJiM0MzsJaXQtJmd0O2Z1bmMgPSBmbjsKJiM0MzsJaXQtJmd0O2RhdGEgPSBkYXRhOwomIzQzOwlpdC0mZ3Q7cmV0ID0gMDsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaXQtJmd0O25leHQgPSBzYi0mZ3Q7c19pbm9kZXMubmV4dDsKJiM0MzsJbGlzdF9hZGQoJmFtcDtpdC0mZ3Q7aXRlcnNfbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX2VuZChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiYjNDM7ewomIzQzOwlsaXN0X2RlbCgmYW1wO2l0LSZndDtpdGVyc19ub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3sKJiM0MzsJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXdoaWxlICghaW5vZGUgJmFtcDsmYW1wOyBpdC0mZ3Q7bmV4dCAhPSAmYW1wO3NiLSZndDtzX2lub2RlcykgewomIzQzOwkJaW5vZGUgPSBsaXN0X2VudHJ5KGl0LSZndDtuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7CiYjNDM7CQlpZiAoaXQtJmd0O2ZsYWdzICZhbXA7IElOT0RFX0lURVJfVU5VU0VEKSB7CiYjNDM7CQkJaWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7CiYjNDM7CQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoKGl0LSZndDtmbGFncyAmYW1wOyBJTk9ERV9JVEVSX05PUk1BTCkgJmFtcDsmYW1wOwomIzQzOwkJICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7CiYjNDM7CQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpdC0mZ3Q7bmV4dCA9IGl0LSZndDtuZXh0LSZndDtuZXh0OwomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaXQtJmd0O25leHQgPSBpdC0mZ3Q7bmV4dC0mZ3Q7bmV4dDsKJiM0MzsJCXJldCA9IGl0LSZndDtmdW5jKGlub2RlLCBpdC0mZ3Q7ZGF0YSk7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJaXQtJmd0O3JldCA9IHJldDsKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKJiM0MzsJCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQkJY29uZF9yZXNjaGVkKCk7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gaXQtJmd0O25leHQgPT0gJmFtcDtzYi0mZ3Q7c19pbm9kZXMgPyBmYWxzZSA6IHRydWU7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciBpdDsKJiM0MzsKJiM0MzsJaW5vZGVfc2JfaXRlcl9zdGFydChzYiwgJmFtcDtpdCwgZmxhZ3MsIGZuLCBkYXRhKTsKJiM0MzsJd2hpbGUgKGlub2RlX3NiX2l0ZXJfbmV4dCgmYW1wO2l0LCBzYikpCiYjNDM7CQk7CiYjNDM7CWlub2RlX3NiX2l0ZXJfZW5kKCZhbXA7aXQsIHNiKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGl0LnJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpOwomIzQzOwogc3RhdGljIGlubGluZSB2b2lkIGlub2RlX3NiX2xpc3RfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciAqaXQ7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KSkgewogCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpdCwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMsIGl0ZXJzX25vZGUpIHsKJiM0MzsJCQlpZiAoaXQtJmd0O25leHQgPT0gJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KQomIzQzOwkJCQlpdC0mZ3Q7bmV4dCA9IGlub2RlLSZndDtpX3NiX2xpc3QubmV4dDsKJiM0MzsJCX0KIAkJbGlzdF9kZWxfaW5pdCgmYW1wO2lub2RlLSZndDtpX3NiX2xpc3QpOwogCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJfQpAQCAtODY2LDYgJiM0Mzs5NTksMTcgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAJfQogfQogCiYjNDM7c3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCAqZGlzcG9zZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGF0YTsKJiM0MzsKJiM0MzsJaW5vZGVfc3RhdGVfc2V0KGlub2RlLCBJX0ZSRUVJTkcpOwomIzQzOwlpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlsaXN0X2FkZCgmYW1wO2lub2RlLSZndDtpX2xydSwgZGlzcG9zZSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZXZpY3RfaW5vZGVzCS0gZXZpY3QgYWxsIGV2aWN0YWJsZSBpbm9kZXMgZm9yIGEgc3VwZXJibG9jawogICogQHNiOgkJc3VwZXJibG9jayB0byBvcGVyYXRlIG9uCkBAIC04NzcsNDQgJiM0Mzs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAgKi8KIHZvaWQgZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAlMSVNUX0hFQUQoZGlzcG9zZSk7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMIHwgSU5PREVfSVRFUl9VTlVTRUQ7CiAKLWFnYWluOgotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKLQotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGljb3VudF9yZWFkKGlub2RlKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTsKLQkJaW5vZGVfbHJ1X2xpc3RfZGVsKGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJbGlzdF9hZGQoJmFtcDtpbm9kZS0mZ3Q7aV9scnUsICZhbXA7ZGlzcG9zZSk7Ci0KLQkJLyoKLQkJICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlbgotCQkgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYQotCQkgKiBiaXQgc28gd2UgZG9uJiMzOTt0IGxpdmVsb2NrLgotCQkgKi8KLQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCWRpc3Bvc2VfbGlzdCgmYW1wO2Rpc3Bvc2UpOwotCQkJZ290byBhZ2FpbjsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0KJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsICZhbXA7ZGlzcG9zZSk7CiAJZGlzcG9zZV9saXN0KCZhbXA7ZGlzcG9zZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChldmljdF9pbm9kZXMpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvZHF1b3QuYyBiL2ZzL3F1b3RhL2RxdW90LmMKaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvZHF1b3QuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9xdW90YS9kcXVvdC5jCkBAIC0xMDQzLDY0ICYjNDM7MTA0Myw0OCBAQCBzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwotc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKm9sZF9pbm9kZSA9IE5VTEw7CiYjNDM7CWludCB0eXBlID0gKihpbnQgKilkYXRhOwomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVRwogCWludCByZXNlcnZlZCA9IDA7CiAjZW5kaWYKLQlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8Ci0JCSAgICAhYXRvbWljX3JlYWQoJmFtcDtpbm9kZS0mZ3Q7aV93cml0ZWNvdW50KSB8fAotCQkgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX3dyaXRlY291bnQpIHx8CiYjNDM7CSAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHsKIAkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHCi0JCWlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSAmZ3Q7IDApKQotCQkJcmVzZXJ2ZWQgPSAxOwomIzQzOwlpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgJmd0OyAwKSkKJiM0MzsJCXJlc2VydmVkID0gMTsKICNlbmRpZgotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCWVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7Ci0JCWlmIChlcnIpIHsKLQkJCWlwdXQoaW5vZGUpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICYjMzk7aW5vZGUmIzM5OyBzbyBpdCBjb3VsZG4mIzM5O3QgaGF2ZSBiZWVuCi0JCSAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlCi0JCSAqIHNfaW5vZGVfbGlzdF9sb2NrLiBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbiBiZQotCQkgKiBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXIKLQkJICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdAotCQkgKiBsYXRlci4KLQkJICovCi0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWlwdXQob2xkX2lub2RlKTsKLW91dDoKJiM0MzsJZXJyID0gX19kcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUcKLQlpZiAocmVzZXJ2ZWQpIHsKLQkJcXVvdGFfZXJyb3Ioc2IsICYjMzQ7V3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uICYjMzQ7Ci0JCQkmIzM0O3RodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiAmIzM0OwotCQkJJiMzNDtQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7Ci0JfQomIzQzOwlpZiAocmVzZXJ2ZWQpCiYjNDM7CQlxdW90YV9lcnJvcihzYiwgJiMzNDtXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgJiMzNDsKJiM0MzsJCQkgICAgJiMzNDtvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5ICYjMzQ7CiYjNDM7CQkJICAgICYjMzQ7aW5jb25zaXN0ZW50LiBQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7CiAjZW5kaWYKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIAomIzQzOy8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLAomIzQzOwkJCQkgIGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYiwgJmFtcDt0eXBlKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAwNWU0NDMxNzMwMzg3Li4zZTA2OTE1MGM1NDQ1IDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3N1cGVyLmMKQEAgLTM4Miw2ICYjNDM7MzgyLDcgQEAgc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsIGludCBmbGFncywKIAlzcGluX2xvY2tfaW5pdCgmYW1wO3MtJmd0O3Nfcm9vdHNfbG9jayk7CiAJbXV0ZXhfaW5pdCgmYW1wO3MtJmd0O3Nfc3luY19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmYW1wO3MtJmd0O3NfaW5vZGVzKTsKJiM0MzsJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc19pdGVycyk7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc193Yik7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX3dibGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBmOWQxZTA1ZThhZTY4Li5mMzE3NmFiMTBlNjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yOTYsNyAmIzQzOzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7CiAgKi8KICNkZWZpbmUgRklMRVNZU1RFTV9NQVhfU1RBQ0tfREVQVEggMgogCi0vKiogCiYjNDM7LyoqCiAgKiBlbnVtIHBvc2l0aXZlX2FvcF9yZXR1cm5zIC0gYW9wIHJldHVybiBjb2RlcyB3aXRoIHNwZWNpZmljIHNlbWFudGljcwogICoKICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXMKQEAgLTMwNiw3ICYjNDM7MzA2LDcgQEAgc3RydWN0IGlhdHRyIHsKICAqIAkJCSAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyCiAgKiAJCQkgICAgZnV0dXJlLiAgT3RoZXIgY2FsbGVycyBtdXN0IGJlIGNhcmVmdWwgdG8gdW5sb2NrCiAgKiAJCQkgICAgdGhlIHBhZ2UgaWYgdGhleSBnZXQgdGhpcyByZXR1cm4uICBSZXR1cm5lZCBieQotICogCQkJICAgIHdyaXRlcGFnZSgpOyAKJiM0MzsgKgkJCSAgICB3cml0ZXBhZ2UoKTsKICAqCiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXMKICAqICAJCQl1bmxvY2tlZCBpdCBhbmQgdGhlIHBhZ2UgbWlnaHQgaGF2ZSBiZWVuIHRydW5jYXRlZC4KQEAgLTg3MCw2ICYjNDM7ODcwLDIxIEBAIHN0cnVjdCBpbm9kZSB7CiAJdm9pZAkJCSppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi8KIH0gX19yYW5kb21pemVfbGF5b3V0OwogCiYjNDM7ZW51bSBpbm9kZV9pdGVyX2ZsYWdzX2VudW0gewomIzQzOwlJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSAmbHQ7Jmx0OyAxKSwgIC8qIEV4Y2x1ZGUgaW5vZGVzIHdpdGggKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpLiAqLwomIzQzOwlJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSAmbHQ7Jmx0OyAyKSwgIC8qIE9ubHkgcmV0dXJuIGlub2RlcyB3aXRoIChpX2NvdW50ID09IDApLiAqLwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kCiYjNDM7ICogIGlub2RlLSZndDtpX2xvY2sgICAgICAgICAgICAgIGxvY2tlZCAgICAgICAgIHVubG9ja2VkCiYjNDM7ICogIHNiLSZndDtzX2lub2RlX2xpc3RfbG9jayAgICAgIGxvY2tlZCAgICAgICAgIGxvY2tlZAomIzQzOyAqLwomIzQzO3R5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopOwomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpOwomIzQzOwogLyoKICAqIGlfc3RhdGUgaGFuZGxpbmcKICAqCkBAIC0xMzE1LDggJiM0MzsxMzMwLDEwIEBAIHN0cnVjdCBmaWxlICpnZXRfZmlsZV9hY3RpdmUoc3RydWN0IGZpbGUgKipmKTsKIAogI2RlZmluZQlNQVhfTk9OX0xGUwkoKDFVTCZsdDsmbHQ7MzEpIC0gMSkKIAotLyogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMgCi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIAomIzQzOy8qCiYjNDM7ICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMKJiM0MzsgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uCiYjNDM7ICovCiAjaWYgQklUU19QRVJfTE9ORz09MzIKICNkZWZpbmUgTUFYX0xGU19GSUxFU0laRQkoKGxvZmZfdClVTE9OR19NQVggJmx0OyZsdDsgUEFHRV9TSElGVCkKICNlbGlmIEJJVFNfUEVSX0xPTkc9PTY0CkBAIC0yMjg1LDcgJiM0MzsyMzAyLDcgQEAgaW50IHN5bmNfaW5vZGVfbWV0YWRhdGEoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhaXQpOwogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGZzX2ZsYWdzOwotI2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEgCiYjNDM7I2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEKICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQQkyCiAjZGVmaW5lIEZTX0hBU19TVUJUWVBFCQk0CiAjZGVmaW5lIEZTX1VTRVJOU19NT1VOVAkJOAkvKiBDYW4gYmUgbW91bnRlZCBieSB1c2VybnMgcm9vdCAqLwpAQCAtMjkwNyw3ICYjNDM7MjkyNCw3IEBAIHNzaXplX3QgX19rZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKTsKIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopOwogZXh0ZXJuIHNzaXplX3QgX19rZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqIG9wZW5fZXhlYyhjb25zdCBjaGFyICopOwotIAomIzQzOwogLyogZnMvZGNhY2hlLmMgLS0gZ2VuZXJpYyBmcyBzdXBwb3J0IGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBib29sIHBhdGhfaXNfdW5kZXIoY29uc3Qgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IHBhdGggKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmgKaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaApAQCAtMjY5LDkgJiM0MzsyNjksMTAgQEAgc3RydWN0IHN1cGVyX2Jsb2NrIHsKIAkgKi8KIAlpbnQgc19zdGFja19kZXB0aDsKIAotCS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzICovCiYjNDM7CS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqLwogCXNwaW5sb2NrX3QJCQkJc19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkJc19pbm9kZXM7CS8qIGFsbCBpbm9kZXMgKi8KJiM0MzsJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX2l0ZXJzOyAvKiBhbGwgaXRlcmF0b3JzICovCiAKIAlzcGlubG9ja190CQkJCXNfaW5vZGVfd2JsaXN0X2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX3diOwkvKiB3cml0ZWJhY2sgaW5vZGVzICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuYwppbmRleCAzMGFhNmNlMTM1OTBhLi4zZGNkZThjYmZiNmFmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jCiYjNDM7JiM0MzsmIzQzOyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmMKQEAgLTEzNjksMTEwICYjNDM7MTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KQogCiAvKiBTdXBlci1ibG9jayBob29rcyAqLwogCi0vKgotICogUmVsZWFzZSB0aGUgaW5vZGVzIHVzZWQgaW4gYSBzZWN1cml0eSBwb2xpY3kuCi0gKgotICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCi0gKi8KLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpCiYjNDM7c3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbGFuZGxvY2tfb2JqZWN0ICpvYmplY3Q7CiYjNDM7CXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0mZ3Q7aV9zYjsKIAotCWlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX2NvdW50KSkgewomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiAKLQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7c2ItJmd0O3NfaW5vZGVzLCBpX3NiX2xpc3QpIHsKLQkJc3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0OwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktJmd0O29iamVjdCk7CiYjNDM7CWlmICghb2JqZWN0KSB7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwkvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi8KJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAotCQkvKiBPbmx5IGhhbmRsZXMgcmVmZXJlbmNlZCBpbm9kZXMuICovCi0JCWlmICghaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKJiM0MzsJLyoKJiM0MzsJICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZQomIzQzOwkgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZQomIzQzOwkgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJc3Bpbl9sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKJiM0MzsJaWYgKG9iamVjdC0mZ3Q7dW5kZXJvYmogPT0gaW5vZGUpIHsKJiM0MzsJCW9iamVjdC0mZ3Q7dW5kZXJvYmogPSBOVUxMOwomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJLyoKLQkJICogUHJvdGVjdHMgYWdhaW5zdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiBpbm9kZSAoZS5nLgotCQkgKiBmcm9tIGdldF9pbm9kZV9vYmplY3QoKSkuCiYjNDM7CQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAomIzQzOwkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCiYjNDM7CQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKJiM0MzsJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgomIzQzOwkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgogCQkgKi8KLQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwogCQkvKgotCQkgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZQotCQkgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaAotCQkgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS0mZ3Q7c2VjdXJpdHkgb3IgYQotCQkgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc28KLQkJICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuCiYjNDM7CQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzCiYjNDM7CQkgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZQomIzQzOwkJICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wCiYjNDM7CQkgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlcwomIzQzOwkJICogb24gdGhlIGlub2RlLgogCQkgKi8KLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7Ci0JCSAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQomIzQzOwkJaXB1dF9ub3RfbGFzdChpbm9kZSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJfQogCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJb2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0KTsKLQkJaWYgKCFvYmplY3QpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqLwotCQlfX2lnZXQoaW5vZGUpOwotCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2UKLQkJICogYXJlIGluIGNoYXJnZSBvZiBjYWxsaW5nIGlwdXQoKSBvbiB0aGlzIGlub2RlLCBvdGhlcndpc2Ugd2UKLQkJICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KLQkJICovCi0JCXNwaW5fbG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7Ci0JCWlmIChvYmplY3QtJmd0O3VuZGVyb2JqID09IGlub2RlKSB7Ci0JCQlvYmplY3QtJmd0O3VuZGVyb2JqID0gTlVMTDsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkJCS8qCi0JCQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAotCQkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCi0JCQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKLQkJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgotCQkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgotCQkJICovCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwotCQkJLyoKLQkJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXMKLQkJCSAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlCi0JCQkgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3AKLQkJCSAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzCi0JCQkgKiBvbiB0aGUgaW5vZGUuCi0JCQkgKi8KLQkJCWlwdXRfbm90X2xhc3QoaW5vZGUpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCX0KJiM0MzsvKgomIzQzOyAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LgomIzQzOyAqCiYjNDM7ICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMOwogCi0JCWlmIChwcmV2X2lub2RlKSB7Ci0JCQkvKgotCQkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgb3duIHRoZSBfX2lnZXQoKSByZWZlcmVuY2UKLQkJCSAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2UKLQkJCSAqIGNhbiBkcm9wIHRoZSBsaXN0IGxvY2sgYW5kIGtub3cgdGhhdCB0aGUgaW5vZGUgd29uJiMzOTt0Ci0JCQkgKiBkaXNhcHBlYXIgZnJvbSB1bmRlciB1cyB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuCi0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJCS8qCi0JCQkgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlCi0JCQkgKiBwcmV2aW91cyBsb29wIHdhbGssIHdoaWNoIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KLQkJCSAqLwotCQkJaXB1dChwcmV2X2lub2RlKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJfQotCQlwcmV2X2lub2RlID0gaW5vZGU7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaWYgKCFsYW5kbG9ja19pbml0aWFsaXplZCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiAKLQkvKiBQdXRzIHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGUgbGFzdCBsb29wIHdhbGssIGlmIGFueS4gKi8KLQlpZiAocHJldl9pbm9kZSkKLQkJaXB1dChwcmV2X2lub2RlKTsKIAkvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqLwogCXdhaXRfdmFyX2V2ZW50KCZhbXA7bGFuZGxvY2tfc3VwZXJibG9jayhzYiktJmd0O2lub2RlX3JlZnMsCiAJCSAgICAgICAhYXRvbWljX2xvbmdfcmVhZCgmYW1wO2xhbmRsb2NrX3N1cGVyYmxvY2soc2IpLSZndDtpbm9kZV9yZWZzKSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDExOTk3CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogNTIzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggU2VyaWVzOiBXb3J0aEZ1enppbmcgPSBUcnVlKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBzZXJpZXMuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0JiMzOTtzIGludHJvZHVjaW5nIGEgbmV3LCBnZW5lcmljIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gb24gc3VwZXJibG9ja3MuIFRoZSBjb3JlIG9mIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgZnVuY3Rpb24sIGFsb25nc2lkZSBpdHMgcmVsYXRlZCBpdGVyYXRvciBmdW5jdGlvbnMuIEl0IGxvb2tzIGxpa2UgYSBzdWJzdGFudGlhbCByZWZhY3RvcmluZywgdG91Y2hpbmcgYSB2YXJpZXR5IG9mIGNydWNpYWwgc3Vic3lzdGVtcy4KCkxldCBtZSBicmVhayBkb3duIHRoZSBjaGFuZ2VzIEkmIzM5O20gc2VlaW5nLiBUaGlzIHBhdGNoIHVwZGF0ZXMgYSBidW5jaCBvZiBjYWxsIHNpdGVzIGFjcm9zcyB0aGUgVkZTIGxheWVyLCB0aGUgYmxvY2sgbGF5ZXIsIEdGUzIsIFF1b3RhLCBhbmQgZXZlbiBMYW5kbG9jayEgU3BlY2lmaWNhbGx5LCBJJiMzOTttIHNlZWluZyBtb2RpZmljYXRpb25zIGluIGBibG9jay9iZGV2LmNgLCBgZnMvZHJvcF9jYWNoZXMuY2AsIGBmcy9nZnMyL29wc19mc3R5cGUuY2AsIGBmcy9pbm9kZS5jYCAodGhpcyBvbmUmIzM5O3MgKmtleSopLCBgZnMvcXVvdGEvZHF1b3QuY2AsIGBmcy9zdXBlci5jYCwgYWxvbmcgd2l0aCB1cGRhdGVzIHRvIGluY2x1ZGUgZmlsZXMgbGlrZSBgaW5jbHVkZS9saW51eC9mcy5oYCBhbmQgYGluY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaGAsIGFuZCBldmVuIGEgc2VjdXJpdHkgbW9kdWxlLCBgc2VjdXJpdHkvbGFuZGxvY2svZnMuY2AuCgpNeSBwcmltYXJ5IGNvbmNlcm4gd2l0aCB0aGlzIGtpbmQgb2YgY2hhbmdlIGlzIHdoZXRoZXIgaXQgaW50cm9kdWNlcyBhbnkgdnVsbmVyYWJpbGl0aWVzLiBXZSBrbm93IHRoYXQgYW55IG1vZGlmaWNhdGlvbiB0byBjb3JlIFZGUyBjYW4gbGVhZCB0byB2dWxuZXJhYmlsaXRpZXMsIGFuZCB0aGlzIGRlZmluaXRlbHkgdG91Y2hlcyBjb3JlIFZGUzogYGZzL2lub2RlLmNgLCBgZnMvc3VwZXIuY2AsIGBmcy9kcm9wX2NhY2hlcy5jYCwgYGJsb2NrL2JkZXYuY2AsIGBmcy9xdW90YS9kcXVvdC5jYCwgYHNlY3VyaXR5L2xhbmRsb2NrL2ZzLmNgLiBBbHNvLCBpdCYjMzk7cyBpbnRyb2R1Y2luZyBhIG5ldyBsaXN0IHRyYXZlcnNhbC9pdGVyYXRvciB0cmFja2luZyBsb2dpYyAod2l0aCBgc19pbm9kZXNfaXRlcnNgIGFuZCBpdHMgcmVsYXRlZCBmdW5jdGlvbnMpLiBUaGlzIGludm9sdmVzIGxvY2tpbmcgd2l0aCBgc19pbm9kZV9saXN0X2xvY2tgIGFuZCBgaW5vZGUtJmd0O2lfbG9ja2AsIGFzIHdlbGwgYXMgY2FsbGJhY2sgc2VtYW50aWNzIGFuZCByZWZjb3VudCBtYW5pcHVsYXRpb24gd2l0aCBgX19pZ2V0YCBhbmQgYGlwdXRgLiBBbGwgb2YgdGhlc2UgdGhpbmdzIGFyZSBwcmltZSBjYW5kaWRhdGVzIGZvciBmdXp6aW5nLCB3aGljaCBtZWFucyB0aGUgY29kZSBpcyAqY29yZSByZWFjaGFibGUgZXhlY3V0YWJsZSouIFRoaXMga2luZCBvZiByZWZhY3RvcmluZyBjb3VsZCByZXZlYWwgc3VidGxlIHJhY2UgY29uZGl0aW9ucywgbWVtb3J5IGNvcnJ1cHRpb24gaXNzdWVzLCBvciBldmVuIGxvZ2ljIGVycm9ycyB0aGF0IHdvdWxkbiYjMzk7dCBub3JtYWxseSBhcHBlYXIuCgpUaGVyZWZvcmUsIG15IGNvbmNsdXNpb24gaXMgY2xlYXI6IGBXb3J0aEZ1enppbmcgPSB0cnVlYC4gSSBuZWVkIHRvIGRpZyBpbnRvIHRoaXMgdGhvcm91Z2hseS4gSSBzaG91bGQgcHJvYmFibHkgdXNlIGBncmVwcGVyYCAob3Igc2ltaWxhciB0b29scykgdG8gY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb25zIGFuZCBpbnNwZWN0IHRoZSBzb3VyY2UgY29kZSBmdXJ0aGVyLiBUaGlzIHJlcXVpcmVzIGNhcmVmdWwgY29uc2lkZXJhdGlvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtzYl9mb3JfZWFjaF9pbm9kZXMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7YmxvY2svYmRldi5jPTEzODI9dm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbmJsb2NrL2JkZXYuYy0xMzgzLXtcbmJsb2NrL2JkZXYuYzoxMzg0Olx0c2JfZm9yX2VhY2hfaW5vZGVzKGJsb2NrZGV2X3N1cGVyYmxvY2ssIElOT0RFX0lURVJfTk9STUFMLFxuYmxvY2svYmRldi5jLTEzODUtXHRcdFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xuLS1cbmZzL2Ryb3BfY2FjaGVzLmM9NDA9c3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxuZnMvZHJvcF9jYWNoZXMuYy00MS17XG5mcy9kcm9wX2NhY2hlcy5jOjQyOlx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG5mcy9kcm9wX2NhY2hlcy5jLTQzLX1cbi0tXG5mcy9nZnMyL29wc19mc3R5cGUuYz0xNzU1PXN0YXRpYyB2b2lkIGdmczJfZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4tLVxuZnMvZ2ZzMi9vcHNfZnN0eXBlLmMtMTc1OS1cdHNldF9iaXQoU0RGX0VWSUNUSU5HLCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpO1xuZnMvZ2ZzMi9vcHNfZnN0eXBlLmM6MTc2MDpcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG5mcy9nZnMyL29wc19mc3R5cGUuYy0xNzYxLX1cbi0tXG5mcy9pbm9kZS5jPTY3MT1zdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuLS1cbmZzL2lub2RlLmMtNzE3LVxuZnMvaW5vZGUuYzo3MTg6aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG5mcy9pbm9kZS5jLTcxOS1cdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXG4tLVxuZnMvaW5vZGUuYy03MjktfVxuZnMvaW5vZGUuYzo3MzA6RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpO1xuZnMvaW5vZGUuYy03MzEtXG4tLVxuZnMvaW5vZGUuYz05ODI9dm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbi0tXG5mcy9pbm9kZS5jLTk4Ni1cbmZzL2lub2RlLmM6OTg3Olx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsIFx1MDAyNmRpc3Bvc2UpO1xuZnMvaW5vZGUuYy05ODgtXHRkaXNwb3NlX2xpc3QoXHUwMDI2ZGlzcG9zZSk7XG4tLVxuZnMvcXVvdGEvZHF1b3QuYz0xMDgyPXN0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcbmZzL3F1b3RhL2RxdW90LmMtMTA4My17XG5mcy9xdW90YS9kcXVvdC5jOjEwODQ6XHRyZXR1cm4gc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCxcbmZzL3F1b3RhL2RxdW90LmMtMTA4NS1cdFx0XHRcdCAgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiLCBcdTAwMjZ0eXBlKTtcbi0tXG5pbmNsdWRlL2xpbnV4L2ZzLmg9ODgzPXR5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopO1xuaW5jbHVkZS9saW51eC9mcy5oLTg4NC1cbmluY2x1ZGUvbGludXgvZnMuaDo4ODU6aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG5pbmNsdWRlL2xpbnV4L2ZzLmgtODg2LVx0XHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSk7XG4tLVxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYz0xNDM3PXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXG4tLVxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYy0xNDQzLVxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYzoxNDQ0Olx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG5zZWN1cml0eS9sYW5kbG9jay9mcy5jLTE0NDUtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5ODUKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byB0aGUgSW5vZGUgSXRlcmF0b3IqKgoKT2theSwgc28gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGUgaXRlcmF0b3IgZm9yIGlub2RlcyBpbiBgZnMvaW5vZGUuY2AgYWN0dWFsbHkgd29ya3MuIEkgd2FudCB0byBzcGVjaWZpY2FsbHkgdW5kZXJzdGFuZCBpdHMgaW1wbGVtZW50YXRpb24gYW5kLCBtb3JlIGltcG9ydGFudGx5LCBob3cgaXQmIzM5O3MgYmVpbmcgKnVzZWQqLiBJcyBpdCBhIGNsYXNzaWMgaXRlcmF0b3IgcGF0dGVybiwgb3IgaXMgdGhlcmUgc29tZSBjdXN0b20gc3BpbiBvbiBpdCB0byBvcHRpbWl6ZSBmb3IgZmlsZSBzeXN0ZW0gYWNjZXNzIHBhdHRlcm5zPyBJJiMzOTttIHBhcnRpY3VsYXJseSBpbnRlcmVzdGVkIGluIGFueSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaW1wbGljYXRpb25zIOKAkyBkb2VzIHRoZSBpdGVyYXRpb24gaGFuZGxlIGxvY2tpbmcgY29ycmVjdGx5IGFjcm9zcyBtdWx0aXBsZSB0aHJlYWRzIG9yIHByb2Nlc3NlcyBhY2Nlc3NpbmcgdGhlIGlub2RlIHRhYmxlPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBwZXJmb3JtYW5jZSBib3R0bGVuZWNrcyB0aGF0IHNwcmluZyB0byBtaW5kIHdoZW4gc2VlaW5nIGhvdyBpdCYjMzk7cyBsYWlkIG91dD8gSSBuZWVkIHRvIGFuYWx5emUgaXRzIHVzYWdlIGNvbnRleHQgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFjY2VzcyBpdCBpcyBiZWluZyB1c2VkIGZvciwgYW5kIHRoZSBpbXBhY3Qgb2YgdGhlIGl0ZXJhdG9ycyBwZXJmb3JtYW5jZSBpbiB0aGVzZSBzaXR1YXRpb25zLiBUaW1lIHRvIHN0YXJ0IGRpZ2dpbmcuLi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2ZzL2lub2RlLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2NDUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDY0NTpcdFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gNjQ2Olx0XG4gNjQ3Olx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIDY0ODpcdFx0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9zYl9saXN0LCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlcyk7XG4gNjQ5Olx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gNjUwOlx0fVxuIDY1MTpcdEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTtcbiA2NTI6XHRcbiA2NTM6XHRzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX3N0YXJ0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZV9pdGVyICppdCxcbiA2NTQ6XHRcdFx0XHRcdHVuc2lnbmVkIGludCBmbGFncywgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbiA2NTU6XHR7XG4gNjU2Olx0XHRpdC1cdTAwM2VmbGFncyA9IGZsYWdzO1xuIDY1NzpcdFx0aXQtXHUwMDNlZnVuYyA9IGZuO1xuIDY1ODpcdFx0aXQtXHUwMDNlZGF0YSA9IGRhdGE7XG4gNjU5Olx0XHRpdC1cdTAwM2VyZXQgPSAwO1xuIDY2MDpcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiA2NjE6XHRcdGl0LVx1MDAzZW5leHQgPSBzYi1cdTAwM2VzX2lub2Rlcy5uZXh0O1xuIDY2MjpcdFx0bGlzdF9hZGQoXHUwMDI2aXQtXHUwMDNlaXRlcnNfbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXNfaXRlcnMpO1xuIDY2MzpcdH1cbiA2NjQ6XHRcbiA2NjU6XHRzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX2VuZChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gNjY2Olx0e1xuIDY2NzpcdFx0bGlzdF9kZWwoXHUwMDI2aXQtXHUwMDNlaXRlcnNfbm9kZSk7XG4gNjY4Olx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gNjY5Olx0fVxuIDY3MDpcdFxuIDY3MTpcdHN0YXRpYyBib29sIGlub2RlX3NiX2l0ZXJfbmV4dChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4gNjcyOlx0e1xuIDY3MzpcdFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XG4gNjc0Olx0XHRpbnQgcmV0O1xuIDY3NTpcdFxuIDY3NjpcdFx0d2hpbGUgKCFpbm9kZSBcdTAwMjZcdTAwMjYgaXQtXHUwMDNlbmV4dCAhPSBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlcykge1xuIDY3NzpcdFx0XHRpbm9kZSA9IGxpc3RfZW50cnkoaXQtXHUwMDNlbmV4dCwgc3RydWN0IGlub2RlLCBpX3NiX2xpc3QpO1xuIDY3ODpcdFx0XHRpZiAoaXQtXHUwMDNlZmxhZ3MgXHUwMDI2IElOT0RFX0lURVJfVU5VU0VEKSB7XG4gNjc5Olx0XHRcdFx0aWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7XG4gNjgwOlx0XHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuIDY4MTpcdFx0XHRcdFx0Y29udGludWU7XG4gNjgyOlx0XHRcdFx0fVxuIDY4MzpcdFxuIDY4NDpcdFx0XHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIDY4NTpcdFx0XHRcdGlmIChpY291bnRfcmVhZChpbm9kZSkpIHtcbiA2ODY6XHRcdFx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gNjg3Olx0XHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuIDY4ODpcdFx0XHRcdFx0Y29udGludWU7XG4gNjg5Olx0XHRcdFx0fVxuIDY5MDpcdFx0XHR9IGVsc2Uge1xuIDY5MTpcdFx0XHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIDY5MjpcdFx0XHR9XG4gNjkzOlx0XG4gNjk0Olx0XHRcdGlmICgoaXQtXHUwMDNlZmxhZ3MgXHUwMDI2IElOT0RFX0lURVJfTk9STUFMKSBcdTAwMjZcdTAwMjZcbiA2OTU6XHRcdFx0ICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpKSkge1xuIDY5NjpcdFx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gNjk3Olx0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbiA2OTg6XHRcdFx0XHRjb250aW51ZTtcbiA2OTk6XHRcdFx0fVxuIDcwMDpcdFxuIDcwMTpcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuIDcwMjpcdFx0XHRyZXQgPSBpdC1cdTAwM2VmdW5jKGlub2RlLCBpdC1cdTAwM2VkYXRhKTtcbiA3MDM6XHRcdFx0aWYgKHJldCkge1xuIDcwNDpcdFx0XHRcdGl0LVx1MDAzZXJldCA9IHJldDtcbiA3MDU6XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gNzA2Olx0XHRcdH1cbiA3MDc6XHRcbiA3MDg6XHRcdFx0aWYgKG5lZWRfcmVzY2hlZCgpKSB7XG4gNzA5Olx0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIDcxMDpcdFx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuIDcxMTpcdFx0XHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gNzEyOlx0XHRcdH1cbiA3MTM6XHRcdH1cbiA3MTQ6XHRcbiA3MTU6XHRcdHJldHVybiBpdC1cdTAwM2VuZXh0ID09IFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzID8gZmFsc2UgOiB0cnVlO1xuIDcxNjpcdH1cbiA3MTc6XHRcbiA3MTg6XHRpbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcbiA3MTk6XHRcdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXG4gNzIwOlx0e1xuIDcyMTpcdFx0c3RydWN0IGlub2RlX2l0ZXIgaXQ7XG4gNzIyOlx0XG4gNzIzOlx0XHRpbm9kZV9zYl9pdGVyX3N0YXJ0KHNiLCBcdTAwMjZpdCwgZmxhZ3MsIGZuLCBkYXRhKTtcbiA3MjQ6XHRcdHdoaWxlIChpbm9kZV9zYl9pdGVyX25leHQoXHUwMDI2aXQsIHNiKSlcbiA3MjU6XHRcdFx0O1xuIDcyNjpcdFx0aW5vZGVfc2JfaXRlcl9lbmQoXHUwMDI2aXQsIHNiKTtcbiA3Mjc6XHRcbiA3Mjg6XHRcdHJldHVybiBpdC5yZXQ7XG4gNzI5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE1NDgwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNTQyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpdmluZyBpbnRvIHRoaXMgbmV3IGl0ZXJhdG9yJiMzOTtzIGludHJpY2FjaWVzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBjbG9zZWx5IGF0IGBzYl9mb3JfZWFjaF9pbm9kZXNgLiBSaWdodCBhd2F5LCB0aGUgYGlub2RlX3NiX2l0ZXJfbmV4dCgpYCBmdW5jdGlvbiBncmFicyBhbiBgaW5vZGVgIGZyb20gYSBsaXN0IHVzaW5nIGBsaXN0X2VudHJ5YC4gIEl0IGNoZWNrcyBmbGFncywgcG90ZW50aWFsbHkgYWNxdWlyZXMgYGlub2RlLSZndDtpX2xvY2tgIChkZXBlbmRpbmcgb24gdGhlIGNvZGUgcGF0aCksIGFuZCB0aGVuIGNhbGxzIGBpdC0mZ3Q7ZnVuY2Agd2l0aCB0aGUgYGlub2RlYCBhbmQgYGl0LSZndDtkYXRhYC4gIFN0YW5kYXJkIHN0dWZmLCBidXQgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIGxvY2tpbmcgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4KCk5vdywgYGlub2RlX3NiX2xpc3RfZGVsYCBpbiBgZnMvaW5vZGUuY2AuIEkgc2VlIGl0IHJlbW92aW5nIGFuIGlub2RlIGZyb20gdGhlIHN1cGVyYmxvY2smIzM5O3MgaW5vZGUgbGlzdC4gQW5kIGhlcmUmIzM5O3MgdGhlIGtpY2tlcjogaXQgaXRlcmF0ZXMgKnRocm91Z2gqIHRoZSBgc19pbm9kZXNfaXRlcnNgIGxpc3Qgb24gdGhlIHN1cGVyYmxvY2suICBJZiBpdCBmaW5kcyBhbiBpdGVyYXRvciBwb2ludGluZyBhdCB0aGUgaW5vZGUgYmVpbmcgZGVsZXRlZCwgaXQgdXBkYXRlcyBgaXQtJmd0O25leHRgISBUaGlzIGlzIGNyaXRpY2FsLiBEdXJpbmcgdGhvc2UgaXRlcmF0aW9uIGNhbGxiYWNrcywgdGhlIGNvZGUgZHJvcHMgYGlub2RlLSZndDtpX2xvY2tgIGFuZCBgc2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrYCwgZG9lcyBzb21lIHdvcmsgKHRoaW5ncyBsaWtlIGBfX2lnZXRgLCBgaXB1dGAsIGV2ZW4gYGludmFsaWRhdGVfbWFwcGluZ19wYWdlc2AsIGFuZCBmaWxlIG9wZXJhdGlvbnMpLCBhbmQgdGhlbiByZWFjcXVpcmVzIGBzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2tgIGJlZm9yZSByZXR1cm5pbmcuCgpUaGUgaW1wbGljYXRpb25zIGFyZSBodWdlLiAgQW4gaW5vZGUgY2FuIGJlIGRlbGV0ZWQgKndoaWxlKiB0aGUgbG9jayBpcyBkcm9wcGVkLiBXaGVuIHRoYXQgaGFwcGVucywgYGlub2RlX3NiX2xpc3RfZGVsYCAqdXBkYXRlcyB0aGUgaXRlcmF0b3ImIzM5O3MgbmV4dCBwb2ludGVyKiwgc28gdGhhdCBpdCBpc24mIzM5O3Qgb3JwaGFuZWQuIEl0JiMzOTtzIGNsZXZlcmx5IGhhbmRsaW5nIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb24uIFRoaXMgaXRlcmF0b3IgbWVjaGFuaXNtIGlzIGJyYW5kIG5ldyBhbmQgdG91Y2hlcyBzdXBlcmJsb2NrIGlub2RlIGxpc3QgbG9ja2luZywgcmVmY291bnRpbmcsIGFuZCB0cmF2ZXJzYWwgYWNyb3NzIFZGUywgcXVvdGEsIExhbmRsb2NrLCBHRlMyLCBhbmQgZXZlbiBibG9jayBkZXZpY2VzIQoKU28sIHdoaWNoIGNvbmZpZ3VyYXRpb25zIGFyZSBsaWtlbHkgdG8gYmUgcmVsZXZhbnQ/ICBgZnMvaW5vZGUuY2AsIGBmcy9zdXBlci5jYCwgYGJsb2NrL2JkZXYuY2AsIGFuZCBgZnMvZHJvcF9jYWNoZXMuY2AgYXJlIGFsd2F5cyB0aGVyZS4gQnV0IHdoYXQgYWJvdXQgdGhlIG1vZHVsZXM/ICBgZnMvcXVvdGEvZHF1b3QuY2AgZGVwZW5kcyBvbiBgQ09ORklHX1FVT1RBYCwgYGZzL2dmczJgIGRlcGVuZHMgb24gYENPTkZJR19HRlMyX0ZTYCwgYW5kIGBzZWN1cml0eS9sYW5kbG9ja2AgZGVwZW5kcyBvbiBgQ09ORklHX1NFQ1VSSVRZX0xBTkRMT0NLYC4KCkkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBmb3IgUXVvdGEsIExhbmRsb2NrLCBhbmQgR0ZTMiBqdXN0IHRvIGNvbmZpcm0gdGhlc2UgZGVwZW5kZW5jaWVzIGFuZCBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzLiBUaGlzIHJlcXVpcmVzIG1vcmUgdGhvcm91Z2ggYW5hbHlzaXMsIGJ1dCB0aGlzIGl0ZXJhdG9yIHNlZW1zIG5vdmVsIGFuZCBoaWdobHkgcmVsZXZhbnQgdG8gY29uY3VycmVudCBmaWxlc3lzdGVtIHN0cnVjdHVyZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIChRVU9UQXxTRUNVUklUWV9MQU5ETE9DS3xHRlMyX0ZTKVxcYiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2ZzLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9nZnMyL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbmZzL2dmczIvS2NvbmZpZzoyOmNvbmZpZyBHRlMyX0ZTXG5mcy9nZnMyL0tjb25maWctMy1cdHRyaXN0YXRlIFwmIzM0O0dGUzIgZmlsZSBzeXN0ZW0gc3VwcG9ydFwmIzM0O1xuLS1cbmZzL3F1b3RhL0tjb25maWctNS1cbmZzL3F1b3RhL0tjb25maWc6Njpjb25maWcgUVVPVEFcbmZzL3F1b3RhL0tjb25maWctNy1cdGJvb2wgXCYjMzQ7UXVvdGEgc3VwcG9ydFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjEwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE2NzExCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqS2VybmVsIFNlY3VyaXR5IEV4cGxvcmF0aW9uKioKCkFscmlnaHQsIGJlZm9yZSBJIGRpdmUgdG9vIGRlZXAgaW50byB0aGlzIHByb2JsZW0sIEkgbmVlZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzLiBTZWN1cml0eSBpcyBhbHdheXMgcGFyYW1vdW50LCBhbmQgbGFuZGxvY2sgaXMgYSBsaWtlbHkgYXJlYSB0byBzY3J1dGluaXplLiBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgaWYgdGhlIGlzc3VlIGludGVyc2VjdHMgd2l0aCBsYW5kbG9jayYjMzk7cyBjYXBhYmlsaXRpZXMuIFNwZWNpZmljYWxseSwgZG9lcyBzb21ldGhpbmcgY2hhbmdlIGF0IHRoZSBsYW5kbG9jayBsZXZlbCB0aGF0IG1pZ2h0IGNvbnRyaWJ1dGU/IEl0JiMzOTtzIGVhc3kgdG8gZ2V0IHR1bm5lbCB2aXNpb24gd2hlbiBkZWJ1Z2dpbmcuCgpUaGVuLCBvZiBjb3Vyc2UsIEkgc2hvdWxkIGxvb2sgYXQgdGhlIEtjb25maWcgb3B0aW9ucyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEFyZSB0aGVyZSBhbnkgcmVsZXZhbnQgc2VjdXJpdHkgZmVhdHVyZXMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgZW5hYmxlZCBpbiBhIHdheSB0aGF0IGNvdWxkIGFmZmVjdCB0aGlzIHNpdHVhdGlvbj8gTWF5YmUgSSBjYW4gY2hhbmdlIHRoZW0gdG8gdmVyaWZ5IHRoZSBiZWhhdmlvdXIuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7bSBub3Qgd29ya2luZyB3aXRoIGFuIHVudXN1YWwsIG9yIG5vbi1kZWZhdWx0LCBidWlsZCBiZWZvcmUgSSBzdGFydCBjaGFzaW5nIGdob3N0cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIFNFQ1VSSVRZX0xBTkRMT0NLJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7c2VjdXJpdHkvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3NlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMi1cbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWc6Mzpjb25maWcgU0VDVVJJVFlfTEFORExPQ0tcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctNC1cdGJvb2wgXCYjMzQ7TGFuZGxvY2sgc3VwcG9ydFwmIzM0O1xuLS1cbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMjMtXG5zZWN1cml0eS9sYW5kbG9jay9LY29uZmlnOjI0OmNvbmZpZyBTRUNVUklUWV9MQU5ETE9DS19MT0dcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMjUtXHRib29sXG4tLVxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZy0yOC1cbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWc6Mjk6Y29uZmlnIFNFQ1VSSVRZX0xBTkRMT0NLX0tVTklUX1RFU1RcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMzAtXHRib29sIFwmIzM0O0tVbml0IHRlc3RzIGZvciBMYW5kbG9ja1wmIzM0OyBpZiAhS1VOSVRfQUxMX1RFU1RTXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjExPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3MTEwCgkJCQkJCQlvdXRwdXQ6IDIzMQoJCQkJCQkJdGhvdWdodHM6IDg5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFN0cmF0ZWd5IGZvciBLZXJuZWwgUGF0Y2ggQW5hbHlzaXMqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBpZGVudGlmeSBhbmQganVzdGlmeSBmdXp6aW5nIHRoaXMgcGF0Y2guIEZpcnN0LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGtlcm5lbCBmdW5jdGlvbnMgaW50cm9kdWNlZCBvciBzaWduaWZpY2FudGx5IGFsdGVyZWQuIExvb2tzIGxpa2UgdGhlIHBhdGNoIHRvdWNoZXMgc2V2ZXJhbCBhcmVhczogYmxvY2sgZGV2aWNlcyAoYGJkZXYuY2ApLCBwYWdlIGNhY2hlIChgZHJvcF9jYWNoZXMuY2ApLCBHRlMyIGZpbGVzeXN0ZW1zIChgZ2ZzMi9vcHNfZnN0eXBlLmNgKSwgZ2VuZXJhbCBpbm9kZXMgKGBpbm9kZS5jYCksIHF1b3RhcyAoYHF1b3RhL2RxdW90LmNgKSwgYW5kIExhbmRsb2NrIHNlY3VyaXR5IChgc2VjdXJpdHkvbGFuZGxvY2svZnMuY2ApLgoKSSYjMzk7dmUgZXh0cmFjdGVkIHRoZSBrZXkgZnVuY3Rpb25zIGZyb20gdGhlIHBhdGNoIHRoYXQgc2VlbSByZWxldmFudC4gSSYjMzk7dmUgc3BlY2lmaWNhbGx5IHRhcmdldGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiB1YmlxdWl0b3VzLCBsb3ctbGV2ZWwga2VybmVsIHJvdXRpbmVzLiBJJiMzOTttIGxvb2tpbmcgZm9yIGVudHJ5IHBvaW50cyBvciBpdGVyYXRvcnMgdGhhdCBkaXJlY3RseSBleGVyY2lzZSB0aGUgY2hhbmdlZCBjb2RlLiBCYXNlZCBvbiBteSBhbmFseXNpcywgdGhlc2UgZnVuY3Rpb25zIHN0YW5kIG91dDogYHNiX2Zvcl9lYWNoX2lub2Rlc2AsIGBldmljdF9pbm9kZXNgLCBgZHJvcF9wYWdlY2FjaGVfc2JgLCBgc3luY19iZGV2c2AsIGBhZGRfZHF1b3RfcmVmYCwgYGdmczJfZXZpY3RfaW5vZGVzYCwgYW5kIGBob29rX3NiX2RlbGV0ZWAuCgpOb3csIHRoZXNlIGFyZW4mIzM5O3QgeW91ciB0eXBpY2FsIGxpZmVjeWNsZSBob3QtcGF0aHM7IHRoZXkmIzM5O3JlIHZlcnkgc3BlY2lmaWMgVkZTLCBmaWxlc3lzdGVtLCBvciBzZWN1cml0eSBlbnRyeSBwb2ludHMgYW5kIGl0ZXJhdG9ycy4gU28sIEkga25vdyB0aGV5JiMzOTtyZSBub3QgZ29pbmcgdG8gYmUgbWFzc2l2ZWx5IGNhbGxlZCBldmVyeXdoZXJlLCBidXQgdGhleSBsaWtlbHkgYXJlIGVudHJ5IHBvaW50cyB0aGF0IHdpbGwgZXhlcmNpc2UgdGhpcyBjb2RlLgoKSSYjMzk7dmUgYWxzbyBpZGVudGlmaWVkIHRoZSByZWxldmFudCBrZXJuZWwgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgYWZmZWN0ZWQ6IGBRVU9UQWAsIGBHRlMyX0ZTYCwgYW5kIGBTRUNVUklUWV9MQU5ETE9DS2AuCgpOb3csIHRvIHNvbGlkaWZ5IHRoaXMsIEkgbmVlZCB0byBhcnRpY3VsYXRlIHdoeSB0aGlzIHdhcnJhbnRzIGZ1enppbmcuIFRoaXMgcGF0Y2ggaXMgcmVmYWN0b3Jpbmcgc3VwZXJibG9jayBpbm9kZSBsaXN0IGl0ZXJhdGlvbiBhY3Jvc3MgbXVsdGlwbGUgYXJlYXMsIGludHJvZHVjaW5nIGBzYl9mb3JfZWFjaF9pbm9kZXNgIGFuZCBhbiBhY3RpdmUgaXRlcmF0b3IgbWVjaGFuaXNtIChgc19pbm9kZXNfaXRlcnNgKS4gVGhpcyBjaGFuZ2UgaW1wbGllcyBhbHRlcmF0aW9ucyB0byBsb2NraW5nLCBsaXN0IHRyYXZlcnNhbCwgYW5kIGNvbmN1cnJlbnQgaW5vZGUgZGVsZXRpb24vZXZpY3Rpb24gc2VtYW50aWNzLiBUaGF0JiMzOTtzIGEgaHVnZSByZWQgZmxhZzogcmFjZSBjb25kaXRpb25zLCBsaXN0IGNvcnJ1cHRpb24sIGFuZCBsb2NraW5nIGlzc3VlcyBhcmUgYWxsIGxpa2VseSBoZXJlLgoKR2l2ZW4gYWxsIHRoaXMsIEkmIzM5O20gY29uZmlkZW50IGluIHNheWluZyB0aGF0IHRoaXMgcGF0Y2ggaXMgd29ydGggZnV6emluZy4gSSYjMzk7dmUgZ2F0aGVyZWQgYSBjbGVhciByZWFzb25pbmcsIGlkZW50aWZpZWQgdGhlIGZ1bmN0aW9ucywgYW5kIGxpc3RlZCByZWxldmFudCBjb25maWd1cmF0aW9ucy4gSSBjYW4gbm93IGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuIEkgYW0gcmVhZHkgdG8gbW92ZSBvbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1FVT1RBJiMzNDssCiAgICAmIzM0O0dGUzJfRlMmIzM0OywKICAgICYjMzQ7U0VDVVJJVFlfTEFORExPQ0smIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzYl9mb3JfZWFjaF9pbm9kZXMmIzM0OywKICAgICYjMzQ7ZXZpY3RfaW5vZGVzJiMzNDssCiAgICAmIzM0O3N5bmNfYmRldnMmIzM0OywKICAgICYjMzQ7ZHJvcF9wYWdlY2FjaGVfc2ImIzM0OywKICAgICYjMzQ7YWRkX2RxdW90X3JlZiYjMzQ7LAogICAgJiMzNDtnZnMyX2V2aWN0X2lub2RlcyYjMzQ7LAogICAgJiMzNDtob29rX3NiX2RlbGV0ZSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIGZyYW1ld29yayAoc2JfZm9yX2VhY2hfaW5vZGVzKSB3aXRoIGR5bmFtaWMgaXRlcmF0b3IgbGlzdCB0cmFja2luZyAoc19pbm9kZXNfaXRlcnMpIGFuZCB1cGRhdGVzIHRyYXZlcnNhbCBsb29wcyBpbiBWRlMgKGV2aWN0X2lub2RlcywgZHJvcF9jYWNoZXMpLCBibG9jayBkZXZpY2VzIChzeW5jX2JkZXZzKSwgcXVvdGFzIChhZGRfZHF1b3RfcmVmKSwgR0ZTMiAoZ2ZzMl9ldmljdF9pbm9kZXMpLCBhbmQgTGFuZGxvY2sgKGhvb2tfc2JfZGVsZXRlKS4gVGhpcyBzaWduaWZpY2FudGx5IGFsdGVycyBsb2NraW5nLCBsaXN0IG11dGF0aW9uIGR1cmluZyB0cmF2ZXJzYWwsIGFuZCByZWZjb3VudGluZyBhY3Jvc3MgY29yZSBzdWJzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgcmFjZXMsIGxpc3QgY29ycnVwdGlvbnMsIG9yIGRlYWRsb2Nrcy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7UVVPVEEmIzM0OywKICAgICYjMzQ7R0ZTMl9GUyYjMzQ7LAogICAgJiMzNDtTRUNVUklUWV9MQU5ETE9DSyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NiX2Zvcl9lYWNoX2lub2RlcyYjMzQ7LAogICAgJiMzNDtldmljdF9pbm9kZXMmIzM0OywKICAgICYjMzQ7c3luY19iZGV2cyYjMzQ7LAogICAgJiMzNDtkcm9wX3BhZ2VjYWNoZV9zYiYjMzQ7LAogICAgJiMzNDthZGRfZHF1b3RfcmVmJiMzNDssCiAgICAmIzM0O2dmczJfZXZpY3RfaW5vZGVzJiMzNDssCiAgICAmIzM0O2hvb2tfc2JfZGVsZXRlJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gZnJhbWV3b3JrIChzYl9mb3JfZWFjaF9pbm9kZXMpIHdpdGggZHluYW1pYyBpdGVyYXRvciBsaXN0IHRyYWNraW5nIChzX2lub2Rlc19pdGVycykgYW5kIHVwZGF0ZXMgdHJhdmVyc2FsIGxvb3BzIGluIFZGUyAoZXZpY3RfaW5vZGVzLCBkcm9wX2NhY2hlcyksIGJsb2NrIGRldmljZXMgKHN5bmNfYmRldnMpLCBxdW90YXMgKGFkZF9kcXVvdF9yZWYpLCBHRlMyIChnZnMyX2V2aWN0X2lub2RlcyksIGFuZCBMYW5kbG9jayAoaG9va19zYl9kZWxldGUpLiBUaGlzIHNpZ25pZmljYW50bHkgYWx0ZXJzIGxvY2tpbmcsIGxpc3QgbXV0YXRpb24gZHVyaW5nIHRyYXZlcnNhbCwgYW5kIHJlZmNvdW50aW5nIGFjcm9zcyBjb3JlIHN1YnN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciByYWNlcywgbGlzdCBjb3JydXB0aW9ucywgb3IgZGVhZGxvY2tzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA5IDExOjExPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBpbnRlcm5hbCBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gYWNyb3NzIHNldmVyYWwgc3Vic3lzdGVtcyAoYmxvY2ssIGRyb3BfY2FjaGVzLCBnZnMyLCB2ZnMgaW5vZGUsIHF1b3RhLCBsYW5kbG9jaykgYnkgaW50cm9kdWNpbmcgYSBnZW5lcmljIGhlbHBlciBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGFuZCBpdGVyYXRvciBzdHJ1Y3R1cmUgYHN0cnVjdCBpbm9kZV9pdGVyYC5cblxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxuICAtIFRoZSBuZXdseSBpbnRyb2R1Y2VkIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IGlub2RlX2l0ZXJgIGluIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGlub2RlX3NiX2l0ZXJfc3RhcnQoKWAuXG4gIC0gQWxsIGNhbGxiYWNrIGRhdGEgcGF5bG9hZHMgcGFzc2VkIHRvIHRoZSBpdGVyYXRvciBmdW5jdGlvbnMgYXJlIGVpdGhlciBOVUxMIG9yIHBvaW50ZXJzIHRvIGZ1bGx5IGluaXRpYWxpemVkIHZhcmlhYmxlcy9zdHJ1Y3R1cmVzIChlLmcuLCBib29sZWFuIGNhc3QsIGluaXRpYWxpemVkIGxpbmtlZCBsaXN0IGhlYWQsIGludGVnZXIgcG9pbnRlcikuXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXG4gIC0gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgY29uZGl0aW9uYWwgYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcbiAgLSBQb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCByZWxhdGUgdG8gbGlzdCBtYW5pcHVsYXRpb24sIHJlZmNvdW50aW5nIChgX19pZ2V0YC9gaXB1dGApLCBsb2NraW5nIHNlbWFudGljcyB1bmRlciBgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2tgIGFuZCBgaW5vZGUtXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXG5cblRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCBiNDZlM2Q5NmM5YTE3MTA3MjBiODNiMzllOWZmYTEyNmY5ODgwZDY1CkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIFdlZCBTZXAgOSAxMToxMDo0MSAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuYwppbmRleCBjZDgzMjMwODM3NDA2Li5hZTQ3MmEwNjJlNTFjIDEwMDY0NAotLS0gYS9ibG9jay9iZGV2LmMKJiM0MzsmIzQzOyYjNDM7IGIvYmxvY2svYmRldi5jCkBAIC0xMzM2LDU2ICYjNDM7MTMzNiw1MyBAQCB2b2lkIGJkZXZfbWFya19kZWFkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGJvb2wgc3VycHJpc2UpCiAgKi8KIEVYUE9SVF9TWU1CT0xfR1BMKGJkZXZfbWFya19kZWFkKTsKIAotdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdCkKJiM0MztzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrKCZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7YmxvY2tkZXZfc3VwZXJibG9jay0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLSZndDtpX21hcHBpbmc7Ci0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CWJvb2wgd2FpdCA9IChib29sKWRhdGE7CiYjNDM7CXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiYjNDM7CXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtJmd0O2lfbWFwcGluZzsKIAotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fAotCQkgICAgbWFwcGluZy0mZ3Q7bnJwYWdlcyA9PSAwKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKG1hcHBpbmctJmd0O25ycGFnZXMgPT0gMCkgewogCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KJiM0MzsJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKJiM0MzsJICogc19pbm9kZV9saXN0X2xvY2suCiYjNDM7CSAqLwomIzQzOwlfX2lnZXQoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJYmRldiA9IElfQkRFVihpbm9kZSk7CiYjNDM7CiYjNDM7CW11dGV4X2xvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2JkZXYtJmd0O2JkX29wZW5lcnMpKSB7CiYjNDM7CQk7IC8qIHNraXAgKi8KJiM0MzsJfSBlbHNlIGlmICh3YWl0KSB7CiAJCS8qCi0JCSAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJiMzOTtpbm9kZSYjMzk7IHNvIGl0IGNvdWxkbiYjMzk7dCBoYXZlIGJlZW4KLQkJICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGUKLQkJICogc19pbm9kZV9saXN0X2xvY2sgIFdlIGNhbm5vdCBpcHV0IHRoZSBpbm9kZSBub3cgYXMgd2UgY2FuCi0JCSAqIGJlIGhvbGRpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIGFuZCB3ZSBjYW5ub3QgaXB1dCBpdCB1bmRlcgotCQkgKiBzX2lub2RlX2xpc3RfbG9jay4gU28gd2Uga2VlcCB0aGUgcmVmZXJlbmNlIGFuZCBpcHV0IGl0Ci0JCSAqIGxhdGVyLgomIzQzOwkJICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzbwomIzQzOwkJICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmcKJiM0MzsJCSAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3IKJiM0MzsJCSAqIGRldGFpbHMuCiAJCSAqLwotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQliZGV2ID0gSV9CREVWKGlub2RlKTsKLQotCQltdXRleF9sb2NrKCZhbXA7YmRldi0mZ3Q7YmRfZGlzay0mZ3Q7b3Blbl9tdXRleCk7Ci0JCWlmICghYXRvbWljX3JlYWQoJmFtcDtiZGV2LSZndDtiZF9vcGVuZXJzKSkgewotCQkJOyAvKiBza2lwICovCi0JCX0gZWxzZSBpZiAod2FpdCkgewotCQkJLyoKLQkJCSAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc28KLQkJCSAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nCi0JCQkgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yCi0JCQkgKiBkZXRhaWxzLgotCQkJICovCi0JCQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKLQkJfQotCQltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKLQotCQlzcGluX2xvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQlmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0mZ3Q7aV9tYXBwaW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtibG9ja2Rldl9zdXBlcmJsb2NrLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dChvbGRfaW5vZGUpOwomIzQzOwltdXRleF91bmxvY2soJmFtcDtiZGV2LSZndDtiZF9kaXNrLSZndDtvcGVuX211dGV4KTsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CiYjNDM7CXNwaW5fbG9jaygmYW1wO2Jsb2NrZGV2X3N1cGVyYmxvY2stJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgc3luY19iZGV2cyhib29sIHdhaXQpCiYjNDM7ewomIzQzOwlzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsCiYjNDM7CQkJICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmMKaW5kZXggNDlmNTZhNTk4ZWNiYy4uMGQ0NzVhNWZmOGNmYiAxMDA2NDQKLS0tIGEvZnMvZHJvcF9jYWNoZXMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9kcm9wX2NhY2hlcy5jCkBAIC0xNiwzNiAmIzQzOzE2LDMwIEBACiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovCiBzdGF0aWMgaW50IHN5c2N0bF9kcm9wX2NhY2hlczsKIAotc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3N0YXRpYyBpbnQgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkvKgotCQkgKiBXZSBtdXN0IHNraXAgaW5vZGVzIGluIHVudXN1YWwgc3RhdGUuIFdlIG1heSBhbHNvIHNraXAKLQkJICogaW5vZGVzIHdpdGhvdXQgcGFnZXMgYnV0IHdlIGRlbGliZXJhdGVseSB3b24mIzM5O3QgaW4gY2FzZQotCQkgKiB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgdG8gYXZvaWQgc29mdGxvY2t1cHMuCi0JCSAqLwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHwKLQkJICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpICZhbXA7JmFtcDsgIW5lZWRfcmVzY2hlZCgpKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCV9faWdldChpbm9kZSk7CiYjNDM7CWlmIChtYXBwaW5nX2VtcHR5KGlub2RlLSZndDtpX21hcHBpbmcpKSB7CiAJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQotCQlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtJmd0O2lfbWFwcGluZywgMCwgLTEpOwotCQlpcHV0KHRvcHV0X2lub2RlKTsKLQkJdG9wdXRfaW5vZGUgPSBpbm9kZTsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwogCX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CiYjNDM7CWludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS0mZ3Q7aV9tYXBwaW5nLCAwLCAtMSk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKQomIzQzO3sKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKJiM0MzsmIzQzOyYjNDM7IGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTk5Niw3ICYjNDM7OTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KQogCQlzd2l0Y2ggKHRva2VuKSB7CiAJCWNhc2UgT3B0X2ppZDoKIAkJCXJldCA9IG1hdGNoX2ludCgmYW1wO3RtcFswXSwgJmFtcDtvcHRpb24pOwotCQkJaWYgKHJldCB8fCBvcHRpb24gJmx0OyAwKSAKJiM0MzsJCQlpZiAocmV0IHx8IG9wdGlvbiAmbHQ7IDApCiAJCQkJZ290byBob3N0ZGF0YV9lcnJvcjsKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpKQogCQkJCWxzLSZndDtsc19qaWQgPSBvcHRpb247CkBAIC0xNzE5LDYgJiM0MzsxNzE5LDE5IEBAIHN0YXRpYyBpbnQgZ2ZzMl9tZXRhX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpCiAJcmV0dXJuIDA7CiB9CiAKJiM0MztzdGF0aWMgaW50IGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtJmd0O2lfc2I7CiYjNDM7CiYjNDM7CV9faWdldChpbm9kZSk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZ2ZzMl9ldmljdF9pbm9kZXMgLSBldmljdCBpbm9kZXMgY29vcGVyYXRpdmVseQogICogQHNiOiB0aGUgc3VwZXJibG9jawpAQCAtMTc0MSwzMSAmIzQzOzE3NTQsMTAgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYykKICAqLwogc3RhdGljIHZvaWQgZ2ZzMl9ldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqdG9wdXRfaW5vZGUgPSBOVUxMOwogCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItJmd0O3NfZnNfaW5mbzsKIAogCXNldF9iaXQoU0RGX0VWSUNUSU5HLCAmYW1wO3NkcC0mZ3Q7c2RfZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCAmYW1wO3NiLSZndDtzX2lub2RlcywgaV9zYl9saXN0KSB7Ci0JCXNwaW5fbG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQlpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgJmFtcDsmYW1wOwotCQkgICAgIW5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCi0JCWlwdXQodG9wdXRfaW5vZGUpOwotCQl0b3B1dF9pbm9kZSA9IGlub2RlOwotCi0JCWNvbmRfcmVzY2hlZCgpOwotCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JaXB1dCh0b3B1dF9pbm9kZSk7CiYjNDM7CXNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQpkaWZmIC0tZ2l0IGEvZnMvaW5vZGUuYyBiL2ZzL2lub2RlLmMKaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDQKLS0tIGEvZnMvaW5vZGUuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9pbm9kZS5jCkBAIC02OSw2ICYjNDM7NjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0gewogfTsKIEVYUE9SVF9TWU1CT0woZW1wdHlfYW9wcyk7CiAKJiM0MztzdHJ1Y3QgaW5vZGVfaXRlciB7CiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJaXRlcnNfbm9kZTsJLyogc2ItJmd0O3NfaW5vZGVzX2l0ZXJzICovCiYjNDM7CXN0cnVjdCBsaXN0X2hlYWQJKm5leHQ7CQkvKiBuZXh0IG5vZGUgZ29pbmcgdG8gaXRlcmF0ZSAqLwomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiYjNDM7CWlub2RlX2l0ZXJfY2IgZnVuYzsKJiM0MzsJdm9pZCAqZGF0YTsKJiM0MzsJaW50IHJldDsKJiM0Mzt9OwomIzQzOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbnJfdW51c2VkKTsKIApAQCAtNjQxLDEyICYjNDM7NjUwLDk2IEBAIHZvaWQgaW5vZGVfc2JfbGlzdF9hZGQoc3RydWN0IGlub2RlICppbm9kZSkKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTsKIAomIzQzO3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LAomIzQzOwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlpdC0mZ3Q7ZmxhZ3MgPSBmbGFnczsKJiM0MzsJaXQtJmd0O2Z1bmMgPSBmbjsKJiM0MzsJaXQtJmd0O2RhdGEgPSBkYXRhOwomIzQzOwlpdC0mZ3Q7cmV0ID0gMDsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaXQtJmd0O25leHQgPSBzYi0mZ3Q7c19pbm9kZXMubmV4dDsKJiM0MzsJbGlzdF9hZGQoJmFtcDtpdC0mZ3Q7aXRlcnNfbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBpbm9kZV9zYl9pdGVyX2VuZChzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiYjNDM7ewomIzQzOwlsaXN0X2RlbCgmYW1wO2l0LSZndDtpdGVyc19ub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQomIzQzO3sKJiM0MzsJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CXdoaWxlICghaW5vZGUgJmFtcDsmYW1wOyBpdC0mZ3Q7bmV4dCAhPSAmYW1wO3NiLSZndDtzX2lub2RlcykgewomIzQzOwkJaW5vZGUgPSBsaXN0X2VudHJ5KGl0LSZndDtuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7CiYjNDM7CQlpZiAoaXQtJmd0O2ZsYWdzICZhbXA7IElOT0RFX0lURVJfVU5VU0VEKSB7CiYjNDM7CQkJaWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7CiYjNDM7CQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQkJCWl0LSZndDtuZXh0ID0gaXQtJmd0O25leHQtJmd0O25leHQ7CiYjNDM7CQkJCWNvbnRpbnVlOwomIzQzOwkJCX0KJiM0MzsJCX0gZWxzZSB7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoKGl0LSZndDtmbGFncyAmYW1wOyBJTk9ERV9JVEVSX05PUk1BTCkgJmFtcDsmYW1wOwomIzQzOwkJICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7CiYjNDM7CQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCQlpdC0mZ3Q7bmV4dCA9IGl0LSZndDtuZXh0LSZndDtuZXh0OwomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJfQomIzQzOwomIzQzOwkJaXQtJmd0O25leHQgPSBpdC0mZ3Q7bmV4dC0mZ3Q7bmV4dDsKJiM0MzsJCXJldCA9IGl0LSZndDtmdW5jKGlub2RlLCBpdC0mZ3Q7ZGF0YSk7CiYjNDM7CQlpZiAocmV0KSB7CiYjNDM7CQkJaXQtJmd0O3JldCA9IHJldDsKJiM0MzsJCQlyZXR1cm4gZmFsc2U7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKJiM0MzsJCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CQkJY29uZF9yZXNjaGVkKCk7CiYjNDM7CQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gaXQtJmd0O25leHQgPT0gJmFtcDtzYi0mZ3Q7c19pbm9kZXMgPyBmYWxzZSA6IHRydWU7CiYjNDM7fQomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciBpdDsKJiM0MzsKJiM0MzsJaW5vZGVfc2JfaXRlcl9zdGFydChzYiwgJmFtcDtpdCwgZmxhZ3MsIGZuLCBkYXRhKTsKJiM0MzsJd2hpbGUgKGlub2RlX3NiX2l0ZXJfbmV4dCgmYW1wO2l0LCBzYikpCiYjNDM7CQk7CiYjNDM7CWlub2RlX3NiX2l0ZXJfZW5kKCZhbXA7aXQsIHNiKTsKJiM0MzsKJiM0MzsJcmV0dXJuIGl0LnJldDsKJiM0Mzt9CiYjNDM7RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpOwomIzQzOwogc3RhdGljIGlubGluZSB2b2lkIGlub2RlX3NiX2xpc3RfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwomIzQzOwlzdHJ1Y3QgaW5vZGVfaXRlciAqaXQ7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KSkgewogCQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpdCwgJmFtcDtzYi0mZ3Q7c19pbm9kZXNfaXRlcnMsIGl0ZXJzX25vZGUpIHsKJiM0MzsJCQlpZiAoaXQtJmd0O25leHQgPT0gJmFtcDtpbm9kZS0mZ3Q7aV9zYl9saXN0KQomIzQzOwkJCQlpdC0mZ3Q7bmV4dCA9IGlub2RlLSZndDtpX3NiX2xpc3QubmV4dDsKJiM0MzsJCX0KIAkJbGlzdF9kZWxfaW5pdCgmYW1wO2lub2RlLSZndDtpX3NiX2xpc3QpOwogCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJfQpAQCAtODY2LDYgJiM0Mzs5NTksMTcgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAJfQogfQogCiYjNDM7c3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQomIzQzO3sKJiM0MzsJc3RydWN0IGxpc3RfaGVhZCAqZGlzcG9zZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGF0YTsKJiM0MzsKJiM0MzsJaW5vZGVfc3RhdGVfc2V0KGlub2RlLCBJX0ZSRUVJTkcpOwomIzQzOwlpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpOwomIzQzOwlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlsaXN0X2FkZCgmYW1wO2lub2RlLSZndDtpX2xydSwgZGlzcG9zZSk7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKIC8qKgogICogZXZpY3RfaW5vZGVzCS0gZXZpY3QgYWxsIGV2aWN0YWJsZSBpbm9kZXMgZm9yIGEgc3VwZXJibG9jawogICogQHNiOgkJc3VwZXJibG9jayB0byBvcGVyYXRlIG9uCkBAIC04NzcsNDQgJiM0Mzs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiAgKi8KIHZvaWQgZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKIAlMSVNUX0hFQUQoZGlzcG9zZSk7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMIHwgSU5PREVfSVRFUl9VTlVTRUQ7CiAKLWFnYWluOgotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKLQotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKGljb3VudF9yZWFkKGlub2RlKSkgewotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTsKLQkJaW5vZGVfbHJ1X2xpc3RfZGVsKGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJbGlzdF9hZGQoJmFtcDtpbm9kZS0mZ3Q7aV9scnUsICZhbXA7ZGlzcG9zZSk7Ci0KLQkJLyoKLQkJICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlbgotCQkgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYQotCQkgKiBiaXQgc28gd2UgZG9uJiMzOTt0IGxpdmVsb2NrLgotCQkgKi8KLQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCWRpc3Bvc2VfbGlzdCgmYW1wO2Rpc3Bvc2UpOwotCQkJZ290byBhZ2FpbjsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0KJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsICZhbXA7ZGlzcG9zZSk7CiAJZGlzcG9zZV9saXN0KCZhbXA7ZGlzcG9zZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChldmljdF9pbm9kZXMpOwpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEvZHF1b3QuYyBiL2ZzL3F1b3RhL2RxdW90LmMKaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDQKLS0tIGEvZnMvcXVvdGEvZHF1b3QuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9xdW90YS9kcXVvdC5jCkBAIC0xMDQzLDY0ICYjNDM7MTA0Myw0OCBAQCBzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwotc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKm9sZF9pbm9kZSA9IE5VTEw7CiYjNDM7CWludCB0eXBlID0gKihpbnQgKilkYXRhOwomIzQzOwlpbnQgZXJyID0gMDsKJiM0MzsJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLSZndDtpX3NiOwogI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVRwogCWludCByZXNlcnZlZCA9IDA7CiAjZW5kaWYKLQlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJmFtcDtzYi0mZ3Q7c19pbm9kZXMsIGlfc2JfbGlzdCkgewotCQlzcGluX2xvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJaWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSAmYW1wOyAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8Ci0JCSAgICAhYXRvbWljX3JlYWQoJmFtcDtpbm9kZS0mZ3Q7aV93cml0ZWNvdW50KSB8fAotCQkgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7Ci0JCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQkJX19pZ2V0KGlub2RlKTsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX3dyaXRlY291bnQpIHx8CiYjNDM7CSAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHsKIAkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHCi0JCWlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSAmZ3Q7IDApKQotCQkJcmVzZXJ2ZWQgPSAxOwomIzQzOwlpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgJmd0OyAwKSkKJiM0MzsJCXJlc2VydmVkID0gMTsKICNlbmRpZgotCQlpcHV0KG9sZF9pbm9kZSk7Ci0JCWVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7Ci0JCWlmIChlcnIpIHsKLQkJCWlwdXQoaW5vZGUpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkvKgotCQkgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICYjMzk7aW5vZGUmIzM5OyBzbyBpdCBjb3VsZG4mIzM5O3QgaGF2ZSBiZWVuCi0JCSAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlCi0JCSAqIHNfaW5vZGVfbGlzdF9sb2NrLiBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbiBiZQotCQkgKiBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXIKLQkJICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdAotCQkgKiBsYXRlci4KLQkJICovCi0JCW9sZF9pbm9kZSA9IGlub2RlOwotCQljb25kX3Jlc2NoZWQoKTsKLQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWlwdXQob2xkX2lub2RlKTsKLW91dDoKJiM0MzsJZXJyID0gX19kcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUcKLQlpZiAocmVzZXJ2ZWQpIHsKLQkJcXVvdGFfZXJyb3Ioc2IsICYjMzQ7V3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uICYjMzQ7Ci0JCQkmIzM0O3RodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiAmIzM0OwotCQkJJiMzNDtQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7Ci0JfQomIzQzOwlpZiAocmVzZXJ2ZWQpCiYjNDM7CQlxdW90YV9lcnJvcihzYiwgJiMzNDtXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgJiMzNDsKJiM0MzsJCQkgICAgJiMzNDtvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5ICYjMzQ7CiYjNDM7CQkJICAgICYjMzQ7aW5jb25zaXN0ZW50LiBQbGVhc2UgcnVuIHF1b3RhY2hlY2soOCkmIzM0Oyk7CiAjZW5kaWYKJiM0MzsJaXB1dChpbm9kZSk7CiYjNDM7CXNwaW5fbG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIAomIzQzOy8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqLwomIzQzO3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKJiM0Mzt7CiYjNDM7CXJldHVybiBzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLAomIzQzOwkJCQkgIGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYiwgJmFtcDt0eXBlKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwppbmRleCAwNWU0NDMxNzMwMzg3Li4zZTA2OTE1MGM1NDQ1IDEwMDY0NAotLS0gYS9mcy9zdXBlci5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3N1cGVyLmMKQEAgLTM4Miw2ICYjNDM7MzgyLDcgQEAgc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsIGludCBmbGFncywKIAlzcGluX2xvY2tfaW5pdCgmYW1wO3MtJmd0O3Nfcm9vdHNfbG9jayk7CiAJbXV0ZXhfaW5pdCgmYW1wO3MtJmd0O3Nfc3luY19sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmYW1wO3MtJmd0O3NfaW5vZGVzKTsKJiM0MzsJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc19pdGVycyk7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJmFtcDtzLSZndDtzX2lub2Rlc193Yik7CiAJc3Bpbl9sb2NrX2luaXQoJmFtcDtzLSZndDtzX2lub2RlX3dibGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCBmOWQxZTA1ZThhZTY4Li5mMzE3NmFiMTBlNjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC0yOTYsNyAmIzQzOzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7CiAgKi8KICNkZWZpbmUgRklMRVNZU1RFTV9NQVhfU1RBQ0tfREVQVEggMgogCi0vKiogCiYjNDM7LyoqCiAgKiBlbnVtIHBvc2l0aXZlX2FvcF9yZXR1cm5zIC0gYW9wIHJldHVybiBjb2RlcyB3aXRoIHNwZWNpZmljIHNlbWFudGljcwogICoKICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXMKQEAgLTMwNiw3ICYjNDM7MzA2LDcgQEAgc3RydWN0IGlhdHRyIHsKICAqIAkJCSAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyCiAgKiAJCQkgICAgZnV0dXJlLiAgT3RoZXIgY2FsbGVycyBtdXN0IGJlIGNhcmVmdWwgdG8gdW5sb2NrCiAgKiAJCQkgICAgdGhlIHBhZ2UgaWYgdGhleSBnZXQgdGhpcyByZXR1cm4uICBSZXR1cm5lZCBieQotICogCQkJICAgIHdyaXRlcGFnZSgpOyAKJiM0MzsgKgkJCSAgICB3cml0ZXBhZ2UoKTsKICAqCiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXMKICAqICAJCQl1bmxvY2tlZCBpdCBhbmQgdGhlIHBhZ2UgbWlnaHQgaGF2ZSBiZWVuIHRydW5jYXRlZC4KQEAgLTg3MCw2ICYjNDM7ODcwLDIxIEBAIHN0cnVjdCBpbm9kZSB7CiAJdm9pZAkJCSppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi8KIH0gX19yYW5kb21pemVfbGF5b3V0OwogCiYjNDM7ZW51bSBpbm9kZV9pdGVyX2ZsYWdzX2VudW0gewomIzQzOwlJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSAmbHQ7Jmx0OyAxKSwgIC8qIEV4Y2x1ZGUgaW5vZGVzIHdpdGggKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpLiAqLwomIzQzOwlJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSAmbHQ7Jmx0OyAyKSwgIC8qIE9ubHkgcmV0dXJuIGlub2RlcyB3aXRoIChpX2NvdW50ID09IDApLiAqLwomIzQzO307CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kCiYjNDM7ICogIGlub2RlLSZndDtpX2xvY2sgICAgICAgICAgICAgIGxvY2tlZCAgICAgICAgIHVubG9ja2VkCiYjNDM7ICogIHNiLSZndDtzX2lub2RlX2xpc3RfbG9jayAgICAgIGxvY2tlZCAgICAgICAgIGxvY2tlZAomIzQzOyAqLwomIzQzO3R5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopOwomIzQzOwomIzQzO2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLAomIzQzOwkJICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpOwomIzQzOwogLyoKICAqIGlfc3RhdGUgaGFuZGxpbmcKICAqCkBAIC0xMzE1LDggJiM0MzsxMzMwLDEwIEBAIHN0cnVjdCBmaWxlICpnZXRfZmlsZV9hY3RpdmUoc3RydWN0IGZpbGUgKipmKTsKIAogI2RlZmluZQlNQVhfTk9OX0xGUwkoKDFVTCZsdDsmbHQ7MzEpIC0gMSkKIAotLyogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMgCi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIAomIzQzOy8qCiYjNDM7ICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXMKJiM0MzsgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uCiYjNDM7ICovCiAjaWYgQklUU19QRVJfTE9ORz09MzIKICNkZWZpbmUgTUFYX0xGU19GSUxFU0laRQkoKGxvZmZfdClVTE9OR19NQVggJmx0OyZsdDsgUEFHRV9TSElGVCkKICNlbGlmIEJJVFNfUEVSX0xPTkc9PTY0CkBAIC0yMjg1LDcgJiM0MzsyMzAyLDcgQEAgaW50IHN5bmNfaW5vZGVfbWV0YWRhdGEoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhaXQpOwogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGZzX2ZsYWdzOwotI2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEgCiYjNDM7I2RlZmluZSBGU19SRVFVSVJFU19ERVYJCTEKICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQQkyCiAjZGVmaW5lIEZTX0hBU19TVUJUWVBFCQk0CiAjZGVmaW5lIEZTX1VTRVJOU19NT1VOVAkJOAkvKiBDYW4gYmUgbW91bnRlZCBieSB1c2VybnMgcm9vdCAqLwpAQCAtMjkwNyw3ICYjNDM7MjkyNCw3IEBAIHNzaXplX3QgX19rZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKTsKIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopOwogZXh0ZXJuIHNzaXplX3QgX19rZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqIG9wZW5fZXhlYyhjb25zdCBjaGFyICopOwotIAomIzQzOwogLyogZnMvZGNhY2hlLmMgLS0gZ2VuZXJpYyBmcyBzdXBwb3J0IGZ1bmN0aW9ucyAqLwogZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiBib29sIHBhdGhfaXNfdW5kZXIoY29uc3Qgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IHBhdGggKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmgKaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaApAQCAtMjY5LDkgJiM0MzsyNjksMTAgQEAgc3RydWN0IHN1cGVyX2Jsb2NrIHsKIAkgKi8KIAlpbnQgc19zdGFja19kZXB0aDsKIAotCS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzICovCiYjNDM7CS8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqLwogCXNwaW5sb2NrX3QJCQkJc19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkJc19pbm9kZXM7CS8qIGFsbCBpbm9kZXMgKi8KJiM0MzsJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX2l0ZXJzOyAvKiBhbGwgaXRlcmF0b3JzICovCiAKIAlzcGlubG9ja190CQkJCXNfaW5vZGVfd2JsaXN0X2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAkJCXNfaW5vZGVzX3diOwkvKiB3cml0ZWJhY2sgaW5vZGVzICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuYwppbmRleCAzMGFhNmNlMTM1OTBhLi4zZGNkZThjYmZiNmFmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jCiYjNDM7JiM0MzsmIzQzOyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmMKQEAgLTEzNjksMTEwICYjNDM7MTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KQogCiAvKiBTdXBlci1ibG9jayBob29rcyAqLwogCi0vKgotICogUmVsZWFzZSB0aGUgaW5vZGVzIHVzZWQgaW4gYSBzZWN1cml0eSBwb2xpY3kuCi0gKgotICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCi0gKi8KLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpCiYjNDM7c3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgbGFuZGxvY2tfb2JqZWN0ICpvYmplY3Q7CiYjNDM7CXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0mZ3Q7aV9zYjsKIAotCWlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpCi0JCXJldHVybjsKJiM0MzsJaWYgKCFhdG9taWNfcmVhZCgmYW1wO2lub2RlLSZndDtpX2NvdW50KSkgewomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiAKLQlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsICZhbXA7c2ItJmd0O3NfaW5vZGVzLCBpX3NiX2xpc3QpIHsKLQkJc3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0OwomIzQzOwlyY3VfcmVhZF9sb2NrKCk7CiYjNDM7CW9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktJmd0O29iamVjdCk7CiYjNDM7CWlmICghb2JqZWN0KSB7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwkvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi8KJiM0MzsJX19pZ2V0KGlub2RlKTsKJiM0MzsJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKIAotCQkvKiBPbmx5IGhhbmRsZXMgcmVmZXJlbmNlZCBpbm9kZXMuICovCi0JCWlmICghaWNvdW50X3JlYWRfb25jZShpbm9kZSkpCi0JCQljb250aW51ZTsKJiM0MzsJLyoKJiM0MzsJICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZQomIzQzOwkgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZQomIzQzOwkgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLgomIzQzOwkgKi8KJiM0MzsJc3Bpbl9sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKJiM0MzsJaWYgKG9iamVjdC0mZ3Q7dW5kZXJvYmogPT0gaW5vZGUpIHsKJiM0MzsJCW9iamVjdC0mZ3Q7dW5kZXJvYmogPSBOVUxMOwomIzQzOwkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwomIzQzOwkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJLyoKLQkJICogUHJvdGVjdHMgYWdhaW5zdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiBpbm9kZSAoZS5nLgotCQkgKiBmcm9tIGdldF9pbm9kZV9vYmplY3QoKSkuCiYjNDM7CQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAomIzQzOwkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCiYjNDM7CQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKJiM0MzsJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgomIzQzOwkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgogCQkgKi8KLQkJc3Bpbl9sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7CiYjNDM7CQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwogCQkvKgotCQkgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZQotCQkgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaAotCQkgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS0mZ3Q7c2VjdXJpdHkgb3IgYQotCQkgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc28KLQkJICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuCiYjNDM7CQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzCiYjNDM7CQkgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZQomIzQzOwkJICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wCiYjNDM7CQkgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlcwomIzQzOwkJICogb24gdGhlIGlub2RlLgogCQkgKi8KLQkJaWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpICZhbXA7Ci0JCSAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7aW5vZGUtJmd0O2lfbG9jayk7Ci0JCQljb250aW51ZTsKLQkJfQomIzQzOwkJaXB1dF9ub3RfbGFzdChpbm9kZSk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlzcGluX3VubG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7CiYjNDM7CQlyY3VfcmVhZF91bmxvY2soKTsKJiM0MzsJfQogCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJb2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0KTsKLQkJaWYgKCFvYmplY3QpIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJc3Bpbl91bmxvY2soJmFtcDtpbm9kZS0mZ3Q7aV9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCS8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqLwotCQlfX2lnZXQoaW5vZGUpOwotCQlzcGluX3VubG9jaygmYW1wO2lub2RlLSZndDtpX2xvY2spOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NiLSZndDtzX2lub2RlX2xpc3RfbG9jayk7CiYjNDM7CWlwdXQoaW5vZGUpOwomIzQzOwlzcGluX2xvY2soJmFtcDtzYi0mZ3Q7c19pbm9kZV9saXN0X2xvY2spOwogCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2UKLQkJICogYXJlIGluIGNoYXJnZSBvZiBjYWxsaW5nIGlwdXQoKSBvbiB0aGlzIGlub2RlLCBvdGhlcndpc2Ugd2UKLQkJICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC4KLQkJICovCi0JCXNwaW5fbG9jaygmYW1wO29iamVjdC0mZ3Q7bG9jayk7Ci0JCWlmIChvYmplY3QtJmd0O3VuZGVyb2JqID09IGlub2RlKSB7Ci0JCQlvYmplY3QtJmd0O3VuZGVyb2JqID0gTlVMTDsKLQkJCXNwaW5fdW5sb2NrKCZhbXA7b2JqZWN0LSZndDtsb2NrKTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiAKLQkJCS8qCi0JCQkgKiBCZWNhdXNlIG9iamVjdC0mZ3Q7dW5kZXJvYmogd2FzIG5vdCBOVUxMLAotCQkJICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlCi0JCQkgKiB0aGF0IGl0IGlzIHNhZmUgdG8gcmVzZXQKLQkJCSAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS0mZ3Q7b2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLgotCQkJICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS0mZ3Q7aV9sb2NrLgotCQkJICovCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLSZndDtvYmplY3QsIE5VTEwpOwotCQkJLyoKLQkJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXMKLQkJCSAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlCi0JCQkgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3AKLQkJCSAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzCi0JCQkgKiBvbiB0aGUgaW5vZGUuCi0JCQkgKi8KLQkJCWlwdXRfbm90X2xhc3QoaW5vZGUpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmFtcDtvYmplY3QtJmd0O2xvY2spOwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCX0KJiM0MzsvKgomIzQzOyAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LgomIzQzOyAqCiYjNDM7ICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYikKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMOwogCi0JCWlmIChwcmV2X2lub2RlKSB7Ci0JCQkvKgotCQkJICogQXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgb3duIHRoZSBfX2lnZXQoKSByZWZlcmVuY2UKLQkJCSAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2UKLQkJCSAqIGNhbiBkcm9wIHRoZSBsaXN0IGxvY2sgYW5kIGtub3cgdGhhdCB0aGUgaW5vZGUgd29uJiMzOTt0Ci0JCQkgKiBkaXNhcHBlYXIgZnJvbSB1bmRlciB1cyB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuCi0JCQkgKi8KLQkJCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJCS8qCi0JCQkgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlCi0JCQkgKiBwcmV2aW91cyBsb29wIHdhbGssIHdoaWNoIGlzIG5vdCBuZWVkZWQgYW55bW9yZS4KLQkJCSAqLwotCQkJaXB1dChwcmV2X2lub2RlKTsKLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJc3Bpbl9sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKLQkJfQotCQlwcmV2X2lub2RlID0gaW5vZGU7Ci0JfQotCXNwaW5fdW5sb2NrKCZhbXA7c2ItJmd0O3NfaW5vZGVfbGlzdF9sb2NrKTsKJiM0MzsJaWYgKCFsYW5kbG9ja19pbml0aWFsaXplZCkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7CiAKLQkvKiBQdXRzIHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGUgbGFzdCBsb29wIHdhbGssIGlmIGFueS4gKi8KLQlpZiAocHJldl9pbm9kZSkKLQkJaXB1dChwcmV2X2lub2RlKTsKIAkvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqLwogCXdhaXRfdmFyX2V2ZW50KCZhbXA7bGFuZGxvY2tfc3VwZXJibG9jayhzYiktJmd0O2lub2RlX3JlZnMsCiAJCSAgICAgICAhYXRvbWljX2xvbmdfcmVhZCgmYW1wO2xhbmRsb2NrX3N1cGVyYmxvY2soc2IpLSZndDtpbm9kZV9yZWZzKSk7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wOSAxMToxMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTIwOQoJCQkJCQkJb3V0cHV0OiAzNDEKCQkJCQkJCXRob3VnaHRzOiAyMjY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEV2YWx1YXRpb246IFBhdGNoIEludHJvZHVjaW5nIGBzYl9mb3JfZWFjaF9pbm9kZXNgKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgcGF0Y2gsIHdoaWNoIGludHJvZHVjZXMgYSBuZXcgaXRlcmF0b3IgZm9yIGlub2RlcyB3aXRoaW4gYSBzdXBlcmJsb2NrLCB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24sIG9yIGlmIGl0JiMzOTtzIHN1ZmZpY2llbnRseSBjb3ZlcmVkIGJ5IGV4aXN0aW5nIEtBU0FOIGFuZCBvdGhlciBkZWJ1Z2dpbmcgdG9vbHMuCgpGaXJzdCwgSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIHBhdGNoIGl0c2VsZi4gSXQmIzM5O3MgZXNzZW50aWFsbHkgaW50cm9kdWNpbmcgYSBoZWxwZXIgZnVuY3Rpb24sIGBzYl9mb3JfZWFjaF9pbm9kZXNgLCBhbmQgYW4gYXNzb2NpYXRlZCBpdGVyYXRvciBzdHJ1Y3R1cmUsIGBpbm9kZV9pdGVyYCwgdG8gc3RyZWFtbGluZSBpdGVyYXRpb24gdGhyb3VnaCB0aGUgYHNfaW5vZGVzYCBsaXN0IG9mIGEgc3VwZXJibG9jay4gU2V2ZXJhbCBleGlzdGluZyBmdW5jdGlvbnMgdGhhdCBpdGVyYXRlIGlub2RlcyBhcmUgYmVpbmcgcmVmYWN0b3JlZCB0byB1c2UgdGhpcyBuZXcgaXRlcmF0b3IuIFRoZSBwYXRjaCBhbHNvIGFkZHMgYSBgc19pbm9kZXNfaXRlcnNgIGxpc3QgdG8gdGhlIGBzdXBlcl9ibG9ja2Agc3RydWN0dXJlIHRvIHRyYWNrIHRoZSBpdGVyYXRvcnMuCgpOb3csIGxldCYjMzk7cyBkcmlsbCBkb3duIGludG8gdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLCBpbmZvIGxlYWtzLCBvciBhbnkgb3RoZXIgS01TQU4tc3BlY2lmaWMgY29uY2VybnMuCgpJJiMzOTt2ZSBleGFtaW5lZCB0aGUgY29kZSBjbG9zZWx5LiBUaGUgYGlub2RlX2l0ZXJgIHN0cnVjdHVyZSBpdHNlbGYgaXMgc3RhY2stYWxsb2NhdGVkIHdpdGhpbiB0aGUgYHNiX2Zvcl9lYWNoX2lub2Rlc2AgZnVuY3Rpb24sIGFuZCBhbGwgaXRzIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aGluIHRoZSBgaW5vZGVfc2JfaXRlcl9zdGFydGAgZnVuY3Rpb24uIFRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyB3aXRoaW4gdGhlIGl0ZXJhdG9yLiBTcGVjaWZpY2FsbHksIHRoZSBwYXRjaCBkb2VzIG5vdCBjb3B5IGFueSBrZXJuZWwgZGF0YSB0byB1c2VyIHNwYWNlLiBJdCBhbHNvIGxvb2tzIGxpa2UgdGhlIGBkYXRhYCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBlaXRoZXIgYSBudWxsIHBvaW50ZXIsIG9yIGFuIGluaXRpYWxpemVkIHZhcmlhYmxlLiBUaGUgYGlub2RlX3NiX2l0ZXJfbmV4dGAgZnVuY3Rpb24mIzM5O3MgbG9naWMgaXMgY2xlYXIsIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2dpY2FsIGJ1ZyBpbiBpdCwgaXQgaXMgbm90IGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLgoKU28sIGFtIEkgc2VlaW5nIGFueXRoaW5nIHRoYXQgd291bGQgZmFsbCBpbnRvIHRoZSBjYXRlZ29yaWVzIHdoZXJlIEtNU0FOIGlzIHNwZWNpZmljYWxseSBuZWVkZWQ/IE5vLCBub3QgcmVhbGx5LiBUaGUgcHJpbWFyeSByaXNrcyBhcHBlYXIgdG8gYmUgcmVsYXRlZCB0byBjb25jdXJyZW5jeSwgbG9ja2luZywgYW5kIHBvdGVudGlhbGx5IHVzZS1hZnRlci1mcmVlIGJ1Z3MuIFRoaW5ncyBsaWtlIGRyb3BwaW5nIGFuZCByZXRha2luZyB0aGUgYHNfaW5vZGVfbGlzdF9sb2NrYCB3aGlsZSBgaXQtJmd0O25leHRgIGlzIHVwZGF0ZWQuIFRoZXNlIGtpbmRzIG9mIGJ1Z3MgYXJlIHRoZSBicmVhZCBhbmQgYnV0dGVyIG9mIEtBU0FOLCBMT0NLREVQLCBhbmQgdGhlIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgaW5mcmFzdHJ1Y3R1cmUuCgpJJiMzOTt2ZSByZXZpZXdlZCB0aGUgZ3VpZGVsaW5lcy4gSSBuZWVkIHRvIGFzayBteXNlbGY6IERvZXMgdGhpcyBwYXRjaCBpbnRyb2R1Y2Ugb3IgbW9kaWZ5OgoxLiAgS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlPyBOby4KMi4gIENvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcz8gTm8uCjMuICBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQ/IE5vLgo0LiAgQm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzPyBOby4KClRoZXJlZm9yZSwgdGhpcyBwYXRjaCBkb2VzIG5vdCBleHBvc2UgYW55IG5ldyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gQWxsIHN0cnVjdHVyZXMgdG91Y2hlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IGluaXRpYWxpemVkIGFuZCB0aGUgaW50cm9kdWNlZCBidWdzIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOIGFuZCB0aGUgc3RhbmRhcmQgYnVnIGRldGVjdG9ycy4gTm8gS01TQU4gaXMgbmVlZGVkLgoKSSYjMzk7bSBjb21mb3J0YWJsZSBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYCBmb3IgdGhpcyBwYXRjaC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDkgMTE6MTE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBpbnRlcm5hbCBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gYWNyb3NzIHNldmVyYWwgc3Vic3lzdGVtcyAoYmxvY2ssIGRyb3BfY2FjaGVzLCBnZnMyLCB2ZnMgaW5vZGUsIHF1b3RhLCBsYW5kbG9jaykgYnkgaW50cm9kdWNpbmcgYSBnZW5lcmljIGhlbHBlciBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGFuZCBpdGVyYXRvciBzdHJ1Y3R1cmUgYHN0cnVjdCBpbm9kZV9pdGVyYC5cblxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxuICAtIFRoZSBuZXdseSBpbnRyb2R1Y2VkIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IGlub2RlX2l0ZXJgIGluIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGlub2RlX3NiX2l0ZXJfc3RhcnQoKWAuXG4gIC0gQWxsIGNhbGxiYWNrIGRhdGEgcGF5bG9hZHMgcGFzc2VkIHRvIHRoZSBpdGVyYXRvciBmdW5jdGlvbnMgYXJlIGVpdGhlciBOVUxMIG9yIHBvaW50ZXJzIHRvIGZ1bGx5IGluaXRpYWxpemVkIHZhcmlhYmxlcy9zdHJ1Y3R1cmVzIChlLmcuLCBib29sZWFuIGNhc3QsIGluaXRpYWxpemVkIGxpbmtlZCBsaXN0IGhlYWQsIGludGVnZXIgcG9pbnRlcikuXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXG4gIC0gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgY29uZGl0aW9uYWwgYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxuXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcbiAgLSBQb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCByZWxhdGUgdG8gbGlzdCBtYW5pcHVsYXRpb24sIHJlZmNvdW50aW5nIChgX19pZ2V0YC9gaXB1dGApLCBsb2NraW5nIHNlbWFudGljcyB1bmRlciBgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2tgIGFuZCBgaW5vZGUtXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXG5cblRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLCBhbmQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgdGhlIGludGVybmFsIHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIG1lY2hhbmlzbSBhY3Jvc3Mgc2V2ZXJhbCBzdWJzeXN0ZW1zIChibG9jaywgZHJvcF9jYWNoZXMsIGdmczIsIHZmcyBpbm9kZSwgcXVvdGEsIGxhbmRsb2NrKSBieSBpbnRyb2R1Y2luZyBhIGdlbmVyaWMgaGVscGVyIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgYW5kIGl0ZXJhdG9yIHN0cnVjdHVyZSBgc3RydWN0IGlub2RlX2l0ZXJgLlxuXG4tIFVuaW5pdGlhbGl6ZWQgbWVtb3J5IC8gS01TQU4gcGVyc3BlY3RpdmU6XG4gIC0gVGhlIG5ld2x5IGludHJvZHVjZWQgc3RhY2stYWxsb2NhdGVkIGBzdHJ1Y3QgaW5vZGVfaXRlcmAgaW4gYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBpcyBmdWxseSBpbml0aWFsaXplZCBpbiBgaW5vZGVfc2JfaXRlcl9zdGFydCgpYC5cbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cbiAgLSBObyBrZXJuZWwgZGF0YSBpcyBjb3BpZWQgb3IgZXhwb3NlZCB0byB1c2VyIHNwYWNlIChubyBgY29weV90b191c2VyYCwgaW9jdGxzLCBuZXRsaW5rIG1lc3NhZ2VzLCBldGMuKS5cbiAgLSBObyB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcyBvciBjb25kaXRpb25hbCBicmFuY2hpbmcgb24gdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGludHJvZHVjZWQuXG5cbi0gS0FTQU4gLyBMT0NLREVQIHBlcnNwZWN0aXZlOlxuICAtIFBvdGVudGlhbCBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGlzIHBhdGNoIHJlbGF0ZSB0byBsaXN0IG1hbmlwdWxhdGlvbiwgcmVmY291bnRpbmcgKGBfX2lnZXRgL2BpcHV0YCksIGxvY2tpbmcgc2VtYW50aWNzIHVuZGVyIGBzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cdTAwM2VpX2xvY2tgLCBvciB1c2UtYWZ0ZXItZnJlZS9yYWNlIGNvbmRpdGlvbnMgaWYgbGlzdCBub2RlcyBhcmUgZGVsZXRlZCBkdXJpbmcgdHJhdmVyc2FsLiBUaGVzZSBhcmUgZnVsbHkgY292ZXJlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIGBERUJVR19MSVNUYC5cblxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NDMuMjg4ODE1NTg1WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzUzNjM4NzI2NTksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiUVVPVEFcIixcbiAgICBcIkdGUzJfRlNcIixcbiAgICBcIlNFQ1VSSVRZX0xBTkRMT0NLXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic2JfZm9yX2VhY2hfaW5vZGVzXCIsXG4gICAgXCJldmljdF9pbm9kZXNcIixcbiAgICBcInN5bmNfYmRldnNcIixcbiAgICBcImRyb3BfcGFnZWNhY2hlX3NiXCIsXG4gICAgXCJhZGRfZHF1b3RfcmVmXCIsXG4gICAgXCJnZnMyX2V2aWN0X2lub2Rlc1wiLFxuICAgIFwiaG9va19zYl9kZWxldGVcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXFxuXFxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxcbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXFxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG5cXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcXG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXFxuXFxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHN1cGVyYmxvY2sgaW5vZGUgaXRlcmF0aW9uIGZyYW1ld29yayAoc2JfZm9yX2VhY2hfaW5vZGVzKSB3aXRoIGR5bmFtaWMgaXRlcmF0b3IgbGlzdCB0cmFja2luZyAoc19pbm9kZXNfaXRlcnMpIGFuZCB1cGRhdGVzIHRyYXZlcnNhbCBsb29wcyBpbiBWRlMgKGV2aWN0X2lub2RlcywgZHJvcF9jYWNoZXMpLCBibG9jayBkZXZpY2VzIChzeW5jX2JkZXZzKSwgcXVvdGFzIChhZGRfZHF1b3RfcmVmKSwgR0ZTMiAoZ2ZzMl9ldmljdF9pbm9kZXMpLCBhbmQgTGFuZGxvY2sgKGhvb2tfc2JfZGVsZXRlKS4gVGhpcyBzaWduaWZpY2FudGx5IGFsdGVycyBsb2NraW5nLCBsaXN0IG11dGF0aW9uIGR1cmluZyB0cmF2ZXJzYWwsIGFuZCByZWZjb3VudGluZyBhY3Jvc3MgY29yZSBzdWJzeXN0ZW1zLCBtYWtpbmcgaXQgd29ydGggZnV6emluZyBmb3IgcmFjZXMsIGxpc3QgY29ycnVwdGlvbnMsIG9yIGRlYWRsb2Nrcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NDMuMjg4ODIwOTk1WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTA0MDE3NTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgYjQ2ZTNkOTZjOWExNzEwNzIwYjgzYjM5ZTlmZmExMjZmOTg4MGQ2NVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgV2VkIFNlcCA5IDExOjEwOjQxIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuY1xcbmluZGV4IGNkODMyMzA4Mzc0MDYuLmFlNDcyYTA2MmU1MWMgMTAwNjQ0XFxuLS0tIGEvYmxvY2svYmRldi5jXFxuKysrIGIvYmxvY2svYmRldi5jXFxuQEAgLTEzMzYsNTYgKzEzMzYsNTMgQEAgdm9pZCBiZGV2X21hcmtfZGVhZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBib29sIHN1cnByaXNlKVxcbiAgKi9cXG4gRVhQT1JUX1NZTUJPTF9HUEwoYmRldl9tYXJrX2RlYWQpO1xcbiBcXG4tdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcXG4rc3RhdGljIGludCBzeW5jX2JkZXZzX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcXG4ge1xcbi1cXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDtcXG4tXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVxcdTAwM2VpX21hcHBpbmc7XFxuLVxcdFxcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XFxuK1xcdGJvb2wgd2FpdCA9IChib29sKWRhdGE7XFxuK1xcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XFxuK1xcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXFx1MDAzZWlfbWFwcGluZztcXG4gXFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fFxcbi1cXHRcXHQgICAgbWFwcGluZy1cXHUwMDNlbnJwYWdlcyA9PSAwKSB7XFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0X19pZ2V0KGlub2RlKTtcXG4rXFx0aWYgKG1hcHBpbmctXFx1MDAzZW5ycGFnZXMgPT0gMCkge1xcbiBcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICdpbm9kZScgc28gaXQgY291bGRuJ3QgaGF2ZSBiZWVuXFxuK1xcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXFxuK1xcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLlxcbitcXHQgKi9cXG4rXFx0X19pZ2V0KGlub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRiZGV2ID0gSV9CREVWKGlub2RlKTtcXG4rXFxuK1xcdG11dGV4X2xvY2soXFx1MDAyNmJkZXYtXFx1MDAzZWJkX2Rpc2stXFx1MDAzZW9wZW5fbXV0ZXgpO1xcbitcXHRpZiAoIWF0b21pY19yZWFkKFxcdTAwMjZiZGV2LVxcdTAwM2ViZF9vcGVuZXJzKSkge1xcbitcXHRcXHQ7IC8qIHNraXAgKi9cXG4rXFx0fSBlbHNlIGlmICh3YWl0KSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJ2lub2RlJyBzbyBpdCBjb3VsZG4ndCBoYXZlIGJlZW5cXG4tXFx0XFx0ICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGVcXG4tXFx0XFx0ICogc19pbm9kZV9saXN0X2xvY2sgIFdlIGNhbm5vdCBpcHV0IHRoZSBpbm9kZSBub3cgYXMgd2UgY2FuXFxuLVxcdFxcdCAqIGJlIGhvbGRpbmcgdGhlIGxhc3QgcmVmZXJlbmNlIGFuZCB3ZSBjYW5ub3QgaXB1dCBpdCB1bmRlclxcbi1cXHRcXHQgKiBzX2lub2RlX2xpc3RfbG9jay4gU28gd2Uga2VlcCB0aGUgcmVmZXJlbmNlIGFuZCBpcHV0IGl0XFxuLVxcdFxcdCAqIGxhdGVyLlxcbitcXHRcXHQgKiBXZSBrZWVwIHRoZSBlcnJvciBzdGF0dXMgb2YgaW5kaXZpZHVhbCBtYXBwaW5nIHNvXFxuK1xcdFxcdCAqIHRoYXQgYXBwbGljYXRpb25zIGNhbiBjYXRjaCB0aGUgd3JpdGViYWNrIGVycm9yIHVzaW5nXFxuK1xcdFxcdCAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3JcXG4rXFx0XFx0ICogZGV0YWlscy5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdGlwdXQob2xkX2lub2RlKTtcXG4tXFx0XFx0b2xkX2lub2RlID0gaW5vZGU7XFxuLVxcdFxcdGJkZXYgPSBJX0JERVYoaW5vZGUpO1xcbi1cXG4tXFx0XFx0bXV0ZXhfbG9jayhcXHUwMDI2YmRldi1cXHUwMDNlYmRfZGlzay1cXHUwMDNlb3Blbl9tdXRleCk7XFxuLVxcdFxcdGlmICghYXRvbWljX3JlYWQoXFx1MDAyNmJkZXYtXFx1MDAzZWJkX29wZW5lcnMpKSB7XFxuLVxcdFxcdFxcdDsgLyogc2tpcCAqL1xcbi1cXHRcXHR9IGVsc2UgaWYgKHdhaXQpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzb1xcbi1cXHRcXHRcXHQgKiB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY2F0Y2ggdGhlIHdyaXRlYmFjayBlcnJvciB1c2luZ1xcbi1cXHRcXHRcXHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXFxuLVxcdFxcdFxcdCAqIGRldGFpbHMuXFxuLVxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4tXFx0XFx0fSBlbHNlIHtcXG4tXFx0XFx0XFx0ZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbi1cXHRcXHR9XFxuLVxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2YmRldi1cXHUwMDNlYmRfZGlzay1cXHUwMDNlb3Blbl9tdXRleCk7XFxuLVxcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0XFx0ZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXHRpcHV0KG9sZF9pbm9kZSk7XFxuK1xcdG11dGV4X3VubG9jayhcXHUwMDI2YmRldi1cXHUwMDNlYmRfZGlzay1cXHUwMDNlb3Blbl9tdXRleCk7XFxuK1xcdGlwdXQoaW5vZGUpO1xcbitcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcXG4re1xcbitcXHRzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsXFxuK1xcdFxcdFxcdCAgIHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYiwgKHZvaWQgKil3YWl0KTtcXG4gfVxcbiBcXG4gLypcXG5kaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmNcXG5pbmRleCA0OWY1NmE1OThlY2JjLi4wZDQ3NWE1ZmY4Y2ZiIDEwMDY0NFxcbi0tLSBhL2ZzL2Ryb3BfY2FjaGVzLmNcXG4rKysgYi9mcy9kcm9wX2NhY2hlcy5jXFxuQEAgLTE2LDM2ICsxNiwzMCBAQFxcbiAvKiBBIGdsb2JhbCB2YXJpYWJsZSBpcyBhIGJpdCB1Z2x5LCBidXQgaXQga2VlcHMgdGhlIGNvZGUgc2ltcGxlICovXFxuIHN0YXRpYyBpbnQgc3lzY3RsX2Ryb3BfY2FjaGVzO1xcbiBcXG4tc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxcbitzdGF0aWMgaW50IGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XFxuK1xcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIFdlIG11c3Qgc2tpcCBpbm9kZXMgaW4gdW51c3VhbCBzdGF0ZS4gV2UgbWF5IGFsc28gc2tpcFxcbi1cXHRcXHQgKiBpbm9kZXMgd2l0aG91dCBwYWdlcyBidXQgd2UgZGVsaWJlcmF0ZWx5IHdvbid0IGluIGNhc2VcXG4tXFx0XFx0ICogd2UgbmVlZCB0byByZXNjaGVkdWxlIHRvIGF2b2lkIHNvZnRsb2NrdXBzLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHxcXG4tXFx0XFx0ICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLVxcdTAwM2VpX21hcHBpbmcpIFxcdTAwMjZcXHUwMDI2ICFuZWVkX3Jlc2NoZWQoKSkpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRfX2lnZXQoaW5vZGUpO1xcbitcXHRpZiAobWFwcGluZ19lbXB0eShpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKSkge1xcbiBcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXG4tXFx0XFx0aW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLVxcdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcXG4tXFx0XFx0aXB1dCh0b3B1dF9pbm9kZSk7XFxuLVxcdFxcdHRvcHV0X2lub2RlID0gaW5vZGU7XFxuLVxcbi1cXHRcXHRjb25kX3Jlc2NoZWQoKTtcXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4gXFx0fVxcbitcXG4rXFx0X19pZ2V0KGlub2RlKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbiBcXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0aXB1dCh0b3B1dF9pbm9kZSk7XFxuK1xcbitcXHRpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtXFx1MDAzZWlfbWFwcGluZywgMCwgLTEpO1xcbitcXHRpcHV0KGlub2RlKTtcXG4rXFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXFxuK3tcXG4rXFx0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcXG5kaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xcbmluZGV4IDcxOGUwZGE3ZGZjZTAuLmFjZGJmOWNhNDRhM2YgMTAwNjQ0XFxuLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmNcXG4rKysgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xcbkBAIC05OTYsNyArOTk2LDcgQEAgc3RhdGljIGludCBnZnMyX2xtX21vdW50KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBpbnQgc2lsZW50KVxcbiBcXHRcXHRzd2l0Y2ggKHRva2VuKSB7XFxuIFxcdFxcdGNhc2UgT3B0X2ppZDpcXG4gXFx0XFx0XFx0cmV0ID0gbWF0Y2hfaW50KFxcdTAwMjZ0bXBbMF0sIFxcdTAwMjZvcHRpb24pO1xcbi1cXHRcXHRcXHRpZiAocmV0IHx8IG9wdGlvbiBcXHUwMDNjIDApIFxcbitcXHRcXHRcXHRpZiAocmV0IHx8IG9wdGlvbiBcXHUwMDNjIDApXFxuIFxcdFxcdFxcdFxcdGdvdG8gaG9zdGRhdGFfZXJyb3I7XFxuIFxcdFxcdFxcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCBcXHUwMDI2c2RwLVxcdTAwM2VzZF9mbGFncykpXFxuIFxcdFxcdFxcdFxcdGxzLVxcdTAwM2Vsc19qaWQgPSBvcHRpb247XFxuQEAgLTE3MTksNiArMTcxOSwxOSBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxcbiBcXHRyZXR1cm4gMDtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxcbit7XFxuK1xcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4rXFxuK1xcdF9faWdldChpbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcbitcXHRpcHV0KGlub2RlKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gLyoqXFxuICAqIGdmczJfZXZpY3RfaW5vZGVzIC0gZXZpY3QgaW5vZGVzIGNvb3BlcmF0aXZlbHlcXG4gICogQHNiOiB0aGUgc3VwZXJibG9ja1xcbkBAIC0xNzQxLDMxICsxNzU0LDEwIEBAIHN0YXRpYyBpbnQgZ2ZzMl9tZXRhX2luaXRfZnNfY29udGV4dChzdHJ1Y3QgZnNfY29udGV4dCAqZmMpXFxuICAqL1xcbiBzdGF0aWMgdm9pZCBnZnMyX2V2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XFxuIFxcdHN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItXFx1MDAzZXNfZnNfaW5mbztcXG4gXFxuIFxcdHNldF9iaXQoU0RGX0VWSUNUSU5HLCBcXHUwMDI2c2RwLVxcdTAwM2VzZF9mbGFncyk7XFxuLVxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFxcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgIW5lZWRfcmVzY2hlZCgpKSB7XFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuLVxcdFxcdH1cXG4tXFx0XFx0X19pZ2V0KGlub2RlKTtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFxuLVxcdFxcdGlwdXQodG9wdXRfaW5vZGUpO1xcbi1cXHRcXHR0b3B1dF9pbm9kZSA9IGlub2RlO1xcbi1cXG4tXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0aXB1dCh0b3B1dF9pbm9kZSk7XFxuK1xcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuY1xcbmluZGV4IGJhN2RhMzliZTRhMzEuLjA3YTVmNDg2NDFhZjggMTAwNjQ0XFxuLS0tIGEvZnMvaW5vZGUuY1xcbisrKyBiL2ZzL2lub2RlLmNcXG5AQCAtNjksNiArNjksMTUgQEAgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlbXB0eV9hb3BzID0ge1xcbiB9O1xcbiBFWFBPUlRfU1lNQk9MKGVtcHR5X2FvcHMpO1xcbiBcXG4rc3RydWN0IGlub2RlX2l0ZXIge1xcbitcXHRzdHJ1Y3QgbGlzdF9oZWFkXFx0aXRlcnNfbm9kZTtcXHQvKiBzYi1cXHUwMDNlc19pbm9kZXNfaXRlcnMgKi9cXG4rXFx0c3RydWN0IGxpc3RfaGVhZFxcdCpuZXh0O1xcdFxcdC8qIG5leHQgbm9kZSBnb2luZyB0byBpdGVyYXRlICovXFxuK1xcdHVuc2lnbmVkIGludCBmbGFncztcXG4rXFx0aW5vZGVfaXRlcl9jYiBmdW5jO1xcbitcXHR2b2lkICpkYXRhO1xcbitcXHRpbnQgcmV0O1xcbit9O1xcbitcXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7XFxuIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBucl91bnVzZWQpO1xcbiBcXG5AQCAtNjQxLDEyICs2NTAsOTYgQEAgdm9pZCBpbm9kZV9zYl9saXN0X2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGlub2RlX3NiX2xpc3RfYWRkKTtcXG4gXFxuK3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxcbitcXHRcXHRcXHRcXHR1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXFxuK3tcXG4rXFx0aXQtXFx1MDAzZWZsYWdzID0gZmxhZ3M7XFxuK1xcdGl0LVxcdTAwM2VmdW5jID0gZm47XFxuK1xcdGl0LVxcdTAwM2VkYXRhID0gZGF0YTtcXG4rXFx0aXQtXFx1MDAzZXJldCA9IDA7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0aXQtXFx1MDAzZW5leHQgPSBzYi1cXHUwMDNlc19pbm9kZXMubmV4dDtcXG4rXFx0bGlzdF9hZGQoXFx1MDAyNml0LVxcdTAwM2VpdGVyc19ub2RlLCBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9lbmQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbit7XFxuK1xcdGxpc3RfZGVsKFxcdTAwMjZpdC1cXHUwMDNlaXRlcnNfbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbit7XFxuK1xcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xcbitcXHRpbnQgcmV0O1xcbitcXG4rXFx0d2hpbGUgKCFpbm9kZSBcXHUwMDI2XFx1MDAyNiBpdC1cXHUwMDNlbmV4dCAhPSBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzKSB7XFxuK1xcdFxcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cXHUwMDNlbmV4dCwgc3RydWN0IGlub2RlLCBpX3NiX2xpc3QpO1xcbitcXHRcXHRpZiAoaXQtXFx1MDAzZWZsYWdzIFxcdTAwMjYgSU5PREVfSVRFUl9VTlVTRUQpIHtcXG4rXFx0XFx0XFx0aWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKSB7XFxuK1xcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuK1xcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRcXHRcXHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XFxuK1xcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0XFx0XFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpdC1cXHUwMDNlbmV4dC1cXHUwMDNlbmV4dDtcXG4rXFx0XFx0XFx0XFx0Y29udGludWU7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fSBlbHNlIHtcXG4rXFx0XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aWYgKChpdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBJTk9ERV9JVEVSX05PUk1BTCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0XFx0ICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkpIHtcXG4rXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRcXHRcXHRpdC1cXHUwMDNlbmV4dCA9IGl0LVxcdTAwM2VuZXh0LVxcdTAwM2VuZXh0O1xcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpdC1cXHUwMDNlbmV4dC1cXHUwMDNlbmV4dDtcXG4rXFx0XFx0cmV0ID0gaXQtXFx1MDAzZWZ1bmMoaW5vZGUsIGl0LVxcdTAwM2VkYXRhKTtcXG4rXFx0XFx0aWYgKHJldCkge1xcbitcXHRcXHRcXHRpdC1cXHUwMDNlcmV0ID0gcmV0O1xcbitcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xcbitcXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuK1xcdFxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gaXQtXFx1MDAzZW5leHQgPT0gXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlcyA/IGZhbHNlIDogdHJ1ZTtcXG4rfVxcbitcXG4raW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuK1xcdFxcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdHN0cnVjdCBpbm9kZV9pdGVyIGl0O1xcbitcXG4rXFx0aW5vZGVfc2JfaXRlcl9zdGFydChzYiwgXFx1MDAyNml0LCBmbGFncywgZm4sIGRhdGEpO1xcbitcXHR3aGlsZSAoaW5vZGVfc2JfaXRlcl9uZXh0KFxcdTAwMjZpdCwgc2IpKVxcbitcXHRcXHQ7XFxuK1xcdGlub2RlX3NiX2l0ZXJfZW5kKFxcdTAwMjZpdCwgc2IpO1xcbitcXG4rXFx0cmV0dXJuIGl0LnJldDtcXG4rfVxcbitFWFBPUlRfU1lNQk9MKHNiX2Zvcl9lYWNoX2lub2Rlcyk7XFxuK1xcbiBzdGF0aWMgaW5saW5lIHZvaWQgaW5vZGVfc2JfbGlzdF9kZWwoc3RydWN0IGlub2RlICppbm9kZSlcXG4ge1xcbiBcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXFx1MDAzZWlfc2I7XFxuK1xcdHN0cnVjdCBpbm9kZV9pdGVyICppdDtcXG4gXFxuIFxcdGlmICghbGlzdF9lbXB0eShcXHUwMDI2aW5vZGUtXFx1MDAzZWlfc2JfbGlzdCkpIHtcXG4gXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRcXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0LCBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzX2l0ZXJzLCBpdGVyc19ub2RlKSB7XFxuK1xcdFxcdFxcdGlmIChpdC1cXHUwMDNlbmV4dCA9PSBcXHUwMDI2aW5vZGUtXFx1MDAzZWlfc2JfbGlzdClcXG4rXFx0XFx0XFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpbm9kZS1cXHUwMDNlaV9zYl9saXN0Lm5leHQ7XFxuK1xcdFxcdH1cXG4gXFx0XFx0bGlzdF9kZWxfaW5pdChcXHUwMDI2aW5vZGUtXFx1MDAzZWlfc2JfbGlzdCk7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiBcXHR9XFxuQEAgLTg2Niw2ICs5NTksMTcgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXFxuIFxcdH1cXG4gfVxcbiBcXG4rc3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxcbit7XFxuK1xcdHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRhdGE7XFxuK1xcbitcXHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XFxuK1xcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0bGlzdF9hZGQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xydSwgZGlzcG9zZSk7XFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbiAvKipcXG4gICogZXZpY3RfaW5vZGVzXFx0LSBldmljdCBhbGwgZXZpY3RhYmxlIGlub2RlcyBmb3IgYSBzdXBlcmJsb2NrXFxuICAqIEBzYjpcXHRcXHRzdXBlcmJsb2NrIHRvIG9wZXJhdGUgb25cXG5AQCAtODc3LDQ0ICs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXFxuICAqL1xcbiB2b2lkIGV2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XFxuIFxcdExJU1RfSEVBRChkaXNwb3NlKTtcXG4rXFx0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUwgfCBJTk9ERV9JVEVSX1VOVVNFRDtcXG4gXFxuLWFnYWluOlxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpXFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0aWYgKGljb3VudF9yZWFkKGlub2RlKSkge1xcbi1cXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcdFxcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkge1xcbi1cXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcbi1cXHRcXHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XFxuLVxcdFxcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XFxuLVxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0bGlzdF9hZGQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xydSwgXFx1MDAyNmRpc3Bvc2UpO1xcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlblxcbi1cXHRcXHQgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYVxcbi1cXHRcXHQgKiBiaXQgc28gd2UgZG9uJ3QgbGl2ZWxvY2suXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdFxcdFxcdGNvbmRfcmVzY2hlZCgpO1xcbi1cXHRcXHRcXHRkaXNwb3NlX2xpc3QoXFx1MDAyNmRpc3Bvc2UpO1xcbi1cXHRcXHRcXHRnb3RvIGFnYWluO1xcbi1cXHRcXHR9XFxuLVxcdH1cXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcbitcXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYiwgXFx1MDAyNmRpc3Bvc2UpO1xcbiBcXHRkaXNwb3NlX2xpc3QoXFx1MDAyNmRpc3Bvc2UpO1xcbiB9XFxuIEVYUE9SVF9TWU1CT0xfR1BMKGV2aWN0X2lub2Rlcyk7XFxuZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL2RxdW90LmMgYi9mcy9xdW90YS9kcXVvdC5jXFxuaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDRcXG4tLS0gYS9mcy9xdW90YS9kcXVvdC5jXFxuKysrIGIvZnMvcXVvdGEvZHF1b3QuY1xcbkBAIC0xMDQzLDY0ICsxMDQzLDQ4IEBAIHN0YXRpYyBpbnQgZHFpbml0X25lZWRlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSlcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqL1xcbi1zdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXFxuK3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXFxuIHtcXG4tXFx0c3RydWN0IGlub2RlICppbm9kZSwgKm9sZF9pbm9kZSA9IE5VTEw7XFxuK1xcdGludCB0eXBlID0gKihpbnQgKilkYXRhO1xcbitcXHRpbnQgZXJyID0gMDtcXG4rXFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVxcdTAwM2VpX3NiO1xcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXFxuIFxcdGludCByZXNlcnZlZCA9IDA7XFxuICNlbmRpZlxcbi1cXHRpbnQgZXJyID0gMDtcXG4gXFxuLVxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdGlmICgoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XFxuLVxcdFxcdCAgICAhYXRvbWljX3JlYWQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX3dyaXRlY291bnQpIHx8XFxuLVxcdFxcdCAgICAhZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRfX2lnZXQoaW5vZGUpO1xcbitcXHRpZiAoIWF0b21pY19yZWFkKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV93cml0ZWNvdW50KSB8fFxcbitcXHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRfX2lnZXQoaW5vZGUpO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiBcXG4gI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVR1xcbi1cXHRcXHRpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgXFx1MDAzZSAwKSlcXG4tXFx0XFx0XFx0cmVzZXJ2ZWQgPSAxO1xcbitcXHRpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgXFx1MDAzZSAwKSlcXG4rXFx0XFx0cmVzZXJ2ZWQgPSAxO1xcbiAjZW5kaWZcXG4tXFx0XFx0aXB1dChvbGRfaW5vZGUpO1xcbi1cXHRcXHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xcbi1cXHRcXHRpZiAoZXJyKSB7XFxuLVxcdFxcdFxcdGlwdXQoaW5vZGUpO1xcbi1cXHRcXHRcXHRnb3RvIG91dDtcXG4tXFx0XFx0fVxcbi1cXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxcbi1cXHRcXHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxcbi1cXHRcXHQgKiBzX2lub2RlX2xpc3RfbG9jay4gV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW4gYmVcXG4tXFx0XFx0ICogaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXFxuLVxcdFxcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcXG4tXFx0XFx0ICogbGF0ZXIuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRvbGRfaW5vZGUgPSBpbm9kZTtcXG4tXFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuLVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0fVxcbi1cXHRzcGluX3VubG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0aXB1dChvbGRfaW5vZGUpO1xcbi1vdXQ6XFxuK1xcdGVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7XFxuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcXG4tXFx0aWYgKHJlc2VydmVkKSB7XFxuLVxcdFxcdHF1b3RhX2Vycm9yKHNiLCBcXFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uIFxcXCJcXG4tXFx0XFx0XFx0XFxcInRodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiBcXFwiXFxuLVxcdFxcdFxcdFxcXCJQbGVhc2UgcnVuIHF1b3RhY2hlY2soOClcXFwiKTtcXG4tXFx0fVxcbitcXHRpZiAocmVzZXJ2ZWQpXFxuK1xcdFxcdHF1b3RhX2Vycm9yKHNiLCBcXFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIFxcXCJcXG4rXFx0XFx0XFx0ICAgIFxcXCJvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5IFxcXCJcXG4rXFx0XFx0XFx0ICAgIFxcXCJpbmNvbnNpc3RlbnQuIFBsZWFzZSBydW4gcXVvdGFjaGVjayg4KVxcXCIpO1xcbiAjZW5kaWZcXG4rXFx0aXB1dChpbm9kZSk7XFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4gXFx0cmV0dXJuIGVycjtcXG4gfVxcbiBcXG4rLyogVGhpcyByb3V0aW5lIGlzIGd1YXJkZWQgYnkgc191bW91bnQgc2VtYXBob3JlICovXFxuK3N0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcXG4re1xcbitcXHRyZXR1cm4gc2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCxcXG4rXFx0XFx0XFx0XFx0ICBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2IsIFxcdTAwMjZ0eXBlKTtcXG4rfVxcbitcXG4gc3RhdGljIHZvaWQgcmVtb3ZlX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcXG4ge1xcbiBcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuY1xcbmluZGV4IDA1ZTQ0MzE3MzAzODcuLjNlMDY5MTUwYzU0NDUgMTAwNjQ0XFxuLS0tIGEvZnMvc3VwZXIuY1xcbisrKyBiL2ZzL3N1cGVyLmNcXG5AQCAtMzgyLDYgKzM4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmFsbG9jX3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBpbnQgZmxhZ3MsXFxuIFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzLVxcdTAwM2VzX3Jvb3RzX2xvY2spO1xcbiBcXHRtdXRleF9pbml0KFxcdTAwMjZzLVxcdTAwM2VzX3N5bmNfbG9jayk7XFxuIFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzLVxcdTAwM2VzX2lub2Rlcyk7XFxuK1xcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzLVxcdTAwM2VzX2lub2Rlc19pdGVycyk7XFxuIFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIFxcdElOSVRfTElTVF9IRUFEKFxcdTAwMjZzLVxcdTAwM2VzX2lub2Rlc193Yik7XFxuIFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzLVxcdTAwM2VzX2lub2RlX3dibGlzdF9sb2NrKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oXFxuaW5kZXggZjlkMWUwNWU4YWU2OC4uZjMxNzZhYjEwZTY1ZiAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmhcXG5AQCAtMjk2LDcgKzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7XFxuICAqL1xcbiAjZGVmaW5lIEZJTEVTWVNURU1fTUFYX1NUQUNLX0RFUFRIIDJcXG4gXFxuLS8qKiBcXG4rLyoqXFxuICAqIGVudW0gcG9zaXRpdmVfYW9wX3JldHVybnMgLSBhb3AgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lmaWMgc2VtYW50aWNzXFxuICAqXFxuICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXNcXG5AQCAtMzA2LDcgKzMwNiw3IEBAIHN0cnVjdCBpYXR0ciB7XFxuICAqIFxcdFxcdFxcdCAgICBiZSBhIGNhbmRpZGF0ZSBmb3Igd3JpdGViYWNrIGFnYWluIGluIHRoZSBuZWFyXFxuICAqIFxcdFxcdFxcdCAgICBmdXR1cmUuICBPdGhlciBjYWxsZXJzIG11c3QgYmUgY2FyZWZ1bCB0byB1bmxvY2tcXG4gICogXFx0XFx0XFx0ICAgIHRoZSBwYWdlIGlmIHRoZXkgZ2V0IHRoaXMgcmV0dXJuLiAgUmV0dXJuZWQgYnlcXG4tICogXFx0XFx0XFx0ICAgIHdyaXRlcGFnZSgpOyBcXG4rICpcXHRcXHRcXHQgICAgd3JpdGVwYWdlKCk7XFxuICAqXFxuICAqIEBBT1BfVFJVTkNBVEVEX1BBR0U6IFRoZSBBT1AgbWV0aG9kIHRoYXQgd2FzIGhhbmRlZCBhIGxvY2tlZCBwYWdlIGhhc1xcbiAgKiAgXFx0XFx0XFx0dW5sb2NrZWQgaXQgYW5kIHRoZSBwYWdlIG1pZ2h0IGhhdmUgYmVlbiB0cnVuY2F0ZWQuXFxuQEAgLTg3MCw2ICs4NzAsMjEgQEAgc3RydWN0IGlub2RlIHtcXG4gXFx0dm9pZFxcdFxcdFxcdCppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi9cXG4gfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XFxuIFxcbitlbnVtIGlub2RlX2l0ZXJfZmxhZ3NfZW51bSB7XFxuK1xcdElOT0RFX0lURVJfTk9STUFMID0gKDFVIFxcdTAwM2NcXHUwMDNjIDEpLCAgLyogRXhjbHVkZSBpbm9kZXMgd2l0aCAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkuICovXFxuK1xcdElOT0RFX0lURVJfVU5VU0VEID0gKDFVIFxcdTAwM2NcXHUwMDNjIDIpLCAgLyogT25seSByZXR1cm4gaW5vZGVzIHdpdGggKGlfY291bnQgPT0gMCkuICovXFxuK307XFxuK1xcbisvKlxcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kXFxuKyAqICBpbm9kZS1cXHUwMDNlaV9sb2NrICAgICAgICAgICAgICBsb2NrZWQgICAgICAgICB1bmxvY2tlZFxcbisgKiAgc2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrICAgICAgbG9ja2VkICAgICAgICAgbG9ja2VkXFxuKyAqL1xcbit0eXBlZGVmIGludCAoKmlub2RlX2l0ZXJfY2IpIChzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTtcXG4rXFxuK2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLFxcbitcXHRcXHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSk7XFxuK1xcbiAvKlxcbiAgKiBpX3N0YXRlIGhhbmRsaW5nXFxuICAqXFxuQEAgLTEzMTUsOCArMTMzMCwxMCBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X2ZpbGVfYWN0aXZlKHN0cnVjdCBmaWxlICoqZik7XFxuIFxcbiAjZGVmaW5lXFx0TUFYX05PTl9MRlNcXHQoKDFVTFxcdTAwM2NcXHUwMDNjMzEpIC0gMSlcXG4gXFxuLS8qIFBhZ2UgY2FjaGUgbGltaXQuIFRoZSBmaWxlc3lzdGVtcyBzaG91bGQgcHV0IHRoYXQgaW50byB0aGVpciBzX21heGJ5dGVzIFxcbi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIFxcbisvKlxcbisgKiBQYWdlIGNhY2hlIGxpbWl0LiBUaGUgZmlsZXN5c3RlbXMgc2hvdWxkIHB1dCB0aGF0IGludG8gdGhlaXIgc19tYXhieXRlc1xcbisgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uXFxuKyAqL1xcbiAjaWYgQklUU19QRVJfTE9ORz09MzJcXG4gI2RlZmluZSBNQVhfTEZTX0ZJTEVTSVpFXFx0KChsb2ZmX3QpVUxPTkdfTUFYIFxcdTAwM2NcXHUwMDNjIFBBR0VfU0hJRlQpXFxuICNlbGlmIEJJVFNfUEVSX0xPTkc9PTY0XFxuQEAgLTIyODUsNyArMjMwMiw3IEBAIGludCBzeW5jX2lub2RlX21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KTtcXG4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUge1xcbiBcXHRjb25zdCBjaGFyICpuYW1lO1xcbiBcXHRpbnQgZnNfZmxhZ3M7XFxuLSNkZWZpbmUgRlNfUkVRVUlSRVNfREVWXFx0XFx0MSBcXG4rI2RlZmluZSBGU19SRVFVSVJFU19ERVZcXHRcXHQxXFxuICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQVxcdDJcXG4gI2RlZmluZSBGU19IQVNfU1VCVFlQRVxcdFxcdDRcXG4gI2RlZmluZSBGU19VU0VSTlNfTU9VTlRcXHRcXHQ4XFx0LyogQ2FuIGJlIG1vdW50ZWQgYnkgdXNlcm5zIHJvb3QgKi9cXG5AQCAtMjkwNyw3ICsyOTI0LDcgQEAgc3NpemVfdCBfX2tlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpO1xcbiBleHRlcm4gc3NpemVfdCBrZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTtcXG4gZXh0ZXJuIHNzaXplX3QgX19rZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTtcXG4gZXh0ZXJuIHN0cnVjdCBmaWxlICogb3Blbl9leGVjKGNvbnN0IGNoYXIgKik7XFxuLSBcXG4rXFxuIC8qIGZzL2RjYWNoZS5jIC0tIGdlbmVyaWMgZnMgc3VwcG9ydCBmdW5jdGlvbnMgKi9cXG4gZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTtcXG4gZXh0ZXJuIGJvb2wgcGF0aF9pc191bmRlcihjb25zdCBzdHJ1Y3QgcGF0aCAqLCBjb25zdCBzdHJ1Y3QgcGF0aCAqKTtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXFxuaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhcXG5AQCAtMjY5LDkgKzI2OSwxMCBAQCBzdHJ1Y3Qgc3VwZXJfYmxvY2sge1xcbiBcXHQgKi9cXG4gXFx0aW50IHNfc3RhY2tfZGVwdGg7XFxuIFxcbi1cXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyAqL1xcbitcXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyBhbmQgc19pbm9kZXNfaXRlcnMgKi9cXG4gXFx0c3BpbmxvY2tfdFxcdFxcdFxcdFxcdHNfaW5vZGVfbGlzdF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7XFxuIFxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRcXHRzX2lub2RlcztcXHQvKiBhbGwgaW5vZGVzICovXFxuK1xcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRcXHRzX2lub2Rlc19pdGVyczsgLyogYWxsIGl0ZXJhdG9ycyAqL1xcbiBcXG4gXFx0c3BpbmxvY2tfdFxcdFxcdFxcdFxcdHNfaW5vZGVfd2JsaXN0X2xvY2s7XFxuIFxcdHN0cnVjdCBsaXN0X2hlYWRcXHRcXHRcXHRzX2lub2Rlc193YjtcXHQvKiB3cml0ZWJhY2sgaW5vZGVzICovXFxuZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmMgYi9zZWN1cml0eS9sYW5kbG9jay9mcy5jXFxuaW5kZXggMzBhYTZjZTEzNTkwYS4uM2RjZGU4Y2JmYjZhZiAxMDA2NDRcXG4tLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jXFxuKysrIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuY1xcbkBAIC0xMzY5LDExMCArMTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KVxcbiBcXG4gLyogU3VwZXItYmxvY2sgaG9va3MgKi9cXG4gXFxuLS8qXFxuLSAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5Llxcbi0gKlxcbi0gKiBDZi4gZnNub3RpZnlfdW5tb3VudF9pbm9kZXMoKSBhbmQgZXZpY3RfaW5vZGVzKClcXG4tICovXFxuLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXFxuK3N0YXRpYyBpbnQgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxcbiB7XFxuLVxcdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpwcmV2X2lub2RlID0gTlVMTDtcXG4rXFx0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xcbitcXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXFx1MDAzZWlfc2I7XFxuIFxcbi1cXHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxcbi1cXHRcXHRyZXR1cm47XFxuK1xcdGlmICghYXRvbWljX3JlYWQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX2NvdW50KSkge1xcbitcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuIFxcbi1cXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuLVxcdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xcbi1cXHRcXHRzdHJ1Y3QgbGFuZGxvY2tfb2JqZWN0ICpvYmplY3Q7XFxuK1xcdHJjdV9yZWFkX2xvY2soKTtcXG4rXFx0b2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cXHUwMDNlb2JqZWN0KTtcXG4rXFx0aWYgKCFvYmplY3QpIHtcXG4rXFx0XFx0cmN1X3JlYWRfdW5sb2NrKCk7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFx0LyogS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhpcyBpbm9kZSB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuICovXFxuK1xcdF9faWdldChpbm9kZSk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gXFxuLVxcdFxcdC8qIE9ubHkgaGFuZGxlcyByZWZlcmVuY2VkIGlub2Rlcy4gKi9cXG4tXFx0XFx0aWYgKCFpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcXG4tXFx0XFx0XFx0Y29udGludWU7XFxuK1xcdC8qXFxuK1xcdCAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2VcXG4rXFx0ICogYXJlIGluIGNoYXJnZSBvZiBjYWxsaW5nIGlwdXQoKSBvbiB0aGlzIGlub2RlLCBvdGhlcndpc2Ugd2VcXG4rXFx0ICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC5cXG4rXFx0ICovXFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2b2JqZWN0LVxcdTAwM2Vsb2NrKTtcXG4rXFx0aWYgKG9iamVjdC1cXHUwMDNldW5kZXJvYmogPT0gaW5vZGUpIHtcXG4rXFx0XFx0b2JqZWN0LVxcdTAwM2V1bmRlcm9iaiA9IE5VTEw7XFxuK1xcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZvYmplY3QtXFx1MDAzZWxvY2spO1xcbitcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4gXFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIFByb3RlY3RzIGFnYWluc3QgY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgaW5vZGUgKGUuZy5cXG4tXFx0XFx0ICogZnJvbSBnZXRfaW5vZGVfb2JqZWN0KCkpLlxcbitcXHRcXHQgKiBCZWNhdXNlIG9iamVjdC1cXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxcbitcXHRcXHQgKiByZWxlYXNlX2lub2RlKCkgYW5kIGdldF9pbm9kZV9vYmplY3QoKSBndWFyYW50ZWVcXG4rXFx0XFx0ICogdGhhdCBpdCBpcyBzYWZlIHRvIHJlc2V0XFxuK1xcdFxcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cXHUwMDNlb2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLlxcbitcXHRcXHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVxcdTAwM2VpX2xvY2suXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbitcXHRcXHRyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVxcdTAwM2VvYmplY3QsIE5VTEwpO1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBDaGVja3MgSV9GUkVFSU5HIGFuZCBJX1dJTExfRlJFRSAgdG8gcHJvdGVjdCBhZ2FpbnN0IGEgcmFjZVxcbi1cXHRcXHQgKiBjb25kaXRpb24gd2hlbiByZWxlYXNlX2lub2RlKCkganVzdCBjYWxsZWQgaXB1dCgpLCB3aGljaFxcbi1cXHRcXHQgKiBjb3VsZCBsZWFkIHRvIGEgTlVMTCBkZXJlZmVyZW5jZSBvZiBpbm9kZS1cXHUwMDNlc2VjdXJpdHkgb3IgYVxcbi1cXHRcXHQgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc29cXG4tXFx0XFx0ICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuXFxuK1xcdFxcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcXG4rXFx0XFx0ICogb3JpZ2luYWxseSBzZXQgdXAgYnkgZ2V0X2lub2RlX29iamVjdCgpIGFuZCB0aGVcXG4rXFx0XFx0ICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wXFxuK1xcdFxcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXFxuK1xcdFxcdCAqIG9uIHRoZSBpbm9kZS5cXG4gXFx0XFx0ICovXFxuLVxcdFxcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2XFxuLVxcdFxcdCAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbi1cXHRcXHRcXHRjb250aW51ZTtcXG4tXFx0XFx0fVxcbitcXHRcXHRpcHV0X25vdF9sYXN0KGlub2RlKTtcXG4rXFx0fSBlbHNlIHtcXG4rXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNm9iamVjdC1cXHUwMDNlbG9jayk7XFxuK1xcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRyY3VfcmVhZF9sb2NrKCk7XFxuLVxcdFxcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXFx1MDAzZW9iamVjdCk7XFxuLVxcdFxcdGlmICghb2JqZWN0KSB7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbi1cXHRcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuLVxcdFxcdFxcdGNvbnRpbnVlO1xcbi1cXHRcXHR9XFxuLVxcdFxcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xcbi1cXHRcXHRfX2lnZXQoaW5vZGUpO1xcbi1cXHRcXHRzcGluX3VubG9jayhcXHUwMDI2aW5vZGUtXFx1MDAzZWlfbG9jayk7XFxuK1xcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbitcXHRpcHV0KGlub2RlKTtcXG4rXFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZVxcbi1cXHRcXHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxcbi1cXHRcXHQgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZvYmplY3QtXFx1MDAzZWxvY2spO1xcbi1cXHRcXHRpZiAob2JqZWN0LVxcdTAwM2V1bmRlcm9iaiA9PSBpbm9kZSkge1xcbi1cXHRcXHRcXHRvYmplY3QtXFx1MDAzZXVuZGVyb2JqID0gTlVMTDtcXG4tXFx0XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNm9iamVjdC1cXHUwMDNlbG9jayk7XFxuLVxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbiBcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQmVjYXVzZSBvYmplY3QtXFx1MDAzZXVuZGVyb2JqIHdhcyBub3QgTlVMTCxcXG4tXFx0XFx0XFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXFxuLVxcdFxcdFxcdCAqIHRoYXQgaXQgaXMgc2FmZSB0byByZXNldFxcbi1cXHRcXHRcXHQgKiBsYW5kbG9ja19pbm9kZShpbm9kZSktXFx1MDAzZW9iamVjdCB3aGlsZSBpdCBpcyBub3QgTlVMTC5cXG4tXFx0XFx0XFx0ICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS1cXHUwMDNlaV9sb2NrLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cXHUwMDNlb2JqZWN0LCBOVUxMKTtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQXQgdGhpcyBwb2ludCwgd2Ugb3duIHRoZSBpaG9sZCgpIHJlZmVyZW5jZSB0aGF0IHdhc1xcbi1cXHRcXHRcXHQgKiBvcmlnaW5hbGx5IHNldCB1cCBieSBnZXRfaW5vZGVfb2JqZWN0KCkgYW5kIHRoZVxcbi1cXHRcXHRcXHQgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3BcXG4tXFx0XFx0XFx0ICogd2Fsay4gIFRoZXJlZm9yZSB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHJlZmVyZW5jZXNcXG4tXFx0XFx0XFx0ICogb24gdGhlIGlub2RlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aXB1dF9ub3RfbGFzdChpbm9kZSk7XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZvYmplY3QtXFx1MDAzZWxvY2spO1xcbi1cXHRcXHRcXHRyY3VfcmVhZF91bmxvY2soKTtcXG4tXFx0XFx0fVxcbisvKlxcbisgKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cXG4rICpcXG4rICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IElOT0RFX0lURVJfTk9STUFMO1xcbiBcXG4tXFx0XFx0aWYgKHByZXZfaW5vZGUpIHtcXG4tXFx0XFx0XFx0LypcXG4tXFx0XFx0XFx0ICogQXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgb3duIHRoZSBfX2lnZXQoKSByZWZlcmVuY2VcXG4tXFx0XFx0XFx0ICogdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3Agd2Fsay4gIFRoZXJlZm9yZSB3ZVxcbi1cXHRcXHRcXHQgKiBjYW4gZHJvcCB0aGUgbGlzdCBsb2NrIGFuZCBrbm93IHRoYXQgdGhlIGlub2RlIHdvbid0XFxuLVxcdFxcdFxcdCAqIGRpc2FwcGVhciBmcm9tIHVuZGVyIHVzIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBXZSBjYW4gbm93IGFjdHVhbGx5IHB1dCB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlXFxuLVxcdFxcdFxcdCAqIHByZXZpb3VzIGxvb3Agd2Fsaywgd2hpY2ggaXMgbm90IG5lZWRlZCBhbnltb3JlLlxcbi1cXHRcXHRcXHQgKi9cXG4tXFx0XFx0XFx0aXB1dChwcmV2X2lub2RlKTtcXG4tXFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuLVxcdFxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRwcmV2X2lub2RlID0gaW5vZGU7XFxuLVxcdH1cXG4tXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuK1xcdGlmICghbGFuZGxvY2tfaW5pdGlhbGl6ZWQpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGhvb2tfc2JfZGVsZXRlX2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xcbiBcXG4tXFx0LyogUHV0cyB0aGUgaW5vZGUgcmVmZXJlbmNlIGZyb20gdGhlIGxhc3QgbG9vcCB3YWxrLCBpZiBhbnkuICovXFxuLVxcdGlmIChwcmV2X2lub2RlKVxcbi1cXHRcXHRpcHV0KHByZXZfaW5vZGUpO1xcbiBcXHQvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqL1xcbiBcXHR3YWl0X3Zhcl9ldmVudChcXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXFx1MDAzZWlub2RlX3JlZnMsXFxuIFxcdFxcdCAgICAgICAhYXRvbWljX2xvbmdfcmVhZChcXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXFx1MDAzZWlub2RlX3JlZnMpKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NDQuNzkzNjg3NTkzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyMjQxMTI2MjU5NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJRVU9UQVwiLFxuICAgIFwiR0ZTMl9GU1wiLFxuICAgIFwiU0VDVVJJVFlfTEFORExPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzYl9mb3JfZWFjaF9pbm9kZXNcIixcbiAgICBcImV2aWN0X2lub2Rlc1wiLFxuICAgIFwic3luY19iZGV2c1wiLFxuICAgIFwiZHJvcF9wYWdlY2FjaGVfc2JcIixcbiAgICBcImFkZF9kcXVvdF9yZWZcIixcbiAgICBcImdmczJfZXZpY3RfaW5vZGVzXCIsXG4gICAgXCJob29rX3NiX2RlbGV0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gZnJhbWV3b3JrIChzYl9mb3JfZWFjaF9pbm9kZXMpIHdpdGggZHluYW1pYyBpdGVyYXRvciBsaXN0IHRyYWNraW5nIChzX2lub2Rlc19pdGVycykgYW5kIHVwZGF0ZXMgdHJhdmVyc2FsIGxvb3BzIGluIFZGUyAoZXZpY3RfaW5vZGVzLCBkcm9wX2NhY2hlcyksIGJsb2NrIGRldmljZXMgKHN5bmNfYmRldnMpLCBxdW90YXMgKGFkZF9kcXVvdF9yZWYpLCBHRlMyIChnZnMyX2V2aWN0X2lub2RlcyksIGFuZCBMYW5kbG9jayAoaG9va19zYl9kZWxldGUpLiBUaGlzIHNpZ25pZmljYW50bHkgYWx0ZXJzIGxvY2tpbmcsIGxpc3QgbXV0YXRpb24gZHVyaW5nIHRyYXZlcnNhbCwgYW5kIHJlZmNvdW50aW5nIGFjcm9zcyBjb3JlIHN1YnN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciByYWNlcywgbGlzdCBjb3JydXB0aW9ucywgb3IgZGVhZGxvY2tzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IGI0NmUzZDk2YzlhMTcxMDcyMGI4M2IzOWU5ZmZhMTI2Zjk4ODBkNjVcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgV2VkIFNlcCA5IDExOjEwOjQxIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYmxvY2svYmRldi5jIGIvYmxvY2svYmRldi5jXG5pbmRleCBjZDgzMjMwODM3NDA2Li5hZTQ3MmEwNjJlNTFjIDEwMDY0NFxuLS0tIGEvYmxvY2svYmRldi5jXG4rKysgYi9ibG9jay9iZGV2LmNcbkBAIC0xMzM2LDU2ICsxMzM2LDUzIEBAIHZvaWQgYmRldl9tYXJrX2RlYWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgYm9vbCBzdXJwcmlzZSlcbiAgKi9cbiBFWFBPUlRfU1lNQk9MX0dQTChiZGV2X21hcmtfZGVhZCk7XG4gXG4tdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbitzdGF0aWMgaW50IHN5bmNfYmRldnNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtXHUwMDNlaV9tYXBwaW5nO1xuLVx0XHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2O1xuK1x0Ym9vbCB3YWl0ID0gKGJvb2wpZGF0YTtcbitcdHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7XG4rXHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbiBcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpIHx8XG4tXHRcdCAgICBtYXBwaW5nLVx1MDAzZW5ycGFnZXMgPT0gMCkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbitcdGlmIChtYXBwaW5nLVx1MDAzZW5ycGFnZXMgPT0gMCkge1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxuK1x0ICogcmVtb3ZlZCBmcm9tIHNfaW5vZGVzIGxpc3Qgd2hpbGUgd2UgZHJvcHBlZCB0aGVcbitcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLlxuK1x0ICovXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0YmRldiA9IElfQkRFVihpbm9kZSk7XG4rXG4rXHRtdXRleF9sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbitcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2YmRldi1cdTAwM2ViZF9vcGVuZXJzKSkge1xuK1x0XHQ7IC8qIHNraXAgKi9cbitcdH0gZWxzZSBpZiAod2FpdCkge1xuIFx0XHQvKlxuLVx0XHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICdpbm9kZScgc28gaXQgY291bGRuJ3QgaGF2ZSBiZWVuXG4tXHRcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrICBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhblxuLVx0XHQgKiBiZSBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXJcbi1cdFx0ICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdFxuLVx0XHQgKiBsYXRlci5cbitcdFx0ICogV2Uga2VlcCB0aGUgZXJyb3Igc3RhdHVzIG9mIGluZGl2aWR1YWwgbWFwcGluZyBzb1xuK1x0XHQgKiB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY2F0Y2ggdGhlIHdyaXRlYmFjayBlcnJvciB1c2luZ1xuK1x0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4rXHRcdCAqIGRldGFpbHMuXG4gXHRcdCAqL1xuLVx0XHRpcHV0KG9sZF9pbm9kZSk7XG4tXHRcdG9sZF9pbm9kZSA9IGlub2RlO1xuLVx0XHRiZGV2ID0gSV9CREVWKGlub2RlKTtcbi1cbi1cdFx0bXV0ZXhfbG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4tXHRcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2YmRldi1cdTAwM2ViZF9vcGVuZXJzKSkge1xuLVx0XHRcdDsgLyogc2tpcCAqL1xuLVx0XHR9IGVsc2UgaWYgKHdhaXQpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc29cbi1cdFx0XHQgKiB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gY2F0Y2ggdGhlIHdyaXRlYmFjayBlcnJvciB1c2luZ1xuLVx0XHRcdCAqIGZzeW5jKDIpLiBTZWUgZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoKSBmb3Jcbi1cdFx0XHQgKiBkZXRhaWxzLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0ZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4tXHRcdH1cbi1cdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmJkZXYtXHUwMDNlYmRfZGlzay1cdTAwM2VvcGVuX211dGV4KTtcbi1cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuK1x0fSBlbHNlIHtcbitcdFx0ZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGlwdXQob2xkX2lub2RlKTtcbitcdG11dGV4X3VubG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4rXHRpcHV0KGlub2RlKTtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbit2b2lkIHN5bmNfYmRldnMoYm9vbCB3YWl0KVxuK3tcbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhibG9ja2Rldl9zdXBlcmJsb2NrLCBJTk9ERV9JVEVSX05PUk1BTCxcbitcdFx0XHQgICBzeW5jX2JkZXZzX2lub2RlX2l0ZXJfY2IsICh2b2lkICopd2FpdCk7XG4gfVxuIFxuIC8qXG5kaWZmIC0tZ2l0IGEvZnMvZHJvcF9jYWNoZXMuYyBiL2ZzL2Ryb3BfY2FjaGVzLmNcbmluZGV4IDQ5ZjU2YTU5OGVjYmMuLjBkNDc1YTVmZjhjZmIgMTAwNjQ0XG4tLS0gYS9mcy9kcm9wX2NhY2hlcy5jXG4rKysgYi9mcy9kcm9wX2NhY2hlcy5jXG5AQCAtMTYsMzYgKzE2LDMwIEBAXG4gLyogQSBnbG9iYWwgdmFyaWFibGUgaXMgYSBiaXQgdWdseSwgYnV0IGl0IGtlZXBzIHRoZSBjb2RlIHNpbXBsZSAqL1xuIHN0YXRpYyBpbnQgc3lzY3RsX2Ryb3BfY2FjaGVzO1xuIFxuLXN0YXRpYyB2b2lkIGRyb3BfcGFnZWNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnVudXNlZClcbitzdGF0aWMgaW50IGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqdW51c2VkKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XG4rXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHQvKlxuLVx0XHQgKiBXZSBtdXN0IHNraXAgaW5vZGVzIGluIHVudXN1YWwgc3RhdGUuIFdlIG1heSBhbHNvIHNraXBcbi1cdFx0ICogaW5vZGVzIHdpdGhvdXQgcGFnZXMgYnV0IHdlIGRlbGliZXJhdGVseSB3b24ndCBpbiBjYXNlXG4tXHRcdCAqIHdlIG5lZWQgdG8gcmVzY2hlZHVsZSB0byBhdm9pZCBzb2Z0bG9ja3Vwcy5cbi1cdFx0ICovXG4tXHRcdGlmICgoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgfHxcbi1cdFx0ICAgIChtYXBwaW5nX2VtcHR5KGlub2RlLVx1MDAzZWlfbWFwcGluZykgXHUwMDI2XHUwMDI2ICFuZWVkX3Jlc2NoZWQoKSkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdF9faWdldChpbm9kZSk7XG4rXHRpZiAobWFwcGluZ19lbXB0eShpbm9kZS1cdTAwM2VpX21hcHBpbmcpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbi1cdFx0aW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKGlub2RlLVx1MDAzZWlfbWFwcGluZywgMCwgLTEpO1xuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuIFx0fVxuK1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KHRvcHV0X2lub2RlKTtcbitcbitcdGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS1cdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcbitcdGlwdXQoaW5vZGUpO1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXG4re1xuK1x0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBJTk9ERV9JVEVSX05PUk1BTCwgZHJvcF9wYWdlY2FjaGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgZHJvcF9jYWNoZXNfc3lzY3RsX2hhbmRsZXIoY29uc3Qgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSxcbmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19mc3R5cGUuYyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG5pbmRleCA3MThlMGRhN2RmY2UwLi5hY2RiZjljYTQ0YTNmIDEwMDY0NFxuLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmNcbisrKyBiL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG5AQCAtOTk2LDcgKzk5Niw3IEBAIHN0YXRpYyBpbnQgZ2ZzMl9sbV9tb3VudChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgaW50IHNpbGVudClcbiBcdFx0c3dpdGNoICh0b2tlbikge1xuIFx0XHRjYXNlIE9wdF9qaWQ6XG4gXHRcdFx0cmV0ID0gbWF0Y2hfaW50KFx1MDAyNnRtcFswXSwgXHUwMDI2b3B0aW9uKTtcbi1cdFx0XHRpZiAocmV0IHx8IG9wdGlvbiBcdTAwM2MgMCkgXG4rXHRcdFx0aWYgKHJldCB8fCBvcHRpb24gXHUwMDNjIDApXG4gXHRcdFx0XHRnb3RvIGhvc3RkYXRhX2Vycm9yO1xuIFx0XHRcdGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU0RGX05PSk9VUk5BTElELCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpKVxuIFx0XHRcdFx0bHMtXHUwMDNlbHNfamlkID0gb3B0aW9uO1xuQEAgLTE3MTksNiArMTcxOSwxOSBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuK3N0YXRpYyBpbnQgZ2ZzMl9ldmljdF9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnVudXNlZClcbit7XG4rXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbitcbitcdF9faWdldChpbm9kZSk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1xuK1x0aXB1dChpbm9kZSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIC8qKlxuICAqIGdmczJfZXZpY3RfaW5vZGVzIC0gZXZpY3QgaW5vZGVzIGNvb3BlcmF0aXZlbHlcbiAgKiBAc2I6IHRoZSBzdXBlcmJsb2NrXG5AQCAtMTc0MSwzMSArMTc1NCwxMCBAQCBzdGF0aWMgaW50IGdmczJfbWV0YV9pbml0X2ZzX2NvbnRleHQoc3RydWN0IGZzX2NvbnRleHQgKmZjKVxuICAqL1xuIHN0YXRpYyB2b2lkIGdmczJfZXZpY3RfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnRvcHV0X2lub2RlID0gTlVMTDtcbiBcdHN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItXHUwMDNlc19mc19pbmZvO1xuIFxuIFx0c2V0X2JpdChTREZfRVZJQ1RJTkcsIFx1MDAyNnNkcC1cdTAwM2VzZF9mbGFncyk7XG4tXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSBcdTAwMjZcdTAwMjZcbi1cdFx0ICAgICFuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuLVx0XHRpcHV0KHRvcHV0X2lub2RlKTtcbi1cdFx0dG9wdXRfaW5vZGUgPSBpbm9kZTtcbi1cbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KHRvcHV0X2lub2RlKTtcbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGdmczJfa2lsbF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jXG5pbmRleCBiYTdkYTM5YmU0YTMxLi4wN2E1ZjQ4NjQxYWY4IDEwMDY0NFxuLS0tIGEvZnMvaW5vZGUuY1xuKysrIGIvZnMvaW5vZGUuY1xuQEAgLTY5LDYgKzY5LDE1IEBAIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZW1wdHlfYW9wcyA9IHtcbiB9O1xuIEVYUE9SVF9TWU1CT0woZW1wdHlfYW9wcyk7XG4gXG4rc3RydWN0IGlub2RlX2l0ZXIge1xuK1x0c3RydWN0IGxpc3RfaGVhZFx0aXRlcnNfbm9kZTtcdC8qIHNiLVx1MDAzZXNfaW5vZGVzX2l0ZXJzICovXG4rXHRzdHJ1Y3QgbGlzdF9oZWFkXHQqbmV4dDtcdFx0LyogbmV4dCBub2RlIGdvaW5nIHRvIGl0ZXJhdGUgKi9cbitcdHVuc2lnbmVkIGludCBmbGFncztcbitcdGlub2RlX2l0ZXJfY2IgZnVuYztcbitcdHZvaWQgKmRhdGE7XG4rXHRpbnQgcmV0O1xuK307XG4rXG4gc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX2lub2Rlcyk7XG4gc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG5yX3VudXNlZCk7XG4gXG5AQCAtNjQxLDEyICs2NTAsOTYgQEAgdm9pZCBpbm9kZV9zYl9saXN0X2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChpbm9kZV9zYl9saXN0X2FkZCk7XG4gXG4rc3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9zdGFydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGVfaXRlciAqaXQsXG4rXHRcdFx0XHR1bnNpZ25lZCBpbnQgZmxhZ3MsIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXG4re1xuK1x0aXQtXHUwMDNlZmxhZ3MgPSBmbGFncztcbitcdGl0LVx1MDAzZWZ1bmMgPSBmbjtcbitcdGl0LVx1MDAzZWRhdGEgPSBkYXRhO1xuK1x0aXQtXHUwMDNlcmV0ID0gMDtcbitcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRpdC1cdTAwM2VuZXh0ID0gc2ItXHUwMDNlc19pbm9kZXMubmV4dDtcbitcdGxpc3RfYWRkKFx1MDAyNml0LVx1MDAzZWl0ZXJzX25vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9lbmQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3tcbitcdGxpc3RfZGVsKFx1MDAyNml0LVx1MDAzZWl0ZXJzX25vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK31cbitcbitzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuK3tcbitcdHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMO1xuK1x0aW50IHJldDtcbitcbitcdHdoaWxlICghaW5vZGUgXHUwMDI2XHUwMDI2IGl0LVx1MDAzZW5leHQgIT0gXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMpIHtcbitcdFx0aW5vZGUgPSBsaXN0X2VudHJ5KGl0LVx1MDAzZW5leHQsIHN0cnVjdCBpbm9kZSwgaV9zYl9saXN0KTtcbitcdFx0aWYgKGl0LVx1MDAzZWZsYWdzIFx1MDAyNiBJTk9ERV9JVEVSX1VOVVNFRCkge1xuK1x0XHRcdGlmIChpY291bnRfcmVhZF9vbmNlKGlub2RlKSkge1xuK1x0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcbitcdFx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0XHRpZiAoaWNvdW50X3JlYWQoaW5vZGUpKSB7XG4rXHRcdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbitcdFx0XHRcdGNvbnRpbnVlO1xuK1x0XHRcdH1cbitcdFx0fSBlbHNlIHtcbitcdFx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0fVxuK1xuK1x0XHRpZiAoKGl0LVx1MDAzZWZsYWdzIFx1MDAyNiBJTk9ERV9JVEVSX05PUk1BTCkgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkpIHtcbitcdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdFx0Y29udGludWU7XG4rXHRcdH1cbitcbitcdFx0aXQtXHUwMDNlbmV4dCA9IGl0LVx1MDAzZW5leHQtXHUwMDNlbmV4dDtcbitcdFx0cmV0ID0gaXQtXHUwMDNlZnVuYyhpbm9kZSwgaXQtXHUwMDNlZGF0YSk7XG4rXHRcdGlmIChyZXQpIHtcbitcdFx0XHRpdC1cdTAwM2VyZXQgPSByZXQ7XG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0XHR9XG4rXG4rXHRcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xuK1x0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0XHRjb25kX3Jlc2NoZWQoKTtcbitcdFx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRyZXR1cm4gaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcyA/IGZhbHNlIDogdHJ1ZTtcbit9XG4rXG4raW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4rXHRcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxuK3tcbitcdHN0cnVjdCBpbm9kZV9pdGVyIGl0O1xuK1xuK1x0aW5vZGVfc2JfaXRlcl9zdGFydChzYiwgXHUwMDI2aXQsIGZsYWdzLCBmbiwgZGF0YSk7XG4rXHR3aGlsZSAoaW5vZGVfc2JfaXRlcl9uZXh0KFx1MDAyNml0LCBzYikpXG4rXHRcdDtcbitcdGlub2RlX3NiX2l0ZXJfZW5kKFx1MDAyNml0LCBzYik7XG4rXG4rXHRyZXR1cm4gaXQucmV0O1xuK31cbitFWFBPUlRfU1lNQk9MKHNiX2Zvcl9lYWNoX2lub2Rlcyk7XG4rXG4gc3RhdGljIGlubGluZSB2b2lkIGlub2RlX3NiX2xpc3RfZGVsKHN0cnVjdCBpbm9kZSAqaW5vZGUpXG4ge1xuIFx0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4rXHRzdHJ1Y3QgaW5vZGVfaXRlciAqaXQ7XG4gXG4gXHRpZiAoIWxpc3RfZW1wdHkoXHUwMDI2aW5vZGUtXHUwMDNlaV9zYl9saXN0KSkge1xuIFx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0LCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycywgaXRlcnNfbm9kZSkge1xuK1x0XHRcdGlmIChpdC1cdTAwM2VuZXh0ID09IFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdClcbitcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpbm9kZS1cdTAwM2VpX3NiX2xpc3QubmV4dDtcbitcdFx0fVxuIFx0XHRsaXN0X2RlbF9pbml0KFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdCk7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcdH1cbkBAIC04NjYsNiArOTU5LDE3IEBAIHN0YXRpYyB2b2lkIGRpc3Bvc2VfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKVxuIFx0fVxuIH1cbiBcbitzdGF0aWMgaW50IGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG4re1xuK1x0c3RydWN0IGxpc3RfaGVhZCAqZGlzcG9zZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopZGF0YTtcbitcbitcdGlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTtcbitcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9scnUsIGRpc3Bvc2UpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIC8qKlxuICAqIGV2aWN0X2lub2Rlc1x0LSBldmljdCBhbGwgZXZpY3RhYmxlIGlub2RlcyBmb3IgYSBzdXBlcmJsb2NrXG4gICogQHNiOlx0XHRzdXBlcmJsb2NrIHRvIG9wZXJhdGUgb25cbkBAIC04NzcsNDQgKzk4MSwxMCBAQCBzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZClcbiAgKi9cbiB2b2lkIGV2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRMSVNUX0hFQUQoZGlzcG9zZSk7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJTk9ERV9JVEVSX05PUk1BTCB8IElOT0RFX0lURVJfVU5VU0VEO1xuIFxuLWFnYWluOlxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0aWYgKGljb3VudF9yZWFkX29uY2UoaW5vZGUpKVxuLVx0XHRcdGNvbnRpbnVlO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKGljb3VudF9yZWFkKGlub2RlKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0aWYgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXG4tXHRcdGlub2RlX3N0YXRlX3NldChpbm9kZSwgSV9GUkVFSU5HKTtcbi1cdFx0aW5vZGVfbHJ1X2xpc3RfZGVsKGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0bGlzdF9hZGQoXHUwMDI2aW5vZGUtXHUwMDNlaV9scnUsIFx1MDAyNmRpc3Bvc2UpO1xuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSBjYW4gaGF2ZSBhIHRvbiBvZiBpbm9kZXMgdG8gZXZpY3QgYXQgdW5tb3VudCB0aW1lIGdpdmVuXG4tXHRcdCAqIGVub3VnaCBtZW1vcnksIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGdvIHRvIHNsZWVwIGZvciBhXG4tXHRcdCAqIGJpdCBzbyB3ZSBkb24ndCBsaXZlbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChuZWVkX3Jlc2NoZWQoKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0XHRkaXNwb3NlX2xpc3QoXHUwMDI2ZGlzcG9zZSk7XG4tXHRcdFx0Z290byBhZ2Fpbjtcbi1cdFx0fVxuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVxuK1x0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgZXZpY3RfaW5vZGVzX2lub2RlX2l0ZXJfY2IsIFx1MDAyNmRpc3Bvc2UpO1xuIFx0ZGlzcG9zZV9saXN0KFx1MDAyNmRpc3Bvc2UpO1xuIH1cbiBFWFBPUlRfU1lNQk9MX0dQTChldmljdF9pbm9kZXMpO1xuZGlmZiAtLWdpdCBhL2ZzL3F1b3RhL2RxdW90LmMgYi9mcy9xdW90YS9kcXVvdC5jXG5pbmRleCAyMDRhZmM1ZTk4NGJjLi43N2M2ODE0OWQ0YWU0IDEwMDY0NFxuLS0tIGEvZnMvcXVvdGEvZHF1b3QuY1xuKysrIGIvZnMvcXVvdGEvZHF1b3QuY1xuQEAgLTEwNDMsNjQgKzEwNDMsNDggQEAgc3RhdGljIGludCBkcWluaXRfbmVlZGVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLS8qIFRoaXMgcm91dGluZSBpcyBndWFyZGVkIGJ5IHNfdW1vdW50IHNlbWFwaG9yZSAqL1xuLXN0YXRpYyBpbnQgYWRkX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSlcbitzdGF0aWMgaW50IGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpvbGRfaW5vZGUgPSBOVUxMO1xuK1x0aW50IHR5cGUgPSAqKGludCAqKWRhdGE7XG4rXHRpbnQgZXJyID0gMDtcbitcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbiBcdGludCByZXNlcnZlZCA9IDA7XG4gI2VuZGlmXG4tXHRpbnQgZXJyID0gMDtcbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XG4tXHRcdCAgICAhYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuLVx0XHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRfX2lnZXQoaW5vZGUpO1xuK1x0aWYgKCFhdG9taWNfcmVhZChcdTAwMjZpbm9kZS1cdTAwM2VpX3dyaXRlY291bnQpIHx8XG4rXHQgICAgIWRxaW5pdF9uZWVkZWQoaW5vZGUsIHR5cGUpKSB7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXG4tXHRcdGlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSBcdTAwM2UgMCkpXG4tXHRcdFx0cmVzZXJ2ZWQgPSAxO1xuK1x0aWYgKHVubGlrZWx5KGlub2RlX2dldF9yc3Zfc3BhY2UoaW5vZGUpIFx1MDAzZSAwKSlcbitcdFx0cmVzZXJ2ZWQgPSAxO1xuICNlbmRpZlxuLVx0XHRpcHV0KG9sZF9pbm9kZSk7XG4tXHRcdGVyciA9IF9fZHF1b3RfaW5pdGlhbGl6ZShpbm9kZSwgdHlwZSk7XG4tXHRcdGlmIChlcnIpIHtcbi1cdFx0XHRpcHV0KGlub2RlKTtcbi1cdFx0XHRnb3RvIG91dDtcbi1cdFx0fVxuLVxuLVx0XHQvKlxuLVx0XHQgKiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvICdpbm9kZScgc28gaXQgY291bGRuJ3QgaGF2ZSBiZWVuXG4tXHRcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBXZSBjYW5ub3QgaXB1dCB0aGUgaW5vZGUgbm93IGFzIHdlIGNhbiBiZVxuLVx0XHQgKiBob2xkaW5nIHRoZSBsYXN0IHJlZmVyZW5jZSBhbmQgd2UgY2Fubm90IGlwdXQgaXQgdW5kZXJcbi1cdFx0ICogc19pbm9kZV9saXN0X2xvY2suIFNvIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBhbmQgaXB1dCBpdFxuLVx0XHQgKiBsYXRlci5cbi1cdFx0ICovXG4tXHRcdG9sZF9pbm9kZSA9IGlub2RlO1xuLVx0XHRjb25kX3Jlc2NoZWQoKTtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGlwdXQob2xkX2lub2RlKTtcbi1vdXQ6XG4rXHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xuICNpZmRlZiBDT05GSUdfUVVPVEFfREVCVUdcbi1cdGlmIChyZXNlcnZlZCkge1xuLVx0XHRxdW90YV9lcnJvcihzYiwgXCJXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgb24gXCJcbi1cdFx0XHRcInRodXMgcXVvdGEgaW5mb3JtYXRpb24gaXMgcHJvYmFibHkgaW5jb25zaXN0ZW50LiBcIlxuLVx0XHRcdFwiUGxlYXNlIHJ1biBxdW90YWNoZWNrKDgpXCIpO1xuLVx0fVxuK1x0aWYgKHJlc2VydmVkKVxuK1x0XHRxdW90YV9lcnJvcihzYiwgXCJXcml0ZXMgaGFwcGVuZWQgYmVmb3JlIHF1b3RhIHdhcyB0dXJuZWQgXCJcbitcdFx0XHQgICAgXCJvbiB0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5IFwiXG4rXHRcdFx0ICAgIFwiaW5jb25zaXN0ZW50LiBQbGVhc2UgcnVuIHF1b3RhY2hlY2soOClcIik7XG4gI2VuZGlmXG4rXHRpcHV0KGlub2RlKTtcbitcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXHRyZXR1cm4gZXJyO1xuIH1cbiBcbisvKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBzX3Vtb3VudCBzZW1hcGhvcmUgKi9cbitzdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4re1xuK1x0cmV0dXJuIHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsXG4rXHRcdFx0XHQgIGFkZF9kcXVvdF9yZWZfaW5vZGVfaXRlcl9jYiwgXHUwMDI2dHlwZSk7XG4rfVxuK1xuIHN0YXRpYyB2b2lkIHJlbW92ZV9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4ge1xuIFx0c3RydWN0IGlub2RlICppbm9kZTtcbmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuY1xuaW5kZXggMDVlNDQzMTczMDM4Ny4uM2UwNjkxNTBjNTQ0NSAxMDA2NDRcbi0tLSBhL2ZzL3N1cGVyLmNcbisrKyBiL2ZzL3N1cGVyLmNcbkBAIC0zODIsNiArMzgyLDcgQEAgc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWxsb2Nfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsIGludCBmbGFncyxcbiBcdHNwaW5fbG9ja19pbml0KFx1MDAyNnMtXHUwMDNlc19yb290c19sb2NrKTtcbiBcdG11dGV4X2luaXQoXHUwMDI2cy1cdTAwM2VzX3N5bmNfbG9jayk7XG4gXHRJTklUX0xJU1RfSEVBRChcdTAwMjZzLVx1MDAzZXNfaW5vZGVzKTtcbitcdElOSVRfTElTVF9IRUFEKFx1MDAyNnMtXHUwMDNlc19pbm9kZXNfaXRlcnMpO1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2cy1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXHRJTklUX0xJU1RfSEVBRChcdTAwMjZzLVx1MDAzZXNfaW5vZGVzX3diKTtcbiBcdHNwaW5fbG9ja19pbml0KFx1MDAyNnMtXHUwMDNlc19pbm9kZV93Ymxpc3RfbG9jayk7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oXG5pbmRleCBmOWQxZTA1ZThhZTY4Li5mMzE3NmFiMTBlNjVmIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmhcbkBAIC0yOTYsNyArMjk2LDcgQEAgc3RydWN0IGlhdHRyIHtcbiAgKi9cbiAjZGVmaW5lIEZJTEVTWVNURU1fTUFYX1NUQUNLX0RFUFRIIDJcbiBcbi0vKiogXG4rLyoqXG4gICogZW51bSBwb3NpdGl2ZV9hb3BfcmV0dXJucyAtIGFvcCByZXR1cm4gY29kZXMgd2l0aCBzcGVjaWZpYyBzZW1hbnRpY3NcbiAgKlxuICAqIEBBT1BfV1JJVEVQQUdFX0FDVElWQVRFOiBJbmZvcm1zIHRoZSBjYWxsZXIgdGhhdCBwYWdlIHdyaXRlYmFjayBoYXNcbkBAIC0zMDYsNyArMzA2LDcgQEAgc3RydWN0IGlhdHRyIHtcbiAgKiBcdFx0XHQgICAgYmUgYSBjYW5kaWRhdGUgZm9yIHdyaXRlYmFjayBhZ2FpbiBpbiB0aGUgbmVhclxuICAqIFx0XHRcdCAgICBmdXR1cmUuICBPdGhlciBjYWxsZXJzIG11c3QgYmUgY2FyZWZ1bCB0byB1bmxvY2tcbiAgKiBcdFx0XHQgICAgdGhlIHBhZ2UgaWYgdGhleSBnZXQgdGhpcyByZXR1cm4uICBSZXR1cm5lZCBieVxuLSAqIFx0XHRcdCAgICB3cml0ZXBhZ2UoKTsgXG4rICpcdFx0XHQgICAgd3JpdGVwYWdlKCk7XG4gICpcbiAgKiBAQU9QX1RSVU5DQVRFRF9QQUdFOiBUaGUgQU9QIG1ldGhvZCB0aGF0IHdhcyBoYW5kZWQgYSBsb2NrZWQgcGFnZSBoYXNcbiAgKiAgXHRcdFx0dW5sb2NrZWQgaXQgYW5kIHRoZSBwYWdlIG1pZ2h0IGhhdmUgYmVlbiB0cnVuY2F0ZWQuXG5AQCAtODcwLDYgKzg3MCwyMSBAQCBzdHJ1Y3QgaW5vZGUge1xuIFx0dm9pZFx0XHRcdCppX3ByaXZhdGU7IC8qIGZzIG9yIGRldmljZSBwcml2YXRlIHBvaW50ZXIgKi9cbiB9IF9fcmFuZG9taXplX2xheW91dDtcbiBcbitlbnVtIGlub2RlX2l0ZXJfZmxhZ3NfZW51bSB7XG4rXHRJTk9ERV9JVEVSX05PUk1BTCA9ICgxVSBcdTAwM2NcdTAwM2MgMSksICAvKiBFeGNsdWRlIGlub2RlcyB3aXRoIChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKS4gKi9cbitcdElOT0RFX0lURVJfVU5VU0VEID0gKDFVIFx1MDAzY1x1MDAzYyAyKSwgIC8qIE9ubHkgcmV0dXJuIGlub2RlcyB3aXRoIChpX2NvdW50ID09IDApLiAqL1xuK307XG4rXG4rLypcbisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgICAgICAgICAgZW5kXG4rICogIGlub2RlLVx1MDAzZWlfbG9jayAgICAgICAgICAgICAgbG9ja2VkICAgICAgICAgdW5sb2NrZWRcbisgKiAgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2sgICAgICBsb2NrZWQgICAgICAgICBsb2NrZWRcbisgKi9cbit0eXBlZGVmIGludCAoKmlub2RlX2l0ZXJfY2IpIChzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTtcbitcbitpbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcbitcdFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpO1xuK1xuIC8qXG4gICogaV9zdGF0ZSBoYW5kbGluZ1xuICAqXG5AQCAtMTMxNSw4ICsxMzMwLDEwIEBAIHN0cnVjdCBmaWxlICpnZXRfZmlsZV9hY3RpdmUoc3RydWN0IGZpbGUgKipmKTtcbiBcbiAjZGVmaW5lXHRNQVhfTk9OX0xGU1x0KCgxVUxcdTAwM2NcdTAwM2MzMSkgLSAxKVxuIFxuLS8qIFBhZ2UgY2FjaGUgbGltaXQuIFRoZSBmaWxlc3lzdGVtcyBzaG91bGQgcHV0IHRoYXQgaW50byB0aGVpciBzX21heGJ5dGVzIFxuLSAgIGxpbWl0cywgb3RoZXJ3aXNlIGJhZCB0aGluZ3MgY2FuIGhhcHBlbiBpbiBWTS4gKi8gXG4rLypcbisgKiBQYWdlIGNhY2hlIGxpbWl0LiBUaGUgZmlsZXN5c3RlbXMgc2hvdWxkIHB1dCB0aGF0IGludG8gdGhlaXIgc19tYXhieXRlc1xuKyAqIGxpbWl0cywgb3RoZXJ3aXNlIGJhZCB0aGluZ3MgY2FuIGhhcHBlbiBpbiBWTS5cbisgKi9cbiAjaWYgQklUU19QRVJfTE9ORz09MzJcbiAjZGVmaW5lIE1BWF9MRlNfRklMRVNJWkVcdCgobG9mZl90KVVMT05HX01BWCBcdTAwM2NcdTAwM2MgUEFHRV9TSElGVClcbiAjZWxpZiBCSVRTX1BFUl9MT05HPT02NFxuQEAgLTIyODUsNyArMjMwMiw3IEBAIGludCBzeW5jX2lub2RlX21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KTtcbiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB7XG4gXHRjb25zdCBjaGFyICpuYW1lO1xuIFx0aW50IGZzX2ZsYWdzO1xuLSNkZWZpbmUgRlNfUkVRVUlSRVNfREVWXHRcdDEgXG4rI2RlZmluZSBGU19SRVFVSVJFU19ERVZcdFx0MVxuICNkZWZpbmUgRlNfQklOQVJZX01PVU5UREFUQVx0MlxuICNkZWZpbmUgRlNfSEFTX1NVQlRZUEVcdFx0NFxuICNkZWZpbmUgRlNfVVNFUk5TX01PVU5UXHRcdDhcdC8qIENhbiBiZSBtb3VudGVkIGJ5IHVzZXJucyByb290ICovXG5AQCAtMjkwNyw3ICsyOTI0LDcgQEAgc3NpemVfdCBfX2tlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpO1xuIGV4dGVybiBzc2l6ZV90IGtlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopO1xuIGV4dGVybiBzc2l6ZV90IF9fa2VybmVsX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LCBsb2ZmX3QgKik7XG4gZXh0ZXJuIHN0cnVjdCBmaWxlICogb3Blbl9leGVjKGNvbnN0IGNoYXIgKik7XG4tIFxuK1xuIC8qIGZzL2RjYWNoZS5jIC0tIGdlbmVyaWMgZnMgc3VwcG9ydCBmdW5jdGlvbnMgKi9cbiBleHRlcm4gYm9vbCBpc19zdWJkaXIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgZGVudHJ5ICopO1xuIGV4dGVybiBib29sIHBhdGhfaXNfdW5kZXIoY29uc3Qgc3RydWN0IHBhdGggKiwgY29uc3Qgc3RydWN0IHBhdGggKik7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG5pbmRleCBlY2Q5NmFlYjFjZWU3Li4xZjgxY2MyMTliOGVlIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhcbkBAIC0yNjksOSArMjY5LDEwIEBAIHN0cnVjdCBzdXBlcl9ibG9jayB7XG4gXHQgKi9cbiBcdGludCBzX3N0YWNrX2RlcHRoO1xuIFxuLVx0Lyogc19pbm9kZV9saXN0X2xvY2sgcHJvdGVjdHMgc19pbm9kZXMgKi9cbitcdC8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzIGFuZCBzX2lub2Rlc19pdGVycyAqL1xuIFx0c3BpbmxvY2tfdFx0XHRcdFx0c19pbm9kZV9saXN0X2xvY2sgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDtcbiBcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2RlcztcdC8qIGFsbCBpbm9kZXMgKi9cbitcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2Rlc19pdGVyczsgLyogYWxsIGl0ZXJhdG9ycyAqL1xuIFxuIFx0c3BpbmxvY2tfdFx0XHRcdFx0c19pbm9kZV93Ymxpc3RfbG9jaztcbiBcdHN0cnVjdCBsaXN0X2hlYWRcdFx0XHRzX2lub2Rlc193YjtcdC8qIHdyaXRlYmFjayBpbm9kZXMgKi9cbmRpZmYgLS1naXQgYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jIGIvc2VjdXJpdHkvbGFuZGxvY2svZnMuY1xuaW5kZXggMzBhYTZjZTEzNTkwYS4uM2RjZGU4Y2JmYjZhZiAxMDA2NDRcbi0tLSBhL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbisrKyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbkBAIC0xMzY5LDExMCArMTM2OSw4MCBAQCBzdGF0aWMgdm9pZCBob29rX2lub2RlX2ZyZWVfc2VjdXJpdHlfcmN1KHZvaWQgKmlub2RlX3NlY3VyaXR5KVxuIFxuIC8qIFN1cGVyLWJsb2NrIGhvb2tzICovXG4gXG4tLypcbi0gKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cbi0gKlxuLSAqIENmLiBmc25vdGlmeV91bm1vdW50X2lub2RlcygpIGFuZCBldmljdF9pbm9kZXMoKVxuLSAqL1xuLXN0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXG4rc3RhdGljIGludCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpXG4ge1xuLVx0c3RydWN0IGlub2RlICppbm9kZSwgKnByZXZfaW5vZGUgPSBOVUxMO1xuK1x0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xuK1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gXG4tXHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxuLVx0XHRyZXR1cm47XG4rXHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmlub2RlLVx1MDAzZWlfY291bnQpKSB7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuIFxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0c3RydWN0IGxhbmRsb2NrX29iamVjdCAqb2JqZWN0O1xuK1x0cmN1X3JlYWRfbG9jaygpO1xuK1x0b2JqZWN0ID0gcmN1X2RlcmVmZXJlbmNlKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3QpO1xuK1x0aWYgKCFvYmplY3QpIHtcbitcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1x0LyogS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhpcyBpbm9kZSB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuICovXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbiBcbi1cdFx0LyogT25seSBoYW5kbGVzIHJlZmVyZW5jZWQgaW5vZGVzLiAqL1xuLVx0XHRpZiAoIWljb3VudF9yZWFkX29uY2UoaW5vZGUpKVxuLVx0XHRcdGNvbnRpbnVlO1xuK1x0LypcbitcdCAqIElmIHRoZXJlIGlzIG5vIGNvbmN1cnJlbnQgcmVsZWFzZV9pbm9kZSgpIG9uZ29pbmcsIHRoZW4gd2VcbitcdCAqIGFyZSBpbiBjaGFyZ2Ugb2YgY2FsbGluZyBpcHV0KCkgb24gdGhpcyBpbm9kZSwgb3RoZXJ3aXNlIHdlXG4rXHQgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLlxuK1x0ICovXG4rXHRzcGluX2xvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuK1x0aWYgKG9iamVjdC1cdTAwM2V1bmRlcm9iaiA9PSBpbm9kZSkge1xuK1x0XHRvYmplY3QtXHUwMDNldW5kZXJvYmogPSBOVUxMO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuIFxuIFx0XHQvKlxuLVx0XHQgKiBQcm90ZWN0cyBhZ2FpbnN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mIGlub2RlIChlLmcuXG4tXHRcdCAqIGZyb20gZ2V0X2lub2RlX29iamVjdCgpKS5cbitcdFx0ICogQmVjYXVzZSBvYmplY3QtXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxuK1x0XHQgKiByZWxlYXNlX2lub2RlKCkgYW5kIGdldF9pbm9kZV9vYmplY3QoKSBndWFyYW50ZWVcbitcdFx0ICogdGhhdCBpdCBpcyBzYWZlIHRvIHJlc2V0XG4rXHRcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3Qgd2hpbGUgaXQgaXMgbm90IE5VTEwuXG4rXHRcdCAqIEl0IGlzIHRoZXJlZm9yZSBub3QgbmVjZXNzYXJ5IHRvIGxvY2sgaW5vZGUtXHUwMDNlaV9sb2NrLlxuIFx0XHQgKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0LCBOVUxMKTtcbiBcdFx0Lypcbi1cdFx0ICogQ2hlY2tzIElfRlJFRUlORyBhbmQgSV9XSUxMX0ZSRUUgIHRvIHByb3RlY3QgYWdhaW5zdCBhIHJhY2Vcbi1cdFx0ICogY29uZGl0aW9uIHdoZW4gcmVsZWFzZV9pbm9kZSgpIGp1c3QgY2FsbGVkIGlwdXQoKSwgd2hpY2hcbi1cdFx0ICogY291bGQgbGVhZCB0byBhIE5VTEwgZGVyZWZlcmVuY2Ugb2YgaW5vZGUtXHUwMDNlc2VjdXJpdHkgb3IgYVxuLVx0XHQgKiBzZWNvbmQgY2FsbCB0byBpcHV0KCkgZm9yIHRoZSBzYW1lIExhbmRsb2NrIG9iamVjdC4gIEFsc29cbi1cdFx0ICogY2hlY2tzIElfTkVXIGJlY2F1c2Ugc3VjaCBpbm9kZSBjYW5ub3QgYmUgdGllZCB0byBhbiBvYmplY3QuXG4rXHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIG93biB0aGUgaWhvbGQoKSByZWZlcmVuY2UgdGhhdCB3YXNcbitcdFx0ICogb3JpZ2luYWxseSBzZXQgdXAgYnkgZ2V0X2lub2RlX29iamVjdCgpIGFuZCB0aGVcbitcdFx0ICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wXG4rXHRcdCAqIHdhbGsuICBUaGVyZWZvcmUgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byByZWZlcmVuY2VzXG4rXHRcdCAqIG9uIHRoZSBpbm9kZS5cbiBcdFx0ICovXG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjZcbi1cdFx0ICAgIChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbitcdFx0aXB1dF9ub3RfbGFzdChpbm9kZSk7XG4rXHR9IGVsc2Uge1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0fVxuIFxuLVx0XHRyY3VfcmVhZF9sb2NrKCk7XG4tXHRcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0KTtcbi1cdFx0aWYgKCFvYmplY3QpIHtcbi1cdFx0XHRyY3VfcmVhZF91bmxvY2soKTtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xuLVx0XHRfX2lnZXQoaW5vZGUpO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0aXB1dChpbm9kZSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFxuLVx0XHQvKlxuLVx0XHQgKiBJZiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHJlbGVhc2VfaW5vZGUoKSBvbmdvaW5nLCB0aGVuIHdlXG4tXHRcdCAqIGFyZSBpbiBjaGFyZ2Ugb2YgY2FsbGluZyBpcHV0KCkgb24gdGhpcyBpbm9kZSwgb3RoZXJ3aXNlIHdlXG4tXHRcdCAqIHdpbGwganVzdCB3YWl0IGZvciBpdCB0byBmaW5pc2guXG4tXHRcdCAqL1xuLVx0XHRzcGluX2xvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRpZiAob2JqZWN0LVx1MDAzZXVuZGVyb2JqID09IGlub2RlKSB7XG4tXHRcdFx0b2JqZWN0LVx1MDAzZXVuZGVyb2JqID0gTlVMTDtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4rXHRyZXR1cm4gMDtcbit9XG4gXG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBCZWNhdXNlIG9iamVjdC1cdTAwM2V1bmRlcm9iaiB3YXMgbm90IE5VTEwsXG4tXHRcdFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXG4tXHRcdFx0ICogdGhhdCBpdCBpcyBzYWZlIHRvIHJlc2V0XG4tXHRcdFx0ICogbGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCB3aGlsZSBpdCBpcyBub3QgTlVMTC5cbi1cdFx0XHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVx1MDAzZWlfbG9jay5cbi1cdFx0XHQgKi9cbi1cdFx0XHRyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCwgTlVMTCk7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzXG4tXHRcdFx0ICogb3JpZ2luYWxseSBzZXQgdXAgYnkgZ2V0X2lub2RlX29iamVjdCgpIGFuZCB0aGVcbi1cdFx0XHQgKiBfX2lnZXQoKSByZWZlcmVuY2UgdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3Bcbi1cdFx0XHQgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlc1xuLVx0XHRcdCAqIG9uIHRoZSBpbm9kZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpcHV0X25vdF9sYXN0KGlub2RlKTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZvYmplY3QtXHUwMDNlbG9jayk7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4tXHRcdH1cbisvKlxuKyAqIFJlbGVhc2UgdGhlIGlub2RlcyB1c2VkIGluIGEgc2VjdXJpdHkgcG9saWN5LlxuKyAqXG4rICogQ2YuIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKCkgYW5kIGV2aWN0X2lub2RlcygpXG4rICovXG4rc3RhdGljIHZvaWQgaG9va19zYl9kZWxldGUoc3RydWN0IHN1cGVyX2Jsb2NrICpjb25zdCBzYilcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJTk9ERV9JVEVSX05PUk1BTDtcbiBcbi1cdFx0aWYgKHByZXZfaW5vZGUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIG93biB0aGUgX19pZ2V0KCkgcmVmZXJlbmNlXG4tXHRcdFx0ICogdGhhdCB3ZSBqdXN0IHNldCBpbiB0aGlzIGxvb3Agd2Fsay4gIFRoZXJlZm9yZSB3ZVxuLVx0XHRcdCAqIGNhbiBkcm9wIHRoZSBsaXN0IGxvY2sgYW5kIGtub3cgdGhhdCB0aGUgaW5vZGUgd29uJ3Rcbi1cdFx0XHQgKiBkaXNhcHBlYXIgZnJvbSB1bmRlciB1cyB1bnRpbCB0aGUgbmV4dCBsb29wIHdhbGsuXG4tXHRcdFx0ICovXG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogV2UgY2FuIG5vdyBhY3R1YWxseSBwdXQgdGhlIGlub2RlIHJlZmVyZW5jZSBmcm9tIHRoZVxuLVx0XHRcdCAqIHByZXZpb3VzIGxvb3Agd2Fsaywgd2hpY2ggaXMgbm90IG5lZWRlZCBhbnltb3JlLlxuLVx0XHRcdCAqL1xuLVx0XHRcdGlwdXQocHJldl9pbm9kZSk7XG4tXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRwcmV2X2lub2RlID0gaW5vZGU7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRpZiAoIWxhbmRsb2NrX2luaXRpYWxpemVkKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcbiBcbi1cdC8qIFB1dHMgdGhlIGlub2RlIHJlZmVyZW5jZSBmcm9tIHRoZSBsYXN0IGxvb3Agd2FsaywgaWYgYW55LiAqL1xuLVx0aWYgKHByZXZfaW5vZGUpXG4tXHRcdGlwdXQocHJldl9pbm9kZSk7XG4gXHQvKiBXYWl0cyBmb3IgcGVuZGluZyBpcHV0KCkgaW4gcmVsZWFzZV9pbm9kZSgpLiAqL1xuIFx0d2FpdF92YXJfZXZlbnQoXHUwMDI2bGFuZGxvY2tfc3VwZXJibG9jayhzYiktXHUwMDNlaW5vZGVfcmVmcyxcbiBcdFx0ICAgICAgICFhdG9taWNfbG9uZ19yZWFkKFx1MDAyNmxhbmRsb2NrX3N1cGVyYmxvY2soc2IpLVx1MDAzZWlub2RlX3JlZnMpKTtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjQ0Ljc5MzY4ODg5M1oiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU1NTE3NTQxMDUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBQYXRjaCBTZXJpZXM6IFdvcnRoRnV6emluZyA9IFRydWUqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBzZXJpZXMuIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IGl0J3MgaW50cm9kdWNpbmcgYSBuZXcsIGdlbmVyaWMgaW5vZGUgaXRlcmF0aW9uIG1lY2hhbmlzbSBvbiBzdXBlcmJsb2Nrcy4gVGhlIGNvcmUgb2YgdGhpcyBzZWVtcyB0byBiZSB0aGUgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBmdW5jdGlvbiwgYWxvbmdzaWRlIGl0cyByZWxhdGVkIGl0ZXJhdG9yIGZ1bmN0aW9ucy4gSXQgbG9va3MgbGlrZSBhIHN1YnN0YW50aWFsIHJlZmFjdG9yaW5nLCB0b3VjaGluZyBhIHZhcmlldHkgb2YgY3J1Y2lhbCBzdWJzeXN0ZW1zLlxuXG5MZXQgbWUgYnJlYWsgZG93biB0aGUgY2hhbmdlcyBJJ20gc2VlaW5nLiBUaGlzIHBhdGNoIHVwZGF0ZXMgYSBidW5jaCBvZiBjYWxsIHNpdGVzIGFjcm9zcyB0aGUgVkZTIGxheWVyLCB0aGUgYmxvY2sgbGF5ZXIsIEdGUzIsIFF1b3RhLCBhbmQgZXZlbiBMYW5kbG9jayEgU3BlY2lmaWNhbGx5LCBJJ20gc2VlaW5nIG1vZGlmaWNhdGlvbnMgaW4gYGJsb2NrL2JkZXYuY2AsIGBmcy9kcm9wX2NhY2hlcy5jYCwgYGZzL2dmczIvb3BzX2ZzdHlwZS5jYCwgYGZzL2lub2RlLmNgICh0aGlzIG9uZSdzICprZXkqKSwgYGZzL3F1b3RhL2RxdW90LmNgLCBgZnMvc3VwZXIuY2AsIGFsb25nIHdpdGggdXBkYXRlcyB0byBpbmNsdWRlIGZpbGVzIGxpa2UgYGluY2x1ZGUvbGludXgvZnMuaGAgYW5kIGBpbmNsdWRlL2xpbnV4L2ZzL3N1cGVyX3R5cGVzLmhgLCBhbmQgZXZlbiBhIHNlY3VyaXR5IG1vZHVsZSwgYHNlY3VyaXR5L2xhbmRsb2NrL2ZzLmNgLlxuXG5NeSBwcmltYXJ5IGNvbmNlcm4gd2l0aCB0aGlzIGtpbmQgb2YgY2hhbmdlIGlzIHdoZXRoZXIgaXQgaW50cm9kdWNlcyBhbnkgdnVsbmVyYWJpbGl0aWVzLiBXZSBrbm93IHRoYXQgYW55IG1vZGlmaWNhdGlvbiB0byBjb3JlIFZGUyBjYW4gbGVhZCB0byB2dWxuZXJhYmlsaXRpZXMsIGFuZCB0aGlzIGRlZmluaXRlbHkgdG91Y2hlcyBjb3JlIFZGUzogYGZzL2lub2RlLmNgLCBgZnMvc3VwZXIuY2AsIGBmcy9kcm9wX2NhY2hlcy5jYCwgYGJsb2NrL2JkZXYuY2AsIGBmcy9xdW90YS9kcXVvdC5jYCwgYHNlY3VyaXR5L2xhbmRsb2NrL2ZzLmNgLiBBbHNvLCBpdCdzIGludHJvZHVjaW5nIGEgbmV3IGxpc3QgdHJhdmVyc2FsL2l0ZXJhdG9yIHRyYWNraW5nIGxvZ2ljICh3aXRoIGBzX2lub2Rlc19pdGVyc2AgYW5kIGl0cyByZWxhdGVkIGZ1bmN0aW9ucykuIFRoaXMgaW52b2x2ZXMgbG9ja2luZyB3aXRoIGBzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cdTAwM2VpX2xvY2tgLCBhcyB3ZWxsIGFzIGNhbGxiYWNrIHNlbWFudGljcyBhbmQgcmVmY291bnQgbWFuaXB1bGF0aW9uIHdpdGggYF9faWdldGAgYW5kIGBpcHV0YC4gQWxsIG9mIHRoZXNlIHRoaW5ncyBhcmUgcHJpbWUgY2FuZGlkYXRlcyBmb3IgZnV6emluZywgd2hpY2ggbWVhbnMgdGhlIGNvZGUgaXMgKmNvcmUgcmVhY2hhYmxlIGV4ZWN1dGFibGUqLiBUaGlzIGtpbmQgb2YgcmVmYWN0b3JpbmcgY291bGQgcmV2ZWFsIHN1YnRsZSByYWNlIGNvbmRpdGlvbnMsIG1lbW9yeSBjb3JydXB0aW9uIGlzc3Vlcywgb3IgZXZlbiBsb2dpYyBlcnJvcnMgdGhhdCB3b3VsZG4ndCBub3JtYWxseSBhcHBlYXIuXG5cblRoZXJlZm9yZSwgbXkgY29uY2x1c2lvbiBpcyBjbGVhcjogYFdvcnRoRnV6emluZyA9IHRydWVgLiBJIG5lZWQgdG8gZGlnIGludG8gdGhpcyB0aG9yb3VnaGx5LiBJIHNob3VsZCBwcm9iYWJseSB1c2UgYGdyZXBwZXJgIChvciBzaW1pbGFyIHRvb2xzKSB0byBjaGVjayB0aGUgY29uZmlndXJhdGlvbnMgYW5kIGluc3BlY3QgdGhlIHNvdXJjZSBjb2RlIGZ1cnRoZXIuIFRoaXMgcmVxdWlyZXMgY2FyZWZ1bCBjb25zaWRlcmF0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMTk5NywiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMywiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjUwLjM0NTQ0NTgxOFoiLCJTZXEiOjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODQzNjA5MzQzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNiX2Zvcl9lYWNoX2lub2Rlc1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJibG9jay9iZGV2LmM9MTM4Mj12b2lkIHN5bmNfYmRldnMoYm9vbCB3YWl0KVxcbmJsb2NrL2JkZXYuYy0xMzgzLXtcXG5ibG9jay9iZGV2LmM6MTM4NDpcXHRzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsXFxuYmxvY2svYmRldi5jLTEzODUtXFx0XFx0XFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xcbi0tXFxuZnMvZHJvcF9jYWNoZXMuYz00MD1zdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXFxuZnMvZHJvcF9jYWNoZXMuYy00MS17XFxuZnMvZHJvcF9jYWNoZXMuYzo0MjpcXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLCBkcm9wX3BhZ2VjYWNoZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcXG5mcy9kcm9wX2NhY2hlcy5jLTQzLX1cXG4tLVxcbmZzL2dmczIvb3BzX2ZzdHlwZS5jPTE3NTU9c3RhdGljIHZvaWQgZ2ZzMl9ldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2dmczIvb3BzX2ZzdHlwZS5jLTE3NTktXFx0c2V0X2JpdChTREZfRVZJQ1RJTkcsIFxcdTAwMjZzZHAtXFx1MDAzZXNkX2ZsYWdzKTtcXG5mcy9nZnMyL29wc19mc3R5cGUuYzoxNzYwOlxcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XFxuZnMvZ2ZzMi9vcHNfZnN0eXBlLmMtMTc2MS19XFxuLS1cXG5mcy9pbm9kZS5jPTY3MT1zdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbi0tXFxuZnMvaW5vZGUuYy03MTctXFxuZnMvaW5vZGUuYzo3MTg6aW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuZnMvaW5vZGUuYy03MTktXFx0XFx0ICAgICAgIGlub2RlX2l0ZXJfY2IgZm4sIHZvaWQgKmRhdGEpXFxuLS1cXG5mcy9pbm9kZS5jLTcyOS19XFxuZnMvaW5vZGUuYzo3MzA6RVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpO1xcbmZzL2lub2RlLmMtNzMxLVxcbi0tXFxuZnMvaW5vZGUuYz05ODI9dm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcXG4tLVxcbmZzL2lub2RlLmMtOTg2LVxcbmZzL2lub2RlLmM6OTg3OlxcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiLCBcXHUwMDI2ZGlzcG9zZSk7XFxuZnMvaW5vZGUuYy05ODgtXFx0ZGlzcG9zZV9saXN0KFxcdTAwMjZkaXNwb3NlKTtcXG4tLVxcbmZzL3F1b3RhL2RxdW90LmM9MTA4Mj1zdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXFxuZnMvcXVvdGEvZHF1b3QuYy0xMDgzLXtcXG5mcy9xdW90YS9kcXVvdC5jOjEwODQ6XFx0cmV0dXJuIHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsXFxuZnMvcXVvdGEvZHF1b3QuYy0xMDg1LVxcdFxcdFxcdFxcdCAgYWRkX2RxdW90X3JlZl9pbm9kZV9pdGVyX2NiLCBcXHUwMDI2dHlwZSk7XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2ZzLmg9ODgzPXR5cGVkZWYgaW50ICgqaW5vZGVfaXRlcl9jYikgKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopO1xcbmluY2x1ZGUvbGludXgvZnMuaC04ODQtXFxuaW5jbHVkZS9saW51eC9mcy5oOjg4NTppbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcXG5pbmNsdWRlL2xpbnV4L2ZzLmgtODg2LVxcdFxcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKTtcXG4tLVxcbnNlY3VyaXR5L2xhbmRsb2NrL2ZzLmM9MTQzNz1zdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxcbi0tXFxuc2VjdXJpdHkvbGFuZGxvY2svZnMuYy0xNDQzLVxcbnNlY3VyaXR5L2xhbmRsb2NrL2ZzLmM6MTQ0NDpcXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIGZsYWdzLCBob29rX3NiX2RlbGV0ZV9pbm9kZV9pdGVyX2NiLCBOVUxMKTtcXG5zZWN1cml0eS9sYW5kbG9jay9mcy5jLTE0NDUtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjUyLjE4OTA2MDQyMVoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIyNzcxNTAyMTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBJbm9kZSBJdGVyYXRvcioqXG5cbk9rYXksIHNvIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiBob3cgdGhlIGl0ZXJhdG9yIGZvciBpbm9kZXMgaW4gYGZzL2lub2RlLmNgIGFjdHVhbGx5IHdvcmtzLiBJIHdhbnQgdG8gc3BlY2lmaWNhbGx5IHVuZGVyc3RhbmQgaXRzIGltcGxlbWVudGF0aW9uIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgaG93IGl0J3MgYmVpbmcgKnVzZWQqLiBJcyBpdCBhIGNsYXNzaWMgaXRlcmF0b3IgcGF0dGVybiwgb3IgaXMgdGhlcmUgc29tZSBjdXN0b20gc3BpbiBvbiBpdCB0byBvcHRpbWl6ZSBmb3IgZmlsZSBzeXN0ZW0gYWNjZXNzIHBhdHRlcm5zPyBJJ20gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gYW55IHBvdGVudGlhbCBjb25jdXJyZW5jeSBpbXBsaWNhdGlvbnMg4oCTIGRvZXMgdGhlIGl0ZXJhdGlvbiBoYW5kbGUgbG9ja2luZyBjb3JyZWN0bHkgYWNyb3NzIG11bHRpcGxlIHRocmVhZHMgb3IgcHJvY2Vzc2VzIGFjY2Vzc2luZyB0aGUgaW5vZGUgdGFibGU/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIHRoYXQgc3ByaW5nIHRvIG1pbmQgd2hlbiBzZWVpbmcgaG93IGl0J3MgbGFpZCBvdXQ/IEkgbmVlZCB0byBhbmFseXplIGl0cyB1c2FnZSBjb250ZXh0IHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBhY2Nlc3MgaXQgaXMgYmVpbmcgdXNlZCBmb3IsIGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBpdGVyYXRvcnMgcGVyZm9ybWFuY2UgaW4gdGhlc2Ugc2l0dWF0aW9ucy4gVGltZSB0byBzdGFydCBkaWdnaW5nLi4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzOTg1LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NTQuNDY2MjEzMjAzWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQzMzkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2lub2RlLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjQ1LFxuICBcIkxpbmVDb3VudFwiOiA4NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjQ1OlxcdFxcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cXHUwMDNlaV9zYjtcXG4gNjQ2OlxcdFxcbiA2NDc6XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiA2NDg6XFx0XFx0bGlzdF9hZGQoXFx1MDAyNmlub2RlLVxcdTAwM2VpX3NiX2xpc3QsIFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMpO1xcbiA2NDk6XFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIDY1MDpcXHR9XFxuIDY1MTpcXHRFWFBPUlRfU1lNQk9MX0dQTChpbm9kZV9zYl9saXN0X2FkZCk7XFxuIDY1MjpcXHRcXG4gNjUzOlxcdHN0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxcbiA2NTQ6XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgaW50IGZsYWdzLCBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxcbiA2NTU6XFx0e1xcbiA2NTY6XFx0XFx0aXQtXFx1MDAzZWZsYWdzID0gZmxhZ3M7XFxuIDY1NzpcXHRcXHRpdC1cXHUwMDNlZnVuYyA9IGZuO1xcbiA2NTg6XFx0XFx0aXQtXFx1MDAzZWRhdGEgPSBkYXRhO1xcbiA2NTk6XFx0XFx0aXQtXFx1MDAzZXJldCA9IDA7XFxuIDY2MDpcXHRcXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIDY2MTpcXHRcXHRpdC1cXHUwMDNlbmV4dCA9IHNiLVxcdTAwM2VzX2lub2Rlcy5uZXh0O1xcbiA2NjI6XFx0XFx0bGlzdF9hZGQoXFx1MDAyNml0LVxcdTAwM2VpdGVyc19ub2RlLCBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcXG4gNjYzOlxcdH1cXG4gNjY0OlxcdFxcbiA2NjU6XFx0c3RhdGljIHZvaWQgaW5vZGVfc2JfaXRlcl9lbmQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiA2NjY6XFx0e1xcbiA2Njc6XFx0XFx0bGlzdF9kZWwoXFx1MDAyNml0LVxcdTAwM2VpdGVyc19ub2RlKTtcXG4gNjY4OlxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiA2Njk6XFx0fVxcbiA2NzA6XFx0XFxuIDY3MTpcXHRzdGF0aWMgYm9vbCBpbm9kZV9zYl9pdGVyX25leHQoc3RydWN0IGlub2RlX2l0ZXIgKml0LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxcbiA2NzI6XFx0e1xcbiA2NzM6XFx0XFx0c3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7XFxuIDY3NDpcXHRcXHRpbnQgcmV0O1xcbiA2NzU6XFx0XFxuIDY3NjpcXHRcXHR3aGlsZSAoIWlub2RlIFxcdTAwMjZcXHUwMDI2IGl0LVxcdTAwM2VuZXh0ICE9IFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZXMpIHtcXG4gNjc3OlxcdFxcdFxcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cXHUwMDNlbmV4dCwgc3RydWN0IGlub2RlLCBpX3NiX2xpc3QpO1xcbiA2Nzg6XFx0XFx0XFx0aWYgKGl0LVxcdTAwM2VmbGFncyBcXHUwMDI2IElOT0RFX0lURVJfVU5VU0VEKSB7XFxuIDY3OTpcXHRcXHRcXHRcXHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpIHtcXG4gNjgwOlxcdFxcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuIDY4MTpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNjgyOlxcdFxcdFxcdFxcdH1cXG4gNjgzOlxcdFxcbiA2ODQ6XFx0XFx0XFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gNjg1OlxcdFxcdFxcdFxcdGlmIChpY291bnRfcmVhZChpbm9kZSkpIHtcXG4gNjg2OlxcdFxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gNjg3OlxcdFxcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuIDY4ODpcXHRcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNjg5OlxcdFxcdFxcdFxcdH1cXG4gNjkwOlxcdFxcdFxcdH0gZWxzZSB7XFxuIDY5MTpcXHRcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNmlub2RlLVxcdTAwM2VpX2xvY2spO1xcbiA2OTI6XFx0XFx0XFx0fVxcbiA2OTM6XFx0XFxuIDY5NDpcXHRcXHRcXHRpZiAoKGl0LVxcdTAwM2VmbGFncyBcXHUwMDI2IElOT0RFX0lURVJfTk9STUFMKSBcXHUwMDI2XFx1MDAyNlxcbiA2OTU6XFx0XFx0XFx0ICAgIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcXHUwMDI2IChJX05FVyB8IElfRlJFRUlORyB8IElfV0lMTF9GUkVFKSkpIHtcXG4gNjk2OlxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZpbm9kZS1cXHUwMDNlaV9sb2NrKTtcXG4gNjk3OlxcdFxcdFxcdFxcdGl0LVxcdTAwM2VuZXh0ID0gaXQtXFx1MDAzZW5leHQtXFx1MDAzZW5leHQ7XFxuIDY5ODpcXHRcXHRcXHRcXHRjb250aW51ZTtcXG4gNjk5OlxcdFxcdFxcdH1cXG4gNzAwOlxcdFxcbiA3MDE6XFx0XFx0XFx0aXQtXFx1MDAzZW5leHQgPSBpdC1cXHUwMDNlbmV4dC1cXHUwMDNlbmV4dDtcXG4gNzAyOlxcdFxcdFxcdHJldCA9IGl0LVxcdTAwM2VmdW5jKGlub2RlLCBpdC1cXHUwMDNlZGF0YSk7XFxuIDcwMzpcXHRcXHRcXHRpZiAocmV0KSB7XFxuIDcwNDpcXHRcXHRcXHRcXHRpdC1cXHUwMDNlcmV0ID0gcmV0O1xcbiA3MDU6XFx0XFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA3MDY6XFx0XFx0XFx0fVxcbiA3MDc6XFx0XFxuIDcwODpcXHRcXHRcXHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcXG4gNzA5OlxcdFxcdFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzYi1cXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xcbiA3MTA6XFx0XFx0XFx0XFx0Y29uZF9yZXNjaGVkKCk7XFxuIDcxMTpcXHRcXHRcXHRcXHRzcGluX2xvY2soXFx1MDAyNnNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XFxuIDcxMjpcXHRcXHRcXHR9XFxuIDcxMzpcXHRcXHR9XFxuIDcxNDpcXHRcXG4gNzE1OlxcdFxcdHJldHVybiBpdC1cXHUwMDNlbmV4dCA9PSBcXHUwMDI2c2ItXFx1MDAzZXNfaW5vZGVzID8gZmFsc2UgOiB0cnVlO1xcbiA3MTY6XFx0fVxcbiA3MTc6XFx0XFxuIDcxODpcXHRpbnQgc2JfZm9yX2VhY2hfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmbGFncyxcXG4gNzE5OlxcdFxcdFxcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxcbiA3MjA6XFx0e1xcbiA3MjE6XFx0XFx0c3RydWN0IGlub2RlX2l0ZXIgaXQ7XFxuIDcyMjpcXHRcXG4gNzIzOlxcdFxcdGlub2RlX3NiX2l0ZXJfc3RhcnQoc2IsIFxcdTAwMjZpdCwgZmxhZ3MsIGZuLCBkYXRhKTtcXG4gNzI0OlxcdFxcdHdoaWxlIChpbm9kZV9zYl9pdGVyX25leHQoXFx1MDAyNml0LCBzYikpXFxuIDcyNTpcXHRcXHRcXHQ7XFxuIDcyNjpcXHRcXHRpbm9kZV9zYl9pdGVyX2VuZChcXHUwMDI2aXQsIHNiKTtcXG4gNzI3OlxcdFxcbiA3Mjg6XFx0XFx0cmV0dXJuIGl0LnJldDtcXG4gNzI5OlxcdH1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDlUMTE6MTA6NTQuNDY2MzU5NTU0WiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDY4NTY4MTg4NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipEaXZpbmcgaW50byB0aGlzIG5ldyBpdGVyYXRvcidzIGludHJpY2FjaWVzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgY2xvc2VseSBhdCBgc2JfZm9yX2VhY2hfaW5vZGVzYC4gUmlnaHQgYXdheSwgdGhlIGBpbm9kZV9zYl9pdGVyX25leHQoKWAgZnVuY3Rpb24gZ3JhYnMgYW4gYGlub2RlYCBmcm9tIGEgbGlzdCB1c2luZyBgbGlzdF9lbnRyeWAuICBJdCBjaGVja3MgZmxhZ3MsIHBvdGVudGlhbGx5IGFjcXVpcmVzIGBpbm9kZS1cdTAwM2VpX2xvY2tgIChkZXBlbmRpbmcgb24gdGhlIGNvZGUgcGF0aCksIGFuZCB0aGVuIGNhbGxzIGBpdC1cdTAwM2VmdW5jYCB3aXRoIHRoZSBgaW5vZGVgIGFuZCBgaXQtXHUwMDNlZGF0YWAuICBTdGFuZGFyZCBzdHVmZiwgYnV0IHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBsb2NraW5nIGlzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuXG5cbk5vdywgYGlub2RlX3NiX2xpc3RfZGVsYCBpbiBgZnMvaW5vZGUuY2AuIEkgc2VlIGl0IHJlbW92aW5nIGFuIGlub2RlIGZyb20gdGhlIHN1cGVyYmxvY2sncyBpbm9kZSBsaXN0LiBBbmQgaGVyZSdzIHRoZSBraWNrZXI6IGl0IGl0ZXJhdGVzICp0aHJvdWdoKiB0aGUgYHNfaW5vZGVzX2l0ZXJzYCBsaXN0IG9uIHRoZSBzdXBlcmJsb2NrLiAgSWYgaXQgZmluZHMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgYXQgdGhlIGlub2RlIGJlaW5nIGRlbGV0ZWQsIGl0IHVwZGF0ZXMgYGl0LVx1MDAzZW5leHRgISBUaGlzIGlzIGNyaXRpY2FsLiBEdXJpbmcgdGhvc2UgaXRlcmF0aW9uIGNhbGxiYWNrcywgdGhlIGNvZGUgZHJvcHMgYGlub2RlLVx1MDAzZWlfbG9ja2AgYW5kIGBzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AsIGRvZXMgc29tZSB3b3JrICh0aGluZ3MgbGlrZSBgX19pZ2V0YCwgYGlwdXRgLCBldmVuIGBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXNgLCBhbmQgZmlsZSBvcGVyYXRpb25zKSwgYW5kIHRoZW4gcmVhY3F1aXJlcyBgc2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2tgIGJlZm9yZSByZXR1cm5pbmcuXG5cblRoZSBpbXBsaWNhdGlvbnMgYXJlIGh1Z2UuICBBbiBpbm9kZSBjYW4gYmUgZGVsZXRlZCAqd2hpbGUqIHRoZSBsb2NrIGlzIGRyb3BwZWQuIFdoZW4gdGhhdCBoYXBwZW5zLCBgaW5vZGVfc2JfbGlzdF9kZWxgICp1cGRhdGVzIHRoZSBpdGVyYXRvcidzIG5leHQgcG9pbnRlciosIHNvIHRoYXQgaXQgaXNuJ3Qgb3JwaGFuZWQuIEl0J3MgY2xldmVybHkgaGFuZGxpbmcgY29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi4gVGhpcyBpdGVyYXRvciBtZWNoYW5pc20gaXMgYnJhbmQgbmV3IGFuZCB0b3VjaGVzIHN1cGVyYmxvY2sgaW5vZGUgbGlzdCBsb2NraW5nLCByZWZjb3VudGluZywgYW5kIHRyYXZlcnNhbCBhY3Jvc3MgVkZTLCBxdW90YSwgTGFuZGxvY2ssIEdGUzIsIGFuZCBldmVuIGJsb2NrIGRldmljZXMhXG5cblNvLCB3aGljaCBjb25maWd1cmF0aW9ucyBhcmUgbGlrZWx5IHRvIGJlIHJlbGV2YW50PyAgYGZzL2lub2RlLmNgLCBgZnMvc3VwZXIuY2AsIGBibG9jay9iZGV2LmNgLCBhbmQgYGZzL2Ryb3BfY2FjaGVzLmNgIGFyZSBhbHdheXMgdGhlcmUuIEJ1dCB3aGF0IGFib3V0IHRoZSBtb2R1bGVzPyAgYGZzL3F1b3RhL2RxdW90LmNgIGRlcGVuZHMgb24gYENPTkZJR19RVU9UQWAsIGBmcy9nZnMyYCBkZXBlbmRzIG9uIGBDT05GSUdfR0ZTMl9GU2AsIGFuZCBgc2VjdXJpdHkvbGFuZGxvY2tgIGRlcGVuZHMgb24gYENPTkZJR19TRUNVUklUWV9MQU5ETE9DS2AuXG5cbkknbSBnb2luZyB0byBxdWlja2x5IGNoZWNrIHRoZSBLY29uZmlnIGZpbGVzIGZvciBRdW90YSwgTGFuZGxvY2ssIGFuZCBHRlMyIGp1c3QgdG8gY29uZmlybSB0aGVzZSBkZXBlbmRlbmNpZXMgYW5kIG1ha2Ugc3VyZSBJJ20gbm90IG1pc3NpbmcgYW55dGhpbmcgb2J2aW91cy4gVGhpcyByZXF1aXJlcyBtb3JlIHRob3JvdWdoIGFuYWx5c2lzLCBidXQgdGhpcyBpdGVyYXRvciBzZWVtcyBub3ZlbCBhbmQgaGlnaGx5IHJlbGV2YW50IHRvIGNvbmN1cnJlbnQgZmlsZXN5c3RlbSBzdHJ1Y3R1cmVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTQ4MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU0MiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjEwOjU5LjE1MjA0NDUzOFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzg4MjAyMTcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIChRVU9UQXxTRUNVUklUWV9MQU5ETE9DS3xHRlMyX0ZTKVxcXFxiXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9nZnMyL0tjb25maWctMS0jIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG5mcy9nZnMyL0tjb25maWc6Mjpjb25maWcgR0ZTMl9GU1xcbmZzL2dmczIvS2NvbmZpZy0zLVxcdHRyaXN0YXRlIFxcXCJHRlMyIGZpbGUgc3lzdGVtIHN1cHBvcnRcXFwiXFxuLS1cXG5mcy9xdW90YS9LY29uZmlnLTUtXFxuZnMvcXVvdGEvS2NvbmZpZzo2OmNvbmZpZyBRVU9UQVxcbmZzL3F1b3RhL0tjb25maWctNy1cXHRib29sIFxcXCJRdW90YSBzdXBwb3J0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMToxMDo1OS4yOTA4NzM1NTZaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxOTY2MjAzODgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipLZXJuZWwgU2VjdXJpdHkgRXhwbG9yYXRpb24qKlxuXG5BbHJpZ2h0LCBiZWZvcmUgSSBkaXZlIHRvbyBkZWVwIGludG8gdGhpcyBwcm9ibGVtLCBJIG5lZWQgdG8gdGFrZSBhIHN0ZXAgYmFjayBhbmQgbWFrZSBzdXJlIEknbSBub3QgbWlzc2luZyBhbnl0aGluZyBvYnZpb3VzLiBTZWN1cml0eSBpcyBhbHdheXMgcGFyYW1vdW50LCBhbmQgbGFuZGxvY2sgaXMgYSBsaWtlbHkgYXJlYSB0byBzY3J1dGluaXplLiBJIG5lZWQgdG8gcXVpY2tseSBhc3Nlc3MgaWYgdGhlIGlzc3VlIGludGVyc2VjdHMgd2l0aCBsYW5kbG9jaydzIGNhcGFiaWxpdGllcy4gU3BlY2lmaWNhbGx5LCBkb2VzIHNvbWV0aGluZyBjaGFuZ2UgYXQgdGhlIGxhbmRsb2NrIGxldmVsIHRoYXQgbWlnaHQgY29udHJpYnV0ZT8gSXQncyBlYXN5IHRvIGdldCB0dW5uZWwgdmlzaW9uIHdoZW4gZGVidWdnaW5nLlxuXG5UaGVuLCBvZiBjb3Vyc2UsIEkgc2hvdWxkIGxvb2sgYXQgdGhlIEtjb25maWcgb3B0aW9ucyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIEFyZSB0aGVyZSBhbnkgcmVsZXZhbnQgc2VjdXJpdHkgZmVhdHVyZXMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgZW5hYmxlZCBpbiBhIHdheSB0aGF0IGNvdWxkIGFmZmVjdCB0aGlzIHNpdHVhdGlvbj8gTWF5YmUgSSBjYW4gY2hhbmdlIHRoZW0gdG8gdmVyaWZ5IHRoZSBiZWhhdmlvdXIuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSdtIG5vdCB3b3JraW5nIHdpdGggYW4gdW51c3VhbCwgb3Igbm9uLWRlZmF1bHQsIGJ1aWxkIGJlZm9yZSBJIHN0YXJ0IGNoYXNpbmcgZ2hvc3RzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjcxMSwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjAxLjI1NzA3OTQ4OVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjczNjUxMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFNFQ1VSSVRZX0xBTkRMT0NLXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInNlY3VyaXR5L1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJzZWN1cml0eS9sYW5kbG9jay9LY29uZmlnLTItXFxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZzozOmNvbmZpZyBTRUNVUklUWV9MQU5ETE9DS1xcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctNC1cXHRib29sIFxcXCJMYW5kbG9jayBzdXBwb3J0XFxcIlxcbi0tXFxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZy0yMy1cXG5zZWN1cml0eS9sYW5kbG9jay9LY29uZmlnOjI0OmNvbmZpZyBTRUNVUklUWV9MQU5ETE9DS19MT0dcXG5zZWN1cml0eS9sYW5kbG9jay9LY29uZmlnLTI1LVxcdGJvb2xcXG4tLVxcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMjgtXFxuc2VjdXJpdHkvbGFuZGxvY2svS2NvbmZpZzoyOTpjb25maWcgU0VDVVJJVFlfTEFORExPQ0tfS1VOSVRfVEVTVFxcbnNlY3VyaXR5L2xhbmRsb2NrL0tjb25maWctMzAtXFx0Ym9vbCBcXFwiS1VuaXQgdGVzdHMgZm9yIExhbmRsb2NrXFxcIiBpZiAhS1VOSVRfQUxMX1RFU1RTXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjAxLjMyNDQ1MDM2OFoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1ODAyNzM3Mzk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgU3RyYXRlZ3kgZm9yIEtlcm5lbCBQYXRjaCBBbmFseXNpcyoqXG5cbkFscmlnaHQsIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBpZGVudGlmeSBhbmQganVzdGlmeSBmdXp6aW5nIHRoaXMgcGF0Y2guIEZpcnN0LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGtlcm5lbCBmdW5jdGlvbnMgaW50cm9kdWNlZCBvciBzaWduaWZpY2FudGx5IGFsdGVyZWQuIExvb2tzIGxpa2UgdGhlIHBhdGNoIHRvdWNoZXMgc2V2ZXJhbCBhcmVhczogYmxvY2sgZGV2aWNlcyAoYGJkZXYuY2ApLCBwYWdlIGNhY2hlIChgZHJvcF9jYWNoZXMuY2ApLCBHRlMyIGZpbGVzeXN0ZW1zIChgZ2ZzMi9vcHNfZnN0eXBlLmNgKSwgZ2VuZXJhbCBpbm9kZXMgKGBpbm9kZS5jYCksIHF1b3RhcyAoYHF1b3RhL2RxdW90LmNgKSwgYW5kIExhbmRsb2NrIHNlY3VyaXR5IChgc2VjdXJpdHkvbGFuZGxvY2svZnMuY2ApLlxuXG5JJ3ZlIGV4dHJhY3RlZCB0aGUga2V5IGZ1bmN0aW9ucyBmcm9tIHRoZSBwYXRjaCB0aGF0IHNlZW0gcmVsZXZhbnQuIEkndmUgc3BlY2lmaWNhbGx5IHRhcmdldGVkIGZ1bmN0aW9ucyB0aGF0IGFyZSAqbm90KiB1YmlxdWl0b3VzLCBsb3ctbGV2ZWwga2VybmVsIHJvdXRpbmVzLiBJJ20gbG9va2luZyBmb3IgZW50cnkgcG9pbnRzIG9yIGl0ZXJhdG9ycyB0aGF0IGRpcmVjdGx5IGV4ZXJjaXNlIHRoZSBjaGFuZ2VkIGNvZGUuIEJhc2VkIG9uIG15IGFuYWx5c2lzLCB0aGVzZSBmdW5jdGlvbnMgc3RhbmQgb3V0OiBgc2JfZm9yX2VhY2hfaW5vZGVzYCwgYGV2aWN0X2lub2Rlc2AsIGBkcm9wX3BhZ2VjYWNoZV9zYmAsIGBzeW5jX2JkZXZzYCwgYGFkZF9kcXVvdF9yZWZgLCBgZ2ZzMl9ldmljdF9pbm9kZXNgLCBhbmQgYGhvb2tfc2JfZGVsZXRlYC5cblxuTm93LCB0aGVzZSBhcmVuJ3QgeW91ciB0eXBpY2FsIGxpZmVjeWNsZSBob3QtcGF0aHM7IHRoZXkncmUgdmVyeSBzcGVjaWZpYyBWRlMsIGZpbGVzeXN0ZW0sIG9yIHNlY3VyaXR5IGVudHJ5IHBvaW50cyBhbmQgaXRlcmF0b3JzLiBTbywgSSBrbm93IHRoZXkncmUgbm90IGdvaW5nIHRvIGJlIG1hc3NpdmVseSBjYWxsZWQgZXZlcnl3aGVyZSwgYnV0IHRoZXkgbGlrZWx5IGFyZSBlbnRyeSBwb2ludHMgdGhhdCB3aWxsIGV4ZXJjaXNlIHRoaXMgY29kZS5cblxuSSd2ZSBhbHNvIGlkZW50aWZpZWQgdGhlIHJlbGV2YW50IGtlcm5lbCBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBhZmZlY3RlZDogYFFVT1RBYCwgYEdGUzJfRlNgLCBhbmQgYFNFQ1VSSVRZX0xBTkRMT0NLYC5cblxuTm93LCB0byBzb2xpZGlmeSB0aGlzLCBJIG5lZWQgdG8gYXJ0aWN1bGF0ZSB3aHkgdGhpcyB3YXJyYW50cyBmdXp6aW5nLiBUaGlzIHBhdGNoIGlzIHJlZmFjdG9yaW5nIHN1cGVyYmxvY2sgaW5vZGUgbGlzdCBpdGVyYXRpb24gYWNyb3NzIG11bHRpcGxlIGFyZWFzLCBpbnRyb2R1Y2luZyBgc2JfZm9yX2VhY2hfaW5vZGVzYCBhbmQgYW4gYWN0aXZlIGl0ZXJhdG9yIG1lY2hhbmlzbSAoYHNfaW5vZGVzX2l0ZXJzYCkuIFRoaXMgY2hhbmdlIGltcGxpZXMgYWx0ZXJhdGlvbnMgdG8gbG9ja2luZywgbGlzdCB0cmF2ZXJzYWwsIGFuZCBjb25jdXJyZW50IGlub2RlIGRlbGV0aW9uL2V2aWN0aW9uIHNlbWFudGljcy4gVGhhdCdzIGEgaHVnZSByZWQgZmxhZzogcmFjZSBjb25kaXRpb25zLCBsaXN0IGNvcnJ1cHRpb24sIGFuZCBsb2NraW5nIGlzc3VlcyBhcmUgYWxsIGxpa2VseSBoZXJlLlxuXG5HaXZlbiBhbGwgdGhpcywgSSdtIGNvbmZpZGVudCBpbiBzYXlpbmcgdGhhdCB0aGlzIHBhdGNoIGlzIHdvcnRoIGZ1enppbmcuIEkndmUgZ2F0aGVyZWQgYSBjbGVhciByZWFzb25pbmcsIGlkZW50aWZpZWQgdGhlIGZ1bmN0aW9ucywgYW5kIGxpc3RlZCByZWxldmFudCBjb25maWd1cmF0aW9ucy4gSSBjYW4gbm93IGdvIGFoZWFkIGFuZCBjYWxsIGBzZXQtcmVzdWx0c2AuIEkgYW0gcmVhZHkgdG8gbW92ZSBvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTcxMTAsIk91dHB1dFRva2VucyI6MjMxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODkzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjA3LjEyNzE5MTIyMloiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3NzU1NTc4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJRVU9UQVwiLFxuICAgIFwiR0ZTMl9GU1wiLFxuICAgIFwiU0VDVVJJVFlfTEFORExPQ0tcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzYl9mb3JfZWFjaF9pbm9kZXNcIixcbiAgICBcImV2aWN0X2lub2Rlc1wiLFxuICAgIFwic3luY19iZGV2c1wiLFxuICAgIFwiZHJvcF9wYWdlY2FjaGVfc2JcIixcbiAgICBcImFkZF9kcXVvdF9yZWZcIixcbiAgICBcImdmczJfZXZpY3RfaW5vZGVzXCIsXG4gICAgXCJob29rX3NiX2RlbGV0ZVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gZnJhbWV3b3JrIChzYl9mb3JfZWFjaF9pbm9kZXMpIHdpdGggZHluYW1pYyBpdGVyYXRvciBsaXN0IHRyYWNraW5nIChzX2lub2Rlc19pdGVycykgYW5kIHVwZGF0ZXMgdHJhdmVyc2FsIGxvb3BzIGluIFZGUyAoZXZpY3RfaW5vZGVzLCBkcm9wX2NhY2hlcyksIGJsb2NrIGRldmljZXMgKHN5bmNfYmRldnMpLCBxdW90YXMgKGFkZF9kcXVvdF9yZWYpLCBHRlMyIChnZnMyX2V2aWN0X2lub2RlcyksIGFuZCBMYW5kbG9jayAoaG9va19zYl9kZWxldGUpLiBUaGlzIHNpZ25pZmljYW50bHkgYWx0ZXJzIGxvY2tpbmcsIGxpc3QgbXV0YXRpb24gZHVyaW5nIHRyYXZlcnNhbCwgYW5kIHJlZmNvdW50aW5nIGFjcm9zcyBjb3JlIHN1YnN5c3RlbXMsIG1ha2luZyBpdCB3b3J0aCBmdXp6aW5nIGZvciByYWNlcywgbGlzdCBjb3JydXB0aW9ucywgb3IgZGVhZGxvY2tzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlFVT1RBXCIsXG4gICAgXCJHRlMyX0ZTXCIsXG4gICAgXCJTRUNVUklUWV9MQU5ETE9DS1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNiX2Zvcl9lYWNoX2lub2Rlc1wiLFxuICAgIFwiZXZpY3RfaW5vZGVzXCIsXG4gICAgXCJzeW5jX2JkZXZzXCIsXG4gICAgXCJkcm9wX3BhZ2VjYWNoZV9zYlwiLFxuICAgIFwiYWRkX2RxdW90X3JlZlwiLFxuICAgIFwiZ2ZzMl9ldmljdF9pbm9kZXNcIixcbiAgICBcImhvb2tfc2JfZGVsZXRlXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBmcmFtZXdvcmsgKHNiX2Zvcl9lYWNoX2lub2Rlcykgd2l0aCBkeW5hbWljIGl0ZXJhdG9yIGxpc3QgdHJhY2tpbmcgKHNfaW5vZGVzX2l0ZXJzKSBhbmQgdXBkYXRlcyB0cmF2ZXJzYWwgbG9vcHMgaW4gVkZTIChldmljdF9pbm9kZXMsIGRyb3BfY2FjaGVzKSwgYmxvY2sgZGV2aWNlcyAoc3luY19iZGV2cyksIHF1b3RhcyAoYWRkX2RxdW90X3JlZiksIEdGUzIgKGdmczJfZXZpY3RfaW5vZGVzKSwgYW5kIExhbmRsb2NrIChob29rX3NiX2RlbGV0ZSkuIFRoaXMgc2lnbmlmaWNhbnRseSBhbHRlcnMgbG9ja2luZywgbGlzdCBtdXRhdGlvbiBkdXJpbmcgdHJhdmVyc2FsLCBhbmQgcmVmY291bnRpbmcgYWNyb3NzIGNvcmUgc3Vic3lzdGVtcywgbWFraW5nIGl0IHdvcnRoIGZ1enppbmcgZm9yIHJhY2VzLCBsaXN0IGNvcnJ1cHRpb25zLCBvciBkZWFkbG9ja3MuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjA3LjIwNDk1NDcxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTQ0NzcyNDA5NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjA3LjIwNTUwNDkzWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MTE0NDcxNjkxODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXFxuXFxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxcbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXFxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG5cXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcXG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXFxuXFxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCBiNDZlM2Q5NmM5YTE3MTA3MjBiODNiMzllOWZmYTEyNmY5ODgwZDY1XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFdlZCBTZXAgOSAxMToxMDo0MSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2Jsb2NrL2JkZXYuYyBiL2Jsb2NrL2JkZXYuY1xuaW5kZXggY2Q4MzIzMDgzNzQwNi4uYWU0NzJhMDYyZTUxYyAxMDA2NDRcbi0tLSBhL2Jsb2NrL2JkZXYuY1xuKysrIGIvYmxvY2svYmRldi5jXG5AQCAtMTMzNiw1NiArMTMzNiw1MyBAQCB2b2lkIGJkZXZfbWFya19kZWFkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGJvb2wgc3VycHJpc2UpXG4gICovXG4gRVhQT1JUX1NZTUJPTF9HUEwoYmRldl9tYXJrX2RlYWQpO1xuIFxuLXZvaWQgc3luY19iZGV2cyhib29sIHdhaXQpXG4rc3RhdGljIGludCBzeW5jX2JkZXZzX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDtcbi1cbi1cdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNmJsb2NrZGV2X3N1cGVyYmxvY2stXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLVx1MDAzZWlfbWFwcGluZztcbi1cdFx0c3RydWN0IGJsb2NrX2RldmljZSAqYmRldjtcbitcdGJvb2wgd2FpdCA9IChib29sKWRhdGE7XG4rXHRzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2O1xuK1x0c3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS1cdTAwM2VpX21hcHBpbmc7XG4gXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSB8fFxuLVx0XHQgICAgbWFwcGluZy1cdTAwM2VucnBhZ2VzID09IDApIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdF9faWdldChpbm9kZSk7XG4rXHRpZiAobWFwcGluZy1cdTAwM2VucnBhZ2VzID09IDApIHtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIFdlIGhvbGQgYSByZWZlcmVuY2UgdG8gJ2lub2RlJyBzbyBpdCBjb3VsZG4ndCBoYXZlIGJlZW5cbitcdCAqIHJlbW92ZWQgZnJvbSBzX2lub2RlcyBsaXN0IHdoaWxlIHdlIGRyb3BwZWQgdGhlXG4rXHQgKiBzX2lub2RlX2xpc3RfbG9jay5cbitcdCAqL1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdGJkZXYgPSBJX0JERVYoaW5vZGUpO1xuK1xuK1x0bXV0ZXhfbG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4rXHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbitcdFx0OyAvKiBza2lwICovXG4rXHR9IGVsc2UgaWYgKHdhaXQpIHtcbiBcdFx0Lypcbi1cdFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxuLVx0XHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxuLVx0XHQgKiBzX2lub2RlX2xpc3RfbG9jayAgV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW5cbi1cdFx0ICogYmUgaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcbi1cdFx0ICogbGF0ZXIuXG4rXHRcdCAqIFdlIGtlZXAgdGhlIGVycm9yIHN0YXR1cyBvZiBpbmRpdmlkdWFsIG1hcHBpbmcgc29cbitcdFx0ICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmdcbitcdFx0ICogZnN5bmMoMikuIFNlZSBmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycygpIGZvclxuK1x0XHQgKiBkZXRhaWxzLlxuIFx0XHQgKi9cbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0YmRldiA9IElfQkRFVihpbm9kZSk7XG4tXG4tXHRcdG11dGV4X2xvY2soXHUwMDI2YmRldi1cdTAwM2ViZF9kaXNrLVx1MDAzZW9wZW5fbXV0ZXgpO1xuLVx0XHRpZiAoIWF0b21pY19yZWFkKFx1MDAyNmJkZXYtXHUwMDNlYmRfb3BlbmVycykpIHtcbi1cdFx0XHQ7IC8qIHNraXAgKi9cbi1cdFx0fSBlbHNlIGlmICh3YWl0KSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBXZSBrZWVwIHRoZSBlcnJvciBzdGF0dXMgb2YgaW5kaXZpZHVhbCBtYXBwaW5nIHNvXG4tXHRcdFx0ICogdGhhdCBhcHBsaWNhdGlvbnMgY2FuIGNhdGNoIHRoZSB3cml0ZWJhY2sgZXJyb3IgdXNpbmdcbi1cdFx0XHQgKiBmc3luYygyKS4gU2VlIGZpbGVtYXBfZmRhdGF3YWl0X2tlZXBfZXJyb3JzKCkgZm9yXG4tXHRcdFx0ICogZGV0YWlscy5cbi1cdFx0XHQgKi9cbi1cdFx0XHRmaWxlbWFwX2ZkYXRhd2FpdF9rZWVwX2Vycm9ycyhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuLVx0XHR9XG4tXHRcdG11dGV4X3VubG9jayhcdTAwMjZiZGV2LVx1MDAzZWJkX2Rpc2stXHUwMDNlb3Blbl9tdXRleCk7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZibG9ja2Rldl9zdXBlcmJsb2NrLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0ZmlsZW1hcF9mZGF0YXdhaXRfa2VlcF9lcnJvcnMoaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbitcdH0gZWxzZSB7XG4rXHRcdGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIFx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4rXHRtdXRleF91bmxvY2soXHUwMDI2YmRldi1cdTAwM2ViZF9kaXNrLVx1MDAzZW9wZW5fbXV0ZXgpO1xuK1x0aXB1dChpbm9kZSk7XG4rXG4rXHRzcGluX2xvY2soXHUwMDI2YmxvY2tkZXZfc3VwZXJibG9jay1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rdm9pZCBzeW5jX2JkZXZzKGJvb2wgd2FpdClcbit7XG4rXHRzYl9mb3JfZWFjaF9pbm9kZXMoYmxvY2tkZXZfc3VwZXJibG9jaywgSU5PREVfSVRFUl9OT1JNQUwsXG4rXHRcdFx0ICAgc3luY19iZGV2c19pbm9kZV9pdGVyX2NiLCAodm9pZCAqKXdhaXQpO1xuIH1cbiBcbiAvKlxuZGlmZiAtLWdpdCBhL2ZzL2Ryb3BfY2FjaGVzLmMgYi9mcy9kcm9wX2NhY2hlcy5jXG5pbmRleCA0OWY1NmE1OThlY2JjLi4wZDQ3NWE1ZmY4Y2ZiIDEwMDY0NFxuLS0tIGEvZnMvZHJvcF9jYWNoZXMuY1xuKysrIGIvZnMvZHJvcF9jYWNoZXMuY1xuQEAgLTE2LDM2ICsxNiwzMCBAQFxuIC8qIEEgZ2xvYmFsIHZhcmlhYmxlIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBrZWVwcyB0aGUgY29kZSBzaW1wbGUgKi9cbiBzdGF0aWMgaW50IHN5c2N0bF9kcm9wX2NhY2hlcztcbiBcbi1zdGF0aWMgdm9pZCBkcm9wX3BhZ2VjYWNoZV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICp1bnVzZWQpXG4rc3RhdGljIGludCBkcm9wX3BhZ2VjYWNoZV9pbm9kZV9pdGVyX2NiKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKnVudXNlZClcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqdG9wdXRfaW5vZGUgPSBOVUxMO1xuK1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgbXVzdCBza2lwIGlub2RlcyBpbiB1bnVzdWFsIHN0YXRlLiBXZSBtYXkgYWxzbyBza2lwXG4tXHRcdCAqIGlub2RlcyB3aXRob3V0IHBhZ2VzIGJ1dCB3ZSBkZWxpYmVyYXRlbHkgd29uJ3QgaW4gY2FzZVxuLVx0XHQgKiB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgdG8gYXZvaWQgc29mdGxvY2t1cHMuXG4tXHRcdCAqL1xuLVx0XHRpZiAoKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHx8XG4tXHRcdCAgICAobWFwcGluZ19lbXB0eShpbm9kZS1cdTAwM2VpX21hcHBpbmcpIFx1MDAyNlx1MDAyNiAhbmVlZF9yZXNjaGVkKCkpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHRfX2lnZXQoaW5vZGUpO1xuK1x0aWYgKG1hcHBpbmdfZW1wdHkoaW5vZGUtXHUwMDNlaV9tYXBwaW5nKSkge1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXG4tXHRcdGludmFsaWRhdGVfbWFwcGluZ19wYWdlcyhpbm9kZS1cdTAwM2VpX21hcHBpbmcsIDAsIC0xKTtcbi1cdFx0aXB1dCh0b3B1dF9pbm9kZSk7XG4tXHRcdHRvcHV0X2lub2RlID0gaW5vZGU7XG4tXG4tXHRcdGNvbmRfcmVzY2hlZCgpO1xuLVx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbiBcdH1cbitcbitcdF9faWdldChpbm9kZSk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0aXB1dCh0b3B1dF9pbm9kZSk7XG4rXG4rXHRpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoaW5vZGUtXHUwMDNlaV9tYXBwaW5nLCAwLCAtMSk7XG4rXHRpcHV0KGlub2RlKTtcbitcbitcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgZHJvcF9wYWdlY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdW51c2VkKVxuK3tcbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgSU5PREVfSVRFUl9OT1JNQUwsIGRyb3BfcGFnZWNhY2hlX2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgaW50IGRyb3BfY2FjaGVzX3N5c2N0bF9oYW5kbGVyKGNvbnN0IHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsXG5kaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuaW5kZXggNzE4ZTBkYTdkZmNlMC4uYWNkYmY5Y2E0NGEzZiAxMDA2NDRcbi0tLSBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jXG4rKysgYi9mcy9nZnMyL29wc19mc3R5cGUuY1xuQEAgLTk5Niw3ICs5OTYsNyBAQCBzdGF0aWMgaW50IGdmczJfbG1fbW91bnQoc3RydWN0IGdmczJfc2JkICpzZHAsIGludCBzaWxlbnQpXG4gXHRcdHN3aXRjaCAodG9rZW4pIHtcbiBcdFx0Y2FzZSBPcHRfamlkOlxuIFx0XHRcdHJldCA9IG1hdGNoX2ludChcdTAwMjZ0bXBbMF0sIFx1MDAyNm9wdGlvbik7XG4tXHRcdFx0aWYgKHJldCB8fCBvcHRpb24gXHUwMDNjIDApIFxuK1x0XHRcdGlmIChyZXQgfHwgb3B0aW9uIFx1MDAzYyAwKVxuIFx0XHRcdFx0Z290byBob3N0ZGF0YV9lcnJvcjtcbiBcdFx0XHRpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNERl9OT0pPVVJOQUxJRCwgXHUwMDI2c2RwLVx1MDAzZXNkX2ZsYWdzKSlcbiBcdFx0XHRcdGxzLVx1MDAzZWxzX2ppZCA9IG9wdGlvbjtcbkBAIC0xNzE5LDYgKzE3MTksMTkgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiBcdHJldHVybiAwO1xuIH1cbiBcbitzdGF0aWMgaW50IGdmczJfZXZpY3RfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICp1bnVzZWQpXG4re1xuK1x0c3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLVx1MDAzZWlfc2I7XG4rXG4rXHRfX2lnZXQoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcbitcdGlwdXQoaW5vZGUpO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKipcbiAgKiBnZnMyX2V2aWN0X2lub2RlcyAtIGV2aWN0IGlub2RlcyBjb29wZXJhdGl2ZWx5XG4gICogQHNiOiB0aGUgc3VwZXJibG9ja1xuQEAgLTE3NDEsMzEgKzE3NTQsMTAgQEAgc3RhdGljIGludCBnZnMyX21ldGFfaW5pdF9mc19jb250ZXh0KHN0cnVjdCBmc19jb250ZXh0ICpmYylcbiAgKi9cbiBzdGF0aWMgdm9pZCBnZnMyX2V2aWN0X2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICp0b3B1dF9pbm9kZSA9IE5VTEw7XG4gXHRzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLVx1MDAzZXNfZnNfaW5mbztcbiBcbiBcdHNldF9iaXQoU0RGX0VWSUNUSU5HLCBcdTAwMjZzZHAtXHUwMDNlc2RfZmxhZ3MpO1xuLVxuLVx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdGxpc3RfZm9yX2VhY2hfZW50cnkoaW5vZGUsIFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzLCBpX3NiX2xpc3QpIHtcbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmICgoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2IChJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSB8IElfTkVXKSkgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICAhbmVlZF9yZXNjaGVkKCkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdF9faWdldChpbm9kZSk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbi1cdFx0aXB1dCh0b3B1dF9pbm9kZSk7XG4tXHRcdHRvcHV0X2lub2RlID0gaW5vZGU7XG4tXG4tXHRcdGNvbmRfcmVzY2hlZCgpO1xuLVx0XHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0aXB1dCh0b3B1dF9pbm9kZSk7XG4rXHRzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLCBnZnMyX2V2aWN0X2lub2RlX2l0ZXJfY2IsIE5VTEwpO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBnZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuY1xuaW5kZXggYmE3ZGEzOWJlNGEzMS4uMDdhNWY0ODY0MWFmOCAxMDA2NDRcbi0tLSBhL2ZzL2lub2RlLmNcbisrKyBiL2ZzL2lub2RlLmNcbkBAIC02OSw2ICs2OSwxNSBAQCBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGVtcHR5X2FvcHMgPSB7XG4gfTtcbiBFWFBPUlRfU1lNQk9MKGVtcHR5X2FvcHMpO1xuIFxuK3N0cnVjdCBpbm9kZV9pdGVyIHtcbitcdHN0cnVjdCBsaXN0X2hlYWRcdGl0ZXJzX25vZGU7XHQvKiBzYi1cdTAwM2VzX2lub2Rlc19pdGVycyAqL1xuK1x0c3RydWN0IGxpc3RfaGVhZFx0Km5leHQ7XHRcdC8qIG5leHQgbm9kZSBnb2luZyB0byBpdGVyYXRlICovXG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3M7XG4rXHRpbm9kZV9pdGVyX2NiIGZ1bmM7XG4rXHR2b2lkICpkYXRhO1xuK1x0aW50IHJldDtcbit9O1xuK1xuIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBucl9pbm9kZXMpO1xuIHN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBucl91bnVzZWQpO1xuIFxuQEAgLTY0MSwxMiArNjUwLDk2IEBAIHZvaWQgaW5vZGVfc2JfbGlzdF9hZGQoc3RydWN0IGlub2RlICppbm9kZSlcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwoaW5vZGVfc2JfbGlzdF9hZGQpO1xuIFxuK3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfc3RhcnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlX2l0ZXIgKml0LFxuK1x0XHRcdFx0dW5zaWduZWQgaW50IGZsYWdzLCBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKVxuK3tcbitcdGl0LVx1MDAzZWZsYWdzID0gZmxhZ3M7XG4rXHRpdC1cdTAwM2VmdW5jID0gZm47XG4rXHRpdC1cdTAwM2VkYXRhID0gZGF0YTtcbitcdGl0LVx1MDAzZXJldCA9IDA7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0aXQtXHUwMDNlbmV4dCA9IHNiLVx1MDAzZXNfaW5vZGVzLm5leHQ7XG4rXHRsaXN0X2FkZChcdTAwMjZpdC1cdTAwM2VpdGVyc19ub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2Rlc19pdGVycyk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIGlub2RlX3NiX2l0ZXJfZW5kKHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbit7XG4rXHRsaXN0X2RlbChcdTAwMjZpdC1cdTAwM2VpdGVyc19ub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbit9XG4rXG4rc3RhdGljIGJvb2wgaW5vZGVfc2JfaXRlcl9uZXh0KHN0cnVjdCBpbm9kZV9pdGVyICppdCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbit7XG4rXHRzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDtcbitcdGludCByZXQ7XG4rXG4rXHR3aGlsZSAoIWlub2RlIFx1MDAyNlx1MDAyNiBpdC1cdTAwM2VuZXh0ICE9IFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVzKSB7XG4rXHRcdGlub2RlID0gbGlzdF9lbnRyeShpdC1cdTAwM2VuZXh0LCBzdHJ1Y3QgaW5vZGUsIGlfc2JfbGlzdCk7XG4rXHRcdGlmIChpdC1cdTAwM2VmbGFncyBcdTAwMjYgSU5PREVfSVRFUl9VTlVTRUQpIHtcbitcdFx0XHRpZiAoaWNvdW50X3JlYWRfb25jZShpbm9kZSkpIHtcbitcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdFx0aWYgKGljb3VudF9yZWFkKGlub2RlKSkge1xuK1x0XHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0XHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdFx0XHRjb250aW51ZTtcbitcdFx0XHR9XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRcdH1cbitcbitcdFx0aWYgKChpdC1cdTAwM2VmbGFncyBcdTAwMjYgSU5PREVfSVRFUl9OT1JNQUwpIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgKGlub2RlX3N0YXRlX3JlYWQoaW5vZGUpIFx1MDAyNiAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7XG4rXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaXQtXHUwMDNlbmV4dC1cdTAwM2VuZXh0O1xuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHR9XG4rXG4rXHRcdGl0LVx1MDAzZW5leHQgPSBpdC1cdTAwM2VuZXh0LVx1MDAzZW5leHQ7XG4rXHRcdHJldCA9IGl0LVx1MDAzZWZ1bmMoaW5vZGUsIGl0LVx1MDAzZWRhdGEpO1xuK1x0XHRpZiAocmV0KSB7XG4rXHRcdFx0aXQtXHUwMDNlcmV0ID0gcmV0O1xuK1x0XHRcdHJldHVybiBmYWxzZTtcbitcdFx0fVxuK1xuK1x0XHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcbitcdFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4rXHRcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0fVxuK1x0fVxuK1xuK1x0cmV0dXJuIGl0LVx1MDAzZW5leHQgPT0gXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMgPyBmYWxzZSA6IHRydWU7XG4rfVxuK1xuK2ludCBzYl9mb3JfZWFjaF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGZsYWdzLFxuK1x0XHQgICAgICAgaW5vZGVfaXRlcl9jYiBmbiwgdm9pZCAqZGF0YSlcbit7XG4rXHRzdHJ1Y3QgaW5vZGVfaXRlciBpdDtcbitcbitcdGlub2RlX3NiX2l0ZXJfc3RhcnQoc2IsIFx1MDAyNml0LCBmbGFncywgZm4sIGRhdGEpO1xuK1x0d2hpbGUgKGlub2RlX3NiX2l0ZXJfbmV4dChcdTAwMjZpdCwgc2IpKVxuK1x0XHQ7XG4rXHRpbm9kZV9zYl9pdGVyX2VuZChcdTAwMjZpdCwgc2IpO1xuK1xuK1x0cmV0dXJuIGl0LnJldDtcbit9XG4rRVhQT1JUX1NZTUJPTChzYl9mb3JfZWFjaF9pbm9kZXMpO1xuK1xuIHN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9zYl9saXN0X2RlbChzdHJ1Y3QgaW5vZGUgKmlub2RlKVxuIHtcbiBcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuK1x0c3RydWN0IGlub2RlX2l0ZXIgKml0O1xuIFxuIFx0aWYgKCFsaXN0X2VtcHR5KFx1MDAyNmlub2RlLVx1MDAzZWlfc2JfbGlzdCkpIHtcbiBcdFx0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdFx0bGlzdF9mb3JfZWFjaF9lbnRyeShpdCwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXNfaXRlcnMsIGl0ZXJzX25vZGUpIHtcbitcdFx0XHRpZiAoaXQtXHUwMDNlbmV4dCA9PSBcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpXG4rXHRcdFx0XHRpdC1cdTAwM2VuZXh0ID0gaW5vZGUtXHUwMDNlaV9zYl9saXN0Lm5leHQ7XG4rXHRcdH1cbiBcdFx0bGlzdF9kZWxfaW5pdChcdTAwMjZpbm9kZS1cdTAwM2VpX3NiX2xpc3QpO1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXHR9XG5AQCAtODY2LDYgKzk1OSwxNyBAQCBzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZClcbiBcdH1cbiB9XG4gXG4rc3RhdGljIGludCBldmljdF9pbm9kZXNfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuK3tcbitcdHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UgPSAoc3RydWN0IGxpc3RfaGVhZCAqKWRhdGE7XG4rXG4rXHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XG4rXHRpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdGxpc3RfYWRkKFx1MDAyNmlub2RlLVx1MDAzZWlfbHJ1LCBkaXNwb3NlKTtcbitcdHJldHVybiAwO1xuK31cbitcbiAvKipcbiAgKiBldmljdF9pbm9kZXNcdC0gZXZpY3QgYWxsIGV2aWN0YWJsZSBpbm9kZXMgZm9yIGEgc3VwZXJibG9ja1xuICAqIEBzYjpcdFx0c3VwZXJibG9jayB0byBvcGVyYXRlIG9uXG5AQCAtODc3LDQ0ICs5ODEsMTAgQEAgc3RhdGljIHZvaWQgZGlzcG9zZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpXG4gICovXG4gdm9pZCBldmljdF9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYilcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0TElTVF9IRUFEKGRpc3Bvc2UpO1xuK1x0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUwgfCBJTk9ERV9JVEVSX1VOVVNFRDtcbiBcbi1hZ2Fpbjpcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdGlmIChpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcbi1cdFx0XHRjb250aW51ZTtcbi1cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGlmIChpY291bnRfcmVhZChpbm9kZSkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4tXHRcdGlmIChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfTkVXIHwgSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUpKSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVxuLVx0XHRpbm9kZV9zdGF0ZV9zZXQoaW5vZGUsIElfRlJFRUlORyk7XG4tXHRcdGlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7XG4tXHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdGxpc3RfYWRkKFx1MDAyNmlub2RlLVx1MDAzZWlfbHJ1LCBcdTAwMjZkaXNwb3NlKTtcbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgY2FuIGhhdmUgYSB0b24gb2YgaW5vZGVzIHRvIGV2aWN0IGF0IHVubW91bnQgdGltZSBnaXZlblxuLVx0XHQgKiBlbm91Z2ggbWVtb3J5LCBjaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byBnbyB0byBzbGVlcCBmb3IgYVxuLVx0XHQgKiBiaXQgc28gd2UgZG9uJ3QgbGl2ZWxvY2suXG4tXHRcdCAqL1xuLVx0XHRpZiAobmVlZF9yZXNjaGVkKCkpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRcdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdFx0ZGlzcG9zZV9saXN0KFx1MDAyNmRpc3Bvc2UpO1xuLVx0XHRcdGdvdG8gYWdhaW47XG4tXHRcdH1cbi1cdH1cbi1cdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cbitcdHNiX2Zvcl9lYWNoX2lub2RlcyhzYiwgZmxhZ3MsIGV2aWN0X2lub2Rlc19pbm9kZV9pdGVyX2NiLCBcdTAwMjZkaXNwb3NlKTtcbiBcdGRpc3Bvc2VfbGlzdChcdTAwMjZkaXNwb3NlKTtcbiB9XG4gRVhQT1JUX1NZTUJPTF9HUEwoZXZpY3RfaW5vZGVzKTtcbmRpZmYgLS1naXQgYS9mcy9xdW90YS9kcXVvdC5jIGIvZnMvcXVvdGEvZHF1b3QuY1xuaW5kZXggMjA0YWZjNWU5ODRiYy4uNzdjNjgxNDlkNGFlNCAxMDA2NDRcbi0tLSBhL2ZzL3F1b3RhL2RxdW90LmNcbisrKyBiL2ZzL3F1b3RhL2RxdW90LmNcbkBAIC0xMDQzLDY0ICsxMDQzLDQ4IEBAIHN0YXRpYyBpbnQgZHFpbml0X25lZWRlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSlcbiBcdHJldHVybiAwO1xuIH1cbiBcbi0vKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBzX3Vtb3VudCBzZW1hcGhvcmUgKi9cbi1zdGF0aWMgaW50IGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpXG4rc3RhdGljIGludCBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSlcbiB7XG4tXHRzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqb2xkX2lub2RlID0gTlVMTDtcbitcdGludCB0eXBlID0gKihpbnQgKilkYXRhO1xuK1x0aW50IGVyciA9IDA7XG4rXHRzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtXHUwMDNlaV9zYjtcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXG4gXHRpbnQgcmVzZXJ2ZWQgPSAwO1xuICNlbmRpZlxuLVx0aW50IGVyciA9IDA7XG4gXG4tXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuLVx0bGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgXHUwMDI2c2ItXHUwMDNlc19pbm9kZXMsIGlfc2JfbGlzdCkge1xuLVx0XHRzcGluX2xvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0aWYgKChpbm9kZV9zdGF0ZV9yZWFkKGlub2RlKSBcdTAwMjYgKElfRlJFRUlORyB8IElfV0lMTF9GUkVFIHwgSV9ORVcpKSB8fFxuLVx0XHQgICAgIWF0b21pY19yZWFkKFx1MDAyNmlub2RlLVx1MDAzZWlfd3JpdGVjb3VudCkgfHxcbi1cdFx0ICAgICFkcWluaXRfbmVlZGVkKGlub2RlLCB0eXBlKSkge1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4tXHRcdFx0Y29udGludWU7XG4tXHRcdH1cbi1cdFx0X19pZ2V0KGlub2RlKTtcbitcdGlmICghYXRvbWljX3JlYWQoXHUwMDI2aW5vZGUtXHUwMDNlaV93cml0ZWNvdW50KSB8fFxuK1x0ICAgICFkcWluaXRfbmVlZGVkKGlub2RlLCB0eXBlKSkge1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4gXG4gI2lmZGVmIENPTkZJR19RVU9UQV9ERUJVR1xuLVx0XHRpZiAodW5saWtlbHkoaW5vZGVfZ2V0X3Jzdl9zcGFjZShpbm9kZSkgXHUwMDNlIDApKVxuLVx0XHRcdHJlc2VydmVkID0gMTtcbitcdGlmICh1bmxpa2VseShpbm9kZV9nZXRfcnN2X3NwYWNlKGlub2RlKSBcdTAwM2UgMCkpXG4rXHRcdHJlc2VydmVkID0gMTtcbiAjZW5kaWZcbi1cdFx0aXB1dChvbGRfaW5vZGUpO1xuLVx0XHRlcnIgPSBfX2RxdW90X2luaXRpYWxpemUoaW5vZGUsIHR5cGUpO1xuLVx0XHRpZiAoZXJyKSB7XG4tXHRcdFx0aXB1dChpbm9kZSk7XG4tXHRcdFx0Z290byBvdXQ7XG4tXHRcdH1cbi1cbi1cdFx0Lypcbi1cdFx0ICogV2UgaG9sZCBhIHJlZmVyZW5jZSB0byAnaW5vZGUnIHNvIGl0IGNvdWxkbid0IGhhdmUgYmVlblxuLVx0XHQgKiByZW1vdmVkIGZyb20gc19pbm9kZXMgbGlzdCB3aGlsZSB3ZSBkcm9wcGVkIHRoZVxuLVx0XHQgKiBzX2lub2RlX2xpc3RfbG9jay4gV2UgY2Fubm90IGlwdXQgdGhlIGlub2RlIG5vdyBhcyB3ZSBjYW4gYmVcbi1cdFx0ICogaG9sZGluZyB0aGUgbGFzdCByZWZlcmVuY2UgYW5kIHdlIGNhbm5vdCBpcHV0IGl0IHVuZGVyXG4tXHRcdCAqIHNfaW5vZGVfbGlzdF9sb2NrLiBTbyB3ZSBrZWVwIHRoZSByZWZlcmVuY2UgYW5kIGlwdXQgaXRcbi1cdFx0ICogbGF0ZXIuXG4tXHRcdCAqL1xuLVx0XHRvbGRfaW5vZGUgPSBpbm9kZTtcbi1cdFx0Y29uZF9yZXNjaGVkKCk7XG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHR9XG4tXHRzcGluX3VubG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRpcHV0KG9sZF9pbm9kZSk7XG4tb3V0OlxuK1x0ZXJyID0gX19kcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTtcbiAjaWZkZWYgQ09ORklHX1FVT1RBX0RFQlVHXG4tXHRpZiAocmVzZXJ2ZWQpIHtcbi1cdFx0cXVvdGFfZXJyb3Ioc2IsIFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIG9uIFwiXG4tXHRcdFx0XCJ0aHVzIHF1b3RhIGluZm9ybWF0aW9uIGlzIHByb2JhYmx5IGluY29uc2lzdGVudC4gXCJcbi1cdFx0XHRcIlBsZWFzZSBydW4gcXVvdGFjaGVjayg4KVwiKTtcbi1cdH1cbitcdGlmIChyZXNlcnZlZClcbitcdFx0cXVvdGFfZXJyb3Ioc2IsIFwiV3JpdGVzIGhhcHBlbmVkIGJlZm9yZSBxdW90YSB3YXMgdHVybmVkIFwiXG4rXHRcdFx0ICAgIFwib24gdGh1cyBxdW90YSBpbmZvcm1hdGlvbiBpcyBwcm9iYWJseSBcIlxuK1x0XHRcdCAgICBcImluY29uc2lzdGVudC4gUGxlYXNlIHJ1biBxdW90YWNoZWNrKDgpXCIpO1xuICNlbmRpZlxuK1x0aXB1dChpbm9kZSk7XG4rXHRzcGluX2xvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG4rLyogVGhpcyByb3V0aW5lIGlzIGd1YXJkZWQgYnkgc191bW91bnQgc2VtYXBob3JlICovXG4rc3RhdGljIGludCBhZGRfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuK3tcbitcdHJldHVybiBzYl9mb3JfZWFjaF9pbm9kZXMoc2IsIElOT0RFX0lURVJfTk9STUFMLFxuK1x0XHRcdFx0ICBhZGRfZHF1b3RfcmVmX2lub2RlX2l0ZXJfY2IsIFx1MDAyNnR5cGUpO1xuK31cbitcbiBzdGF0aWMgdm9pZCByZW1vdmVfZHF1b3RfcmVmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKVxuIHtcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG5kaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmNcbmluZGV4IDA1ZTQ0MzE3MzAzODcuLjNlMDY5MTUwYzU0NDUgMTAwNjQ0XG4tLS0gYS9mcy9zdXBlci5jXG4rKysgYi9mcy9zdXBlci5jXG5AQCAtMzgyLDYgKzM4Miw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmFsbG9jX3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBpbnQgZmxhZ3MsXG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfcm9vdHNfbG9jayk7XG4gXHRtdXRleF9pbml0KFx1MDAyNnMtXHUwMDNlc19zeW5jX2xvY2spO1xuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlcyk7XG4rXHRJTklUX0xJU1RfSEVBRChcdTAwMjZzLVx1MDAzZXNfaW5vZGVzX2l0ZXJzKTtcbiBcdHNwaW5fbG9ja19pbml0KFx1MDAyNnMtXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuIFx0SU5JVF9MSVNUX0hFQUQoXHUwMDI2cy1cdTAwM2VzX2lub2Rlc193Yik7XG4gXHRzcGluX2xvY2tfaW5pdChcdTAwMjZzLVx1MDAzZXNfaW5vZGVfd2JsaXN0X2xvY2spO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaFxuaW5kZXggZjlkMWUwNWU4YWU2OC4uZjMxNzZhYjEwZTY1ZiAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnMuaFxuKysrIGIvaW5jbHVkZS9saW51eC9mcy5oXG5AQCAtMjk2LDcgKzI5Niw3IEBAIHN0cnVjdCBpYXR0ciB7XG4gICovXG4gI2RlZmluZSBGSUxFU1lTVEVNX01BWF9TVEFDS19ERVBUSCAyXG4gXG4tLyoqIFxuKy8qKlxuICAqIGVudW0gcG9zaXRpdmVfYW9wX3JldHVybnMgLSBhb3AgcmV0dXJuIGNvZGVzIHdpdGggc3BlY2lmaWMgc2VtYW50aWNzXG4gICpcbiAgKiBAQU9QX1dSSVRFUEFHRV9BQ1RJVkFURTogSW5mb3JtcyB0aGUgY2FsbGVyIHRoYXQgcGFnZSB3cml0ZWJhY2sgaGFzXG5AQCAtMzA2LDcgKzMwNiw3IEBAIHN0cnVjdCBpYXR0ciB7XG4gICogXHRcdFx0ICAgIGJlIGEgY2FuZGlkYXRlIGZvciB3cml0ZWJhY2sgYWdhaW4gaW4gdGhlIG5lYXJcbiAgKiBcdFx0XHQgICAgZnV0dXJlLiAgT3RoZXIgY2FsbGVycyBtdXN0IGJlIGNhcmVmdWwgdG8gdW5sb2NrXG4gICogXHRcdFx0ICAgIHRoZSBwYWdlIGlmIHRoZXkgZ2V0IHRoaXMgcmV0dXJuLiAgUmV0dXJuZWQgYnlcbi0gKiBcdFx0XHQgICAgd3JpdGVwYWdlKCk7IFxuKyAqXHRcdFx0ICAgIHdyaXRlcGFnZSgpO1xuICAqXG4gICogQEFPUF9UUlVOQ0FURURfUEFHRTogVGhlIEFPUCBtZXRob2QgdGhhdCB3YXMgaGFuZGVkIGEgbG9ja2VkIHBhZ2UgaGFzXG4gICogIFx0XHRcdHVubG9ja2VkIGl0IGFuZCB0aGUgcGFnZSBtaWdodCBoYXZlIGJlZW4gdHJ1bmNhdGVkLlxuQEAgLTg3MCw2ICs4NzAsMjEgQEAgc3RydWN0IGlub2RlIHtcbiBcdHZvaWRcdFx0XHQqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovXG4gfSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XG4gXG4rZW51bSBpbm9kZV9pdGVyX2ZsYWdzX2VudW0ge1xuK1x0SU5PREVfSVRFUl9OT1JNQUwgPSAoMVUgXHUwMDNjXHUwMDNjIDEpLCAgLyogRXhjbHVkZSBpbm9kZXMgd2l0aCAoSV9ORVcgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkuICovXG4rXHRJTk9ERV9JVEVSX1VOVVNFRCA9ICgxVSBcdTAwM2NcdTAwM2MgMiksICAvKiBPbmx5IHJldHVybiBpbm9kZXMgd2l0aCAoaV9jb3VudCA9PSAwKS4gKi9cbit9O1xuK1xuKy8qXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICAgICAgICAgIGVuZFxuKyAqICBpbm9kZS1cdTAwM2VpX2xvY2sgICAgICAgICAgICAgIGxvY2tlZCAgICAgICAgIHVubG9ja2VkXG4rICogIHNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrICAgICAgbG9ja2VkICAgICAgICAgbG9ja2VkXG4rICovXG4rdHlwZWRlZiBpbnQgKCppbm9kZV9pdGVyX2NiKSAoc3RydWN0IGlub2RlICosIHZvaWQgKik7XG4rXG4raW50IHNiX2Zvcl9lYWNoX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXG4rXHRcdCAgICAgICBpbm9kZV9pdGVyX2NiIGZuLCB2b2lkICpkYXRhKTtcbitcbiAvKlxuICAqIGlfc3RhdGUgaGFuZGxpbmdcbiAgKlxuQEAgLTEzMTUsOCArMTMzMCwxMCBAQCBzdHJ1Y3QgZmlsZSAqZ2V0X2ZpbGVfYWN0aXZlKHN0cnVjdCBmaWxlICoqZik7XG4gXG4gI2RlZmluZVx0TUFYX05PTl9MRlNcdCgoMVVMXHUwMDNjXHUwMDNjMzEpIC0gMSlcbiBcbi0vKiBQYWdlIGNhY2hlIGxpbWl0LiBUaGUgZmlsZXN5c3RlbXMgc2hvdWxkIHB1dCB0aGF0IGludG8gdGhlaXIgc19tYXhieXRlcyBcbi0gICBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uICovIFxuKy8qXG4rICogUGFnZSBjYWNoZSBsaW1pdC4gVGhlIGZpbGVzeXN0ZW1zIHNob3VsZCBwdXQgdGhhdCBpbnRvIHRoZWlyIHNfbWF4Ynl0ZXNcbisgKiBsaW1pdHMsIG90aGVyd2lzZSBiYWQgdGhpbmdzIGNhbiBoYXBwZW4gaW4gVk0uXG4rICovXG4gI2lmIEJJVFNfUEVSX0xPTkc9PTMyXG4gI2RlZmluZSBNQVhfTEZTX0ZJTEVTSVpFXHQoKGxvZmZfdClVTE9OR19NQVggXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQpXG4gI2VsaWYgQklUU19QRVJfTE9ORz09NjRcbkBAIC0yMjg1LDcgKzIzMDIsNyBAQCBpbnQgc3luY19pbm9kZV9tZXRhZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCk7XG4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUge1xuIFx0Y29uc3QgY2hhciAqbmFtZTtcbiBcdGludCBmc19mbGFncztcbi0jZGVmaW5lIEZTX1JFUVVJUkVTX0RFVlx0XHQxIFxuKyNkZWZpbmUgRlNfUkVRVUlSRVNfREVWXHRcdDFcbiAjZGVmaW5lIEZTX0JJTkFSWV9NT1VOVERBVEFcdDJcbiAjZGVmaW5lIEZTX0hBU19TVUJUWVBFXHRcdDRcbiAjZGVmaW5lIEZTX1VTRVJOU19NT1VOVFx0XHQ4XHQvKiBDYW4gYmUgbW91bnRlZCBieSB1c2VybnMgcm9vdCAqL1xuQEAgLTI5MDcsNyArMjkyNCw3IEBAIHNzaXplX3QgX19rZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKTtcbiBleHRlcm4gc3NpemVfdCBrZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGxvZmZfdCAqKTtcbiBleHRlcm4gc3NpemVfdCBfX2tlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgbG9mZl90ICopO1xuIGV4dGVybiBzdHJ1Y3QgZmlsZSAqIG9wZW5fZXhlYyhjb25zdCBjaGFyICopO1xuLSBcbitcbiAvKiBmcy9kY2FjaGUuYyAtLSBnZW5lcmljIGZzIHN1cHBvcnQgZnVuY3Rpb25zICovXG4gZXh0ZXJuIGJvb2wgaXNfc3ViZGlyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGRlbnRyeSAqKTtcbiBleHRlcm4gYm9vbCBwYXRoX2lzX3VuZGVyKGNvbnN0IHN0cnVjdCBwYXRoICosIGNvbnN0IHN0cnVjdCBwYXRoICopO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuaW5kZXggZWNkOTZhZWIxY2VlNy4uMWY4MWNjMjE5YjhlZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvZnMvc3VwZXJfdHlwZXMuaFxuKysrIGIvaW5jbHVkZS9saW51eC9mcy9zdXBlcl90eXBlcy5oXG5AQCAtMjY5LDkgKzI2OSwxMCBAQCBzdHJ1Y3Qgc3VwZXJfYmxvY2sge1xuIFx0ICovXG4gXHRpbnQgc19zdGFja19kZXB0aDtcbiBcbi1cdC8qIHNfaW5vZGVfbGlzdF9sb2NrIHByb3RlY3RzIHNfaW5vZGVzICovXG4rXHQvKiBzX2lub2RlX2xpc3RfbG9jayBwcm90ZWN0cyBzX2lub2RlcyBhbmQgc19pbm9kZXNfaXRlcnMgKi9cbiBcdHNwaW5sb2NrX3RcdFx0XHRcdHNfaW5vZGVfbGlzdF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXM7XHQvKiBhbGwgaW5vZGVzICovXG4rXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfaXRlcnM7IC8qIGFsbCBpdGVyYXRvcnMgKi9cbiBcbiBcdHNwaW5sb2NrX3RcdFx0XHRcdHNfaW5vZGVfd2JsaXN0X2xvY2s7XG4gXHRzdHJ1Y3QgbGlzdF9oZWFkXHRcdFx0c19pbm9kZXNfd2I7XHQvKiB3cml0ZWJhY2sgaW5vZGVzICovXG5kaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbGFuZGxvY2svZnMuYyBiL3NlY3VyaXR5L2xhbmRsb2NrL2ZzLmNcbmluZGV4IDMwYWE2Y2UxMzU5MGEuLjNkY2RlOGNiZmI2YWYgMTAwNjQ0XG4tLS0gYS9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG4rKysgYi9zZWN1cml0eS9sYW5kbG9jay9mcy5jXG5AQCAtMTM2OSwxMTAgKzEzNjksODAgQEAgc3RhdGljIHZvaWQgaG9va19pbm9kZV9mcmVlX3NlY3VyaXR5X3JjdSh2b2lkICppbm9kZV9zZWN1cml0eSlcbiBcbiAvKiBTdXBlci1ibG9jayBob29rcyAqL1xuIFxuLS8qXG4tICogUmVsZWFzZSB0aGUgaW5vZGVzIHVzZWQgaW4gYSBzZWN1cml0eSBwb2xpY3kuXG4tICpcbi0gKiBDZi4gZnNub3RpZnlfdW5tb3VudF9pbm9kZXMoKSBhbmQgZXZpY3RfaW5vZGVzKClcbi0gKi9cbi1zdGF0aWMgdm9pZCBob29rX3NiX2RlbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbnN0IHNiKVxuK3N0YXRpYyBpbnQgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKVxuIHtcbi1cdHN0cnVjdCBpbm9kZSAqaW5vZGUsICpwcmV2X2lub2RlID0gTlVMTDtcbitcdHN0cnVjdCBsYW5kbG9ja19vYmplY3QgKm9iamVjdDtcbitcdHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS1cdTAwM2VpX3NiO1xuIFxuLVx0aWYgKCFsYW5kbG9ja19pbml0aWFsaXplZClcbi1cdFx0cmV0dXJuO1xuK1x0aWYgKCFhdG9taWNfcmVhZChcdTAwMjZpbm9kZS1cdTAwM2VpX2NvdW50KSkge1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbiBcbi1cdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRsaXN0X2Zvcl9lYWNoX2VudHJ5KGlub2RlLCBcdTAwMjZzYi1cdTAwM2VzX2lub2RlcywgaV9zYl9saXN0KSB7XG4tXHRcdHN0cnVjdCBsYW5kbG9ja19vYmplY3QgKm9iamVjdDtcbitcdHJjdV9yZWFkX2xvY2soKTtcbitcdG9iamVjdCA9IHJjdV9kZXJlZmVyZW5jZShsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0KTtcbitcdGlmICghb2JqZWN0KSB7XG4rXHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcdC8qIEtlZXBzIGEgcmVmZXJlbmNlIHRvIHRoaXMgaW5vZGUgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLiAqL1xuK1x0X19pZ2V0KGlub2RlKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNmlub2RlLVx1MDAzZWlfbG9jayk7XG4gXG4tXHRcdC8qIE9ubHkgaGFuZGxlcyByZWZlcmVuY2VkIGlub2Rlcy4gKi9cbi1cdFx0aWYgKCFpY291bnRfcmVhZF9vbmNlKGlub2RlKSlcbi1cdFx0XHRjb250aW51ZTtcbitcdC8qXG4rXHQgKiBJZiB0aGVyZSBpcyBubyBjb25jdXJyZW50IHJlbGVhc2VfaW5vZGUoKSBvbmdvaW5nLCB0aGVuIHdlXG4rXHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxuK1x0ICogd2lsbCBqdXN0IHdhaXQgZm9yIGl0IHRvIGZpbmlzaC5cbitcdCAqL1xuK1x0c3Bpbl9sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbitcdGlmIChvYmplY3QtXHUwMDNldW5kZXJvYmogPT0gaW5vZGUpIHtcbitcdFx0b2JqZWN0LVx1MDAzZXVuZGVyb2JqID0gTlVMTDtcbitcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbiBcbiBcdFx0Lypcbi1cdFx0ICogUHJvdGVjdHMgYWdhaW5zdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiBpbm9kZSAoZS5nLlxuLVx0XHQgKiBmcm9tIGdldF9pbm9kZV9vYmplY3QoKSkuXG4rXHRcdCAqIEJlY2F1c2Ugb2JqZWN0LVx1MDAzZXVuZGVyb2JqIHdhcyBub3QgTlVMTCxcbitcdFx0ICogcmVsZWFzZV9pbm9kZSgpIGFuZCBnZXRfaW5vZGVfb2JqZWN0KCkgZ3VhcmFudGVlXG4rXHRcdCAqIHRoYXQgaXQgaXMgc2FmZSB0byByZXNldFxuK1x0XHQgKiBsYW5kbG9ja19pbm9kZShpbm9kZSktXHUwMDNlb2JqZWN0IHdoaWxlIGl0IGlzIG5vdCBOVUxMLlxuK1x0XHQgKiBJdCBpcyB0aGVyZWZvcmUgbm90IG5lY2Vzc2FyeSB0byBsb2NrIGlub2RlLVx1MDAzZWlfbG9jay5cbiBcdFx0ICovXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuK1x0XHRyY3VfYXNzaWduX3BvaW50ZXIobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCwgTlVMTCk7XG4gXHRcdC8qXG4tXHRcdCAqIENoZWNrcyBJX0ZSRUVJTkcgYW5kIElfV0lMTF9GUkVFICB0byBwcm90ZWN0IGFnYWluc3QgYSByYWNlXG4tXHRcdCAqIGNvbmRpdGlvbiB3aGVuIHJlbGVhc2VfaW5vZGUoKSBqdXN0IGNhbGxlZCBpcHV0KCksIHdoaWNoXG4tXHRcdCAqIGNvdWxkIGxlYWQgdG8gYSBOVUxMIGRlcmVmZXJlbmNlIG9mIGlub2RlLVx1MDAzZXNlY3VyaXR5IG9yIGFcbi1cdFx0ICogc2Vjb25kIGNhbGwgdG8gaXB1dCgpIGZvciB0aGUgc2FtZSBMYW5kbG9jayBvYmplY3QuICBBbHNvXG4tXHRcdCAqIGNoZWNrcyBJX05FVyBiZWNhdXNlIHN1Y2ggaW5vZGUgY2Fubm90IGJlIHRpZWQgdG8gYW4gb2JqZWN0LlxuK1x0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBvd24gdGhlIGlob2xkKCkgcmVmZXJlbmNlIHRoYXQgd2FzXG4rXHRcdCAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlXG4rXHRcdCAqIF9faWdldCgpIHJlZmVyZW5jZSB0aGF0IHdlIGp1c3Qgc2V0IGluIHRoaXMgbG9vcFxuK1x0XHQgKiB3YWxrLiAgVGhlcmVmb3JlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gcmVmZXJlbmNlc1xuK1x0XHQgKiBvbiB0aGUgaW5vZGUuXG4gXHRcdCAqL1xuLVx0XHRpZiAoaW5vZGVfc3RhdGVfcmVhZChpbm9kZSkgXHUwMDI2XG4tXHRcdCAgICAoSV9GUkVFSU5HIHwgSV9XSUxMX0ZSRUUgfCBJX05FVykpIHtcbi1cdFx0XHRzcGluX3VubG9jayhcdTAwMjZpbm9kZS1cdTAwM2VpX2xvY2spO1xuLVx0XHRcdGNvbnRpbnVlO1xuLVx0XHR9XG4rXHRcdGlwdXRfbm90X2xhc3QoaW5vZGUpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuK1x0XHRyY3VfcmVhZF91bmxvY2soKTtcbitcdH1cbiBcbi1cdFx0cmN1X3JlYWRfbG9jaygpO1xuLVx0XHRvYmplY3QgPSByY3VfZGVyZWZlcmVuY2UobGFuZGxvY2tfaW5vZGUoaW5vZGUpLVx1MDAzZW9iamVjdCk7XG4tXHRcdGlmICghb2JqZWN0KSB7XG4tXHRcdFx0cmN1X3JlYWRfdW5sb2NrKCk7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbi1cdFx0XHRjb250aW51ZTtcbi1cdFx0fVxuLVx0XHQvKiBLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGlzIGlub2RlIHVudGlsIHRoZSBuZXh0IGxvb3Agd2Fsay4gKi9cbi1cdFx0X19pZ2V0KGlub2RlKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2aW5vZGUtXHUwMDNlaV9sb2NrKTtcbitcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbitcdGlwdXQoaW5vZGUpO1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogSWYgdGhlcmUgaXMgbm8gY29uY3VycmVudCByZWxlYXNlX2lub2RlKCkgb25nb2luZywgdGhlbiB3ZVxuLVx0XHQgKiBhcmUgaW4gY2hhcmdlIG9mIGNhbGxpbmcgaXB1dCgpIG9uIHRoaXMgaW5vZGUsIG90aGVyd2lzZSB3ZVxuLVx0XHQgKiB3aWxsIGp1c3Qgd2FpdCBmb3IgaXQgdG8gZmluaXNoLlxuLVx0XHQgKi9cbi1cdFx0c3Bpbl9sb2NrKFx1MDAyNm9iamVjdC1cdTAwM2Vsb2NrKTtcbi1cdFx0aWYgKG9iamVjdC1cdTAwM2V1bmRlcm9iaiA9PSBpbm9kZSkge1xuLVx0XHRcdG9iamVjdC1cdTAwM2V1bmRlcm9iaiA9IE5VTEw7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuK1x0cmV0dXJuIDA7XG4rfVxuIFxuLVx0XHRcdC8qXG4tXHRcdFx0ICogQmVjYXVzZSBvYmplY3QtXHUwMDNldW5kZXJvYmogd2FzIG5vdCBOVUxMLFxuLVx0XHRcdCAqIHJlbGVhc2VfaW5vZGUoKSBhbmQgZ2V0X2lub2RlX29iamVjdCgpIGd1YXJhbnRlZVxuLVx0XHRcdCAqIHRoYXQgaXQgaXMgc2FmZSB0byByZXNldFxuLVx0XHRcdCAqIGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3Qgd2hpbGUgaXQgaXMgbm90IE5VTEwuXG4tXHRcdFx0ICogSXQgaXMgdGhlcmVmb3JlIG5vdCBuZWNlc3NhcnkgdG8gbG9jayBpbm9kZS1cdTAwM2VpX2xvY2suXG4tXHRcdFx0ICovXG4tXHRcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGxhbmRsb2NrX2lub2RlKGlub2RlKS1cdTAwM2VvYmplY3QsIE5VTEwpO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogQXQgdGhpcyBwb2ludCwgd2Ugb3duIHRoZSBpaG9sZCgpIHJlZmVyZW5jZSB0aGF0IHdhc1xuLVx0XHRcdCAqIG9yaWdpbmFsbHkgc2V0IHVwIGJ5IGdldF9pbm9kZV9vYmplY3QoKSBhbmQgdGhlXG4tXHRcdFx0ICogX19pZ2V0KCkgcmVmZXJlbmNlIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wXG4tXHRcdFx0ICogd2Fsay4gIFRoZXJlZm9yZSB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIHJlZmVyZW5jZXNcbi1cdFx0XHQgKiBvbiB0aGUgaW5vZGUuXG4tXHRcdFx0ICovXG4tXHRcdFx0aXB1dF9ub3RfbGFzdChpbm9kZSk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0c3Bpbl91bmxvY2soXHUwMDI2b2JqZWN0LVx1MDAzZWxvY2spO1xuLVx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuLVx0XHR9XG4rLypcbisgKiBSZWxlYXNlIHRoZSBpbm9kZXMgdXNlZCBpbiBhIHNlY3VyaXR5IHBvbGljeS5cbisgKlxuKyAqIENmLiBmc25vdGlmeV91bm1vdW50X2lub2RlcygpIGFuZCBldmljdF9pbm9kZXMoKVxuKyAqL1xuK3N0YXRpYyB2b2lkIGhvb2tfc2JfZGVsZXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqY29uc3Qgc2IpXG4re1xuK1x0dW5zaWduZWQgaW50IGZsYWdzID0gSU5PREVfSVRFUl9OT1JNQUw7XG4gXG4tXHRcdGlmIChwcmV2X2lub2RlKSB7XG4tXHRcdFx0Lypcbi1cdFx0XHQgKiBBdCB0aGlzIHBvaW50LCB3ZSBzdGlsbCBvd24gdGhlIF9faWdldCgpIHJlZmVyZW5jZVxuLVx0XHRcdCAqIHRoYXQgd2UganVzdCBzZXQgaW4gdGhpcyBsb29wIHdhbGsuICBUaGVyZWZvcmUgd2Vcbi1cdFx0XHQgKiBjYW4gZHJvcCB0aGUgbGlzdCBsb2NrIGFuZCBrbm93IHRoYXQgdGhlIGlub2RlIHdvbid0XG4tXHRcdFx0ICogZGlzYXBwZWFyIGZyb20gdW5kZXIgdXMgdW50aWwgdGhlIG5leHQgbG9vcCB3YWxrLlxuLVx0XHRcdCAqL1xuLVx0XHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNiLVx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFdlIGNhbiBub3cgYWN0dWFsbHkgcHV0IHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGVcbi1cdFx0XHQgKiBwcmV2aW91cyBsb29wIHdhbGssIHdoaWNoIGlzIG5vdCBuZWVkZWQgYW55bW9yZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpcHV0KHByZXZfaW5vZGUpO1xuLVx0XHRcdGNvbmRfcmVzY2hlZCgpO1xuLVx0XHRcdHNwaW5fbG9jayhcdTAwMjZzYi1cdTAwM2VzX2lub2RlX2xpc3RfbG9jayk7XG4tXHRcdH1cbi1cdFx0cHJldl9pbm9kZSA9IGlub2RlO1xuLVx0fVxuLVx0c3Bpbl91bmxvY2soXHUwMDI2c2ItXHUwMDNlc19pbm9kZV9saXN0X2xvY2spO1xuK1x0aWYgKCFsYW5kbG9ja19pbml0aWFsaXplZClcbitcdFx0cmV0dXJuO1xuK1xuK1x0c2JfZm9yX2VhY2hfaW5vZGVzKHNiLCBmbGFncywgaG9va19zYl9kZWxldGVfaW5vZGVfaXRlcl9jYiwgTlVMTCk7XG4gXG4tXHQvKiBQdXRzIHRoZSBpbm9kZSByZWZlcmVuY2UgZnJvbSB0aGUgbGFzdCBsb29wIHdhbGssIGlmIGFueS4gKi9cbi1cdGlmIChwcmV2X2lub2RlKVxuLVx0XHRpcHV0KHByZXZfaW5vZGUpO1xuIFx0LyogV2FpdHMgZm9yIHBlbmRpbmcgaXB1dCgpIGluIHJlbGVhc2VfaW5vZGUoKS4gKi9cbiBcdHdhaXRfdmFyX2V2ZW50KFx1MDAyNmxhbmRsb2NrX3N1cGVyYmxvY2soc2IpLVx1MDAzZWlub2RlX3JlZnMsXG4gXHRcdCAgICAgICAhYXRvbWljX2xvbmdfcmVhZChcdTAwMjZsYW5kbG9ja19zdXBlcmJsb2NrKHNiKS1cdTAwM2Vpbm9kZV9yZWZzKSk7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wOVQxMToxMTowNy4yMDU1MDcxMVoiLCJTZXEiOjE1LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTQ0NzE0NDUzNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBFdmFsdWF0aW9uOiBQYXRjaCBJbnRyb2R1Y2luZyBgc2JfZm9yX2VhY2hfaW5vZGVzYCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCwgd2hpY2ggaW50cm9kdWNlcyBhIG5ldyBpdGVyYXRvciBmb3IgaW5vZGVzIHdpdGhpbiBhIHN1cGVyYmxvY2ssIHdhcnJhbnRzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiwgb3IgaWYgaXQncyBzdWZmaWNpZW50bHkgY292ZXJlZCBieSBleGlzdGluZyBLQVNBTiBhbmQgb3RoZXIgZGVidWdnaW5nIHRvb2xzLlxuXG5GaXJzdCwgSSBuZWVkIHRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIHBhdGNoIGl0c2VsZi4gSXQncyBlc3NlbnRpYWxseSBpbnRyb2R1Y2luZyBhIGhlbHBlciBmdW5jdGlvbiwgYHNiX2Zvcl9lYWNoX2lub2Rlc2AsIGFuZCBhbiBhc3NvY2lhdGVkIGl0ZXJhdG9yIHN0cnVjdHVyZSwgYGlub2RlX2l0ZXJgLCB0byBzdHJlYW1saW5lIGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBgc19pbm9kZXNgIGxpc3Qgb2YgYSBzdXBlcmJsb2NrLiBTZXZlcmFsIGV4aXN0aW5nIGZ1bmN0aW9ucyB0aGF0IGl0ZXJhdGUgaW5vZGVzIGFyZSBiZWluZyByZWZhY3RvcmVkIHRvIHVzZSB0aGlzIG5ldyBpdGVyYXRvci4gVGhlIHBhdGNoIGFsc28gYWRkcyBhIGBzX2lub2Rlc19pdGVyc2AgbGlzdCB0byB0aGUgYHN1cGVyX2Jsb2NrYCBzdHJ1Y3R1cmUgdG8gdHJhY2sgdGhlIGl0ZXJhdG9ycy5cblxuTm93LCBsZXQncyBkcmlsbCBkb3duIGludG8gdGhlIHBvdGVudGlhbCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLCBpbmZvIGxlYWtzLCBvciBhbnkgb3RoZXIgS01TQU4tc3BlY2lmaWMgY29uY2VybnMuXG5cbkkndmUgZXhhbWluZWQgdGhlIGNvZGUgY2xvc2VseS4gVGhlIGBpbm9kZV9pdGVyYCBzdHJ1Y3R1cmUgaXRzZWxmIGlzIHN0YWNrLWFsbG9jYXRlZCB3aXRoaW4gdGhlIGBzYl9mb3JfZWFjaF9pbm9kZXNgIGZ1bmN0aW9uLCBhbmQgYWxsIGl0cyBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgYGlub2RlX3NiX2l0ZXJfc3RhcnRgIGZ1bmN0aW9uLiBUaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgd2l0aGluIHRoZSBpdGVyYXRvci4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggZG9lcyBub3QgY29weSBhbnkga2VybmVsIGRhdGEgdG8gdXNlciBzcGFjZS4gSXQgYWxzbyBsb29rcyBsaWtlIHRoZSBgZGF0YWAgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaXMgZWl0aGVyIGEgbnVsbCBwb2ludGVyLCBvciBhbiBpbml0aWFsaXplZCB2YXJpYWJsZS4gVGhlIGBpbm9kZV9zYl9pdGVyX25leHRgIGZ1bmN0aW9uJ3MgbG9naWMgaXMgY2xlYXIsIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2dpY2FsIGJ1ZyBpbiBpdCwgaXQgaXMgbm90IGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3VlLlxuXG5TbywgYW0gSSBzZWVpbmcgYW55dGhpbmcgdGhhdCB3b3VsZCBmYWxsIGludG8gdGhlIGNhdGVnb3JpZXMgd2hlcmUgS01TQU4gaXMgc3BlY2lmaWNhbGx5IG5lZWRlZD8gTm8sIG5vdCByZWFsbHkuIFRoZSBwcmltYXJ5IHJpc2tzIGFwcGVhciB0byBiZSByZWxhdGVkIHRvIGNvbmN1cnJlbmN5LCBsb2NraW5nLCBhbmQgcG90ZW50aWFsbHkgdXNlLWFmdGVyLWZyZWUgYnVncy4gVGhpbmdzIGxpa2UgZHJvcHBpbmcgYW5kIHJldGFraW5nIHRoZSBgc19pbm9kZV9saXN0X2xvY2tgIHdoaWxlIGBpdC1cdTAwM2VuZXh0YCBpcyB1cGRhdGVkLiBUaGVzZSBraW5kcyBvZiBidWdzIGFyZSB0aGUgYnJlYWQgYW5kIGJ1dHRlciBvZiBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGluZnJhc3RydWN0dXJlLlxuXG5JJ3ZlIHJldmlld2VkIHRoZSBndWlkZWxpbmVzLiBJIG5lZWQgdG8gYXNrIG15c2VsZjogRG9lcyB0aGlzIHBhdGNoIGludHJvZHVjZSBvciBtb2RpZnk6XG4xLiAgS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlPyBOby5cbjIuICBDb25kaXRpb25hbCBsb2dpYyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vLlxuMy4gIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZD8gTm8uXG40LiAgQm91bmRzIGNoZWNrcyBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcyB1bmluaXRpYWxpemVkIGJ5dGVzPyBOby5cblxuVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXMgbm90IGV4cG9zZSBhbnkgbmV3IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBBbGwgc3RydWN0dXJlcyB0b3VjaGVkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIHRoZSBpbnRyb2R1Y2VkIGJ1Z3MgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4gYW5kIHRoZSBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzLiBObyBLTVNBTiBpcyBuZWVkZWQuXG5cbkknbSBjb21mb3J0YWJsZSBzZXR0aW5nIGBOZWVkc0tNU0FOPWZhbHNlYCBmb3IgdGhpcyBwYXRjaC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTEyMDksIk91dHB1dFRva2VucyI6MzQxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjI2NSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA5VDExOjExOjE4LjY1MjY1NTQ1NFoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2NzIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIHRoZSBpbnRlcm5hbCBzdXBlcmJsb2NrIGlub2RlIGl0ZXJhdGlvbiBtZWNoYW5pc20gYWNyb3NzIHNldmVyYWwgc3Vic3lzdGVtcyAoYmxvY2ssIGRyb3BfY2FjaGVzLCBnZnMyLCB2ZnMgaW5vZGUsIHF1b3RhLCBsYW5kbG9jaykgYnkgaW50cm9kdWNpbmcgYSBnZW5lcmljIGhlbHBlciBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGFuZCBpdGVyYXRvciBzdHJ1Y3R1cmUgYHN0cnVjdCBpbm9kZV9pdGVyYC5cXG5cXG4tIFVuaW5pdGlhbGl6ZWQgbWVtb3J5IC8gS01TQU4gcGVyc3BlY3RpdmU6XFxuICAtIFRoZSBuZXdseSBpbnRyb2R1Y2VkIHN0YWNrLWFsbG9jYXRlZCBgc3RydWN0IGlub2RlX2l0ZXJgIGluIGBzYl9mb3JfZWFjaF9pbm9kZXMoKWAgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYGlub2RlX3NiX2l0ZXJfc3RhcnQoKWAuXFxuICAtIEFsbCBjYWxsYmFjayBkYXRhIHBheWxvYWRzIHBhc3NlZCB0byB0aGUgaXRlcmF0b3IgZnVuY3Rpb25zIGFyZSBlaXRoZXIgTlVMTCBvciBwb2ludGVycyB0byBmdWxseSBpbml0aWFsaXplZCB2YXJpYWJsZXMvc3RydWN0dXJlcyAoZS5nLiwgYm9vbGVhbiBjYXN0LCBpbml0aWFsaXplZCBsaW5rZWQgbGlzdCBoZWFkLCBpbnRlZ2VyIHBvaW50ZXIpLlxcbiAgLSBObyBrZXJuZWwgZGF0YSBpcyBjb3BpZWQgb3IgZXhwb3NlZCB0byB1c2VyIHNwYWNlIChubyBgY29weV90b191c2VyYCwgaW9jdGxzLCBuZXRsaW5rIG1lc3NhZ2VzLCBldGMuKS5cXG4gIC0gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgY29uZGl0aW9uYWwgYnJhbmNoaW5nIG9uIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBpbnRyb2R1Y2VkLlxcblxcbi0gS0FTQU4gLyBMT0NLREVQIHBlcnNwZWN0aXZlOlxcbiAgLSBQb3RlbnRpYWwgaXNzdWVzIGludHJvZHVjZWQgYnkgdGhpcyBwYXRjaCByZWxhdGUgdG8gbGlzdCBtYW5pcHVsYXRpb24sIHJlZmNvdW50aW5nIChgX19pZ2V0YC9gaXB1dGApLCBsb2NraW5nIHNlbWFudGljcyB1bmRlciBgc2ItXFx1MDAzZXNfaW5vZGVfbGlzdF9sb2NrYCBhbmQgYGlub2RlLVxcdTAwM2VpX2xvY2tgLCBvciB1c2UtYWZ0ZXItZnJlZS9yYWNlIGNvbmRpdGlvbnMgaWYgbGlzdCBub2RlcyBhcmUgZGVsZXRlZCBkdXJpbmcgdHJhdmVyc2FsLiBUaGVzZSBhcmUgZnVsbHkgY292ZXJlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIGBERUJVR19MSVNUYC5cXG5cXG5UaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcywgYW5kIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyB0aGUgaW50ZXJuYWwgc3VwZXJibG9jayBpbm9kZSBpdGVyYXRpb24gbWVjaGFuaXNtIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgKGJsb2NrLCBkcm9wX2NhY2hlcywgZ2ZzMiwgdmZzIGlub2RlLCBxdW90YSwgbGFuZGxvY2spIGJ5IGludHJvZHVjaW5nIGEgZ2VuZXJpYyBoZWxwZXIgYHNiX2Zvcl9lYWNoX2lub2RlcygpYCBhbmQgaXRlcmF0b3Igc3RydWN0dXJlIGBzdHJ1Y3QgaW5vZGVfaXRlcmAuXFxuXFxuLSBVbmluaXRpYWxpemVkIG1lbW9yeSAvIEtNU0FOIHBlcnNwZWN0aXZlOlxcbiAgLSBUaGUgbmV3bHkgaW50cm9kdWNlZCBzdGFjay1hbGxvY2F0ZWQgYHN0cnVjdCBpbm9kZV9pdGVyYCBpbiBgc2JfZm9yX2VhY2hfaW5vZGVzKClgIGlzIGZ1bGx5IGluaXRpYWxpemVkIGluIGBpbm9kZV9zYl9pdGVyX3N0YXJ0KClgLlxcbiAgLSBBbGwgY2FsbGJhY2sgZGF0YSBwYXlsb2FkcyBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yIGZ1bmN0aW9ucyBhcmUgZWl0aGVyIE5VTEwgb3IgcG9pbnRlcnMgdG8gZnVsbHkgaW5pdGlhbGl6ZWQgdmFyaWFibGVzL3N0cnVjdHVyZXMgKGUuZy4sIGJvb2xlYW4gY2FzdCwgaW5pdGlhbGl6ZWQgbGlua2VkIGxpc3QgaGVhZCwgaW50ZWdlciBwb2ludGVyKS5cXG4gIC0gTm8ga2VybmVsIGRhdGEgaXMgY29waWVkIG9yIGV4cG9zZWQgdG8gdXNlciBzcGFjZSAobm8gYGNvcHlfdG9fdXNlcmAsIGlvY3RscywgbmV0bGluayBtZXNzYWdlcywgZXRjLikuXFxuICAtIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzIG9yIGNvbmRpdGlvbmFsIGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgaW50cm9kdWNlZC5cXG5cXG4tIEtBU0FOIC8gTE9DS0RFUCBwZXJzcGVjdGl2ZTpcXG4gIC0gUG90ZW50aWFsIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoaXMgcGF0Y2ggcmVsYXRlIHRvIGxpc3QgbWFuaXB1bGF0aW9uLCByZWZjb3VudGluZyAoYF9faWdldGAvYGlwdXRgKSwgbG9ja2luZyBzZW1hbnRpY3MgdW5kZXIgYHNiLVxcdTAwM2VzX2lub2RlX2xpc3RfbG9ja2AgYW5kIGBpbm9kZS1cXHUwMDNlaV9sb2NrYCwgb3IgdXNlLWFmdGVyLWZyZWUvcmFjZSBjb25kaXRpb25zIGlmIGxpc3Qgbm9kZXMgYXJlIGRlbGV0ZWQgZHVyaW5nIHRyYXZlcnNhbC4gVGhlc2UgYXJlIGZ1bGx5IGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBgREVCVUdfTElTVGAuXFxuXFxuVGhlcmVmb3JlLCB0aGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MsIGFuZCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[1] Phase: Succeeded StartedAt: 2026-09-09 11:11:30 +0000 UTC FinishedAt: 2026-09-09 11:11:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-09 11:11:30 +0000 UTC FinishedAt: 2026-09-09 11:11:30 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2] Phase: Succeeded StartedAt: 2026-09-09 11:11:30 +0000 UTC FinishedAt: 2026-09-09 14:53:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-09 11:11:30 +0000 UTC FinishedAt: 2026-09-09 14:53:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-09 11:11:30 +0000 UTC FinishedAt: 2026-09-09 11:11:40 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-09 11:11:30 +0000 UTC FinishedAt: 2026-09-09 11:11:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-2744207060/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-09 11:11:40 +0000 UTC FinishedAt: 2026-09-09 11:28:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-09 11:11:40 +0000 UTC FinishedAt: 2026-09-09 11:28:05 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*239e69a6-42a6-4c3e-8666-9f89b981602f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-2744207060/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "668dda34-9913-4c49-9c19-66a1abf92517", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-601457234/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-09 11:11:40 +0000 UTC FinishedAt: 2026-09-09 11:27:55 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*239e69a6-42a6-4c3e-8666-9f89b981602f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-2744207060/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "668dda34-9913-4c49-9c19-66a1abf92517", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-601457234/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-09 11:28:05 +0000 UTC FinishedAt: 2026-09-09 11:28:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-09 11:28:05 +0000 UTC FinishedAt: 2026-09-09 11:28:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-09 11:28:05 +0000 UTC FinishedAt: 2026-09-09 11:28:15 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-09 11:28:05 +0000 UTC FinishedAt: 2026-09-09 11:28:10 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-3800535699/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-09 11:28:15 +0000 UTC FinishedAt: 2026-09-09 11:30:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-09 11:28:15 +0000 UTC FinishedAt: 2026-09-09 11:30:01 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*668dda34-9913-4c49-9c19-66a1abf92517,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-601457234/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-09 11:30:11 +0000 UTC FinishedAt: 2026-09-09 11:30:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-09 11:30:11 +0000 UTC FinishedAt: 2026-09-09 11:30:11 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-09 11:30:11 +0000 UTC FinishedAt: 2026-09-09 11:49:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-09 11:30:11 +0000 UTC FinishedAt: 2026-09-09 11:49:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*239e69a6-42a6-4c3e-8666-9f89b981602f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-3800535699/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "225b9914-ba3d-4f20-aeb6-af16632db606", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-3160828103/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-09 11:30:11 +0000 UTC FinishedAt: 2026-09-09 11:49:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*239e69a6-42a6-4c3e-8666-9f89b981602f,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-3800535699/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "225b9914-ba3d-4f20-aeb6-af16632db606", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-3160828103/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-09 11:49:16 +0000 UTC FinishedAt: 2026-09-09 11:49:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-09 11:49:16 +0000 UTC FinishedAt: 2026-09-09 11:49:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-09 11:49:16 +0000 UTC FinishedAt: 2026-09-09 11:51:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-09 11:49:16 +0000 UTC FinishedAt: 2026-09-09 11:51:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*225b9914-ba3d-4f20-aeb6-af16632db606,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-3160828103/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-09 11:51:12 +0000 UTC FinishedAt: 2026-09-09 14:53:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-09 11:51:12 +0000 UTC FinishedAt: 2026-09-09 14:53:54 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*668dda34-9913-4c49-9c19-66a1abf92517,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*225b9914-ba3d-4f20-aeb6-af16632db606,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-601457234/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-3160828103/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-09 11:51:12 +0000 UTC FinishedAt: 2026-09-09 11:51:22 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-09 11:51:12 +0000 UTC FinishedAt: 2026-09-09 11:51:21 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-421499660/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-09 11:51:12 +0000 UTC FinishedAt: 2026-09-09 11:51:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-09 11:51:12 +0000 UTC FinishedAt: 2026-09-09 11:51:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-09 11:51:12 +0000 UTC FinishedAt: 2026-09-09 11:51:12 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-09 11:51:22 +0000 UTC FinishedAt: 2026-09-09 14:53:54 +0000 UTC Input: nil Output: nil --------- Name: series-workflow87tlv[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci2-upstream-fs-corpus.db"],"focus":["fs"],"focus_symbols":["sb_for_each_inodes","evict_inodes","sync_bdevs","drop_pagecache_sb","add_dquot_ref","gfs2_evict_inodes","hook_sb_delete"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"dd660a0e0fee1bc892e16fdb6abdf92676515175","config_name":"upstream-apparmor-kasan.config","enable_configs":["QUOTA","GFS2_FS","SECURITY_LANDLOCK"],"series_id":"2f6305a7-997e-43d4-9575-8204b7abcd49","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-09 11:51:22 +0000 UTC FinishedAt: 2026-09-09 14:53:44 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*668dda34-9913-4c49-9c19-66a1abf92517,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*225b9914-ba3d-4f20-aeb6-af16632db606,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-601457234/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-build-action-3160828103/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflow87tlv/series-workflow87tlv-convert-artifact-421499660/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}