Name: series-workflowdgtkl Phase: Running StartedAt: 2026-08-31 12:29:07 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdgtkl[0] Phase: Running StartedAt: 2026-08-31 12:29:07 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdgtkl[0].run-triage Phase: Running StartedAt: 2026-08-31 12:29:07 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowdgtkl[0].run-triage(0) Phase: Running StartedAt: 2026-08-31 12:29:07 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "drm-next", "tree_url": "https://gitlab.freedesktop.org/drm/kernel.git", "commit_hash": "cee9395acd8043be0644b25c34bfa86623f2b935", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "UNIX", "COREDUMP" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "drm-next", "tree_url": "https://gitlab.freedesktop.org/drm/kernel.git", "commit_hash": "cee9395acd8043be0644b25c34bfa86623f2b935", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "UNIX", "COREDUMP" ], "series_id": "524fcdbe-c7b4-4e1d-b6d3-52ea41fd5526" }, "track": "KASAN", "fuzz": { "focus": [ "fs", "net" ], "focus_symbols": [ "sk_setsockopt", "sk_getsockopt", "scm_recv_unix", "__scm_send", "__pidfs_register_pids", "pidfs_coredump" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db", "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+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMwPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MTRtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtVTklYJiMzNDssCiAgICAmIzM0O0NPUkVEVU1QJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c2tfc2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtza19nZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O3NjbV9yZWN2X3VuaXgmIzM0OywKICAgICYjMzQ7X19zY21fc2VuZCYjMzQ7LAogICAgJiMzNDtfX3BpZGZzX3JlZ2lzdGVyX3BpZHMmIzM0OywKICAgICYjMzQ7cGlkZnNfY29yZWR1bXAmIzM0OwogIF0sCiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aHJlYWQgcGlkZmRzIGluIFVOSVggZG9tYWluIHNvY2tldHMgYW5kIGNvcmVkdW1wIG1lY2hhbmlzbXMgKFNPX1BBU1NQSURGRF9USFJFQUQsIFNPX1BFRVJQSURGRF9USFJFQUQpLlxuXG5LZXkgYXJlYXMgYW5hbHl6ZWQgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzOlxuMS4gYERFQ0xBUkVfUElEU2AgYXJyYXlzIGluIGBzdHJ1Y3Qgc2NtX2Nvb2tpZWAsIGBzdHJ1Y3Qgc29ja2AsIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCwgYHN0cnVjdCB1bml4X3BlZXJjcmVkYCwgYW5kIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgOlxuICAgLSBgc3RydWN0IHNvY2tgIGluc3RhbmNlcyBhcmUgYWxsb2NhdGVkIHdpdGggYHNrX2FsbG9jKClgICh6ZXJvZWQpIGFuZCBleHBsaWNpdGx5IHJlc2V0IGluIGBzb2NrX2luaXRfZGF0YV91aWQoKWAgd2l0aCBgbWVtc2V0KHNrLVx1MDAzZXNrX3BlZXJfcGlkLCAwLCAuLi4pYC5cbiAgIC0gYHN0cnVjdCBzY21fY29va2llYCBvYmplY3RzIGFyZSBjb25zaXN0ZW50bHkgemVyby1pbml0aWFsaXplZCAoZWl0aGVyIHZpYSBkZXNpZ25hdGVkIHplcm8gaW5pdGlhbGl6ZXJzIGA9IHt9YCBvciBgbWVtc2V0KC4uLiwgMCwgc2l6ZW9mKC4uLikpYCkgYWNyb3NzIGFsbCBjYWxsZXJzIChgc2NtX3NlbmRgLCBgdW5peF9kZXN0cnVjdF9zY21gLCBgX191bml4X2RncmFtX3JlY3Ztc2dgLCBgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljYCwgYGhjaV9zb2NrX3JlY3Ztc2dgLCBgbmV0bGlua19yZWN2bXNnYCkuXG4gICAtIGBzdHJ1Y3QgdW5peF9wZWVyY3JlZGAgaW5zdGFuY2VzIGFyZSB6ZXJvLWluaXRpYWxpemVkIChgPSB7fWApIGluIGB1bml4X2xpc3RlbmAsIGB1bml4X3N0cmVhbV9jb25uZWN0YCwgYW5kIGB1bml4X3NvY2tldHBhaXJgIGJlZm9yZSBgcHJlcGFyZV9wZWVyY3JlZCgpYC5cbiAgIC0gYHNrYi1cdTAwM2VjYmAgY29udGFpbmluZyBgc3RydWN0IHVuaXhfc2tiX3Bhcm1zYCBpcyB6ZXJvZWQgZHVyaW5nIGBfX2FsbG9jX3NrYigpYC5cbiAgIC0gYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgIGlzIHplcm8taW5pdGlhbGl6ZWQgdmlhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzIGluIGB2ZnNfY29yZWR1bXAoKWAuXG4yLiBTb2NrZXQgb3B0aW9uIGhhbmRsZXJzIGFuZCBjbXNnIGhlbHBlcnM6XG4gICAtIGBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZCgpYCBjb3BpZXMgYW4gaW5pdGlhbGl6ZWQgYGludCBwaWRmZGAgYW5kIGBpbnQgbGVuYCB0byB1c2VyIHNwYWNlLlxuICAgLSBgc2NtX3BpZGZkX3JlY3YoKWAgaW5pdGlhbGl6ZXMgYHBpZGZkYCBmcm9tIGBwaWRmZF9wcmVwYXJlKClgIGJlZm9yZSB3cml0aW5nIHZpYSBgcHV0X2Ntc2coKWAuXG4gICAtIE5vIHN0cnVjdHVyZSBwYWRkaW5nIG9yIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGFyZSBleHBvc2VkIHRvIHVzZXJzcGFjZSBvciByZWFkIGluIGNvbmRpdGlvbmFsIGxvZ2ljLlxuMy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIHBhdGNoIHNlcmllcyAoZS5nLiBwaWQgcmVmZXJlbmNlIG1hbmFnZW1lbnQsIHVzZS1hZnRlci1mcmVlLCBsb2NraW5nIGFyb3VuZCBgc2tfcGVlcl9sb2NrYCwgTlVMTCBkZXJlZmVyZW5jZSkgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXG5cblRodXMsIHRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcyB3YXJyYW50aW5nIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgU09fUEFTU1BJREZEX1RIUkVBRCBhbmQgU09fUEVFUlBJREZEX1RIUkVBRCBzb2NrZXQgb3B0aW9ucyB0byBhbGxvdyBwYXNzaW5nIGFuZCBxdWVyeWluZyB0aHJlYWQtc3BlY2lmaWMgcGlkZmRzIG92ZXIgVU5JWCBkb21haW4gc29ja2V0cy4gSXQgdXBkYXRlcyBzdHJ1Y3Qgc29jaywgU0NNIGNyZWRlbnRpYWwgcGFzc2luZywgVU5JWCBzb2NrZXQgcmVhZC93cml0ZSBjcmVkZW50aWFsIG1hdGNoaW5nLCBwaWRmcyBwaWQgcmVnaXN0cmF0aW9uLCBhbmQgY29yZWR1bXAgbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzA8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCAzMzJiMDNhNTk3ODc2NzEyOTRlNTE3ZDAzNWY1NDVkZDk5MjA2M2IxXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIE1vbiBBdWcgMzEgMTI6MzA6MjMgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5pbmRleCA5NDZhNWZhZDI2OTEyLi41ZDM1MjRjMjZiMmJjIDEwMDY0NFxuLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbkBAIC0xNTcsNiAmIzQzOzE1NywxMCBAQFxuIFxuICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkMgICAgICA4NVxuIFxuJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgICAgODZcbiYjNDM7XG4mIzQzOyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCAgICA4N1xuJiM0MztcbiAjaWYgIWRlZmluZWQoX19LRVJORUxfXylcbiBcbiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0XG5kaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuaW5kZXggZjE2NDFkZGUxMzVmYy4uMjQ1YTQzZjUyZmIxYSAxMDA2NDRcbi0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuQEAgLTE2OCw2ICYjNDM7MTY4LDEwIEBAXG4gXG4gI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQyAgICAgIDg1XG4gXG4mIzQzOyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICA4NlxuJiM0MztcbiYjNDM7I2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEICAgIDg3XG4mIzQzO1xuICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKVxuIFxuICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjRcbmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuaW5kZXggZjNhMzgxNWM3ZGMyOS4uZjIzNzEwZTFjNjcxNCAxMDA2NDRcbi0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbkBAIC0xNDksNiAmIzQzOzE0OSwxMCBAQFxuIFxuICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkNcdDB4NDA1M1xuIFxuJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQURcdDB4NDA1NFxuJiM0MztcbiYjNDM7I2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEXHQweDQwNTVcbiYjNDM7XG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXG4gXG4gI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NFxuZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuaW5kZXggNzkwN2YzYjFmMGVlMC4uYjM1YjI1YmRlZmMyYiAxMDA2NDRcbi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5AQCAtMTUwLDYgJiM0MzsxNTAsMTAgQEBcbiBcbiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DICAgICAgICAweDAwNWVcbiBcbiYjNDM7I2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEICAgICAgMHgwMDVmXG4mIzQzO1xuJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgICAgICAweDAwNjBcbiYjNDM7XG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXG4gXG4gXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcbmluZGV4IGFjM2NkNzQ4MDhjNjQuLmI1ZmY0YjNlMTgzMWUgMTAwNjQ0XG4tLS0gYS9mcy9jb3JlZHVtcC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9mcy9jb3JlZHVtcC5jXG5AQCAtNDU0LDcgJiM0Mzs0NTQsNyBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9wYXJzZShzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbiBcdFx0XHRcdCAqIGxlYWRlciB3ZSBrbm93IHRoYXQgdGhlIHRocmVhZC1ncm91cCBsZWFkZXJcbiBcdFx0XHRcdCAqIGNhbm5vdCBiZSByZWFwZWQgdW50aWwgQGN1cnJlbnQgaGFzIGV4aXRlZC5cbiBcdFx0XHRcdCAqL1xuLVx0XHRcdFx0Y3BybS1cdTAwM2VwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG4mIzQzO1x0XHRcdFx0dGFza19waWRzKGNwcm0tXHUwMDNlcGlkLCBjdXJyZW50KTtcbiBcdFx0XHRcdGVyciA9IGNuX3ByaW50ZihjbiwgXCYjMzQ7JWRcJiMzNDssIENPUkVEVU1QX1BJREZEX05VTUJFUik7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG5AQCAtNjI2LDEzICYjNDM7NjI2LDE3IEBAIHN0YXRpYyBpbnQgdW1oX2NvcmVkdW1wX3NldHVwKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpXG4gXHRzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcCA9IChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICopaW5mby1cdTAwM2VkYXRhO1xuIFx0aW50IGVycjtcbiBcbi1cdGlmIChjcC1cdTAwM2VwaWQpIHtcbiYjNDM7XHRpZiAoY3AtXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0pIHtcbiBcdFx0c3RydWN0IGZpbGUgKnBpZGZzX2ZpbGUgX19mcmVlKGZwdXQpID0gTlVMTDtcbiBcbi1cdFx0cGlkZnNfZmlsZSA9IHBpZGZzX2FsbG9jX2ZpbGUoY3AtXHUwMDNlcGlkLCAwKTtcbiYjNDM7XHRcdHBpZGZzX2ZpbGUgPSBwaWRmc19hbGxvY19maWxlKGNwLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdLCAwKTtcbiBcdFx0aWYgKElTX0VSUihwaWRmc19maWxlKSlcbiBcdFx0XHRyZXR1cm4gUFRSX0VSUihwaWRmc19maWxlKTtcbiBcbiYjNDM7XHRcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoY3AtXHUwMDNlcGlkKTtcbiYjNDM7XHRcdGlmIChlcnIpXG4mIzQzO1x0XHRcdHJldHVybiBlcnI7XG4mIzQzO1xuIFx0XHRwaWRmc19jb3JlZHVtcChjcCk7XG4gXG4gXHRcdC8qXG5AQCAtNjk1LDEyICYjNDM7Njk5LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqXG4gXHRcdHJldHVybiBmYWxzZTtcbiBcbiBcdC8qXG4tXHQgKiBTZXQgdGhlIHRocmVhZC1ncm91cCBsZWFkZXIgcGlkIHdoaWNoIGlzIHVzZWQgZm9yIHRoZSBwZWVyXG4tXHQgKiBjcmVkZW50aWFscyBkdXJpbmcgY29ubmVjdCgpIGJlbG93LiBUaGVuIGltbWVkaWF0ZWx5IHJlZ2lzdGVyXG4tXHQgKiBpdCBpbiBwaWRmcy4uLlxuJiM0MztcdCAqIFNldCB0aGUgcGlkcyBvZiB0aGUgZHVtcGluZyB0aHJlYWQgYW5kIGl0cyB0aHJlYWQtZ3JvdXAgbGVhZGVyXG4mIzQzO1x0ICogd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBwZWVyIGNyZWRlbnRpYWxzIGR1cmluZyBjb25uZWN0KCkgYmVsb3cuXG4mIzQzO1x0ICogVGhlbiBpbW1lZGlhdGVseSByZWdpc3RlciB0aGVtIGluIHBpZGZzLi4uXG4gXHQgKi9cbi1cdGNwcm0tXHUwMDNlcGlkID0gdGFza190Z2lkKGN1cnJlbnQpO1xuLVx0cmV0dmFsID0gcGlkZnNfcmVnaXN0ZXJfcGlkKGNwcm0tXHUwMDNlcGlkKTtcbiYjNDM7XHR0YXNrX3BpZHMoY3BybS1cdTAwM2VwaWQsIGN1cnJlbnQpO1xuJiM0MztcdHJldHZhbCA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoY3BybS1cdTAwM2VwaWQpO1xuIFx0aWYgKHJldHZhbClcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuQEAgLTcyMiw3ICYjNDM7NzI2LDcgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcbiBcdH1cbiBcbiBcdC8qIC4uLiBhbmQgdmFsaWRhdGUgdGhhdCBAc2tfcGVlcl9waWQgbWF0Y2hlcyBAY3BybS5waWQuICovXG4tXHRpZiAoV0FSTl9PTl9PTkNFKHVuaXhfcGVlcihzb2NrZXQtXHUwMDNlc2spLVx1MDAzZXNrX3BlZXJfcGlkICE9IGNwcm0tXHUwMDNlcGlkKSlcbiYjNDM7XHRpZiAoV0FSTl9PTl9PTkNFKCFwaWRzX2VxdWFsKHVuaXhfcGVlcihzb2NrZXQtXHUwMDNlc2spLVx1MDAzZXNrX3BlZXJfcGlkLCBjcHJtLVx1MDAzZXBpZCkpKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4gXHRjcHJtLVx1MDAzZWxpbWl0ID0gUkxJTV9JTkZJTklUWTtcbmRpZmYgLS1naXQgYS9mcy9waWRmcy5jIGIvZnMvcGlkZnMuY1xuaW5kZXggYTZhNjQzZjE1ZDA4YS4uMjkyOTliMmM3Y2E3MSAxMDA2NDRcbi0tLSBhL2ZzL3BpZGZzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2ZzL3BpZGZzLmNcbkBAIC03OTMsOSAmIzQzOzc5Myw5IEBAIHZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19DT1JFRFVNUFxuLXZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbiYjNDM7c3RhdGljIHZvaWQgcGlkZnNfY29yZWR1bXBfcGlkKHN0cnVjdCBwaWQgKnBpZCxcbiYjNDM7XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXG4ge1xuLVx0c3RydWN0IHBpZCAqcGlkID0gY3BybS1cdTAwM2VwaWQ7XG4gXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbiBcbiBcdGF0dHIgPSBSRUFEX09OQ0UocGlkLVx1MDAzZWF0dHIpO1xuQEAgLTgxNCw2ICYjNDM7ODE0LDEzIEBAIHZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbiBcdHNtcF93bWIoKTtcbiBcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKTtcbiB9XG4mIzQzO1xuJiM0Mzt2b2lkIHBpZGZzX2NvcmVkdW1wKGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXG4mIzQzO3tcbiYjNDM7XHQvKiBUaGUgZHVtcGluZyB0aHJlYWQmIzM5O3MgcGlkZmQgcmVwb3J0cyB0aGUgY29yZWR1bXAgYXMgd2VsbC4gKi9cbiYjNDM7XHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFx1MDAzYz0gcGlkc19sYXN0KGNwcm0tXHUwMDNlcGlkKTsgdHlwZSYjNDM7JiM0MzspXG4mIzQzO1x0XHRwaWRmc19jb3JlZHVtcF9waWQoY3BybS1cdTAwM2VwaWRbdHlwZV0sIGNwcm0pO1xuJiM0Mzt9XG4gI2VuZGlmXG4gXG4gc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqcGlkZnNfbW50IF9fcm9fYWZ0ZXJfaW5pdDtcbkBAIC0xMDcwLDYgJiM0MzsxMDc3LDIyIEBAIGludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsvKiBSZWdpc3RlciB0aGUgcGlkcyB1cCB0byBwaWQgdHlwZSBAbGFzdCBvZiBAcGlkcyBpbiBwaWRmcy4gKi9cbiYjNDM7aW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KVxuJiM0Mzt7XG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShsYXN0IFx1MDAzZT0gUElEVFlQRV9NQVgpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuJiM0MztcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBsYXN0OyB0eXBlJiM0MzsmIzQzOykge1xuJiM0MztcdFx0aW50IHJldCA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWRzW3R5cGVdKTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAodW5saWtlbHkocmV0KSlcbiYjNDM7XHRcdFx0cmV0dXJuIHJldDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwaWRmc19zdGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqKnN0YXNoZWQsXG4gXHRcdFx0XHRcdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4ge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaCBiL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaFxuaW5kZXggN2IzOGVlMmU3OTEzYi4uMGJiYjdkZTZhNDAyMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oXG5AQCAtNSw2ICYjNDM7NSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BpZF90eXBlcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvc2NoZWQvY29yZWR1bXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2FzbS9zaWdpbmZvLmhcdTAwM2VcbiBcbkBAIC0zMiw3ICYjNDM7MzMsOCBAQCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zIHtcbiBcdGludCB2bWFfY291bnQ7XG4gXHRzaXplX3Qgdm1hX2RhdGFfc2l6ZTtcbiBcdHN0cnVjdCBjb3JlX3ZtYV9tZXRhZGF0YSAqdm1hX21ldGE7XG4tXHRzdHJ1Y3QgcGlkICpwaWQ7XG4mIzQzO1x0LyogRHVtcGluZyB0aHJlYWQgYW5kIGl0cyB0aHJlYWQtZ3JvdXAgbGVhZGVyIGJ5IHBpZCB0eXBlLiAqL1xuJiM0MztcdERFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7XG4gfTtcbiBcbiBleHRlcm4gdW5zaWduZWQgaW50IGNvcmVfZmlsZV9ub3RlX3NpemVfbGltaXQ7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWQuaCBiL2luY2x1ZGUvbGludXgvcGlkLmhcbmluZGV4IGRkYWVmMGJiYzhiYTMuLjg3NjM1ZDBjYzFmNzEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BpZC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L3BpZC5oXG5AQCAtMiw2ICYjNDM7Miw5IEBAXG4gI2lmbmRlZiBfTElOVVhfUElEX0hcbiAjZGVmaW5lIF9MSU5VWF9QSURfSFxuIFxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9hcnJheV9zaXplLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWlubWF4LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9waWRfdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdWxpc3QuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdXBkYXRlLmhcdTAwM2VcbkBAIC05Miw2ICYjNDM7OTUsNTYgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkICpnZXRfcGlkKHN0cnVjdCBwaWQgKnBpZClcbiB9XG4gXG4gZXh0ZXJuIHZvaWQgcHV0X3BpZChzdHJ1Y3QgcGlkICpwaWQpO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogSGVscGVycyBmb3IgYXJyYXlzIG9mIHN0cnVjdCBwaWQgaW5kZXhlZCBieSBwaWQgdHlwZSBkZWNsYXJlZCB3aXRoXG4mIzQzOyAqIERFQ0xBUkVfUElEUygpLiBUaGUgYXJyYXkgY292ZXJzIFBJRFRZUEVfUElEIHVwIHRvIHRoZSBwaWQgdHlwZSBpdFxuJiM0MzsgKiB3YXMgZGVjbGFyZWQgd2l0aCBhbmQgdGhlIGhlbHBlcnMgdGFrZSB0aGF0IGJvdW5kIGZyb20gdGhlIGFycmF5LlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3BpZHMoc3RydWN0IHBpZCAqKmRzdCwgc3RydWN0IHBpZCAqY29uc3QgKnNyYyxcbiYjNDM7XHRcdFx0ICAgICAgZW51bSBwaWRfdHlwZSBsYXN0KVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KVxuJiM0MztcdFx0ZHN0W3R5cGVdID0gZ2V0X3BpZChzcmNbdHlwZV0pO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfcGlkcyhzdHJ1Y3QgcGlkICoqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRwdXRfcGlkKHBpZHNbdHlwZV0pO1xuJiM0MztcdFx0cGlkc1t0eXBlXSA9IE5VTEw7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX3BpZHMoc3RydWN0IHBpZCAqKmEsIHN0cnVjdCBwaWQgKipiLFxuJiM0MztcdFx0XHQgICAgICAgZW51bSBwaWRfdHlwZSBsYXN0KVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KVxuJiM0MztcdFx0c3dhcChhW3R5cGVdLCBiW3R5cGVdKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGlubGluZSBib29sIF9fcGlkc19lcXVhbChzdHJ1Y3QgcGlkICpjb25zdCAqYSwgc3RydWN0IHBpZCAqY29uc3QgKmIsXG4mIzQzO1x0XHRcdFx0ZW51bSBwaWRfdHlwZSBsYXN0KVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KVxuJiM0MztcdFx0aWYgKGFbdHlwZV0gIT0gYlt0eXBlXSlcbiYjNDM7XHRcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdHJldHVybiB0cnVlO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBUaGUgbGFzdCBwaWQgdHlwZSBhbiBhcnJheSBkZWNsYXJlZCB3aXRoIERFQ0xBUkVfUElEUygpIGNvdmVycy4gKi9cbiYjNDM7I2RlZmluZSBwaWRzX2xhc3QocGlkcylcdFx0XHRcdFx0XHRcdFxcXG4mIzQzO1x0KChlbnVtIHBpZF90eXBlKShBUlJBWV9TSVpFKHBpZHMpIC0gMSAmIzQzO1x0XHRcdFx0XFxcbiYjNDM7XHRcdFx0IEJVSUxEX0JVR19PTl9aRVJPKEFSUkFZX1NJWkUocGlkcykgXHUwMDNlIFBJRFRZUEVfTUFYKSkpXG4mIzQzO1xuJiM0MzsjZGVmaW5lIF9fcGlkc19sYXN0MihhLCBiKVx0XHRcdFx0XHRcdFxcXG4mIzQzO1x0KHBpZHNfbGFzdChhKSAmIzQzOyBCVUlMRF9CVUdfT05fWkVSTyhBUlJBWV9TSVpFKGEpICE9IEFSUkFZX1NJWkUoYikpKVxuJiM0MztcbiYjNDM7I2RlZmluZSBnZXRfcGlkcyhkc3QsIHNyYylcdF9fZ2V0X3BpZHMoZHN0LCBzcmMsIF9fcGlkc19sYXN0Mihkc3QsIHNyYykpXG4mIzQzOyNkZWZpbmUgcHV0X3BpZHMocGlkcylcdFx0X19wdXRfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcykpXG4mIzQzOyNkZWZpbmUgc3dhcF9waWRzKGEsIGIpXHRcdF9fc3dhcF9waWRzKGEsIGIsIF9fcGlkc19sYXN0MihhLCBiKSlcbiYjNDM7I2RlZmluZSBwaWRzX2VxdWFsKGEsIGIpXHRfX3BpZHNfZXF1YWwoYSwgYiwgX19waWRzX2xhc3QyKGEsIGIpKVxuJiM0MztcbiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpwaWRfdGFzayhzdHJ1Y3QgcGlkICpwaWQsIGVudW0gcGlkX3R5cGUpO1xuIHN0YXRpYyBpbmxpbmUgYm9vbCBwaWRfaGFzX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpXG4ge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oXG5pbmRleCBjMmFlZTFkOTFkY2ZkLi4zMzAyNjkwYTJhMjgxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaFxuQEAgLTIsNiAmIzQzOzIsOCBAQFxuICNpZm5kZWYgX0xJTlVYX1BJRF9UWVBFU19IXG4gI2RlZmluZSBfTElOVVhfUElEX1RZUEVTX0hcbiBcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbiYjNDM7XG4gZW51bSBwaWRfdHlwZSB7XG4gXHRQSURUWVBFX1BJRCxcbiBcdFBJRFRZUEVfVEdJRCxcbkBAIC0xMCw2ICYjNDM7MTIsMTIgQEAgZW51bSBwaWRfdHlwZSB7XG4gXHRQSURUWVBFX01BWCxcbiB9O1xuIFxuJiM0MztzdHJ1Y3QgcGlkO1xuJiM0MztcbiYjNDM7LyogQW4gYXJyYXkgb2Ygc3RydWN0IHBpZCBpbmRleGVkIGJ5IHBpZCB0eXBlLCBQSURUWVBFX1BJRCB1cCB0byBAbGFzdC4gKi9cbiYjNDM7I2RlZmluZSBERUNMQVJFX1BJRFMobmFtZSwgbGFzdClcdFx0XHRcdFx0XFxcbiYjNDM7XHRzdHJ1Y3QgcGlkICpuYW1lWyhsYXN0KSAmIzQzOyAxICYjNDM7IEJVSUxEX0JVR19PTl9aRVJPKChsYXN0KSBcdTAwM2U9IFBJRFRZUEVfTUFYKV1cbiYjNDM7XG4gc3RydWN0IHBpZF9uYW1lc3BhY2U7XG4gZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlIGluaXRfcGlkX25zO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkZnMuaCBiL2luY2x1ZGUvbGludXgvcGlkZnMuaFxuaW5kZXggMGFiZjdkYTlhYjIzNi4uM2MxZTgyZjFhMzY5MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvcGlkZnMuaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9waWRmcy5oXG5AQCAtMyw2ICYjNDM7Myw3IEBAXG4gI2RlZmluZSBfTElOVVhfUElEX0ZTX0hcbiBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9nZnBfdHlwZXMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9waWQuaFx1MDAzZVxuIFxuIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXM7XG4gXG5AQCAtMzIsNSAmIzQzOzMzLDkgQEAgc3RhdGljIGlubGluZSBpbnQgcGlkZnNfcmVnaXN0ZXJfcGlkKHN0cnVjdCBwaWQgKnBpZClcbiB9XG4gXG4gdm9pZCBwaWRmc19mcmVlX3BpZChzdHJ1Y3QgcGlkICpwaWQpO1xuJiM0MztpbnQgX19waWRmc19yZWdpc3Rlcl9waWRzKHN0cnVjdCBwaWQgKmNvbnN0ICpwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QpO1xuJiM0MztcbiYjNDM7LyogUmVnaXN0ZXIgdGhlIHBpZHMgb2YgYW4gYXJyYXkgZGVjbGFyZWQgd2l0aCBERUNMQVJFX1BJRFMoKS4gKi9cbiYjNDM7I2RlZmluZSBwaWRmc19yZWdpc3Rlcl9waWRzKHBpZHMpXHRfX3BpZGZzX3JlZ2lzdGVyX3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpKVxuIFxuICNlbmRpZiAvKiBfTElOVVhfUElEX0ZTX0ggKi9cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuaW5kZXggNTg0YWU4OGI0MzVlOS4uOTQ0NGI0Nzc4OWEwOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcbkBAIC02NzcsNiAmIzQzOzY3NywyNCBAQCBzdHJ1Y3QgcGlkICp0YXNrX3BpZF90eXBlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBwaWRfdHlwZSB0eXBlKVxuIFx0cmV0dXJuIHBpZDtcbiB9XG4gXG4mIzQzOy8qIEZpbGwgQHBpZHMgd2l0aCB0aGUgcGlkIHR5cGVzIG9mIEB0YXNrIHVwIHRvIEBsYXN0LCB3aXRob3V0IHJlZmVyZW5jZXMuICovXG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Rhc2tfcGlkcyhzdHJ1Y3QgcGlkICoqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0LFxuJiM0MztcdFx0XHQgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuJiM0Mzt7XG4mIzQzO1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KVxuJiM0MztcdFx0cGlkc1t0eXBlXSA9IHRhc2tfcGlkX3R5cGUodGFzaywgdHlwZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBfX2dldF90YXNrX3BpZHMoc3RydWN0IHBpZCAqKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdCxcbiYjNDM7XHRcdFx0XHQgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4mIzQzO3tcbiYjNDM7XHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFx1MDAzYz0gbGFzdDsgdHlwZSYjNDM7JiM0MzspXG4mIzQzO1x0XHRwaWRzW3R5cGVdID0gZ2V0X3BpZCh0YXNrX3BpZF90eXBlKHRhc2ssIHR5cGUpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7I2RlZmluZSB0YXNrX3BpZHMocGlkcywgdGFzaylcdFx0X190YXNrX3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpLCB0YXNrKVxuJiM0MzsjZGVmaW5lIGdldF90YXNrX3BpZHMocGlkcywgdGFzaylcdF9fZ2V0X3Rhc2tfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcyksIHRhc2spXG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBpZCAqdGFza190Z2lkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiB7XG4gXHRyZXR1cm4gdGFzay1cdTAwM2VzaWduYWwtXHUwMDNlcGlkc1tQSURUWVBFX1RHSURdO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjbS5oIGIvaW5jbHVkZS9uZXQvc2NtLmhcbmluZGV4IDg2YWU2YmMxMDllYzYuLmFhN2QxNWM1ZmMyNzEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9zY20uaFxuJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9uZXQvc2NtLmhcbkBAIC00Miw3ICYjNDM7NDIsNyBAQCBzdHJ1Y3Qgc2NtX2ZwX2xpc3Qge1xuIH07XG4gXG4gc3RydWN0IHNjbV9jb29raWUge1xuLVx0c3RydWN0IHBpZFx0XHQqcGlkO1x0XHQvKiBTa2IgY3JlZGVudGlhbHMgKi9cbiYjNDM7XHRERUNMQVJFX1BJRFMocGlkLCBQSURUWVBFX1RHSUQpO1x0LyogU2tiIGNyZWRlbnRpYWxzIGJ5IHBpZCB0eXBlICovXG4gXHRzdHJ1Y3Qgc2NtX2ZwX2xpc3RcdCpmcDtcdFx0LyogUGFzc2VkIGZpbGVzXHRcdCovXG4gXHRzdHJ1Y3Qgc2NtX2NyZWRzXHRjcmVkcztcdFx0LyogU2tiIGNyZWRlbnRpYWxzXHQqL1xuICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS1xuQEAgLTY5LDcgJiM0Mzs2OSw3IEBAIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdW5peF9nZXRfcGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc2NtX2NvXG4gc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSxcbiBcdFx0XHRcdCAgICBzdHJ1Y3QgcGlkICpwaWQsIGt1aWRfdCB1aWQsIGtnaWRfdCBnaWQpXG4ge1xuLVx0c2NtLVx1MDAzZXBpZCA9IGdldF9waWQocGlkKTtcbiYjNDM7XHRzY20tXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gPSBnZXRfcGlkKHBpZCk7XG4gXHRzY20tXHUwMDNlY3JlZHMucGlkID0gcGlkX3ZucihwaWQpO1xuIFx0c2NtLVx1MDAzZWNyZWRzLnVpZCA9IHVpZDtcbiBcdHNjbS1cdTAwM2VjcmVkcy5naWQgPSBnaWQ7XG5AQCAtNzcsOCAmIzQzOzc3LDcgQEAgc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSxcbiBcbiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9kZXN0cm95X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiB7XG4tXHRwdXRfcGlkKHNjbS1cdTAwM2VwaWQpO1xuLVx0c2NtLVx1MDAzZXBpZCA9IE5VTEw7XG4mIzQzO1x0cHV0X3BpZHMoc2NtLVx1MDAzZXBpZCk7XG4gfVxuIFxuIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmhcbmluZGV4IDUxMTg1MjIyYWFjMjkuLjY3Yjc0M2JhYjIyMGUgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9zb2NrLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbmV0L3NvY2suaFxuQEAgLTMwMSw3ICYjNDM7MzAxLDcgQEAgc3RydWN0IHNrX2ZpbHRlcjtcbiAgICpcdEBza190eXBlOiBzb2NrZXQgdHlwZSAoJVNPQ0tfU1RSRUFNLCBldGMpXG4gICAqXHRAc2tfcHJvdG9jb2w6IHdoaWNoIHByb3RvY29sIHRoaXMgc29ja2V0IGJlbG9uZ3MgaW4gdGhpcyBuZXR3b3JrIGZhbWlseVxuICAgKlx0QHNrX3BlZXJfbG9jazogbG9jayBwcm90ZWN0aW5nIEBza19wZWVyX3BpZCBhbmQgQHNrX3BlZXJfY3JlZFxuLSAgKlx0QHNrX3BlZXJfcGlkOiBcdTAwMjZzdHJ1Y3QgcGlkIGZvciB0aGlzIHNvY2tldCYjMzk7cyBwZWVyXG4mIzQzOyAgKlx0QHNrX3BlZXJfcGlkOiBcdTAwMjZzdHJ1Y3QgcGlkIGZvciB0aGlzIHNvY2tldCYjMzk7cyBwZWVyLCBieSBwaWQgdHlwZVxuICAgKlx0QHNrX3BlZXJfY3JlZDogJVNPX1BFRVJDUkVEIHNldHRpbmdcbiAgICpcdEBza19yY3Zsb3dhdDogJVNPX1JDVkxPV0FUIHNldHRpbmdcbiAgICpcdEBza19yY3Z0aW1lbzogJVNPX1JDVlRJTUVPIHNldHRpbmdcbkBAIC0zNTYsNiAmIzQzOzM1Niw3IEBAIHN0cnVjdCBza19maWx0ZXI7XG4gICAqXHRAc2tfc2NtX3NlY3VyaXR5OiBmbGFnZ2VkIGJ5IFNPX1BBU1NTRUMgdG8gcmVjdiBTQ01fU0VDVVJJVFlcbiAgICpcdEBza19zY21fcGlkZmQ6IGZsYWdnZWQgYnkgU09fUEFTU1BJREZEIHRvIHJlY3YgU0NNX1BJREZEXG4gICAqXHRAc2tfc2NtX3JpZ2h0czogZmxhZ2dlZCBieSBTT19QQVNTUklHSFRTIHRvIHJlY3YgU0NNX1JJR0hUU1xuJiM0MzsgICpcdEBza19zY21fcGlkZmRfdGhyZWFkOiBmbGFnZ2VkIGJ5IFNPX1BBU1NQSURGRF9USFJFQUQgdG8gcmVjdiBhIHRocmVhZCBTQ01fUElERkRcbiAgICpcdEBza19zY21fdW51c2VkOiB1bnVzZWQgZmxhZ3MgZm9yIHNjbV9yZWN2KClcbiAgICpcdEBuc190cmFja2VyOiB0cmFja2VyIGZvciBuZXRucyByZWZlcmVuY2VcbiAgICpcdEBza191c2VyX2ZyYWdzOiB4YXJyYXkgb2YgcGFnZXMgdGhlIHVzZXIgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSBvbi5cbkBAIC01NDUsNyAmIzQzOzU0Niw3IEBAIHN0cnVjdCBzb2NrIHtcbiBcdHU2NFx0XHRcdHNrX2lubztcbiBcdHNwaW5sb2NrX3RcdFx0c2tfcGVlcl9sb2NrO1xuIFx0aW50XHRcdFx0c2tfYmluZF9waGM7XG4tXHRzdHJ1Y3QgcGlkXHRcdCpza19wZWVyX3BpZDtcbiYjNDM7XHRERUNMQVJFX1BJRFMoc2tfcGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7XG4gXHRjb25zdCBzdHJ1Y3QgY3JlZFx0KnNrX3BlZXJfY3JlZDtcbiBcbiBcdGt0aW1lX3RcdFx0XHRza19zdGFtcDtcbkBAIC01NjIsNyAmIzQzOzU2Myw4IEBAIHN0cnVjdCBzb2NrIHtcbiBcdFx0XHRcdHNrX3NjbV9zZWN1cml0eSA6IDEsXG4gXHRcdFx0XHRza19zY21fcGlkZmQgOiAxLFxuIFx0XHRcdFx0c2tfc2NtX3JpZ2h0cyA6IDEsXG4tXHRcdFx0XHRza19zY21fdW51c2VkIDogNDtcbiYjNDM7XHRcdFx0XHRza19zY21fcGlkZmRfdGhyZWFkIDogMSxcbiYjNDM7XHRcdFx0XHRza19zY21fdW51c2VkIDogMztcbiBcdFx0fTtcbiBcdH07XG4gXHR1OFx0XHRcdHNrX2Nsb2NraWQ7XG5AQCAtMjk4Niw2ICYjNDM7Mjk4OCwxMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc2tfaXNfc3RyZWFtX3VuaXgoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxuIFx0cmV0dXJuIHNrX2lzX3VuaXgoc2spIFx1MDAyNlx1MDAyNiBzay1cdTAwM2Vza190eXBlID09IFNPQ0tfU1RSRUFNO1xuIH1cbiBcbiYjNDM7LyogU09fUEFTU1BJREZEIG9yIFNPX1BBU1NQSURGRF9USFJFQUQgYXNrZWQgZm9yIGFuIFNDTV9QSURGRC4gKi9cbiYjNDM7c3RhdGljIGlubGluZSBib29sIHNrX3NjbV9waWRmZF93YW50ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxuJiM0Mzt7XG4mIzQzO1x0cmV0dXJuIHNrLVx1MDAzZXNrX3NjbV9waWRmZCB8fCBzay1cdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkO1xuJiM0Mzt9XG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgYm9vbCBza19pc192c29jayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spXG4ge1xuIFx0cmV0dXJuIHNrLVx1MDAzZXNrX2ZhbWlseSA9PSBBRl9WU09DSztcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmggYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmhcbmluZGV4IDg0ZWE3YjkyOTM2ZTIuLjU2ZmVkN2FiMjdhYjggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaFxuQEAgLTE1Miw2ICYjNDM7MTUyLDEwIEBAXG4gXG4gI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQ1x0ODVcbiBcbiYjNDM7I2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEXHQ4NlxuJiM0MztcbiYjNDM7I2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEXHQ4N1xuJiM0MztcbiAjaWYgIWRlZmluZWQoX19LRVJORUxfXylcbiBcbiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0IHx8IChkZWZpbmVkKF9feDg2XzY0X18pIFx1MDAyNlx1MDAyNiBkZWZpbmVkKF9fSUxQMzJfXykpXG5kaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmNcbmluZGV4IDQxMWQ2NmYyNDM5M2QuLjc3NThlOWVhMzg0OGMgMTAwNjQ0XG4tLS0gYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jXG5AQCAtMTYxLDcgJiM0MzsxNjEsNyBAQCBzdHJ1Y3Qgc29jayAqYnRfc29ja19hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssXG4gXHQvKiBJbml0IHBlZXIgaW5mb3JtYXRpb24gc28gaXQgY2FuIGJlIHByb3Blcmx5IG1vbml0b3JlZCAqL1xuIFx0aWYgKCFrZXJuKSB7XG4gXHRcdHNwaW5fbG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuLVx0XHRzay1cdTAwM2Vza19wZWVyX3BpZCAgPSBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSk7XG4mIzQzO1x0XHRzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdICA9IGdldF9waWQodGFza190Z2lkKGN1cnJlbnQpKTtcbiBcdFx0c2stXHUwMDNlc2tfcGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpO1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuIFx0fVxuQEAgLTIzNSw5ICYjNDM7MjM1LDkgQEAgdm9pZCBidF9hY2NlcHRfZW5xdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgYmgpXG4gXHQgKiBzb2NrZXQgaXMgYWxsb2NhdGVkIGJ5IHRoZSBrZXJuZWwuXG4gXHQgKi9cbiBcdHNwaW5fbG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuLVx0b2xkX3BpZCA9IHNrLVx1MDAzZXNrX3BlZXJfcGlkO1xuJiM0MztcdG9sZF9waWQgPSBzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdO1xuIFx0b2xkX2NyZWQgPSBzay1cdTAwM2Vza19wZWVyX2NyZWQ7XG4tXHRzay1cdTAwM2Vza19wZWVyX3BpZCA9IGdldF9waWQocGFyZW50LVx1MDAzZXNrX3BlZXJfcGlkKTtcbiYjNDM7XHRzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwYXJlbnQtXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSk7XG4gXHRzay1cdTAwM2Vza19wZWVyX2NyZWQgPSBnZXRfY3JlZChwYXJlbnQtXHUwMDNlc2tfcGVlcl9jcmVkKTtcbiBcdHNwaW5fdW5sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4gXG5kaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jXG5pbmRleCAwNzBjYTM4OGY5YWNlLi45MWU0NzM4ZWFiZGIwIDEwMDY0NFxuLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNcbkBAIC0yNzMsMjEgJiM0MzsyNzMsMjEgQEAgc3RhdGljIHZvaWQgaGNpX3NvY2tfY29weV9jcmVkcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4gXHRjcmVkcyA9IFx1MDAyNmJ0X2NiKHNrYiktXHUwMDNlY3JlZHM7XG4gXG4gXHQvKiBDaGVjayBpZiBwZWVyIGNyZWRlbnRpYWxzIGlzIHNldCAqL1xuLVx0aWYgKCFzay1cdTAwM2Vza19wZWVyX3BpZCkge1xuJiM0MztcdGlmICghc2stXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkge1xuIFx0XHQvKiBDaGVjayBpZiBwYXJlbnQgcGVlciBjcmVkZW50aWFscyBpcyBzZXQgKi9cbi1cdFx0aWYgKGJ0X3NrKHNrKS1cdTAwM2VwYXJlbnQgXHUwMDI2XHUwMDI2IGJ0X3NrKHNrKS1cdTAwM2VwYXJlbnQtXHUwMDNlc2tfcGVlcl9waWQpXG4mIzQzO1x0XHRpZiAoYnRfc2soc2spLVx1MDAzZXBhcmVudCBcdTAwMjZcdTAwMjYgYnRfc2soc2spLVx1MDAzZXBhcmVudC1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKVxuIFx0XHRcdHNrID0gYnRfc2soc2spLVx1MDAzZXBhcmVudDtcbiBcdFx0ZWxzZVxuIFx0XHRcdHJldHVybjtcbiBcdH1cbiBcbiBcdC8qIENoZWNrIGlmIHNjbV9jcmVkcyBhbHJlYWR5IHNldCAqL1xuLVx0aWYgKGNyZWRzLVx1MDAzZXBpZCA9PSBwaWRfdm5yKHNrLVx1MDAzZXNrX3BlZXJfcGlkKSlcbiYjNDM7XHRpZiAoY3JlZHMtXHUwMDNlcGlkID09IHBpZF92bnIoc2stXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkpXG4gXHRcdHJldHVybjtcbiBcbiBcdG1lbXNldChjcmVkcywgMCwgc2l6ZW9mKCpjcmVkcykpO1xuIFxuLVx0Y3JlZHMtXHUwMDNlcGlkID0gcGlkX3Zucihzay1cdTAwM2Vza19wZWVyX3BpZCk7XG4mIzQzO1x0Y3JlZHMtXHUwMDNlcGlkID0gcGlkX3Zucihzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKTtcbiBcdGlmIChzay1cdTAwM2Vza19wZWVyX2NyZWQpIHtcbiBcdFx0Y3JlZHMtXHUwMDNldWlkID0gc2stXHUwMDNlc2tfcGVlcl9jcmVkLVx1MDAzZXVpZDtcbiBcdFx0Y3JlZHMtXHUwMDNlZ2lkID0gc2stXHUwMDNlc2tfcGVlcl9jcmVkLVx1MDAzZWdpZDtcbmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jXG5pbmRleCAxMTk0YzM3ZTQ2NmYxLi44NzJkOGZiMzFiNmZiIDEwMDY0NFxuLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jXG5AQCAtMTg5MCw3ICYjNDM7MTg5MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGlkICpsMmNhcF9zb2NrX2dldF9wZWVyX3BpZF9jYihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbilcbiB7XG4gXHRzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLVx1MDAzZWRhdGE7XG4gXG4tXHRyZXR1cm4gc2stXHUwMDNlc2tfcGVlcl9waWQ7XG4mIzQzO1x0cmV0dXJuIHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF07XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGwyY2FwX3NvY2tfc3VzcGVuZF9jYihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbilcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9zY20uYyBiL25ldC9jb3JlL3NjbS5jXG5pbmRleCBmMGQ0NGVjZGIxMWZjLi5kNjk3Njg0MTRhZjQ4IDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvc2NtLmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC9jb3JlL3NjbS5jXG5AQCAtMTQ5LDYgJiM0MzsxNDksNyBAQCBFWFBPUlRfU1lNQk9MKF9fc2NtX2Rlc3Ryb3kpO1xuIFxuIHN0YXRpYyBpbmxpbmUgaW50IHNjbV9yZXBsYWNlX3BpZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3QgcGlkICpwaWQpXG4ge1xuJiM0MztcdHN0cnVjdCBwaWQgKnRocmVhZF9waWQ7XG4gXHRpbnQgZXJyO1xuIFxuIFx0LyogZHJvcCBhbGwgcHJldmlvdXMgcmVmZXJlbmNlcyAqL1xuQEAgLTE1OCw3ICYjNDM7MTU5LDE4IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNjbV9yZXBsYWNlX3BpZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3QgcGlkICpwaWQpXG4gXHRpZiAodW5saWtlbHkoZXJyKSlcbiBcdFx0cmV0dXJuIGVycjtcbiBcbi1cdHNjbS1cdTAwM2VwaWQgPSBwaWQ7XG4mIzQzO1x0LyogQSBzZW5kZXIgbmFtaW5nIGl0cyBvd24gdGhyZWFkLWdyb3VwIHNlbmRzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLiAqL1xuJiM0MztcdGlmIChwaWQgPT0gdGFza190Z2lkKGN1cnJlbnQpKVxuJiM0MztcdFx0dGhyZWFkX3BpZCA9IHRhc2tfcGlkKGN1cnJlbnQpO1xuJiM0MztcdGVsc2VcbiYjNDM7XHRcdHRocmVhZF9waWQgPSBwaWQ7XG4mIzQzO1xuJiM0MztcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZCh0aHJlYWRfcGlkKTtcbiYjNDM7XHRpZiAodW5saWtlbHkoZXJyKSlcbiYjNDM7XHRcdHJldHVybiBlcnI7XG4mIzQzO1xuJiM0MztcdHNjbS1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSA9IHBpZDtcbiYjNDM7XHRzY20tXHUwMDNlcGlkW1BJRFRZUEVfUElEXSA9IGdldF9waWQodGhyZWFkX3BpZCk7XG4gXHRzY20tXHUwMDNlY3JlZHMucGlkID0gcGlkX3ZucihwaWQpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTIwNyw3ICYjNDM7MjE5LDggQEAgaW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqcClcbiBcdFx0XHRpZiAoZXJyKVxuIFx0XHRcdFx0Z290byBlcnJvcjtcbiBcbi1cdFx0XHRpZiAoIXAtXHUwMDNlcGlkIHx8IHBpZF92bnIocC1cdTAwM2VwaWQpICE9IGNyZWRzLnBpZCkge1xuJiM0MztcdFx0XHRpZiAoIXAtXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gfHxcbiYjNDM7XHRcdFx0ICAgIHBpZF92bnIocC1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSkgIT0gY3JlZHMucGlkKSB7XG4gXHRcdFx0XHRzdHJ1Y3QgcGlkICpwaWQ7XG4gXHRcdFx0XHRlcnIgPSAtRVNSQ0g7XG4gXHRcdFx0XHRwaWQgPSBmaW5kX2dldF9waWQoY3JlZHMucGlkKTtcbkBAIC00ODYsOSAmIzQzOzQ5OSwxMyBAQCBzdGF0aWMgYm9vbCBzY21faGFzX3NlY2RhdGEoc3RydWN0IHNvY2sgKnNrKVxuIH1cbiAjZW5kaWZcbiBcbi1zdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pXG4mIzQzO3N0YXRpYyB2b2lkIHNjbV9waWRmZF9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuJiM0MztcdFx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuIHtcbiYjNDM7XHRlbnVtIHBpZF90eXBlIHR5cGUgPSBzay1cdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkID8gUElEVFlQRV9QSUQgOiBQSURUWVBFX1RHSUQ7XG4mIzQzO1x0c3RydWN0IHBpZCAqcGlkID0gc2NtLVx1MDAzZXBpZFt0eXBlXTtcbiBcdHN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSURGRF9TVEFMRTtcbiBcdGludCBsZW4sIHBpZGZkO1xuIFxuIFx0LyogcHV0X2Ntc2coKSBkb2VzbiYjMzk7dCByZXR1cm4gYW4gZXJyb3IgaWYgQ01TRyBpcyB0cnVuY2F0ZWQsXG5AQCAtNTA0LDEwICYjNDM7NTIxLDEzIEBAIHN0YXRpYyB2b2lkIHNjbV9waWRmZF9yZWN2KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiBcdFx0cmV0dXJuO1xuIFx0fVxuIFxuLVx0aWYgKCFzY20tXHUwMDNlcGlkKVxuJiM0MztcdGlmICghcGlkKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUoc2NtLVx1MDAzZXBpZCwgUElERkRfU1RBTEUsIFx1MDAyNnBpZGZkX2ZpbGUpO1xuJiM0MztcdGlmICh0eXBlID09IFBJRFRZUEVfUElEKVxuJiM0MztcdFx0ZmxhZ3MgfD0gUElERkRfVEhSRUFEO1xuJiM0MztcbiYjNDM7XHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGlkLCBmbGFncywgXHUwMDI2cGlkZmRfZmlsZSk7XG4gXG4gXHRpZiAocHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTQ01fUElERkQsIHNpemVvZihpbnQpLCBcdTAwMjZwaWRmZCkpIHtcbiBcdFx0aWYgKHBpZGZkX2ZpbGUpIHtcbkBAIC01MjYsNyAmIzQzOzU0Niw3IEBAIHN0YXRpYyBib29sIF9fc2NtX3JlY3ZfY29tbW9uKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuIFx0XHRcdCAgICAgIHN0cnVjdCBzY21fY29va2llICpzY20sIGludCBmbGFncylcbiB7XG4gXHRpZiAoIW1zZy1cdTAwM2Vtc2dfY29udHJvbCkge1xuLVx0XHRpZiAoc2stXHUwMDNlc2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrLVx1MDAzZXNrX3NjbV9waWRmZCB8fFxuJiM0MztcdFx0aWYgKHNrLVx1MDAzZXNrX3NjbV9jcmVkZW50aWFscyB8fCBza19zY21fcGlkZmRfd2FudGVkKHNrKSB8fFxuIFx0XHQgICAgc2NtLVx1MDAzZWZwIHx8IHNjbV9oYXNfc2VjZGF0YShzaykpXG4gXHRcdFx0bXNnLVx1MDAzZW1zZ19mbGFncyB8PSBNU0dfQ1RSVU5DO1xuIFxuQEAgLTU3Myw4ICYjNDM7NTkzLDggQEAgdm9pZCBzY21fcmVjdl91bml4KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbiBcdFx0c2NtX2RldGFjaF9mZHMobXNnLCBzY20sIFJFQURfT05DRSh1LVx1MDAzZXNjbV9yaWdodHNfbm90cnVuYykpO1xuIFx0fVxuIFxuLVx0aWYgKHNvY2stXHUwMDNlc2stXHUwMDNlc2tfc2NtX3BpZGZkKVxuLVx0XHRzY21fcGlkZmRfcmVjdihtc2csIHNjbSk7XG4mIzQzO1x0aWYgKHNrX3NjbV9waWRmZF93YW50ZWQoc29jay1cdTAwM2VzaykpXG4mIzQzO1x0XHRzY21fcGlkZmRfcmVjdihzb2NrLVx1MDAzZXNrLCBtc2csIHNjbSk7XG4gXG4gXHRzY21fZGVzdHJveV9jcmVkKHNjbSk7XG4gfVxuZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suY1xuaW5kZXggMWFkNDE5MDRkYjI1Yi4uY2IyZmZkMzI5YmM2NyAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL3NvY2suY1xuJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc29jay5jXG5AQCAtMTU3MSwxMCAmIzQzOzE1NzEsMjUgQEAgaW50IHNrX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU09fUEFTU1BJREZEOlxuLVx0XHRpZiAoc2tfaXNfdW5peChzaykpXG4mIzQzO1x0XHRpZiAoc2tfaXNfdW5peChzaykpIHtcbiYjNDM7XHRcdFx0LyogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggU09fUEFTU1BJREZEX1RIUkVBRC4gKi9cbiBcdFx0XHRzay1cdTAwM2Vza19zY21fcGlkZmQgPSB2YWxib29sO1xuLVx0XHRlbHNlXG4mIzQzO1x0XHRcdGlmICh2YWxib29sKVxuJiM0MztcdFx0XHRcdHNrLVx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQgPSAwO1xuJiM0MztcdFx0fSBlbHNlIHtcbiYjNDM7XHRcdFx0cmV0ID0gLUVPUE5PVFNVUFA7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRicmVhaztcbiYjNDM7XG4mIzQzO1x0Y2FzZSBTT19QQVNTUElERkRfVEhSRUFEOlxuJiM0MztcdFx0aWYgKHNrX2lzX3VuaXgoc2spKSB7XG4mIzQzO1x0XHRcdC8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRC4gKi9cbiYjNDM7XHRcdFx0c2stXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZCA9IHZhbGJvb2w7XG4mIzQzO1x0XHRcdGlmICh2YWxib29sKVxuJiM0MztcdFx0XHRcdHNrLVx1MDAzZXNrX3NjbV9waWRmZCA9IDA7XG4mIzQzO1x0XHR9IGVsc2Uge1xuIFx0XHRcdHJldCA9IC1FT1BOT1RTVVBQO1xuJiM0MztcdFx0fVxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU09fUEFTU1JJR0hUUzpcbkBAIC0xNzI4LDYgJiM0MzsxNzQzLDUwIEBAIHN0YXRpYyBpbnQgZ3JvdXBzX3RvX3VzZXIoc29ja3B0cl90IGRzdCwgY29uc3Qgc3RydWN0IGdyb3VwX2luZm8gKnNyYylcbiBcdHJldHVybiAwO1xuIH1cbiBcbiYjNDM7LyogSGFuZCBvdXQgYSBwaWRmZCBmb3IgQHR5cGUgb2YgdGhlIHNvY2tldCYjMzk7cyBwZWVyIHZpYSBTT19QRUVSUElERkQqLiAqL1xuJiM0MztzdGF0aWMgaW50IHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKHN0cnVjdCBzb2NrICpzaywgZW51bSBwaWRfdHlwZSB0eXBlLFxuJiM0MztcdFx0XHRcdCAgIHNvY2twdHJfdCBvcHR2YWwsIHNvY2twdHJfdCBvcHRsZW4sIGludCBsZW4pXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7XG4mIzQzO1x0dW5zaWduZWQgaW50IGZsYWdzID0gMDtcbiYjNDM7XHRzdHJ1Y3QgcGlkICpwZWVyX3BpZDtcbiYjNDM7XHRpbnQgcGlkZmQ7XG4mIzQzO1xuJiM0MztcdGlmIChsZW4gXHUwMDNlIHNpemVvZihwaWRmZCkpXG4mIzQzO1x0XHRsZW4gPSBzaXplb2YocGlkZmQpO1xuJiM0MztcbiYjNDM7XHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiYjNDM7XHRwZWVyX3BpZCA9IGdldF9waWQoc2stXHUwMDNlc2tfcGVlcl9waWRbdHlwZV0pO1xuJiM0MztcdHNwaW5fdW5sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4mIzQzO1xuJiM0MztcdGlmICghcGVlcl9waWQpXG4mIzQzO1x0XHRyZXR1cm4gLUVOT0RBVEE7XG4mIzQzO1xuJiM0MztcdC8qIFRoZSB1c2Ugb2YgUElERkRfU1RBTEUgcmVxdWlyZXMgc3Rhc2hpbmcgb2Ygc3RydWN0IHBpZCBvbiBwaWRmc1xuJiM0MztcdCAqIHdpdGggcGlkZnNfcmVnaXN0ZXJfcGlkKCkgYW5kIG9ubHkgQUZfVU5JWCB3ZXJlIHByZXBhcmVkIGZvciB0aGlzLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChzay1cdTAwM2Vza19mYW1pbHkgPT0gQUZfVU5JWClcbiYjNDM7XHRcdGZsYWdzIHw9IFBJREZEX1NUQUxFO1xuJiM0MztcdGlmICh0eXBlID09IFBJRFRZUEVfUElEKVxuJiM0MztcdFx0ZmxhZ3MgfD0gUElERkRfVEhSRUFEO1xuJiM0MztcbiYjNDM7XHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGVlcl9waWQsIGZsYWdzLCBcdTAwMjZwaWRmZF9maWxlKTtcbiYjNDM7XHRwdXRfcGlkKHBlZXJfcGlkKTtcbiYjNDM7XHRpZiAocGlkZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gcGlkZmQ7XG4mIzQzO1xuJiM0MztcdGlmIChjb3B5X3RvX3NvY2twdHIob3B0dmFsLCBcdTAwMjZwaWRmZCwgbGVuKSB8fFxuJiM0MztcdCAgICBjb3B5X3RvX3NvY2twdHIob3B0bGVuLCBcdTAwMjZsZW4sIHNpemVvZihpbnQpKSkge1xuJiM0MztcdFx0cHV0X3VudXNlZF9mZChwaWRmZCk7XG4mIzQzO1x0XHRmcHV0KHBpZGZkX2ZpbGUpO1xuJiM0MztcbiYjNDM7XHRcdHJldHVybiAtRUZBVUxUO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZmRfaW5zdGFsbChwaWRmZCwgcGlkZmRfZmlsZSk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4gaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0XHQgIHNvY2twdHJfdCBvcHR2YWwsIHNvY2twdHJfdCBvcHRsZW4pXG4ge1xuQEAgLTE4OTIsNiAmIzQzOzE5NTEsMTMgQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0XHR2LnZhbCA9IHNrLVx1MDAzZXNrX3NjbV9waWRmZDtcbiBcdFx0YnJlYWs7XG4gXG4mIzQzO1x0Y2FzZSBTT19QQVNTUElERkRfVEhSRUFEOlxuJiM0MztcdFx0aWYgKCFza19pc191bml4KHNrKSlcbiYjNDM7XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuJiM0MztcbiYjNDM7XHRcdHYudmFsID0gc2stXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZDtcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcbiBcdGNhc2UgU09fUEFTU1JJR0hUUzpcbiBcdFx0aWYgKCFza19pc191bml4KHNrKSlcbiBcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG5AQCAtMTkwNiw3ICYjNDM7MTk3Miw4IEBAIGludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcbiBcdFx0XHRsZW4gPSBzaXplb2YocGVlcmNyZWQpO1xuIFxuIFx0XHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdFx0Y3JlZF90b191Y3JlZChzay1cdTAwM2Vza19wZWVyX3BpZCwgc2stXHUwMDNlc2tfcGVlcl9jcmVkLCBcdTAwMjZwZWVyY3JlZCk7XG4mIzQzO1x0XHRjcmVkX3RvX3VjcmVkKHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0sIHNrLVx1MDAzZXNrX3BlZXJfY3JlZCxcbiYjNDM7XHRcdFx0ICAgICAgXHUwMDI2cGVlcmNyZWQpO1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuIFxuIFx0XHRpZiAoY29weV90b19zb2NrcHRyKG9wdHZhbCwgXHUwMDI2cGVlcmNyZWQsIGxlbikpXG5AQCAtMTkxNSw0NSAmIzQzOzE5ODIsMTQgQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0fVxuIFxuIFx0Y2FzZSBTT19QRUVSUElERkQ6XG4tXHR7XG4tXHRcdHN0cnVjdCBwaWQgKnBlZXJfcGlkO1xuLVx0XHRzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7XG4tXHRcdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XG4tXHRcdGludCBwaWRmZDtcbi1cbi1cdFx0aWYgKGxlbiBcdTAwM2Ugc2l6ZW9mKHBpZGZkKSlcbi1cdFx0XHRsZW4gPSBzaXplb2YocGlkZmQpO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdFx0cGVlcl9waWQgPSBnZXRfcGlkKHNrLVx1MDAzZXNrX3BlZXJfcGlkKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiYjNDM7XHRcdHJldHVybiBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZChzaywgUElEVFlQRV9UR0lELCBvcHR2YWwsIG9wdGxlbiwgbGVuKTtcbiBcbi1cdFx0aWYgKCFwZWVyX3BpZClcbi1cdFx0XHRyZXR1cm4gLUVOT0RBVEE7XG4tXG4tXHRcdC8qIFRoZSB1c2Ugb2YgUElERkRfU1RBTEUgcmVxdWlyZXMgc3Rhc2hpbmcgb2Ygc3RydWN0IHBpZFxuLVx0XHQgKiBvbiBwaWRmcyB3aXRoIHBpZGZzX3JlZ2lzdGVyX3BpZCgpIGFuZCBvbmx5IEFGX1VOSVhcbi1cdFx0ICogd2VyZSBwcmVwYXJlZCBmb3IgdGhpcy5cbi1cdFx0ICovXG4tXHRcdGlmIChzay1cdTAwM2Vza19mYW1pbHkgPT0gQUZfVU5JWClcbi1cdFx0XHRmbGFncyA9IFBJREZEX1NUQUxFO1xuLVxuLVx0XHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGVlcl9waWQsIGZsYWdzLCBcdTAwMjZwaWRmZF9maWxlKTtcbi1cdFx0cHV0X3BpZChwZWVyX3BpZCk7XG4tXHRcdGlmIChwaWRmZCBcdTAwM2MgMClcbi1cdFx0XHRyZXR1cm4gcGlkZmQ7XG4tXG4tXHRcdGlmIChjb3B5X3RvX3NvY2twdHIob3B0dmFsLCBcdTAwMjZwaWRmZCwgbGVuKSB8fFxuLVx0XHQgICAgY29weV90b19zb2NrcHRyKG9wdGxlbiwgXHUwMDI2bGVuLCBzaXplb2YoaW50KSkpIHtcbi1cdFx0XHRwdXRfdW51c2VkX2ZkKHBpZGZkKTtcbi1cdFx0XHRmcHV0KHBpZGZkX2ZpbGUpO1xuLVxuLVx0XHRcdHJldHVybiAtRUZBVUxUO1xuLVx0XHR9XG4mIzQzO1x0Y2FzZSBTT19QRUVSUElERkRfVEhSRUFEOlxuJiM0MztcdFx0LyogT25seSBBRl9VTklYIHJlY29yZHMgdGhlIHBlZXImIzM5O3MgY29ubmVjdGluZyB0aHJlYWQuICovXG4mIzQzO1x0XHRpZiAoIXNrX2lzX3VuaXgoc2spKVxuJiM0MztcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRcdGZkX2luc3RhbGwocGlkZmQsIHBpZGZkX2ZpbGUpO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbiYjNDM7XHRcdHJldHVybiBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZChzaywgUElEVFlQRV9QSUQsIG9wdHZhbCwgb3B0bGVuLCBsZW4pO1xuIFxuIFx0Y2FzZSBTT19QRUVSR1JPVVBTOlxuIFx0e1xuQEAgLTIzNzksNyAmIzQzOzI0MTUsNyBAQCBzdGF0aWMgdm9pZCBfX3NrX2Rlc3RydWN0KHN0cnVjdCByY3VfaGVhZCAqaGVhZClcbiBcbiBcdC8qIFdlIGRvIG5vdCBuZWVkIHRvIGFjcXVpcmUgc2stXHUwMDNlc2tfcGVlcl9sb2NrLCB3ZSBhcmUgdGhlIGxhc3QgdXNlci4gKi9cbiBcdHB1dF9jcmVkKHNrLVx1MDAzZXNrX3BlZXJfY3JlZCk7XG4tXHRwdXRfcGlkKHNrLVx1MDAzZXNrX3BlZXJfcGlkKTtcbiYjNDM7XHRwdXRfcGlkcyhzay1cdTAwM2Vza19wZWVyX3BpZCk7XG4gXG4gXHRpZiAobGlrZWx5KHNrLVx1MDAzZXNrX25ldF9yZWZjbnQpKSB7XG4gXHRcdHB1dF9uZXRfdHJhY2sobmV0LCBcdTAwMjZzay1cdTAwM2Vuc190cmFja2VyKTtcbkBAIC0zNzc1LDcgJiM0MzszODExLDcgQEAgdm9pZCBzb2NrX2luaXRfZGF0YV91aWQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2sgKnNrLCBrdWlkX3QgdWlkKVxuIFx0c2stXHUwMDNlc2tfZnJhZy5vZmZzZXRcdD1cdDA7XG4gXHRzay1cdTAwM2Vza19wZWVrX29mZlx0XHQ9XHQtMTtcbiBcbi1cdHNrLVx1MDAzZXNrX3BlZXJfcGlkIFx0PVx0TlVMTDtcbiYjNDM7XHRtZW1zZXQoc2stXHUwMDNlc2tfcGVlcl9waWQsIDAsIHNpemVvZihzay1cdTAwM2Vza19wZWVyX3BpZCkpO1xuIFx0c2stXHUwMDNlc2tfcGVlcl9jcmVkXHQ9XHROVUxMO1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiBcbmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmMgYi9uZXQvdW5peC9hZl91bml4LmNcbmluZGV4IDEzZjk5MjZiZjIwNTcuLjU2M2Q5ODI3YzVjYzUgMTAwNjQ0XG4tLS0gYS9uZXQvdW5peC9hZl91bml4LmNcbiYjNDM7JiM0MzsmIzQzOyBiL25ldC91bml4L2FmX3VuaXguY1xuQEAgLTczNyw1NyAmIzQzOzczNyw1MyBAQCBzdGF0aWMgdm9pZCB1bml4X3JlbGVhc2Vfc29jayhzdHJ1Y3Qgc29jayAqc2ssIGludCBlbWJyaW9uKVxuIH1cbiBcbiBzdHJ1Y3QgdW5peF9wZWVyY3JlZCB7XG4tXHRzdHJ1Y3QgcGlkICpwZWVyX3BpZDtcbiYjNDM7XHRERUNMQVJFX1BJRFMocGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7XG4gXHRjb25zdCBzdHJ1Y3QgY3JlZCAqcGVlcl9jcmVkO1xuIH07XG4gXG4gc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9wZWVyY3JlZChzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpXG4ge1xuLVx0c3RydWN0IHBpZCAqcGlkO1xuIFx0aW50IGVycjtcbiBcbi1cdHBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTtcbi1cdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWQpO1xuLVx0aWYgKGxpa2VseSghZXJyKSkge1xuLVx0XHRwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCA9IGdldF9waWQocGlkKTtcbi1cdFx0cGVlcmNyZWQtXHUwMDNlcGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpO1xuJiM0MztcdGdldF90YXNrX3BpZHMocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQsIGN1cnJlbnQpO1xuJiM0MztcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQpO1xuJiM0MztcdGlmICh1bmxpa2VseShlcnIpKSB7XG4mIzQzO1x0XHRwdXRfcGlkcyhwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCk7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuIFx0fVxuLVx0cmV0dXJuIGVycjtcbiYjNDM7XG4mIzQzO1x0cGVlcmNyZWQtXHUwMDNlcGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpO1xuJiM0MztcdHJldHVybiAwO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBkcm9wX3BlZXJjcmVkKHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IE5VTEw7XG4tXHRzdHJ1Y3QgcGlkICpwaWQgPSBOVUxMO1xuIFxuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbi1cdHN3YXAocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQsIHBpZCk7XG4mIzQzO1x0cHV0X3BpZHMocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQpO1xuIFx0c3dhcChwZWVyY3JlZC1cdTAwM2VwZWVyX2NyZWQsIGNyZWQpO1xuLVxuLVx0cHV0X3BpZChwaWQpO1xuIFx0cHV0X2NyZWQoY3JlZCk7XG4gfVxuIFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzayxcbiBcdFx0XHRcdCBjb25zdCBzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpXG4ge1xuLVx0c2stXHUwMDNlc2tfcGVlcl9waWQgPSBwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZDtcbiYjNDM7XHRtZW1jcHkoc2stXHUwMDNlc2tfcGVlcl9waWQsIHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkLCBzaXplb2Yoc2stXHUwMDNlc2tfcGVlcl9waWQpKTtcbiBcdHNrLVx1MDAzZXNrX3BlZXJfY3JlZCA9IHBlZXJjcmVkLVx1MDAzZXBlZXJfY3JlZDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDtcbi1cdHN0cnVjdCBwaWQgKm9sZF9waWQ7XG4gXG4gXHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdG9sZF9waWQgPSBzay1cdTAwM2Vza19wZWVyX3BpZDtcbiYjNDM7XHRzd2FwX3BpZHMoc2stXHUwMDNlc2tfcGVlcl9waWQsIHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkKTtcbiBcdG9sZF9jcmVkID0gc2stXHUwMDNlc2tfcGVlcl9jcmVkO1xuLVx0aW5pdF9wZWVyY3JlZChzaywgcGVlcmNyZWQpO1xuJiM0MztcdHNrLVx1MDAzZXNrX3BlZXJfY3JlZCA9IHBlZXJjcmVkLVx1MDAzZXBlZXJfY3JlZDtcbiBcdHNwaW5fdW5sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4gXG4tXHRwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCA9IG9sZF9waWQ7XG4gXHRwZWVyY3JlZC1cdTAwM2VwZWVyX2NyZWQgPSBvbGRfY3JlZDtcbiB9XG4gXG5AQCAtNzk2LDE0ICYjNDM7NzkyLDE0IEBAIHN0YXRpYyB2b2lkIGNvcHlfcGVlcmNyZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGVlcnNrKVxuIFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZ1bml4X3NrKHBlZXJzayktXHUwMDNlbG9jayk7XG4gXG4gXHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdHNrLVx1MDAzZXNrX3BlZXJfcGlkID0gZ2V0X3BpZChwZWVyc2stXHUwMDNlc2tfcGVlcl9waWQpO1xuJiM0MztcdGdldF9waWRzKHNrLVx1MDAzZXNrX3BlZXJfcGlkLCBwZWVyc2stXHUwMDNlc2tfcGVlcl9waWQpO1xuIFx0c2stXHUwMDNlc2tfcGVlcl9jcmVkID0gZ2V0X2NyZWQocGVlcnNrLVx1MDAzZXNrX3BlZXJfY3JlZCk7XG4gXHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCB1bml4X21heV9wYXNzY3JlZChjb25zdCBzdHJ1Y3Qgc29jayAqc2spXG4ge1xuLVx0cmV0dXJuIHNrLVx1MDAzZXNrX3NjbV9jcmVkZW50aWFscyB8fCBzay1cdTAwM2Vza19zY21fcGlkZmQ7XG4mIzQzO1x0cmV0dXJuIHNrLVx1MDAzZXNrX3NjbV9jcmVkZW50aWFscyB8fCBza19zY21fcGlkZmRfd2FudGVkKHNrKTtcbiB9XG4gXG4gc3RhdGljIGludCB1bml4X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZylcbkBAIC0xMDYwLDYgJiM0MzsxMDU2LDcgQEAgc3RhdGljIGJvb2wgdW5peF9icGZfYnlwYXNzX2dldHNvY2tvcHQoaW50IGxldmVsLCBpbnQgb3B0bmFtZSlcbiBcdGlmIChsZXZlbCA9PSBTT0xfU09DS0VUKSB7XG4gXHRcdHN3aXRjaCAob3B0bmFtZSkge1xuIFx0XHRjYXNlIFNPX1BFRVJQSURGRDpcbiYjNDM7XHRcdGNhc2UgU09fUEVFUlBJREZEX1RIUkVBRDpcbiBcdFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdFx0ZGVmYXVsdDpcbiBcdFx0XHRyZXR1cm4gZmFsc2U7XG5AQCAtMTk3Myw3ICYjNDM7MTk3MCw3IEBAIHN0YXRpYyB2b2lkIHVuaXhfZGVzdHJ1Y3Rfc2NtKHN0cnVjdCBza19idWZmICpza2IpXG4ge1xuIFx0c3RydWN0IHNjbV9jb29raWUgc2NtID0ge307XG4gXG4tXHRzd2FwKHNjbS5waWQsIFVOSVhDQihza2IpLnBpZCk7XG4mIzQzO1x0c3dhcF9waWRzKHNjbS5waWQsIFVOSVhDQihza2IpLnBpZCk7XG4gXG4gXHRpZiAoVU5JWENCKHNrYikuZnApXG4gXHRcdHVuaXhfZGV0YWNoX2ZkcyhcdTAwMjZzY20sIHNrYik7XG5AQCAtMTk5MSw3ICYjNDM7MTk4OCw3IEBAIHN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuXG4ge1xuIFx0aW50IGVyciA9IDA7XG4gXG4tXHRVTklYQ0Ioc2tiKS5waWQgPSBnZXRfcGlkKHNjbS1cdTAwM2VwaWQpO1xuJiM0MztcdGdldF9waWRzKFVOSVhDQihza2IpLnBpZCwgc2NtLVx1MDAzZXBpZCk7XG4gXHRVTklYQ0Ioc2tiKS51aWQgPSBzY20tXHUwMDNlY3JlZHMudWlkO1xuIFx0VU5JWENCKHNrYikuZ2lkID0gc2NtLVx1MDAzZWNyZWRzLmdpZDtcbiBcdFVOSVhDQihza2IpLmZwID0gTlVMTDtcbkBAIC0yMDA1LDcgJiM0MzsyMDAyLDEwIEBAIHN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuXG4gXG4gc3RhdGljIHZvaWQgdW5peF9za2JfdG9fc2NtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY21fY29va2llICpzY20pXG4ge1xuLVx0c2NtX3NldF9jcmVkKHNjbSwgVU5JWENCKHNrYikucGlkLCBVTklYQ0Ioc2tiKS51aWQsIFVOSVhDQihza2IpLmdpZCk7XG4mIzQzO1x0Z2V0X3BpZHMoc2NtLVx1MDAzZXBpZCwgVU5JWENCKHNrYikucGlkKTtcbiYjNDM7XHRzY20tXHUwMDNlY3JlZHMucGlkID0gcGlkX3ZucihzY20tXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0pO1xuJiM0MztcdHNjbS1cdTAwM2VjcmVkcy51aWQgPSBVTklYQ0Ioc2tiKS51aWQ7XG4mIzQzO1x0c2NtLVx1MDAzZWNyZWRzLmdpZCA9IFVOSVhDQihza2IpLmdpZDtcbiBcdHVuaXhfc2V0X3NlY2RhdGEoc2NtLCBza2IpO1xuIH1cbiBcbkBAIC0yMDI1LDMwICYjNDM7MjAyNSwzNSBAQCBzdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiBzdGF0aWMgaW50IHVuaXhfbWF5YmVfYWRkX2NyZWRzKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBzb2NrICpzayxcbiBcdFx0XHRcdGNvbnN0IHN0cnVjdCBzb2NrICpvdGhlcilcbiB7XG4tXHRpZiAoVU5JWENCKHNrYikucGlkKVxuJiM0MztcdGlmIChVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9UR0lEXSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4gXHRpZiAodW5peF9tYXlfcGFzc2NyZWQoc2spIHx8IHVuaXhfbWF5X3Bhc3NjcmVkKG90aGVyKSB8fFxuIFx0ICAgICFvdGhlci1cdTAwM2Vza19zb2NrZXQpIHtcbi1cdFx0c3RydWN0IHBpZCAqcGlkO1xuIFx0XHRpbnQgZXJyO1xuIFxuLVx0XHRwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG4tXHRcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWQpO1xuLVx0XHRpZiAodW5saWtlbHkoZXJyKSlcbiYjNDM7XHRcdGdldF90YXNrX3BpZHMoVU5JWENCKHNrYikucGlkLCBjdXJyZW50KTtcbiYjNDM7XHRcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoVU5JWENCKHNrYikucGlkKTtcbiYjNDM7XHRcdGlmICh1bmxpa2VseShlcnIpKSB7XG4mIzQzO1x0XHRcdHB1dF9waWRzKFVOSVhDQihza2IpLnBpZCk7XG4gXHRcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHRcdH1cbiBcbi1cdFx0VU5JWENCKHNrYikucGlkID0gZ2V0X3BpZChwaWQpO1xuIFx0XHRjdXJyZW50X3VpZF9naWQoXHUwMDI2VU5JWENCKHNrYikudWlkLCBcdTAwMjZVTklYQ0Ioc2tiKS5naWQpO1xuIFx0fVxuIFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuLXN0YXRpYyBib29sIHVuaXhfc2tiX3NjbV9lcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuJiM0MztzdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0XHRcdCAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuIHtcbi1cdHJldHVybiBVTklYQ0Ioc2tiKS5waWQgPT0gc2NtLVx1MDAzZXBpZCBcdTAwMjZcdTAwMjZcbiYjNDM7XHQvKiBPbmx5IGEgdGhyZWFkIHBpZGZkIHJlY2VpdmVyIGNhbiB0ZWxsIHRocmVhZHMgb2Ygb25lIHByb2Nlc3MgYXBhcnQuICovXG4mIzQzO1x0aWYgKHNrLVx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1BJRF0gIT0gc2NtLVx1MDAzZXBpZFtQSURUWVBFX1BJRF0pXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1xuJiM0MztcdHJldHVybiBVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9UR0lEXSA9PSBzY20tXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgdWlkX2VxKFVOSVhDQihza2IpLnVpZCwgc2NtLVx1MDAzZWNyZWRzLnVpZCkgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgZ2lkX2VxKFVOSVhDQihza2IpLmdpZCwgc2NtLVx1MDAzZWNyZWRzLmdpZCkgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgdW5peF9zZWNkYXRhX2VxKHNjbSwgc2tiKTtcbkBAIC0zMDI2LDcgJiM0MzszMDMxLDcgQEAgc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWMoc3RydWN0IHVuaXhfc3RyZWFtX3JlYWRfc3RhdGUgKnN0YXRlLFxuIFxuIFx0XHRpZiAoY2hlY2tfY3JlZHMpIHtcbiBcdFx0XHQvKiBOZXZlciBnbHVlIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgKi9cbi1cdFx0XHRpZiAoIXVuaXhfc2tiX3NjbV9lcShza2IsIFx1MDAyNnNjbSkpXG4mIzQzO1x0XHRcdGlmICghdW5peF9za2Jfc2NtX2VxKHNrLCBza2IsIFx1MDAyNnNjbSkpXG4gXHRcdFx0XHRicmVhaztcbiBcdFx0fSBlbHNlIGlmICh1bml4X21heV9wYXNzY3JlZChzaykpIHtcbiBcdFx0XHQvKiBDb3B5IGNyZWRlbnRpYWxzICovXG5kaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5oIGIvbmV0L3VuaXgvYWZfdW5peC5oXG5pbmRleCA4MTE5ZGJlZWYzYTNjLi40MDI3NDI4OTVhY2NhIDEwMDY0NFxuLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5oXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvdW5peC9hZl91bml4LmhcbkBAIC0yLDYgJiM0MzsyLDcgQEBcbiAjaWZuZGVmIF9fQUZfVU5JWF9IXG4gI2RlZmluZSBfX0FGX1VOSVhfSFxuIFxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9waWRfdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3VpZGdpZC5oXHUwMDNlXG4gXG4gI2RlZmluZSBVTklYX0hBU0hfTU9EXHQoMjU2IC0gMSlcbkBAIC0xMSw3ICYjNDM7MTIsNyBAQFxuIHN0cnVjdCBzb2NrICp1bml4X3BlZXJfZ2V0KHN0cnVjdCBzb2NrICpzayk7XG4gXG4gc3RydWN0IHVuaXhfc2tiX3Bhcm1zIHtcbi1cdHN0cnVjdCBwaWRcdFx0KnBpZDtcdFx0Lyogc2tiIGNyZWRlbnRpYWxzXHQqL1xuJiM0MztcdERFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7XHQvKiBza2IgY3JlZGVudGlhbHMgYnkgcGlkIHR5cGUgKi9cbiBcdGt1aWRfdFx0XHRcdHVpZDtcbiBcdGtnaWRfdFx0XHRcdGdpZDtcbiBcdHN0cnVjdCBzY21fZnBfbGlzdFx0KmZwO1x0XHQvKiBQYXNzZWQgZmlsZXNcdFx0Ki9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuY1xuaW5kZXggNDIyNzI4ZjYzMmNhNi4uZWM3M2JiNjkwYmJjYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmNcbkBAIC01OTIsNiAmIzQzOzU5MiwxODEgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfY29yZWR1bXBfc2lnbmFsX3NpZ3NlZ3YpXG4gXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyBib29sIGNoZWNrX2NvcmVkdW1wX2luZm8oY29uc3Qgc3RydWN0IHBpZGZkX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKndoYXQpXG4mIzQzO3tcbiYjNDM7XHRpZiAoIShpbmZvLVx1MDAzZW1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IFBJREZEX0lORk9fQ09SRURVTVAgbm90IHNldCBpbiBtYXNrXFxuXCYjMzQ7LCB3aGF0KTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghKGluZm8tXHUwMDNlY29yZWR1bXBfbWFzayBcdTAwMjYgUElERkRfQ09SRURVTVBFRCkpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogUElERkRfQ09SRURVTVBFRCBub3Qgc2V0IGluIGNvcmVkdW1wX21hc2tcXG5cJiMzNDssIHdoYXQpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCEoaW5mby1cdTAwM2VtYXNrIFx1MDAyNiBQSURGRF9JTkZPX0NPUkVEVU1QX1NJR05BTCkgfHwgaW5mby1cdTAwM2Vjb3JlZHVtcF9zaWduYWwgIT0gU0lHU0VHVikge1xuJiM0MztcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0OyVzOiBjb3JlZHVtcF9zaWduYWw9JWQsIGV4cGVjdGVkIFNJR1NFR1Y9JWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdHdoYXQsIGluZm8tXHUwMDNlY29yZWR1bXBfc2lnbmFsLCBTSUdTRUdWKTtcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghKGluZm8tXHUwMDNlbWFzayBcdTAwMjYgUElERkRfSU5GT19DT1JFRFVNUF9DT0RFKSB8fCBpbmZvLVx1MDAzZWNvcmVkdW1wX2NvZGUgIT0gU0VHVl9NQVBFUlIpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDslczogY29yZWR1bXBfY29kZT0lZCwgZXhwZWN0ZWQgU0VHVl9NQVBFUlI9JWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdHdoYXQsIGluZm8tXHUwMDNlY29yZWR1bXBfY29kZSwgU0VHVl9NQVBFUlIpO1xuJiM0MztcdFx0cmV0dXJuIGZhbHNlO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHRydWU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRlc3Q6IFBJREZEX0lORk9fQ09SRURVTVAgb24gdGhlIGR1bXBpbmcgdGhyZWFkJiMzOTtzIHBpZGZkXG4mIzQzOyAqXG4mIzQzOyAqIENyYXNoIGZyb20gYSBub24tbGVhZGVyIHRocmVhZCBhbmQgdmVyaWZ5IHRoYXQgdGhlIHBpZGZkIGZyb21cbiYjNDM7ICogU09fUEVFUlBJREZEX1RIUkVBRCByZWZlcnMgdG8gdGhhdCB0aHJlYWQgYW5kIHJlcG9ydHMgdGhlIGNvcmVkdW1wXG4mIzQzOyAqIGxpa2UgdGhlIHRocmVhZC1ncm91cCBsZWFkZXImIzM5O3MgcGlkZmQgZnJvbSBTT19QRUVSUElERkQgZG9lcy5cbiYjNDM7ICovXG4mIzQzO1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X2NvcmVkdW1wX3RocmVhZClcbiYjNDM7e1xuJiM0MztcdGludCBwaWRmZCwgcmV0LCBzdGF0dXM7XG4mIzQzO1x0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xuJiM0MztcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcbiYjNDM7XHRpbnQgaXBjX3NvY2tldHNbMl07XG4mIzQzO1x0Y2hhciBjO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKFwmIzM0O0AvdG1wL2NvcmVkdW1wLnNvY2tldFwmIzM0OykpO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLCBpcGNfc29ja2V0cyk7XG4mIzQzO1x0QVNTRVJUX0VRKHJldCwgMCk7XG4mIzQzO1xuJiM0MztcdHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBmb3JrKCk7XG4mIzQzO1x0QVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApO1xuJiM0MztcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcbiYjNDM7XHRcdGludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xO1xuJiM0MztcdFx0aW50IGZkX3RocmVhZF9waWRmZCA9IC0xLCBmZF9jb3JlX2ZpbGUgPSAtMTtcbiYjNDM7XHRcdHN0cnVjdCBwaWRmZF9pbmZvIHRocmVhZF9pbmZvID0ge307XG4mIzQzO1x0XHRpbnQgZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFO1xuJiM0MztcbiYjNDM7XHRcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcbiYjNDM7XG4mIzQzO1x0XHRmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChcJiMzNDsvdG1wL2NvcmVkdW1wLnNvY2tldFwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoZmRfc2VydmVyIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBsaXN0ZW4gc29ja2V0IGZhaWxlZDogJW1cXG5cJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRpZiAod3JpdGVfbm9pbnRyKGlwY19zb2NrZXRzWzFdLCBcJiMzNDsxXCYjMzQ7LCAxKSBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogaXBjIHdyaXRlIGZhaWxlZDogJW1cXG5cJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRjbG9zZShpcGNfc29ja2V0c1sxXSk7XG4mIzQzO1xuJiM0MztcdFx0ZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTtcbiYjNDM7XHRcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogYWNjZXB0NCBmYWlsZWQ6ICVtXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0ZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTtcbiYjNDM7XHRcdGlmIChmZF9wZWVyX3BpZGZkIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBnZXRfcGVlcl9waWRmZCBmYWlsZWRcXG5cJiMzNDspO1xuJiM0MztcdFx0XHRnb3RvIG91dDtcbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRmZF90aHJlYWRfcGlkZmQgPSBnZXRfcGVlcl9waWRmZF90aHJlYWQoZmRfY29yZWR1bXApO1xuJiM0MztcdFx0aWYgKGZkX3RocmVhZF9waWRmZCBcdTAwM2MgMCkge1xuJiM0MztcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogZ2V0X3BlZXJfcGlkZmRfdGhyZWFkIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdGlmICghZ2V0X3BpZGZkX2luZm8oZmRfcGVlcl9waWRmZCwgXHUwMDI2aW5mbykgfHxcbiYjNDM7XHRcdCAgICAhZ2V0X3BpZGZkX2luZm8oZmRfdGhyZWFkX3BpZGZkLCBcdTAwMjZ0aHJlYWRfaW5mbykpIHtcbiYjNDM7XHRcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGdldF9waWRmZF9pbmZvIGZhaWxlZFxcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0fVxuJiM0MztcbiYjNDM7XHRcdC8qIFRoZSBwZWVyIGlzIHRoZSB0aHJlYWQtZ3JvdXAgbGVhZGVyLCB0aGUgZHVtcGluZyB0aHJlYWQgaXMgbm90LiAqL1xuJiM0MztcdFx0aWYgKGluZm8ucGlkICE9IGluZm8udGdpZCB8fCB0aHJlYWRfaW5mby50Z2lkICE9IGluZm8udGdpZCB8fFxuJiM0MztcdFx0ICAgIHRocmVhZF9pbmZvLnBpZCA9PSB0aHJlYWRfaW5mby50Z2lkKSB7XG4mIzQzO1x0XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiB1bmV4cGVjdGVkIGlkcyAlZC8lZCBhbmQgJWQvJWRcXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0aW5mby5waWQsIGluZm8udGdpZCwgdGhyZWFkX2luZm8ucGlkLCB0aHJlYWRfaW5mby50Z2lkKTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0aWYgKCFjaGVja19jb3JlZHVtcF9pbmZvKFx1MDAyNmluZm8sIFwmIzM0O1NPX1BFRVJQSURGRFwmIzM0OykgfHxcbiYjNDM7XHRcdCAgICAhY2hlY2tfY29yZWR1bXBfaW5mbyhcdTAwMjZ0aHJlYWRfaW5mbywgXCYjMzQ7U09fUEVFUlBJREZEX1RIUkVBRFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRcdGZkX2NvcmVfZmlsZSA9IG9wZW5fY29yZWR1bXBfdG1wZmlsZShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcbiYjNDM7XHRcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgdG1wZmlsZSBmYWlsZWQ6ICVtXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHR9XG4mIzQzO1xuJiM0MztcdFx0Zm9yICg7Oykge1xuJiM0MztcdFx0XHRjaGFyIGJ1ZmZlcls0MDk2XTtcbiYjNDM7XHRcdFx0c3NpemVfdCBieXRlc19yZWFkLCBieXRlc193cml0ZTtcbiYjNDM7XG4mIzQzO1x0XHRcdGJ5dGVzX3JlYWQgPSByZWFkKGZkX2NvcmVkdW1wLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTtcbiYjNDM7XHRcdFx0aWYgKGJ5dGVzX3JlYWQgXHUwMDNjIDApIHtcbiYjNDM7XHRcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogY29yZSByZWFkIGZhaWxlZDogJW1cXG5cJiMzNDspO1xuJiM0MztcdFx0XHRcdGdvdG8gb3V0O1xuJiM0MztcdFx0XHR9XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoYnl0ZXNfcmVhZCA9PSAwKVxuJiM0MztcdFx0XHRcdGJyZWFrO1xuJiM0MztcbiYjNDM7XHRcdFx0Ynl0ZXNfd3JpdGUgPSB3cml0ZShmZF9jb3JlX2ZpbGUsIGJ1ZmZlciwgYnl0ZXNfcmVhZCk7XG4mIzQzO1x0XHRcdGlmIChieXRlc19yZWFkICE9IGJ5dGVzX3dyaXRlKSB7XG4mIzQzO1x0XHRcdFx0ZnByaW50ZihzdGRlcnIsIFwmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgd3JpdGUgJXpkLyV6ZDogJW1cXG5cJiMzNDssXG4mIzQzO1x0XHRcdFx0XHRieXRlc19yZWFkLCBieXRlc193cml0ZSk7XG4mIzQzO1x0XHRcdFx0Z290byBvdXQ7XG4mIzQzO1x0XHRcdH1cbiYjNDM7XHRcdH1cbiYjNDM7XG4mIzQzO1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxcblwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNlPSAwKVxuJiM0MztcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuJiM0MztcdFx0aWYgKGZkX3RocmVhZF9waWRmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkX3RocmVhZF9waWRmZCk7XG4mIzQzO1x0XHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkX3BlZXJfcGlkZmQpO1xuJiM0MztcdFx0aWYgKGZkX2NvcmVkdW1wIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuJiM0MztcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdGNsb3NlKGZkX3NlcnZlcik7XG4mIzQzO1x0XHRfZXhpdChleGl0X2NvZGUpO1xuJiM0MztcdH1cbiYjNDM7XHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xuJiM0MztcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTtcbiYjNDM7XHRBU1NFUlRfRVEocmVhZF9ub2ludHIoaXBjX3NvY2tldHNbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbiYjNDM7XHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcbiYjNDM7XG4mIzQzO1x0cGlkID0gZm9yaygpO1xuJiM0MztcdEFTU0VSVF9HRShwaWQsIDApO1xuJiM0MztcdGlmIChwaWQgPT0gMClcbiYjNDM7XHRcdGNyYXNoaW5nX2NoaWxkX3RocmVhZCgpO1xuJiM0MztcbiYjNDM7XHRwaWRmZCA9IHN5c19waWRmZF9vcGVuKHBpZCwgMCk7XG4mIzQzO1x0QVNTRVJUX0dFKHBpZGZkLCAwKTtcbiYjNDM7XG4mIzQzO1x0d2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4mIzQzO1x0QVNTRVJUX0VRKFdURVJNU0lHKHN0YXR1cyksIFNJR1NFR1YpO1xuJiM0MztcdEFTU0VSVF9UUlVFKFdDT1JFRFVNUChzdGF0dXMpKTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX1RSVUUoZ2V0X3BpZGZkX2luZm8ocGlkZmQsIFx1MDAyNmluZm8pKTtcbiYjNDM7XHRBU1NFUlRfVFJVRSghIShpbmZvLm1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApKTtcbiYjNDM7XHRBU1NFUlRfVFJVRSghIShpbmZvLmNvcmVkdW1wX21hc2sgXHUwMDI2IFBJREZEX0NPUkVEVU1QRUQpKTtcbiYjNDM7XHRBU1NFUlRfRVEoaW5mby5jb3JlZHVtcF9zaWduYWwsIFNJR1NFR1YpO1xuJiM0MztcbiYjNDM7XHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIFRlc3Q6IFBJREZEX0lORk9fQ09SRURVTVBfU0lHTkFMIHZpYSBzaW1wbGUgc29ja2V0IGNvcmVkdW1wIHdpdGggU0lHQUJSVFxuICAqXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG5pbmRleCBlZDQ3ZjAxZmE1M2M1Li40MjEyNjU2ZTMxZjAxIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbkBAIC0yNywxMCAmIzQzOzI3LDEyIEBAIEZJWFRVUkUoY29yZWR1bXApXG4gLyogU2hhcmVkIGhlbHBlciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi9cbiB2b2lkICpkb19ub3RoaW5nKHZvaWQgKmFyZyk7XG4gdm9pZCBjcmFzaGluZ19jaGlsZCh2b2lkKTtcbiYjNDM7dm9pZCBjcmFzaGluZ19jaGlsZF90aHJlYWQodm9pZCk7XG4gaW50IGNyZWF0ZV9kZXRhY2hlZF90bXBmcyh2b2lkKTtcbiBpbnQgY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoY29uc3QgY2hhciAqcGF0aCk7XG4gYm9vbCBzZXRfY29yZV9wYXR0ZXJuKGNvbnN0IGNoYXIgKnBhdHRlcm4pO1xuIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpO1xuJiM0MztpbnQgZ2V0X3BlZXJfcGlkZmRfdGhyZWFkKGludCBmZCk7XG4gYm9vbCBnZXRfcGlkZmRfaW5mbyhpbnQgZmRfcGVlcl9waWRmZCwgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pO1xuIFxuIC8qIElubGluZSBoZWxwZXIgdGhhdCB1c2VzIGhhcm5lc3MgdHlwZXMgKi9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5pbmRleCAyYTIwZmFmOWNiMGFkLi4zNjMwNjA2OWY2MmU1IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG5AQCAtMTMsNiAmIzQzOzEzLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9lcG9sbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy90eXBlcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbkBAIC0zOCw2ICYjNDM7MzksMTAgQEAgc3RydWN0IF9maXh0dXJlX2NvcmVkdW1wX2RhdGEge1xuIFxuICNkZWZpbmUgTlVNX1RIUkVBRF9TUEFXTiAxMjhcbiBcbiYjNDM7I2lmbmRlZiBTT19QRUVSUElERkRfVEhSRUFEXG4mIzQzOyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCA4N1xuJiM0MzsjZW5kaWZcbiYjNDM7XG4gdm9pZCAqZG9fbm90aGluZyh2b2lkICphcmcpXG4ge1xuIFx0KHZvaWQpYXJnO1xuQEAgLTU5LDYgJiM0Mzs2NCwzNiBAQCB2b2lkIGNyYXNoaW5nX2NoaWxkKHZvaWQpXG4gXHRpID0gKih2b2xhdGlsZSBpbnQgKilOVUxMO1xuIH1cbiBcbiYjNDM7c3RhdGljIHZvaWQgKmNyYXNoaW5nX3RocmVhZCh2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgKnA7XG4mIzQzO1xuJiM0MztcdCh2b2lkKWFyZztcbiYjNDM7XG4mIzQzO1x0LyogY3Jhc2ggb24gcHVycG9zZSB3aXRoIFNFR1ZfTUFQRVJSICovXG4mIzQzO1x0cCA9IG1tYXAoTlVMTCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuJiM0MztcdFx0IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApO1xuJiM0MztcdGlmIChwID09IE1BUF9GQUlMRUQpXG4mIzQzO1x0XHRyZXR1cm4gTlVMTDtcbiYjNDM7XHRtdW5tYXAocCwgUEFHRV9TSVpFKTtcbiYjNDM7XHQqcCA9IDA7XG4mIzQzO1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIGNyYXNoaW5nX2NoaWxkX3RocmVhZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0cHRocmVhZF90IHRocmVhZDtcbiYjNDM7XHRpbnQgaTtcbiYjNDM7XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlVNX1RIUkVBRF9TUEFXTjsgJiM0MzsmIzQzO2kpXG4mIzQzO1x0XHRwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpO1xuJiM0MztcbiYjNDM7XHQvKiBjcmFzaCBmcm9tIGEgbm9uLWxlYWRlciB0aHJlYWQgKi9cbiYjNDM7XHRwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIGNyYXNoaW5nX3RocmVhZCwgTlVMTCk7XG4mIzQzO1x0cGF1c2UoKTtcbiYjNDM7fVxuJiM0MztcbiBpbnQgY3JlYXRlX2RldGFjaGVkX3RtcGZzKHZvaWQpXG4ge1xuIFx0aW50IGZkX2NvbnRleHQsIGZkX3RtcGZzO1xuQEAgLTEzOCw2ICYjNDM7MTczLDIwIEBAIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpXG4gXHRyZXR1cm4gZmRfcGVlcl9waWRmZDtcbiB9XG4gXG4mIzQzO2ludCBnZXRfcGVlcl9waWRmZF90aHJlYWQoaW50IGZkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IGZkX3BlZXJfcGlkZmQ7XG4mIzQzO1x0c29ja2xlbl90IGZkX3BlZXJfcGlkZmRfbGVuID0gc2l6ZW9mKGZkX3BlZXJfcGlkZmQpO1xuJiM0MztcdGludCByZXQgPSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19QRUVSUElERkRfVEhSRUFELCBcdTAwMjZmZF9wZWVyX3BpZGZkLFxuJiM0MztcdFx0XHQgICAgIFx1MDAyNmZkX3BlZXJfcGlkZmRfbGVuKTtcbiYjNDM7XHRpZiAocmV0IFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IGdldHNvY2tvcHQoU09fUEVFUlBJREZEX1RIUkVBRCkgZmFpbGVkOiAlbVxcblwmIzM0OywgX19mdW5jX18pO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XHRmcHJpbnRmKHN0ZGVyciwgXCYjMzQ7JXM6IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGlkZmQgJWRcXG5cJiMzNDssIF9fZnVuY19fLCBmZF9wZWVyX3BpZGZkKTtcbiYjNDM7XHRyZXR1cm4gZmRfcGVlcl9waWRmZDtcbiYjNDM7fVxuJiM0MztcbiBib29sIGdldF9waWRmZF9pbmZvKGludCBmZF9wZWVyX3BpZGZkLCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbylcbiB7XG4gXHRpbnQgcmV0O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvTWFrZWZpbGVcbmluZGV4IGE2NmYxMGZiMGMyMzEuLjQ1Yjg0MTc1OGYxYmYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9NYWtlZmlsZVxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvTWFrZWZpbGVcbkBAIC0yMyw2ICYjNDM7MjMsOCBAQCBURVNUX0dFTl9GSUxFUyA6PSBzY21fcmlnaHRzX2RlbmlhbF9sc20uYnBmLm9cbiBpbmNsdWRlIC4uLy4uL2xpYi5ta1xuIGluY2x1ZGUgLi4vYnBmLm1rXG4gXG4mIzQzOyQoT1VUUFVUKS9zY21fcGlkZmQ6IENGTEFHUyAmIzQzOz0gLXB0aHJlYWRcbiYjNDM7XG4gJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogJChCUEZPQkopXG4gJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogQ0ZMQUdTICYjNDM7PSAtSSQoU0NSQVRDSF9ESVIpL2luY2x1ZGVcbiAkKE9VVFBVVCkvc2NtX3JpZ2h0c19kZW5pYWxfbHNtOiBMRExJQlMgJiM0Mzs9IC1sZWxmIC1selxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L3NjbV9waWRmZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmNcbmluZGV4IDJjMThiOTJhMjYwMzUuLmJiYmQ1ZTdiNGZhNzggMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9zY21fcGlkZmQuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmNcbkBAIC0xMCw2ICYjNDM7MTAsNyBAQFxuICNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NlcnJuby5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3R5cGVzLmhcdTAwM2VcbkBAIC0yNyw2ICYjNDM7MjgsMTQgQEBcbiAjZGVmaW5lIFNDTV9QSURGRCAweDA0XG4gI2VuZGlmXG4gXG4mIzQzOyNpZm5kZWYgU09fUEFTU1BJREZEX1RIUkVBRFxuJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgODZcbiYjNDM7I2VuZGlmXG4mIzQzO1xuJiM0MzsjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQURcbiYjNDM7I2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEIDg3XG4mIzQzOyNlbmRpZlxuJiM0MztcbiAjZGVmaW5lIENISUxEX0VYSVRfQ09ERV9PSyAxMjNcbiBcbiBzdGF0aWMgdm9pZCBjaGlsZF9kaWUoKVxuQEAgLTU1Myw0ICYjNDM7NTYyLDM2MSBAQCBURVNUX0Yoc2NtX3BpZGZkLCB0ZXN0KVxuIFx0Y2xvc2UocGZkKTtcbiB9XG4gXG4mIzQzO3N0cnVjdCB0aHJlYWRfaWRzIHtcbiYjNDM7XHRwaWRfdCBwaWQ7XG4mIzQzO1x0cGlkX3QgdGlkO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnNlbmRfaWRzX3RocmVhZCh2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQgPSAqKGludCAqKWFyZztcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7XG4mIzQzO1x0XHQucGlkID0gZ2V0cGlkKCksXG4mIzQzO1x0XHQudGlkID0gZ2V0dGlkKCksXG4mIzQzO1x0fTtcbiYjNDM7XHRjaGFyIHN5bmM7XG4mIzQzO1xuJiM0MztcdGlmIChzZW5kKGZkLCBcdTAwMjZpZHMsIHNpemVvZihpZHMpLCAwKSAhPSBzaXplb2YoaWRzKSlcbiYjNDM7XHRcdHJldHVybiAodm9pZCAqKTE7XG4mIzQzO1xuJiM0MztcdC8qIHN0YXkgYWxpdmUgdW50aWwgdGhlIHJlY2VpdmVyIGhhcyBsb29rZWQgYXQgb3VyIHBpZGZkICovXG4mIzQzO1x0aWYgKHJlYWQoZmQsIFx1MDAyNnN5bmMsIDEpICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgKnNlbmRfaWRzX2NyZWRzX3RocmVhZCh2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHRpbnQgZmQgPSAqKGludCAqKWFyZztcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7XG4mIzQzO1x0XHQucGlkID0gZ2V0cGlkKCksXG4mIzQzO1x0XHQudGlkID0gZ2V0dGlkKCksXG4mIzQzO1x0fTtcbiYjNDM7XHRzdHJ1Y3QgdWNyZWQgdWNyZWQgPSB7XG4mIzQzO1x0XHQucGlkID0gZ2V0cGlkKCksXG4mIzQzO1x0XHQudWlkID0gZ2V0dWlkKCksXG4mIzQzO1x0XHQuZ2lkID0gZ2V0Z2lkKCksXG4mIzQzO1x0fTtcbiYjNDM7XHRjaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YodWNyZWQpKV0gPSB7IDAgfTtcbiYjNDM7XHRzdHJ1Y3QgaW92ZWMgaW92O1xuJiM0MztcdHN0cnVjdCBtc2doZHIgbXNnID0geyAwIH07XG4mIzQzO1x0c3RydWN0IGNtc2doZHIgKmNtc2c7XG4mIzQzO1x0Y2hhciBzeW5jO1xuJiM0MztcbiYjNDM7XHRpb3YuaW92X2Jhc2UgPSBcdTAwMjZpZHM7XG4mIzQzO1x0aW92Lmlvdl9sZW4gPSBzaXplb2YoaWRzKTtcbiYjNDM7XG4mIzQzO1x0bXNnLm1zZ19pb3YgPSBcdTAwMjZpb3Y7XG4mIzQzO1x0bXNnLm1zZ19pb3ZsZW4gPSAxO1xuJiM0MztcdG1zZy5tc2dfY29udHJvbCA9IGNvbnRyb2w7XG4mIzQzO1x0bXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNvbnRyb2wpO1xuJiM0MztcbiYjNDM7XHRjbXNnID0gQ01TR19GSVJTVEhEUihcdTAwMjZtc2cpO1xuJiM0MztcdGNtc2ctXHUwMDNlY21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7XG4mIzQzO1x0Y21zZy1cdTAwM2VjbXNnX3R5cGUgPSBTQ01fQ1JFREVOVElBTFM7XG4mIzQzO1x0Y21zZy1cdTAwM2VjbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZih1Y3JlZCkpO1xuJiM0MztcdG1lbWNweShDTVNHX0RBVEEoY21zZyksIFx1MDAyNnVjcmVkLCBzaXplb2YodWNyZWQpKTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNlbmRtc2coZmQsIFx1MDAyNm1zZywgMCkgIT0gc2l6ZW9mKGlkcykpXG4mIzQzO1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuJiM0MztcbiYjNDM7XHRpZiAocmVhZChmZCwgXHUwMDI2c3luYywgMSkgIT0gMSlcbiYjNDM7XHRcdHJldHVybiAodm9pZCAqKTE7XG4mIzQzO1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCB0aHJlYWRfY2xpZW50KGludCBmZCwgaW50IHN5bmNmZCwgdm9pZCAqKCpzZW5kZXIpKHZvaWQgKikpXG4mIzQzO3tcbiYjNDM7XHRwdGhyZWFkX3QgdGhyZWFkO1xuJiM0MztcdHZvaWQgKnJldDtcbiYjNDM7XHRjaGFyIHN5bmM7XG4mIzQzO1xuJiM0MztcdC8qIHdhaXQgdW50aWwgdGhlIHJlY2VpdmVyIGVuYWJsZWQgU09fUEFTU1BJREZEICovXG4mIzQzO1x0aWYgKHJlYWQoc3luY2ZkLCBcdTAwMjZzeW5jLCAxKSAhPSAxKVxuJiM0MztcdFx0Y2hpbGRfZGllKCk7XG4mIzQzO1xuJiM0MztcdGlmIChwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIHNlbmRlciwgXHUwMDI2ZmQpKVxuJiM0MztcdFx0Y2hpbGRfZGllKCk7XG4mIzQzO1xuJiM0MztcdGlmIChwdGhyZWFkX2pvaW4odGhyZWFkLCBcdTAwMjZyZXQpIHx8IHJldClcbiYjNDM7XHRcdGNoaWxkX2RpZSgpO1xuJiM0MztcbiYjNDM7XHRleGl0KDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlY3ZfcGlkZmQoaW50IGZkLCBzdHJ1Y3QgdGhyZWFkX2lkcyAqaWRzKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBjb250cm9sW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXSA9IHsgMCB9O1xuJiM0MztcdHN0cnVjdCBpb3ZlYyBpb3Y7XG4mIzQzO1x0c3RydWN0IG1zZ2hkciBtc2cgPSB7IDAgfTtcbiYjNDM7XHRzdHJ1Y3QgY21zZ2hkciAqY21zZztcbiYjNDM7XHRpbnQgcGlkZmQgPSAtMTtcbiYjNDM7XG4mIzQzO1x0aW92Lmlvdl9iYXNlID0gaWRzO1xuJiM0MztcdGlvdi5pb3ZfbGVuID0gc2l6ZW9mKCppZHMpO1xuJiM0MztcbiYjNDM7XHRtc2cubXNnX2lvdiA9IFx1MDAyNmlvdjtcbiYjNDM7XHRtc2cubXNnX2lvdmxlbiA9IDE7XG4mIzQzO1x0bXNnLm1zZ19jb250cm9sID0gY29udHJvbDtcbiYjNDM7XHRtc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbCk7XG4mIzQzO1xuJiM0MztcdGlmIChyZWN2bXNnKGZkLCBcdTAwMjZtc2csIDApICE9IHNpemVvZigqaWRzKSkge1xuJiM0MztcdFx0bG9nX2VycihcJiMzNDtyZWN2bXNnXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtc2cubXNnX2ZsYWdzIFx1MDAyNiAoTVNHX1RSVU5DIHwgTVNHX0NUUlVOQykpIHtcbiYjNDM7XHRcdGxvZ19lcnIoXCYjMzQ7cmVjdm1zZzogdHJ1bmNhdGVkXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGZvciAoY21zZyA9IENNU0dfRklSU1RIRFIoXHUwMDI2bXNnKTsgY21zZyAhPSBOVUxMO1xuJiM0MztcdCAgICAgY21zZyA9IENNU0dfTlhUSERSKFx1MDAyNm1zZywgY21zZykpIHtcbiYjNDM7XHRcdGlmIChjbXNnLVx1MDAzZWNtc2dfbGV2ZWwgPT0gU09MX1NPQ0tFVCBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICBjbXNnLVx1MDAzZWNtc2dfdHlwZSA9PSBTQ01fUElERkQpXG4mIzQzO1x0XHRcdG1lbWNweShcdTAwMjZwaWRmZCwgQ01TR19EQVRBKGNtc2cpLCBzaXplb2YocGlkZmQpKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldHVybiBwaWRmZDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0aHJlYWRfcGlkZmRfZmxvdyh2b2lkICooKnNlbmRlcikodm9pZCAqKSwgaW50IG9wdG5hbWUsXG4mIzQzO1x0XHRcdCAgICAgc3RydWN0IHRocmVhZF9pZHMgKmlkcywgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pXG4mIzQzO3tcbiYjNDM7XHRpbnQgc2tbMl07XG4mIzQzO1x0aW50IHN5bmNwaXBlWzJdO1xuJiM0MztcdGludCBwaWRmZDtcbiYjNDM7XHRpbnQgY2hpbGRfc3RhdHVzID0gMDtcbiYjNDM7XHRwaWRfdCBjaGlsZDtcbiYjNDM7XG4mIzQzO1x0aWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNrKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHBpcGUoc3luY3BpcGUpKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRjaGlsZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoY2hpbGQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGlmIChjaGlsZCA9PSAwKSB7XG4mIzQzO1x0XHRjbG9zZShza1swXSk7XG4mIzQzO1x0XHRjbG9zZShzeW5jcGlwZVsxXSk7XG4mIzQzO1x0XHR0aHJlYWRfY2xpZW50KHNrWzFdLCBzeW5jcGlwZVswXSwgc2VuZGVyKTtcbiYjNDM7XHR9XG4mIzQzO1x0Y2xvc2Uoc2tbMV0pO1xuJiM0MztcdGNsb3NlKHN5bmNwaXBlWzBdKTtcbiYjNDM7XG4mIzQzO1x0aW50IG9uID0gMTtcbiYjNDM7XG4mIzQzO1x0aWYgKHNldHNvY2tvcHQoc2tbMF0sIFNPTF9TT0NLRVQsIG9wdG5hbWUsIFx1MDAyNm9uLCBzaXplb2Yob24pKSkge1xuJiM0MztcdFx0bG9nX2VycihcJiMzNDtGYWlsZWQgdG8gc2V0IHBpZGZkIHBhc3Npbmcgb3B0aW9uXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICh3cml0ZShzeW5jcGlwZVsxXSwgXCYjMzQ7MVwmIzM0OywgMSkgIT0gMSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRjbG9zZShzeW5jcGlwZVsxXSk7XG4mIzQzO1xuJiM0MztcdHBpZGZkID0gcmVjdl9waWRmZChza1swXSwgaWRzKTtcbiYjNDM7XHRpZiAocGlkZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGluZm8tXHUwMDNlbWFzayA9IFBJREZEX0lORk9fUElEO1xuJiM0MztcdGlmIChpb2N0bChwaWRmZCwgUElERkRfR0VUX0lORk8sIGluZm8pKSB7XG4mIzQzO1x0XHRsb2dfZXJyKFwmIzM0O2lvY3RsKFBJREZEX0dFVF9JTkZPKVwmIzM0Oyk7XG4mIzQzO1x0XHRjbG9zZShwaWRmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcdGNsb3NlKHBpZGZkKTtcbiYjNDM7XG4mIzQzO1x0LyogcmVsZWFzZSB0aGUgc2VuZGluZyB0aHJlYWQgKi9cbiYjNDM7XHRpZiAod3JpdGUoc2tbMF0sIFwmIzM0O3hcJiMzNDssIDEpICE9IDEpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0Y2xvc2Uoc2tbMF0pO1xuJiM0MztcbiYjNDM7XHR3YWl0cGlkKGNoaWxkLCBcdTAwMjZjaGlsZF9zdGF0dXMsIDApO1xuJiM0MztcdGlmICghV0lGRVhJVEVEKGNoaWxkX3N0YXR1cykgfHwgV0VYSVRTVEFUVVMoY2hpbGRfc3RhdHVzKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgc29ja29wdF9zZXQoaW50IGZkLCBpbnQgb3B0bmFtZSwgaW50IHZhbClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBvcHRuYW1lLCBcdTAwMjZ2YWwsIHNpemVvZih2YWwpKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzb2Nrb3B0X2dldChpbnQgZmQsIGludCBvcHRuYW1lKVxuJiM0Mzt7XG4mIzQzO1x0c29ja2xlbl90IGxlbiA9IHNpemVvZihpbnQpO1xuJiM0MztcdGludCB2YWwgPSAtMTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIG9wdG5hbWUsIFx1MDAyNnZhbCwgXHUwMDI2bGVuKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHZhbDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVChzY21fcGlkZmRfc2V0c29ja29wdF92YWx1ZXMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgc2tbMl07XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaykpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQsIDEpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xuJiM0MztcbiYjNDM7XHQvKiBUaGUgb3B0aW9uIHNldCBsYXN0IHdpbnMuICovXG4mIzQzO1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkQsIDEpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQsIDEpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xuJiM0MztcbiYjNDM7XHQvKiBEaXNhYmxpbmcgb25lIG9wdGlvbiBsZWF2ZXMgdGhlIG90aGVyIGFsb25lLiAqL1xuJiM0MztcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZELCAwKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDEsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFELCAwKSk7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkQpKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcbiYjNDM7XG4mIzQzO1x0Y2xvc2Uoc2tbMF0pO1xuJiM0MztcdGNsb3NlKHNrWzFdKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVChzY21fcGlkZmRfdGhyZWFkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocmVhZF9pZHMgaWRzO1xuJiM0MztcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm87XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsXG4mIzQzO1x0XHRcdFx0ICAgICAgIFx1MDAyNmlkcywgXHUwMDI2aW5mbykpO1xuJiM0MztcdEFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTtcbiYjNDM7XHRFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpO1xuJiM0MztcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztURVNUKHNjbV9waWRmZF90aHJlYWRfZ3JvdXApXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7XG4mIzQzO1x0c3RydWN0IHBpZGZkX2luZm8gaW5mbztcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKDAsIHRocmVhZF9waWRmZF9mbG93KHNlbmRfaWRzX3RocmVhZCwgU09fUEFTU1BJREZELFxuJiM0MztcdFx0XHRcdCAgICAgICBcdTAwMjZpZHMsIFx1MDAyNmluZm8pKTtcbiYjNDM7XHRBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7XG4mIzQzO1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8ucGlkKTtcbiYjNDM7XHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7VEVTVChzY21fcGlkZmRfdGhyZWFkX2NyZWRzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRocmVhZF9pZHMgaWRzO1xuJiM0MztcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm87XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc19jcmVkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsXG4mIzQzO1x0XHRcdFx0ICAgICAgIFx1MDAyNmlkcywgXHUwMDI2aW5mbykpO1xuJiM0MztcdEFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTtcbiYjNDM7XHRFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpO1xuJiM0MztcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgdm9pZCAqcGVlcl9jb25uZWN0X3RocmVhZCh2b2lkICphcmcpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc29ja19hZGRyICpzYSA9IGFyZztcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7XG4mIzQzO1x0XHQucGlkID0gZ2V0cGlkKCksXG4mIzQzO1x0XHQudGlkID0gZ2V0dGlkKCksXG4mIzQzO1x0fTtcbiYjNDM7XHRpbnQgZmQ7XG4mIzQzO1x0Y2hhciBzeW5jO1xuJiM0MztcbiYjNDM7XHRmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7XG4mIzQzO1x0aWYgKGZkIFx1MDAzYyAwKVxuJiM0MztcdFx0cmV0dXJuICh2b2lkICopMTtcbiYjNDM7XG4mIzQzO1x0aWYgKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZzYS1cdTAwM2VsaXN0ZW5fYWRkciwgc2EtXHUwMDNlYWRkcmxlbikpXG4mIzQzO1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuJiM0MztcbiYjNDM7XHRpZiAoc2VuZChmZCwgXHUwMDI2aWRzLCBzaXplb2YoaWRzKSwgMCkgIT0gc2l6ZW9mKGlkcykpXG4mIzQzO1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuJiM0MztcbiYjNDM7XHQvKiBzdGF5IGFsaXZlIHVudGlsIHRoZSBzZXJ2ZXIgaGFzIGxvb2tlZCBhdCBvdXIgcGlkZmQgKi9cbiYjNDM7XHRpZiAocmVhZChmZCwgXHUwMDI2c3luYywgMSkgIT0gMSlcbiYjNDM7XHRcdHJldHVybiAodm9pZCAqKTE7XG4mIzQzO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XHRyZXR1cm4gTlVMTDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBwZWVyX3BpZGZkX2luZm8oaW50IGZkLCBpbnQgb3B0bmFtZSwgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pXG4mIzQzO3tcbiYjNDM7XHRpbnQgcGlkZmQ7XG4mIzQzO1x0c29ja2xlbl90IGxlbiA9IHNpemVvZihwaWRmZCk7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBvcHRuYW1lLCBcdTAwMjZwaWRmZCwgXHUwMDI2bGVuKSkge1xuJiM0MztcdFx0bG9nX2VycihcJiMzNDtnZXRzb2Nrb3B0KFNPX1BFRVJQSURGRCopXCYjMzQ7KTtcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGluZm8tXHUwMDNlbWFzayA9IFBJREZEX0lORk9fUElEO1xuJiM0MztcdGlmIChpb2N0bChwaWRmZCwgUElERkRfR0VUX0lORk8sIGluZm8pKSB7XG4mIzQzO1x0XHRsb2dfZXJyKFwmIzM0O2lvY3RsKFBJREZEX0dFVF9JTkZPKVwmIzM0Oyk7XG4mIzQzO1x0XHRjbG9zZShwaWRmZCk7XG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRjbG9zZShwaWRmZCk7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmV0dXJucyBhIHBpZGZkIGZvciB0aGUgcGVlciYjMzk7cyBjb25uZWN0aW5nIHRocmVhZC4gKi9cbiYjNDM7VEVTVChzb19wZWVycGlkZmRfdGhyZWFkKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHNvY2tfYWRkciBzYTtcbiYjNDM7XHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7XG4mIzQzO1x0c3RydWN0IHBpZGZkX2luZm8gaW5mbztcbiYjNDM7XHRwdGhyZWFkX3QgdGhyZWFkO1xuJiM0MztcdHZvaWQgKnRyZXQ7XG4mIzQzO1x0aW50IHNlcnZlciwgY2ZkO1xuJiM0MztcbiYjNDM7XHRzZXJ2ZXIgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApO1xuJiM0MztcdEFTU0VSVF9MRSgwLCBzZXJ2ZXIpO1xuJiM0MztcbiYjNDM7XHRmaWxsX3NvY2thZGRyKFx1MDAyNnNhLCB0cnVlKTtcbiYjNDM7XHRBU1NFUlRfRVEoMCwgYmluZChzZXJ2ZXIsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZzYS5saXN0ZW5fYWRkciwgc2EuYWRkcmxlbikpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBsaXN0ZW4oc2VydmVyLCAxKSk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIHBlZXJfY29ubmVjdF90aHJlYWQsIFx1MDAyNnNhKSk7XG4mIzQzO1xuJiM0MztcdGNmZCA9IGFjY2VwdChzZXJ2ZXIsIE5VTEwsIE5VTEwpO1xuJiM0MztcdEFTU0VSVF9MRSgwLCBjZmQpO1xuJiM0MztcbiYjNDM7XHRBU1NFUlRfRVEoc2l6ZW9mKGlkcyksIHJlY3YoY2ZkLCBcdTAwMjZpZHMsIHNpemVvZihpZHMpLCBNU0dfV0FJVEFMTCkpO1xuJiM0MztcdEFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTtcbiYjNDM7XG4mIzQzO1x0LyogU09fUEVFUlBJREZEIHJlZmVycyB0byB0aGUgcGVlciYjMzk7cyB0aHJlYWQtZ3JvdXAuICovXG4mIzQzO1x0QVNTRVJUX0VRKDAsIHBlZXJfcGlkZmRfaW5mbyhjZmQsIFNPX1BFRVJQSURGRCwgXHUwMDI2aW5mbykpO1xuJiM0MztcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnBpZCk7XG4mIzQzO1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XG4mIzQzO1xuJiM0MztcdC8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmVmZXJzIHRvIHRoZSBjb25uZWN0aW5nIHRocmVhZC4gKi9cbiYjNDM7XHRBU1NFUlRfRVEoMCwgcGVlcl9waWRmZF9pbmZvKGNmZCwgU09fUEVFUlBJREZEX1RIUkVBRCwgXHUwMDI2aW5mbykpO1xuJiM0MztcdEVYUEVDVF9FUShpZHMudGlkLCBpbmZvLnBpZCk7XG4mIzQzO1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XG4mIzQzO1xuJiM0MztcdC8qIHJlbGVhc2UgdGhlIGNvbm5lY3RpbmcgdGhyZWFkICovXG4mIzQzO1x0QVNTRVJUX0VRKDEsIHdyaXRlKGNmZCwgXCYjMzQ7eFwmIzM0OywgMSkpO1xuJiM0MztcdEFTU0VSVF9FUSgwLCBwdGhyZWFkX2pvaW4odGhyZWFkLCBcdTAwMjZ0cmV0KSk7XG4mIzQzO1x0QVNTRVJUX0VRKE5VTEwsIHRyZXQpO1xuJiM0MztcbiYjNDM7XHRjbG9zZShjZmQpO1xuJiM0MztcdGNsb3NlKHNlcnZlcik7XG4mIzQzO31cbiYjNDM7XG4gVEVTVF9IQVJORVNTX01BSU5cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMDwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT40bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtVTklYJiMzNDssCiAgICAmIzM0O0NPUkVEVU1QJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c2tfc2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtza19nZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O3NjbV9yZWN2X3VuaXgmIzM0OywKICAgICYjMzQ7X19zY21fc2VuZCYjMzQ7LAogICAgJiMzNDtfX3BpZGZzX3JlZ2lzdGVyX3BpZHMmIzM0OywKICAgICYjMzQ7cGlkZnNfY29yZWR1bXAmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgU09fUEFTU1BJREZEX1RIUkVBRCBhbmQgU09fUEVFUlBJREZEX1RIUkVBRCBzb2NrZXQgb3B0aW9ucyB0byBhbGxvdyBwYXNzaW5nIGFuZCBxdWVyeWluZyB0aHJlYWQtc3BlY2lmaWMgcGlkZmRzIG92ZXIgVU5JWCBkb21haW4gc29ja2V0cy4gSXQgdXBkYXRlcyBzdHJ1Y3Qgc29jaywgU0NNIGNyZWRlbnRpYWwgcGFzc2luZywgVU5JWCBzb2NrZXQgcmVhZC93cml0ZSBjcmVkZW50aWFsIG1hdGNoaW5nLCBwaWRmcyBwaWQgcmVnaXN0cmF0aW9uLCBhbmQgY29yZWR1bXAgbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzMzJiMDNhNTk3ODc2NzEyOTRlNTE3ZDAzNWY1NDVkZDk5MjA2M2IxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMzEgMTI6MzA6MjMgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmgKaW5kZXggOTQ2YTVmYWQyNjkxMi4uNWQzNTI0YzI2YjJiYyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaApAQCAtMTU3LDYgJiM0MzsxNTcsMTAgQEAKIAogI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQyAgICAgIDg1CiAKJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgICAgODYKJiM0MzsKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgICAgODcKJiM0MzsKICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCmluZGV4IGYxNjQxZGRlMTM1ZmMuLjI0NWE0M2Y1MmZiMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCkBAIC0xNjgsNiAmIzQzOzE2OCwxMCBAQAogCiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DICAgICAgODUKIAomIzQzOyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICA4NgomIzQzOwomIzQzOyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCAgICA4NwomIzQzOwogI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pCiAKICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCmluZGV4IGYzYTM4MTVjN2RjMjkuLmYyMzcxMGUxYzY3MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaApAQCAtMTQ5LDYgJiM0MzsxNDksMTAgQEAKIAogI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQwkweDQwNTMKIAomIzQzOyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRAkweDQwNTQKJiM0MzsKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQJMHg0MDU1CiYjNDM7CiAjaWYgIWRlZmluZWQoX19LRVJORUxfXykKIAogI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCmluZGV4IDc5MDdmM2IxZjBlZTAuLmIzNWIyNWJkZWZjMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmgKQEAgLTE1MCw2ICYjNDM7MTUwLDEwIEBACiAKICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkMgICAgICAgIDB4MDA1ZQogCiYjNDM7I2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEICAgICAgMHgwMDVmCiYjNDM7CiYjNDM7I2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEICAgICAgMHgwMDYwCiYjNDM7CiAjaWYgIWRlZmluZWQoX19LRVJORUxfXykKIAogCmRpZmYgLS1naXQgYS9mcy9jb3JlZHVtcC5jIGIvZnMvY29yZWR1bXAuYwppbmRleCBhYzNjZDc0ODA4YzY0Li5iNWZmNGIzZTE4MzFlIDEwMDY0NAotLS0gYS9mcy9jb3JlZHVtcC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2NvcmVkdW1wLmMKQEAgLTQ1NCw3ICYjNDM7NDU0LDcgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfcGFyc2Uoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sCiAJCQkJICogbGVhZGVyIHdlIGtub3cgdGhhdCB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlcgogCQkJCSAqIGNhbm5vdCBiZSByZWFwZWQgdW50aWwgQGN1cnJlbnQgaGFzIGV4aXRlZC4KIAkJCQkgKi8KLQkJCQljcHJtLSZndDtwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7CiYjNDM7CQkJCXRhc2tfcGlkcyhjcHJtLSZndDtwaWQsIGN1cnJlbnQpOwogCQkJCWVyciA9IGNuX3ByaW50ZihjbiwgJiMzNDslZCYjMzQ7LCBDT1JFRFVNUF9QSURGRF9OVU1CRVIpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNjI2LDEzICYjNDM7NjI2LDE3IEBAIHN0YXRpYyBpbnQgdW1oX2NvcmVkdW1wX3NldHVwKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpCiAJc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3AgPSAoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqKWluZm8tJmd0O2RhdGE7CiAJaW50IGVycjsKIAotCWlmIChjcC0mZ3Q7cGlkKSB7CiYjNDM7CWlmIChjcC0mZ3Q7cGlkW1BJRFRZUEVfVEdJRF0pIHsKIAkJc3RydWN0IGZpbGUgKnBpZGZzX2ZpbGUgX19mcmVlKGZwdXQpID0gTlVMTDsKIAotCQlwaWRmc19maWxlID0gcGlkZnNfYWxsb2NfZmlsZShjcC0mZ3Q7cGlkLCAwKTsKJiM0MzsJCXBpZGZzX2ZpbGUgPSBwaWRmc19hbGxvY19maWxlKGNwLSZndDtwaWRbUElEVFlQRV9UR0lEXSwgMCk7CiAJCWlmIChJU19FUlIocGlkZnNfZmlsZSkpCiAJCQlyZXR1cm4gUFRSX0VSUihwaWRmc19maWxlKTsKIAomIzQzOwkJZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhjcC0mZ3Q7cGlkKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsKIAkJcGlkZnNfY29yZWR1bXAoY3ApOwogCiAJCS8qCkBAIC02OTUsMTIgJiM0Mzs2OTksMTIgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICoKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyoKLQkgKiBTZXQgdGhlIHRocmVhZC1ncm91cCBsZWFkZXIgcGlkIHdoaWNoIGlzIHVzZWQgZm9yIHRoZSBwZWVyCi0JICogY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy4gVGhlbiBpbW1lZGlhdGVseSByZWdpc3RlcgotCSAqIGl0IGluIHBpZGZzLi4uCiYjNDM7CSAqIFNldCB0aGUgcGlkcyBvZiB0aGUgZHVtcGluZyB0aHJlYWQgYW5kIGl0cyB0aHJlYWQtZ3JvdXAgbGVhZGVyCiYjNDM7CSAqIHdoaWNoIGFyZSB1c2VkIGZvciB0aGUgcGVlciBjcmVkZW50aWFscyBkdXJpbmcgY29ubmVjdCgpIGJlbG93LgomIzQzOwkgKiBUaGVuIGltbWVkaWF0ZWx5IHJlZ2lzdGVyIHRoZW0gaW4gcGlkZnMuLi4KIAkgKi8KLQljcHJtLSZndDtwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7Ci0JcmV0dmFsID0gcGlkZnNfcmVnaXN0ZXJfcGlkKGNwcm0tJmd0O3BpZCk7CiYjNDM7CXRhc2tfcGlkcyhjcHJtLSZndDtwaWQsIGN1cnJlbnQpOwomIzQzOwlyZXR2YWwgPSBwaWRmc19yZWdpc3Rlcl9waWRzKGNwcm0tJmd0O3BpZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC03MjIsNyAmIzQzOzcyNiw3IEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqCiAJfQogCiAJLyogLi4uIGFuZCB2YWxpZGF0ZSB0aGF0IEBza19wZWVyX3BpZCBtYXRjaGVzIEBjcHJtLnBpZC4gKi8KLQlpZiAoV0FSTl9PTl9PTkNFKHVuaXhfcGVlcihzb2NrZXQtJmd0O3NrKS0mZ3Q7c2tfcGVlcl9waWQgIT0gY3BybS0mZ3Q7cGlkKSkKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghcGlkc19lcXVhbCh1bml4X3BlZXIoc29ja2V0LSZndDtzayktJmd0O3NrX3BlZXJfcGlkLCBjcHJtLSZndDtwaWQpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJY3BybS0mZ3Q7bGltaXQgPSBSTElNX0lORklOSVRZOwpkaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmMKaW5kZXggYTZhNjQzZjE1ZDA4YS4uMjkyOTliMmM3Y2E3MSAxMDA2NDQKLS0tIGEvZnMvcGlkZnMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9waWRmcy5jCkBAIC03OTMsOSAmIzQzOzc5Myw5IEBAIHZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIH0KIAogI2lmZGVmIENPTkZJR19DT1JFRFVNUAotdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKQomIzQzO3N0YXRpYyB2b2lkIHBpZGZzX2NvcmVkdW1wX3BpZChzdHJ1Y3QgcGlkICpwaWQsCiYjNDM7CQkJICAgICAgIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pCiB7Ci0Jc3RydWN0IHBpZCAqcGlkID0gY3BybS0mZ3Q7cGlkOwogCXN0cnVjdCBwaWRmc19hdHRyICphdHRyOwogCiAJYXR0ciA9IFJFQURfT05DRShwaWQtJmd0O2F0dHIpOwpAQCAtODE0LDYgJiM0Mzs4MTQsMTMgQEAgdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKQogCXNtcF93bWIoKTsKIAlzZXRfYml0KFBJREZTX0FUVFJfQklUX0NPUkVEVU1QLCAmYW1wO2F0dHItJmd0O2F0dHJfbWFzayk7CiB9CiYjNDM7CiYjNDM7dm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKQomIzQzO3sKJiM0MzsJLyogVGhlIGR1bXBpbmcgdGhyZWFkJiMzOTtzIHBpZGZkIHJlcG9ydHMgdGhlIGNvcmVkdW1wIGFzIHdlbGwuICovCiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gcGlkc19sYXN0KGNwcm0tJmd0O3BpZCk7IHR5cGUmIzQzOyYjNDM7KQomIzQzOwkJcGlkZnNfY29yZWR1bXBfcGlkKGNwcm0tJmd0O3BpZFt0eXBlXSwgY3BybSk7CiYjNDM7fQogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnBpZGZzX21udCBfX3JvX2FmdGVyX2luaXQ7CkBAIC0xMDcwLDYgJiM0MzsxMDc3LDIyIEBAIGludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKQogCXJldHVybiAwOwogfQogCiYjNDM7LyogUmVnaXN0ZXIgdGhlIHBpZHMgdXAgdG8gcGlkIHR5cGUgQGxhc3Qgb2YgQHBpZHMgaW4gcGlkZnMuICovCiYjNDM7aW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShsYXN0ICZndDs9IFBJRFRZUEVfTUFYKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlICZsdDs9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcmV0ID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZHNbdHlwZV0pOwomIzQzOwomIzQzOwkJaWYgKHVubGlrZWx5KHJldCkpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcGlkZnNfc3Rhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKipzdGFzaGVkLAogCQkJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oCmluZGV4IDdiMzhlZTJlNzkxM2IuLjBiYmI3ZGU2YTQwMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgKQEAgLTUsNiAmIzQzOzUsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9waWRfdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC9jb3JlZHVtcC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9zaWdpbmZvLmgmZ3Q7CiAKQEAgLTMyLDcgJiM0MzszMyw4IEBAIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgewogCWludCB2bWFfY291bnQ7CiAJc2l6ZV90IHZtYV9kYXRhX3NpemU7CiAJc3RydWN0IGNvcmVfdm1hX21ldGFkYXRhICp2bWFfbWV0YTsKLQlzdHJ1Y3QgcGlkICpwaWQ7CiYjNDM7CS8qIER1bXBpbmcgdGhyZWFkIGFuZCBpdHMgdGhyZWFkLWdyb3VwIGxlYWRlciBieSBwaWQgdHlwZS4gKi8KJiM0MzsJREVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTsKIH07CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgY29yZV9maWxlX25vdGVfc2l6ZV9saW1pdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkLmggYi9pbmNsdWRlL2xpbnV4L3BpZC5oCmluZGV4IGRkYWVmMGJiYzhiYTMuLjg3NjM1ZDBjYzFmNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlkLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9waWQuaApAQCAtMiw2ICYjNDM7Miw5IEBACiAjaWZuZGVmIF9MSU5VWF9QSURfSAogI2RlZmluZSBfTElOVVhfUElEX0gKIAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hcnJheV9zaXplLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkX2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9taW5tYXguaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9waWRfdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9yY3VsaXN0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcmN1cGRhdGUuaCZndDsKQEAgLTkyLDYgJiM0Mzs5NSw1NiBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBwaWQgKmdldF9waWQoc3RydWN0IHBpZCAqcGlkKQogfQogCiBleHRlcm4gdm9pZCBwdXRfcGlkKHN0cnVjdCBwaWQgKnBpZCk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBIZWxwZXJzIGZvciBhcnJheXMgb2Ygc3RydWN0IHBpZCBpbmRleGVkIGJ5IHBpZCB0eXBlIGRlY2xhcmVkIHdpdGgKJiM0MzsgKiBERUNMQVJFX1BJRFMoKS4gVGhlIGFycmF5IGNvdmVycyBQSURUWVBFX1BJRCB1cCB0byB0aGUgcGlkIHR5cGUgaXQKJiM0MzsgKiB3YXMgZGVjbGFyZWQgd2l0aCBhbmQgdGhlIGhlbHBlcnMgdGFrZSB0aGF0IGJvdW5kIGZyb20gdGhlIGFycmF5LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBfX2dldF9waWRzKHN0cnVjdCBwaWQgKipkc3QsIHN0cnVjdCBwaWQgKmNvbnN0ICpzcmMsCiYjNDM7CQkJICAgICAgZW51bSBwaWRfdHlwZSBsYXN0KQomIzQzO3sKJiM0MzsJZm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSAmbHQ7PSBsYXN0OyB0eXBlJiM0MzsmIzQzOykKJiM0MzsJCWRzdFt0eXBlXSA9IGdldF9waWQoc3JjW3R5cGVdKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIF9fcHV0X3BpZHMoc3RydWN0IHBpZCAqKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdCkKJiM0Mzt7CiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gbGFzdDsgdHlwZSYjNDM7JiM0MzspIHsKJiM0MzsJCXB1dF9waWQocGlkc1t0eXBlXSk7CiYjNDM7CQlwaWRzW3R5cGVdID0gTlVMTDsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX3BpZHMoc3RydWN0IHBpZCAqKmEsIHN0cnVjdCBwaWQgKipiLAomIzQzOwkJCSAgICAgICBlbnVtIHBpZF90eXBlIGxhc3QpCiYjNDM7ewomIzQzOwlmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlICZsdDs9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KQomIzQzOwkJc3dhcChhW3R5cGVdLCBiW3R5cGVdKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIF9fcGlkc19lcXVhbChzdHJ1Y3QgcGlkICpjb25zdCAqYSwgc3RydWN0IHBpZCAqY29uc3QgKmIsCiYjNDM7CQkJCWVudW0gcGlkX3R5cGUgbGFzdCkKJiM0Mzt7CiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gbGFzdDsgdHlwZSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoYVt0eXBlXSAhPSBiW3R5cGVdKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOy8qIFRoZSBsYXN0IHBpZCB0eXBlIGFuIGFycmF5IGRlY2xhcmVkIHdpdGggREVDTEFSRV9QSURTKCkgY292ZXJzLiAqLwomIzQzOyNkZWZpbmUgcGlkc19sYXN0KHBpZHMpCQkJCQkJCVwKJiM0MzsJKChlbnVtIHBpZF90eXBlKShBUlJBWV9TSVpFKHBpZHMpIC0gMSAmIzQzOwkJCQlcCiYjNDM7CQkJIEJVSUxEX0JVR19PTl9aRVJPKEFSUkFZX1NJWkUocGlkcykgJmd0OyBQSURUWVBFX01BWCkpKQomIzQzOwomIzQzOyNkZWZpbmUgX19waWRzX2xhc3QyKGEsIGIpCQkJCQkJXAomIzQzOwkocGlkc19sYXN0KGEpICYjNDM7IEJVSUxEX0JVR19PTl9aRVJPKEFSUkFZX1NJWkUoYSkgIT0gQVJSQVlfU0laRShiKSkpCiYjNDM7CiYjNDM7I2RlZmluZSBnZXRfcGlkcyhkc3QsIHNyYykJX19nZXRfcGlkcyhkc3QsIHNyYywgX19waWRzX2xhc3QyKGRzdCwgc3JjKSkKJiM0MzsjZGVmaW5lIHB1dF9waWRzKHBpZHMpCQlfX3B1dF9waWRzKHBpZHMsIHBpZHNfbGFzdChwaWRzKSkKJiM0MzsjZGVmaW5lIHN3YXBfcGlkcyhhLCBiKQkJX19zd2FwX3BpZHMoYSwgYiwgX19waWRzX2xhc3QyKGEsIGIpKQomIzQzOyNkZWZpbmUgcGlkc19lcXVhbChhLCBiKQlfX3BpZHNfZXF1YWwoYSwgYiwgX19waWRzX2xhc3QyKGEsIGIpKQomIzQzOwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlKTsKIHN0YXRpYyBpbmxpbmUgYm9vbCBwaWRfaGFzX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaAppbmRleCBjMmFlZTFkOTFkY2ZkLi4zMzAyNjkwYTJhMjgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmgKQEAgLTIsNiAmIzQzOzIsOCBAQAogI2lmbmRlZiBfTElOVVhfUElEX1RZUEVTX0gKICNkZWZpbmUgX0xJTlVYX1BJRF9UWVBFU19ICiAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVpbGRfYnVnLmgmZ3Q7CiYjNDM7CiBlbnVtIHBpZF90eXBlIHsKIAlQSURUWVBFX1BJRCwKIAlQSURUWVBFX1RHSUQsCkBAIC0xMCw2ICYjNDM7MTIsMTIgQEAgZW51bSBwaWRfdHlwZSB7CiAJUElEVFlQRV9NQVgsCiB9OwogCiYjNDM7c3RydWN0IHBpZDsKJiM0MzsKJiM0MzsvKiBBbiBhcnJheSBvZiBzdHJ1Y3QgcGlkIGluZGV4ZWQgYnkgcGlkIHR5cGUsIFBJRFRZUEVfUElEIHVwIHRvIEBsYXN0LiAqLwomIzQzOyNkZWZpbmUgREVDTEFSRV9QSURTKG5hbWUsIGxhc3QpCQkJCQlcCiYjNDM7CXN0cnVjdCBwaWQgKm5hbWVbKGxhc3QpICYjNDM7IDEgJiM0MzsgQlVJTERfQlVHX09OX1pFUk8oKGxhc3QpICZndDs9IFBJRFRZUEVfTUFYKV0KJiM0MzsKIHN0cnVjdCBwaWRfbmFtZXNwYWNlOwogZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlIGluaXRfcGlkX25zOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZGZzLmggYi9pbmNsdWRlL2xpbnV4L3BpZGZzLmgKaW5kZXggMGFiZjdkYTlhYjIzNi4uM2MxZTgyZjFhMzY5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRmcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGlkZnMuaApAQCAtMyw2ICYjNDM7Myw3IEBACiAjZGVmaW5lIF9MSU5VWF9QSURfRlNfSAogCiAjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwX3R5cGVzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3BpZC5oJmd0OwogCiBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zOwogCkBAIC0zMiw1ICYjNDM7MzMsOSBAQCBzdGF0aWMgaW5saW5lIGludCBwaWRmc19yZWdpc3Rlcl9waWQoc3RydWN0IHBpZCAqcGlkKQogfQogCiB2b2lkIHBpZGZzX2ZyZWVfcGlkKHN0cnVjdCBwaWQgKnBpZCk7CiYjNDM7aW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KTsKJiM0MzsKJiM0MzsvKiBSZWdpc3RlciB0aGUgcGlkcyBvZiBhbiBhcnJheSBkZWNsYXJlZCB3aXRoIERFQ0xBUkVfUElEUygpLiAqLwomIzQzOyNkZWZpbmUgcGlkZnNfcmVnaXN0ZXJfcGlkcyhwaWRzKQlfX3BpZGZzX3JlZ2lzdGVyX3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpKQogCiAjZW5kaWYgLyogX0xJTlVYX1BJRF9GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaAppbmRleCA1ODRhZTg4YjQzNWU5Li45NDQ0YjQ3Nzg5YTA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKQEAgLTY3Nyw2ICYjNDM7Njc3LDI0IEBAIHN0cnVjdCBwaWQgKnRhc2tfcGlkX3R5cGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBlbnVtIHBpZF90eXBlIHR5cGUpCiAJcmV0dXJuIHBpZDsKIH0KIAomIzQzOy8qIEZpbGwgQHBpZHMgd2l0aCB0aGUgcGlkIHR5cGVzIG9mIEB0YXNrIHVwIHRvIEBsYXN0LCB3aXRob3V0IHJlZmVyZW5jZXMuICovCiYjNDM7c3RhdGljIGlubGluZSB2b2lkIF9fdGFza19waWRzKHN0cnVjdCBwaWQgKipwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QsCiYjNDM7CQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKJiM0Mzt7CiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gbGFzdDsgdHlwZSYjNDM7JiM0MzspCiYjNDM7CQlwaWRzW3R5cGVdID0gdGFza19waWRfdHlwZSh0YXNrLCB0eXBlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3Rhc2tfcGlkcyhzdHJ1Y3QgcGlkICoqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0LAomIzQzOwkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiYjNDM7ewomIzQzOwlmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlICZsdDs9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KQomIzQzOwkJcGlkc1t0eXBlXSA9IGdldF9waWQodGFza19waWRfdHlwZSh0YXNrLCB0eXBlKSk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgdGFza19waWRzKHBpZHMsIHRhc2spCQlfX3Rhc2tfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcyksIHRhc2spCiYjNDM7I2RlZmluZSBnZXRfdGFza19waWRzKHBpZHMsIHRhc2spCV9fZ2V0X3Rhc2tfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcyksIHRhc2spCiYjNDM7CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwaWQgKnRhc2tfdGdpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJcmV0dXJuIHRhc2stJmd0O3NpZ25hbC0mZ3Q7cGlkc1tQSURUWVBFX1RHSURdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NtLmggYi9pbmNsdWRlL25ldC9zY20uaAppbmRleCA4NmFlNmJjMTA5ZWM2Li5hYTdkMTVjNWZjMjcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY20uaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9zY20uaApAQCAtNDIsNyAmIzQzOzQyLDcgQEAgc3RydWN0IHNjbV9mcF9saXN0IHsKIH07CiAKIHN0cnVjdCBzY21fY29va2llIHsKLQlzdHJ1Y3QgcGlkCQkqcGlkOwkJLyogU2tiIGNyZWRlbnRpYWxzICovCiYjNDM7CURFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7CS8qIFNrYiBjcmVkZW50aWFscyBieSBwaWQgdHlwZSAqLwogCXN0cnVjdCBzY21fZnBfbGlzdAkqZnA7CQkvKiBQYXNzZWQgZmlsZXMJCSovCiAJc3RydWN0IHNjbV9jcmVkcwljcmVkczsJCS8qIFNrYiBjcmVkZW50aWFscwkqLwogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLCkBAIC02OSw3ICYjNDM7NjksNyBAQCBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNjbV9jbwogc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwKIAkJCQkgICAgc3RydWN0IHBpZCAqcGlkLCBrdWlkX3QgdWlkLCBrZ2lkX3QgZ2lkKQogewotCXNjbS0mZ3Q7cGlkID0gZ2V0X3BpZChwaWQpOwomIzQzOwlzY20tJmd0O3BpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwaWQpOwogCXNjbS0mZ3Q7Y3JlZHMucGlkID0gcGlkX3ZucihwaWQpOwogCXNjbS0mZ3Q7Y3JlZHMudWlkID0gdWlkOwogCXNjbS0mZ3Q7Y3JlZHMuZ2lkID0gZ2lkOwpAQCAtNzcsOCAmIzQzOzc3LDcgQEAgc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveV9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20pCiB7Ci0JcHV0X3BpZChzY20tJmd0O3BpZCk7Ci0Jc2NtLSZndDtwaWQgPSBOVUxMOwomIzQzOwlwdXRfcGlkcyhzY20tJmd0O3BpZCk7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCA1MTE4NTIyMmFhYzI5Li42N2I3NDNiYWIyMjBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC0zMDEsNyAmIzQzOzMwMSw3IEBAIHN0cnVjdCBza19maWx0ZXI7CiAgICoJQHNrX3R5cGU6IHNvY2tldCB0eXBlICglU09DS19TVFJFQU0sIGV0YykKICAgKglAc2tfcHJvdG9jb2w6IHdoaWNoIHByb3RvY29sIHRoaXMgc29ja2V0IGJlbG9uZ3MgaW4gdGhpcyBuZXR3b3JrIGZhbWlseQogICAqCUBza19wZWVyX2xvY2s6IGxvY2sgcHJvdGVjdGluZyBAc2tfcGVlcl9waWQgYW5kIEBza19wZWVyX2NyZWQKLSAgKglAc2tfcGVlcl9waWQ6ICZhbXA7c3RydWN0IHBpZCBmb3IgdGhpcyBzb2NrZXQmIzM5O3MgcGVlcgomIzQzOyAgKglAc2tfcGVlcl9waWQ6ICZhbXA7c3RydWN0IHBpZCBmb3IgdGhpcyBzb2NrZXQmIzM5O3MgcGVlciwgYnkgcGlkIHR5cGUKICAgKglAc2tfcGVlcl9jcmVkOiAlU09fUEVFUkNSRUQgc2V0dGluZwogICAqCUBza19yY3Zsb3dhdDogJVNPX1JDVkxPV0FUIHNldHRpbmcKICAgKglAc2tfcmN2dGltZW86ICVTT19SQ1ZUSU1FTyBzZXR0aW5nCkBAIC0zNTYsNiAmIzQzOzM1Niw3IEBAIHN0cnVjdCBza19maWx0ZXI7CiAgICoJQHNrX3NjbV9zZWN1cml0eTogZmxhZ2dlZCBieSBTT19QQVNTU0VDIHRvIHJlY3YgU0NNX1NFQ1VSSVRZCiAgICoJQHNrX3NjbV9waWRmZDogZmxhZ2dlZCBieSBTT19QQVNTUElERkQgdG8gcmVjdiBTQ01fUElERkQKICAgKglAc2tfc2NtX3JpZ2h0czogZmxhZ2dlZCBieSBTT19QQVNTUklHSFRTIHRvIHJlY3YgU0NNX1JJR0hUUwomIzQzOyAgKglAc2tfc2NtX3BpZGZkX3RocmVhZDogZmxhZ2dlZCBieSBTT19QQVNTUElERkRfVEhSRUFEIHRvIHJlY3YgYSB0aHJlYWQgU0NNX1BJREZECiAgICoJQHNrX3NjbV91bnVzZWQ6IHVudXNlZCBmbGFncyBmb3Igc2NtX3JlY3YoKQogICAqCUBuc190cmFja2VyOiB0cmFja2VyIGZvciBuZXRucyByZWZlcmVuY2UKICAgKglAc2tfdXNlcl9mcmFnczogeGFycmF5IG9mIHBhZ2VzIHRoZSB1c2VyIGlzIGhvbGRpbmcgYSByZWZlcmVuY2Ugb24uCkBAIC01NDUsNyAmIzQzOzU0Niw3IEBAIHN0cnVjdCBzb2NrIHsKIAl1NjQJCQlza19pbm87CiAJc3BpbmxvY2tfdAkJc2tfcGVlcl9sb2NrOwogCWludAkJCXNrX2JpbmRfcGhjOwotCXN0cnVjdCBwaWQJCSpza19wZWVyX3BpZDsKJiM0MzsJREVDTEFSRV9QSURTKHNrX3BlZXJfcGlkLCBQSURUWVBFX1RHSUQpOwogCWNvbnN0IHN0cnVjdCBjcmVkCSpza19wZWVyX2NyZWQ7CiAKIAlrdGltZV90CQkJc2tfc3RhbXA7CkBAIC01NjIsNyAmIzQzOzU2Myw4IEBAIHN0cnVjdCBzb2NrIHsKIAkJCQlza19zY21fc2VjdXJpdHkgOiAxLAogCQkJCXNrX3NjbV9waWRmZCA6IDEsCiAJCQkJc2tfc2NtX3JpZ2h0cyA6IDEsCi0JCQkJc2tfc2NtX3VudXNlZCA6IDQ7CiYjNDM7CQkJCXNrX3NjbV9waWRmZF90aHJlYWQgOiAxLAomIzQzOwkJCQlza19zY21fdW51c2VkIDogMzsKIAkJfTsKIAl9OwogCXU4CQkJc2tfY2xvY2tpZDsKQEAgLTI5ODYsNiAmIzQzOzI5ODgsMTIgQEAgc3RhdGljIGlubGluZSBib29sIHNrX2lzX3N0cmVhbV91bml4KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIAlyZXR1cm4gc2tfaXNfdW5peChzaykgJmFtcDsmYW1wOyBzay0mZ3Q7c2tfdHlwZSA9PSBTT0NLX1NUUkVBTTsKIH0KIAomIzQzOy8qIFNPX1BBU1NQSURGRCBvciBTT19QQVNTUElERkRfVEhSRUFEIGFza2VkIGZvciBhbiBTQ01fUElERkQuICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIHNrX3NjbV9waWRmZF93YW50ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQomIzQzO3sKJiM0MzsJcmV0dXJuIHNrLSZndDtza19zY21fcGlkZmQgfHwgc2stJmd0O3NrX3NjbV9waWRmZF90aHJlYWQ7CiYjNDM7fQomIzQzOwogc3RhdGljIGlubGluZSBib29sIHNrX2lzX3Zzb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gc2stJmd0O3NrX2ZhbWlseSA9PSBBRl9WU09DSzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaCBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaAppbmRleCA4NGVhN2I5MjkzNmUyLi41NmZlZDdhYjI3YWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3NvY2tldC5oCkBAIC0xNTIsNiAmIzQzOzE1MiwxMCBAQAogCiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DCTg1CiAKJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQJODYKJiM0MzsKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQJODcKJiM0MzsKICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0IHx8IChkZWZpbmVkKF9feDg2XzY0X18pICZhbXA7JmFtcDsgZGVmaW5lZChfX0lMUDMyX18pKQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKaW5kZXggNDExZDY2ZjI0MzkzZC4uNzc1OGU5ZWEzODQ4YyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCkBAIC0xNjEsNyAmIzQzOzE2MSw3IEBAIHN0cnVjdCBzb2NrICpidF9zb2NrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywKIAkvKiBJbml0IHBlZXIgaW5mb3JtYXRpb24gc28gaXQgY2FuIGJlIHByb3Blcmx5IG1vbml0b3JlZCAqLwogCWlmICgha2VybikgewogCQlzcGluX2xvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKLQkJc2stJmd0O3NrX3BlZXJfcGlkICA9IGdldF9waWQodGFza190Z2lkKGN1cnJlbnQpKTsKJiM0MzsJCXNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdICA9IGdldF9waWQodGFza190Z2lkKGN1cnJlbnQpKTsKIAkJc2stJmd0O3NrX3BlZXJfY3JlZCA9IGdldF9jdXJyZW50X2NyZWQoKTsKIAkJc3Bpbl91bmxvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKIAl9CkBAIC0yMzUsOSAmIzQzOzIzNSw5IEBAIHZvaWQgYnRfYWNjZXB0X2VucXVldWUoc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKnNrLCBib29sIGJoKQogCSAqIHNvY2tldCBpcyBhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbC4KIAkgKi8KIAlzcGluX2xvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKLQlvbGRfcGlkID0gc2stJmd0O3NrX3BlZXJfcGlkOwomIzQzOwlvbGRfcGlkID0gc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF07CiAJb2xkX2NyZWQgPSBzay0mZ3Q7c2tfcGVlcl9jcmVkOwotCXNrLSZndDtza19wZWVyX3BpZCA9IGdldF9waWQocGFyZW50LSZndDtza19wZWVyX3BpZCk7CiYjNDM7CXNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwYXJlbnQtJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pOwogCXNrLSZndDtza19wZWVyX2NyZWQgPSBnZXRfY3JlZChwYXJlbnQtJmd0O3NrX3BlZXJfY3JlZCk7CiAJc3Bpbl91bmxvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCmluZGV4IDA3MGNhMzg4ZjlhY2UuLjkxZTQ3MzhlYWJkYjAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKQEAgLTI3MywyMSAmIzQzOzI3MywyMSBAQCBzdGF0aWMgdm9pZCBoY2lfc29ja19jb3B5X2NyZWRzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIAljcmVkcyA9ICZhbXA7YnRfY2Ioc2tiKS0mZ3Q7Y3JlZHM7CiAKIAkvKiBDaGVjayBpZiBwZWVyIGNyZWRlbnRpYWxzIGlzIHNldCAqLwotCWlmICghc2stJmd0O3NrX3BlZXJfcGlkKSB7CiYjNDM7CWlmICghc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pIHsKIAkJLyogQ2hlY2sgaWYgcGFyZW50IHBlZXIgY3JlZGVudGlhbHMgaXMgc2V0ICovCi0JCWlmIChidF9zayhzayktJmd0O3BhcmVudCAmYW1wOyZhbXA7IGJ0X3NrKHNrKS0mZ3Q7cGFyZW50LSZndDtza19wZWVyX3BpZCkKJiM0MzsJCWlmIChidF9zayhzayktJmd0O3BhcmVudCAmYW1wOyZhbXA7IGJ0X3NrKHNrKS0mZ3Q7cGFyZW50LSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKQogCQkJc2sgPSBidF9zayhzayktJmd0O3BhcmVudDsKIAkJZWxzZQogCQkJcmV0dXJuOwogCX0KIAogCS8qIENoZWNrIGlmIHNjbV9jcmVkcyBhbHJlYWR5IHNldCAqLwotCWlmIChjcmVkcy0mZ3Q7cGlkID09IHBpZF92bnIoc2stJmd0O3NrX3BlZXJfcGlkKSkKJiM0MzsJaWYgKGNyZWRzLSZndDtwaWQgPT0gcGlkX3Zucihzay0mZ3Q7c2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkpCiAJCXJldHVybjsKIAogCW1lbXNldChjcmVkcywgMCwgc2l6ZW9mKCpjcmVkcykpOwogCi0JY3JlZHMtJmd0O3BpZCA9IHBpZF92bnIoc2stJmd0O3NrX3BlZXJfcGlkKTsKJiM0MzsJY3JlZHMtJmd0O3BpZCA9IHBpZF92bnIoc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pOwogCWlmIChzay0mZ3Q7c2tfcGVlcl9jcmVkKSB7CiAJCWNyZWRzLSZndDt1aWQgPSBzay0mZ3Q7c2tfcGVlcl9jcmVkLSZndDt1aWQ7CiAJCWNyZWRzLSZndDtnaWQgPSBzay0mZ3Q7c2tfcGVlcl9jcmVkLSZndDtnaWQ7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCmluZGV4IDExOTRjMzdlNDY2ZjEuLjg3MmQ4ZmIzMWI2ZmIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCkBAIC0xODkwLDcgJiM0MzsxODkwLDcgQEAgc3RhdGljIHN0cnVjdCBwaWQgKmwyY2FwX3NvY2tfZ2V0X3BlZXJfcGlkX2NiKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tJmd0O2RhdGE7CiAKLQlyZXR1cm4gc2stJmd0O3NrX3BlZXJfcGlkOwomIzQzOwlyZXR1cm4gc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF07CiB9CiAKIHN0YXRpYyB2b2lkIGwyY2FwX3NvY2tfc3VzcGVuZF9jYihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NjbS5jIGIvbmV0L2NvcmUvc2NtLmMKaW5kZXggZjBkNDRlY2RiMTFmYy4uZDY5NzY4NDE0YWY0OCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2NtLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc2NtLmMKQEAgLTE0OSw2ICYjNDM7MTQ5LDcgQEAgRVhQT1JUX1NZTUJPTChfX3NjbV9kZXN0cm95KTsKIAogc3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZCkKIHsKJiM0MzsJc3RydWN0IHBpZCAqdGhyZWFkX3BpZDsKIAlpbnQgZXJyOwogCiAJLyogZHJvcCBhbGwgcHJldmlvdXMgcmVmZXJlbmNlcyAqLwpAQCAtMTU4LDcgJiM0MzsxNTksMTggQEAgc3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZCkKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJcmV0dXJuIGVycjsKIAotCXNjbS0mZ3Q7cGlkID0gcGlkOwomIzQzOwkvKiBBIHNlbmRlciBuYW1pbmcgaXRzIG93biB0aHJlYWQtZ3JvdXAgc2VuZHMgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQuICovCiYjNDM7CWlmIChwaWQgPT0gdGFza190Z2lkKGN1cnJlbnQpKQomIzQzOwkJdGhyZWFkX3BpZCA9IHRhc2tfcGlkKGN1cnJlbnQpOwomIzQzOwllbHNlCiYjNDM7CQl0aHJlYWRfcGlkID0gcGlkOwomIzQzOwomIzQzOwllcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQodGhyZWFkX3BpZCk7CiYjNDM7CWlmICh1bmxpa2VseShlcnIpKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJc2NtLSZndDtwaWRbUElEVFlQRV9UR0lEXSA9IHBpZDsKJiM0MzsJc2NtLSZndDtwaWRbUElEVFlQRV9QSURdID0gZ2V0X3BpZCh0aHJlYWRfcGlkKTsKIAlzY20tJmd0O2NyZWRzLnBpZCA9IHBpZF92bnIocGlkKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwNyw3ICYjNDM7MjE5LDggQEAgaW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqcCkKIAkJCWlmIChlcnIpCiAJCQkJZ290byBlcnJvcjsKIAotCQkJaWYgKCFwLSZndDtwaWQgfHwgcGlkX3ZucihwLSZndDtwaWQpICE9IGNyZWRzLnBpZCkgewomIzQzOwkJCWlmICghcC0mZ3Q7cGlkW1BJRFRZUEVfVEdJRF0gfHwKJiM0MzsJCQkgICAgcGlkX3ZucihwLSZndDtwaWRbUElEVFlQRV9UR0lEXSkgIT0gY3JlZHMucGlkKSB7CiAJCQkJc3RydWN0IHBpZCAqcGlkOwogCQkJCWVyciA9IC1FU1JDSDsKIAkJCQlwaWQgPSBmaW5kX2dldF9waWQoY3JlZHMucGlkKTsKQEAgLTQ4Niw5ICYjNDM7NDk5LDEzIEBAIHN0YXRpYyBib29sIHNjbV9oYXNfc2VjZGF0YShzdHJ1Y3Qgc29jayAqc2spCiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc2NtX3BpZGZkX3JlY3Yoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKQomIzQzO3N0YXRpYyB2b2lkIHNjbV9waWRmZF9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAomIzQzOwkJCSAgIHN0cnVjdCBzY21fY29va2llICpzY20pCiB7CiYjNDM7CWVudW0gcGlkX3R5cGUgdHlwZSA9IHNrLSZndDtza19zY21fcGlkZmRfdGhyZWFkID8gUElEVFlQRV9QSUQgOiBQSURUWVBFX1RHSUQ7CiYjNDM7CXN0cnVjdCBwaWQgKnBpZCA9IHNjbS0mZ3Q7cGlkW3R5cGVdOwogCXN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDsKJiM0MzsJdW5zaWduZWQgaW50IGZsYWdzID0gUElERkRfU1RBTEU7CiAJaW50IGxlbiwgcGlkZmQ7CiAKIAkvKiBwdXRfY21zZygpIGRvZXNuJiMzOTt0IHJldHVybiBhbiBlcnJvciBpZiBDTVNHIGlzIHRydW5jYXRlZCwKQEAgLTUwNCwxMCAmIzQzOzUyMSwxMyBAQCBzdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pCiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXNjbS0mZ3Q7cGlkKQomIzQzOwlpZiAoIXBpZCkKIAkJcmV0dXJuOwogCi0JcGlkZmQgPSBwaWRmZF9wcmVwYXJlKHNjbS0mZ3Q7cGlkLCBQSURGRF9TVEFMRSwgJmFtcDtwaWRmZF9maWxlKTsKJiM0MzsJaWYgKHR5cGUgPT0gUElEVFlQRV9QSUQpCiYjNDM7CQlmbGFncyB8PSBQSURGRF9USFJFQUQ7CiYjNDM7CiYjNDM7CXBpZGZkID0gcGlkZmRfcHJlcGFyZShwaWQsIGZsYWdzLCAmYW1wO3BpZGZkX2ZpbGUpOwogCiAJaWYgKHB1dF9jbXNnKG1zZywgU09MX1NPQ0tFVCwgU0NNX1BJREZELCBzaXplb2YoaW50KSwgJmFtcDtwaWRmZCkpIHsKIAkJaWYgKHBpZGZkX2ZpbGUpIHsKQEAgLTUyNiw3ICYjNDM7NTQ2LDcgQEAgc3RhdGljIGJvb2wgX19zY21fcmVjdl9jb21tb24oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCQkgICAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpCiB7CiAJaWYgKCFtc2ctJmd0O21zZ19jb250cm9sKSB7Ci0JCWlmIChzay0mZ3Q7c2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrLSZndDtza19zY21fcGlkZmQgfHwKJiM0MzsJCWlmIChzay0mZ3Q7c2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrX3NjbV9waWRmZF93YW50ZWQoc2spIHx8CiAJCSAgICBzY20tJmd0O2ZwIHx8IHNjbV9oYXNfc2VjZGF0YShzaykpCiAJCQltc2ctJmd0O21zZ19mbGFncyB8PSBNU0dfQ1RSVU5DOwogCkBAIC01NzMsOCAmIzQzOzU5Myw4IEBAIHZvaWQgc2NtX3JlY3ZfdW5peChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCXNjbV9kZXRhY2hfZmRzKG1zZywgc2NtLCBSRUFEX09OQ0UodS0mZ3Q7c2NtX3JpZ2h0c19ub3RydW5jKSk7CiAJfQogCi0JaWYgKHNvY2stJmd0O3NrLSZndDtza19zY21fcGlkZmQpCi0JCXNjbV9waWRmZF9yZWN2KG1zZywgc2NtKTsKJiM0MzsJaWYgKHNrX3NjbV9waWRmZF93YW50ZWQoc29jay0mZ3Q7c2spKQomIzQzOwkJc2NtX3BpZGZkX3JlY3Yoc29jay0mZ3Q7c2ssIG1zZywgc2NtKTsKIAogCXNjbV9kZXN0cm95X2NyZWQoc2NtKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCAxYWQ0MTkwNGRiMjViLi5jYjJmZmQzMjliYzY3IDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc29jay5jCkBAIC0xNTcxLDEwICYjNDM7MTU3MSwyNSBAQCBpbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCWJyZWFrOwogCiAJY2FzZSBTT19QQVNTUElERkQ6Ci0JCWlmIChza19pc191bml4KHNrKSkKJiM0MzsJCWlmIChza19pc191bml4KHNrKSkgewomIzQzOwkJCS8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRF9USFJFQUQuICovCiAJCQlzay0mZ3Q7c2tfc2NtX3BpZGZkID0gdmFsYm9vbDsKLQkJZWxzZQomIzQzOwkJCWlmICh2YWxib29sKQomIzQzOwkJCQlzay0mZ3Q7c2tfc2NtX3BpZGZkX3RocmVhZCA9IDA7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCXJldCA9IC1FT1BOT1RTVVBQOwomIzQzOwkJfQomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWNhc2UgU09fUEFTU1BJREZEX1RIUkVBRDoKJiM0MzsJCWlmIChza19pc191bml4KHNrKSkgewomIzQzOwkJCS8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRC4gKi8KJiM0MzsJCQlzay0mZ3Q7c2tfc2NtX3BpZGZkX3RocmVhZCA9IHZhbGJvb2w7CiYjNDM7CQkJaWYgKHZhbGJvb2wpCiYjNDM7CQkJCXNrLSZndDtza19zY21fcGlkZmQgPSAwOwomIzQzOwkJfSBlbHNlIHsKIAkJCXJldCA9IC1FT1BOT1RTVVBQOwomIzQzOwkJfQogCQlicmVhazsKIAogCWNhc2UgU09fUEFTU1JJR0hUUzoKQEAgLTE3MjgsNiAmIzQzOzE3NDMsNTAgQEAgc3RhdGljIGludCBncm91cHNfdG9fdXNlcihzb2NrcHRyX3QgZHN0LCBjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqc3JjKQogCXJldHVybiAwOwogfQogCiYjNDM7LyogSGFuZCBvdXQgYSBwaWRmZCBmb3IgQHR5cGUgb2YgdGhlIHNvY2tldCYjMzk7cyBwZWVyIHZpYSBTT19QRUVSUElERkQqLiAqLwomIzQzO3N0YXRpYyBpbnQgc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHBpZF90eXBlIHR5cGUsCiYjNDM7CQkJCSAgIHNvY2twdHJfdCBvcHR2YWwsIHNvY2twdHJfdCBvcHRsZW4sIGludCBsZW4pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IDA7CiYjNDM7CXN0cnVjdCBwaWQgKnBlZXJfcGlkOwomIzQzOwlpbnQgcGlkZmQ7CiYjNDM7CiYjNDM7CWlmIChsZW4gJmd0OyBzaXplb2YocGlkZmQpKQomIzQzOwkJbGVuID0gc2l6ZW9mKHBpZGZkKTsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7CiYjNDM7CXBlZXJfcGlkID0gZ2V0X3BpZChzay0mZ3Q7c2tfcGVlcl9waWRbdHlwZV0pOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwomIzQzOwomIzQzOwlpZiAoIXBlZXJfcGlkKQomIzQzOwkJcmV0dXJuIC1FTk9EQVRBOwomIzQzOwomIzQzOwkvKiBUaGUgdXNlIG9mIFBJREZEX1NUQUxFIHJlcXVpcmVzIHN0YXNoaW5nIG9mIHN0cnVjdCBwaWQgb24gcGlkZnMKJiM0MzsJICogd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoc2stJmd0O3NrX2ZhbWlseSA9PSBBRl9VTklYKQomIzQzOwkJZmxhZ3MgfD0gUElERkRfU1RBTEU7CiYjNDM7CWlmICh0eXBlID09IFBJRFRZUEVfUElEKQomIzQzOwkJZmxhZ3MgfD0gUElERkRfVEhSRUFEOwomIzQzOwomIzQzOwlwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGVlcl9waWQsIGZsYWdzLCAmYW1wO3BpZGZkX2ZpbGUpOwomIzQzOwlwdXRfcGlkKHBlZXJfcGlkKTsKJiM0MzsJaWYgKHBpZGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiBwaWRmZDsKJiM0MzsKJiM0MzsJaWYgKGNvcHlfdG9fc29ja3B0cihvcHR2YWwsICZhbXA7cGlkZmQsIGxlbikgfHwKJiM0MzsJICAgIGNvcHlfdG9fc29ja3B0cihvcHRsZW4sICZhbXA7bGVuLCBzaXplb2YoaW50KSkpIHsKJiM0MzsJCXB1dF91bnVzZWRfZmQocGlkZmQpOwomIzQzOwkJZnB1dChwaWRmZF9maWxlKTsKJiM0MzsKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZkX2luc3RhbGwocGlkZmQsIHBpZGZkX2ZpbGUpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCSAgc29ja3B0cl90IG9wdHZhbCwgc29ja3B0cl90IG9wdGxlbikKIHsKQEAgLTE4OTIsNiAmIzQzOzE5NTEsMTMgQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQl2LnZhbCA9IHNrLSZndDtza19zY21fcGlkZmQ7CiAJCWJyZWFrOwogCiYjNDM7CWNhc2UgU09fUEFTU1BJREZEX1RIUkVBRDoKJiM0MzsJCWlmICghc2tfaXNfdW5peChzaykpCiYjNDM7CQkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwkJdi52YWwgPSBzay0mZ3Q7c2tfc2NtX3BpZGZkX3RocmVhZDsKJiM0MzsJCWJyZWFrOwomIzQzOwogCWNhc2UgU09fUEFTU1JJR0hUUzoKIAkJaWYgKCFza19pc191bml4KHNrKSkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTE5MDYsNyAmIzQzOzE5NzIsOCBAQCBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQlsZW4gPSBzaXplb2YocGVlcmNyZWQpOwogCiAJCXNwaW5fbG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwotCQljcmVkX3RvX3VjcmVkKHNrLSZndDtza19wZWVyX3BpZCwgc2stJmd0O3NrX3BlZXJfY3JlZCwgJmFtcDtwZWVyY3JlZCk7CiYjNDM7CQljcmVkX3RvX3VjcmVkKHNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdLCBzay0mZ3Q7c2tfcGVlcl9jcmVkLAomIzQzOwkJCSAgICAgICZhbXA7cGVlcmNyZWQpOwogCQlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwogCiAJCWlmIChjb3B5X3RvX3NvY2twdHIob3B0dmFsLCAmYW1wO3BlZXJjcmVkLCBsZW4pKQpAQCAtMTkxNSw0NSAmIzQzOzE5ODIsMTQgQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCX0KIAogCWNhc2UgU09fUEVFUlBJREZEOgotCXsKLQkJc3RydWN0IHBpZCAqcGVlcl9waWQ7Ci0JCXN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDsKLQkJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQkJaW50IHBpZGZkOwotCi0JCWlmIChsZW4gJmd0OyBzaXplb2YocGlkZmQpKQotCQkJbGVuID0gc2l6ZW9mKHBpZGZkKTsKLQotCQlzcGluX2xvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKLQkJcGVlcl9waWQgPSBnZXRfcGlkKHNrLSZndDtza19wZWVyX3BpZCk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7CiYjNDM7CQlyZXR1cm4gc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc2ssIFBJRFRZUEVfVEdJRCwgb3B0dmFsLCBvcHRsZW4sIGxlbik7CiAKLQkJaWYgKCFwZWVyX3BpZCkKLQkJCXJldHVybiAtRU5PREFUQTsKLQotCQkvKiBUaGUgdXNlIG9mIFBJREZEX1NUQUxFIHJlcXVpcmVzIHN0YXNoaW5nIG9mIHN0cnVjdCBwaWQKLQkJICogb24gcGlkZnMgd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYCi0JCSAqIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuCi0JCSAqLwotCQlpZiAoc2stJmd0O3NrX2ZhbWlseSA9PSBBRl9VTklYKQotCQkJZmxhZ3MgPSBQSURGRF9TVEFMRTsKLQotCQlwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGVlcl9waWQsIGZsYWdzLCAmYW1wO3BpZGZkX2ZpbGUpOwotCQlwdXRfcGlkKHBlZXJfcGlkKTsKLQkJaWYgKHBpZGZkICZsdDsgMCkKLQkJCXJldHVybiBwaWRmZDsKLQotCQlpZiAoY29weV90b19zb2NrcHRyKG9wdHZhbCwgJmFtcDtwaWRmZCwgbGVuKSB8fAotCQkgICAgY29weV90b19zb2NrcHRyKG9wdGxlbiwgJmFtcDtsZW4sIHNpemVvZihpbnQpKSkgewotCQkJcHV0X3VudXNlZF9mZChwaWRmZCk7Ci0JCQlmcHV0KHBpZGZkX2ZpbGUpOwotCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQomIzQzOwljYXNlIFNPX1BFRVJQSURGRF9USFJFQUQ6CiYjNDM7CQkvKiBPbmx5IEFGX1VOSVggcmVjb3JkcyB0aGUgcGVlciYjMzk7cyBjb25uZWN0aW5nIHRocmVhZC4gKi8KJiM0MzsJCWlmICghc2tfaXNfdW5peChzaykpCiYjNDM7CQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCWZkX2luc3RhbGwocGlkZmQsIHBpZGZkX2ZpbGUpOwotCQlyZXR1cm4gMDsKLQl9CiYjNDM7CQlyZXR1cm4gc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc2ssIFBJRFRZUEVfUElELCBvcHR2YWwsIG9wdGxlbiwgbGVuKTsKIAogCWNhc2UgU09fUEVFUkdST1VQUzoKIAl7CkBAIC0yMzc5LDcgJiM0MzsyNDE1LDcgQEAgc3RhdGljIHZvaWQgX19za19kZXN0cnVjdChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiAKIAkvKiBXZSBkbyBub3QgbmVlZCB0byBhY3F1aXJlIHNrLSZndDtza19wZWVyX2xvY2ssIHdlIGFyZSB0aGUgbGFzdCB1c2VyLiAqLwogCXB1dF9jcmVkKHNrLSZndDtza19wZWVyX2NyZWQpOwotCXB1dF9waWQoc2stJmd0O3NrX3BlZXJfcGlkKTsKJiM0MzsJcHV0X3BpZHMoc2stJmd0O3NrX3BlZXJfcGlkKTsKIAogCWlmIChsaWtlbHkoc2stJmd0O3NrX25ldF9yZWZjbnQpKSB7CiAJCXB1dF9uZXRfdHJhY2sobmV0LCAmYW1wO3NrLSZndDtuc190cmFja2VyKTsKQEAgLTM3NzUsNyAmIzQzOzM4MTEsNyBAQCB2b2lkIHNvY2tfaW5pdF9kYXRhX3VpZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29jayAqc2ssIGt1aWRfdCB1aWQpCiAJc2stJmd0O3NrX2ZyYWcub2Zmc2V0CT0JMDsKIAlzay0mZ3Q7c2tfcGVla19vZmYJCT0JLTE7CiAKLQlzay0mZ3Q7c2tfcGVlcl9waWQgCT0JTlVMTDsKJiM0MzsJbWVtc2V0KHNrLSZndDtza19wZWVyX3BpZCwgMCwgc2l6ZW9mKHNrLSZndDtza19wZWVyX3BpZCkpOwogCXNrLSZndDtza19wZWVyX2NyZWQJPQlOVUxMOwogCXNwaW5fbG9ja19pbml0KCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7CiAKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCAxM2Y5OTI2YmYyMDU3Li41NjNkOTgyN2M1Y2M1IDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC03MzcsNTcgJiM0Mzs3MzcsNTMgQEAgc3RhdGljIHZvaWQgdW5peF9yZWxlYXNlX3NvY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgZW1icmlvbikKIH0KIAogc3RydWN0IHVuaXhfcGVlcmNyZWQgewotCXN0cnVjdCBwaWQgKnBlZXJfcGlkOwomIzQzOwlERUNMQVJFX1BJRFMocGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7CiAJY29uc3Qgc3RydWN0IGNyZWQgKnBlZXJfY3JlZDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfcGVlcmNyZWQoc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKQogewotCXN0cnVjdCBwaWQgKnBpZDsKIAlpbnQgZXJyOwogCi0JcGlkID0gdGFza190Z2lkKGN1cnJlbnQpOwotCWVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWQpOwotCWlmIChsaWtlbHkoIWVycikpIHsKLQkJcGVlcmNyZWQtJmd0O3BlZXJfcGlkID0gZ2V0X3BpZChwaWQpOwotCQlwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpOwomIzQzOwlnZXRfdGFza19waWRzKHBlZXJjcmVkLSZndDtwZWVyX3BpZCwgY3VycmVudCk7CiYjNDM7CWVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMocGVlcmNyZWQtJmd0O3BlZXJfcGlkKTsKJiM0MzsJaWYgKHVubGlrZWx5KGVycikpIHsKJiM0MzsJCXB1dF9waWRzKHBlZXJjcmVkLSZndDtwZWVyX3BpZCk7CiYjNDM7CQlyZXR1cm4gZXJyOwogCX0KLQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwlwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZHJvcF9wZWVyY3JlZChzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBOVUxMOwotCXN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7CiAKIAltaWdodF9zbGVlcCgpOwogCi0Jc3dhcChwZWVyY3JlZC0mZ3Q7cGVlcl9waWQsIHBpZCk7CiYjNDM7CXB1dF9waWRzKHBlZXJjcmVkLSZndDtwZWVyX3BpZCk7CiAJc3dhcChwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkLCBjcmVkKTsKLQotCXB1dF9waWQocGlkKTsKIAlwdXRfY3JlZChjcmVkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGluaXRfcGVlcmNyZWQoc3RydWN0IHNvY2sgKnNrLAogCQkJCSBjb25zdCBzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpCiB7Ci0Jc2stJmd0O3NrX3BlZXJfcGlkID0gcGVlcmNyZWQtJmd0O3BlZXJfcGlkOwomIzQzOwltZW1jcHkoc2stJmd0O3NrX3BlZXJfcGlkLCBwZWVyY3JlZC0mZ3Q7cGVlcl9waWQsIHNpemVvZihzay0mZ3Q7c2tfcGVlcl9waWQpKTsKIAlzay0mZ3Q7c2tfcGVlcl9jcmVkID0gcGVlcmNyZWQtJmd0O3BlZXJfY3JlZDsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDsKLQlzdHJ1Y3QgcGlkICpvbGRfcGlkOwogCiAJc3Bpbl9sb2NrKCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7Ci0Jb2xkX3BpZCA9IHNrLSZndDtza19wZWVyX3BpZDsKJiM0MzsJc3dhcF9waWRzKHNrLSZndDtza19wZWVyX3BpZCwgcGVlcmNyZWQtJmd0O3BlZXJfcGlkKTsKIAlvbGRfY3JlZCA9IHNrLSZndDtza19wZWVyX2NyZWQ7Ci0JaW5pdF9wZWVyY3JlZChzaywgcGVlcmNyZWQpOwomIzQzOwlzay0mZ3Q7c2tfcGVlcl9jcmVkID0gcGVlcmNyZWQtJmd0O3BlZXJfY3JlZDsKIAlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwogCi0JcGVlcmNyZWQtJmd0O3BlZXJfcGlkID0gb2xkX3BpZDsKIAlwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkID0gb2xkX2NyZWQ7CiB9CiAKQEAgLTc5NiwxNCAmIzQzOzc5MiwxNCBAQCBzdGF0aWMgdm9pZCBjb3B5X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBlZXJzaykKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7dW5peF9zayhwZWVyc2spLSZndDtsb2NrKTsKIAogCXNwaW5fbG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwotCXNrLSZndDtza19wZWVyX3BpZCA9IGdldF9waWQocGVlcnNrLSZndDtza19wZWVyX3BpZCk7CiYjNDM7CWdldF9waWRzKHNrLSZndDtza19wZWVyX3BpZCwgcGVlcnNrLSZndDtza19wZWVyX3BpZCk7CiAJc2stJmd0O3NrX3BlZXJfY3JlZCA9IGdldF9jcmVkKHBlZXJzay0mZ3Q7c2tfcGVlcl9jcmVkKTsKIAlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwogfQogCiBzdGF0aWMgYm9vbCB1bml4X21heV9wYXNzY3JlZChjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JcmV0dXJuIHNrLSZndDtza19zY21fY3JlZGVudGlhbHMgfHwgc2stJmd0O3NrX3NjbV9waWRmZDsKJiM0MzsJcmV0dXJuIHNrLSZndDtza19zY21fY3JlZGVudGlhbHMgfHwgc2tfc2NtX3BpZGZkX3dhbnRlZChzayk7CiB9CiAKIHN0YXRpYyBpbnQgdW5peF9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCkBAIC0xMDYwLDYgJiM0MzsxMDU2LDcgQEAgc3RhdGljIGJvb2wgdW5peF9icGZfYnlwYXNzX2dldHNvY2tvcHQoaW50IGxldmVsLCBpbnQgb3B0bmFtZSkKIAlpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCkgewogCQlzd2l0Y2ggKG9wdG5hbWUpIHsKIAkJY2FzZSBTT19QRUVSUElERkQ6CiYjNDM7CQljYXNlIFNPX1BFRVJQSURGRF9USFJFQUQ6CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE5NzMsNyAmIzQzOzE5NzAsNyBAQCBzdGF0aWMgdm9pZCB1bml4X2Rlc3RydWN0X3NjbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBzY21fY29va2llIHNjbSA9IHt9OwogCi0Jc3dhcChzY20ucGlkLCBVTklYQ0Ioc2tiKS5waWQpOwomIzQzOwlzd2FwX3BpZHMoc2NtLnBpZCwgVU5JWENCKHNrYikucGlkKTsKIAogCWlmIChVTklYQ0Ioc2tiKS5mcCkKIAkJdW5peF9kZXRhY2hfZmRzKCZhbXA7c2NtLCBza2IpOwpAQCAtMTk5MSw3ICYjNDM7MTk4OCw3IEBAIHN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuCiB7CiAJaW50IGVyciA9IDA7CiAKLQlVTklYQ0Ioc2tiKS5waWQgPSBnZXRfcGlkKHNjbS0mZ3Q7cGlkKTsKJiM0MzsJZ2V0X3BpZHMoVU5JWENCKHNrYikucGlkLCBzY20tJmd0O3BpZCk7CiAJVU5JWENCKHNrYikudWlkID0gc2NtLSZndDtjcmVkcy51aWQ7CiAJVU5JWENCKHNrYikuZ2lkID0gc2NtLSZndDtjcmVkcy5naWQ7CiAJVU5JWENCKHNrYikuZnAgPSBOVUxMOwpAQCAtMjAwNSw3ICYjNDM7MjAwMiwxMCBAQCBzdGF0aWMgaW50IHVuaXhfc2NtX3RvX3NrYihzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHNlbgogCiBzdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSkKIHsKLQlzY21fc2V0X2NyZWQoc2NtLCBVTklYQ0Ioc2tiKS5waWQsIFVOSVhDQihza2IpLnVpZCwgVU5JWENCKHNrYikuZ2lkKTsKJiM0MzsJZ2V0X3BpZHMoc2NtLSZndDtwaWQsIFVOSVhDQihza2IpLnBpZCk7CiYjNDM7CXNjbS0mZ3Q7Y3JlZHMucGlkID0gcGlkX3ZucihzY20tJmd0O3BpZFtQSURUWVBFX1RHSURdKTsKJiM0MzsJc2NtLSZndDtjcmVkcy51aWQgPSBVTklYQ0Ioc2tiKS51aWQ7CiYjNDM7CXNjbS0mZ3Q7Y3JlZHMuZ2lkID0gVU5JWENCKHNrYikuZ2lkOwogCXVuaXhfc2V0X3NlY2RhdGEoc2NtLCBza2IpOwogfQogCkBAIC0yMDI1LDMwICYjNDM7MjAyNSwzNSBAQCBzdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSkKIHN0YXRpYyBpbnQgdW5peF9tYXliZV9hZGRfY3JlZHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJCWNvbnN0IHN0cnVjdCBzb2NrICpvdGhlcikKIHsKLQlpZiAoVU5JWENCKHNrYikucGlkKQomIzQzOwlpZiAoVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0pCiAJCXJldHVybiAwOwogCiAJaWYgKHVuaXhfbWF5X3Bhc3NjcmVkKHNrKSB8fCB1bml4X21heV9wYXNzY3JlZChvdGhlcikgfHwKIAkgICAgIW90aGVyLSZndDtza19zb2NrZXQpIHsKLQkJc3RydWN0IHBpZCAqcGlkOwogCQlpbnQgZXJyOwogCi0JCXBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTsKLQkJZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7Ci0JCWlmICh1bmxpa2VseShlcnIpKQomIzQzOwkJZ2V0X3Rhc2tfcGlkcyhVTklYQ0Ioc2tiKS5waWQsIGN1cnJlbnQpOwomIzQzOwkJZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhVTklYQ0Ioc2tiKS5waWQpOwomIzQzOwkJaWYgKHVubGlrZWx5KGVycikpIHsKJiM0MzsJCQlwdXRfcGlkcyhVTklYQ0Ioc2tiKS5waWQpOwogCQkJcmV0dXJuIGVycjsKJiM0MzsJCX0KIAotCQlVTklYQ0Ioc2tiKS5waWQgPSBnZXRfcGlkKHBpZCk7CiAJCWN1cnJlbnRfdWlkX2dpZCgmYW1wO1VOSVhDQihza2IpLnVpZCwgJmFtcDtVTklYQ0Ioc2tiKS5naWQpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoc3RydWN0IHNrX2J1ZmYgKnNrYiwKJiM0MztzdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIHN0cnVjdCBzY21fY29va2llICpzY20pCiB7Ci0JcmV0dXJuIFVOSVhDQihza2IpLnBpZCA9PSBzY20tJmd0O3BpZCAmYW1wOyZhbXA7CiYjNDM7CS8qIE9ubHkgYSB0aHJlYWQgcGlkZmQgcmVjZWl2ZXIgY2FuIHRlbGwgdGhyZWFkcyBvZiBvbmUgcHJvY2VzcyBhcGFydC4gKi8KJiM0MzsJaWYgKHNrLSZndDtza19zY21fcGlkZmRfdGhyZWFkICZhbXA7JmFtcDsKJiM0MzsJICAgIFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1BJRF0gIT0gc2NtLSZndDtwaWRbUElEVFlQRV9QSURdKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyZXR1cm4gVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0gPT0gc2NtLSZndDtwaWRbUElEVFlQRV9UR0lEXSAmYW1wOyZhbXA7CiAJICAgICAgIHVpZF9lcShVTklYQ0Ioc2tiKS51aWQsIHNjbS0mZ3Q7Y3JlZHMudWlkKSAmYW1wOyZhbXA7CiAJICAgICAgIGdpZF9lcShVTklYQ0Ioc2tiKS5naWQsIHNjbS0mZ3Q7Y3JlZHMuZ2lkKSAmYW1wOyZhbXA7CiAJICAgICAgIHVuaXhfc2VjZGF0YV9lcShzY20sIHNrYik7CkBAIC0zMDI2LDcgJiM0MzszMDMxLDcgQEAgc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWMoc3RydWN0IHVuaXhfc3RyZWFtX3JlYWRfc3RhdGUgKnN0YXRlLAogCiAJCWlmIChjaGVja19jcmVkcykgewogCQkJLyogTmV2ZXIgZ2x1ZSBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCB3cml0ZXJzICovCi0JCQlpZiAoIXVuaXhfc2tiX3NjbV9lcShza2IsICZhbXA7c2NtKSkKJiM0MzsJCQlpZiAoIXVuaXhfc2tiX3NjbV9lcShzaywgc2tiLCAmYW1wO3NjbSkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAodW5peF9tYXlfcGFzc2NyZWQoc2spKSB7CiAJCQkvKiBDb3B5IGNyZWRlbnRpYWxzICovCmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmggYi9uZXQvdW5peC9hZl91bml4LmgKaW5kZXggODExOWRiZWVmM2EzYy4uNDAyNzQyODk1YWNjYSAxMDA2NDQKLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5oCiYjNDM7JiM0MzsmIzQzOyBiL25ldC91bml4L2FmX3VuaXguaApAQCAtMiw2ICYjNDM7Miw3IEBACiAjaWZuZGVmIF9fQUZfVU5JWF9ICiAjZGVmaW5lIF9fQUZfVU5JWF9ICiAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcGlkX3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdWlkZ2lkLmgmZ3Q7CiAKICNkZWZpbmUgVU5JWF9IQVNIX01PRAkoMjU2IC0gMSkKQEAgLTExLDcgJiM0MzsxMiw3IEBACiBzdHJ1Y3Qgc29jayAqdW5peF9wZWVyX2dldChzdHJ1Y3Qgc29jayAqc2spOwogCiBzdHJ1Y3QgdW5peF9za2JfcGFybXMgewotCXN0cnVjdCBwaWQJCSpwaWQ7CQkvKiBza2IgY3JlZGVudGlhbHMJKi8KJiM0MzsJREVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTsJLyogc2tiIGNyZWRlbnRpYWxzIGJ5IHBpZCB0eXBlICovCiAJa3VpZF90CQkJdWlkOwogCWtnaWRfdAkJCWdpZDsKIAlzdHJ1Y3Qgc2NtX2ZwX2xpc3QJKmZwOwkJLyogUGFzc2VkIGZpbGVzCQkqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmMKaW5kZXggNDIyNzI4ZjYzMmNhNi4uZWM3M2JiNjkwYmJjYiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jCkBAIC01OTIsNiAmIzQzOzU5MiwxODEgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfY29yZWR1bXBfc2lnbmFsX3NpZ3NlZ3YpCiAJd2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCBjaGVja19jb3JlZHVtcF9pbmZvKGNvbnN0IHN0cnVjdCBwaWRmZF9pbmZvICppbmZvLCBjb25zdCBjaGFyICp3aGF0KQomIzQzO3sKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7bWFzayAmYW1wOyBQSURGRF9JTkZPX0NPUkVEVU1QKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IFBJREZEX0lORk9fQ09SRURVTVAgbm90IHNldCBpbiBtYXNrXG4mIzM0Oywgd2hhdCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7Y29yZWR1bXBfbWFzayAmYW1wOyBQSURGRF9DT1JFRFVNUEVEKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IFBJREZEX0NPUkVEVU1QRUQgbm90IHNldCBpbiBjb3JlZHVtcF9tYXNrXG4mIzM0Oywgd2hhdCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7bWFzayAmYW1wOyBQSURGRF9JTkZPX0NPUkVEVU1QX1NJR05BTCkgfHwgaW5mby0mZ3Q7Y29yZWR1bXBfc2lnbmFsICE9IFNJR1NFR1YpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBjb3JlZHVtcF9zaWduYWw9JWQsIGV4cGVjdGVkIFNJR1NFR1Y9JWRcbiYjMzQ7LAomIzQzOwkJCXdoYXQsIGluZm8tJmd0O2NvcmVkdW1wX3NpZ25hbCwgU0lHU0VHVik7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7bWFzayAmYW1wOyBQSURGRF9JTkZPX0NPUkVEVU1QX0NPREUpIHx8IGluZm8tJmd0O2NvcmVkdW1wX2NvZGUgIT0gU0VHVl9NQVBFUlIpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBjb3JlZHVtcF9jb2RlPSVkLCBleHBlY3RlZCBTRUdWX01BUEVSUj0lZFxuJiMzNDssCiYjNDM7CQkJd2hhdCwgaW5mby0mZ3Q7Y29yZWR1bXBfY29kZSwgU0VHVl9NQVBFUlIpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Q6IFBJREZEX0lORk9fQ09SRURVTVAgb24gdGhlIGR1bXBpbmcgdGhyZWFkJiMzOTtzIHBpZGZkCiYjNDM7ICoKJiM0MzsgKiBDcmFzaCBmcm9tIGEgbm9uLWxlYWRlciB0aHJlYWQgYW5kIHZlcmlmeSB0aGF0IHRoZSBwaWRmZCBmcm9tCiYjNDM7ICogU09fUEVFUlBJREZEX1RIUkVBRCByZWZlcnMgdG8gdGhhdCB0aHJlYWQgYW5kIHJlcG9ydHMgdGhlIGNvcmVkdW1wCiYjNDM7ICogbGlrZSB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlciYjMzk7cyBwaWRmZCBmcm9tIFNPX1BFRVJQSURGRCBkb2VzLgomIzQzOyAqLwomIzQzO1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X2NvcmVkdW1wX3RocmVhZCkKJiM0Mzt7CiYjNDM7CWludCBwaWRmZCwgcmV0LCBzdGF0dXM7CiYjNDM7CXBpZF90IHBpZCwgcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsJc3RydWN0IHBpZGZkX2luZm8gaW5mbyA9IHt9OwomIzQzOwlpbnQgaXBjX3NvY2tldHNbMl07CiYjNDM7CWNoYXIgYzsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybigmIzM0O0AvdG1wL2NvcmVkdW1wLnNvY2tldCYjMzQ7KSk7CiYjNDM7CiYjNDM7CXJldCA9IHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsIGlwY19zb2NrZXRzKTsKJiM0MzsJQVNTRVJUX0VRKHJldCwgMCk7CiYjNDM7CiYjNDM7CXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTsKJiM0MzsJaWYgKHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPT0gMCkgewomIzQzOwkJaW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9wZWVyX3BpZGZkID0gLTE7CiYjNDM7CQlpbnQgZmRfdGhyZWFkX3BpZGZkID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xOwomIzQzOwkJc3RydWN0IHBpZGZkX2luZm8gdGhyZWFkX2luZm8gPSB7fTsKJiM0MzsJCWludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CiYjNDM7CiYjNDM7CQljbG9zZShpcGNfc29ja2V0c1swXSk7CiYjNDM7CiYjNDM7CQlmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCgmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0JiMzNDspOwomIzQzOwkJaWYgKGZkX3NlcnZlciAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBsaXN0ZW4gc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICh3cml0ZV9ub2ludHIoaXBjX3NvY2tldHNbMV0sICYjMzQ7MSYjMzQ7LCAxKSAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBpcGMgd3JpdGUgZmFpbGVkOiAlbVxuJiMzNDspOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwomIzQzOwkJY2xvc2UoaXBjX3NvY2tldHNbMV0pOwomIzQzOwomIzQzOwkJZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTsKJiM0MzsJCWlmIChmZF9jb3JlZHVtcCAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBhY2NlcHQ0IGZhaWxlZDogJW1cbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZkX3BlZXJfcGlkZmQgPSBnZXRfcGVlcl9waWRmZChmZF9jb3JlZHVtcCk7CiYjNDM7CQlpZiAoZmRfcGVlcl9waWRmZCAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBnZXRfcGVlcl9waWRmZCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZkX3RocmVhZF9waWRmZCA9IGdldF9wZWVyX3BpZGZkX3RocmVhZChmZF9jb3JlZHVtcCk7CiYjNDM7CQlpZiAoZmRfdGhyZWFkX3BpZGZkICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGdldF9wZWVyX3BpZGZkX3RocmVhZCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICghZ2V0X3BpZGZkX2luZm8oZmRfcGVlcl9waWRmZCwgJmFtcDtpbmZvKSB8fAomIzQzOwkJICAgICFnZXRfcGlkZmRfaW5mbyhmZF90aHJlYWRfcGlkZmQsICZhbXA7dGhyZWFkX2luZm8pKSB7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBUaGUgcGVlciBpcyB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlciwgdGhlIGR1bXBpbmcgdGhyZWFkIGlzIG5vdC4gKi8KJiM0MzsJCWlmIChpbmZvLnBpZCAhPSBpbmZvLnRnaWQgfHwgdGhyZWFkX2luZm8udGdpZCAhPSBpbmZvLnRnaWQgfHwKJiM0MzsJCSAgICB0aHJlYWRfaW5mby5waWQgPT0gdGhyZWFkX2luZm8udGdpZCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IHVuZXhwZWN0ZWQgaWRzICVkLyVkIGFuZCAlZC8lZFxuJiMzNDssCiYjNDM7CQkJCWluZm8ucGlkLCBpbmZvLnRnaWQsIHRocmVhZF9pbmZvLnBpZCwgdGhyZWFkX2luZm8udGdpZCk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoIWNoZWNrX2NvcmVkdW1wX2luZm8oJmFtcDtpbmZvLCAmIzM0O1NPX1BFRVJQSURGRCYjMzQ7KSB8fAomIzQzOwkJICAgICFjaGVja19jb3JlZHVtcF9pbmZvKCZhbXA7dGhyZWFkX2luZm8sICYjMzQ7U09fUEVFUlBJREZEX1RIUkVBRCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJCWZkX2NvcmVfZmlsZSA9IG9wZW5fY29yZWR1bXBfdG1wZmlsZShzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCk7CiYjNDM7CQlpZiAoZmRfY29yZV9maWxlICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgdG1wZmlsZSBmYWlsZWQ6ICVtXG4mIzM0Oyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlmb3IgKDs7KSB7CiYjNDM7CQkJY2hhciBidWZmZXJbNDA5Nl07CiYjNDM7CQkJc3NpemVfdCBieXRlc19yZWFkLCBieXRlc193cml0ZTsKJiM0MzsKJiM0MzsJCQlieXRlc19yZWFkID0gcmVhZChmZF9jb3JlZHVtcCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiYjNDM7CQkJaWYgKGJ5dGVzX3JlYWQgJmx0OyAwKSB7CiYjNDM7CQkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgcmVhZCBmYWlsZWQ6ICVtXG4mIzM0Oyk7CiYjNDM7CQkJCWdvdG8gb3V0OwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlpZiAoYnl0ZXNfcmVhZCA9PSAwKQomIzQzOwkJCQlicmVhazsKJiM0MzsKJiM0MzsJCQlieXRlc193cml0ZSA9IHdyaXRlKGZkX2NvcmVfZmlsZSwgYnVmZmVyLCBieXRlc19yZWFkKTsKJiM0MzsJCQlpZiAoYnl0ZXNfcmVhZCAhPSBieXRlc193cml0ZSkgewomIzQzOwkJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBjb3JlIHdyaXRlICV6ZC8lemQ6ICVtXG4mIzM0OywKJiM0MzsJCQkJCWJ5dGVzX3JlYWQsIGJ5dGVzX3dyaXRlKTsKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwomIzQzOwkJZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTOwomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuJiMzNDspOwomIzQzO291dDoKJiM0MzsJCWlmIChmZF9jb3JlX2ZpbGUgJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZF9jb3JlX2ZpbGUpOwomIzQzOwkJaWYgKGZkX3RocmVhZF9waWRmZCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX3RocmVhZF9waWRmZCk7CiYjNDM7CQlpZiAoZmRfcGVlcl9waWRmZCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX3BlZXJfcGlkZmQpOwomIzQzOwkJaWYgKGZkX2NvcmVkdW1wICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRfY29yZWR1bXApOwomIzQzOwkJaWYgKGZkX3NlcnZlciAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX3NlcnZlcik7CiYjNDM7CQlfZXhpdChleGl0X2NvZGUpOwomIzQzOwl9CiYjNDM7CXNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyOwomIzQzOwomIzQzOwlFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTsKJiM0MzsJQVNTRVJUX0VRKHJlYWRfbm9pbnRyKGlwY19zb2NrZXRzWzBdLCAmYW1wO2MsIDEpLCAxKTsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7CiYjNDM7CiYjNDM7CXBpZCA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZCwgMCk7CiYjNDM7CWlmIChwaWQgPT0gMCkKJiM0MzsJCWNyYXNoaW5nX2NoaWxkX3RocmVhZCgpOwomIzQzOwomIzQzOwlwaWRmZCA9IHN5c19waWRmZF9vcGVuKHBpZCwgMCk7CiYjNDM7CUFTU0VSVF9HRShwaWRmZCwgMCk7CiYjNDM7CiYjNDM7CXdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpOwomIzQzOwlBU1NFUlRfRVEoV1RFUk1TSUcoc3RhdHVzKSwgU0lHU0VHVik7CiYjNDM7CUFTU0VSVF9UUlVFKFdDT1JFRFVNUChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoZ2V0X3BpZGZkX2luZm8ocGlkZmQsICZhbXA7aW5mbykpOwomIzQzOwlBU1NFUlRfVFJVRSghIShpbmZvLm1hc2sgJmFtcDsgUElERkRfSU5GT19DT1JFRFVNUCkpOwomIzQzOwlBU1NFUlRfVFJVRSghIShpbmZvLmNvcmVkdW1wX21hc2sgJmFtcDsgUElERkRfQ09SRURVTVBFRCkpOwomIzQzOwlBU1NFUlRfRVEoaW5mby5jb3JlZHVtcF9zaWduYWwsIFNJR1NFR1YpOwomIzQzOwomIzQzOwl3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogVGVzdDogUElERkRfSU5GT19DT1JFRFVNUF9TSUdOQUwgdmlhIHNpbXBsZSBzb2NrZXQgY29yZWR1bXAgd2l0aCBTSUdBQlJUCiAgKgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oCmluZGV4IGVkNDdmMDFmYTUzYzUuLjQyMTI2NTZlMzFmMDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmgKQEAgLTI3LDEwICYjNDM7MjcsMTIgQEAgRklYVFVSRShjb3JlZHVtcCkKIC8qIFNoYXJlZCBoZWxwZXIgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCiB2b2lkICpkb19ub3RoaW5nKHZvaWQgKmFyZyk7CiB2b2lkIGNyYXNoaW5nX2NoaWxkKHZvaWQpOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfdGhyZWFkKHZvaWQpOwogaW50IGNyZWF0ZV9kZXRhY2hlZF90bXBmcyh2b2lkKTsKIGludCBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChjb25zdCBjaGFyICpwYXRoKTsKIGJvb2wgc2V0X2NvcmVfcGF0dGVybihjb25zdCBjaGFyICpwYXR0ZXJuKTsKIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpOwomIzQzO2ludCBnZXRfcGVlcl9waWRmZF90aHJlYWQoaW50IGZkKTsKIGJvb2wgZ2V0X3BpZGZkX2luZm8oaW50IGZkX3BlZXJfcGlkZmQsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKTsKIAogLyogSW5saW5lIGhlbHBlciB0aGF0IHVzZXMgaGFybmVzcyB0eXBlcyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwppbmRleCAyYTIwZmFmOWNiMGFkLi4zNjMwNjA2OWY2MmU1IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwpAQCAtMTMsNiAmIzQzOzEzLDcgQEAKICNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvZXBvbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKICNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CkBAIC0zOCw2ICYjNDM7MzksMTAgQEAgc3RydWN0IF9maXh0dXJlX2NvcmVkdW1wX2RhdGEgewogCiAjZGVmaW5lIE5VTV9USFJFQURfU1BBV04gMTI4CiAKJiM0MzsjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQUQKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgODcKJiM0MzsjZW5kaWYKJiM0MzsKIHZvaWQgKmRvX25vdGhpbmcodm9pZCAqYXJnKQogewogCSh2b2lkKWFyZzsKQEAgLTU5LDYgJiM0Mzs2NCwzNiBAQCB2b2lkIGNyYXNoaW5nX2NoaWxkKHZvaWQpCiAJaSA9ICoodm9sYXRpbGUgaW50ICopTlVMTDsKIH0KIAomIzQzO3N0YXRpYyB2b2lkICpjcmFzaGluZ190aHJlYWQodm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50ICpwOwomIzQzOwomIzQzOwkodm9pZClhcmc7CiYjNDM7CiYjNDM7CS8qIGNyYXNoIG9uIHB1cnBvc2Ugd2l0aCBTRUdWX01BUEVSUiAqLwomIzQzOwlwID0gbW1hcChOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJbXVubWFwKHAsIFBBR0VfU0laRSk7CiYjNDM7CSpwID0gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfdGhyZWFkKHZvaWQpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5VTV9USFJFQURfU1BBV047ICYjNDM7JiM0MztpKQomIzQzOwkJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpOwomIzQzOwomIzQzOwkvKiBjcmFzaCBmcm9tIGEgbm9uLWxlYWRlciB0aHJlYWQgKi8KJiM0MzsJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGNyYXNoaW5nX3RocmVhZCwgTlVMTCk7CiYjNDM7CXBhdXNlKCk7CiYjNDM7fQomIzQzOwogaW50IGNyZWF0ZV9kZXRhY2hlZF90bXBmcyh2b2lkKQogewogCWludCBmZF9jb250ZXh0LCBmZF90bXBmczsKQEAgLTEzOCw2ICYjNDM7MTczLDIwIEBAIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpCiAJcmV0dXJuIGZkX3BlZXJfcGlkZmQ7CiB9CiAKJiM0MztpbnQgZ2V0X3BlZXJfcGlkZmRfdGhyZWFkKGludCBmZCkKJiM0Mzt7CiYjNDM7CWludCBmZF9wZWVyX3BpZGZkOwomIzQzOwlzb2NrbGVuX3QgZmRfcGVlcl9waWRmZF9sZW4gPSBzaXplb2YoZmRfcGVlcl9waWRmZCk7CiYjNDM7CWludCByZXQgPSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19QRUVSUElERkRfVEhSRUFELCAmYW1wO2ZkX3BlZXJfcGlkZmQsCiYjNDM7CQkJICAgICAmYW1wO2ZkX3BlZXJfcGlkZmRfbGVuKTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBnZXRzb2Nrb3B0KFNPX1BFRVJQSURGRF9USFJFQUQpIGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGlkZmQgJWRcbiYjMzQ7LCBfX2Z1bmNfXywgZmRfcGVlcl9waWRmZCk7CiYjNDM7CXJldHVybiBmZF9wZWVyX3BpZGZkOwomIzQzO30KJiM0MzsKIGJvb2wgZ2V0X3BpZGZkX2luZm8oaW50IGZkX3BlZXJfcGlkZmQsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlCmluZGV4IGE2NmYxMGZiMGMyMzEuLjQ1Yjg0MTc1OGYxYmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlCkBAIC0yMyw2ICYjNDM7MjMsOCBAQCBURVNUX0dFTl9GSUxFUyA6PSBzY21fcmlnaHRzX2RlbmlhbF9sc20uYnBmLm8KIGluY2x1ZGUgLi4vLi4vbGliLm1rCiBpbmNsdWRlIC4uL2JwZi5tawogCiYjNDM7JChPVVRQVVQpL3NjbV9waWRmZDogQ0ZMQUdTICYjNDM7PSAtcHRocmVhZAomIzQzOwogJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogJChCUEZPQkopCiAkKE9VVFBVVCkvc2NtX3JpZ2h0c19kZW5pYWxfbHNtOiBDRkxBR1MgJiM0Mzs9IC1JJChTQ1JBVENIX0RJUikvaW5jbHVkZQogJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogTERMSUJTICYjNDM7PSAtbGVsZiAtbHoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L3NjbV9waWRmZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmMKaW5kZXggMmMxOGI5MmEyNjAzNS4uYmJiZDVlN2I0ZmE3OCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmMKQEAgLTEwLDYgJiM0MzsxMCw3IEBACiAjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7cHRocmVhZC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy91bi5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zaWduYWwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndDsKQEAgLTI3LDYgJiM0MzsyOCwxNCBAQAogI2RlZmluZSBTQ01fUElERkQgMHgwNAogI2VuZGlmCiAKJiM0MzsjaWZuZGVmIFNPX1BBU1NQSURGRF9USFJFQUQKJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgODYKJiM0MzsjZW5kaWYKJiM0MzsKJiM0MzsjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQUQKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgODcKJiM0MzsjZW5kaWYKJiM0MzsKICNkZWZpbmUgQ0hJTERfRVhJVF9DT0RFX09LIDEyMwogCiBzdGF0aWMgdm9pZCBjaGlsZF9kaWUoKQpAQCAtNTUzLDQgJiM0Mzs1NjIsMzYxIEBAIFRFU1RfRihzY21fcGlkZmQsIHRlc3QpCiAJY2xvc2UocGZkKTsKIH0KIAomIzQzO3N0cnVjdCB0aHJlYWRfaWRzIHsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwlwaWRfdCB0aWQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqc2VuZF9pZHNfdGhyZWFkKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CWludCBmZCA9ICooaW50ICopYXJnOwomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7CiYjNDM7CQkucGlkID0gZ2V0cGlkKCksCiYjNDM7CQkudGlkID0gZ2V0dGlkKCksCiYjNDM7CX07CiYjNDM7CWNoYXIgc3luYzsKJiM0MzsKJiM0MzsJaWYgKHNlbmQoZmQsICZhbXA7aWRzLCBzaXplb2YoaWRzKSwgMCkgIT0gc2l6ZW9mKGlkcykpCiYjNDM7CQlyZXR1cm4gKHZvaWQgKikxOwomIzQzOwomIzQzOwkvKiBzdGF5IGFsaXZlIHVudGlsIHRoZSByZWNlaXZlciBoYXMgbG9va2VkIGF0IG91ciBwaWRmZCAqLwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtzeW5jLCAxKSAhPSAxKQomIzQzOwkJcmV0dXJuICh2b2lkICopMTsKJiM0MzsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpzZW5kX2lkc19jcmVkc190aHJlYWQodm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50IGZkID0gKihpbnQgKilhcmc7CiYjNDM7CXN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHsKJiM0MzsJCS5waWQgPSBnZXRwaWQoKSwKJiM0MzsJCS50aWQgPSBnZXR0aWQoKSwKJiM0MzsJfTsKJiM0MzsJc3RydWN0IHVjcmVkIHVjcmVkID0gewomIzQzOwkJLnBpZCA9IGdldHBpZCgpLAomIzQzOwkJLnVpZCA9IGdldHVpZCgpLAomIzQzOwkJLmdpZCA9IGdldGdpZCgpLAomIzQzOwl9OwomIzQzOwljaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YodWNyZWQpKV0gPSB7IDAgfTsKJiM0MzsJc3RydWN0IGlvdmVjIGlvdjsKJiM0MzsJc3RydWN0IG1zZ2hkciBtc2cgPSB7IDAgfTsKJiM0MzsJc3RydWN0IGNtc2doZHIgKmNtc2c7CiYjNDM7CWNoYXIgc3luYzsKJiM0MzsKJiM0MzsJaW92Lmlvdl9iYXNlID0gJmFtcDtpZHM7CiYjNDM7CWlvdi5pb3ZfbGVuID0gc2l6ZW9mKGlkcyk7CiYjNDM7CiYjNDM7CW1zZy5tc2dfaW92ID0gJmFtcDtpb3Y7CiYjNDM7CW1zZy5tc2dfaW92bGVuID0gMTsKJiM0MzsJbXNnLm1zZ19jb250cm9sID0gY29udHJvbDsKJiM0MzsJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNvbnRyb2wpOwomIzQzOwomIzQzOwljbXNnID0gQ01TR19GSVJTVEhEUigmYW1wO21zZyk7CiYjNDM7CWNtc2ctJmd0O2Ntc2dfbGV2ZWwgPSBTT0xfU09DS0VUOwomIzQzOwljbXNnLSZndDtjbXNnX3R5cGUgPSBTQ01fQ1JFREVOVElBTFM7CiYjNDM7CWNtc2ctJmd0O2Ntc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHVjcmVkKSk7CiYjNDM7CW1lbWNweShDTVNHX0RBVEEoY21zZyksICZhbXA7dWNyZWQsIHNpemVvZih1Y3JlZCkpOwomIzQzOwomIzQzOwlpZiAoc2VuZG1zZyhmZCwgJmFtcDttc2csIDApICE9IHNpemVvZihpZHMpKQomIzQzOwkJcmV0dXJuICh2b2lkICopMTsKJiM0MzsKJiM0MzsJaWYgKHJlYWQoZmQsICZhbXA7c3luYywgMSkgIT0gMSkKJiM0MzsJCXJldHVybiAodm9pZCAqKTE7CiYjNDM7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0aHJlYWRfY2xpZW50KGludCBmZCwgaW50IHN5bmNmZCwgdm9pZCAqKCpzZW5kZXIpKHZvaWQgKikpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwl2b2lkICpyZXQ7CiYjNDM7CWNoYXIgc3luYzsKJiM0MzsKJiM0MzsJLyogd2FpdCB1bnRpbCB0aGUgcmVjZWl2ZXIgZW5hYmxlZCBTT19QQVNTUElERkQgKi8KJiM0MzsJaWYgKHJlYWQoc3luY2ZkLCAmYW1wO3N5bmMsIDEpICE9IDEpCiYjNDM7CQljaGlsZF9kaWUoKTsKJiM0MzsKJiM0MzsJaWYgKHB0aHJlYWRfY3JlYXRlKCZhbXA7dGhyZWFkLCBOVUxMLCBzZW5kZXIsICZhbXA7ZmQpKQomIzQzOwkJY2hpbGRfZGllKCk7CiYjNDM7CiYjNDM7CWlmIChwdGhyZWFkX2pvaW4odGhyZWFkLCAmYW1wO3JldCkgfHwgcmV0KQomIzQzOwkJY2hpbGRfZGllKCk7CiYjNDM7CiYjNDM7CWV4aXQoMCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVjdl9waWRmZChpbnQgZmQsIHN0cnVjdCB0aHJlYWRfaWRzICppZHMpCiYjNDM7ewomIzQzOwljaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YoaW50KSldID0geyAwIH07CiYjNDM7CXN0cnVjdCBpb3ZlYyBpb3Y7CiYjNDM7CXN0cnVjdCBtc2doZHIgbXNnID0geyAwIH07CiYjNDM7CXN0cnVjdCBjbXNnaGRyICpjbXNnOwomIzQzOwlpbnQgcGlkZmQgPSAtMTsKJiM0MzsKJiM0MzsJaW92Lmlvdl9iYXNlID0gaWRzOwomIzQzOwlpb3YuaW92X2xlbiA9IHNpemVvZigqaWRzKTsKJiM0MzsKJiM0MzsJbXNnLm1zZ19pb3YgPSAmYW1wO2lvdjsKJiM0MzsJbXNnLm1zZ19pb3ZsZW4gPSAxOwomIzQzOwltc2cubXNnX2NvbnRyb2wgPSBjb250cm9sOwomIzQzOwltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbCk7CiYjNDM7CiYjNDM7CWlmIChyZWN2bXNnKGZkLCAmYW1wO21zZywgMCkgIT0gc2l6ZW9mKCppZHMpKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7cmVjdm1zZyYjMzQ7KTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobXNnLm1zZ19mbGFncyAmYW1wOyAoTVNHX1RSVU5DIHwgTVNHX0NUUlVOQykpIHsKJiM0MzsJCWxvZ19lcnIoJiMzNDtyZWN2bXNnOiB0cnVuY2F0ZWQmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUigmYW1wO21zZyk7IGNtc2cgIT0gTlVMTDsKJiM0MzsJICAgICBjbXNnID0gQ01TR19OWFRIRFIoJmFtcDttc2csIGNtc2cpKSB7CiYjNDM7CQlpZiAoY21zZy0mZ3Q7Y21zZ19sZXZlbCA9PSBTT0xfU09DS0VUICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjbXNnLSZndDtjbXNnX3R5cGUgPT0gU0NNX1BJREZEKQomIzQzOwkJCW1lbWNweSgmYW1wO3BpZGZkLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZihwaWRmZCkpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBwaWRmZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB0aHJlYWRfcGlkZmRfZmxvdyh2b2lkICooKnNlbmRlcikodm9pZCAqKSwgaW50IG9wdG5hbWUsCiYjNDM7CQkJICAgICBzdHJ1Y3QgdGhyZWFkX2lkcyAqaWRzLCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbykKJiM0Mzt7CiYjNDM7CWludCBza1syXTsKJiM0MzsJaW50IHN5bmNwaXBlWzJdOwomIzQzOwlpbnQgcGlkZmQ7CiYjNDM7CWludCBjaGlsZF9zdGF0dXMgPSAwOwomIzQzOwlwaWRfdCBjaGlsZDsKJiM0MzsKJiM0MzsJaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNrKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJaWYgKHBpcGUoc3luY3BpcGUpKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwljaGlsZCA9IGZvcmsoKTsKJiM0MzsJaWYgKGNoaWxkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJaWYgKGNoaWxkID09IDApIHsKJiM0MzsJCWNsb3NlKHNrWzBdKTsKJiM0MzsJCWNsb3NlKHN5bmNwaXBlWzFdKTsKJiM0MzsJCXRocmVhZF9jbGllbnQoc2tbMV0sIHN5bmNwaXBlWzBdLCBzZW5kZXIpOwomIzQzOwl9CiYjNDM7CWNsb3NlKHNrWzFdKTsKJiM0MzsJY2xvc2Uoc3luY3BpcGVbMF0pOwomIzQzOwomIzQzOwlpbnQgb24gPSAxOwomIzQzOwomIzQzOwlpZiAoc2V0c29ja29wdChza1swXSwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgJmFtcDtvbiwgc2l6ZW9mKG9uKSkpIHsKJiM0MzsJCWxvZ19lcnIoJiMzNDtGYWlsZWQgdG8gc2V0IHBpZGZkIHBhc3Npbmcgb3B0aW9uJiMzNDspOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICh3cml0ZShzeW5jcGlwZVsxXSwgJiMzNDsxJiMzNDssIDEpICE9IDEpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWNsb3NlKHN5bmNwaXBlWzFdKTsKJiM0MzsKJiM0MzsJcGlkZmQgPSByZWN2X3BpZGZkKHNrWzBdLCBpZHMpOwomIzQzOwlpZiAocGlkZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlpbmZvLSZndDttYXNrID0gUElERkRfSU5GT19QSUQ7CiYjNDM7CWlmIChpb2N0bChwaWRmZCwgUElERkRfR0VUX0lORk8sIGluZm8pKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7aW9jdGwoUElERkRfR0VUX0lORk8pJiMzNDspOwomIzQzOwkJY2xvc2UocGlkZmQpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWNsb3NlKHBpZGZkKTsKJiM0MzsKJiM0MzsJLyogcmVsZWFzZSB0aGUgc2VuZGluZyB0aHJlYWQgKi8KJiM0MzsJaWYgKHdyaXRlKHNrWzBdLCAmIzM0O3gmIzM0OywgMSkgIT0gMSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJY2xvc2Uoc2tbMF0pOwomIzQzOwomIzQzOwl3YWl0cGlkKGNoaWxkLCAmYW1wO2NoaWxkX3N0YXR1cywgMCk7CiYjNDM7CWlmICghV0lGRVhJVEVEKGNoaWxkX3N0YXR1cykgfHwgV0VYSVRTVEFUVVMoY2hpbGRfc3RhdHVzKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc29ja29wdF9zZXQoaW50IGZkLCBpbnQgb3B0bmFtZSwgaW50IHZhbCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBvcHRuYW1lLCAmYW1wO3ZhbCwgc2l6ZW9mKHZhbCkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNvY2tvcHRfZ2V0KGludCBmZCwgaW50IG9wdG5hbWUpCiYjNDM7ewomIzQzOwlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKGludCk7CiYjNDM7CWludCB2YWwgPSAtMTsKJiM0MzsKJiM0MzsJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIG9wdG5hbWUsICZhbXA7dmFsLCAmYW1wO2xlbikpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldHVybiB2YWw7CiYjNDM7fQomIzQzOwomIzQzO1RFU1Qoc2NtX3BpZGZkX3NldHNvY2tvcHRfdmFsdWVzKQomIzQzO3sKJiM0MzsJaW50IHNrWzJdOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2spKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFELCAxKSk7CiYjNDM7CUFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpOwomIzQzOwomIzQzOwkvKiBUaGUgb3B0aW9uIHNldCBsYXN0IHdpbnMuICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZELCAxKSk7CiYjNDM7CUFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQsIDEpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEKSk7CiYjNDM7CiYjNDM7CS8qIERpc2FibGluZyBvbmUgb3B0aW9uIGxlYXZlcyB0aGUgb3RoZXIgYWxvbmUuICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZELCAwKSk7CiYjNDM7CUFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQsIDApKTsKJiM0MzsJQVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkQpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7CiYjNDM7CiYjNDM7CWNsb3NlKHNrWzBdKTsKJiM0MzsJY2xvc2Uoc2tbMV0pOwomIzQzO30KJiM0MzsKJiM0MztURVNUKHNjbV9waWRmZF90aHJlYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7CiYjNDM7CXN0cnVjdCBwaWRmZF9pbmZvIGluZm87CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsCiYjNDM7CQkJCSAgICAgICAmYW1wO2lkcywgJmFtcDtpbmZvKSk7CiYjNDM7CUFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy50aWQsIGluZm8ucGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1Qoc2NtX3BpZGZkX3RocmVhZF9ncm91cCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHJlYWRfaWRzIGlkczsKJiM0MzsJc3RydWN0IHBpZGZkX2luZm8gaW5mbzsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHRocmVhZF9waWRmZF9mbG93KHNlbmRfaWRzX3RocmVhZCwgU09fUEFTU1BJREZELAomIzQzOwkJCQkgICAgICAgJmFtcDtpZHMsICZhbXA7aW5mbykpOwomIzQzOwlBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7CiYjNDM7CUVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnBpZCk7CiYjNDM7CUVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpOwomIzQzO30KJiM0MzsKJiM0MztURVNUKHNjbV9waWRmZF90aHJlYWRfY3JlZHMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7CiYjNDM7CXN0cnVjdCBwaWRmZF9pbmZvIGluZm87CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc19jcmVkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsCiYjNDM7CQkJCSAgICAgICAmYW1wO2lkcywgJmFtcDtpbmZvKSk7CiYjNDM7CUFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy50aWQsIGluZm8ucGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwZWVyX2Nvbm5lY3RfdGhyZWFkKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrX2FkZHIgKnNhID0gYXJnOwomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7CiYjNDM7CQkucGlkID0gZ2V0cGlkKCksCiYjNDM7CQkudGlkID0gZ2V0dGlkKCksCiYjNDM7CX07CiYjNDM7CWludCBmZDsKJiM0MzsJY2hhciBzeW5jOwomIzQzOwomIzQzOwlmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gKHZvaWQgKikxOwomIzQzOwomIzQzOwlpZiAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhbXA7c2EtJmd0O2xpc3Rlbl9hZGRyLCBzYS0mZ3Q7YWRkcmxlbikpCiYjNDM7CQlyZXR1cm4gKHZvaWQgKikxOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgJmFtcDtpZHMsIHNpemVvZihpZHMpLCAwKSAhPSBzaXplb2YoaWRzKSkKJiM0MzsJCXJldHVybiAodm9pZCAqKTE7CiYjNDM7CiYjNDM7CS8qIHN0YXkgYWxpdmUgdW50aWwgdGhlIHNlcnZlciBoYXMgbG9va2VkIGF0IG91ciBwaWRmZCAqLwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtzeW5jLCAxKSAhPSAxKQomIzQzOwkJcmV0dXJuICh2b2lkICopMTsKJiM0MzsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwZWVyX3BpZGZkX2luZm8oaW50IGZkLCBpbnQgb3B0bmFtZSwgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pCiYjNDM7ewomIzQzOwlpbnQgcGlkZmQ7CiYjNDM7CXNvY2tsZW5fdCBsZW4gPSBzaXplb2YocGlkZmQpOwomIzQzOwomIzQzOwlpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgJmFtcDtwaWRmZCwgJmFtcDtsZW4pKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7Z2V0c29ja29wdChTT19QRUVSUElERkQqKSYjMzQ7KTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlpbmZvLSZndDttYXNrID0gUElERkRfSU5GT19QSUQ7CiYjNDM7CWlmIChpb2N0bChwaWRmZCwgUElERkRfR0VUX0lORk8sIGluZm8pKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7aW9jdGwoUElERkRfR0VUX0lORk8pJiMzNDspOwomIzQzOwkJY2xvc2UocGlkZmQpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNsb3NlKHBpZGZkKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmV0dXJucyBhIHBpZGZkIGZvciB0aGUgcGVlciYjMzk7cyBjb25uZWN0aW5nIHRocmVhZC4gKi8KJiM0MztURVNUKHNvX3BlZXJwaWRmZF90aHJlYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja19hZGRyIHNhOwomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7CiYjNDM7CXN0cnVjdCBwaWRmZF9pbmZvIGluZm87CiYjNDM7CXB0aHJlYWRfdCB0aHJlYWQ7CiYjNDM7CXZvaWQgKnRyZXQ7CiYjNDM7CWludCBzZXJ2ZXIsIGNmZDsKJiM0MzsKJiM0MzsJc2VydmVyID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJQVNTRVJUX0xFKDAsIHNlcnZlcik7CiYjNDM7CiYjNDM7CWZpbGxfc29ja2FkZHIoJmFtcDtzYSwgdHJ1ZSk7CiYjNDM7CUFTU0VSVF9FUSgwLCBiaW5kKHNlcnZlciwgKHN0cnVjdCBzb2NrYWRkciAqKSZhbXA7c2EubGlzdGVuX2FkZHIsIHNhLmFkZHJsZW4pKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbihzZXJ2ZXIsIDEpKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHB0aHJlYWRfY3JlYXRlKCZhbXA7dGhyZWFkLCBOVUxMLCBwZWVyX2Nvbm5lY3RfdGhyZWFkLCAmYW1wO3NhKSk7CiYjNDM7CiYjNDM7CWNmZCA9IGFjY2VwdChzZXJ2ZXIsIE5VTEwsIE5VTEwpOwomIzQzOwlBU1NFUlRfTEUoMCwgY2ZkKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHNpemVvZihpZHMpLCByZWN2KGNmZCwgJmFtcDtpZHMsIHNpemVvZihpZHMpLCBNU0dfV0FJVEFMTCkpOwomIzQzOwlBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7CiYjNDM7CiYjNDM7CS8qIFNPX1BFRVJQSURGRCByZWZlcnMgdG8gdGhlIHBlZXImIzM5O3MgdGhyZWFkLWdyb3VwLiAqLwomIzQzOwlBU1NFUlRfRVEoMCwgcGVlcl9waWRmZF9pbmZvKGNmZCwgU09fUEVFUlBJREZELCAmYW1wO2luZm8pKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8ucGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7CiYjNDM7CiYjNDM7CS8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmVmZXJzIHRvIHRoZSBjb25uZWN0aW5nIHRocmVhZC4gKi8KJiM0MzsJQVNTRVJUX0VRKDAsIHBlZXJfcGlkZmRfaW5mbyhjZmQsIFNPX1BFRVJQSURGRF9USFJFQUQsICZhbXA7aW5mbykpOwomIzQzOwlFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpOwomIzQzOwlFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTsKJiM0MzsKJiM0MzsJLyogcmVsZWFzZSB0aGUgY29ubmVjdGluZyB0aHJlYWQgKi8KJiM0MzsJQVNTRVJUX0VRKDEsIHdyaXRlKGNmZCwgJiMzNDt4JiMzNDssIDEpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIHB0aHJlYWRfam9pbih0aHJlYWQsICZhbXA7dHJldCkpOwomIzQzOwlBU1NFUlRfRVEoTlVMTCwgdHJldCk7CiYjNDM7CiYjNDM7CWNsb3NlKGNmZCk7CiYjNDM7CWNsb3NlKHNlcnZlcik7CiYjNDM7fQomIzQzOwogVEVTVF9IQVJORVNTX01BSU4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI4NjYKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiA5NjMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqRnV6emluZyBUYXJnZXQgSWRlbnRpZmljYXRpb24gYW5kIEFuYWx5c2lzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBXZSYjMzk7cmUgbG9va2luZyBhdCBmdW5jdGlvbmFsIGNoYW5nZXMgd2l0aGluIHRoZSBjb3JlIGtlcm5lbCBuZXR3b3JraW5nIHN0YWNrLCB1bml4IHNvY2tldHMsIHBpZGZzLCBhbmQgY29yZWR1bXAgbWVjaGFuaXNtcy4gVGhlIGludHJvZHVjdGlvbiBvZiBuZXcgc29ja2V0IG9wdGlvbnMsIGBTT19QQVNTUElERkRfVEhSRUFEYCBhbmQgYFNPX1BFRVJQSURGRF9USFJFQURgLCBpcyBhIGNsZWFyIGluZGljYXRpb24gdGhhdCBuZXcgY29kZSBwYXRocyBhcmUgYmVpbmcgb3BlbmVkLCBhbmQgdGhhdOKAmXMgYWx3YXlzIGEgZ29vZCBzaWduIGZvciBmdXp6aW5nLiBUaGUgZmFjdCB0aGF0IGl0JiMzOTtzIHRvdWNoaW5nIGBzY21fcGlkZmRfcmVjdmAsIGBfX3BpZGZzX3JlZ2lzdGVyX3BpZHNgLCBgc2tfZ2V0c29ja29wdF9wZWVycGlkZmRgLCBgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljYCAodGhyb3VnaCBgdW5peF9za2Jfc2NtX2VxYCksIFNDTSBjcmVkZW50aWFsIGhhbmRsaW5nLCBhbmQgY29yZWR1bXAgbG9naWMgYWNyb3NzIHNldmVyYWwgc3Vic3lzdGVtcyBtYWtlcyBpdCBhIGp1aWN5IHRhcmdldC4gVGhlc2UgYXJlIGFsbCBjcml0aWNhbCBhcmVhcywgYW5kIHN1YnRsZSBlcnJvcnMgaGVyZSBjYW4gbGVhZCB0byBzaWduaWZpY2FudCB2dWxuZXJhYmlsaXRpZXMuCgpOb3csIHRoZSBuZXh0IHN0ZXAgaXMgdG8gbmFpbCBkb3duIHRoZSBzcGVjaWZpYyBmb2N1cyBwb2ludHMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUga2V5IGZ1bmN0aW9ucyB0aGF0IGFyZSBtb2RpZmllZCwgYXMgd2VsbCBhcyB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zLiBUaGlzIHdpbGwgaGVscCBtZSBuYXJyb3cgZG93biB0aGUgZnV6emluZyBzY29wZSBhbmQgdGFpbG9yIHRoZSBmdXp6aW5nIGNhbXBhaWducyBmb3IgbWF4aW11bSBlZmZlY3RpdmVuZXNzLiBJJiMzOTtsbCBsaWtlbHkgbmVlZCB0byB1c2UgYGdyZXBwZXJgIG9yIGp1c3QgbWFudWFsbHkgZ28gdGhyb3VnaCB0aGUgY29kZSB0byBpZGVudGlmeSBmdW5jdGlvbnMuIFdlIGhhdmUgYSBsb3Qgb2YgYXJlYXMgd2hlcmUgcGlkZmRzIGFyZSBiZWluZyB1c2VkIHNvIGxldCYjMzk7cyBzdGFydCB3aXRoIHRob3NlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O19fcGlkZnNfcmVnaXN0ZXJfcGlkcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9waWRmcy5jPTEwNDU9aW50IHBpZGZzX3JlZ2lzdGVyX3BpZF9nZnAoc3RydWN0IHBpZCAqcGlkLCBnZnBfdCBnZnApXG4tLVxuZnMvcGlkZnMuYy0xMDgwLS8qIFJlZ2lzdGVyIHRoZSBwaWRzIHVwIHRvIHBpZCB0eXBlIEBsYXN0IG9mIEBwaWRzIGluIHBpZGZzLiAqL1xuZnMvcGlkZnMuYzoxMDgxOmludCBfX3BpZGZzX3JlZ2lzdGVyX3BpZHMoc3RydWN0IHBpZCAqY29uc3QgKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdClcbmZzL3BpZGZzLmMtMTA4Mi17XG4tLVxuaW5jbHVkZS9saW51eC9waWRmcy5oPTM1PXZvaWQgcGlkZnNfZnJlZV9waWQoc3RydWN0IHBpZCAqcGlkKTtcbmluY2x1ZGUvbGludXgvcGlkZnMuaDozNjppbnQgX19waWRmc19yZWdpc3Rlcl9waWRzKHN0cnVjdCBwaWQgKmNvbnN0ICpwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QpO1xuaW5jbHVkZS9saW51eC9waWRmcy5oLTM3LVxuaW5jbHVkZS9saW51eC9waWRmcy5oLTM4LS8qIFJlZ2lzdGVyIHRoZSBwaWRzIG9mIGFuIGFycmF5IGRlY2xhcmVkIHdpdGggREVDTEFSRV9QSURTKCkuICovXG5pbmNsdWRlL2xpbnV4L3BpZGZzLmg6Mzk6I2RlZmluZSBwaWRmc19yZWdpc3Rlcl9waWRzKHBpZHMpXHRfX3BpZGZzX3JlZ2lzdGVyX3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpKVxuaW5jbHVkZS9saW51eC9waWRmcy5oLTQwLVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0NDUxCgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogMjAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkgd2VyZSB0aGlua2luZyB0aHJvdWdoIHRoZSBwcm9jZXNzOgoKKipEaXZpbmcgaW50byB0aGUgYHBpZGZzX2NvcmVkdW1wYCBGdW5jdGlvbioqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSB0YWtpbmcgYSBsb29rIGF0IHRoZSBgcGlkZnNfY29yZWR1bXBgIGZ1bmN0aW9uLiBJdCYjMzk7cyBsb2NhdGVkIGluIGBmcy9waWRmcy5jYCwgd2hpY2ggbWFrZXMgc2Vuc2U7IHRoaXMgaXMgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gZmluZCBjb3JlIGR1bXAtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgcGlkZnMgZnJhbWV3b3JrLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaGFuZGxlcyBjb3JlIGR1bXBzLCBlc3BlY2lhbGx5IGluIHJlbGF0aW9uIHRvIHByb2Nlc3MgSURzLiBJJiMzOTttIGhvcGluZyB0byBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHRoaXMgZnVuY3Rpb24gaW50ZXJhY3RzIHdpdGggdGhlIGtlcm5lbCYjMzk7cyBjb3JlIGR1bXBpbmcgbWVjaGFuaXNtcyBhbmQgd2hhdCBzcGVjaWZpYyByb2xlcyBwaWRmcyBwbGF5cyBpbiB0aGUgb3ZlcmFsbCBmbG93LiBJJiMzOTtsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkLCB0aGUgZXJyb3IgaGFuZGxpbmcsIGFuZCBhbnkgcG90ZW50aWFsIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zLiBUaGlzIHNob3VsZCBiZSBhbiBpbnRlcmVzdGluZyBleHBsb3JhdGlvbiBpbnRvIGhvdyB0aGUga2VybmVsIG9yY2hlc3RyYXRlcyBjb3JlIGR1bXBzIHdpdGhpbiBhIFBJRCBmaWxlc3lzdGVtIGNvbnRleHQuIEkgZXhwZWN0IHRvIHNlZSBzb21lIGludGVyZXN0aW5nIGludGVyYWN0aW9ucyB3aXRoIHByb2Nlc3Mgc3RhdGVzIGFuZCBtZW1vcnkgbWFwcGluZy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwaWRmc19jb3JlZHVtcCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jPTYyMz1zdGF0aWMgaW50IHVtaF9jb3JlZHVtcF9zZXR1cChzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqbmV3KVxuLS1cbmZzL2NvcmVkdW1wLmMtNjM5LVxuZnMvY29yZWR1bXAuYzo2NDA6XHRcdHBpZGZzX2NvcmVkdW1wKGNwKTtcbmZzL2NvcmVkdW1wLmMtNjQxLVxuLS1cbmZzL2NvcmVkdW1wLmM9NjcyPXN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbi0tXG5mcy9jb3JlZHVtcC5jLTcxNC1cdCAqL1xuZnMvY29yZWR1bXAuYzo3MTU6XHRwaWRmc19jb3JlZHVtcChjcHJtKTtcbmZzL2NvcmVkdW1wLmMtNzE2LVxuLS1cbmZzL3BpZGZzLmM9MzI5PXN0YXRpYyBpbmxpbmUgYm9vbCBwaWRfaW5fY3VycmVudF9waWRucyhjb25zdCBzdHJ1Y3QgcGlkICpwaWQpXG4tLVxuZnMvcGlkZnMuYy0zMzgtXG5mcy9waWRmcy5jOjMzOTpzdGF0aWMgX191MzIgcGlkZnNfY29yZWR1bXBfbWFzayhlbnVtIHRhc2tfZHVtcGFibGUgZHVtcGFibGUpXG5mcy9waWRmcy5jLTM0MC17XG4tLVxuZnMvcGlkZnMuYz0zNjU9c3RhdGljIGxvbmcgcGlkZmRfaW5mbyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpXG4tLVxuZnMvcGlkZnMuYy00MzMtXHRpZiAoKG1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApIFx1MDAyNlx1MDAyNiAha2luZm8uY29yZWR1bXBfbWFzaykge1xuZnMvcGlkZnMuYzo0MzQ6XHRcdGtpbmZvLmNvcmVkdW1wX21hc2sgPSBwaWRmc19jb3JlZHVtcF9tYXNrKHRhc2tfZXhlY19zdGF0ZV9nZXRfZHVtcGFibGUodGFzaykpO1xuZnMvcGlkZnMuYy00MzUtXHRcdGtpbmZvLm1hc2sgfD0gUElERkRfSU5GT19DT1JFRFVNUDtcbi0tXG5mcy9waWRmcy5jPTc0OT12b2lkIHBpZGZzX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXG4tLVxuZnMvcGlkZnMuYy03OTUtI2lmZGVmIENPTkZJR19DT1JFRFVNUFxuZnMvcGlkZnMuYzo3OTY6c3RhdGljIHZvaWQgcGlkZnNfY29yZWR1bXBfcGlkKHN0cnVjdCBwaWQgKnBpZCxcbmZzL3BpZGZzLmMtNzk3LVx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuLS1cbmZzL3BpZGZzLmMtODA2LVx0LyogTm90ZSBob3cgd2Ugd2VyZSBjb3JlZHVtcGVkIGFuZCB0aGF0IHdlIGNvcmVkdW1wZWQuICovXG5mcy9waWRmcy5jOjgwNzpcdGF0dHItXHUwMDNlY29yZWR1bXBfbWFzayA9IHBpZGZzX2NvcmVkdW1wX21hc2soY3BybS1cdTAwM2VkdW1wYWJsZSkgfFxuZnMvcGlkZnMuYy04MDgtXHRcdFx0ICAgICAgUElERkRfQ09SRURVTVBFRDtcbi0tXG5mcy9waWRmcy5jLTgxNy1cbmZzL3BpZGZzLmM6ODE4OnZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL3BpZGZzLmMtODE5LXtcbi0tXG5mcy9waWRmcy5jLTgyMS1cdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBwaWRzX2xhc3QoY3BybS1cdTAwM2VwaWQpOyB0eXBlJiM0MzsmIzQzOylcbmZzL3BpZGZzLmM6ODIyOlx0XHRwaWRmc19jb3JlZHVtcF9waWQoY3BybS1cdTAwM2VwaWRbdHlwZV0sIGNwcm0pO1xuZnMvcGlkZnMuYy04MjMtfVxuLS1cbmluY2x1ZGUvbGludXgvcGlkZnMuaD0xNT12b2lkIHBpZGZzX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spO1xuaW5jbHVkZS9saW51eC9waWRmcy5oLTE2LSNpZmRlZiBDT05GSUdfQ09SRURVTVBcbmluY2x1ZGUvbGludXgvcGlkZnMuaDoxNzp2b2lkIHBpZGZzX2NvcmVkdW1wKGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pO1xuaW5jbHVkZS9saW51eC9waWRmcy5oLTE4LSNlbmRpZlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1NTM1CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMzI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEluaXRpYWwgQ29kZSBJbnNwZWN0aW9uOiBTb2NrZXQtUmVsYXRlZCBDaGFuZ2VzKioKCk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZXNlIGNvZGUgbW9kaWZpY2F0aW9ucyBiZXR0ZXIuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBkaXZlIGludG8gdGhlIGNvcmUgbmV0d29ya2luZyBjb2RlLCBzcGVjaWZpY2FsbHkgZXhhbWluaW5nIGhvdyBzb2NrZXRzIGFyZSBpbnRlcmFjdGluZyB3aXRoIHRoZSBjaGFuZ2VzLiBJJiMzOTttIGdvaW5nIHRvIHN0YXJ0IHdpdGggYSBzeXN0ZW1hdGljIHJldmlldywgaGl0dGluZyB0aGUga2V5IGZpbGVzOiBgbmV0L2NvcmUvc2NtLmNgLCBgbmV0L3VuaXgvYWZfdW5peC5jYCwgYW5kIGBuZXQvY29yZS9zb2NrLmNgLiBUaGVzZSBzZWVtIGxpa2UgdGhlIG1vc3QgbGlrZWx5IGNhbmRpZGF0ZXMgZm9yIHJlbGV2YW50IGNoYW5nZXMuIEkmIzM5O2xsIGFsc28gYmUgc3VyZSB0byBkb3VibGUtY2hlY2sgdGhlaXIgc3ltYm9scyB0byBjb25maXJtIG15IGFzc3VtcHRpb24sIGFuZCB0byBub3RlIGFueSBub24tc3RhdGljIGZ1bmN0aW9ucyBhcyB0aG9zZSBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgZW50cnkgcG9pbnRzLgoKTmV4dCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBiZWVuICptb2RpZmllZCouIEkgY2FuIHNlZSBhIGNvdXBsZSBvZiBmdW5jdGlvbnMgZnJvbSBgZnMvcGlkZnMuY2AgLSBgX19waWRmc19yZWdpc3Rlcl9waWRzYCAoZXhwb3J0ZWQpIGFuZCBgcGlkZnNfY29yZWR1bXBgIChub24tc3RhdGljKSAtIHRoYXQgc2VlbSByZWxldmFudCB0byBwcm9jZXNzIElEIGhhbmRsaW5nIGR1cmluZyBhIGNvcmUgZHVtcC4gVGhlbiwgSSBjYW4gc2VlIGNoYW5nZXMgaW4gYG5ldC9jb3JlL3NjbS5jYCwgd2hlcmUgYHNjbV9yZWN2X3VuaXhgIGNhbGxzIGBzY21fcGlkZmRfcmVjdmAgYW5kIGBfX3NjbV9zZW5kYCBpcyBwcmVzZW50LiBJdCBzZWVtcyBsaWtlIHRoZSBTeXN0ZW0gQ29udHJvbCBNZXNzYWdlIChTQ00pIHBhdGggaGFzIHNvbWUgdXBkYXRlcy4gYG5ldC9jb3JlL3NvY2suY2AgaGFzIGBza19zZXRzb2Nrb3B0YCBhbmQgYHNrX2dldHNvY2tvcHRgIC0gc29ja2V0IG9wdGlvbnMgc2VlbSB0byBiZSBhZmZlY3RlZCwgd2hpY2ggY291bGQgYmUgY29ubmVjdGVkLiBJbiBgbmV0L3VuaXgvYWZfdW5peC5jYCwgdGhlcmUmIzM5O3MgYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AgKHN0YXRpYywgYnV0IGNhbGxlZCBieSBub24tc3RhdGljIGZ1bmN0aW9ucyBsaWtlIGB1bml4X3N0cmVhbV9yZWN2bXNnYCBhbmQgYHVuaXhfZGdyYW1fcmVjdm1zZ2ApIGFsb25nIHdpdGggYHVuaXhfbGlzdGVuYCwgYHVuaXhfc3RyZWFtX2Nvbm5lY3RgLCBldGMuIC0gYmFzaWMgVW5peCBkb21haW4gc29ja2V0IGZ1bmN0aW9ucywgYWxzbyBsaWtlbHkgdG8gYmUgcGVydGluZW50LiBBbmQgZmluYWxseSwgYGZzL2NvcmVkdW1wLmNgLCB3aGVyZSBgZG9fY29yZWR1bXBgIG5vdyBjYWxscyBmdW5jdGlvbnMgbGlrZSBgY29yZWR1bXBfc29ja19jb25uZWN0YCBhbmQgYHVtaF9jb3JlZHVtcF9zZXR1cGAsIHdoaWNoIGFnYWluIHBvaW50cyB0byBzb2NrZXQgaW50ZXJhY3Rpb24gZHVyaW5nIGNvcmVkdW1wcy4KClNvLCBvdmVyYWxsLCB0aGlzIGxvb2tzIGxpa2UgYSBtdWx0aWZhY2V0ZWQgY2hhbmdlLCBsaWtlbHkgcmVsYXRlZCB0byBob3cgc29ja2V0cywgUElEIGZpbGVzLCBhbmQgY29yZWR1bXBzIGludGVyYWN0LiBUaGVyZSBzZWVtcyB0byBiZSBzb21lIHJlZmFjdG9yaW5nIGdvaW5nIG9uLCBhbG9uZyB3aXRoIG1vcmUgY2FsbHMgdG8gYHBpZGZkX3JlY3ZgIHdpdGhpbiB0aGUgU0NNIHBhdGguIEkgc2hvdWxkIGFsc28gbm90ZSBhbnkgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZXNlIG1vZGlmaWNhdGlvbnMsIGFuZCBzZWUgaG93IHRoZXkgYXJlIGludGVybGlua2VkLiBJIGFsc28gbmVlZCB0byBtYWtlIHN1cmUgdG8gZG91YmxlLWNoZWNrIHRoZSBzeW1ib2xzIGluIGBuZXQvY29yZS9zY20uY2AgYW5kIGBuZXQvdW5peC9hZl91bml4LmNgIHRvIGNvbmZpcm0gbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgbm9uLXN0YXRpYyBmdW5jdGlvbnMgYW5kIHRoZWlyIHBvdGVudGlhbCBlbnRyeSBwb2ludHMuIFRoaXMgd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgbW9kaWZpZWQgY29kZSBwYXRod2F5cy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt2b2lkIHNjbV9yZWN2X3VuaXgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvc2NtLmg9MTA0PXZvaWQgc2NtX3JlY3Yoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuaW5jbHVkZS9uZXQvc2NtLmgtMTA1LVx0ICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKTtcbmluY2x1ZGUvbmV0L3NjbS5oOjEwNjp2b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuaW5jbHVkZS9uZXQvc2NtLmgtMTA3LVx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpO1xuLS1cbm5ldC9jb3JlL3NjbS5jPTU4MT1FWFBPUlRfU1lNQk9MKHNjbV9yZWN2KTtcbm5ldC9jb3JlL3NjbS5jLTU4Mi1cbm5ldC9jb3JlL3NjbS5jOjU4Mzp2b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxubmV0L2NvcmUvc2NtLmMtNTg0LVx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjY2ODIKCQkJCQkJCW91dHB1dDogMTkKCQkJCQkJCXRob3VnaHRzOiAxMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyB0aGUgc3VtbWFyeSwgYXNzdW1pbmcgSSYjMzk7bSBhbiBleHBlcnQgYW5kIHRoaXMgaXMgcGFydCBvZiBhIGRlYnVnZ2luZy9hbmFseXNpcyBwcm9jZXNzOgoKKipEaXZpbmcgRGVlcGVyOiBFeHBsb3JpbmcgYF9fc2NtX3NlbmRgKioKCk9rYXksIEkmIzM5O3ZlIGp1c3QgYmVlbiBsb29raW5nIGF0IHNvbWUgcmVsYXRlZCBmdW5jdGlvbnMgYW5kIGJlaGF2aW9ycywgYW5kIGJlZm9yZSBJIG1vdmUgb24gdG8gYW55dGhpbmcgZWxzZSwgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBkb3VibGUtY2hlY2sgYF9fc2NtX3NlbmRgLiBJJiMzOTttIGFscmVhZHkgcHJldHR5IGZhbWlsaWFyIHdpdGggdGhlIHN5c3RlbS1sZXZlbCBjb21tdW5pY2F0aW9uLCBidXQgSSBoYXZlIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgYSBwb3RlbnRpYWwgaXNzdWUgbWlnaHQgYmUgbHVya2luZyB3aXRoaW4gdGhhdCBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiBJIG5lZWQgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgdGhhdCBpdCYjMzk7cyBoYW5kbGluZyB0aGUgZGF0YSBmbG93IGNvcnJlY3RseSwgdGhhdCB0aGUgZXJyb3IgY2hlY2tpbmcgaXMgcm9idXN0IGVub3VnaCwgYW5kIHRoYXQgdGhlcmUgYXJlbiYjMzk7dCBhbnkgc3VidGxlIHJhY2UgY29uZGl0aW9ucyBvciBtZW1vcnkgaXNzdWVzIHRoYXQgY291bGQgYmUgdHJpZ2dlcmVkIHVuZGVyIHNwZWNpZmljIGNpcmN1bXN0YW5jZXMuIEl0JiMzOTtzIGEga2V5IHBpZWNlIG9mIHRoZSBwdXp6bGUsIHNvIEkgbmVlZCB0byBtYWtlIHN1cmUgSSYjMzk7bSBub3QgbWlzc2luZyBhbnl0aGluZy4gSSYjMzk7bGwgdGFrZSBhIGNsb3NlIGxvb2sgYXQgaXRzIGludGVyYWN0aW9uIHdpdGggdGhlIG90aGVyIGNvbXBvbmVudHMgSSYjMzk7dmUgcmV2aWV3ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ludCBfX3NjbV9zZW5kJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L3NjbS5oPTU0PXZvaWQgc2NtX2RldGFjaF9mZHNfY29tcGF0KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBub3RydW5jKTtcbmluY2x1ZGUvbmV0L3NjbS5oOjU1OmludCBfX3NjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSk7XG5pbmNsdWRlL25ldC9zY20uaC01Ni12b2lkIF9fc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSk7XG4tLVxubmV0L2NvcmUvc2NtLmM9MTUwPXN0YXRpYyBpbmxpbmUgaW50IHNjbV9yZXBsYWNlX3BpZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3QgcGlkICpwaWQpXG4tLVxubmV0L2NvcmUvc2NtLmMtMTc3LVxubmV0L2NvcmUvc2NtLmM6MTc4OmludCBfX3NjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnApXG5uZXQvY29yZS9zY20uYy0xNzkte1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzEzNAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDgwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuCgoqKkludmVzdGlnYXRpbmcgU29ja2V0IE9wdGlvbiBNYW5hZ2VtZW50IGluIHRoZSBMaW51eCBLZXJuZWwqKgoKUmlnaHQsIEkgbmVlZCB0byBnZXQgdG8gdGhlIGJvdHRvbSBvZiBob3cgdGhlc2Ugc29ja2V0IG9wdGlvbnMgYXJlIGhhbmRsZWQuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgZXhhbWluaW5nIHRoZSBgc2tfc2V0c29ja29wdGAgYW5kIGBza19nZXRzb2Nrb3B0YCBmdW5jdGlvbnMuIE15IGluc3RpbmN0cyB0ZWxsIG1lIHRob3NlIGFyZSB0aGUga2V5IGZ1bmN0aW9ucyB0byB0cmFjZS4gSSYjMzk7bGwgaGVhZCBvdmVyIHRvIGBuZXQvY29yZS9zb2NrLmNgIC0gdGhhdCBzZWVtcyBsaWtlIHRoZSBtb3N0IGxvZ2ljYWwgcGxhY2UgdG8gYmVnaW4uIFdhaXQgYSBzZWNvbmQsIGFyZSBgc2tfc2V0c29ja29wdGAgYW5kIGBza19nZXRzb2Nrb3B0YCAqbm90KiBkZWNsYXJlZCBhcyBzdGF0aWM/IFRoYXQgdGhyb3dzIGEgc2xpZ2h0IHdyZW5jaCBpbnRvIG15IGltbWVkaWF0ZSBtZW50YWwgbW9kZWwuIEkmIzM5O2xsIG5lZWQgdG8gY29uZmlybSB0aGF0LiBPa2F5LCB0byBtYWtlIHN1cmUsIEkmIzM5O2xsIGRvdWJsZSBjaGVjayB0aGUgZGVjbGFyYXRpb25zLiBUaW1lIHRvIGNoZWNrIGBpbmNsdWRlL25ldC9zb2NrLmhgIG9yIHBvdGVudGlhbGx5IGBuZXQvY29yZS9zb2NrLmNgIHRvIHNlZSBob3cgdGhvc2UgYXJlIHNldCB1cC4gTmVlZCB0byBtYWtlIHN1cmUgSSBoYXZlIHRoZSBmdWxsIHBpY3R1cmUgYmVmb3JlIEkgc3RhcnQgZGlnZ2luZyBpbiEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7aW50IHNrX2dldHNvY2tvcHQmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9uZXQvc29jay5oPTE4OTQ9aW50IGRvX3NvY2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBib29sIGNvbXBhdCwgaW50IGxldmVsLFxuLS1cbmluY2x1ZGUvbmV0L3NvY2suaC0xODk2LVxuaW5jbHVkZS9uZXQvc29jay5oOjE4OTc6aW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuaW5jbHVkZS9uZXQvc29jay5oLTE4OTgtXHRcdCAgc29ja3B0cl90IG9wdHZhbCwgc29ja3B0cl90IG9wdGxlbik7XG4tLVxubmV0L2NvcmUvc29jay5jPTE3MzE9c3RhdGljIGludCBncm91cHNfdG9fdXNlcihzb2NrcHRyX3QgZHN0LCBjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqc3JjKVxuLS1cbm5ldC9jb3JlL3NvY2suYy0xNzQ2LS8qIEhhbmQgb3V0IGEgcGlkZmQgZm9yIEB0eXBlIG9mIHRoZSBzb2NrZXQmIzM5O3MgcGVlciB2aWEgU09fUEVFUlBJREZEKi4gKi9cbm5ldC9jb3JlL3NvY2suYzoxNzQ3OnN0YXRpYyBpbnQgc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHBpZF90eXBlIHR5cGUsXG5uZXQvY29yZS9zb2NrLmMtMTc0OC1cdFx0XHRcdCAgIHNvY2twdHJfdCBvcHR2YWwsIHNvY2twdHJfdCBvcHRsZW4sIGludCBsZW4pXG4tLVxubmV0L2NvcmUvc29jay5jLTE3ODktXG5uZXQvY29yZS9zb2NrLmM6MTc5MDppbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG5uZXQvY29yZS9zb2NrLmMtMTc5MS1cdFx0ICBzb2NrcHRyX3Qgb3B0dmFsLCBzb2NrcHRyX3Qgb3B0bGVuKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzc5NgoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYHNrX3NldHNvY2tvcHRgKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgZG93biB0byBpdC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGlucyBhbmQgb3V0cyBvZiBzb2NrZXQgb3B0aW9uIHNldHRpbmcgYXQgdGhlIGNvcmUgbGV2ZWwuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCBgc2tfc2V0c29ja29wdGAgd2l0aGluIGBuZXQvY29yZS9zb2NrLmNgLiBUaGF0JiMzOTtzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgdGhlIGZ1bmRhbWVudGFsIHNvY2tldCBvcHRpb24gbWFuYWdlbWVudCBsb2dpYywgdGhlIGhlYXJ0IG9mIGhvdyB0aGVzZSBvcHRpb25zIGdldCBoYW5kbGVkIGJlZm9yZSB0aGV5IHJpcHBsZSBvdXQgdG8gdGhlIGFwcHJvcHJpYXRlIHByb3RvY29sLXNwZWNpZmljIGhhbmRsZXJzLiBJJiMzOTttIGhvcGluZyB0byBzZWUgaG93IHRoZSBvcHRpb24gZGF0YSBpcyB2YWxpZGF0ZWQsIHdoZXJlIHRoZSBvcHRpb24gZ2V0cyBkaXNwYXRjaGVkIGJhc2VkIG9uIGl0cyBsZXZlbCBhbmQgbmFtZSwgYW5kLCBvZiBjb3Vyc2UsIGhvdyB0aGUga2VybmVsIGhhbmRsZXMgcG90ZW50aWFsIGVycm9ycy4gSSYjMzk7bGwgbmVlZCB0byBwYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBkYXRhIHN0cnVjdHVyZXMgaW52b2x2ZWQsIGxpa2UgYHNvY2tgIGl0c2VsZiBhbmQgYW55IGFzc29jaWF0ZWQgb3B0aW9uIHN0cnVjdHVyZXMsIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2Ygd2hhdCYjMzk7cyBoYXBwZW5pbmcuIE15IGdvYWwgaGVyZSBpcyB0byBlc3RhYmxpc2ggYSBzb2xpZCBncmFzcCBvZiB0aGlzIGNyaXRpY2FsIGFyZWEuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2ludCBza19zZXRzb2Nrb3B0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbmV0L3NvY2suaD0xODc2PXN0YXRpYyBpbmxpbmUgdm9pZCBza2Jfc2V0X293bmVyX2VkZW11eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2spXG4tLVxuaW5jbHVkZS9uZXQvc29jay5oLTE4ODctXG5pbmNsdWRlL25ldC9zb2NrLmg6MTg4ODppbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG5pbmNsdWRlL25ldC9zb2NrLmgtMTg4OS1cdFx0ICBzb2NrcHRyX3Qgb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTtcbi0tXG5uZXQvY29yZS9zb2NrLmM9MTE3OD1zdGF0aWMgaW50IHNvY2tvcHRfdmFsaWRhdGVfY2xvY2tpZChfX2tlcm5lbF9jbG9ja2lkX3QgdmFsdWUpXG4tLVxubmV0L2NvcmUvc29jay5jLTExOTMtXG5uZXQvY29yZS9zb2NrLmM6MTE5NDppbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG5uZXQvY29yZS9zb2NrLmMtMTE5NS1cdFx0ICBzb2NrcHRyX3Qgb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyODI4MwoJCQkJCQkJb3V0cHV0OiA0MgoJCQkJCQkJdGhvdWdodHM6IDcxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4YW1pbmluZyBVbml4IFNvY2tldCBDcmVkZW50aWFsIEhhbmRsaW5nKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGluLiBNeSBpbW1lZGlhdGUgdGhvdWdodCBpcyB0byB6ZXJvIGluIG9uIGBuZXQvdW5peC9hZl91bml4LmNgLiBUaGF0JiMzOTtzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgdGhlIGZ1bmN0aW9ucyBpbnZvbHZlZCBpbiBVbml4IGRvbWFpbiBzb2NrZXQgY3JlZGVudGlhbCBtYW5hZ2VtZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGJlZW4gY2hhbmdlZCBvciB3aGF0IG1pZ2h0IGJlIHJlbGV2YW50IHRvIG15IGFyZWEgb2YgZXhwZXJ0aXNlLgoKU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdHJhY2UgdGhlIHVzYWdlIG9mIGZ1bmN0aW9ucyBsaWtlIGBwcmVwYXJlX3BlZXJjcmVkYCwgYHVwZGF0ZV9wZWVyY3JlZGAsIGBjb3B5X3BlZXJjcmVkYCwgYW5kIGB1bml4X21heWJlX2FkZF9jcmVkc2AuIFVuZGVyc3RhbmRpbmcgdGhlIGNhbGwgZ3JhcGggZm9yIHRoZXNlIHdpbGwgZ2l2ZSBtZSBhIHNvbGlkIGdyYXNwIG9uIGhvdyBjcmVkZW50aWFscyBhcmUgaGFuZGxlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgVW5peCBzb2NrZXRzIGFuZCBhbnkgcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyBvciBpbXByb3ZlbWVudHMgaW4gdGhlIHJlY2VudCBjb2RlIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3ByZXBhcmVfcGVlcmNyZWR8dW5peF9tYXliZV9hZGRfY3JlZHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3VuaXgvYWZfdW5peC5jPTczOT1zdHJ1Y3QgdW5peF9wZWVyY3JlZCB7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTc0My1cbm5ldC91bml4L2FmX3VuaXguYzo3NDQ6c3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9wZWVyY3JlZChzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpXG5uZXQvdW5peC9hZl91bml4LmMtNzQ1LXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9ODA1PXN0YXRpYyBpbnQgdW5peF9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTgxNy1cdFx0Z290byBvdXQ7XHQvKiBObyBsaXN0ZW5zIG9uIGFuIHVuYm91bmQgc29ja2V0ICovXG5uZXQvdW5peC9hZl91bml4LmM6ODE4Olx0ZXJyID0gcHJlcGFyZV9wZWVyY3JlZChcdTAwMjZwZWVyY3JlZCk7XG5uZXQvdW5peC9hZl91bml4LmMtODE5LVx0aWYgKGVycilcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MTYzMT1zdGF0aWMgaW50IHVuaXhfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKnVhZGRyLFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0xNjU5LVxubmV0L3VuaXgvYWZfdW5peC5jOjE2NjA6XHRlcnIgPSBwcmVwYXJlX3BlZXJjcmVkKFx1MDAyNnBlZXJjcmVkKTtcbm5ldC91bml4L2FmX3VuaXguYy0xNjYxLVx0aWYgKGVycilcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MTgxMT1zdGF0aWMgaW50IHVuaXhfc29ja2V0cGFpcihzdHJ1Y3Qgc29ja2V0ICpzb2NrYSwgc3RydWN0IHNvY2tldCAqc29ja2IpXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTE4MTYtXG5uZXQvdW5peC9hZl91bml4LmM6MTgxNzpcdGVyciA9IHByZXBhcmVfcGVlcmNyZWQoXHUwMDI2c2thX3BlZXJjcmVkKTtcbm5ldC91bml4L2FmX3VuaXguYy0xODE4LVx0aWYgKGVycilcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMTgyMC1cbm5ldC91bml4L2FmX3VuaXguYzoxODIxOlx0ZXJyID0gcHJlcGFyZV9wZWVyY3JlZChcdTAwMjZza2JfcGVlcmNyZWQpO1xubmV0L3VuaXgvYWZfdW5peC5jLTE4MjItXHRpZiAoZXJyKSB7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTIwMDM9c3RhdGljIHZvaWQgdW5peF9za2JfdG9fc2NtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY21fY29va2llICpzY20pXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTIwMTItLyoqXG5uZXQvdW5peC9hZl91bml4LmM6MjAxMzogKiB1bml4X21heWJlX2FkZF9jcmVkcygpIC0gQWRkcyBjdXJyZW50IHRhc2sgdWlkL2dpZCBhbmQgc3RydWN0IHBpZCB0byBza2IgaWYgbmVlZGVkLlxubmV0L3VuaXgvYWZfdW5peC5jLTIwMTQtICogQHNrYjogc2tiIHRvIGF0dGFjaCBjcmVkcyB0by5cbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMjAyNC0gKi9cbm5ldC91bml4L2FmX3VuaXguYzoyMDI1OnN0YXRpYyBpbnQgdW5peF9tYXliZV9hZGRfY3JlZHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxubmV0L3VuaXgvYWZfdW5peC5jLTIwMjYtXHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29jayAqb3RoZXIpXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTIwOTU9c3RhdGljIGludCB1bml4X2RncmFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0yMTg5LVxubmV0L3VuaXgvYWZfdW5peC5jOjIxOTA6XHRlcnIgPSB1bml4X21heWJlX2FkZF9jcmVkcyhza2IsIHNrLCBvdGhlcik7XG5uZXQvdW5peC9hZl91bml4LmMtMjE5MS1cdGlmIChlcnIpXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTIzMjk9c3RhdGljIGludCBxdWV1ZV9vb2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpvdGhlcixcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMjM0NC1cbm5ldC91bml4L2FmX3VuaXguYzoyMzQ1Olx0ZXJyID0gdW5peF9tYXliZV9hZGRfY3JlZHMoc2tiLCBzaywgb3RoZXIpO1xubmV0L3VuaXgvYWZfdW5peC5jLTIzNDYtXHRpZiAoZXJyKVxuLS1cbm5ldC91bml4L2FmX3VuaXguYz0yMzg5PXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTI0NjItXG5uZXQvdW5peC9hZl91bml4LmM6MjQ2MzpcdFx0ZXJyID0gdW5peF9tYXliZV9hZGRfY3JlZHMoc2tiLCBzaywgb3RoZXIpO1xubmV0L3VuaXgvYWZfdW5peC5jLTI0NjQtXHRcdGlmIChlcnIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI5NTk0CgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMjEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcy4gSGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBhcyBpZiB0aGV5JiMzOTtyZSBteSBvd246CgoqKkFuYWx5emluZyBgbmV0L3VuaXgvYWZfdW5peC5jYCBmb3IgTm9uLVN0YXRpYyBGdW5jdGlvbnMqKgoKUmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgYG5ldC91bml4L2FmX3VuaXguY2AuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHplcm8gaW4gb24gdGhlICpub24tc3RhdGljKiBmdW5jdGlvbnMgd2l0aGluIHRoYXQgZmlsZS4gSSBrbm93IHRoZSBzdGF0aWMgb25lcyBhcmUgbGlrZWx5IGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMsIHNjb3BlZCBvbmx5IHRvIHRoYXQgY29tcGlsYXRpb24gdW5pdCwgYnV0IHRoZSBub24tc3RhdGljIG9uZXPigKYgKnRob3NlKiBhcmUgdGhlIGludGVyZmFjZSBwb2ludHMuIFRob3NlIGFyZSB0aGUgZnVuY3Rpb25zIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbCwgb3IgcG9zc2libHkgZXZlbiB1c2VyIHNwYWNlLCBtaWdodCBiZSBjYWxsaW5nIGludG8uIFRoYXQmIzM5O3Mgd2hlcmUgdGhlIGludGVyZXN0aW5nIHN0dWZmIHVzdWFsbHkgbGl2ZXMsIHRoZSBzdHVmZiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiBJIHdhbnQgdG8gZ3Jhc3AgdGhlIGJpZ2dlciBwaWN0dXJlIG9mIGhvdyBVbml4IGRvbWFpbiBzb2NrZXRzIGFyZSBpbXBsZW1lbnRlZCB3aXRoaW4gdGhlIGtlcm5lbC4gSSYjMzk7bGwgbmVlZCB0byBzZWUgaG93IHRoZSBzb2NrZXQgY3JlYXRpb24sIGNvbm5lY3Rpb24gaGFuZGxpbmcsIGRhdGEgdHJhbnNmZXIsIGFuZCBjbGVhbnVwIGFyZSBleHBvc2VkLiBJdOKAmXMgYWxsIGFib3V0IHRyYWNpbmcgdGhlIGVudHJ5IHBvaW50cyBhbmQgdGhlIGNvbW11bmljYXRpb24gZmxvdy4gU28sIGxldCYjMzk7cyBzdGFydCB3aXRoIGEgdGhvcm91Z2ggc2NhbiBvZiB0aGF0IGZpbGUuIExldCYjMzk7cyBzZWUgd2hhdCB3ZSYjMzk7dmUgZ290LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+RXJyb3I6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5ubyBtYXRjaGVzPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O15pbnQgdW5peF98XnZvaWQgdW5peF8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyOTkxMAoJCQkJCQkJb3V0cHV0OiAzMwoJCQkJCQkJdGhvdWdodHM6IDIxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKkFuYWx5emluZyB0aGUgVW5peCBEb21haW4gU29ja2V0IEltcGxlbWVudGF0aW9uKioKCk9rYXksIHRpbWUgdG8gZGl2ZSBpbnRvIHRoZSBuaXR0eS1ncml0dHkuIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIGludGVybmFscyBvZiB0aGUgVW5peCBkb21haW4gc29ja2V0IGltcGxlbWVudGF0aW9uLCBhbmQgc3BlY2lmaWNhbGx5LCBJJiMzOTttIGludGVyZXN0ZWQgaW4gYW55IGZ1bmN0aW9ucyB0aGF0IGFyZW4mIzM5O3QgZGVjbGFyZWQgYXMgYHN0YXRpY2AuIEkmIzM5O20gaGVhZGluZyBzdHJhaWdodCBmb3IgYG5ldC91bml4L2FmX3VuaXguY2AuIFdoeT8gQmVjYXVzZSB0aGF0JiMzOTtzIHdoZXJlIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHkgZm9yIHRoaXMgc3R1ZmYgdHlwaWNhbGx5IHJlc2lkZXMuIE15IGd1dCB0ZWxscyBtZSB0aGlzIHdpbGwgYmUgdGhlIGhlYXJ0IG9mIGl0LCBidXQgSSBjb3VsZCBiZSB3cm9uZywgb2YgY291cnNlLiBNeSBleHBlcmllbmNlIHNheXMgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gc3RhcnQgaHVudGluZyBmb3IgZW50cnkgcG9pbnRzIGFuZCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUga2VybmVsJiMzOTtzIG5ldHdvcmtpbmcgc3RhY2suIFRoZSBhYnNlbmNlIG9mIGBzdGF0aWNgIGlzIGEgcXVpY2sgdGVsbCwgaW5kaWNhdGluZyBmdW5jdGlvbnMgbGlrZWx5IGV4cG9zZWQgZm9yIHVzZSBlbHNld2hlcmUgaW4gdGhlIGtlcm5lbCBvciBwZXJoYXBzIGV2ZW4gdG8gdXNlci1zcGFjZSB0aHJvdWdoIHNvbWUgY2xldmVyIHRyaWNrZXJ5LiBMZXQmIzM5O3Mgc2VlIHdoYXQgd2UgY2FuIGRpZyB1cC4gVGhpcyBzaG91bGQgdGVsbCBtZSBhIGxvdCBhYm91dCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBob3cgdGhpbmdzIGFyZSBtZWFudCB0byBmbG93LiBJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIHRoZSBrZXkgZnVuY3Rpb25zIGZvciBzb2NrZXQgY3JlYXRpb24sIGNvbm5lY3Rpb24gaGFuZGxpbmcsIGRhdGEgdHJhbnNmZXIsIGFuZCBjbGVhbnVwLCBhbmQgdGhlc2UgZnVuY3Rpb25zIHdpbGwgb2ZmZXIga2V5IGluc2lnaHRzIGZvciBteSBhbmFseXNpcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7XkVYUE9SVF9TWU1CT0wmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3VuaXgvYWZfdW5peC5jPTI5Mz1zdHJ1Y3Qgc29jayAqdW5peF9wZWVyX2dldChzdHJ1Y3Qgc29jayAqcylcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMzAzLX1cbm5ldC91bml4L2FmX3VuaXguYzozMDQ6RVhQT1JUX1NZTUJPTF9HUEwodW5peF9wZWVyX2dldCk7XG5uZXQvdW5peC9hZl91bml4LmMtMzA1LVxuLS1cbm5ldC91bml4L2FmX3VuaXguYz0zMjU0PWxvbmcgdW5peF9pbnFfbGVuKHN0cnVjdCBzb2NrICpzaylcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMzI3Ny19XG5uZXQvdW5peC9hZl91bml4LmM6MzI3ODpFWFBPUlRfU1lNQk9MX0dQTCh1bml4X2lucV9sZW4pO1xubmV0L3VuaXgvYWZfdW5peC5jLTMyNzktXG5uZXQvdW5peC9hZl91bml4LmM9MzI4MD1sb25nIHVuaXhfb3V0cV9sZW4oc3RydWN0IHNvY2sgKnNrKVxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0zMjgzLX1cbm5ldC91bml4L2FmX3VuaXguYzozMjg0OkVYUE9SVF9TWU1CT0xfR1BMKHVuaXhfb3V0cV9sZW4pO1xubmV0L3VuaXgvYWZfdW5peC5jLTMyODUtXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjMzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMwNDkzCgkJCQkJCQlvdXRwdXQ6IDIyCgkJCQkJCQl0aG91Z2h0czogMzIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEluaXRpYWwgVGhvdWdodHMgb24gU29ja2V0IFNlY3VyaXR5KioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gZ2V0IGEgaGFuZGxlIG9uIGhvdyBwcm9jZXNzIElEcyBhcmUgbWFuYWdlZCwgcGFydGljdWxhcmx5IGFzIHRoZXkgcmVsYXRlIHRvIHNvY2tldCBzZWN1cml0eS4gTXkgbWluZCBpcyBpbW1lZGlhdGVseSBkcmF3biB0byBgYWZfdW5peC5jYC4gVGhhdCYjMzk7cyB3aGVyZSBJIGtub3cgdGhlIFVOSVggc29ja2V0IGZhbWlseSBpcyBkZWZpbmVkLiBTcGVjaWZpY2FsbHksIHRoZSBgcHJvdG9fb3BzYCBzdHJ1Y3R1cmVzIGxpa2UgYHVuaXhfc3RyZWFtX29wc2AsIGB1bml4X2RncmFtX29wc2AsIGFuZCBgdW5peF9zZXFwYWNrZXRfb3BzYCBhcmUgdGhlIGtleSBlbnRyeSBwb2ludHMgSSBuZWVkIHRvIGV4YW1pbmUgZm9yIGhvdyB0aGV5IGhhbmRsZSBVTklYIHNvY2tldHMuCgpJIG5lZWQgdG8gcXVpY2tseSByZWNhbGwgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHNvY2tldCBvcHRpb24gc2V0dGluZy9nZXR0aW5nIGFuZCBhbmNpbGxhcnkgZGF0YS4gSSByZW1lbWJlciB0aGUgY3JpdGljYWwgZW50cnkgcG9pbnRzOiBgc2tfc2V0c29ja29wdGAsIGBza19nZXRzb2Nrb3B0YCwgYHNjbV9yZWN2X3VuaXhgLCBgX19zY21fc2VuZGAsIGFzIHdlbGwgYXMgYHBpZGZzX2NvcmVkdW1wYCBhbmQgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AgYXJlIHRoZSBpbml0aWFsIGFyZWFzIHRvIHRhcmdldC4KCk5vdywgbGV0JiMzOTtzIHN3aXRjaCBnZWFycyBhbmQgaW52ZXN0aWdhdGUgdGhlIEJsdWV0b290aCBpbXBsZW1lbnRhdGlvbi4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aG9zZSByZWNlbnQgY2hhbmdlcywgYW5kIEkgcmVtZW1iZXIgYHNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdYCBnZXR0aW5nIHRvdWNoZWQgaW4gdGhlIEJsdWV0b290aCBjb2RlLiBMb29raW5nIGF0IGBuZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jYCwgSSBzZWUgYGJ0X3NvY2tfYWxsb2NgIGFuZCBgYnRfYWNjZXB0X2VucXVldWVgIHNwZWNpZmljYWxseSB0b3VjaGluZyB0aGF0IGZpZWxkLiAgSSYjMzk7bGwgYWxzbyBuZWVkIHRvIGNoZWNrIGBuZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNgIGFuZCBgbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmNgIHNpbmNlIEkmIzM5O3ZlIGdvdCBhIGZlZWxpbmcgc29tZXRoaW5nJiMzOTtzIGx1cmtpbmcgdGhlcmUgYXMgd2VsbC4gTG9va3MgbGlrZSBgaGNpX3NvY2tfY29weV9jcmVkc2AgYW5kIGBsMmNhcF9zb2NrX2dldF9wZWVyX3BpZF9jYmAgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIHVwZGF0ZXMuCgpGaW5hbGx5LCBJIG5lZWQgdG8gcmVtaW5kIG15c2VsZiBvZiB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zLiBPYnZpb3VzbHksIGBDT05GSUdfVU5JWGAgY29udHJvbHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBBRl9VTklYIHNvY2tldHMuIFRoZW4sIGBDT05GSUdfQ09SRURVTVBgIHNlZW1zIHRvIGJlIHJlbGV2YW50LiBUaW1lIHRvIHNlZSBpZiB0aGUgYHBpZGZzYCBmZWF0dXJlcyBvciBhbnkgb3RoZXIgY2FwYWJpbGl0aWVzIGFyZSBjb250cm9sbGVkIGJ5IEtjb25maWcgb3B0aW9ucy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJIHVuZGVyc3RhbmQgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIGxhbmRzY2FwZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Q09ORklHX1BJRF9GU3xQSURGUyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9maGFuZGxlLmM9MTcwPXN0YXRpYyBpbnQgZ2V0X3BhdGhfYW5jaG9yKGludCBmZCwgc3RydWN0IHBhdGggKnJvb3QpXG4tLVxuZnMvZmhhbmRsZS5jLTE4NS1cbmZzL2ZoYW5kbGUuYzoxODY6XHRpZiAoZmQgPT0gRkRfUElERlNfUk9PVCkge1xuZnMvZmhhbmRsZS5jLTE4Ny1cdFx0cGlkZnNfZ2V0X3Jvb3Qocm9vdCk7XG4tLVxuZnMvcGlkZnMuYy0zNC1cbmZzL3BpZGZzLmM6MzU6I2RlZmluZSBQSURGU19QSURfREVBRCBFUlJfUFRSKC1FU1JDSClcbmZzL3BpZGZzLmMtMzYtXG4tLVxuZnMvcGlkZnMuYz00OT1lbnVtIHBpZGZzX2F0dHJfbWFza19iaXRzIHtcbmZzL3BpZGZzLmM6NTA6XHRQSURGU19BVFRSX0JJVF9FWElUXHQ9IDAsXG5mcy9waWRmcy5jOjUxOlx0UElERlNfQVRUUl9CSVRfQ09SRURVTVBcdD0gMSxcbmZzL3BpZGZzLmMtNTItfTtcbi0tXG5mcy9waWRmcy5jPTM2NT1zdGF0aWMgbG9uZyBwaWRmZF9pbmZvKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcbi0tXG5mcy9waWRmcy5jLTM5NS1cdGlmIChtYXNrIFx1MDAyNiBQSURGRF9JTkZPX0VYSVQpIHtcbmZzL3BpZGZzLmM6Mzk2Olx0XHRpZiAodGVzdF9iaXQoUElERlNfQVRUUl9CSVRfRVhJVCwgXHUwMDI2YXR0ci1cdTAwM2VhdHRyX21hc2spKSB7XG5mcy9waWRmcy5jLTM5Ny1cdFx0XHRzbXBfcm1iKCk7XG4tLVxuZnMvcGlkZnMuYy00MDctXHRpZiAobWFzayBcdTAwMjYgUElERkRfSU5GT19DT1JFRFVNUCkge1xuZnMvcGlkZnMuYzo0MDg6XHRcdGlmICh0ZXN0X2JpdChQSURGU19BVFRSX0JJVF9DT1JFRFVNUCwgXHUwMDI2YXR0ci1cdTAwM2VhdHRyX21hc2spKSB7XG5mcy9waWRmcy5jLTQwOS1cdFx0XHRzbXBfcm1iKCk7XG4tLVxuZnMvcGlkZnMuYz03NDk9dm9pZCBwaWRmc19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuLS1cbmZzL3BpZGZzLmMtNzY4LVx0XHRcdCAqL1xuZnMvcGlkZnMuYzo3Njk6XHRcdFx0cGlkLVx1MDAzZWF0dHIgPSBQSURGU19QSURfREVBRDtcbmZzL3BpZGZzLmMtNzcwLVx0XHRcdHJldHVybjtcbi0tXG5mcy9waWRmcy5jLTc5MS1cdHNtcF93bWIoKTtcbmZzL3BpZGZzLmM6NzkyOlx0c2V0X2JpdChQSURGU19BVFRSX0JJVF9FWElULCBcdTAwMjZhdHRyLVx1MDAzZWF0dHJfbWFzayk7XG5mcy9waWRmcy5jLTc5My19XG4tLVxuZnMvcGlkZnMuYz03OTY9c3RhdGljIHZvaWQgcGlkZnNfY29yZWR1bXBfcGlkKHN0cnVjdCBwaWQgKnBpZCxcbi0tXG5mcy9waWRmcy5jLTgwMy1cdFZGU19XQVJOX09OX09OQ0UoIWF0dHIpO1xuZnMvcGlkZnMuYzo4MDQ6XHRWRlNfV0FSTl9PTl9PTkNFKGF0dHIgPT0gUElERlNfUElEX0RFQUQpO1xuZnMvcGlkZnMuYy04MDUtXG4tLVxuZnMvcGlkZnMuYy04MTQtXHRzbXBfd21iKCk7XG5mcy9waWRmcy5jOjgxNTpcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKTtcbmZzL3BpZGZzLmMtODE2LX1cbi0tXG5mcy9waWRmcy5jPTkwND1zdGF0aWMgc3RydWN0IHBpZCAqcGlkZnNfaW5vX2dldF9waWQodTY0IGlubylcbi0tXG5mcy9waWRmcy5jLTkxNS1cdFx0cmV0dXJuIE5VTEw7XG5mcy9waWRmcy5jOjkxNjpcdGlmICh0ZXN0X2JpdChQSURGU19BVFRSX0JJVF9FWElULCBcdTAwMjZhdHRyLVx1MDAzZWF0dHJfbWFzaykpXG5mcy9waWRmcy5jLTkxNy1cdFx0cmV0dXJuIE5VTEw7XG4tLVxuZnMvcGlkZnMuYz0xMDQ1PWludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKVxuLS1cbmZzL3BpZGZzLmMtMTA1NS1cdGF0dHIgPSBSRUFEX09OQ0UocGlkLVx1MDAzZWF0dHIpO1xuZnMvcGlkZnMuYzoxMDU2Olx0aWYgKHVubGlrZWx5KGF0dHIgPT0gUElERlNfUElEX0RFQUQpKVxuZnMvcGlkZnMuYzoxMDU3Olx0XHRyZXR1cm4gUFRSX0VSUihQSURGU19QSURfREVBRCk7XG5mcy9waWRmcy5jLTEwNTgtXHRpZiAoYXR0cilcbi0tXG5mcy9waWRmcy5jLTEwNzAtXHRhdHRyID0gcGlkLVx1MDAzZWF0dHI7XG5mcy9waWRmcy5jOjEwNzE6XHRpZiAodW5saWtlbHkoYXR0ciA9PSBQSURGU19QSURfREVBRCkpXG5mcy9waWRmcy5jOjEwNzI6XHRcdHJldHVybiBQVFJfRVJSKFBJREZTX1BJRF9ERUFEKTtcbmZzL3BpZGZzLmMtMTA3My1cdGlmICh1bmxpa2VseShhdHRyKSlcbi0tXG5pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaD04OD1zdHJ1Y3QgZGVsZWdhdGlvbiB7XG4tLVxuaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmgtMTI0LVxuaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmg6MTI1OiNkZWZpbmUgRkRfUElERlNfUk9PVFx0XHRcdC0xMDAwMiAvKiBSb290IG9mIHRoZSBwaWRmcyBmaWxlc3lzdGVtICovXG5pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaC0xMjYtI2RlZmluZSBGRF9OU0ZTX1JPT1RcdFx0XHQtMTAwMDMgLyogUm9vdCBvZiB0aGUgbnNmcyBmaWxlc3lzdGVtICovXG4tLVxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg9NjE9c3RydWN0IHBpZGZkX2luZm8ge1xuLS1cbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oLTEwOS1cbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjExMDojZGVmaW5lIFBJREZTX0lPQ1RMX01BR0lDIDB4RkZcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oLTExMS1cbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjExMjojZGVmaW5lIFBJREZEX0dFVF9DR1JPVVBfTkFNRVNQQUNFICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxKVxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTEzOiNkZWZpbmUgUElERkRfR0VUX0lQQ19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDIpXG5pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaDoxMTQ6I2RlZmluZSBQSURGRF9HRVRfTU5UX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMylcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjExNTojZGVmaW5lIFBJREZEX0dFVF9ORVRfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCA0KVxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE2OiNkZWZpbmUgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDUpXG5pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaDoxMTc6I2RlZmluZSBQSURGRF9HRVRfUElEX0ZPUl9DSElMRFJFTl9OQU1FU1BBQ0UgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgNilcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjExODojZGVmaW5lIFBJREZEX0dFVF9USU1FX05BTUVTUEFDRSAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCA3KVxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE5OiNkZWZpbmUgUElERkRfR0VUX1RJTUVfRk9SX0NISUxEUkVOX05BTUVTUEFDRSBfSU8oUElERlNfSU9DVExfTUFHSUMsIDgpXG5pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaDoxMjA6I2RlZmluZSBQSURGRF9HRVRfVVNFUl9OQU1FU1BBQ0UgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgOSlcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjEyMTojZGVmaW5lIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMClcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjEyMjojZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbylcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oLTEyMy1cbi0tXG50b29scy9wZXJmL3RyYWNlL2JlYXV0eS9pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaD04OD1zdHJ1Y3QgZGVsZWdhdGlvbiB7XG4tLVxudG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmgtMTI0LVxudG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmg6MTI1OiNkZWZpbmUgRkRfUElERlNfUk9PVFx0XHRcdC0xMDAwMiAvKiBSb290IG9mIHRoZSBwaWRmcyBmaWxlc3lzdGVtICovXG50b29scy9wZXJmL3RyYWNlL2JlYXV0eS9pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaC0xMjYtI2RlZmluZSBGRF9OU0ZTX1JPT1RcdFx0XHQtMTAwMDMgLyogUm9vdCBvZiB0aGUgbnNmcyBmaWxlc3lzdGVtICovXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZmFpbGZzL2ZhaWxmc190ZXN0LmMtMjYtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYzoyNzojaWZuZGVmIEZEX1BJREZTX1JPT1RcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jOjI4OiNkZWZpbmUgRkRfUElERlNfUk9PVCAtMTAwMDJcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jLTI5LSNlbmRpZlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jPTE0Mj1URVNUKGZjaGRpcl9yZWplY3RzX290aGVyX3NlbnRpbmVscylcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jLTE0My17XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYzoxNDQ6XHRBU1NFUlRfRVEoZmNoZGlyKEZEX1BJREZTX1JPT1QpLCAtMSk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYy0xNDUtXHRBU1NFUlRfRVEoZXJybm8sIEVCQURGKTtcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYz0xNjY9VEVTVChmY2hyb290X2JhZF9mZClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYy0xNzEtXHQvKiBPbmx5IEZEX0ZBSUxGU19ST09UIGlzIGEgdmFsaWQgc2VudGluZWwuICovXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYzoxNzI6XHRBU1NFUlRfRVEoc3lzX2ZjaHJvb3QoRkRfUElERlNfUk9PVCwgMCksIC0xKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jLTE3My1cdEFTU0VSVF9FUShlcnJubywgRUJBREYpO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMzAtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjMxOiNpZm5kZWYgRkRfUElERlNfUk9PVFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaDozMjojZGVmaW5lIEZEX1BJREZTX1JPT1QgLTEwMDAyXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTMzLSNlbmRpZlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtODItXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjgzOiNpZm5kZWYgUElERlNfSU9DVExfTUFHSUNcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6ODQ6I2RlZmluZSBQSURGU19JT0NUTF9NQUdJQyAweEZGXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTg1LSNlbmRpZlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtODctI2lmbmRlZiBQSURGRF9HRVRfQ0dST1VQX05BTUVTUEFDRVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaDo4ODojZGVmaW5lIFBJREZEX0dFVF9DR1JPVVBfTkFNRVNQQUNFICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxKVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC04OS0jZW5kaWZcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTkxLSNpZm5kZWYgUElERkRfR0VUX0lQQ19OQU1FU1BBQ0VcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6OTI6I2RlZmluZSBQSURGRF9HRVRfSVBDX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMilcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtOTMtI2VuZGlmXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC05NS0jaWZuZGVmIFBJREZEX0dFVF9NTlRfTkFNRVNQQUNFXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjk2OiNkZWZpbmUgUElERkRfR0VUX01OVF9OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDMpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTk3LSNlbmRpZlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtOTktI2lmbmRlZiBQSURGRF9HRVRfTkVUX05BTUVTUEFDRVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaDoxMDA6I2RlZmluZSBQSURGRF9HRVRfTkVUX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgNClcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTAxLSNlbmRpZlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTAzLSNpZm5kZWYgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0VcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTA0OiNkZWZpbmUgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDUpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTEwNS0jZW5kaWZcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTEwNy0jaWZuZGVmIFBJREZEX0dFVF9QSURfRk9SX0NISUxEUkVOX05BTUVTUEFDRVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaDoxMDg6I2RlZmluZSBQSURGRF9HRVRfUElEX0ZPUl9DSElMRFJFTl9OQU1FU1BBQ0UgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgNilcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTA5LSNlbmRpZlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTExLSNpZm5kZWYgUElERkRfR0VUX1RJTUVfTkFNRVNQQUNFXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjExMjojZGVmaW5lIFBJREZEX0dFVF9USU1FX05BTUVTUEFDRSAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCA3KVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMTMtI2VuZGlmXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMTUtI2lmbmRlZiBQSURGRF9HRVRfVElNRV9GT1JfQ0hJTERSRU5fTkFNRVNQQUNFXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjExNjojZGVmaW5lIFBJREZEX0dFVF9USU1FX0ZPUl9DSElMRFJFTl9OQU1FU1BBQ0UgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCA4KVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMTctI2VuZGlmXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMTktI2lmbmRlZiBQSURGRF9HRVRfVVNFUl9OQU1FU1BBQ0VcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTIwOiNkZWZpbmUgUElERkRfR0VUX1VTRVJfTkFNRVNQQUNFICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDkpXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTEyMS0jZW5kaWZcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTEyMy0jaWZuZGVmIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjEyNDojZGVmaW5lIFBJREZEX0dFVF9VVFNfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAxMClcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTI1LSNlbmRpZlxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTI3LSNpZm5kZWYgUElERkRfR0VUX0lORk9cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTI4OiNkZWZpbmUgUElERkRfR0VUX0lORk9cdFx0XHQgICAgICBfSU9XUihQSURGU19JT0NUTF9NQUdJQywgMTEsIHN0cnVjdCBwaWRmZF9pbmZvKVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMjktI2VuZGlmXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmRfZmlsZV9oYW5kbGVfdGVzdC5jPTUwNz1URVNUX0YoZmlsZV9oYW5kbGUsIGRlY29kZV9wdXJlbHlfYmFzZWRfb25fZmlsZV9oYW5kbGUpXG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmRfZmlsZV9oYW5kbGVfdGVzdC5jLTUyMi1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkX2ZpbGVfaGFuZGxlX3Rlc3QuYzo1MjM6XHRwaWRmZCA9IG9wZW5fYnlfaGFuZGxlX2F0KEZEX1BJREZTX1JPT1QsIGZoLCAwKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkX2ZpbGVfaGFuZGxlX3Rlc3QuYy01MjQtXHRBU1NFUlRfR0UocGlkZmQsIDApO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkX2ZpbGVfaGFuZGxlX3Rlc3QuYy01MzAtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZF9maWxlX2hhbmRsZV90ZXN0LmM6NTMxOlx0cGlkZmQgPSBvcGVuX2J5X2hhbmRsZV9hdChGRF9QSURGU19ST09ULCBmaCwgT19DTE9FWEVDKTtcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkX2ZpbGVfaGFuZGxlX3Rlc3QuYy01MzItXHRBU1NFUlRfR0UocGlkZmQsIDApO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkX2ZpbGVfaGFuZGxlX3Rlc3QuYy01MzgtXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZF9maWxlX2hhbmRsZV90ZXN0LmM6NTM5Olx0cGlkZmQgPSBvcGVuX2J5X2hhbmRsZV9hdChGRF9QSURGU19ST09ULCBmaCwgT19OT05CTE9DSyk7XG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZF9maWxlX2hhbmRsZV90ZXN0LmMtNTQwLVx0QVNTRVJUX0dFKHBpZGZkLCAwKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzUzNjkKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6CgoqKkludmVzdGlnYXRpbmcgdGhlIEJ1aWxkIFByb2Nlc3MgZm9yIGBwaWRmc2AqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGBwaWRmc2AgaXMgYWN0dWFsbHkgYnVpbHQgd2l0aGluIHRoaXMga2VybmVsIG9yIGZpbGUgc3lzdGVtIGNvbnRleHQuIFRoZSBvYnZpb3VzIGZpcnN0IHBsYWNlIHRvIGNoZWNrIGlzIHRoZSBgTWFrZWZpbGVgIGluIHRoZSBgZnNgIGRpcmVjdG9yeS4gVGhhdCYjMzk7cyB0aGUgZ28tdG8gZm9yIGJ1aWxkIGluc3RydWN0aW9ucyB3aXRoaW4gYSBmaWxlIHN5c3RlbSBjb21wb25lbnQuIElmIGl0JiMzOTtzIG5vdCBkZWZpbmVkIHRoZXJlLCBvciBpZiB0aGVyZSYjMzk7cyBzb21lIGNvbmRpdGlvbmFsIGxvZ2ljIGludm9sdmVkLCBJJiMzOTtsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSBgS2NvbmZpZ2AgZmlsZSB3aXRoaW4gYGZzYCBhcyB3ZWxsLiBUaGF0JiMzOTtzIHdoZXJlIGFsbCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBkZWNsYXJlZCwgYW5kIHRoYXQmIzM5O3MgbGlrZWx5IHdoZXJlIHRoZSBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIG9mIGBwaWRmc2AgaXMgZ292ZXJuZWQuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgbGlrZSBgQ09ORklHX1BJREZTPXlgIG9yIHNvbWV0aGluZyBzaW1pbGFyLCBhbmQgdGhlbiB0cmFjZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoYXQgc2V0dGluZy4gTGV0JiMzOTtzIHN0YXJ0IHdpdGggdGhvc2UgdHdvIGZpbGVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtwaWRmc1xcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtmcyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9NYWtlZmlsZT0xMD1vYmoteSA6PVx0b3Blbi5vIHJlYWRfd3JpdGUubyBmaWxlX3RhYmxlLm8gc3VwZXIubyBcXFxuLS1cbmZzL01ha2VmaWxlLTE3LVx0XHRmc19kaXJlbnQubyBmc19jb250ZXh0Lm8gZnNfcGFyc2VyLm8gZnNvcGVuLm8gaW5pdC5vIFxcXG5mcy9NYWtlZmlsZToxODpcdFx0a2VybmVsX3JlYWRfZmlsZS5vIG1udF9pZG1hcHBpbmcubyByZW1hcF9yYW5nZS5vIHBpZGZzLm8gXFxcbmZzL01ha2VmaWxlLTE5LVx0XHRmaWxlX2F0dHIubyBmc2Vycm9yLm8gbnVsbGZzLm8gZmFpbGZzLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzU3NDQKCQkJCQkJCW91dHB1dDogMjUKCQkJCQkJCXRob3VnaHRzOiA0NgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIFBvdGVudGlhbCBEZXBlbmRlbmNpZXMqKgoKQWxyaWdodCwgc28gYHBpZGZzLm9gIGlzIGNsZWFybHkgcGFydCBvZiB0aGUgZmlsZXN5c3RlbSBzdWJzeXN0ZW0sIGFuZCB0aGUgTWFrZWZpbGUgaW4gYGZzL2AgZXhwbGljaXRseSBkZWNsYXJlcyBpdCB3aXRoIGBvYmoteWAuIFRoYXQgZ2l2ZXMgbWUgYSBzdGFydGluZyBwb2ludC4gTm93LCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIGl0cyBvdmVyYWxsIHJvbGUgYW5kIGFueSBwb3NzaWJsZSBjb25uZWN0aW9ucyB0byBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLCBJIG5lZWQgdG8gZG8gYSBiaXQgb2Ygc2xldXRoaW5nLiBHaXZlbiB0aGUgbmF0dXJlIG9mIFBJRCBmaWxlIHN5c3RlbXMsIEkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIG91dCBgbmV0L3VuaXgvTWFrZWZpbGVgLCBgbmV0L2NvcmUvTWFrZWZpbGVgIGFuZCBgZnMvY29yZWR1bXAuY2AgdG8gbG9vayBmb3Igc2hhcmVkIHJlc291cmNlcyBvciBkZXBlbmRlbmNpZXMuIEl0IG1ha2VzIHNlbnNlIHRvIHN0YXJ0IHdpdGggdGhlc2UgZmlsZXMsIHRoZXkmIzM5O3JlIGxpa2VseSBjYW5kaWRhdGVzLCBhbmQgdGhpcyB3aWxsIHRlbGwgbWUgaWYgdGhlIG1vZHVsZSBpcyB0aWVkIGludG8gdGhlIG5ldHdvcmsgc3RhY2sgb3IgcmVsYXRlZCBjb3JlIGR1bXBpbmcuIFRoaXMgZ2l2ZXMgbWUgbXkgbmV4dCBsb2dpY2FsIHN0ZXBzIGluIHVuZGVyc3RhbmRpbmcgdGhpcyBtb2R1bGUmIzM5O3MgcGxhY2UgaW4gdGhlIGJyb2FkZXIga2VybmVsIGFyY2hpdGVjdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNi8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29yZWR1bXBcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvTWFrZWZpbGU9NDY9b2JqLSQoQ09ORklHX05GU19DT01NT04pXHQmIzQzOz0gbmZzX2NvbW1vbi9cbmZzL01ha2VmaWxlOjQ3Om9iai0kKENPTkZJR19DT1JFRFVNUClcdFx0JiM0Mzs9IGNvcmVkdW1wLm9cbmZzL01ha2VmaWxlLTQ4LW9iai0kKENPTkZJR19TWVNDVEwpXHRcdCYjNDM7PSBkcm9wX2NhY2hlcy5vIHN5c2N0bHMub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNjEwMQoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byB0aGUgVW5peCBEb21haW4gU29ja2V0IE1ha2VmaWxlKioKCk9rYXksIHRpbWUgdG8gZGlnIGluLiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgdG8gdW5kZXJzdGFuZCB0aGlzIHN5c3RlbSBpcyB0byBleGFtaW5lIHRoZSBgbmV0L3VuaXgvTWFrZWZpbGVgLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBidWlsZCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBVbml4IGRvbWFpbiBzb2NrZXQgZnVuY3Rpb25hbGl0eSBzaG91bGQgcmVzaWRlLiBJIG5lZWQgdG8gc2VlIGhvdyB0aGUgb2JqZWN0IGZpbGVzIGFyZSBjb21waWxlZCwgbGlua2VkLCBhbmQgcG90ZW50aWFsbHkgd2hhdCBmbGFncyBhcmUgdXNlZCBmb3IgdGhlIGxpbmtlci4gVGhpcyB3aWxsIHRlbGwgbWUgYSBsb3QgYWJvdXQgdGhlIGRlcGVuZGVuY2llcywgb3B0aW1pemF0aW9ucywgYW5kIGFueSBjdXN0b20gY29uZmlndXJhdGlvbnMgc3BlY2lmaWMgdG8gVW5peCBkb21haW4gc29ja2V0cyB3aXRoaW4gdGhpcyBwcm9qZWN0LiBLbm93aW5nIHRoZSBtYWtlZmlsZSB3aWxsIGFsbG93IG1lIHRvIHRyYWNlIHRoZSBidWlsZCBwcm9jZXNzIGFuZCBzZWUgZXhhY3RseSBob3cgdGhlIGNvZGUgdHVybnMgaW50byBhIHJ1bm5hYmxlIGNvbXBvbmVudC4gVGhhdCYjMzk7cyB1c3VhbGx5IHRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0IHdoZW4gdHJ5aW5nIHRvIHJldmVyc2UgZW5naW5lZXIgb3IgdW5kZXJzdGFuZCBhIGxvdy1sZXZlbCBtb2R1bGUgbGlrZSB0aGlzLCBhbmQgaXQmIzM5O2xsIGdpdmUgbWUgYSBzdHJvbmcgZm91bmRhdGlvbiBmb3IgZXhwbG9yaW5nIHRoZSBhY3R1YWwgc291cmNlIGZpbGVzIGxhdGVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC91bml4L01ha2VmaWxlJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdCNcbiAgIDM6XHQjIE1ha2VmaWxlIGZvciB0aGUgTGludXggdW5peCBkb21haW4gc29ja2V0IGxheWVyLlxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRvYmotJChDT05GSUdfVU5JWClcdCYjNDM7PSB1bml4Lm9cbiAgIDc6XHRcbiAgIDg6XHR1bml4LXlcdFx0XHQ6PSBhZl91bml4Lm8gZ2FyYmFnZS5vXG4gICA5Olx0dW5peC0kKENPTkZJR19TWVNDVEwpXHQmIzQzOz0gc3lzY3RsX25ldF91bml4Lm9cbiAgMTA6XHR1bml4LSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gdW5peF9icGYub1xuICAxMTpcdFxuICAxMjpcdG9iai0kKENPTkZJR19VTklYX0RJQUcpXHQmIzQzOz0gdW5peF9kaWFnLm9cbiAgMTM6XHR1bml4X2RpYWcteVx0XHQ6PSBkaWFnLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzY1MjMKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAxMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSB0aGUgb25lIHRoaW5raW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgTmV0d29yayBDb3JlIE1ha2VmaWxlKioKCk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBMZXQmIzM5O3Mgc2VlIHdoYXQmIzM5O3MgaGFwcGVuaW5nIHdpdGggdGhlIGNvcmUgbmV0d29ya2luZyBidWlsZCBwcm9jZXNzLiBNeSBpbnN0aW5jdCB0ZWxscyBtZSB0aGUgcGxhY2UgdG8gc3RhcnQgaXMgbGlrZWx5IGBuZXQvY29yZS9NYWtlZmlsZWAuIFRoYXQmIzM5O3MgdXN1YWxseSB3aGVyZSB0aGUgdG9wLWxldmVsIGRlZmluaXRpb25zIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBrZXJuZWwmIzM5O3MgbmV0d29ya2luZyBzdWJzeXN0ZW0gYXJlIG1hbmFnZWQuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgdGhlIGtleSBidWlsZCBydWxlcyBmb3IgdGhlIGZ1bmRhbWVudGFsIG5ldHdvcmtpbmcgY29tcG9uZW50cyDigJMgdGhpbmdzIGxpa2Ugc29ja2V0IGhhbmRsaW5nLCBwcm90b2NvbCByZWdpc3RyYXRpb24sIG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgb3RoZXIgY3J1Y2lhbCBpbmZyYXN0cnVjdHVyZSBlbGVtZW50cy4gSSYjMzk7bSBsb29raW5nIGZvciBob3cgZGlmZmVyZW50IHBhcnRzIG9mIHRoaXMgY29yZSBhcmUgY29tcGlsZWQgYW5kIGxpbmtlZCB0b2dldGhlciwgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUga2VybmVsIGJ1aWxkIHByb2Nlc3MuIEkmIzM5O2xsIGJlIHNlYXJjaGluZyBmb3IgaW5zaWdodHMgaW50byBhbnkgcmVjZW50IGNoYW5nZXMgb3IgdW51c3VhbCBidWlsZCBjb25maWd1cmF0aW9ucyB0aGF0IG1pZ2h0IGJlIGFmZmVjdGluZyB0aGluZ3MuIEkmIzM5O2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgaW5jbHVkZSBwYXRocywgbGluayBmbGFncywgYW5kIHRhcmdldCBkZWZpbml0aW9ucy4gVGhpcyBNYWtlZmlsZSBob2xkcyB0aGUgc2VjcmV0cyB0byB1bmRlcnN0YW5kaW5nIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBvZiB0aGUgbmV0d29yayBzdGFjaywgc28gbGV0JiMzOTtzIGRpZyBpbiBhbmQgc2VlIHdoYXQgdHJlYXN1cmVzIHdlIGNhbiB1bmVhcnRoIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9jb3JlL01ha2VmaWxlJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuICAgMjpcdCNcbiAgIDM6XHQjIE1ha2VmaWxlIGZvciB0aGUgTGludXggbmV0d29ya2luZyBjb3JlLlxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRvYmoteSA6PSBzb2NrLm8gc2tidWZmLm8gZGF0YWdyYW0ubyBzdHJlYW0ubyBzY20ubyBcXFxuICAgNzpcdFx0IGdlbl9zdGF0cy5vIGdlbl9lc3RpbWF0b3IubyBuZXRfbmFtZXNwYWNlLm8gc2VjdXJlX3NlcS5vIFxcXG4gICA4Olx0XHQgZmxvd19kaXNzZWN0b3Iub1xuICAgOTpcdFxuICAxMDpcdG9iai0kKENPTkZJR19TWVNDVEwpICYjNDM7PSBzeXNjdGxfbmV0X2NvcmUub1xuICAxMTpcdFxuICAxMjpcdG9iai15XHRcdCAgICAgJiM0Mzs9IGRldi5vIGRldl9hcGkubyBkZXZfYWRkcl9saXN0cy5vIGRzdC5vIG5ldGV2ZW50Lm8gXFxcbiAgMTM6XHRcdFx0XHRuZWlnaGJvdXIubyBydG5ldGxpbmsubyB1dGlscy5vIGxpbmtfd2F0Y2gubyBmaWx0ZXIubyBcXFxuICAxNDpcdFx0XHRcdHNvY2tfZGlhZy5vIGRldl9pb2N0bC5vIHRzby5vIHNvY2tfcmV1c2Vwb3J0Lm8gXFxcbiAgMTU6XHRcdFx0XHRmaWJfbm90aWZpZXIubyB4ZHAubyBmbG93X29mZmxvYWQubyBncm8ubyBcXFxuICAxNjpcdFx0XHRcdG5ldGRldi1nZW5sLm8gbmV0ZGV2LWdlbmwtZ2VuLm8gbmV0ZGV2X3dvcmsubyBnc28ub1xuICAxNzpcdFxuICAxODpcdG9iai0kKENPTkZJR19ORVRERVZfQUREUl9MSVNUX1RFU1QpICYjNDM7PSBkZXZfYWRkcl9saXN0c190ZXN0Lm9cbiAgMTk6XHRcbiAgMjA6XHRvYmoteSAmIzQzOz0gbmV0LXN5c2ZzLm9cbiAgMjE6XHRvYmoteSAmIzQzOz0gaG90ZGF0YS5vXG4gIDIyOlx0b2JqLXkgJiM0Mzs9IG5ldGRldl9jb25maWcub1xuICAyMzpcdG9iai15ICYjNDM7PSBuZXRkZXZfcnhfcXVldWUub1xuICAyNDpcdG9iai15ICYjNDM7PSBuZXRkZXZfcXVldWVzLm9cbiAgMjU6XHRvYmotJChDT05GSUdfUEFHRV9QT09MKSAmIzQzOz0gcGFnZV9wb29sLm8gcGFnZV9wb29sX3VzZXIub1xuICAyNjpcdG9iai0kKENPTkZJR19QUk9DX0ZTKSAmIzQzOz0gbmV0LXByb2Nmcy5vXG4gIDI3Olx0b2JqLSQoQ09ORklHX05FVF9QS1RHRU4pICYjNDM7PSBwa3RnZW4ub1xuICAyODpcdG9iai0kKENPTkZJR19ORVRQT0xMKSAmIzQzOz0gbmV0cG9sbC5vXG4gIDI5Olx0b2JqLSQoQ09ORklHX0ZJQl9SVUxFUykgJiM0Mzs9IGZpYl9ydWxlcy5vXG4gIDMwOlx0b2JqLSQoQ09ORklHX1RSQUNFUE9JTlRTKSAmIzQzOz0gbmV0LXRyYWNlcy5vXG4gIDMxOlx0b2JqLSQoQ09ORklHX05FVF9EUk9QX01PTklUT1IpICYjNDM7PSBkcm9wX21vbml0b3Iub1xuICAzMjpcdG9iai0kKENPTkZJR19ORVRfSUVFRTgwMjFRX0hFTFBFUlMpICYjNDM7PSBpZWVlODAyMXFfaGVscGVycy5vXG4gIDMzOlx0b2JqLSQoQ09ORklHX05FVF9TRUxGVEVTVFMpICYjNDM7PSBzZWxmdGVzdHMub1xuICAzNDpcdG9iai0kKENPTkZJR19ORVRXT1JLX1BIWV9USU1FU1RBTVBJTkcpICYjNDM7PSB0aW1lc3RhbXBpbmcub1xuICAzNTpcdG9iai0kKENPTkZJR19ORVRfUFRQX0NMQVNTSUZZKSAmIzQzOz0gcHRwX2NsYXNzaWZpZXIub1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozNDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNzQ4NQoJCQkJCQkJb3V0cHV0OiAyNQoJCQkJCQkJdGhvdWdodHM6IDU0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBLZXJuZWwgT2JqZWN0IERlcGVuZGVuY2llcyBhbmQgRnV6emluZyBGb2N1cyoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBhbmQgZmlndXJpbmcgb3V0IGhvdyB0byBhcHByb2FjaCBmdXp6aW5nIGl0IGVmZmVjdGl2ZWx5LiBGaXJzdCwgYHNvY2sub2AgYW5kIGBzY20ub2AgYXJlIHBhcnQgb2YgYG9iai15YCB3aGVuIGBDT05GSUdfTkVUYCBpcyBlbmFibGVkLCB3aGljaCBpcyBzdGFuZGFyZC4gYGFmX3VuaXgub2AgbmVlZHMgYENPTkZJR19VTklYYCwgYW5kIGBjb3JlZHVtcC5vYCBuZWVkcyBgQ09ORklHX0NPUkVEVU1QYC4gTm90aGluZyBzdXJwcmlzaW5nIHRoZXJlLgoKTm93LCBsZXQmIzM5O3MgZ2V0IGRvd24gdG8gdGhlIGZ1enppbmcgc3BlY2lmaWNzLiBUaGUgZ29hbCBpcyB0byBpZGVudGlmeSB0aGUgcmlnaHQgZm9jdXMgc3ltYm9scy4gSSBwcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnRzIOKAkyB0aGUgcHVibGljLWZhY2luZyBmdW5jdGlvbnMsIG5vdCBpbnRlcm5hbCBoZWxwZXJzLgoKTGV0JiMzOTtzIGJyZWFrIGRvd24gdGhlIGZ1bmN0aW9ucyB0b3VjaGVkIG9yIGNyZWF0ZWQ6CgoxLiAgYHNrX3NldHNvY2tvcHRgIGluIGBuZXQvY29yZS9zb2NrLmNgIOKAkyBUaGlzIGhhbmRsZXMgYFNPX1BBU1NQSURGRF9USFJFQURgIGFuZCBgU09fUEFTU1BJREZEYCwgc28gaXQmIzM5O3MgZGVmaW5pdGVseSBpbnRlcmVzdGluZy4KMi4gIGBza19nZXRzb2Nrb3B0YCBpbiBgbmV0L2NvcmUvc29jay5jYCDigJMgSGFuZGxlcyBgU09fUEFTU1BJREZEX1RIUkVBRGAsIGBTT19QRUVSUElERkRgLCBhbmQgYFNPX1BFRVJQSURGRF9USFJFQURgLiBEZWZpbml0ZWx5IHdvcnRoIGludmVzdGlnYXRpbmcuCjMuICBgc2NtX3JlY3ZfdW5peGAgaW4gYG5ldC9jb3JlL3NjbS5jYCDigJMgVGhpcyBjYWxscyBgc2NtX3BpZGZkX3JlY3ZgLCBzbyBpdCYjMzk7cyBhIHBvdGVudGlhbCBlbnRyeSBwb2ludC4KNC4gIGBfX3NjbV9zZW5kYCBpbiBgbmV0L2NvcmUvc2NtLmNgIOKAkyBUaGlzIGNhbGxzIGBzY21fcmVwbGFjZV9waWRgLCBzbyBpdCYjMzk7cyBhIGdvb2QgY2FuZGlkYXRlLgo1LiAgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AgaW4gYGZzL3BpZGZzLmNgIOKAkyBBIG5ldyBmdW5jdGlvbiwgYWx3YXlzIGEgZ29vZCB0YXJnZXQuCjYuICBgcGlkZnNfY29yZWR1bXBgIGluIGBmcy9waWRmcy5jYCDigJMgSXQmIzM5O3MgYSBtb2RpZmllZCBmdW5jdGlvbiwgc28gd2Ugc2hvdWxkIGxvb2sgaW50byB0aGUgY2hhbmdlcy4KCkkmIzM5O2xsIHF1aWNrbHkgc2NhbiBmb3IgYW55IG90aGVyIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gdGhlIHBhdGNoLCBqdXN0IHRvIGJlIHN1cmUuIExldCYjMzk7cyBsb29rIGF0IGBuZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jYCBvciBvdGhlcnMgdG8gc2VlLiBBaCwgbG9va3MgbGlrZSBgYnRfc29ja19hbGxvY2AsIGFuZCBgYnRfYWNjZXB0X2VucXVldWVgIGluIGBuZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jYCB0aGF0IGFyZSBzbWFsbCB1cGRhdGVzIHRvIGluZGV4IGBza19wZWVyX3BpZFtQSURUWVBFX1RHSURdYCBpbnN0ZWFkIG9mIHNjYWxhciBgc2tfcGVlcl9waWRgLiBOb3QgYSBwcmltYXJ5IGZvY3VzLCBidXQgbWlnaHQgYmUgaW5kaXJlY3RseSBhZmZlY3RlZCwgc28gSSYjMzk7bGwga2VlcCBhbiBleWUgb24gdGhlbS4KCkFscmlnaHQsIGJhY2sgdG8gdGhlIGBGb2N1c1N5bWJvbHNgOgoKKiAgIGBza19zZXRzb2Nrb3B0YAoqICAgYHNrX2dldHNvY2tvcHRgCiogICBgc2NtX3JlY3ZfdW5peGAKKiAgIGBfX3NjbV9zZW5kYAoqICAgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AKKiAgIGBwaWRmc19jb3JlZHVtcGAKClRoZXNlIHNlZW0gbGlrZSBhIHNvbGlkIGxpc3Qgb2YgZW50cnkgcG9pbnRzLgoKTm93IGZvciB0aGUgYEVuYWJsZUNvbmZpZ3NgOgoKKiAgIGBVTklYYAoqICAgYENPUkVEVU1QYAoKQW5kIEkmIzM5O2xsIGRvdWJsZS1jaGVjayB0aGF0IGBORVRgIGlzIGFsc28gbmVlZGVkIHNpbmNlIFVOSVggZGVwZW5kcyBvbiBpdC4gR29vZCB0byBoYXZlIHRoYXQgZG9jdW1lbnRlZC4gTGV0IG1lIGNoZWNrIGBuZXQvdW5peC9LY29uZmlnYCB0byBiZSBzdXJlLgoKVGhpcyBpcyBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgcHJvY2VzczsgZ29vZCBsaXN0IG9mIGZvY3VzIGZ1bmN0aW9ucywgYW5kIGNvcnJlY3QgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMuIEl0IGlzIGEgc29saWQgYXBwcm9hY2guCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBVTklYJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L3VuaXgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L3VuaXgvS2NvbmZpZy01LVxubmV0L3VuaXgvS2NvbmZpZzo2OmNvbmZpZyBVTklYXG5uZXQvdW5peC9LY29uZmlnLTctXHRib29sIFwmIzM0O1VuaXggZG9tYWluIHNvY2tldHNcJiMzNDtcbi0tXG5uZXQvdW5peC9LY29uZmlnPTE5PWNvbmZpZ1x0QUZfVU5JWF9PT0Jcbi0tXG5uZXQvdW5peC9LY29uZmlnLTI1LVxubmV0L3VuaXgvS2NvbmZpZzoyNjpjb25maWcgVU5JWF9ESUFHXG5uZXQvdW5peC9LY29uZmlnLTI3LVx0dHJpc3RhdGUgXCYjMzQ7VU5JWDogc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM4ODkwCgkJCQkJCQlvdXRwdXQ6IDE4CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCB3ZW50OgoKKipFeGFtaW5pbmcgS2VybmVsIENvbmZpZ3VyYXRpb24gZm9yIENvcmUgRHVtcHMqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGNvcmUgZHVtcHMgd2l0aGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gTXkgaW5zdGluY3Qgc2F5cyB0byBsb29rIGF0IGBmcy9LY29uZmlnLmJpbmZtdGAsIHRoYXQmIzM5O3MgdXN1YWxseSB3aGVyZSB0aGUgYmluYXJ5IGZvcm1hdCBoYW5kbGluZyBpcyBkZWZpbmVkLCBhbmQgY29yZSBkdW1wIGJlaGF2aW9yIGlzIG9mdGVuIGxpbmtlZCB0byBob3cgZXhlY3V0YWJsZXMgYXJlIGhhbmRsZWQuIEkmIzM5O2xsIG5lZWQgdG8gY2hlY2sgdGhlIGNvbnRlbnRzIG9mIHRoYXQgZmlsZSB0byBzZWUgaWYgdGhlcmUmIzM5O3MgYSBzcGVjaWZpYyBgQ09SRURVTVBgIG9wdGlvbiBvciBzb21ldGhpbmcgcmVsYXRlZCB0aGF0IEkgY2FuIHVzZSB0byB1bmRlcnN0YW5kIGlmIGNvcmUgZHVtcCBnZW5lcmF0aW9uIGlzIGVuYWJsZWQgb3IgaG93IGl0IGlzIGJlaW5nIGNvbmZpZ3VyZWQuIFJpZ2h0LCBsZXQmIzM5O3MgZ2V0IHRvIGl0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQ09SRURVTVAmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvS2NvbmZpZy5iaW5mbXQ9MTcxPWNvbmZpZyBCSU5GTVRfTUlTQ19CUEZcbi0tXG5mcy9LY29uZmlnLmJpbmZtdC0xODQtXG5mcy9LY29uZmlnLmJpbmZtdDoxODU6Y29uZmlnIENPUkVEVU1QXG5mcy9LY29uZmlnLmJpbmZtdC0xODYtXHRib29sIFwmIzM0O0VuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFwmIzM0OyBpZiBFWFBFUlRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzkxNTgKCQkJCQkJCW91dHB1dDogMTU4CgkJCQkJCQl0aG91Z2h0czogMTY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQ6IFBhdGNoIFZlcmlmaWNhdGlvbiBhbmQgSW50ZWdyYXRpb24qKgoKT2theSwgZXZlcnl0aGluZyBsb29rcyBjbGVhbiwgdmVyaWZpZWQsIGFuZCByZWFkeSB0byBtb3ZlIGZvcndhcmQuIFRpbWUgdG8gc29saWRpZnkgdGhpcyBpbiBteSBtaW5kLi4uIExldCYjMzk7cyBydW4gdGhyb3VnaCB0aGUgY3JpdGljYWwgcGFyYW1ldGVycyB0byBjb25maXJtOgoKKiAgICoqYFdvcnRoRnV6emluZ2AqKjogRGVmaW5pdGVseS4gV2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBuZXcgc29ja2V0IG9wdGlvbnMgYW5kIHBvdGVudGlhbCB0aHJlYWQtc3BlY2lmaWMgaW50ZXJhY3Rpb25zLiBGdXp6aW5nIGlzIGVzc2VudGlhbCB0byBmbHVzaCBvdXQgYW55IGVkZ2UgY2FzZXMuCiogICAqKmBSZWFzb25pbmdgKio6IFRoaXMgcGF0Y2ggaXMgYWRkaW5nIGBTT19QQVNTUElERkRfVEhSRUFEYCBhbmQgYFNPX1BFRVJQSURGRF9USFJFQURgIG9wdGlvbnMgZm9yIFVOSVggZG9tYWluIHNvY2tldHMuIEl0IGFsbG93cyBmb3IgdGhyZWFkLXNwZWNpZmljIGBwaWRmZGAgcGFzc2luZyBhbmQgcGVlciBjcmVkZW50aWFsIHJldHJpZXZhbCDigJMgdmVyeSBpbXBvcnRhbnQgYWRkaXRpb25zLiBJdCBhbHNvIHVwZGF0ZXMgYHBpZGZzYCBhbmQgY29yZWR1bXAgbG9naWMgdG8gaW5jbHVkZSB0aHJlYWQgYHBpZGZkYCBpbmZvcm1hdGlvbi4gVGhpcyBpcyBzdWJzdGFudGlhbCwgYWZmZWN0aW5nIHNvY2tldCBvcGVyYXRpb25zIGFuZCBkZWJ1Z2dpbmcuCiogICAqKmBFbmFibGVDb25maWdzYCoqOiBXZSYjMzk7cmUgZW5hYmxpbmcgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zOiAmIzM0O1VOSVgmIzM0OyBhbmQgJiMzNDtDT1JFRFVNUCYjMzQ7LiBUaGlzIGNvbmZpcm1zIHdlJiMzOTtyZSBoYW5kbGluZyB0aGUgY29yZSBjb21wb25lbnRzIHRoaXMgcGF0Y2ggdG91Y2hlcy4KKiAgICoqYEZvY3VzU3ltYm9sc2AqKjogVGhlIGNyaXRpY2FsIHN5bWJvbHM6IGBza19zZXRzb2Nrb3B0YCwgYHNrX2dldHNvY2tvcHRgLCBgc2NtX3JlY3ZfdW5peGAsIGBfX3NjbV9zZW5kYCwgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AsIGFuZCBgcGlkZnNfY29yZWR1bXBgLiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSBpbXBhY3RlZCBieSB0aGUgcGF0Y2guIFRoZXkmIzM5O3JlIGFsbCBhY2NvdW50ZWQgZm9yLCBzbyB3ZSYjMzk7cmUgc2V0LgoKV2l0aCB0aGVzZSBwYXJhbWV0ZXJzIHZlcmlmaWVkLCBJIGFtIGNvbmZpZGVudCBpbiB0cmlnZ2VyaW5nIHRoZSBgc2V0LXJlc3VsdHNgIGZ1bmN0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozNDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VU5JWCYjMzQ7LAogICAgJiMzNDtDT1JFRFVNUCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NrX3NldHNvY2tvcHQmIzM0OywKICAgICYjMzQ7c2tfZ2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtzY21fcmVjdl91bml4JiMzNDssCiAgICAmIzM0O19fc2NtX3NlbmQmIzM0OywKICAgICYjMzQ7X19waWRmc19yZWdpc3Rlcl9waWRzJiMzNDssCiAgICAmIzM0O3BpZGZzX2NvcmVkdW1wJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIFNPX1BBU1NQSURGRF9USFJFQUQgYW5kIFNPX1BFRVJQSURGRF9USFJFQUQgc29ja2V0IG9wdGlvbnMgdG8gYWxsb3cgcGFzc2luZyBhbmQgcXVlcnlpbmcgdGhyZWFkLXNwZWNpZmljIHBpZGZkcyBvdmVyIFVOSVggZG9tYWluIHNvY2tldHMuIEl0IHVwZGF0ZXMgc3RydWN0IHNvY2ssIFNDTSBjcmVkZW50aWFsIHBhc3NpbmcsIFVOSVggc29ja2V0IHJlYWQvd3JpdGUgY3JlZGVudGlhbCBtYXRjaGluZywgcGlkZnMgcGlkIHJlZ2lzdHJhdGlvbiwgYW5kIGNvcmVkdW1wIG5vdGlmaWNhdGlvbiBtZWNoYW5pc21zLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtVTklYJiMzNDssCiAgICAmIzM0O0NPUkVEVU1QJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c2tfc2V0c29ja29wdCYjMzQ7LAogICAgJiMzNDtza19nZXRzb2Nrb3B0JiMzNDssCiAgICAmIzM0O3NjbV9yZWN2X3VuaXgmIzM0OywKICAgICYjMzQ7X19zY21fc2VuZCYjMzQ7LAogICAgJiMzNDtfX3BpZGZzX3JlZ2lzdGVyX3BpZHMmIzM0OywKICAgICYjMzQ7cGlkZnNfY29yZWR1bXAmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgU09fUEFTU1BJREZEX1RIUkVBRCBhbmQgU09fUEVFUlBJREZEX1RIUkVBRCBzb2NrZXQgb3B0aW9ucyB0byBhbGxvdyBwYXNzaW5nIGFuZCBxdWVyeWluZyB0aHJlYWQtc3BlY2lmaWMgcGlkZmRzIG92ZXIgVU5JWCBkb21haW4gc29ja2V0cy4gSXQgdXBkYXRlcyBzdHJ1Y3Qgc29jaywgU0NNIGNyZWRlbnRpYWwgcGFzc2luZywgVU5JWCBzb2NrZXQgcmVhZC93cml0ZSBjcmVkZW50aWFsIG1hdGNoaW5nLCBwaWRmcyBwaWQgcmVnaXN0cmF0aW9uLCBhbmQgY29yZWR1bXAgbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjEwbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjEwbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRocmVhZCBwaWRmZHMgaW4gVU5JWCBkb21haW4gc29ja2V0cyBhbmQgY29yZWR1bXAgbWVjaGFuaXNtcyAoU09fUEFTU1BJREZEX1RIUkVBRCwgU09fUEVFUlBJREZEX1RIUkVBRCkuXG5cbktleSBhcmVhcyBhbmFseXplZCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XG4xLiBgREVDTEFSRV9QSURTYCBhcnJheXMgaW4gYHN0cnVjdCBzY21fY29va2llYCwgYHN0cnVjdCBzb2NrYCwgYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgLCBgc3RydWN0IHVuaXhfcGVlcmNyZWRgLCBhbmQgYHN0cnVjdCB1bml4X3NrYl9wYXJtc2A6XG4gICAtIGBzdHJ1Y3Qgc29ja2AgaW5zdGFuY2VzIGFyZSBhbGxvY2F0ZWQgd2l0aCBgc2tfYWxsb2MoKWAgKHplcm9lZCkgYW5kIGV4cGxpY2l0bHkgcmVzZXQgaW4gYHNvY2tfaW5pdF9kYXRhX3VpZCgpYCB3aXRoIGBtZW1zZXQoc2stXHUwMDNlc2tfcGVlcl9waWQsIDAsIC4uLilgLlxuICAgLSBgc3RydWN0IHNjbV9jb29raWVgIG9iamVjdHMgYXJlIGNvbnNpc3RlbnRseSB6ZXJvLWluaXRpYWxpemVkIChlaXRoZXIgdmlhIGRlc2lnbmF0ZWQgemVybyBpbml0aWFsaXplcnMgYD0ge31gIG9yIGBtZW1zZXQoLi4uLCAwLCBzaXplb2YoLi4uKSlgKSBhY3Jvc3MgYWxsIGNhbGxlcnMgKGBzY21fc2VuZGAsIGB1bml4X2Rlc3RydWN0X3NjbWAsIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AsIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgLCBgaGNpX3NvY2tfcmVjdm1zZ2AsIGBuZXRsaW5rX3JlY3Ztc2dgKS5cbiAgIC0gYHN0cnVjdCB1bml4X3BlZXJjcmVkYCBpbnN0YW5jZXMgYXJlIHplcm8taW5pdGlhbGl6ZWQgKGA9IHt9YCkgaW4gYHVuaXhfbGlzdGVuYCwgYHVuaXhfc3RyZWFtX2Nvbm5lY3RgLCBhbmQgYHVuaXhfc29ja2V0cGFpcmAgYmVmb3JlIGBwcmVwYXJlX3BlZXJjcmVkKClgLlxuICAgLSBgc2tiLVx1MDAzZWNiYCBjb250YWluaW5nIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgIGlzIHplcm9lZCBkdXJpbmcgYF9fYWxsb2Nfc2tiKClgLlxuICAgLSBgc3RydWN0IGNvcmVkdW1wX3BhcmFtc2AgaXMgemVyby1pbml0aWFsaXplZCB2aWEgZGVzaWduYXRlZCBpbml0aWFsaXplcnMgaW4gYHZmc19jb3JlZHVtcCgpYC5cbjIuIFNvY2tldCBvcHRpb24gaGFuZGxlcnMgYW5kIGNtc2cgaGVscGVyczpcbiAgIC0gYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKClgIGNvcGllcyBhbiBpbml0aWFsaXplZCBgaW50IHBpZGZkYCBhbmQgYGludCBsZW5gIHRvIHVzZXIgc3BhY2UuXG4gICAtIGBzY21fcGlkZmRfcmVjdigpYCBpbml0aWFsaXplcyBgcGlkZmRgIGZyb20gYHBpZGZkX3ByZXBhcmUoKWAgYmVmb3JlIHdyaXRpbmcgdmlhIGBwdXRfY21zZygpYC5cbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlIG9yIHJlYWQgaW4gY29uZGl0aW9uYWwgbG9naWMuXG4zLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIChlLmcuIHBpZCByZWZlcmVuY2UgbWFuYWdlbWVudCwgdXNlLWFmdGVyLWZyZWUsIGxvY2tpbmcgYXJvdW5kIGBza19wZWVyX2xvY2tgLCBOVUxMIGRlcmVmZXJlbmNlKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGh1cywgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHdhcnJhbnRpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzMzJiMDNhNTk3ODc2NzEyOTRlNTE3ZDAzNWY1NDVkZDk5MjA2M2IxCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIE1vbiBBdWcgMzEgMTI6MzA6MjMgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmgKaW5kZXggOTQ2YTVmYWQyNjkxMi4uNWQzNTI0YzI2YjJiYyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaApAQCAtMTU3LDYgJiM0MzsxNTcsMTAgQEAKIAogI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQyAgICAgIDg1CiAKJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgICAgODYKJiM0MzsKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgICAgODcKJiM0MzsKICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCmluZGV4IGYxNjQxZGRlMTM1ZmMuLjI0NWE0M2Y1MmZiMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCiYjNDM7JiM0MzsmIzQzOyBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCkBAIC0xNjgsNiAmIzQzOzE2OCwxMCBAQAogCiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DICAgICAgODUKIAomIzQzOyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICA4NgomIzQzOwomIzQzOyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCAgICA4NwomIzQzOwogI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pCiAKICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCmluZGV4IGYzYTM4MTVjN2RjMjkuLmYyMzcxMGUxYzY3MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmgKJiM0MzsmIzQzOyYjNDM7IGIvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaApAQCAtMTQ5LDYgJiM0MzsxNDksMTAgQEAKIAogI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQwkweDQwNTMKIAomIzQzOyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRAkweDQwNTQKJiM0MzsKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQJMHg0MDU1CiYjNDM7CiAjaWYgIWRlZmluZWQoX19LRVJORUxfXykKIAogI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oCmluZGV4IDc5MDdmM2IxZjBlZTAuLmIzNWIyNWJkZWZjMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaAomIzQzOyYjNDM7JiM0MzsgYi9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmgKQEAgLTE1MCw2ICYjNDM7MTUwLDEwIEBACiAKICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkMgICAgICAgIDB4MDA1ZQogCiYjNDM7I2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEICAgICAgMHgwMDVmCiYjNDM7CiYjNDM7I2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEICAgICAgMHgwMDYwCiYjNDM7CiAjaWYgIWRlZmluZWQoX19LRVJORUxfXykKIAogCmRpZmYgLS1naXQgYS9mcy9jb3JlZHVtcC5jIGIvZnMvY29yZWR1bXAuYwppbmRleCBhYzNjZDc0ODA4YzY0Li5iNWZmNGIzZTE4MzFlIDEwMDY0NAotLS0gYS9mcy9jb3JlZHVtcC5jCiYjNDM7JiM0MzsmIzQzOyBiL2ZzL2NvcmVkdW1wLmMKQEAgLTQ1NCw3ICYjNDM7NDU0LDcgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfcGFyc2Uoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sCiAJCQkJICogbGVhZGVyIHdlIGtub3cgdGhhdCB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlcgogCQkJCSAqIGNhbm5vdCBiZSByZWFwZWQgdW50aWwgQGN1cnJlbnQgaGFzIGV4aXRlZC4KIAkJCQkgKi8KLQkJCQljcHJtLSZndDtwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7CiYjNDM7CQkJCXRhc2tfcGlkcyhjcHJtLSZndDtwaWQsIGN1cnJlbnQpOwogCQkJCWVyciA9IGNuX3ByaW50ZihjbiwgJiMzNDslZCYjMzQ7LCBDT1JFRFVNUF9QSURGRF9OVU1CRVIpOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNjI2LDEzICYjNDM7NjI2LDE3IEBAIHN0YXRpYyBpbnQgdW1oX2NvcmVkdW1wX3NldHVwKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpCiAJc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3AgPSAoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqKWluZm8tJmd0O2RhdGE7CiAJaW50IGVycjsKIAotCWlmIChjcC0mZ3Q7cGlkKSB7CiYjNDM7CWlmIChjcC0mZ3Q7cGlkW1BJRFRZUEVfVEdJRF0pIHsKIAkJc3RydWN0IGZpbGUgKnBpZGZzX2ZpbGUgX19mcmVlKGZwdXQpID0gTlVMTDsKIAotCQlwaWRmc19maWxlID0gcGlkZnNfYWxsb2NfZmlsZShjcC0mZ3Q7cGlkLCAwKTsKJiM0MzsJCXBpZGZzX2ZpbGUgPSBwaWRmc19hbGxvY19maWxlKGNwLSZndDtwaWRbUElEVFlQRV9UR0lEXSwgMCk7CiAJCWlmIChJU19FUlIocGlkZnNfZmlsZSkpCiAJCQlyZXR1cm4gUFRSX0VSUihwaWRmc19maWxlKTsKIAomIzQzOwkJZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhjcC0mZ3Q7cGlkKTsKJiM0MzsJCWlmIChlcnIpCiYjNDM7CQkJcmV0dXJuIGVycjsKJiM0MzsKIAkJcGlkZnNfY29yZWR1bXAoY3ApOwogCiAJCS8qCkBAIC02OTUsMTIgJiM0Mzs2OTksMTIgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICoKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyoKLQkgKiBTZXQgdGhlIHRocmVhZC1ncm91cCBsZWFkZXIgcGlkIHdoaWNoIGlzIHVzZWQgZm9yIHRoZSBwZWVyCi0JICogY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy4gVGhlbiBpbW1lZGlhdGVseSByZWdpc3RlcgotCSAqIGl0IGluIHBpZGZzLi4uCiYjNDM7CSAqIFNldCB0aGUgcGlkcyBvZiB0aGUgZHVtcGluZyB0aHJlYWQgYW5kIGl0cyB0aHJlYWQtZ3JvdXAgbGVhZGVyCiYjNDM7CSAqIHdoaWNoIGFyZSB1c2VkIGZvciB0aGUgcGVlciBjcmVkZW50aWFscyBkdXJpbmcgY29ubmVjdCgpIGJlbG93LgomIzQzOwkgKiBUaGVuIGltbWVkaWF0ZWx5IHJlZ2lzdGVyIHRoZW0gaW4gcGlkZnMuLi4KIAkgKi8KLQljcHJtLSZndDtwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7Ci0JcmV0dmFsID0gcGlkZnNfcmVnaXN0ZXJfcGlkKGNwcm0tJmd0O3BpZCk7CiYjNDM7CXRhc2tfcGlkcyhjcHJtLSZndDtwaWQsIGN1cnJlbnQpOwomIzQzOwlyZXR2YWwgPSBwaWRmc19yZWdpc3Rlcl9waWRzKGNwcm0tJmd0O3BpZCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC03MjIsNyAmIzQzOzcyNiw3IEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqCiAJfQogCiAJLyogLi4uIGFuZCB2YWxpZGF0ZSB0aGF0IEBza19wZWVyX3BpZCBtYXRjaGVzIEBjcHJtLnBpZC4gKi8KLQlpZiAoV0FSTl9PTl9PTkNFKHVuaXhfcGVlcihzb2NrZXQtJmd0O3NrKS0mZ3Q7c2tfcGVlcl9waWQgIT0gY3BybS0mZ3Q7cGlkKSkKJiM0MzsJaWYgKFdBUk5fT05fT05DRSghcGlkc19lcXVhbCh1bml4X3BlZXIoc29ja2V0LSZndDtzayktJmd0O3NrX3BlZXJfcGlkLCBjcHJtLSZndDtwaWQpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJY3BybS0mZ3Q7bGltaXQgPSBSTElNX0lORklOSVRZOwpkaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmMKaW5kZXggYTZhNjQzZjE1ZDA4YS4uMjkyOTliMmM3Y2E3MSAxMDA2NDQKLS0tIGEvZnMvcGlkZnMuYwomIzQzOyYjNDM7JiM0MzsgYi9mcy9waWRmcy5jCkBAIC03OTMsOSAmIzQzOzc5Myw5IEBAIHZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIH0KIAogI2lmZGVmIENPTkZJR19DT1JFRFVNUAotdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKQomIzQzO3N0YXRpYyB2b2lkIHBpZGZzX2NvcmVkdW1wX3BpZChzdHJ1Y3QgcGlkICpwaWQsCiYjNDM7CQkJICAgICAgIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pCiB7Ci0Jc3RydWN0IHBpZCAqcGlkID0gY3BybS0mZ3Q7cGlkOwogCXN0cnVjdCBwaWRmc19hdHRyICphdHRyOwogCiAJYXR0ciA9IFJFQURfT05DRShwaWQtJmd0O2F0dHIpOwpAQCAtODE0LDYgJiM0Mzs4MTQsMTMgQEAgdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKQogCXNtcF93bWIoKTsKIAlzZXRfYml0KFBJREZTX0FUVFJfQklUX0NPUkVEVU1QLCAmYW1wO2F0dHItJmd0O2F0dHJfbWFzayk7CiB9CiYjNDM7CiYjNDM7dm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKQomIzQzO3sKJiM0MzsJLyogVGhlIGR1bXBpbmcgdGhyZWFkJiMzOTtzIHBpZGZkIHJlcG9ydHMgdGhlIGNvcmVkdW1wIGFzIHdlbGwuICovCiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gcGlkc19sYXN0KGNwcm0tJmd0O3BpZCk7IHR5cGUmIzQzOyYjNDM7KQomIzQzOwkJcGlkZnNfY29yZWR1bXBfcGlkKGNwcm0tJmd0O3BpZFt0eXBlXSwgY3BybSk7CiYjNDM7fQogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnBpZGZzX21udCBfX3JvX2FmdGVyX2luaXQ7CkBAIC0xMDcwLDYgJiM0MzsxMDc3LDIyIEBAIGludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKQogCXJldHVybiAwOwogfQogCiYjNDM7LyogUmVnaXN0ZXIgdGhlIHBpZHMgdXAgdG8gcGlkIHR5cGUgQGxhc3Qgb2YgQHBpZHMgaW4gcGlkZnMuICovCiYjNDM7aW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KQomIzQzO3sKJiM0MzsJaWYgKFdBUk5fT05fT05DRShsYXN0ICZndDs9IFBJRFRZUEVfTUFYKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwomIzQzOwlmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlICZsdDs9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KSB7CiYjNDM7CQlpbnQgcmV0ID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZHNbdHlwZV0pOwomIzQzOwomIzQzOwkJaWYgKHVubGlrZWx5KHJldCkpCiYjNDM7CQkJcmV0dXJuIHJldDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcGlkZnNfc3Rhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKipzdGFzaGVkLAogCQkJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oIGIvaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oCmluZGV4IDdiMzhlZTJlNzkxM2IuLjBiYmI3ZGU2YTQwMjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmgKQEAgLTUsNiAmIzQzOzUsNyBAQAogI2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvbW0uaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9mcy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9waWRfdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9zY2hlZC9jb3JlZHVtcC5oJmd0OwogI2luY2x1ZGUgJmx0O2FzbS9zaWdpbmZvLmgmZ3Q7CiAKQEAgLTMyLDcgJiM0MzszMyw4IEBAIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgewogCWludCB2bWFfY291bnQ7CiAJc2l6ZV90IHZtYV9kYXRhX3NpemU7CiAJc3RydWN0IGNvcmVfdm1hX21ldGFkYXRhICp2bWFfbWV0YTsKLQlzdHJ1Y3QgcGlkICpwaWQ7CiYjNDM7CS8qIER1bXBpbmcgdGhyZWFkIGFuZCBpdHMgdGhyZWFkLWdyb3VwIGxlYWRlciBieSBwaWQgdHlwZS4gKi8KJiM0MzsJREVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTsKIH07CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgY29yZV9maWxlX25vdGVfc2l6ZV9saW1pdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkLmggYi9pbmNsdWRlL2xpbnV4L3BpZC5oCmluZGV4IGRkYWVmMGJiYzhiYTMuLjg3NjM1ZDBjYzFmNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlkLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9waWQuaApAQCAtMiw2ICYjNDM7Miw5IEBACiAjaWZuZGVmIF9MSU5VWF9QSURfSAogI2RlZmluZSBfTElOVVhfUElEX0gKIAomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9hcnJheV9zaXplLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2J1aWxkX2J1Zy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9taW5tYXguaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9waWRfdHlwZXMuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9yY3VsaXN0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvcmN1cGRhdGUuaCZndDsKQEAgLTkyLDYgJiM0Mzs5NSw1NiBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBwaWQgKmdldF9waWQoc3RydWN0IHBpZCAqcGlkKQogfQogCiBleHRlcm4gdm9pZCBwdXRfcGlkKHN0cnVjdCBwaWQgKnBpZCk7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBIZWxwZXJzIGZvciBhcnJheXMgb2Ygc3RydWN0IHBpZCBpbmRleGVkIGJ5IHBpZCB0eXBlIGRlY2xhcmVkIHdpdGgKJiM0MzsgKiBERUNMQVJFX1BJRFMoKS4gVGhlIGFycmF5IGNvdmVycyBQSURUWVBFX1BJRCB1cCB0byB0aGUgcGlkIHR5cGUgaXQKJiM0MzsgKiB3YXMgZGVjbGFyZWQgd2l0aCBhbmQgdGhlIGhlbHBlcnMgdGFrZSB0aGF0IGJvdW5kIGZyb20gdGhlIGFycmF5LgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbmxpbmUgdm9pZCBfX2dldF9waWRzKHN0cnVjdCBwaWQgKipkc3QsIHN0cnVjdCBwaWQgKmNvbnN0ICpzcmMsCiYjNDM7CQkJICAgICAgZW51bSBwaWRfdHlwZSBsYXN0KQomIzQzO3sKJiM0MzsJZm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSAmbHQ7PSBsYXN0OyB0eXBlJiM0MzsmIzQzOykKJiM0MzsJCWRzdFt0eXBlXSA9IGdldF9waWQoc3JjW3R5cGVdKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIF9fcHV0X3BpZHMoc3RydWN0IHBpZCAqKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdCkKJiM0Mzt7CiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gbGFzdDsgdHlwZSYjNDM7JiM0MzspIHsKJiM0MzsJCXB1dF9waWQocGlkc1t0eXBlXSk7CiYjNDM7CQlwaWRzW3R5cGVdID0gTlVMTDsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX3BpZHMoc3RydWN0IHBpZCAqKmEsIHN0cnVjdCBwaWQgKipiLAomIzQzOwkJCSAgICAgICBlbnVtIHBpZF90eXBlIGxhc3QpCiYjNDM7ewomIzQzOwlmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlICZsdDs9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KQomIzQzOwkJc3dhcChhW3R5cGVdLCBiW3R5cGVdKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSBib29sIF9fcGlkc19lcXVhbChzdHJ1Y3QgcGlkICpjb25zdCAqYSwgc3RydWN0IHBpZCAqY29uc3QgKmIsCiYjNDM7CQkJCWVudW0gcGlkX3R5cGUgbGFzdCkKJiM0Mzt7CiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gbGFzdDsgdHlwZSYjNDM7JiM0MzspCiYjNDM7CQlpZiAoYVt0eXBlXSAhPSBiW3R5cGVdKQomIzQzOwkJCXJldHVybiBmYWxzZTsKJiM0MzsJcmV0dXJuIHRydWU7CiYjNDM7fQomIzQzOwomIzQzOy8qIFRoZSBsYXN0IHBpZCB0eXBlIGFuIGFycmF5IGRlY2xhcmVkIHdpdGggREVDTEFSRV9QSURTKCkgY292ZXJzLiAqLwomIzQzOyNkZWZpbmUgcGlkc19sYXN0KHBpZHMpCQkJCQkJCVwKJiM0MzsJKChlbnVtIHBpZF90eXBlKShBUlJBWV9TSVpFKHBpZHMpIC0gMSAmIzQzOwkJCQlcCiYjNDM7CQkJIEJVSUxEX0JVR19PTl9aRVJPKEFSUkFZX1NJWkUocGlkcykgJmd0OyBQSURUWVBFX01BWCkpKQomIzQzOwomIzQzOyNkZWZpbmUgX19waWRzX2xhc3QyKGEsIGIpCQkJCQkJXAomIzQzOwkocGlkc19sYXN0KGEpICYjNDM7IEJVSUxEX0JVR19PTl9aRVJPKEFSUkFZX1NJWkUoYSkgIT0gQVJSQVlfU0laRShiKSkpCiYjNDM7CiYjNDM7I2RlZmluZSBnZXRfcGlkcyhkc3QsIHNyYykJX19nZXRfcGlkcyhkc3QsIHNyYywgX19waWRzX2xhc3QyKGRzdCwgc3JjKSkKJiM0MzsjZGVmaW5lIHB1dF9waWRzKHBpZHMpCQlfX3B1dF9waWRzKHBpZHMsIHBpZHNfbGFzdChwaWRzKSkKJiM0MzsjZGVmaW5lIHN3YXBfcGlkcyhhLCBiKQkJX19zd2FwX3BpZHMoYSwgYiwgX19waWRzX2xhc3QyKGEsIGIpKQomIzQzOyNkZWZpbmUgcGlkc19lcXVhbChhLCBiKQlfX3BpZHNfZXF1YWwoYSwgYiwgX19waWRzX2xhc3QyKGEsIGIpKQomIzQzOwogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlKTsKIHN0YXRpYyBpbmxpbmUgYm9vbCBwaWRfaGFzX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaAppbmRleCBjMmFlZTFkOTFkY2ZkLi4zMzAyNjkwYTJhMjgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmgKQEAgLTIsNiAmIzQzOzIsOCBAQAogI2lmbmRlZiBfTElOVVhfUElEX1RZUEVTX0gKICNkZWZpbmUgX0xJTlVYX1BJRF9UWVBFU19ICiAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnVpbGRfYnVnLmgmZ3Q7CiYjNDM7CiBlbnVtIHBpZF90eXBlIHsKIAlQSURUWVBFX1BJRCwKIAlQSURUWVBFX1RHSUQsCkBAIC0xMCw2ICYjNDM7MTIsMTIgQEAgZW51bSBwaWRfdHlwZSB7CiAJUElEVFlQRV9NQVgsCiB9OwogCiYjNDM7c3RydWN0IHBpZDsKJiM0MzsKJiM0MzsvKiBBbiBhcnJheSBvZiBzdHJ1Y3QgcGlkIGluZGV4ZWQgYnkgcGlkIHR5cGUsIFBJRFRZUEVfUElEIHVwIHRvIEBsYXN0LiAqLwomIzQzOyNkZWZpbmUgREVDTEFSRV9QSURTKG5hbWUsIGxhc3QpCQkJCQlcCiYjNDM7CXN0cnVjdCBwaWQgKm5hbWVbKGxhc3QpICYjNDM7IDEgJiM0MzsgQlVJTERfQlVHX09OX1pFUk8oKGxhc3QpICZndDs9IFBJRFRZUEVfTUFYKV0KJiM0MzsKIHN0cnVjdCBwaWRfbmFtZXNwYWNlOwogZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlIGluaXRfcGlkX25zOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZGZzLmggYi9pbmNsdWRlL2xpbnV4L3BpZGZzLmgKaW5kZXggMGFiZjdkYTlhYjIzNi4uM2MxZTgyZjFhMzY5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waWRmcy5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvcGlkZnMuaApAQCAtMyw2ICYjNDM7Myw3IEBACiAjZGVmaW5lIF9MSU5VWF9QSURfRlNfSAogCiAjaW5jbHVkZSAmbHQ7bGludXgvZ2ZwX3R5cGVzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3BpZC5oJmd0OwogCiBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zOwogCkBAIC0zMiw1ICYjNDM7MzMsOSBAQCBzdGF0aWMgaW5saW5lIGludCBwaWRmc19yZWdpc3Rlcl9waWQoc3RydWN0IHBpZCAqcGlkKQogfQogCiB2b2lkIHBpZGZzX2ZyZWVfcGlkKHN0cnVjdCBwaWQgKnBpZCk7CiYjNDM7aW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KTsKJiM0MzsKJiM0MzsvKiBSZWdpc3RlciB0aGUgcGlkcyBvZiBhbiBhcnJheSBkZWNsYXJlZCB3aXRoIERFQ0xBUkVfUElEUygpLiAqLwomIzQzOyNkZWZpbmUgcGlkZnNfcmVnaXN0ZXJfcGlkcyhwaWRzKQlfX3BpZGZzX3JlZ2lzdGVyX3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpKQogCiAjZW5kaWYgLyogX0xJTlVYX1BJRF9GU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaAppbmRleCA1ODRhZTg4YjQzNWU5Li45NDQ0YjQ3Nzg5YTA4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmgKQEAgLTY3Nyw2ICYjNDM7Njc3LDI0IEBAIHN0cnVjdCBwaWQgKnRhc2tfcGlkX3R5cGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBlbnVtIHBpZF90eXBlIHR5cGUpCiAJcmV0dXJuIHBpZDsKIH0KIAomIzQzOy8qIEZpbGwgQHBpZHMgd2l0aCB0aGUgcGlkIHR5cGVzIG9mIEB0YXNrIHVwIHRvIEBsYXN0LCB3aXRob3V0IHJlZmVyZW5jZXMuICovCiYjNDM7c3RhdGljIGlubGluZSB2b2lkIF9fdGFza19waWRzKHN0cnVjdCBwaWQgKipwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QsCiYjNDM7CQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKJiM0Mzt7CiYjNDM7CWZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gbGFzdDsgdHlwZSYjNDM7JiM0MzspCiYjNDM7CQlwaWRzW3R5cGVdID0gdGFza19waWRfdHlwZSh0YXNrLCB0eXBlKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3Rhc2tfcGlkcyhzdHJ1Y3QgcGlkICoqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0LAomIzQzOwkJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiYjNDM7ewomIzQzOwlmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlICZsdDs9IGxhc3Q7IHR5cGUmIzQzOyYjNDM7KQomIzQzOwkJcGlkc1t0eXBlXSA9IGdldF9waWQodGFza19waWRfdHlwZSh0YXNrLCB0eXBlKSk7CiYjNDM7fQomIzQzOwomIzQzOyNkZWZpbmUgdGFza19waWRzKHBpZHMsIHRhc2spCQlfX3Rhc2tfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcyksIHRhc2spCiYjNDM7I2RlZmluZSBnZXRfdGFza19waWRzKHBpZHMsIHRhc2spCV9fZ2V0X3Rhc2tfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcyksIHRhc2spCiYjNDM7CiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwaWQgKnRhc2tfdGdpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJcmV0dXJuIHRhc2stJmd0O3NpZ25hbC0mZ3Q7cGlkc1tQSURUWVBFX1RHSURdOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NtLmggYi9pbmNsdWRlL25ldC9zY20uaAppbmRleCA4NmFlNmJjMTA5ZWM2Li5hYTdkMTVjNWZjMjcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY20uaAomIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL25ldC9zY20uaApAQCAtNDIsNyAmIzQzOzQyLDcgQEAgc3RydWN0IHNjbV9mcF9saXN0IHsKIH07CiAKIHN0cnVjdCBzY21fY29va2llIHsKLQlzdHJ1Y3QgcGlkCQkqcGlkOwkJLyogU2tiIGNyZWRlbnRpYWxzICovCiYjNDM7CURFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7CS8qIFNrYiBjcmVkZW50aWFscyBieSBwaWQgdHlwZSAqLwogCXN0cnVjdCBzY21fZnBfbGlzdAkqZnA7CQkvKiBQYXNzZWQgZmlsZXMJCSovCiAJc3RydWN0IHNjbV9jcmVkcwljcmVkczsJCS8qIFNrYiBjcmVkZW50aWFscwkqLwogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLCkBAIC02OSw3ICYjNDM7NjksNyBAQCBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNjbV9jbwogc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwKIAkJCQkgICAgc3RydWN0IHBpZCAqcGlkLCBrdWlkX3QgdWlkLCBrZ2lkX3QgZ2lkKQogewotCXNjbS0mZ3Q7cGlkID0gZ2V0X3BpZChwaWQpOwomIzQzOwlzY20tJmd0O3BpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwaWQpOwogCXNjbS0mZ3Q7Y3JlZHMucGlkID0gcGlkX3ZucihwaWQpOwogCXNjbS0mZ3Q7Y3JlZHMudWlkID0gdWlkOwogCXNjbS0mZ3Q7Y3JlZHMuZ2lkID0gZ2lkOwpAQCAtNzcsOCAmIzQzOzc3LDcgQEAgc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveV9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20pCiB7Ci0JcHV0X3BpZChzY20tJmd0O3BpZCk7Ci0Jc2NtLSZndDtwaWQgPSBOVUxMOwomIzQzOwlwdXRfcGlkcyhzY20tJmd0O3BpZCk7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCA1MTE4NTIyMmFhYzI5Li42N2I3NDNiYWIyMjBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC0zMDEsNyAmIzQzOzMwMSw3IEBAIHN0cnVjdCBza19maWx0ZXI7CiAgICoJQHNrX3R5cGU6IHNvY2tldCB0eXBlICglU09DS19TVFJFQU0sIGV0YykKICAgKglAc2tfcHJvdG9jb2w6IHdoaWNoIHByb3RvY29sIHRoaXMgc29ja2V0IGJlbG9uZ3MgaW4gdGhpcyBuZXR3b3JrIGZhbWlseQogICAqCUBza19wZWVyX2xvY2s6IGxvY2sgcHJvdGVjdGluZyBAc2tfcGVlcl9waWQgYW5kIEBza19wZWVyX2NyZWQKLSAgKglAc2tfcGVlcl9waWQ6ICZhbXA7c3RydWN0IHBpZCBmb3IgdGhpcyBzb2NrZXQmIzM5O3MgcGVlcgomIzQzOyAgKglAc2tfcGVlcl9waWQ6ICZhbXA7c3RydWN0IHBpZCBmb3IgdGhpcyBzb2NrZXQmIzM5O3MgcGVlciwgYnkgcGlkIHR5cGUKICAgKglAc2tfcGVlcl9jcmVkOiAlU09fUEVFUkNSRUQgc2V0dGluZwogICAqCUBza19yY3Zsb3dhdDogJVNPX1JDVkxPV0FUIHNldHRpbmcKICAgKglAc2tfcmN2dGltZW86ICVTT19SQ1ZUSU1FTyBzZXR0aW5nCkBAIC0zNTYsNiAmIzQzOzM1Niw3IEBAIHN0cnVjdCBza19maWx0ZXI7CiAgICoJQHNrX3NjbV9zZWN1cml0eTogZmxhZ2dlZCBieSBTT19QQVNTU0VDIHRvIHJlY3YgU0NNX1NFQ1VSSVRZCiAgICoJQHNrX3NjbV9waWRmZDogZmxhZ2dlZCBieSBTT19QQVNTUElERkQgdG8gcmVjdiBTQ01fUElERkQKICAgKglAc2tfc2NtX3JpZ2h0czogZmxhZ2dlZCBieSBTT19QQVNTUklHSFRTIHRvIHJlY3YgU0NNX1JJR0hUUwomIzQzOyAgKglAc2tfc2NtX3BpZGZkX3RocmVhZDogZmxhZ2dlZCBieSBTT19QQVNTUElERkRfVEhSRUFEIHRvIHJlY3YgYSB0aHJlYWQgU0NNX1BJREZECiAgICoJQHNrX3NjbV91bnVzZWQ6IHVudXNlZCBmbGFncyBmb3Igc2NtX3JlY3YoKQogICAqCUBuc190cmFja2VyOiB0cmFja2VyIGZvciBuZXRucyByZWZlcmVuY2UKICAgKglAc2tfdXNlcl9mcmFnczogeGFycmF5IG9mIHBhZ2VzIHRoZSB1c2VyIGlzIGhvbGRpbmcgYSByZWZlcmVuY2Ugb24uCkBAIC01NDUsNyAmIzQzOzU0Niw3IEBAIHN0cnVjdCBzb2NrIHsKIAl1NjQJCQlza19pbm87CiAJc3BpbmxvY2tfdAkJc2tfcGVlcl9sb2NrOwogCWludAkJCXNrX2JpbmRfcGhjOwotCXN0cnVjdCBwaWQJCSpza19wZWVyX3BpZDsKJiM0MzsJREVDTEFSRV9QSURTKHNrX3BlZXJfcGlkLCBQSURUWVBFX1RHSUQpOwogCWNvbnN0IHN0cnVjdCBjcmVkCSpza19wZWVyX2NyZWQ7CiAKIAlrdGltZV90CQkJc2tfc3RhbXA7CkBAIC01NjIsNyAmIzQzOzU2Myw4IEBAIHN0cnVjdCBzb2NrIHsKIAkJCQlza19zY21fc2VjdXJpdHkgOiAxLAogCQkJCXNrX3NjbV9waWRmZCA6IDEsCiAJCQkJc2tfc2NtX3JpZ2h0cyA6IDEsCi0JCQkJc2tfc2NtX3VudXNlZCA6IDQ7CiYjNDM7CQkJCXNrX3NjbV9waWRmZF90aHJlYWQgOiAxLAomIzQzOwkJCQlza19zY21fdW51c2VkIDogMzsKIAkJfTsKIAl9OwogCXU4CQkJc2tfY2xvY2tpZDsKQEAgLTI5ODYsNiAmIzQzOzI5ODgsMTIgQEAgc3RhdGljIGlubGluZSBib29sIHNrX2lzX3N0cmVhbV91bml4KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIAlyZXR1cm4gc2tfaXNfdW5peChzaykgJmFtcDsmYW1wOyBzay0mZ3Q7c2tfdHlwZSA9PSBTT0NLX1NUUkVBTTsKIH0KIAomIzQzOy8qIFNPX1BBU1NQSURGRCBvciBTT19QQVNTUElERkRfVEhSRUFEIGFza2VkIGZvciBhbiBTQ01fUElERkQuICovCiYjNDM7c3RhdGljIGlubGluZSBib29sIHNrX3NjbV9waWRmZF93YW50ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQomIzQzO3sKJiM0MzsJcmV0dXJuIHNrLSZndDtza19zY21fcGlkZmQgfHwgc2stJmd0O3NrX3NjbV9waWRmZF90aHJlYWQ7CiYjNDM7fQomIzQzOwogc3RhdGljIGlubGluZSBib29sIHNrX2lzX3Zzb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gc2stJmd0O3NrX2ZhbWlseSA9PSBBRl9WU09DSzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaCBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaAppbmRleCA4NGVhN2I5MjkzNmUyLi41NmZlZDdhYjI3YWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3NvY2tldC5oCkBAIC0xNTIsNiAmIzQzOzE1MiwxMCBAQAogCiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DCTg1CiAKJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQJODYKJiM0MzsKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQJODcKJiM0MzsKICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKQogCiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0IHx8IChkZWZpbmVkKF9feDg2XzY0X18pICZhbXA7JmFtcDsgZGVmaW5lZChfX0lMUDMyX18pKQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKaW5kZXggNDExZDY2ZjI0MzkzZC4uNzc1OGU5ZWEzODQ4YyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCkBAIC0xNjEsNyAmIzQzOzE2MSw3IEBAIHN0cnVjdCBzb2NrICpidF9zb2NrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywKIAkvKiBJbml0IHBlZXIgaW5mb3JtYXRpb24gc28gaXQgY2FuIGJlIHByb3Blcmx5IG1vbml0b3JlZCAqLwogCWlmICgha2VybikgewogCQlzcGluX2xvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKLQkJc2stJmd0O3NrX3BlZXJfcGlkICA9IGdldF9waWQodGFza190Z2lkKGN1cnJlbnQpKTsKJiM0MzsJCXNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdICA9IGdldF9waWQodGFza190Z2lkKGN1cnJlbnQpKTsKIAkJc2stJmd0O3NrX3BlZXJfY3JlZCA9IGdldF9jdXJyZW50X2NyZWQoKTsKIAkJc3Bpbl91bmxvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKIAl9CkBAIC0yMzUsOSAmIzQzOzIzNSw5IEBAIHZvaWQgYnRfYWNjZXB0X2VucXVldWUoc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKnNrLCBib29sIGJoKQogCSAqIHNvY2tldCBpcyBhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbC4KIAkgKi8KIAlzcGluX2xvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKLQlvbGRfcGlkID0gc2stJmd0O3NrX3BlZXJfcGlkOwomIzQzOwlvbGRfcGlkID0gc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF07CiAJb2xkX2NyZWQgPSBzay0mZ3Q7c2tfcGVlcl9jcmVkOwotCXNrLSZndDtza19wZWVyX3BpZCA9IGdldF9waWQocGFyZW50LSZndDtza19wZWVyX3BpZCk7CiYjNDM7CXNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwYXJlbnQtJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pOwogCXNrLSZndDtza19wZWVyX2NyZWQgPSBnZXRfY3JlZChwYXJlbnQtJmd0O3NrX3BlZXJfY3JlZCk7CiAJc3Bpbl91bmxvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCmluZGV4IDA3MGNhMzg4ZjlhY2UuLjkxZTQ3MzhlYWJkYjAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwomIzQzOyYjNDM7JiM0MzsgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKQEAgLTI3MywyMSAmIzQzOzI3MywyMSBAQCBzdGF0aWMgdm9pZCBoY2lfc29ja19jb3B5X2NyZWRzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIAljcmVkcyA9ICZhbXA7YnRfY2Ioc2tiKS0mZ3Q7Y3JlZHM7CiAKIAkvKiBDaGVjayBpZiBwZWVyIGNyZWRlbnRpYWxzIGlzIHNldCAqLwotCWlmICghc2stJmd0O3NrX3BlZXJfcGlkKSB7CiYjNDM7CWlmICghc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pIHsKIAkJLyogQ2hlY2sgaWYgcGFyZW50IHBlZXIgY3JlZGVudGlhbHMgaXMgc2V0ICovCi0JCWlmIChidF9zayhzayktJmd0O3BhcmVudCAmYW1wOyZhbXA7IGJ0X3NrKHNrKS0mZ3Q7cGFyZW50LSZndDtza19wZWVyX3BpZCkKJiM0MzsJCWlmIChidF9zayhzayktJmd0O3BhcmVudCAmYW1wOyZhbXA7IGJ0X3NrKHNrKS0mZ3Q7cGFyZW50LSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKQogCQkJc2sgPSBidF9zayhzayktJmd0O3BhcmVudDsKIAkJZWxzZQogCQkJcmV0dXJuOwogCX0KIAogCS8qIENoZWNrIGlmIHNjbV9jcmVkcyBhbHJlYWR5IHNldCAqLwotCWlmIChjcmVkcy0mZ3Q7cGlkID09IHBpZF92bnIoc2stJmd0O3NrX3BlZXJfcGlkKSkKJiM0MzsJaWYgKGNyZWRzLSZndDtwaWQgPT0gcGlkX3Zucihzay0mZ3Q7c2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkpCiAJCXJldHVybjsKIAogCW1lbXNldChjcmVkcywgMCwgc2l6ZW9mKCpjcmVkcykpOwogCi0JY3JlZHMtJmd0O3BpZCA9IHBpZF92bnIoc2stJmd0O3NrX3BlZXJfcGlkKTsKJiM0MzsJY3JlZHMtJmd0O3BpZCA9IHBpZF92bnIoc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pOwogCWlmIChzay0mZ3Q7c2tfcGVlcl9jcmVkKSB7CiAJCWNyZWRzLSZndDt1aWQgPSBzay0mZ3Q7c2tfcGVlcl9jcmVkLSZndDt1aWQ7CiAJCWNyZWRzLSZndDtnaWQgPSBzay0mZ3Q7c2tfcGVlcl9jcmVkLSZndDtnaWQ7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCmluZGV4IDExOTRjMzdlNDY2ZjEuLjg3MmQ4ZmIzMWI2ZmIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCkBAIC0xODkwLDcgJiM0MzsxODkwLDcgQEAgc3RhdGljIHN0cnVjdCBwaWQgKmwyY2FwX3NvY2tfZ2V0X3BlZXJfcGlkX2NiKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tJmd0O2RhdGE7CiAKLQlyZXR1cm4gc2stJmd0O3NrX3BlZXJfcGlkOwomIzQzOwlyZXR1cm4gc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF07CiB9CiAKIHN0YXRpYyB2b2lkIGwyY2FwX3NvY2tfc3VzcGVuZF9jYihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NjbS5jIGIvbmV0L2NvcmUvc2NtLmMKaW5kZXggZjBkNDRlY2RiMTFmYy4uZDY5NzY4NDE0YWY0OCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2NtLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc2NtLmMKQEAgLTE0OSw2ICYjNDM7MTQ5LDcgQEAgRVhQT1JUX1NZTUJPTChfX3NjbV9kZXN0cm95KTsKIAogc3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZCkKIHsKJiM0MzsJc3RydWN0IHBpZCAqdGhyZWFkX3BpZDsKIAlpbnQgZXJyOwogCiAJLyogZHJvcCBhbGwgcHJldmlvdXMgcmVmZXJlbmNlcyAqLwpAQCAtMTU4LDcgJiM0MzsxNTksMTggQEAgc3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZCkKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJcmV0dXJuIGVycjsKIAotCXNjbS0mZ3Q7cGlkID0gcGlkOwomIzQzOwkvKiBBIHNlbmRlciBuYW1pbmcgaXRzIG93biB0aHJlYWQtZ3JvdXAgc2VuZHMgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQuICovCiYjNDM7CWlmIChwaWQgPT0gdGFza190Z2lkKGN1cnJlbnQpKQomIzQzOwkJdGhyZWFkX3BpZCA9IHRhc2tfcGlkKGN1cnJlbnQpOwomIzQzOwllbHNlCiYjNDM7CQl0aHJlYWRfcGlkID0gcGlkOwomIzQzOwomIzQzOwllcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQodGhyZWFkX3BpZCk7CiYjNDM7CWlmICh1bmxpa2VseShlcnIpKQomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsKJiM0MzsJc2NtLSZndDtwaWRbUElEVFlQRV9UR0lEXSA9IHBpZDsKJiM0MzsJc2NtLSZndDtwaWRbUElEVFlQRV9QSURdID0gZ2V0X3BpZCh0aHJlYWRfcGlkKTsKIAlzY20tJmd0O2NyZWRzLnBpZCA9IHBpZF92bnIocGlkKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwNyw3ICYjNDM7MjE5LDggQEAgaW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqcCkKIAkJCWlmIChlcnIpCiAJCQkJZ290byBlcnJvcjsKIAotCQkJaWYgKCFwLSZndDtwaWQgfHwgcGlkX3ZucihwLSZndDtwaWQpICE9IGNyZWRzLnBpZCkgewomIzQzOwkJCWlmICghcC0mZ3Q7cGlkW1BJRFRZUEVfVEdJRF0gfHwKJiM0MzsJCQkgICAgcGlkX3ZucihwLSZndDtwaWRbUElEVFlQRV9UR0lEXSkgIT0gY3JlZHMucGlkKSB7CiAJCQkJc3RydWN0IHBpZCAqcGlkOwogCQkJCWVyciA9IC1FU1JDSDsKIAkJCQlwaWQgPSBmaW5kX2dldF9waWQoY3JlZHMucGlkKTsKQEAgLTQ4Niw5ICYjNDM7NDk5LDEzIEBAIHN0YXRpYyBib29sIHNjbV9oYXNfc2VjZGF0YShzdHJ1Y3Qgc29jayAqc2spCiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgc2NtX3BpZGZkX3JlY3Yoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKQomIzQzO3N0YXRpYyB2b2lkIHNjbV9waWRmZF9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAomIzQzOwkJCSAgIHN0cnVjdCBzY21fY29va2llICpzY20pCiB7CiYjNDM7CWVudW0gcGlkX3R5cGUgdHlwZSA9IHNrLSZndDtza19zY21fcGlkZmRfdGhyZWFkID8gUElEVFlQRV9QSUQgOiBQSURUWVBFX1RHSUQ7CiYjNDM7CXN0cnVjdCBwaWQgKnBpZCA9IHNjbS0mZ3Q7cGlkW3R5cGVdOwogCXN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDsKJiM0MzsJdW5zaWduZWQgaW50IGZsYWdzID0gUElERkRfU1RBTEU7CiAJaW50IGxlbiwgcGlkZmQ7CiAKIAkvKiBwdXRfY21zZygpIGRvZXNuJiMzOTt0IHJldHVybiBhbiBlcnJvciBpZiBDTVNHIGlzIHRydW5jYXRlZCwKQEAgLTUwNCwxMCAmIzQzOzUyMSwxMyBAQCBzdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pCiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXNjbS0mZ3Q7cGlkKQomIzQzOwlpZiAoIXBpZCkKIAkJcmV0dXJuOwogCi0JcGlkZmQgPSBwaWRmZF9wcmVwYXJlKHNjbS0mZ3Q7cGlkLCBQSURGRF9TVEFMRSwgJmFtcDtwaWRmZF9maWxlKTsKJiM0MzsJaWYgKHR5cGUgPT0gUElEVFlQRV9QSUQpCiYjNDM7CQlmbGFncyB8PSBQSURGRF9USFJFQUQ7CiYjNDM7CiYjNDM7CXBpZGZkID0gcGlkZmRfcHJlcGFyZShwaWQsIGZsYWdzLCAmYW1wO3BpZGZkX2ZpbGUpOwogCiAJaWYgKHB1dF9jbXNnKG1zZywgU09MX1NPQ0tFVCwgU0NNX1BJREZELCBzaXplb2YoaW50KSwgJmFtcDtwaWRmZCkpIHsKIAkJaWYgKHBpZGZkX2ZpbGUpIHsKQEAgLTUyNiw3ICYjNDM7NTQ2LDcgQEAgc3RhdGljIGJvb2wgX19zY21fcmVjdl9jb21tb24oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCQkgICAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpCiB7CiAJaWYgKCFtc2ctJmd0O21zZ19jb250cm9sKSB7Ci0JCWlmIChzay0mZ3Q7c2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrLSZndDtza19zY21fcGlkZmQgfHwKJiM0MzsJCWlmIChzay0mZ3Q7c2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrX3NjbV9waWRmZF93YW50ZWQoc2spIHx8CiAJCSAgICBzY20tJmd0O2ZwIHx8IHNjbV9oYXNfc2VjZGF0YShzaykpCiAJCQltc2ctJmd0O21zZ19mbGFncyB8PSBNU0dfQ1RSVU5DOwogCkBAIC01NzMsOCAmIzQzOzU5Myw4IEBAIHZvaWQgc2NtX3JlY3ZfdW5peChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCXNjbV9kZXRhY2hfZmRzKG1zZywgc2NtLCBSRUFEX09OQ0UodS0mZ3Q7c2NtX3JpZ2h0c19ub3RydW5jKSk7CiAJfQogCi0JaWYgKHNvY2stJmd0O3NrLSZndDtza19zY21fcGlkZmQpCi0JCXNjbV9waWRmZF9yZWN2KG1zZywgc2NtKTsKJiM0MzsJaWYgKHNrX3NjbV9waWRmZF93YW50ZWQoc29jay0mZ3Q7c2spKQomIzQzOwkJc2NtX3BpZGZkX3JlY3Yoc29jay0mZ3Q7c2ssIG1zZywgc2NtKTsKIAogCXNjbV9kZXN0cm95X2NyZWQoc2NtKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suYwppbmRleCAxYWQ0MTkwNGRiMjViLi5jYjJmZmQzMjliYzY3IDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L2NvcmUvc29jay5jCkBAIC0xNTcxLDEwICYjNDM7MTU3MSwyNSBAQCBpbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCWJyZWFrOwogCiAJY2FzZSBTT19QQVNTUElERkQ6Ci0JCWlmIChza19pc191bml4KHNrKSkKJiM0MzsJCWlmIChza19pc191bml4KHNrKSkgewomIzQzOwkJCS8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRF9USFJFQUQuICovCiAJCQlzay0mZ3Q7c2tfc2NtX3BpZGZkID0gdmFsYm9vbDsKLQkJZWxzZQomIzQzOwkJCWlmICh2YWxib29sKQomIzQzOwkJCQlzay0mZ3Q7c2tfc2NtX3BpZGZkX3RocmVhZCA9IDA7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCXJldCA9IC1FT1BOT1RTVVBQOwomIzQzOwkJfQomIzQzOwkJYnJlYWs7CiYjNDM7CiYjNDM7CWNhc2UgU09fUEFTU1BJREZEX1RIUkVBRDoKJiM0MzsJCWlmIChza19pc191bml4KHNrKSkgewomIzQzOwkJCS8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRC4gKi8KJiM0MzsJCQlzay0mZ3Q7c2tfc2NtX3BpZGZkX3RocmVhZCA9IHZhbGJvb2w7CiYjNDM7CQkJaWYgKHZhbGJvb2wpCiYjNDM7CQkJCXNrLSZndDtza19zY21fcGlkZmQgPSAwOwomIzQzOwkJfSBlbHNlIHsKIAkJCXJldCA9IC1FT1BOT1RTVVBQOwomIzQzOwkJfQogCQlicmVhazsKIAogCWNhc2UgU09fUEFTU1JJR0hUUzoKQEAgLTE3MjgsNiAmIzQzOzE3NDMsNTAgQEAgc3RhdGljIGludCBncm91cHNfdG9fdXNlcihzb2NrcHRyX3QgZHN0LCBjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqc3JjKQogCXJldHVybiAwOwogfQogCiYjNDM7LyogSGFuZCBvdXQgYSBwaWRmZCBmb3IgQHR5cGUgb2YgdGhlIHNvY2tldCYjMzk7cyBwZWVyIHZpYSBTT19QRUVSUElERkQqLiAqLwomIzQzO3N0YXRpYyBpbnQgc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHBpZF90eXBlIHR5cGUsCiYjNDM7CQkJCSAgIHNvY2twdHJfdCBvcHR2YWwsIHNvY2twdHJfdCBvcHRsZW4sIGludCBsZW4pCiYjNDM7ewomIzQzOwlzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IDA7CiYjNDM7CXN0cnVjdCBwaWQgKnBlZXJfcGlkOwomIzQzOwlpbnQgcGlkZmQ7CiYjNDM7CiYjNDM7CWlmIChsZW4gJmd0OyBzaXplb2YocGlkZmQpKQomIzQzOwkJbGVuID0gc2l6ZW9mKHBpZGZkKTsKJiM0MzsKJiM0MzsJc3Bpbl9sb2NrKCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7CiYjNDM7CXBlZXJfcGlkID0gZ2V0X3BpZChzay0mZ3Q7c2tfcGVlcl9waWRbdHlwZV0pOwomIzQzOwlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwomIzQzOwomIzQzOwlpZiAoIXBlZXJfcGlkKQomIzQzOwkJcmV0dXJuIC1FTk9EQVRBOwomIzQzOwomIzQzOwkvKiBUaGUgdXNlIG9mIFBJREZEX1NUQUxFIHJlcXVpcmVzIHN0YXNoaW5nIG9mIHN0cnVjdCBwaWQgb24gcGlkZnMKJiM0MzsJICogd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuCiYjNDM7CSAqLwomIzQzOwlpZiAoc2stJmd0O3NrX2ZhbWlseSA9PSBBRl9VTklYKQomIzQzOwkJZmxhZ3MgfD0gUElERkRfU1RBTEU7CiYjNDM7CWlmICh0eXBlID09IFBJRFRZUEVfUElEKQomIzQzOwkJZmxhZ3MgfD0gUElERkRfVEhSRUFEOwomIzQzOwomIzQzOwlwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGVlcl9waWQsIGZsYWdzLCAmYW1wO3BpZGZkX2ZpbGUpOwomIzQzOwlwdXRfcGlkKHBlZXJfcGlkKTsKJiM0MzsJaWYgKHBpZGZkICZsdDsgMCkKJiM0MzsJCXJldHVybiBwaWRmZDsKJiM0MzsKJiM0MzsJaWYgKGNvcHlfdG9fc29ja3B0cihvcHR2YWwsICZhbXA7cGlkZmQsIGxlbikgfHwKJiM0MzsJICAgIGNvcHlfdG9fc29ja3B0cihvcHRsZW4sICZhbXA7bGVuLCBzaXplb2YoaW50KSkpIHsKJiM0MzsJCXB1dF91bnVzZWRfZmQocGlkZmQpOwomIzQzOwkJZnB1dChwaWRmZF9maWxlKTsKJiM0MzsKJiM0MzsJCXJldHVybiAtRUZBVUxUOwomIzQzOwl9CiYjNDM7CiYjNDM7CWZkX2luc3RhbGwocGlkZmQsIHBpZGZkX2ZpbGUpOwomIzQzOwlyZXR1cm4gMDsKJiM0Mzt9CiYjNDM7CiBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCSAgc29ja3B0cl90IG9wdHZhbCwgc29ja3B0cl90IG9wdGxlbikKIHsKQEAgLTE4OTIsNiAmIzQzOzE5NTEsMTMgQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQl2LnZhbCA9IHNrLSZndDtza19zY21fcGlkZmQ7CiAJCWJyZWFrOwogCiYjNDM7CWNhc2UgU09fUEFTU1BJREZEX1RIUkVBRDoKJiM0MzsJCWlmICghc2tfaXNfdW5peChzaykpCiYjNDM7CQkJcmV0dXJuIC1FT1BOT1RTVVBQOwomIzQzOwomIzQzOwkJdi52YWwgPSBzay0mZ3Q7c2tfc2NtX3BpZGZkX3RocmVhZDsKJiM0MzsJCWJyZWFrOwomIzQzOwogCWNhc2UgU09fUEFTU1JJR0hUUzoKIAkJaWYgKCFza19pc191bml4KHNrKSkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTE5MDYsNyAmIzQzOzE5NzIsOCBAQCBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQlsZW4gPSBzaXplb2YocGVlcmNyZWQpOwogCiAJCXNwaW5fbG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwotCQljcmVkX3RvX3VjcmVkKHNrLSZndDtza19wZWVyX3BpZCwgc2stJmd0O3NrX3BlZXJfY3JlZCwgJmFtcDtwZWVyY3JlZCk7CiYjNDM7CQljcmVkX3RvX3VjcmVkKHNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1RHSURdLCBzay0mZ3Q7c2tfcGVlcl9jcmVkLAomIzQzOwkJCSAgICAgICZhbXA7cGVlcmNyZWQpOwogCQlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwogCiAJCWlmIChjb3B5X3RvX3NvY2twdHIob3B0dmFsLCAmYW1wO3BlZXJjcmVkLCBsZW4pKQpAQCAtMTkxNSw0NSAmIzQzOzE5ODIsMTQgQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCX0KIAogCWNhc2UgU09fUEVFUlBJREZEOgotCXsKLQkJc3RydWN0IHBpZCAqcGVlcl9waWQ7Ci0JCXN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDsKLQkJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQkJaW50IHBpZGZkOwotCi0JCWlmIChsZW4gJmd0OyBzaXplb2YocGlkZmQpKQotCQkJbGVuID0gc2l6ZW9mKHBpZGZkKTsKLQotCQlzcGluX2xvY2soJmFtcDtzay0mZ3Q7c2tfcGVlcl9sb2NrKTsKLQkJcGVlcl9waWQgPSBnZXRfcGlkKHNrLSZndDtza19wZWVyX3BpZCk7Ci0JCXNwaW5fdW5sb2NrKCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7CiYjNDM7CQlyZXR1cm4gc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc2ssIFBJRFRZUEVfVEdJRCwgb3B0dmFsLCBvcHRsZW4sIGxlbik7CiAKLQkJaWYgKCFwZWVyX3BpZCkKLQkJCXJldHVybiAtRU5PREFUQTsKLQotCQkvKiBUaGUgdXNlIG9mIFBJREZEX1NUQUxFIHJlcXVpcmVzIHN0YXNoaW5nIG9mIHN0cnVjdCBwaWQKLQkJICogb24gcGlkZnMgd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYCi0JCSAqIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuCi0JCSAqLwotCQlpZiAoc2stJmd0O3NrX2ZhbWlseSA9PSBBRl9VTklYKQotCQkJZmxhZ3MgPSBQSURGRF9TVEFMRTsKLQotCQlwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGVlcl9waWQsIGZsYWdzLCAmYW1wO3BpZGZkX2ZpbGUpOwotCQlwdXRfcGlkKHBlZXJfcGlkKTsKLQkJaWYgKHBpZGZkICZsdDsgMCkKLQkJCXJldHVybiBwaWRmZDsKLQotCQlpZiAoY29weV90b19zb2NrcHRyKG9wdHZhbCwgJmFtcDtwaWRmZCwgbGVuKSB8fAotCQkgICAgY29weV90b19zb2NrcHRyKG9wdGxlbiwgJmFtcDtsZW4sIHNpemVvZihpbnQpKSkgewotCQkJcHV0X3VudXNlZF9mZChwaWRmZCk7Ci0JCQlmcHV0KHBpZGZkX2ZpbGUpOwotCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQomIzQzOwljYXNlIFNPX1BFRVJQSURGRF9USFJFQUQ6CiYjNDM7CQkvKiBPbmx5IEFGX1VOSVggcmVjb3JkcyB0aGUgcGVlciYjMzk7cyBjb25uZWN0aW5nIHRocmVhZC4gKi8KJiM0MzsJCWlmICghc2tfaXNfdW5peChzaykpCiYjNDM7CQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JCWZkX2luc3RhbGwocGlkZmQsIHBpZGZkX2ZpbGUpOwotCQlyZXR1cm4gMDsKLQl9CiYjNDM7CQlyZXR1cm4gc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc2ssIFBJRFRZUEVfUElELCBvcHR2YWwsIG9wdGxlbiwgbGVuKTsKIAogCWNhc2UgU09fUEVFUkdST1VQUzoKIAl7CkBAIC0yMzc5LDcgJiM0MzsyNDE1LDcgQEAgc3RhdGljIHZvaWQgX19za19kZXN0cnVjdChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiAKIAkvKiBXZSBkbyBub3QgbmVlZCB0byBhY3F1aXJlIHNrLSZndDtza19wZWVyX2xvY2ssIHdlIGFyZSB0aGUgbGFzdCB1c2VyLiAqLwogCXB1dF9jcmVkKHNrLSZndDtza19wZWVyX2NyZWQpOwotCXB1dF9waWQoc2stJmd0O3NrX3BlZXJfcGlkKTsKJiM0MzsJcHV0X3BpZHMoc2stJmd0O3NrX3BlZXJfcGlkKTsKIAogCWlmIChsaWtlbHkoc2stJmd0O3NrX25ldF9yZWZjbnQpKSB7CiAJCXB1dF9uZXRfdHJhY2sobmV0LCAmYW1wO3NrLSZndDtuc190cmFja2VyKTsKQEAgLTM3NzUsNyAmIzQzOzM4MTEsNyBAQCB2b2lkIHNvY2tfaW5pdF9kYXRhX3VpZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29jayAqc2ssIGt1aWRfdCB1aWQpCiAJc2stJmd0O3NrX2ZyYWcub2Zmc2V0CT0JMDsKIAlzay0mZ3Q7c2tfcGVla19vZmYJCT0JLTE7CiAKLQlzay0mZ3Q7c2tfcGVlcl9waWQgCT0JTlVMTDsKJiM0MzsJbWVtc2V0KHNrLSZndDtza19wZWVyX3BpZCwgMCwgc2l6ZW9mKHNrLSZndDtza19wZWVyX3BpZCkpOwogCXNrLSZndDtza19wZWVyX2NyZWQJPQlOVUxMOwogCXNwaW5fbG9ja19pbml0KCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7CiAKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCAxM2Y5OTI2YmYyMDU3Li41NjNkOTgyN2M1Y2M1IDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC03MzcsNTcgJiM0Mzs3MzcsNTMgQEAgc3RhdGljIHZvaWQgdW5peF9yZWxlYXNlX3NvY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgZW1icmlvbikKIH0KIAogc3RydWN0IHVuaXhfcGVlcmNyZWQgewotCXN0cnVjdCBwaWQgKnBlZXJfcGlkOwomIzQzOwlERUNMQVJFX1BJRFMocGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7CiAJY29uc3Qgc3RydWN0IGNyZWQgKnBlZXJfY3JlZDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfcGVlcmNyZWQoc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKQogewotCXN0cnVjdCBwaWQgKnBpZDsKIAlpbnQgZXJyOwogCi0JcGlkID0gdGFza190Z2lkKGN1cnJlbnQpOwotCWVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWQpOwotCWlmIChsaWtlbHkoIWVycikpIHsKLQkJcGVlcmNyZWQtJmd0O3BlZXJfcGlkID0gZ2V0X3BpZChwaWQpOwotCQlwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpOwomIzQzOwlnZXRfdGFza19waWRzKHBlZXJjcmVkLSZndDtwZWVyX3BpZCwgY3VycmVudCk7CiYjNDM7CWVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMocGVlcmNyZWQtJmd0O3BlZXJfcGlkKTsKJiM0MzsJaWYgKHVubGlrZWx5KGVycikpIHsKJiM0MzsJCXB1dF9waWRzKHBlZXJjcmVkLSZndDtwZWVyX3BpZCk7CiYjNDM7CQlyZXR1cm4gZXJyOwogCX0KLQlyZXR1cm4gZXJyOwomIzQzOwomIzQzOwlwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpOwomIzQzOwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZHJvcF9wZWVyY3JlZChzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpCiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBOVUxMOwotCXN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7CiAKIAltaWdodF9zbGVlcCgpOwogCi0Jc3dhcChwZWVyY3JlZC0mZ3Q7cGVlcl9waWQsIHBpZCk7CiYjNDM7CXB1dF9waWRzKHBlZXJjcmVkLSZndDtwZWVyX3BpZCk7CiAJc3dhcChwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkLCBjcmVkKTsKLQotCXB1dF9waWQocGlkKTsKIAlwdXRfY3JlZChjcmVkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGluaXRfcGVlcmNyZWQoc3RydWN0IHNvY2sgKnNrLAogCQkJCSBjb25zdCBzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpCiB7Ci0Jc2stJmd0O3NrX3BlZXJfcGlkID0gcGVlcmNyZWQtJmd0O3BlZXJfcGlkOwomIzQzOwltZW1jcHkoc2stJmd0O3NrX3BlZXJfcGlkLCBwZWVyY3JlZC0mZ3Q7cGVlcl9waWQsIHNpemVvZihzay0mZ3Q7c2tfcGVlcl9waWQpKTsKIAlzay0mZ3Q7c2tfcGVlcl9jcmVkID0gcGVlcmNyZWQtJmd0O3BlZXJfY3JlZDsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKQogewogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDsKLQlzdHJ1Y3QgcGlkICpvbGRfcGlkOwogCiAJc3Bpbl9sb2NrKCZhbXA7c2stJmd0O3NrX3BlZXJfbG9jayk7Ci0Jb2xkX3BpZCA9IHNrLSZndDtza19wZWVyX3BpZDsKJiM0MzsJc3dhcF9waWRzKHNrLSZndDtza19wZWVyX3BpZCwgcGVlcmNyZWQtJmd0O3BlZXJfcGlkKTsKIAlvbGRfY3JlZCA9IHNrLSZndDtza19wZWVyX2NyZWQ7Ci0JaW5pdF9wZWVyY3JlZChzaywgcGVlcmNyZWQpOwomIzQzOwlzay0mZ3Q7c2tfcGVlcl9jcmVkID0gcGVlcmNyZWQtJmd0O3BlZXJfY3JlZDsKIAlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwogCi0JcGVlcmNyZWQtJmd0O3BlZXJfcGlkID0gb2xkX3BpZDsKIAlwZWVyY3JlZC0mZ3Q7cGVlcl9jcmVkID0gb2xkX2NyZWQ7CiB9CiAKQEAgLTc5NiwxNCAmIzQzOzc5MiwxNCBAQCBzdGF0aWMgdm9pZCBjb3B5X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBlZXJzaykKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhbXA7dW5peF9zayhwZWVyc2spLSZndDtsb2NrKTsKIAogCXNwaW5fbG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwotCXNrLSZndDtza19wZWVyX3BpZCA9IGdldF9waWQocGVlcnNrLSZndDtza19wZWVyX3BpZCk7CiYjNDM7CWdldF9waWRzKHNrLSZndDtza19wZWVyX3BpZCwgcGVlcnNrLSZndDtza19wZWVyX3BpZCk7CiAJc2stJmd0O3NrX3BlZXJfY3JlZCA9IGdldF9jcmVkKHBlZXJzay0mZ3Q7c2tfcGVlcl9jcmVkKTsKIAlzcGluX3VubG9jaygmYW1wO3NrLSZndDtza19wZWVyX2xvY2spOwogfQogCiBzdGF0aWMgYm9vbCB1bml4X21heV9wYXNzY3JlZChjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7Ci0JcmV0dXJuIHNrLSZndDtza19zY21fY3JlZGVudGlhbHMgfHwgc2stJmd0O3NrX3NjbV9waWRmZDsKJiM0MzsJcmV0dXJuIHNrLSZndDtza19zY21fY3JlZGVudGlhbHMgfHwgc2tfc2NtX3BpZGZkX3dhbnRlZChzayk7CiB9CiAKIHN0YXRpYyBpbnQgdW5peF9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpCkBAIC0xMDYwLDYgJiM0MzsxMDU2LDcgQEAgc3RhdGljIGJvb2wgdW5peF9icGZfYnlwYXNzX2dldHNvY2tvcHQoaW50IGxldmVsLCBpbnQgb3B0bmFtZSkKIAlpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCkgewogCQlzd2l0Y2ggKG9wdG5hbWUpIHsKIAkJY2FzZSBTT19QRUVSUElERkQ6CiYjNDM7CQljYXNlIFNPX1BFRVJQSURGRF9USFJFQUQ6CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBmYWxzZTsKQEAgLTE5NzMsNyAmIzQzOzE5NzAsNyBAQCBzdGF0aWMgdm9pZCB1bml4X2Rlc3RydWN0X3NjbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBzY21fY29va2llIHNjbSA9IHt9OwogCi0Jc3dhcChzY20ucGlkLCBVTklYQ0Ioc2tiKS5waWQpOwomIzQzOwlzd2FwX3BpZHMoc2NtLnBpZCwgVU5JWENCKHNrYikucGlkKTsKIAogCWlmIChVTklYQ0Ioc2tiKS5mcCkKIAkJdW5peF9kZXRhY2hfZmRzKCZhbXA7c2NtLCBza2IpOwpAQCAtMTk5MSw3ICYjNDM7MTk4OCw3IEBAIHN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuCiB7CiAJaW50IGVyciA9IDA7CiAKLQlVTklYQ0Ioc2tiKS5waWQgPSBnZXRfcGlkKHNjbS0mZ3Q7cGlkKTsKJiM0MzsJZ2V0X3BpZHMoVU5JWENCKHNrYikucGlkLCBzY20tJmd0O3BpZCk7CiAJVU5JWENCKHNrYikudWlkID0gc2NtLSZndDtjcmVkcy51aWQ7CiAJVU5JWENCKHNrYikuZ2lkID0gc2NtLSZndDtjcmVkcy5naWQ7CiAJVU5JWENCKHNrYikuZnAgPSBOVUxMOwpAQCAtMjAwNSw3ICYjNDM7MjAwMiwxMCBAQCBzdGF0aWMgaW50IHVuaXhfc2NtX3RvX3NrYihzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHNlbgogCiBzdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSkKIHsKLQlzY21fc2V0X2NyZWQoc2NtLCBVTklYQ0Ioc2tiKS5waWQsIFVOSVhDQihza2IpLnVpZCwgVU5JWENCKHNrYikuZ2lkKTsKJiM0MzsJZ2V0X3BpZHMoc2NtLSZndDtwaWQsIFVOSVhDQihza2IpLnBpZCk7CiYjNDM7CXNjbS0mZ3Q7Y3JlZHMucGlkID0gcGlkX3ZucihzY20tJmd0O3BpZFtQSURUWVBFX1RHSURdKTsKJiM0MzsJc2NtLSZndDtjcmVkcy51aWQgPSBVTklYQ0Ioc2tiKS51aWQ7CiYjNDM7CXNjbS0mZ3Q7Y3JlZHMuZ2lkID0gVU5JWENCKHNrYikuZ2lkOwogCXVuaXhfc2V0X3NlY2RhdGEoc2NtLCBza2IpOwogfQogCkBAIC0yMDI1LDMwICYjNDM7MjAyNSwzNSBAQCBzdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSkKIHN0YXRpYyBpbnQgdW5peF9tYXliZV9hZGRfY3JlZHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJCWNvbnN0IHN0cnVjdCBzb2NrICpvdGhlcikKIHsKLQlpZiAoVU5JWENCKHNrYikucGlkKQomIzQzOwlpZiAoVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0pCiAJCXJldHVybiAwOwogCiAJaWYgKHVuaXhfbWF5X3Bhc3NjcmVkKHNrKSB8fCB1bml4X21heV9wYXNzY3JlZChvdGhlcikgfHwKIAkgICAgIW90aGVyLSZndDtza19zb2NrZXQpIHsKLQkJc3RydWN0IHBpZCAqcGlkOwogCQlpbnQgZXJyOwogCi0JCXBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTsKLQkJZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7Ci0JCWlmICh1bmxpa2VseShlcnIpKQomIzQzOwkJZ2V0X3Rhc2tfcGlkcyhVTklYQ0Ioc2tiKS5waWQsIGN1cnJlbnQpOwomIzQzOwkJZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhVTklYQ0Ioc2tiKS5waWQpOwomIzQzOwkJaWYgKHVubGlrZWx5KGVycikpIHsKJiM0MzsJCQlwdXRfcGlkcyhVTklYQ0Ioc2tiKS5waWQpOwogCQkJcmV0dXJuIGVycjsKJiM0MzsJCX0KIAotCQlVTklYQ0Ioc2tiKS5waWQgPSBnZXRfcGlkKHBpZCk7CiAJCWN1cnJlbnRfdWlkX2dpZCgmYW1wO1VOSVhDQihza2IpLnVpZCwgJmFtcDtVTklYQ0Ioc2tiKS5naWQpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoc3RydWN0IHNrX2J1ZmYgKnNrYiwKJiM0MztzdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgIHN0cnVjdCBzY21fY29va2llICpzY20pCiB7Ci0JcmV0dXJuIFVOSVhDQihza2IpLnBpZCA9PSBzY20tJmd0O3BpZCAmYW1wOyZhbXA7CiYjNDM7CS8qIE9ubHkgYSB0aHJlYWQgcGlkZmQgcmVjZWl2ZXIgY2FuIHRlbGwgdGhyZWFkcyBvZiBvbmUgcHJvY2VzcyBhcGFydC4gKi8KJiM0MzsJaWYgKHNrLSZndDtza19zY21fcGlkZmRfdGhyZWFkICZhbXA7JmFtcDsKJiM0MzsJICAgIFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1BJRF0gIT0gc2NtLSZndDtwaWRbUElEVFlQRV9QSURdKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwomIzQzOwlyZXR1cm4gVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0gPT0gc2NtLSZndDtwaWRbUElEVFlQRV9UR0lEXSAmYW1wOyZhbXA7CiAJICAgICAgIHVpZF9lcShVTklYQ0Ioc2tiKS51aWQsIHNjbS0mZ3Q7Y3JlZHMudWlkKSAmYW1wOyZhbXA7CiAJICAgICAgIGdpZF9lcShVTklYQ0Ioc2tiKS5naWQsIHNjbS0mZ3Q7Y3JlZHMuZ2lkKSAmYW1wOyZhbXA7CiAJICAgICAgIHVuaXhfc2VjZGF0YV9lcShzY20sIHNrYik7CkBAIC0zMDI2LDcgJiM0MzszMDMxLDcgQEAgc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWMoc3RydWN0IHVuaXhfc3RyZWFtX3JlYWRfc3RhdGUgKnN0YXRlLAogCiAJCWlmIChjaGVja19jcmVkcykgewogCQkJLyogTmV2ZXIgZ2x1ZSBtZXNzYWdlcyBmcm9tIGRpZmZlcmVudCB3cml0ZXJzICovCi0JCQlpZiAoIXVuaXhfc2tiX3NjbV9lcShza2IsICZhbXA7c2NtKSkKJiM0MzsJCQlpZiAoIXVuaXhfc2tiX3NjbV9lcShzaywgc2tiLCAmYW1wO3NjbSkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAodW5peF9tYXlfcGFzc2NyZWQoc2spKSB7CiAJCQkvKiBDb3B5IGNyZWRlbnRpYWxzICovCmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmggYi9uZXQvdW5peC9hZl91bml4LmgKaW5kZXggODExOWRiZWVmM2EzYy4uNDAyNzQyODk1YWNjYSAxMDA2NDQKLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5oCiYjNDM7JiM0MzsmIzQzOyBiL25ldC91bml4L2FmX3VuaXguaApAQCAtMiw2ICYjNDM7Miw3IEBACiAjaWZuZGVmIF9fQUZfVU5JWF9ICiAjZGVmaW5lIF9fQUZfVU5JWF9ICiAKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvcGlkX3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvdWlkZ2lkLmgmZ3Q7CiAKICNkZWZpbmUgVU5JWF9IQVNIX01PRAkoMjU2IC0gMSkKQEAgLTExLDcgJiM0MzsxMiw3IEBACiBzdHJ1Y3Qgc29jayAqdW5peF9wZWVyX2dldChzdHJ1Y3Qgc29jayAqc2spOwogCiBzdHJ1Y3QgdW5peF9za2JfcGFybXMgewotCXN0cnVjdCBwaWQJCSpwaWQ7CQkvKiBza2IgY3JlZGVudGlhbHMJKi8KJiM0MzsJREVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTsJLyogc2tiIGNyZWRlbnRpYWxzIGJ5IHBpZCB0eXBlICovCiAJa3VpZF90CQkJdWlkOwogCWtnaWRfdAkJCWdpZDsKIAlzdHJ1Y3Qgc2NtX2ZwX2xpc3QJKmZwOwkJLyogUGFzc2VkIGZpbGVzCQkqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmMKaW5kZXggNDIyNzI4ZjYzMmNhNi4uZWM3M2JiNjkwYmJjYiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jCkBAIC01OTIsNiAmIzQzOzU5MiwxODEgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfY29yZWR1bXBfc2lnbmFsX3NpZ3NlZ3YpCiAJd2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7CiB9CiAKJiM0MztzdGF0aWMgYm9vbCBjaGVja19jb3JlZHVtcF9pbmZvKGNvbnN0IHN0cnVjdCBwaWRmZF9pbmZvICppbmZvLCBjb25zdCBjaGFyICp3aGF0KQomIzQzO3sKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7bWFzayAmYW1wOyBQSURGRF9JTkZPX0NPUkVEVU1QKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IFBJREZEX0lORk9fQ09SRURVTVAgbm90IHNldCBpbiBtYXNrXG4mIzM0Oywgd2hhdCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7Y29yZWR1bXBfbWFzayAmYW1wOyBQSURGRF9DT1JFRFVNUEVEKSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IFBJREZEX0NPUkVEVU1QRUQgbm90IHNldCBpbiBjb3JlZHVtcF9tYXNrXG4mIzM0Oywgd2hhdCk7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7bWFzayAmYW1wOyBQSURGRF9JTkZPX0NPUkVEVU1QX1NJR05BTCkgfHwgaW5mby0mZ3Q7Y29yZWR1bXBfc2lnbmFsICE9IFNJR1NFR1YpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBjb3JlZHVtcF9zaWduYWw9JWQsIGV4cGVjdGVkIFNJR1NFR1Y9JWRcbiYjMzQ7LAomIzQzOwkJCXdoYXQsIGluZm8tJmd0O2NvcmVkdW1wX3NpZ25hbCwgU0lHU0VHVik7CiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCEoaW5mby0mZ3Q7bWFzayAmYW1wOyBQSURGRF9JTkZPX0NPUkVEVU1QX0NPREUpIHx8IGluZm8tJmd0O2NvcmVkdW1wX2NvZGUgIT0gU0VHVl9NQVBFUlIpIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBjb3JlZHVtcF9jb2RlPSVkLCBleHBlY3RlZCBTRUdWX01BUEVSUj0lZFxuJiMzNDssCiYjNDM7CQkJd2hhdCwgaW5mby0mZ3Q7Y29yZWR1bXBfY29kZSwgU0VHVl9NQVBFUlIpOwomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiB0cnVlOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRlc3Q6IFBJREZEX0lORk9fQ09SRURVTVAgb24gdGhlIGR1bXBpbmcgdGhyZWFkJiMzOTtzIHBpZGZkCiYjNDM7ICoKJiM0MzsgKiBDcmFzaCBmcm9tIGEgbm9uLWxlYWRlciB0aHJlYWQgYW5kIHZlcmlmeSB0aGF0IHRoZSBwaWRmZCBmcm9tCiYjNDM7ICogU09fUEVFUlBJREZEX1RIUkVBRCByZWZlcnMgdG8gdGhhdCB0aHJlYWQgYW5kIHJlcG9ydHMgdGhlIGNvcmVkdW1wCiYjNDM7ICogbGlrZSB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlciYjMzk7cyBwaWRmZCBmcm9tIFNPX1BFRVJQSURGRCBkb2VzLgomIzQzOyAqLwomIzQzO1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X2NvcmVkdW1wX3RocmVhZCkKJiM0Mzt7CiYjNDM7CWludCBwaWRmZCwgcmV0LCBzdGF0dXM7CiYjNDM7CXBpZF90IHBpZCwgcGlkX2NvcmVkdW1wX3NlcnZlcjsKJiM0MzsJc3RydWN0IHBpZGZkX2luZm8gaW5mbyA9IHt9OwomIzQzOwlpbnQgaXBjX3NvY2tldHNbMl07CiYjNDM7CWNoYXIgYzsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybigmIzM0O0AvdG1wL2NvcmVkdW1wLnNvY2tldCYjMzQ7KSk7CiYjNDM7CiYjNDM7CXJldCA9IHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsIGlwY19zb2NrZXRzKTsKJiM0MzsJQVNTRVJUX0VRKHJldCwgMCk7CiYjNDM7CiYjNDM7CXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBmb3JrKCk7CiYjNDM7CUFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTsKJiM0MzsJaWYgKHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPT0gMCkgewomIzQzOwkJaW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9wZWVyX3BpZGZkID0gLTE7CiYjNDM7CQlpbnQgZmRfdGhyZWFkX3BpZGZkID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xOwomIzQzOwkJc3RydWN0IHBpZGZkX2luZm8gdGhyZWFkX2luZm8gPSB7fTsKJiM0MzsJCWludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CiYjNDM7CiYjNDM7CQljbG9zZShpcGNfc29ja2V0c1swXSk7CiYjNDM7CiYjNDM7CQlmZF9zZXJ2ZXIgPSBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldCgmIzM0Oy90bXAvY29yZWR1bXAuc29ja2V0JiMzNDspOwomIzQzOwkJaWYgKGZkX3NlcnZlciAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBsaXN0ZW4gc29ja2V0IGZhaWxlZDogJW1cbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICh3cml0ZV9ub2ludHIoaXBjX3NvY2tldHNbMV0sICYjMzQ7MSYjMzQ7LCAxKSAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBpcGMgd3JpdGUgZmFpbGVkOiAlbVxuJiMzNDspOwomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwkJfQomIzQzOwomIzQzOwkJY2xvc2UoaXBjX3NvY2tldHNbMV0pOwomIzQzOwomIzQzOwkJZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTsKJiM0MzsJCWlmIChmZF9jb3JlZHVtcCAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBhY2NlcHQ0IGZhaWxlZDogJW1cbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZkX3BlZXJfcGlkZmQgPSBnZXRfcGVlcl9waWRmZChmZF9jb3JlZHVtcCk7CiYjNDM7CQlpZiAoZmRfcGVlcl9waWRmZCAmbHQ7IDApIHsKJiM0MzsJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBnZXRfcGVlcl9waWRmZCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWZkX3RocmVhZF9waWRmZCA9IGdldF9wZWVyX3BpZGZkX3RocmVhZChmZF9jb3JlZHVtcCk7CiYjNDM7CQlpZiAoZmRfdGhyZWFkX3BpZGZkICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGdldF9wZWVyX3BpZGZkX3RocmVhZCBmYWlsZWRcbiYjMzQ7KTsKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJCX0KJiM0MzsKJiM0MzsJCWlmICghZ2V0X3BpZGZkX2luZm8oZmRfcGVlcl9waWRmZCwgJmFtcDtpbmZvKSB8fAomIzQzOwkJICAgICFnZXRfcGlkZmRfaW5mbyhmZF90aHJlYWRfcGlkZmQsICZhbXA7dGhyZWFkX2luZm8pKSB7CiYjNDM7CQkJZnByaW50ZihzdGRlcnIsICYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXG4mIzM0Oyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQkvKiBUaGUgcGVlciBpcyB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlciwgdGhlIGR1bXBpbmcgdGhyZWFkIGlzIG5vdC4gKi8KJiM0MzsJCWlmIChpbmZvLnBpZCAhPSBpbmZvLnRnaWQgfHwgdGhyZWFkX2luZm8udGdpZCAhPSBpbmZvLnRnaWQgfHwKJiM0MzsJCSAgICB0aHJlYWRfaW5mby5waWQgPT0gdGhyZWFkX2luZm8udGdpZCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IHVuZXhwZWN0ZWQgaWRzICVkLyVkIGFuZCAlZC8lZFxuJiMzNDssCiYjNDM7CQkJCWluZm8ucGlkLCBpbmZvLnRnaWQsIHRocmVhZF9pbmZvLnBpZCwgdGhyZWFkX2luZm8udGdpZCk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlpZiAoIWNoZWNrX2NvcmVkdW1wX2luZm8oJmFtcDtpbmZvLCAmIzM0O1NPX1BFRVJQSURGRCYjMzQ7KSB8fAomIzQzOwkJICAgICFjaGVja19jb3JlZHVtcF9pbmZvKCZhbXA7dGhyZWFkX2luZm8sICYjMzQ7U09fUEVFUlBJREZEX1RIUkVBRCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJCWZkX2NvcmVfZmlsZSA9IG9wZW5fY29yZWR1bXBfdG1wZmlsZShzZWxmLSZndDtmZF90bXBmc19kZXRhY2hlZCk7CiYjNDM7CQlpZiAoZmRfY29yZV9maWxlICZsdDsgMCkgewomIzQzOwkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgdG1wZmlsZSBmYWlsZWQ6ICVtXG4mIzM0Oyk7CiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CQl9CiYjNDM7CiYjNDM7CQlmb3IgKDs7KSB7CiYjNDM7CQkJY2hhciBidWZmZXJbNDA5Nl07CiYjNDM7CQkJc3NpemVfdCBieXRlc19yZWFkLCBieXRlc193cml0ZTsKJiM0MzsKJiM0MzsJCQlieXRlc19yZWFkID0gcmVhZChmZF9jb3JlZHVtcCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CiYjNDM7CQkJaWYgKGJ5dGVzX3JlYWQgJmx0OyAwKSB7CiYjNDM7CQkJCWZwcmludGYoc3RkZXJyLCAmIzM0O3NvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgcmVhZCBmYWlsZWQ6ICVtXG4mIzM0Oyk7CiYjNDM7CQkJCWdvdG8gb3V0OwomIzQzOwkJCX0KJiM0MzsKJiM0MzsJCQlpZiAoYnl0ZXNfcmVhZCA9PSAwKQomIzQzOwkJCQlicmVhazsKJiM0MzsKJiM0MzsJCQlieXRlc193cml0ZSA9IHdyaXRlKGZkX2NvcmVfZmlsZSwgYnVmZmVyLCBieXRlc19yZWFkKTsKJiM0MzsJCQlpZiAoYnl0ZXNfcmVhZCAhPSBieXRlc193cml0ZSkgewomIzQzOwkJCQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBjb3JlIHdyaXRlICV6ZC8lemQ6ICVtXG4mIzM0OywKJiM0MzsJCQkJCWJ5dGVzX3JlYWQsIGJ5dGVzX3dyaXRlKTsKJiM0MzsJCQkJZ290byBvdXQ7CiYjNDM7CQkJfQomIzQzOwkJfQomIzQzOwomIzQzOwkJZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTOwomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7c29ja2V0X2NvcmVkdW1wX3RocmVhZDogY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuJiMzNDspOwomIzQzO291dDoKJiM0MzsJCWlmIChmZF9jb3JlX2ZpbGUgJmd0Oz0gMCkKJiM0MzsJCQljbG9zZShmZF9jb3JlX2ZpbGUpOwomIzQzOwkJaWYgKGZkX3RocmVhZF9waWRmZCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX3RocmVhZF9waWRmZCk7CiYjNDM7CQlpZiAoZmRfcGVlcl9waWRmZCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX3BlZXJfcGlkZmQpOwomIzQzOwkJaWYgKGZkX2NvcmVkdW1wICZndDs9IDApCiYjNDM7CQkJY2xvc2UoZmRfY29yZWR1bXApOwomIzQzOwkJaWYgKGZkX3NlcnZlciAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkX3NlcnZlcik7CiYjNDM7CQlfZXhpdChleGl0X2NvZGUpOwomIzQzOwl9CiYjNDM7CXNlbGYtJmd0O3BpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyOwomIzQzOwomIzQzOwlFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMV0pLCAwKTsKJiM0MzsJQVNTRVJUX0VRKHJlYWRfbm9pbnRyKGlwY19zb2NrZXRzWzBdLCAmYW1wO2MsIDEpLCAxKTsKJiM0MzsJRVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7CiYjNDM7CiYjNDM7CXBpZCA9IGZvcmsoKTsKJiM0MzsJQVNTRVJUX0dFKHBpZCwgMCk7CiYjNDM7CWlmIChwaWQgPT0gMCkKJiM0MzsJCWNyYXNoaW5nX2NoaWxkX3RocmVhZCgpOwomIzQzOwomIzQzOwlwaWRmZCA9IHN5c19waWRmZF9vcGVuKHBpZCwgMCk7CiYjNDM7CUFTU0VSVF9HRShwaWRmZCwgMCk7CiYjNDM7CiYjNDM7CXdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CUFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpOwomIzQzOwlBU1NFUlRfRVEoV1RFUk1TSUcoc3RhdHVzKSwgU0lHU0VHVik7CiYjNDM7CUFTU0VSVF9UUlVFKFdDT1JFRFVNUChzdGF0dXMpKTsKJiM0MzsKJiM0MzsJQVNTRVJUX1RSVUUoZ2V0X3BpZGZkX2luZm8ocGlkZmQsICZhbXA7aW5mbykpOwomIzQzOwlBU1NFUlRfVFJVRSghIShpbmZvLm1hc2sgJmFtcDsgUElERkRfSU5GT19DT1JFRFVNUCkpOwomIzQzOwlBU1NFUlRfVFJVRSghIShpbmZvLmNvcmVkdW1wX21hc2sgJmFtcDsgUElERkRfQ09SRURVTVBFRCkpOwomIzQzOwlBU1NFUlRfRVEoaW5mby5jb3JlZHVtcF9zaWduYWwsIFNJR1NFR1YpOwomIzQzOwomIzQzOwl3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTsKJiM0Mzt9CiYjNDM7CiAvKgogICogVGVzdDogUElERkRfSU5GT19DT1JFRFVNUF9TSUdOQUwgdmlhIHNpbXBsZSBzb2NrZXQgY29yZWR1bXAgd2l0aCBTSUdBQlJUCiAgKgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oCmluZGV4IGVkNDdmMDFmYTUzYzUuLjQyMTI2NTZlMzFmMDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmgKQEAgLTI3LDEwICYjNDM7MjcsMTIgQEAgRklYVFVSRShjb3JlZHVtcCkKIC8qIFNoYXJlZCBoZWxwZXIgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCiB2b2lkICpkb19ub3RoaW5nKHZvaWQgKmFyZyk7CiB2b2lkIGNyYXNoaW5nX2NoaWxkKHZvaWQpOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfdGhyZWFkKHZvaWQpOwogaW50IGNyZWF0ZV9kZXRhY2hlZF90bXBmcyh2b2lkKTsKIGludCBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChjb25zdCBjaGFyICpwYXRoKTsKIGJvb2wgc2V0X2NvcmVfcGF0dGVybihjb25zdCBjaGFyICpwYXR0ZXJuKTsKIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpOwomIzQzO2ludCBnZXRfcGVlcl9waWRmZF90aHJlYWQoaW50IGZkKTsKIGJvb2wgZ2V0X3BpZGZkX2luZm8oaW50IGZkX3BlZXJfcGlkZmQsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKTsKIAogLyogSW5saW5lIGhlbHBlciB0aGF0IHVzZXMgaGFybmVzcyB0eXBlcyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwppbmRleCAyYTIwZmFmOWNiMGFkLi4zNjMwNjA2OWY2MmU1IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYwpAQCAtMTMsNiAmIzQzOzEzLDcgQEAKICNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvZXBvbGwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL21tYW4uaCZndDsKICNpbmNsdWRlICZsdDtzeXMvc29ja2V0LmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3R5cGVzLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3lzL3VuLmgmZ3Q7CkBAIC0zOCw2ICYjNDM7MzksMTAgQEAgc3RydWN0IF9maXh0dXJlX2NvcmVkdW1wX2RhdGEgewogCiAjZGVmaW5lIE5VTV9USFJFQURfU1BBV04gMTI4CiAKJiM0MzsjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQUQKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgODcKJiM0MzsjZW5kaWYKJiM0MzsKIHZvaWQgKmRvX25vdGhpbmcodm9pZCAqYXJnKQogewogCSh2b2lkKWFyZzsKQEAgLTU5LDYgJiM0Mzs2NCwzNiBAQCB2b2lkIGNyYXNoaW5nX2NoaWxkKHZvaWQpCiAJaSA9ICoodm9sYXRpbGUgaW50ICopTlVMTDsKIH0KIAomIzQzO3N0YXRpYyB2b2lkICpjcmFzaGluZ190aHJlYWQodm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50ICpwOwomIzQzOwomIzQzOwkodm9pZClhcmc7CiYjNDM7CiYjNDM7CS8qIGNyYXNoIG9uIHB1cnBvc2Ugd2l0aCBTRUdWX01BUEVSUiAqLwomIzQzOwlwID0gbW1hcChOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiYjNDM7CQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7CiYjNDM7CWlmIChwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJbXVubWFwKHAsIFBBR0VfU0laRSk7CiYjNDM7CSpwID0gMDsKJiM0MzsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3ZvaWQgY3Jhc2hpbmdfY2hpbGRfdGhyZWFkKHZvaWQpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IE5VTV9USFJFQURfU1BBV047ICYjNDM7JiM0MztpKQomIzQzOwkJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpOwomIzQzOwomIzQzOwkvKiBjcmFzaCBmcm9tIGEgbm9uLWxlYWRlciB0aHJlYWQgKi8KJiM0MzsJcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIE5VTEwsIGNyYXNoaW5nX3RocmVhZCwgTlVMTCk7CiYjNDM7CXBhdXNlKCk7CiYjNDM7fQomIzQzOwogaW50IGNyZWF0ZV9kZXRhY2hlZF90bXBmcyh2b2lkKQogewogCWludCBmZF9jb250ZXh0LCBmZF90bXBmczsKQEAgLTEzOCw2ICYjNDM7MTczLDIwIEBAIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpCiAJcmV0dXJuIGZkX3BlZXJfcGlkZmQ7CiB9CiAKJiM0MztpbnQgZ2V0X3BlZXJfcGlkZmRfdGhyZWFkKGludCBmZCkKJiM0Mzt7CiYjNDM7CWludCBmZF9wZWVyX3BpZGZkOwomIzQzOwlzb2NrbGVuX3QgZmRfcGVlcl9waWRmZF9sZW4gPSBzaXplb2YoZmRfcGVlcl9waWRmZCk7CiYjNDM7CWludCByZXQgPSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19QRUVSUElERkRfVEhSRUFELCAmYW1wO2ZkX3BlZXJfcGlkZmQsCiYjNDM7CQkJICAgICAmYW1wO2ZkX3BlZXJfcGlkZmRfbGVuKTsKJiM0MzsJaWYgKHJldCAmbHQ7IDApIHsKJiM0MzsJCWZwcmludGYoc3RkZXJyLCAmIzM0OyVzOiBnZXRzb2Nrb3B0KFNPX1BFRVJQSURGRF9USFJFQUQpIGZhaWxlZDogJW1cbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsJZnByaW50ZihzdGRlcnIsICYjMzQ7JXM6IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGlkZmQgJWRcbiYjMzQ7LCBfX2Z1bmNfXywgZmRfcGVlcl9waWRmZCk7CiYjNDM7CXJldHVybiBmZF9wZWVyX3BpZGZkOwomIzQzO30KJiM0MzsKIGJvb2wgZ2V0X3BpZGZkX2luZm8oaW50IGZkX3BlZXJfcGlkZmQsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKQogewogCWludCByZXQ7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlCmluZGV4IGE2NmYxMGZiMGMyMzEuLjQ1Yjg0MTc1OGYxYmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlCkBAIC0yMyw2ICYjNDM7MjMsOCBAQCBURVNUX0dFTl9GSUxFUyA6PSBzY21fcmlnaHRzX2RlbmlhbF9sc20uYnBmLm8KIGluY2x1ZGUgLi4vLi4vbGliLm1rCiBpbmNsdWRlIC4uL2JwZi5tawogCiYjNDM7JChPVVRQVVQpL3NjbV9waWRmZDogQ0ZMQUdTICYjNDM7PSAtcHRocmVhZAomIzQzOwogJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogJChCUEZPQkopCiAkKE9VVFBVVCkvc2NtX3JpZ2h0c19kZW5pYWxfbHNtOiBDRkxBR1MgJiM0Mzs9IC1JJChTQ1JBVENIX0RJUikvaW5jbHVkZQogJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogTERMSUJTICYjNDM7PSAtbGVsZiAtbHoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L3NjbV9waWRmZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmMKaW5kZXggMmMxOGI5MmEyNjAzNS4uYmJiZDVlN2I0ZmE3OCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmMKQEAgLTEwLDYgJiM0MzsxMCw3IEBACiAjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7ZXJybm8uaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7cHRocmVhZC5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy91bi5oJmd0OwogI2luY2x1ZGUgJmx0O3N5cy9zaWduYWwuaCZndDsKICNpbmNsdWRlICZsdDtzeXMvdHlwZXMuaCZndDsKQEAgLTI3LDYgJiM0MzsyOCwxNCBAQAogI2RlZmluZSBTQ01fUElERkQgMHgwNAogI2VuZGlmCiAKJiM0MzsjaWZuZGVmIFNPX1BBU1NQSURGRF9USFJFQUQKJiM0MzsjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgODYKJiM0MzsjZW5kaWYKJiM0MzsKJiM0MzsjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQUQKJiM0MzsjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgODcKJiM0MzsjZW5kaWYKJiM0MzsKICNkZWZpbmUgQ0hJTERfRVhJVF9DT0RFX09LIDEyMwogCiBzdGF0aWMgdm9pZCBjaGlsZF9kaWUoKQpAQCAtNTUzLDQgJiM0Mzs1NjIsMzYxIEBAIFRFU1RfRihzY21fcGlkZmQsIHRlc3QpCiAJY2xvc2UocGZkKTsKIH0KIAomIzQzO3N0cnVjdCB0aHJlYWRfaWRzIHsKJiM0MzsJcGlkX3QgcGlkOwomIzQzOwlwaWRfdCB0aWQ7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdm9pZCAqc2VuZF9pZHNfdGhyZWFkKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CWludCBmZCA9ICooaW50ICopYXJnOwomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7CiYjNDM7CQkucGlkID0gZ2V0cGlkKCksCiYjNDM7CQkudGlkID0gZ2V0dGlkKCksCiYjNDM7CX07CiYjNDM7CWNoYXIgc3luYzsKJiM0MzsKJiM0MzsJaWYgKHNlbmQoZmQsICZhbXA7aWRzLCBzaXplb2YoaWRzKSwgMCkgIT0gc2l6ZW9mKGlkcykpCiYjNDM7CQlyZXR1cm4gKHZvaWQgKikxOwomIzQzOwomIzQzOwkvKiBzdGF5IGFsaXZlIHVudGlsIHRoZSByZWNlaXZlciBoYXMgbG9va2VkIGF0IG91ciBwaWRmZCAqLwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtzeW5jLCAxKSAhPSAxKQomIzQzOwkJcmV0dXJuICh2b2lkICopMTsKJiM0MzsKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpzZW5kX2lkc19jcmVkc190aHJlYWQodm9pZCAqYXJnKQomIzQzO3sKJiM0MzsJaW50IGZkID0gKihpbnQgKilhcmc7CiYjNDM7CXN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHsKJiM0MzsJCS5waWQgPSBnZXRwaWQoKSwKJiM0MzsJCS50aWQgPSBnZXR0aWQoKSwKJiM0MzsJfTsKJiM0MzsJc3RydWN0IHVjcmVkIHVjcmVkID0gewomIzQzOwkJLnBpZCA9IGdldHBpZCgpLAomIzQzOwkJLnVpZCA9IGdldHVpZCgpLAomIzQzOwkJLmdpZCA9IGdldGdpZCgpLAomIzQzOwl9OwomIzQzOwljaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YodWNyZWQpKV0gPSB7IDAgfTsKJiM0MzsJc3RydWN0IGlvdmVjIGlvdjsKJiM0MzsJc3RydWN0IG1zZ2hkciBtc2cgPSB7IDAgfTsKJiM0MzsJc3RydWN0IGNtc2doZHIgKmNtc2c7CiYjNDM7CWNoYXIgc3luYzsKJiM0MzsKJiM0MzsJaW92Lmlvdl9iYXNlID0gJmFtcDtpZHM7CiYjNDM7CWlvdi5pb3ZfbGVuID0gc2l6ZW9mKGlkcyk7CiYjNDM7CiYjNDM7CW1zZy5tc2dfaW92ID0gJmFtcDtpb3Y7CiYjNDM7CW1zZy5tc2dfaW92bGVuID0gMTsKJiM0MzsJbXNnLm1zZ19jb250cm9sID0gY29udHJvbDsKJiM0MzsJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNvbnRyb2wpOwomIzQzOwomIzQzOwljbXNnID0gQ01TR19GSVJTVEhEUigmYW1wO21zZyk7CiYjNDM7CWNtc2ctJmd0O2Ntc2dfbGV2ZWwgPSBTT0xfU09DS0VUOwomIzQzOwljbXNnLSZndDtjbXNnX3R5cGUgPSBTQ01fQ1JFREVOVElBTFM7CiYjNDM7CWNtc2ctJmd0O2Ntc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHVjcmVkKSk7CiYjNDM7CW1lbWNweShDTVNHX0RBVEEoY21zZyksICZhbXA7dWNyZWQsIHNpemVvZih1Y3JlZCkpOwomIzQzOwomIzQzOwlpZiAoc2VuZG1zZyhmZCwgJmFtcDttc2csIDApICE9IHNpemVvZihpZHMpKQomIzQzOwkJcmV0dXJuICh2b2lkICopMTsKJiM0MzsKJiM0MzsJaWYgKHJlYWQoZmQsICZhbXA7c3luYywgMSkgIT0gMSkKJiM0MzsJCXJldHVybiAodm9pZCAqKTE7CiYjNDM7CiYjNDM7CXJldHVybiBOVUxMOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCB0aHJlYWRfY2xpZW50KGludCBmZCwgaW50IHN5bmNmZCwgdm9pZCAqKCpzZW5kZXIpKHZvaWQgKikpCiYjNDM7ewomIzQzOwlwdGhyZWFkX3QgdGhyZWFkOwomIzQzOwl2b2lkICpyZXQ7CiYjNDM7CWNoYXIgc3luYzsKJiM0MzsKJiM0MzsJLyogd2FpdCB1bnRpbCB0aGUgcmVjZWl2ZXIgZW5hYmxlZCBTT19QQVNTUElERkQgKi8KJiM0MzsJaWYgKHJlYWQoc3luY2ZkLCAmYW1wO3N5bmMsIDEpICE9IDEpCiYjNDM7CQljaGlsZF9kaWUoKTsKJiM0MzsKJiM0MzsJaWYgKHB0aHJlYWRfY3JlYXRlKCZhbXA7dGhyZWFkLCBOVUxMLCBzZW5kZXIsICZhbXA7ZmQpKQomIzQzOwkJY2hpbGRfZGllKCk7CiYjNDM7CiYjNDM7CWlmIChwdGhyZWFkX2pvaW4odGhyZWFkLCAmYW1wO3JldCkgfHwgcmV0KQomIzQzOwkJY2hpbGRfZGllKCk7CiYjNDM7CiYjNDM7CWV4aXQoMCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVjdl9waWRmZChpbnQgZmQsIHN0cnVjdCB0aHJlYWRfaWRzICppZHMpCiYjNDM7ewomIzQzOwljaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YoaW50KSldID0geyAwIH07CiYjNDM7CXN0cnVjdCBpb3ZlYyBpb3Y7CiYjNDM7CXN0cnVjdCBtc2doZHIgbXNnID0geyAwIH07CiYjNDM7CXN0cnVjdCBjbXNnaGRyICpjbXNnOwomIzQzOwlpbnQgcGlkZmQgPSAtMTsKJiM0MzsKJiM0MzsJaW92Lmlvdl9iYXNlID0gaWRzOwomIzQzOwlpb3YuaW92X2xlbiA9IHNpemVvZigqaWRzKTsKJiM0MzsKJiM0MzsJbXNnLm1zZ19pb3YgPSAmYW1wO2lvdjsKJiM0MzsJbXNnLm1zZ19pb3ZsZW4gPSAxOwomIzQzOwltc2cubXNnX2NvbnRyb2wgPSBjb250cm9sOwomIzQzOwltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbCk7CiYjNDM7CiYjNDM7CWlmIChyZWN2bXNnKGZkLCAmYW1wO21zZywgMCkgIT0gc2l6ZW9mKCppZHMpKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7cmVjdm1zZyYjMzQ7KTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAobXNnLm1zZ19mbGFncyAmYW1wOyAoTVNHX1RSVU5DIHwgTVNHX0NUUlVOQykpIHsKJiM0MzsJCWxvZ19lcnIoJiMzNDtyZWN2bXNnOiB0cnVuY2F0ZWQmIzM0Oyk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUigmYW1wO21zZyk7IGNtc2cgIT0gTlVMTDsKJiM0MzsJICAgICBjbXNnID0gQ01TR19OWFRIRFIoJmFtcDttc2csIGNtc2cpKSB7CiYjNDM7CQlpZiAoY21zZy0mZ3Q7Y21zZ19sZXZlbCA9PSBTT0xfU09DS0VUICZhbXA7JmFtcDsKJiM0MzsJCSAgICBjbXNnLSZndDtjbXNnX3R5cGUgPT0gU0NNX1BJREZEKQomIzQzOwkJCW1lbWNweSgmYW1wO3BpZGZkLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZihwaWRmZCkpOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiBwaWRmZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB0aHJlYWRfcGlkZmRfZmxvdyh2b2lkICooKnNlbmRlcikodm9pZCAqKSwgaW50IG9wdG5hbWUsCiYjNDM7CQkJICAgICBzdHJ1Y3QgdGhyZWFkX2lkcyAqaWRzLCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbykKJiM0Mzt7CiYjNDM7CWludCBza1syXTsKJiM0MzsJaW50IHN5bmNwaXBlWzJdOwomIzQzOwlpbnQgcGlkZmQ7CiYjNDM7CWludCBjaGlsZF9zdGF0dXMgPSAwOwomIzQzOwlwaWRfdCBjaGlsZDsKJiM0MzsKJiM0MzsJaWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNrKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJaWYgKHBpcGUoc3luY3BpcGUpKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwljaGlsZCA9IGZvcmsoKTsKJiM0MzsJaWYgKGNoaWxkICZsdDsgMCkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJaWYgKGNoaWxkID09IDApIHsKJiM0MzsJCWNsb3NlKHNrWzBdKTsKJiM0MzsJCWNsb3NlKHN5bmNwaXBlWzFdKTsKJiM0MzsJCXRocmVhZF9jbGllbnQoc2tbMV0sIHN5bmNwaXBlWzBdLCBzZW5kZXIpOwomIzQzOwl9CiYjNDM7CWNsb3NlKHNrWzFdKTsKJiM0MzsJY2xvc2Uoc3luY3BpcGVbMF0pOwomIzQzOwomIzQzOwlpbnQgb24gPSAxOwomIzQzOwomIzQzOwlpZiAoc2V0c29ja29wdChza1swXSwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgJmFtcDtvbiwgc2l6ZW9mKG9uKSkpIHsKJiM0MzsJCWxvZ19lcnIoJiMzNDtGYWlsZWQgdG8gc2V0IHBpZGZkIHBhc3Npbmcgb3B0aW9uJiMzNDspOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmICh3cml0ZShzeW5jcGlwZVsxXSwgJiMzNDsxJiMzNDssIDEpICE9IDEpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CWNsb3NlKHN5bmNwaXBlWzFdKTsKJiM0MzsKJiM0MzsJcGlkZmQgPSByZWN2X3BpZGZkKHNrWzBdLCBpZHMpOwomIzQzOwlpZiAocGlkZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlpbmZvLSZndDttYXNrID0gUElERkRfSU5GT19QSUQ7CiYjNDM7CWlmIChpb2N0bChwaWRmZCwgUElERkRfR0VUX0lORk8sIGluZm8pKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7aW9jdGwoUElERkRfR0VUX0lORk8pJiMzNDspOwomIzQzOwkJY2xvc2UocGlkZmQpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CWNsb3NlKHBpZGZkKTsKJiM0MzsKJiM0MzsJLyogcmVsZWFzZSB0aGUgc2VuZGluZyB0aHJlYWQgKi8KJiM0MzsJaWYgKHdyaXRlKHNrWzBdLCAmIzM0O3gmIzM0OywgMSkgIT0gMSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJY2xvc2Uoc2tbMF0pOwomIzQzOwomIzQzOwl3YWl0cGlkKGNoaWxkLCAmYW1wO2NoaWxkX3N0YXR1cywgMCk7CiYjNDM7CWlmICghV0lGRVhJVEVEKGNoaWxkX3N0YXR1cykgfHwgV0VYSVRTVEFUVVMoY2hpbGRfc3RhdHVzKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc29ja29wdF9zZXQoaW50IGZkLCBpbnQgb3B0bmFtZSwgaW50IHZhbCkKJiM0Mzt7CiYjNDM7CXJldHVybiBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBvcHRuYW1lLCAmYW1wO3ZhbCwgc2l6ZW9mKHZhbCkpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHNvY2tvcHRfZ2V0KGludCBmZCwgaW50IG9wdG5hbWUpCiYjNDM7ewomIzQzOwlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKGludCk7CiYjNDM7CWludCB2YWwgPSAtMTsKJiM0MzsKJiM0MzsJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIG9wdG5hbWUsICZhbXA7dmFsLCAmYW1wO2xlbikpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldHVybiB2YWw7CiYjNDM7fQomIzQzOwomIzQzO1RFU1Qoc2NtX3BpZGZkX3NldHNvY2tvcHRfdmFsdWVzKQomIzQzO3sKJiM0MzsJaW50IHNrWzJdOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2spKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFELCAxKSk7CiYjNDM7CUFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpOwomIzQzOwomIzQzOwkvKiBUaGUgb3B0aW9uIHNldCBsYXN0IHdpbnMuICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZELCAxKSk7CiYjNDM7CUFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQsIDEpKTsKJiM0MzsJQVNTRVJUX0VRKDEsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7CiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEKSk7CiYjNDM7CiYjNDM7CS8qIERpc2FibGluZyBvbmUgb3B0aW9uIGxlYXZlcyB0aGUgb3RoZXIgYWxvbmUuICovCiYjNDM7CUFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZELCAwKSk7CiYjNDM7CUFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpOwomIzQzOwlBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQsIDApKTsKJiM0MzsJQVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkQpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7CiYjNDM7CiYjNDM7CWNsb3NlKHNrWzBdKTsKJiM0MzsJY2xvc2Uoc2tbMV0pOwomIzQzO30KJiM0MzsKJiM0MztURVNUKHNjbV9waWRmZF90aHJlYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7CiYjNDM7CXN0cnVjdCBwaWRmZF9pbmZvIGluZm87CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsCiYjNDM7CQkJCSAgICAgICAmYW1wO2lkcywgJmFtcDtpbmZvKSk7CiYjNDM7CUFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy50aWQsIGluZm8ucGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7CiYjNDM7fQomIzQzOwomIzQzO1RFU1Qoc2NtX3BpZGZkX3RocmVhZF9ncm91cCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB0aHJlYWRfaWRzIGlkczsKJiM0MzsJc3RydWN0IHBpZGZkX2luZm8gaW5mbzsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHRocmVhZF9waWRmZF9mbG93KHNlbmRfaWRzX3RocmVhZCwgU09fUEFTU1BJREZELAomIzQzOwkJCQkgICAgICAgJmFtcDtpZHMsICZhbXA7aW5mbykpOwomIzQzOwlBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7CiYjNDM7CUVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnBpZCk7CiYjNDM7CUVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpOwomIzQzO30KJiM0MzsKJiM0MztURVNUKHNjbV9waWRmZF90aHJlYWRfY3JlZHMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7CiYjNDM7CXN0cnVjdCBwaWRmZF9pbmZvIGluZm87CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc19jcmVkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsCiYjNDM7CQkJCSAgICAgICAmYW1wO2lkcywgJmFtcDtpbmZvKSk7CiYjNDM7CUFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy50aWQsIGluZm8ucGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkICpwZWVyX2Nvbm5lY3RfdGhyZWFkKHZvaWQgKmFyZykKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzb2NrX2FkZHIgKnNhID0gYXJnOwomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7CiYjNDM7CQkucGlkID0gZ2V0cGlkKCksCiYjNDM7CQkudGlkID0gZ2V0dGlkKCksCiYjNDM7CX07CiYjNDM7CWludCBmZDsKJiM0MzsJY2hhciBzeW5jOwomIzQzOwomIzQzOwlmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7CiYjNDM7CWlmIChmZCAmbHQ7IDApCiYjNDM7CQlyZXR1cm4gKHZvaWQgKikxOwomIzQzOwomIzQzOwlpZiAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhbXA7c2EtJmd0O2xpc3Rlbl9hZGRyLCBzYS0mZ3Q7YWRkcmxlbikpCiYjNDM7CQlyZXR1cm4gKHZvaWQgKikxOwomIzQzOwomIzQzOwlpZiAoc2VuZChmZCwgJmFtcDtpZHMsIHNpemVvZihpZHMpLCAwKSAhPSBzaXplb2YoaWRzKSkKJiM0MzsJCXJldHVybiAodm9pZCAqKTE7CiYjNDM7CiYjNDM7CS8qIHN0YXkgYWxpdmUgdW50aWwgdGhlIHNlcnZlciBoYXMgbG9va2VkIGF0IG91ciBwaWRmZCAqLwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDtzeW5jLCAxKSAhPSAxKQomIzQzOwkJcmV0dXJuICh2b2lkICopMTsKJiM0MzsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwlyZXR1cm4gTlVMTDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBwZWVyX3BpZGZkX2luZm8oaW50IGZkLCBpbnQgb3B0bmFtZSwgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pCiYjNDM7ewomIzQzOwlpbnQgcGlkZmQ7CiYjNDM7CXNvY2tsZW5fdCBsZW4gPSBzaXplb2YocGlkZmQpOwomIzQzOwomIzQzOwlpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgJmFtcDtwaWRmZCwgJmFtcDtsZW4pKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7Z2V0c29ja29wdChTT19QRUVSUElERkQqKSYjMzQ7KTsKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJfQomIzQzOwomIzQzOwlpbmZvLSZndDttYXNrID0gUElERkRfSU5GT19QSUQ7CiYjNDM7CWlmIChpb2N0bChwaWRmZCwgUElERkRfR0VUX0lORk8sIGluZm8pKSB7CiYjNDM7CQlsb2dfZXJyKCYjMzQ7aW9jdGwoUElERkRfR0VUX0lORk8pJiMzNDspOwomIzQzOwkJY2xvc2UocGlkZmQpOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CWNsb3NlKHBpZGZkKTsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmV0dXJucyBhIHBpZGZkIGZvciB0aGUgcGVlciYjMzk7cyBjb25uZWN0aW5nIHRocmVhZC4gKi8KJiM0MztURVNUKHNvX3BlZXJwaWRmZF90aHJlYWQpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgc29ja19hZGRyIHNhOwomIzQzOwlzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7CiYjNDM7CXN0cnVjdCBwaWRmZF9pbmZvIGluZm87CiYjNDM7CXB0aHJlYWRfdCB0aHJlYWQ7CiYjNDM7CXZvaWQgKnRyZXQ7CiYjNDM7CWludCBzZXJ2ZXIsIGNmZDsKJiM0MzsKJiM0MzsJc2VydmVyID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKJiM0MzsJQVNTRVJUX0xFKDAsIHNlcnZlcik7CiYjNDM7CiYjNDM7CWZpbGxfc29ja2FkZHIoJmFtcDtzYSwgdHJ1ZSk7CiYjNDM7CUFTU0VSVF9FUSgwLCBiaW5kKHNlcnZlciwgKHN0cnVjdCBzb2NrYWRkciAqKSZhbXA7c2EubGlzdGVuX2FkZHIsIHNhLmFkZHJsZW4pKTsKJiM0MzsJQVNTRVJUX0VRKDAsIGxpc3RlbihzZXJ2ZXIsIDEpKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKDAsIHB0aHJlYWRfY3JlYXRlKCZhbXA7dGhyZWFkLCBOVUxMLCBwZWVyX2Nvbm5lY3RfdGhyZWFkLCAmYW1wO3NhKSk7CiYjNDM7CiYjNDM7CWNmZCA9IGFjY2VwdChzZXJ2ZXIsIE5VTEwsIE5VTEwpOwomIzQzOwlBU1NFUlRfTEUoMCwgY2ZkKTsKJiM0MzsKJiM0MzsJQVNTRVJUX0VRKHNpemVvZihpZHMpLCByZWN2KGNmZCwgJmFtcDtpZHMsIHNpemVvZihpZHMpLCBNU0dfV0FJVEFMTCkpOwomIzQzOwlBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7CiYjNDM7CiYjNDM7CS8qIFNPX1BFRVJQSURGRCByZWZlcnMgdG8gdGhlIHBlZXImIzM5O3MgdGhyZWFkLWdyb3VwLiAqLwomIzQzOwlBU1NFUlRfRVEoMCwgcGVlcl9waWRmZF9pbmZvKGNmZCwgU09fUEVFUlBJREZELCAmYW1wO2luZm8pKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8ucGlkKTsKJiM0MzsJRVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7CiYjNDM7CiYjNDM7CS8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmVmZXJzIHRvIHRoZSBjb25uZWN0aW5nIHRocmVhZC4gKi8KJiM0MzsJQVNTRVJUX0VRKDAsIHBlZXJfcGlkZmRfaW5mbyhjZmQsIFNPX1BFRVJQSURGRF9USFJFQUQsICZhbXA7aW5mbykpOwomIzQzOwlFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpOwomIzQzOwlFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTsKJiM0MzsKJiM0MzsJLyogcmVsZWFzZSB0aGUgY29ubmVjdGluZyB0aHJlYWQgKi8KJiM0MzsJQVNTRVJUX0VRKDEsIHdyaXRlKGNmZCwgJiMzNDt4JiMzNDssIDEpKTsKJiM0MzsJQVNTRVJUX0VRKDAsIHB0aHJlYWRfam9pbih0aHJlYWQsICZhbXA7dHJldCkpOwomIzQzOwlBU1NFUlRfRVEoTlVMTCwgdHJldCk7CiYjNDM7CiYjNDM7CWNsb3NlKGNmZCk7CiYjNDM7CWNsb3NlKHNlcnZlcik7CiYjNDM7fQomIzQzOwogVEVTVF9IQVJORVNTX01BSU4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyODYzCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogNzc5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgUGF0Y2ggZm9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IFJpc2tzKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCBpZiBpdCBpbnRyb2R1Y2VzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBydW5uaW5nIEtNU0FOLiBNeSBmaXJzdCBzdGVwIGlzIHRvIHRob3JvdWdobHkgdW5kZXJzdGFuZCBleGFjdGx5IHdoYXQgdGhpcyBwYXRjaCBpcyBkb2luZy4KCkFscmlnaHQsIHNvIGl0JiMzOTtzIGFkZGluZyBgU09fUEFTU1BJREZEX1RIUkVBRGAgYW5kIGBTT19QRUVSUElERkRfVEhSRUFEYCBzb2NrZXQgb3B0aW9ucy4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBib3RoIGluIHRoZSB1YXBpIGhlYWRlcnMgYW5kIGFzbSBoZWFkZXJzLiBJdCYjMzk7cyBhbHNvIHVwZGF0aW5nIHNldmVyYWwga2V5IHN0cnVjdHVyZXM6IGBjb3JlZHVtcF9wYXJhbXNgLCBgc2NtX2Nvb2tpZWAsIGBzb2NrYCwgYHVuaXhfcGVlcmNyZWRgLCBhbmQgYHVuaXhfc2tiX3Bhcm1zYC4gSXQgYXBwZWFycyB0aGF0IHRoZXNlIHN0cnVjdHVyZXMgYXJlIGJlaW5nIG1vZGlmaWVkIHRvIHN0b3JlIGFycmF5cyBvZiBgc3RydWN0IHBpZCAqYCwgaW5kZXhlZCBieSBQSUQgdHlwZSwgdXNpbmcgYERFQ0xBUkVfUElEU2AgbWFjcm8sIHVzaW5nIHRoZSBuZXcgYFBJRFRZUEVfVEdJRGAgdHlwZS4KClRoZW4gdGhlcmUgYXJlIG5ldyBoZWxwZXIgZnVuY3Rpb25zIGluIGBpbmNsdWRlL2xpbnV4L3BpZC5oYCBhbmQgYGluY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhgLiAgV2UgaGF2ZSBgREVDTEFSRV9QSURTYCwgd2hpY2ggZXhwYW5kcyB0byBhIGBzdHJ1Y3QgcGlkICpuYW1lWy4uLiBdYCBhcnJheSwgYW5kIGZ1bmN0aW9ucyBsaWtlIGBfX2dldF9waWRzYCwgYF9fcHV0X3BpZHNgLCBgX19zd2FwX3BpZHNgLCBgX19waWRzX2VxdWFsYCwgYF9fdGFza19waWRzYCwgYF9fZ2V0X3Rhc2tfcGlkc2AsIGFuZCBgX19waWRmc19yZWdpc3Rlcl9waWRzYC4gIEludGVyZXN0aW5nLiBMZXQmIzM5O3Mgc2VlIGhvdyB0aGVzZSBhcmUgdXNlZC4KCkxvb2tpbmcgYXQgdGhlIHNvY2tldCBvcHRpb24gdXBkYXRlcyBpbiBgbmV0L2NvcmUvc29jay5jYCwgYFNPX1BBU1NQSURGRGAgYW5kIGBTT19QQVNTUElERkRfVEhSRUFEYCBhcmUgYmVpbmcgYWRkZWQgdG8gYHNrX3NldHNvY2tvcHRgIGFuZCBgc2tfZ2V0c29ja29wdGAuICBgU09fUEVFUlBJREZEYCBhbmQgYFNPX1BFRVJQSURGRF9USFJFQURgIGFyZSBpbiBgc2tfZ2V0c29ja29wdGAgdmlhIGhlbHBlciBmdW5jdGlvbnMuICBBbmQgYSBgbWVtc2V0YCBpcyBoYXBwZW5pbmcgdG8gYHNrLSZndDtza19wZWVyX3BpZGAgaW4gYHNvY2tfaW5pdF9kYXRhX3VpZGAuCgpGdXJ0aGVybW9yZSwgdGhlcmUgYXJlIHVwZGF0ZXMgZm9yIEFGX1VOSVgsIGZvY3VzaW5nIG9uIGBwcmVwYXJlX3BlZXJjcmVkYCwgYGluaXRfcGVlcmNyZWRgLCBgdXBkYXRlX3BlZXJjcmVkYCwgYGNvcHlfcGVlcmNyZWRgLCAgYW5kIGhlbHBlciBmdW5jdGlvbnMgYXJvdW5kIGBzY21gIHN0cnVjdHVyZXMuIEFGX0JMVUVUT09USCBhbHNvIHNlZXMgY2hhbmdlcywgcGFydGljdWxhcmx5IGluIGFsbG9jYXRpb24gYW5kIGNyZWRlbnRpYWwgY29weWluZzogYGJ0X3NvY2tfYWxsb2NgLCBgYnRfYWNjZXB0X2VucXVldWVgLCBgaGNpX3NvY2tfY29weV9jcmVkc2AsIGFuZCBgbDJjYXBfc29ja19nZXRfcGVlcl9waWRfY2JgLiBGaW5hbGx5LCB0aGVyZSBhcmUgY2hhbmdlcyByZWxhdGVkIHRvIGNvcmVkdW1wcyBhbmQgcGlkZnMsIHdpdGggbmV3IGZ1bmN0aW9ucyBsaWtlIGBjb3JlZHVtcF9wYXJzZWAsIGB1bWhfY29yZWR1bXBfc2V0dXBgLCBgY29yZWR1bXBfc29ja19jb25uZWN0YCwgYHBpZGZzX2NvcmVkdW1wYCwgYW5kIGBfX3BpZGZzX3JlZ2lzdGVyX3BpZHNgLgoKTm93LCB0aGUgY3JpdGljYWwgcGFydC4gV2UgbmVlZCB0byBtZXRpY3Vsb3VzbHkgc2NydXRpbml6ZSBldmVyeSBpbnN0YW5jZSB3aGVyZSBtZW1vcnkgaXMgYWxsb2NhdGVkLCByZWFkLCBjb3BpZWQgdG8gdXNlcnNwYWNlLCBvciBpbnZvbHZlZCBpbiBicmFuY2hpbmcgY29uZGl0aW9ucy4gIFRoZSBwcmltYXJ5IGNvbmNlcm4gaXMgZW5zdXJpbmcgdGhhdCB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyBuZXZlciByZWFkLCBlaXRoZXIgd2l0aGluIHRoZSBrZXJuZWwgb3IsIG1vcmUgaW1wb3J0YW50bHksIGxlYWtlZCB0byB1c2Vyc3BhY2UuCgpMZXQmIzM5O3MgYmVnaW4gd2l0aCBgREVDTEFSRV9QSURTYDogYERFQ0xBUkVfUElEUyhuYW1lLCBsYXN0KWAgZXhwYW5kcyB0byBgc3RydWN0IHBpZCAqbmFtZVsobGFzdCkgJiM0MzsgMSAmIzQzOyBCVUlMRF9CVUdfT05fWkVSTygobGFzdCkgJmd0Oz0gUElEVFlQRV9NQVgpXWAuIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoZSBhcnJheSBzaXplcy4gYGxhc3RgIGFwcGVhcnMgdG8gYmUgYFBJRFRZUEVfVEdJRGAuIExldCBtZSBwYXVzZSBhbmQgZG91YmxlLWNoZWNrIHRob3NlIGVudW0gdmFsdWVzIGluIGBwaWRfdHlwZXMuaGAsIGFuZCBgcGlkLmhgLiAgSSYjMzk7bGwgZ3JlcCBhbmQgcmVhZCB0aGUgaGVhZGVyIGZpbGVzIG5vdyB0byBiZSBzdXJlIG9mIHRoZSB2YWx1ZXMgdG8gYXNzZXNzIHBvdGVudGlhbCBvZmYtYnktb25lIGVycm9ycy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7ZW51bSBwaWRfdHlwZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmgmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9waWRfdHlwZXMuaC02LVxuaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaDo3OmVudW0gcGlkX3R5cGUge1xuaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaC04LVx0UElEVFlQRV9QSUQsXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI0NTEwCgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogMTUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6CgoqKkRpdmluZyBpbnRvIFBJRCBJbnRlcm5hbHMqKgoKT2theSwgdGltZSB0byBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIHRoZSBrZXJuZWwmIzM5O3MgUElEIG1hbmFnZW1lbnQuIExldCYjMzk7cyBzdGFydCBieSBjcmFja2luZyBvcGVuIGBpbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oYC4gVGhpcyBpcyB3aGVyZSB0aGUgY29yZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gcHJvY2VzcyBJRHMgYXJlIGxpa2VseSBob3VzZWQuIFVuZGVyc3RhbmRpbmcgdGhpcyBmaWxlIGlzIGZ1bmRhbWVudGFsLiBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUga2VybmVsIGFjdHVhbGx5ICpyZXByZXNlbnRzKiBhbmQgKnVzZXMqIFBJRHMgaW50ZXJuYWxseS4gSSYjMzk7bSBob3BpbmcgdG8gc2VlIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGBwaWRgIHR5cGUsIGFueSByZWxhdGVkIGZsYWdzLCBhbmQgdGhlIG92ZXJhbGwgYXBwcm9hY2ggdG8gUElEIGFsbG9jYXRpb24gYW5kIHVzYWdlLiBJIGV4cGVjdCB0byBzZWUgdGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrcyB0aGF0IHN1cHBvcnQgdGhlIHJlc3Qgb2YgdGhlIFBJRC1yZWxhdGVkIGNvZGUuIFRoaXMgd2lsbCBiZSB0aGUgZm91bmRhdGlvbiBmb3IgZmlndXJpbmcgb3V0IGhvdyB0aGUga2VybmVsIHRyYWNrcyBwcm9jZXNzZXMgYW5kIHJlbGF0ZXMgdGhlbSB0byB1c2Vyc3BhY2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9waWRfdHlwZXMuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXG4gICAyOlx0I2lmbmRlZiBfTElOVVhfUElEX1RZUEVTX0hcbiAgIDM6XHQjZGVmaW5lIF9MSU5VWF9QSURfVFlQRVNfSFxuICAgNDpcdFxuICAgNTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1aWxkX2J1Zy5oXHUwMDNlXG4gICA2Olx0XG4gICA3Olx0ZW51bSBwaWRfdHlwZSB7XG4gICA4Olx0XHRQSURUWVBFX1BJRCxcbiAgIDk6XHRcdFBJRFRZUEVfVEdJRCxcbiAgMTA6XHRcdFBJRFRZUEVfUEdJRCxcbiAgMTE6XHRcdFBJRFRZUEVfU0lELFxuICAxMjpcdFx0UElEVFlQRV9NQVgsXG4gIDEzOlx0fTtcbiAgMTQ6XHRcbiAgMTU6XHRzdHJ1Y3QgcGlkO1xuICAxNjpcdFxuICAxNzpcdC8qIEFuIGFycmF5IG9mIHN0cnVjdCBwaWQgaW5kZXhlZCBieSBwaWQgdHlwZSwgUElEVFlQRV9QSUQgdXAgdG8gQGxhc3QuICovXG4gIDE4Olx0I2RlZmluZSBERUNMQVJFX1BJRFMobmFtZSwgbGFzdClcdFx0XHRcdFx0XFxcbiAgMTk6XHRcdHN0cnVjdCBwaWQgKm5hbWVbKGxhc3QpICYjNDM7IDEgJiM0MzsgQlVJTERfQlVHX09OX1pFUk8oKGxhc3QpIFx1MDAzZT0gUElEVFlQRV9NQVgpXVxuICAyMDpcdFxuICAyMTpcdHN0cnVjdCBwaWRfbmFtZXNwYWNlO1xuICAyMjpcdGV4dGVybiBzdHJ1Y3QgcGlkX25hbWVzcGFjZSBpbml0X3BpZF9ucztcbiAgMjM6XHRcbiAgMjQ6XHQjZW5kaWYgLyogX0xJTlVYX1BJRF9UWVBFU19IICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI1MDYyCgkJCQkJCQlvdXRwdXQ6IDE5CgkJCQkJCQl0aG91Z2h0czogNDkxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkRpdmluZyBpbnRvIHNjbV9jb29raWUgSW5pdGlhbGl6YXRpb24gYW5kIFVzYWdlKioKCk9rYXksIGxldCYjMzk7cyB0YWtlIGEgbG9vayBhdCBob3cgYHN0cnVjdCBzY21fY29va2llYCBpcyBpbml0aWFsaXplZCBhbmQgdXNlZCB0aHJvdWdob3V0IHRoZSBjb2RlYmFzZS4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgZGV0YWlscyBvZiBob3cgdGhlIFBJRCBpbmZvcm1hdGlvbiBpcyBoYW5kbGVkLCBlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIHBvdGVudGlhbCByZWZlcmVuY2UgY291bnRpbmcgb3IgbGVha3MuIEkganVzdCBsb29rZWQgYXQgYG5ldC9jb3JlL3NjbS5jYCBhbmQgc2F3IGBzY21fcmVwbGFjZV9waWRgLiBIbW0sIGluIGBzY21fcmVwbGFjZV9waWRgLCBpdCBsb29rcyBsaWtlIHRoZXJlJiMzOTtzIHNvbWUga2luZCBvZiBQSUQgcmVnaXN0cmF0aW9uIHVzaW5nIGBwaWRmc19yZWdpc3Rlcl9waWRgLiBUaGUgY29tbWVudHMgc2F5ICYjMzQ7ZHJvcCBhbGwgcHJldmlvdXMgcmVmZXJlbmNlcywmIzM0OyB3aGljaCBtYWtlcyBtZSB3b25kZXIgaWYgdGhlcmUmIzM5O3MgYW4gZXhwbGljaXQgdW5yZWdpc3RyYXRpb24gb3IgcmVmY291bnQgZGVjcmVtZW50IGhhcHBlbmluZywgb3IgaWYgdGhlIHJlZ2lzdHJhdGlvbnMgdGhlbXNlbHZlcyBoYW5kbGUgcmVmZXJlbmNlIGNvdW50cy4gVGhhdCYjMzk7cyBhIHBvaW50IHRvIGludmVzdGlnYXRlIG1vcmUgY2xvc2VseSwgYmVjYXVzZSBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgaXMgZG9uZSBjb3JyZWN0bHkgdG8gYXZvaWQgbWVtb3J5IGNvcnJ1cHRpb24uCgpUaGVuIEkganVtcGVkIHRvIGBpbmNsdWRlL25ldC9zY20uaGAgdG8gbG9vayBhdCBgc2NtX3NldF9jcmVkYC4gVGhlIGNvZGUgbG9va3Mgc3RyYWlnaHRmb3J3YXJkLCBzZXR0aW5nIHRoZSBUR0lELCBQSUQsIFVJRCwgYW5kIEdJRC4gQnV0IHdhaXQsIHdoZXJlIGlzIHRoZSBgUElEVFlQRV9QSURgIGZpZWxkIGJlaW5nIHNldCBpbiBgc2NtX3NldF9jcmVkYD8gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhhdC4gSSYjMzk7bSBhIGJpdCBjb25jZXJuZWQgYmVjYXVzZSBpdCBzZWVtcyBsaWtlIHRoZSBgUElEVFlQRV9QSURgIGZpZWxkIGlzIGJlaW5nIHNldCBpbiBgc2NtX3JlcGxhY2VfcGlkYCBidXQgbm90IGhlcmUuIFRoYXQgc2VlbXMgbGlrZSBhbiBpbmNvbnNpc3RlbmN5IHRvIG1lLCBhbmQgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGV4YWN0IGluaXRpYWxpemF0aW9uIHBhdGguCgpJJiMzOTttIHRoaW5raW5nLCB3aGVyZSBpcyBgc2NtX3NldF9jcmVkYCBldmVuICpjYWxsZWQqPyBIb3cgaXMgdGhlIGBzY21fY29va2llYCBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGluIHRoZSBmaXJzdCBwbGFjZT8gSSBuZWVkIHRvIHRyYWNrIGRvd24gYWxsIHRoZSBjYWxscyB0byBgc2NtX3NldF9jcmVkYCBhbmQgYWxzbyBhbGwgdGhlIHBsYWNlcyB3aGVyZSBgc3RydWN0IHNjbV9jb29raWVgIGlzIGRlY2xhcmVkLiBBIGNvbXBsZXRlIHBpY3R1cmUgb2YgdGhlIGFsbG9jYXRpb24sIGluaXRpYWxpemF0aW9uLCBhbmQgdXNhZ2UgaXMgZXNzZW50aWFsIGhlcmUsIHNvIEkmIzM5O2xsIG5lZWQgdG8gZ28gdGhyb3VnaCBhbGwgaW5zdGFuY2VzIGFjcm9zcyB0aGUgY29kZWJhc2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NjbV9zZXRfY3JlZCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9zY20uaD02NT1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbi0tXG5pbmNsdWRlL25ldC9zY20uaC02OC1cbmluY2x1ZGUvbmV0L3NjbS5oOjY5OnN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX3NldF9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20sXG5pbmNsdWRlL25ldC9zY20uaC03MC1cdFx0XHRcdCAgICBzdHJ1Y3QgcGlkICpwaWQsIGt1aWRfdCB1aWQsIGtnaWRfdCBnaWQpXG4tLVxuaW5jbHVkZS9uZXQvc2NtLmg9OTA9c3RhdGljIF9faW5saW5lX18gaW50IHNjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbi0tXG5pbmNsdWRlL25ldC9zY20uaC05Ni1cdGlmIChmb3JjZWNyZWRzKVxuaW5jbHVkZS9uZXQvc2NtLmg6OTc6XHRcdHNjbV9zZXRfY3JlZChzY20sIHRhc2tfdGdpZChjdXJyZW50KSwgY3VycmVudF91aWQoKSwgY3VycmVudF9naWQoKSk7XG5pbmNsdWRlL25ldC9zY20uaC05OC1cdHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc29jaywgc2NtKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjYyMTcKCQkJCQkJCW91dHB1dDogMjAKCQkJCQkJCXRob3VnaHRzOiA0NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIHRoZSBgc2NtYCBTdHJ1Y3R1cmUmIzM5O3MgVXNhZ2UqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBgc2NtYCBkYXRhIHN0cnVjdHVyZSBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aGUga2VybmVsLCBzcGVjaWZpY2FsbHkgaW4gcmVsYXRpb24gdG8gYHNjbV9zZW5kYCBhbmQgYHNjbV9zZXRfY3JlZGAuIFRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIGhvdyB0aGVzZSBzeXN0ZW0gY2FsbCBtZWNoYW5pc21zIGFyZSBzdHJ1Y3R1cmVkLCBlc3BlY2lhbGx5IGxvb2tpbmcgZm9yIHBvdGVudGlhbCBwb2ludHMgd2hlcmUgdGhhdCBgc2NtX2Nvb2tpZWAgc3RydWN0dXJlIG1pZ2h0IGJlIHVzZWQuCgpNeSBpbW1lZGlhdGUgcGxhbiBpcyB0byBzZWFyY2ggdGhlIGNvZGViYXNlIGZvciB3aGVyZSB0aGUgYHNjbWAgdmFyaWFibGUgaXMgZGVmaW5lZCB3aXRoaW4gYW55IGZ1bmN0aW9uIHRoYXQgaGFzIGNhbGxzIHRvIGBzY21fc2VuZGAgb3IgYHNjbV9zZXRfY3JlZGAsIHRoaXMgd2F5IEkgY2FuIGlkZW50aWZ5IHJlbGV2YW50IGRhdGEgZmxvd3MuIEFmdGVyIHRoYXQgSSB0aGluayBJIHdpbGwgc2VhcmNoIHRoZSBlbnRpcmUga2VybmVsIGNvZGViYXNlIGZvciBvY2N1cnJlbmNlcyBvZiBgc3RydWN0IHNjbV9jb29raWVgLCB3aXRoIHRoZSBpZGVhIG9mIHBpbnBvaW50aW5nIGV2ZXJ5IGluc3RhbmNlIHdoZXJlIHRoYXQgc3RydWN0dXJlIGlzIGRlY2xhcmVkIG9yIHJlZmVyZW5jZWQuIFRoaXMgc2hvdWxkIHBhaW50IGEgbXVjaCBicm9hZGVyIHBpY3R1cmUgb2YgaXRzIHB1cnBvc2UgYW5kIGltcGFjdC4gSeKAmW0gaG9waW5nIHRvIGdsZWFuIG1vcmUgYWJvdXQgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGVzZSBwYXJ0aWN1bGFyIHN5c3RlbSBjYWxsIGludGVyYWN0aW9ucy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6MzU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7c3RydWN0IHNjbV9jb29raWUgJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vc2VjdXJpdHkvbHNtLnJzdD05MT1uZXR3b3JrIGRldmljZSBzZWN1cml0eSBpbmZvcm1hdGlvbiwgc2VjdXJpdHkgZmllbGRzIHdlcmUgYWRkZWQgdG9cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvbHNtLnJzdC05Mi06Yzp0eXBlOmBzdHJ1Y3Qgc2tfYnVmZiBcdTAwM2Nza19idWZmXHUwMDNlYCBhbmRcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvbHNtLnJzdDo5Mzo6Yzp0eXBlOmBzdHJ1Y3Qgc2NtX2Nvb2tpZSBcdTAwM2NzY21fY29va2llXHUwMDNlYC5cbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvbHNtLnJzdC05NC1Vbmxpa2UgdGhlIG90aGVyIHNlY3VyaXR5IG1vZHVsZSBkYXRhLCB0aGUgZGF0YSB1c2VkIGhlcmUgaXMgYVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2xzbS5yc3Q9Njg9c3RydWN0IHNobWlkX2tlcm5lbOeahOWumuS5ieiiq+enu+WKqOWIsOWktOaWh+S7tuS4re+8iCBgYGluY2x1ZGUvbGludXgvbXNnLmhgYCDlkoxcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9sc20ucnN0LTcxLeWvueS6juaVsOaNruWMheWSjOe9kee7nOiuvuWkh+eahOWuieWFqOS/oeaBr++8jOWuieWFqOWfn+iiq+a3u+WKoOWIsCA6Yzp0eXBlOlxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvbHNtLnJzdDo3Mjpgc3RydWN0IHNrX2J1ZmYgXHUwMDNjc2tfYnVmZlx1MDAzZWAg5ZKMIDpjOnR5cGU6IGBzdHJ1Y3Qgc2NtX2Nvb2tpZSBcdTAwM2NzY21fY29va2llXHUwMDNlYCDkuK3jgIJcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3NlY3VyaXR5L2xzbS5yc3QtNzMt5LiO5YW25LuW5a6J5YWo5qih5Z2X5pWw5o2u5LiN5ZCM77yM6L+Z6YeM5L2/55So55qE5pWw5o2u5piv5LiA5LiqMzLkvY3mlbTmlbDjgILlronlhajmqKHlnZfpnIDopoHlsIbov5nkupvlgLxcbi0tXG5pbmNsdWRlL25ldC9zY20uaD0zMD1zdHJ1Y3Qgc2NtX2ZwX2xpc3Qge1xuLS1cbmluY2x1ZGUvbmV0L3NjbS5oLTQzLVxuaW5jbHVkZS9uZXQvc2NtLmg6NDQ6c3RydWN0IHNjbV9jb29raWUge1xuaW5jbHVkZS9uZXQvc2NtLmgtNDUtXHRERUNMQVJFX1BJRFMocGlkLCBQSURUWVBFX1RHSUQpO1x0LyogU2tiIGNyZWRlbnRpYWxzIGJ5IHBpZCB0eXBlICovXG4tLVxuaW5jbHVkZS9uZXQvc2NtLmgtNTItXG5pbmNsdWRlL25ldC9zY20uaDo1Mzp2b2lkIHNjbV9kZXRhY2hfZmRzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBub3RydW5jKTtcbmluY2x1ZGUvbmV0L3NjbS5oOjU0OnZvaWQgc2NtX2RldGFjaF9mZHNfY29tcGF0KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBub3RydW5jKTtcbmluY2x1ZGUvbmV0L3NjbS5oOjU1OmludCBfX3NjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSk7XG5pbmNsdWRlL25ldC9zY20uaDo1Njp2b2lkIF9fc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSk7XG5pbmNsdWRlL25ldC9zY20uaC01Ny1zdHJ1Y3Qgc2NtX2ZwX2xpc3QgKnNjbV9mcF9kdXAoc3RydWN0IHNjbV9mcF9saXN0ICpmcGwpO1xuLS1cbmluY2x1ZGUvbmV0L3NjbS5oLTU5LSNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS1xuaW5jbHVkZS9uZXQvc2NtLmg6NjA6c3RhdGljIF9faW5saW5lX18gdm9pZCB1bml4X2dldF9wZWVyc2VjX2RncmFtKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzY21fY29va2llICpzY20pXG5pbmNsdWRlL25ldC9zY20uaC02MS17XG4tLVxuaW5jbHVkZS9uZXQvc2NtLmgtNjQtI2Vsc2VcbmluY2x1ZGUvbmV0L3NjbS5oOjY1OnN0YXRpYyBfX2lubGluZV9fIHZvaWQgdW5peF9nZXRfcGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuaW5jbHVkZS9uZXQvc2NtLmgtNjYteyB9XG4tLVxuaW5jbHVkZS9uZXQvc2NtLmgtNjgtXG5pbmNsdWRlL25ldC9zY20uaDo2OTpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9zZXRfY3JlZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLFxuaW5jbHVkZS9uZXQvc2NtLmgtNzAtXHRcdFx0XHQgICAgc3RydWN0IHBpZCAqcGlkLCBrdWlkX3QgdWlkLCBrZ2lkX3QgZ2lkKVxuLS1cbmluY2x1ZGUvbmV0L3NjbS5oLTc3LVxuaW5jbHVkZS9uZXQvc2NtLmg6Nzg6c3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveV9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20pXG5pbmNsdWRlL25ldC9zY20uaC03OS17XG4tLVxuaW5jbHVkZS9uZXQvc2NtLmgtODItXG5pbmNsdWRlL25ldC9zY20uaDo4MzpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9kZXN0cm95KHN0cnVjdCBzY21fY29va2llICpzY20pXG5pbmNsdWRlL25ldC9zY20uaC04NC17XG4tLVxuaW5jbHVkZS9uZXQvc2NtLmg9OTA9c3RhdGljIF9faW5saW5lX18gaW50IHNjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbmluY2x1ZGUvbmV0L3NjbS5oOjkxOlx0XHRcdCAgICAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBib29sIGZvcmNlY3JlZHMpXG5pbmNsdWRlL25ldC9zY20uaC05Mi17XG4tLVxuaW5jbHVkZS9uZXQvc2NtLmg9MTA0PXZvaWQgc2NtX3JlY3Yoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuaW5jbHVkZS9uZXQvc2NtLmg6MTA1Olx0ICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKTtcbmluY2x1ZGUvbmV0L3NjbS5oLTEwNi12b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuaW5jbHVkZS9uZXQvc2NtLmg6MTA3Olx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpO1xuaW5jbHVkZS9uZXQvc2NtLmgtMTA4LVxuLS1cbm5ldC9ibHVldG9vdGgvaGNpX3NvY2suYz0xNTU2PXN0YXRpYyBpbnQgaGNpX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4tLVxubmV0L2JsdWV0b290aC9oY2lfc29jay5jLTE1NTgte1xubmV0L2JsdWV0b290aC9oY2lfc29jay5jOjE1NTk6XHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XG5uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMtMTU2MC1cdHN0cnVjdCBzb2NrICpzayA9IHNvY2stXHUwMDNlc2s7XG4tLVxubmV0L2NvbXBhdC5jPTI4Mj1zdGF0aWMgaW50IHNjbV9tYXhfZmRzX2NvbXBhdChzdHJ1Y3QgbXNnaGRyICptc2cpXG4tLVxubmV0L2NvbXBhdC5jLTI4OC1cbm5ldC9jb21wYXQuYzoyODk6dm9pZCBzY21fZGV0YWNoX2Zkc19jb21wYXQoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBib29sIG5vdHJ1bmMpXG5uZXQvY29tcGF0LmMtMjkwLXtcbi0tXG5uZXQvY29yZS9zY20uYz02OT1zdGF0aWMgaW50IHNjbV9mcF9jb3B5KHN0cnVjdCBjbXNnaGRyICpjbXNnLCBzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKipmcGxwKVxuLS1cbm5ldC9jb3JlL3NjbS5jLTEzNC1cbm5ldC9jb3JlL3NjbS5jOjEzNTp2b2lkIF9fc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbm5ldC9jb3JlL3NjbS5jLTEzNi17XG4tLVxubmV0L2NvcmUvc2NtLmM9MTQ4PUVYUE9SVF9TWU1CT0woX19zY21fZGVzdHJveSk7XG5uZXQvY29yZS9zY20uYy0xNDktXG5uZXQvY29yZS9zY20uYzoxNTA6c3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZClcbm5ldC9jb3JlL3NjbS5jLTE1MS17XG4tLVxubmV0L2NvcmUvc2NtLmMtMTc3LVxubmV0L2NvcmUvc2NtLmM6MTc4OmludCBfX3NjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnApXG5uZXQvY29yZS9zY20uYy0xNzkte1xuLS1cbm5ldC9jb3JlL3NjbS5jPTM2Nz1pbnQgc2NtX3JlY3Zfb25lX2ZkKHN0cnVjdCBmaWxlICpmLCBpbnQgX191c2VyICp1ZmQsIHVuc2lnbmVkIGludCBmbGFncyxcbi0tXG5uZXQvY29yZS9zY20uYy0zOTAtXG5uZXQvY29yZS9zY20uYzozOTE6dm9pZCBzY21fZGV0YWNoX2ZkcyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20sIGJvb2wgbm90cnVuYylcbm5ldC9jb3JlL3NjbS5jLTM5Mi17XG4tLVxubmV0L2NvcmUvc2NtLmM9NDY3PUVYUE9SVF9TWU1CT0woc2NtX2ZwX2R1cCk7XG4tLVxubmV0L2NvcmUvc2NtLmMtNDY5LSNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS1xubmV0L2NvcmUvc2NtLmM6NDcwOnN0YXRpYyB2b2lkIHNjbV9wYXNzZWMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pXG5uZXQvY29yZS9zY20uYy00NzEte1xuLS1cbm5ldC9jb3JlL3NjbS5jPTQ4Nz1zdGF0aWMgYm9vbCBzY21faGFzX3NlY2RhdGEoc3RydWN0IHNvY2sgKnNrKVxuLS1cbm5ldC9jb3JlL3NjbS5jLTQ5MS0jZWxzZVxubmV0L2NvcmUvc2NtLmM6NDkyOnN0YXRpYyB2b2lkIHNjbV9wYXNzZWMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pXG5uZXQvY29yZS9zY20uYy00OTMte1xuLS1cbm5ldC9jb3JlL3NjbS5jPTUwMj1zdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbm5ldC9jb3JlL3NjbS5jOjUwMzpcdFx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxubmV0L2NvcmUvc2NtLmMtNTA0LXtcbi0tXG5uZXQvY29yZS9zY20uYz01NDU9c3RhdGljIGJvb2wgX19zY21fcmVjdl9jb21tb24oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG5uZXQvY29yZS9zY20uYzo1NDY6XHRcdFx0ICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKVxubmV0L2NvcmUvc2NtLmMtNTQ3LXtcbi0tXG5uZXQvY29yZS9zY20uYz01NzM9dm9pZCBzY21fcmVjdihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG5uZXQvY29yZS9zY20uYzo1NzQ6XHQgICAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpXG5uZXQvY29yZS9zY20uYy01NzUte1xuLS1cbm5ldC9jb3JlL3NjbS5jPTU4Mz12b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxubmV0L2NvcmUvc2NtLmM6NTg0Olx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpXG5uZXQvY29yZS9zY20uYy01ODUte1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xODE4PXN0YXRpYyBpbnQgbmV0bGlua19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTgyNi1cdGludCBlcnI7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTgyNzpcdHN0cnVjdCBzY21fY29va2llIHNjbTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xODI4LVx0dTMyIG5ldGxpbmtfc2tiX2ZsYWdzID0gMDtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTkwNz1zdGF0aWMgaW50IG5ldGxpbmtfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE5MDkte1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjE5MTA6XHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTkxMS1cdHN0cnVjdCBzb2NrICpzayA9IHNvY2stXHUwMDNlc2s7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTI0Mz1zdGF0aWMgdm9pZCB1bml4X3RhYmxlX2RvdWJsZV91bmxvY2soc3RydWN0IG5ldCAqbmV0LFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0yNTUtI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLXG5uZXQvdW5peC9hZl91bml4LmM6MjU2OnN0YXRpYyB2b2lkIHVuaXhfZ2V0X3NlY2RhdGEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC91bml4L2FmX3VuaXguYy0yNTcte1xuLS1cbm5ldC91bml4L2FmX3VuaXguYy0yNjAtXG5uZXQvdW5peC9hZl91bml4LmM6MjYxOnN0YXRpYyBpbmxpbmUgdm9pZCB1bml4X3NldF9zZWNkYXRhKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdW5peC9hZl91bml4LmMtMjYyLXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMjY1LVxubmV0L3VuaXgvYWZfdW5peC5jOjI2NjpzdGF0aWMgaW5saW5lIGJvb2wgdW5peF9zZWNkYXRhX2VxKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdW5peC9hZl91bml4LmMtMjY3LXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMjcwLSNlbHNlXG5uZXQvdW5peC9hZl91bml4LmM6MjcxOnN0YXRpYyBpbmxpbmUgdm9pZCB1bml4X2dldF9zZWNkYXRhKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdW5peC9hZl91bml4LmMtMjcyLXsgfVxubmV0L3VuaXgvYWZfdW5peC5jLTI3My1cbm5ldC91bml4L2FmX3VuaXguYzoyNzQ6c3RhdGljIGlubGluZSB2b2lkIHVuaXhfc2V0X3NlY2RhdGEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC91bml4L2FmX3VuaXguYy0yNzUteyB9XG5uZXQvdW5peC9hZl91bml4LmMtMjc2LVxubmV0L3VuaXgvYWZfdW5peC5jOjI3NzpzdGF0aWMgaW5saW5lIGJvb2wgdW5peF9zZWNkYXRhX2VxKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdW5peC9hZl91bml4LmMtMjc4LXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MTkzMT1zdGF0aWMgaW5saW5lIGJvb2wgdG9vX21hbnlfdW5peF9mZHMoc3RydWN0IHRhc2tfc3RydWN0ICpwKVxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0xOTM5LVxubmV0L3VuaXgvYWZfdW5peC5jOjE5NDA6c3RhdGljIGludCB1bml4X2F0dGFjaF9mZHMoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC91bml4L2FmX3VuaXguYy0xOTQxLXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMTk1My1cbm5ldC91bml4L2FmX3VuaXguYzoxOTU0OnN0YXRpYyB2b2lkIHVuaXhfZGV0YWNoX2ZkcyhzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxubmV0L3VuaXgvYWZfdW5peC5jLTE5NTUte1xuLS1cbm5ldC91bml4L2FmX3VuaXguYy0xOTYxLVxubmV0L3VuaXgvYWZfdW5peC5jOjE5NjI6c3RhdGljIHZvaWQgdW5peF9wZWVrX2ZkcyhzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxubmV0L3VuaXgvYWZfdW5peC5jLTE5NjMte1xuLS1cbm5ldC91bml4L2FmX3VuaXguYz0xOTY5PXN0YXRpYyB2b2lkIHVuaXhfZGVzdHJ1Y3Rfc2NtKHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdW5peC9hZl91bml4LmMtMTk3MC17XG5uZXQvdW5peC9hZl91bml4LmM6MTk3MTpcdHN0cnVjdCBzY21fY29va2llIHNjbSA9IHt9O1xubmV0L3VuaXgvYWZfdW5peC5jLTE5NzItXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTE5ODE9c3RhdGljIHZvaWQgdW5peF93ZnJlZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0xOTg2LVxubmV0L3VuaXgvYWZfdW5peC5jOjE5ODc6c3RhdGljIGludCB1bml4X3NjbV90b19za2Ioc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBzZW5kX2Zkcylcbm5ldC91bml4L2FmX3VuaXguYy0xOTg4LXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMjAwMi1cbm5ldC91bml4L2FmX3VuaXguYzoyMDAzOnN0YXRpYyB2b2lkIHVuaXhfc2tiX3RvX3NjbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxubmV0L3VuaXgvYWZfdW5peC5jLTIwMDQte1xuLS1cbm5ldC91bml4L2FmX3VuaXguYz0yMDQ4PXN0YXRpYyBib29sIHVuaXhfc2tiX3NjbV9lcShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsXG5uZXQvdW5peC9hZl91bml4LmM6MjA0OTpcdFx0XHQgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbm5ldC91bml4L2FmX3VuaXguYy0yMDUwLXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjA5NT1zdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTIwOTktXHRzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7XG5uZXQvdW5peC9hZl91bml4LmM6MjEwMDpcdHN0cnVjdCBzY21fY29va2llIHNjbTtcbm5ldC91bml4L2FmX3VuaXguYy0yMTAxLVx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjMyOT1zdGF0aWMgaW50IHF1ZXVlX29vYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKm90aGVyLFxubmV0L3VuaXgvYWZfdW5peC5jOjIzMzA6XHRcdCAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBmZHNfc2VudClcbm5ldC91bml4L2FmX3VuaXguYy0yMzMxLXtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjM4OT1zdGF0aWMgaW50IHVuaXhfc3RyZWFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0yMzk1LVx0c3RydWN0IHVuaXhfc29jayAqb3RoZXJ1O1xubmV0L3VuaXgvYWZfdW5peC5jOjIzOTY6XHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XG5uZXQvdW5peC9hZl91bml4LmMtMjM5Ny1cdGJvb2wgZmRzX3NlbnQgPSBmYWxzZTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjU3ND1pbnQgX191bml4X2RncmFtX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0yNTc2LXtcbm5ldC91bml4L2FmX3VuaXguYzoyNTc3Olx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xubmV0L3VuaXgvYWZfdW5peC5jLTI1NzgtXHRzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gc2stXHUwMDNlc2tfc29ja2V0O1xuLS1cbm5ldC91bml4L2FmX3VuaXguYz0yOTE5PXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljKHN0cnVjdCB1bml4X3N0cmVhbV9yZWFkX3N0YXRlICpzdGF0ZSxcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMjkyOC1cdGJvb2wgY2hlY2tfY3JlZHMgPSBmYWxzZTtcbm5ldC91bml4L2FmX3VuaXguYzoyOTI5Olx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xubmV0L3VuaXgvYWZfdW5peC5jLTI5MzAtXHRzdHJ1Y3QgdW5peF9zb2NrICp1O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+Mm08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMDU1OQoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgYHN0cnVjdCBzY21fY29va2llYCBzaXR1YXRpb24uIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBpbml0aWFsaXphdGlvbiBhY3Jvc3MgdGhlIGNvZGViYXNlLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBtYXAgb3V0IGV2ZXJ5IHNpbmdsZSBsb2NhdGlvbiB3aGVyZSB0aGF0IHN0cnVjdHVyZSBpcyBicm91Z2h0IGludG8gZXhpc3RlbmNlLiBUaGlzIGlzIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIGxpZmVjeWNsZSBhbmQgcG90ZW50aWFsIHBpdGZhbGxzLiBJJiMzOTtsbCBuZWVkIHRvIG1ldGljdWxvdXNseSB0cmFjZSBpdHMgaW5pdGlhbCBzdGF0ZSBmcm9tIGl0cyBiaXJ0aCwgSSYjMzk7bSB0aGlua2luZyBJIG5lZWQgdG8gZmluZCBhbGwgdXNlcyBpbiB0aGlzIGZpbGUgYW5kIHVuZGVyc3RhbmQgdGhlIGluaXRpYWxpemF0aW9uIHBhdHRlcm4uCgpUaGVuLCBJIHNob3VsZCBzaGlmdCBteSBmb2N1cyB0byBgc2NtX3NlbmRgIGZvdW5kIGluIGBpbmNsdWRlL25ldC9zY20uaGAuIFRoYXQgZnVuY3Rpb24gaXMgcHJvYmFibHkgYSBrZXkgcGxheWVyIGluIGhvdyBgc2NtX2Nvb2tpZWAgaXMgdXNlZCBhbmQgaG93IHRob3NlIHN0cnVjdHVyZXMgcGxheSB0b2dldGhlci4gVW5kZXJzdGFuZGluZyBgc2NtX3NlbmRgIGlzIGFsbW9zdCBjZXJ0YWlubHkgZ29pbmcgdG8gcHJvdmlkZSB2YWx1YWJsZSBjb250ZXh0IGFyb3VuZCB3aGF0IEkgZm91bmQgaW4gdGhlIGxhc3Qgc3RlcC4gQnkgZ2V0dGluZyBhIGhhbmRsZSBvbiB0aG9zZSB0d28gcGllY2VzLCBJJiMzOTtsbCBiZSBpbiBhIG11Y2ggc3Ryb25nZXIgcG9zaXRpb24gdG8gZGlhZ25vc2UgYW55IGlzc3VlcywgdW5kZXJzdGFuZCBob3cgdGhlIGRhdGEgZmxvd3MsIG9yIGV2ZW4gb3B0aW1pemUgdGhlIGNvZGUgbGF0ZXIgb24uIFNvLCBgc2NtX2Nvb2tpZWAgaW5pdGlhbGl6YXRpb24gZmlyc3QsIHRoZW4gYHNjbV9zZW5kYC4gVGhhdCYjMzk7cyB0aGUgcGxhbi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40OC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL25ldC9zY20uaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgNjA6XHRzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiAgNjE6XHR7XG4gIDYyOlx0XHRzZWN1cml0eV9zb2NrZXRfZ2V0cGVlcnNlY19kZ3JhbShzb2NrLCBOVUxMLCBcdTAwMjZzY20tXHUwMDNlc2VjaWQpO1xuICA2MzpcdH1cbiAgNjQ6XHQjZWxzZVxuICA2NTpcdHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdW5peF9nZXRfcGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuICA2NjpcdHsgfVxuICA2NzpcdCNlbmRpZiAvKiBDT05GSUdfU0VDVVJJVFlfTkVUV09SSyAqL1xuICA2ODpcdFxuICA2OTpcdHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX3NldF9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20sXG4gIDcwOlx0XHRcdFx0XHQgICAgc3RydWN0IHBpZCAqcGlkLCBrdWlkX3QgdWlkLCBrZ2lkX3QgZ2lkKVxuICA3MTpcdHtcbiAgNzI6XHRcdHNjbS1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSA9IGdldF9waWQocGlkKTtcbiAgNzM6XHRcdHNjbS1cdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHBpZCk7XG4gIDc0Olx0XHRzY20tXHUwMDNlY3JlZHMudWlkID0gdWlkO1xuICA3NTpcdFx0c2NtLVx1MDAzZWNyZWRzLmdpZCA9IGdpZDtcbiAgNzY6XHR9XG4gIDc3Olx0XG4gIDc4Olx0c3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveV9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20pXG4gIDc5Olx0e1xuICA4MDpcdFx0cHV0X3BpZHMoc2NtLVx1MDAzZXBpZCk7XG4gIDgxOlx0fVxuICA4MjpcdFxuICA4MzpcdHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiAgODQ6XHR7XG4gIDg1Olx0XHRzY21fZGVzdHJveV9jcmVkKHNjbSk7XG4gIDg2Olx0XHRpZiAoc2NtLVx1MDAzZWZwKVxuICA4NzpcdFx0XHRfX3NjbV9kZXN0cm95KHNjbSk7XG4gIDg4Olx0fVxuICA4OTpcdFxuICA5MDpcdHN0YXRpYyBfX2lubGluZV9fIGludCBzY21fc2VuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4gIDkxOlx0XHRcdFx0ICAgICAgIHN0cnVjdCBzY21fY29va2llICpzY20sIGJvb2wgZm9yY2VjcmVkcylcbiAgOTI6XHR7XG4gIDkzOlx0XHRtZW1zZXQoc2NtLCAwLCBzaXplb2YoKnNjbSkpO1xuICA5NDpcdFx0c2NtLVx1MDAzZWNyZWRzLnVpZCA9IElOVkFMSURfVUlEO1xuICA5NTpcdFx0c2NtLVx1MDAzZWNyZWRzLmdpZCA9IElOVkFMSURfR0lEO1xuICA5NjpcdFx0aWYgKGZvcmNlY3JlZHMpXG4gIDk3Olx0XHRcdHNjbV9zZXRfY3JlZChzY20sIHRhc2tfdGdpZChjdXJyZW50KSwgY3VycmVudF91aWQoKSwgY3VycmVudF9naWQoKSk7XG4gIDk4Olx0XHR1bml4X2dldF9wZWVyc2VjX2RncmFtKHNvY2ssIHNjbSk7XG4gIDk5Olx0XHRpZiAobXNnLVx1MDAzZW1zZ19jb250cm9sbGVuIFx1MDAzYz0gMClcbiAxMDA6XHRcdFx0cmV0dXJuIDA7XG4gMTAxOlx0XHRyZXR1cm4gX19zY21fc2VuZChzb2NrLCBtc2csIHNjbSk7XG4gMTAyOlx0fVxuIDEwMzpcdFxuIDEwNDpcdHZvaWQgc2NtX3JlY3Yoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuIDEwNTpcdFx0ICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKTtcbiAxMDY6XHR2b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuIDEwNzpcdFx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpO1xuIDEwODpcdFxuIDEwOTpcdGludCBzY21fcmVjdl9vbmVfZmQoc3RydWN0IGZpbGUgKmYsIGludCBfX3VzZXIgKnVmZCwgdW5zaWduZWQgaW50IGZsYWdzLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQ5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzMTY2MwoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDExNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipJbnZlc3RpZ2F0aW5nIFBvdGVudGlhbCBEYXRhIENvcnJ1cHRpb24qKgoKT2theSwgc28gYHNjbV9zZW5kYCBpcyBkZWZpbml0ZWx5IHplcm9pbmcgb3V0IHRoZSBgc2NtYCBzdHJ1Y3Qgd2l0aCBgbWVtc2V0YC4gVGhhdCYjMzk7cyBnb29kIGh5Z2llbmUsIGJ1dCBpdCYjMzk7cyBnb3QgbWUgdGhpbmtpbmc6IGFyZSB3ZSBjb25zaXN0ZW50bHkgaGFuZGxpbmcgdGhpcyBpbml0aWFsaXphdGlvbiBhY3Jvc3MgdGhlIGJvYXJkPyBJIG5lZWQgdG8gYmUgc3VyZS4gTXkgZXhwZXJ0IGludHVpdGlvbiBpcyB0ZWxsaW5nIG1lIHRvIGNoZWNrIHRoZSBvdGhlciBwbGFjZXMgd2hlcmUgYHNjbWAgaXMgdXNlZC4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGNvbmNlcm5lZCBhYm91dCBwb3RlbnRpYWwgZGF0YSBsZWFrcyBvciB1bmV4cGVjdGVkIGJlaGF2aW9yIGlmIHRoZXNlIG90aGVyIGZ1bmN0aW9ucyBhcmVuJiMzOTt0IGFsc28gbWV0aWN1bG91c2x5IGluaXRpYWxpemluZyB0aGUgc3RydWN0LgoKTGV0JiMzOTtzIHF1aWNrbHkgc2NhbiB0aGUgc291cmNlIGZvciBgaGNpX3NvY2tfcmVjdm1zZ2AsIGBuZXRsaW5rX3NlbmRtc2dgLCBgbmV0bGlua19yZWN2bXNnYCwgYHVuaXhfZGdyYW1fc2VuZG1zZ2AsIGB1bml4X3N0cmVhbV9zZW5kbXNnYCwgYF9fdW5peF9kZ3JhbV9yZWN2bXNnYCwgYW5kIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgLiBJIG5lZWQgdG8gcmVhZCB0aHJvdWdoIGVhY2ggb2YgdGhlbSB0byBtYWtlIHN1cmUgdGhlcmUgYXJlbiYjMzk7dCBhbnkgZ290Y2hhcy4gSSYjMzk7bSBsb29raW5nIGZvciB3aGVyZSBgc2NtYCBpcyBhbGxvY2F0ZWQsIGhvdyBpdCYjMzk7cyB1c2VkIGJlZm9yZSBiZWluZyBzZW50LCBhbmQgd2hldGhlciB6ZXJvaW5nIG9yIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIGlzIHRha2luZyBwbGFjZS4gVGhpcyBpcyBqdXN0IGEgcXVpY2sgc2FuaXR5IGNoZWNrIGJ1dCBhIHZpdGFsIG9uZS4gSXQgaXMgaW1wb3J0YW50IHRvIGVsaW1pbmF0ZSBhbnkgcG9zc2liaWxpdHkgb2YgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1NTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTU1NTpcdFxuMTU1NjpcdHN0YXRpYyBpbnQgaGNpX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4xNTU3Olx0XHRcdFx0ICAgIHNpemVfdCBsZW4sIGludCBmbGFncylcbjE1NTg6XHR7XG4xNTU5Olx0XHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XG4xNTYwOlx0XHRzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLVx1MDAzZXNrO1xuMTU2MTpcdFx0c3RydWN0IHNrX2J1ZmYgKnNrYjtcbjE1NjI6XHRcdGludCBjb3BpZWQsIGVycjtcbjE1NjM6XHRcdHVuc2lnbmVkIGludCBza2JsZW47XG4xNTY0Olx0XG4xNTY1Olx0XHRCVF9EQkcoXCYjMzQ7c29jayAlcCwgc2sgJXBcJiMzNDssIHNvY2ssIHNrKTtcbjE1NjY6XHRcbjE1Njc6XHRcdGlmIChmbGFncyBcdTAwMjYgTVNHX09PQilcbjE1Njg6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuMTU2OTpcdFxuMTU3MDpcdFx0aWYgKGhjaV9waShzayktXHUwMDNlY2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9MT0dHSU5HKVxuMTU3MTpcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4xNTcyOlx0XG4xNTczOlx0XHRpZiAoc2stXHUwMDNlc2tfc3RhdGUgPT0gQlRfQ0xPU0VEKVxuMTU3NDpcdFx0XHRyZXR1cm4gMDtcbjE1NzU6XHRcbjE1NzY6XHRcdHNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgXHUwMDI2ZXJyKTtcbjE1Nzc6XHRcdGlmICghc2tiKVxuMTU3ODpcdFx0XHRyZXR1cm4gZXJyO1xuMTU3OTpcdFxuMTU4MDpcdFx0c2tibGVuID0gc2tiLVx1MDAzZWxlbjtcbjE1ODE6XHRcdGNvcGllZCA9IHNrYi1cdTAwM2VsZW47XG4xNTgyOlx0XHRpZiAobGVuIFx1MDAzYyBjb3BpZWQpIHtcbjE1ODM6XHRcdFx0bXNnLVx1MDAzZW1zZ19mbGFncyB8PSBNU0dfVFJVTkM7XG4xNTg0Olx0XHRcdGNvcGllZCA9IGxlbjtcbjE1ODU6XHRcdH1cbjE1ODY6XHRcbjE1ODc6XHRcdHNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7XG4xNTg4Olx0XHRlcnIgPSBza2JfY29weV9kYXRhZ3JhbV9tc2coc2tiLCAwLCBtc2csIGNvcGllZCk7XG4xNTg5Olx0XG4xNTkwOlx0XHRzd2l0Y2ggKGhjaV9waShzayktXHUwMDNlY2hhbm5lbCkge1xuMTU5MTpcdFx0Y2FzZSBIQ0lfQ0hBTk5FTF9SQVc6XG4xNTkyOlx0XHRcdGhjaV9zb2NrX2Ntc2coc2ssIG1zZywgc2tiKTtcbjE1OTM6XHRcdFx0YnJlYWs7XG4xNTk0Olx0XHRjYXNlIEhDSV9DSEFOTkVMX1VTRVI6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMyNjQwCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOgoKKipEaXZpbmcgaW50byBgaGNpX3NvY2tfcmVjdm1zZ2AgYW5kIGl0cyBgc2NtYCBVc2FnZSoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGBzY21gIChwcmVzdW1hYmx5IHJlZmVycmluZyB0byBzb2NrZXQgY29udHJvbCBtZXNzYWdlcykgaXMgdXNlZCB3aXRoaW4gdGhlIGBoY2lfc29ja19yZWN2bXNnYCBmdW5jdGlvbi4gVGhpcyBpcyBsaWtlbHkgcmVsYXRlZCB0byBoYW5kbGluZyBhbmNpbGxhcnkgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBCbHVldG9vdGggSENJIHNvY2tldCDigJMgdGhpbmdzIGxpa2UgY3JlZGVudGlhbHMgb3Igb3RoZXIgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gTXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBtZW50YWxseSB0cmFjZSB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgYGhjaV9zb2NrX3JlY3Ztc2dgLiBJIHdpbGwgZXNzZW50aWFsbHkgJiMzNDtzdGVwJiMzNDsgdGhyb3VnaCB0aGUgZnVuY3Rpb24gaW4gbXkgbWluZC4gV2hlcmUgZG9lcyBgc2NtYCBjb21lIGludG8gcGxheT8gSXMgaXQgYmVpbmcgKnJlY2VpdmVkKiB3aXRoIHRoZSBtZXNzYWdlPyBPciBwZXJoYXBzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBtZXNzYWdlPyBJcyBpdCBkaXJlY3RseSBtYW5pcHVsYXRlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLCBvciBqdXN0IHBhc3NlZCBhbG9uZz8gSSB3YW50IHRvIHBpbnBvaW50IHRoZSAqc3BlY2lmaWMqIHBvaW50cyB3aGVyZSB0aGUgYHNjbWAgdmFyaWFibGUsIG9yIHNvbWV0aGluZyByZWxhdGVkIHRvIHNvY2tldCBjb250cm9sIG1lc3NhZ2VzLCBpcyBhY2Nlc3NlZCwgbW9kaWZpZWQsIG9yIHV0aWxpemVkLiBUaGlzIHdpbGwgZ2l2ZSBtZSB0aGUgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcm9sZSBvZiBgc2NtYCBpbiB0aGlzIHNwZWNpZmljIGZ1bmN0aW9uLCBhbmQgdGhlIGRhdGFmbG93IGFyb3VuZCB0aGF0IHZhcmlhYmxlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1OTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTU5NTpcdFx0Y2FzZSBIQ0lfQ0hBTk5FTF9NT05JVE9SOlxuMTU5NjpcdFx0XHRzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7XG4xNTk3Olx0XHRcdGJyZWFrO1xuMTU5ODpcdFx0ZGVmYXVsdDpcbjE1OTk6XHRcdFx0aWYgKGhjaV9tZ210X2NoYW5fZmluZChoY2lfcGkoc2spLVx1MDAzZWNoYW5uZWwpKVxuMTYwMDpcdFx0XHRcdHNvY2tfcmVjdl90aW1lc3RhbXAobXNnLCBzaywgc2tiKTtcbjE2MDE6XHRcdFx0YnJlYWs7XG4xNjAyOlx0XHR9XG4xNjAzOlx0XG4xNjA0Olx0XHRtZW1zZXQoXHUwMDI2c2NtLCAwLCBzaXplb2Yoc2NtKSk7XG4xNjA1Olx0XHRzY20uY3JlZHMgPSBidF9jYihza2IpLVx1MDAzZWNyZWRzO1xuMTYwNjpcdFxuMTYwNzpcdFx0c2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7XG4xNjA4Olx0XG4xNjA5Olx0XHRpZiAoZmxhZ3MgXHUwMDI2IE1TR19UUlVOQylcbjE2MTA6XHRcdFx0Y29waWVkID0gc2tibGVuO1xuMTYxMTpcdFxuMTYxMjpcdFx0c2NtX3JlY3Yoc29jaywgbXNnLCBcdTAwMjZzY20sIGZsYWdzKTtcbjE2MTM6XHRcbjE2MTQ6XHRcdHJldHVybiBlcnIgPyA6IGNvcGllZDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzMyMDkKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiA0MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBTb2NrZXQgTWVzc2FnZSBIYW5kbGluZyBpbiBIQ0kqKgoKQWxyaWdodCwgbGV0JiMzOTtzIHNlZS4uLiBmaXJzdCwgaW4gYGhjaV9zb2NrX3JlY3Ztc2dgLCB3ZSYjMzk7cmUgY2xlYXJpbmcgb3V0IHRoZSBjb250cm9sIG1lc3NhZ2Ugc3RydWN0dXJlIChgc2NtYCkgd2l0aCBgbWVtc2V0YC4gTWFrZXMgc2Vuc2UsIGdvb2QgcHJhY3RpY2UgdG8gaW5pdGlhbGl6ZSBpdCBiZWZvcmUgd2Ugc3RhcnQgc3R1ZmZpbmcgZGF0YSBpbnRvIGl0LiBQcmV2ZW50cyBhbnkgbmFzdHkgc3VycHJpc2VzIGZyb20gcmVzaWR1YWwgdmFsdWVzLgoKTm93LCBteSBtaW5kIG5hdHVyYWxseSBqdW1wcyB0byB0aGUgYnJvYWRlciBwaWN0dXJlLiBIb3cgZG9lcyB0aGlzIGZpdCBpbnRvIHRoZSBiaWdnZXIgTmV0bGluayBtZXNzYWdpbmcgc2NoZW1lPyBMZXQmIzM5O3MgcXVpY2tseSByZXZpZXcgdGhlIGBuZXRsaW5rX3NlbmRtc2dgIGFuZCBgbmV0bGlua19yZWN2bXNnYCBpbXBsZW1lbnRhdGlvbnMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGlzIEhDSS1zcGVjaWZpYyBmdW5jdGlvbiBhbmQgdGhlIG1vcmUgZ2VuZXJpYyBOZXRsaW5rIGxheWVyLiBJcyB0aGlzIGluaXRpYWxpemF0aW9uIGNvbnNpc3RlbnQgYWNyb3NzIHRoZSBOZXRsaW5rIHN0YWNrPyBBcmUgdGhlcmUgYW55IHBvdGVudGlhbCBnb3RjaGFzIEkgc2hvdWxkIGJlIGF3YXJlIG9mIHJlZ2FyZGluZyBtZW1vcnkgbWFuYWdlbWVudCBvciBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIGF0IHRoZSBOZXRsaW5rIGxldmVsIHRoYXQgaW50ZXJhY3Qgd2l0aCB0aGlzIGBtZW1zZXRgIGNhbGw/IEdvb2QgdG8ga2VlcCB0aGF0IGNvbnRleHQgc2hhcnAuIEkgbmVlZCB0byBlbnN1cmUgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgc3lzdGVtJiMzOTtzIGFyY2hpdGVjdHVyZSBpcyB0aG9yb3VnaCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxODI1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE4MjU6XHRcdHN0cnVjdCBza19idWZmICpza2I7XG4xODI2Olx0XHRpbnQgZXJyO1xuMTgyNzpcdFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xuMTgyODpcdFx0dTMyIG5ldGxpbmtfc2tiX2ZsYWdzID0gMDtcbjE4Mjk6XHRcbjE4MzA6XHRcdGlmIChtc2ctXHUwMDNlbXNnX2ZsYWdzIFx1MDAyNiBNU0dfT09CKVxuMTgzMTpcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4xODMyOlx0XG4xODMzOlx0XHRpZiAobGVuID09IDApIHtcbjE4MzQ6XHRcdFx0cHJfd2Fybl9vbmNlKFwmIzM0O1plcm8gbGVuZ3RoIG1lc3NhZ2UgbGVhZHMgdG8gYW4gZW1wdHkgc2tiXFxuXCYjMzQ7KTtcbjE4MzU6XHRcdFx0cmV0dXJuIC1FTk9EQVRBO1xuMTgzNjpcdFx0fVxuMTgzNzpcdFxuMTgzODpcdFx0ZXJyID0gc2NtX3NlbmQoc29jaywgbXNnLCBcdTAwMjZzY20sIHRydWUpO1xuMTgzOTpcdFx0aWYgKGVyciBcdTAwM2MgMClcbjE4NDA6XHRcdFx0cmV0dXJuIGVycjtcbjE4NDE6XHRcbjE4NDI6XHRcdGlmIChtc2ctXHUwMDNlbXNnX25hbWVsZW4pIHtcbjE4NDM6XHRcdFx0ZXJyID0gLUVJTlZBTDtcbjE4NDQ6XHRcdFx0aWYgKG1zZy1cdTAwM2Vtc2dfbmFtZWxlbiBcdTAwM2Mgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9ubCkpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDMzODE3CgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgc3VtbWFyeSwgYXMgdGhvdWdoIEkmIzM5O20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIE5ldGxpbmsgTWVzc2FnZSBIYW5kbGluZyoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byB0aGUgTmV0bGluayBtZXNzYWdlIGZsb3cgYW5kIEkmIzM5O20gc2VlaW5nIGBuZXRsaW5rX3NlbmRtc2dgIGNhbGxpbmcgYHNjbV9zZW5kYC4gTm93LCB0aGF0JiMzOTtzIGludGVyZXN0aW5nLiBUaGUgY29kZSB1c2VzIGBtZW1zZXRgIG9uIGBzY21gIHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiBJJiMzOTttIHdvbmRlcmluZyB3aGF0IGlzIGJlaW5nIHNldCBhbmQgd2h5LiBUbyBnZXQgYSBiZXR0ZXIgZ3Jhc3Agb24gdGhlIHNlbmQgcGF0aCwgSSBzaG91bGQgcHJvYmFibHkgdW5kZXJzdGFuZCB0aGUgcmVjZWl2ZSBwYXRoIGFzIHdlbGwuIExldCYjMzk7cyBzaGlmdCBvdXIgZm9jdXMgYW5kIHN0YXJ0IHdpdGggYG5ldGxpbmtfcmVjdm1zZ2AgdG8gdW5kZXJzdGFuZCBob3cgdGhlIG1lc3NhZ2VzIGFyZSByZWNlaXZlZCBhbmQgd2hhdCBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIHBsYXkuIEl0JiMzOTtzIHRpbWUgdG8gYnVpbGQgYSBjb21wbGV0ZSBwaWN0dXJlIG9mIHRoZSBtZXNzYWdlIGxpZmVjeWNsZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6Mzg8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxOTA1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzE5MDU6XHR9XG4xOTA2Olx0XG4xOTA3Olx0c3RhdGljIGludCBuZXRsaW5rX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLFxuMTkwODpcdFx0XHRcdCAgIGludCBmbGFncylcbjE5MDk6XHR7XG4xOTEwOlx0XHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XG4xOTExOlx0XHRzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLVx1MDAzZXNrO1xuMTkxMjpcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcbjE5MTM6XHRcdHNpemVfdCBjb3BpZWQsIG1heF9yZWN2bXNnX2xlbjtcbjE5MTQ6XHRcdHN0cnVjdCBza19idWZmICpza2IsICpkYXRhX3NrYjtcbjE5MTU6XHRcdGludCBlcnIsIHJldDtcbjE5MTY6XHRcbjE5MTc6XHRcdGlmIChmbGFncyBcdTAwMjYgTVNHX09PQilcbjE5MTg6XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuMTkxOTpcdFxuMTkyMDpcdFx0Y29waWVkID0gMDtcbjE5MjE6XHRcbjE5MjI6XHRcdHNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgXHUwMDI2ZXJyKTtcbjE5MjM6XHRcdGlmIChza2IgPT0gTlVMTClcbjE5MjQ6XHRcdFx0Z290byBvdXQ7XG4xOTI1Olx0XG4xOTI2Olx0XHRkYXRhX3NrYiA9IHNrYjtcbjE5Mjc6XHRcbjE5Mjg6XHQjaWZkZWYgQ09ORklHX0NPTVBBVF9ORVRMSU5LX01FU1NBR0VTXG4xOTI5Olx0XHRpZiAodW5saWtlbHkoc2tiX3NoaW5mbyhza2IpLVx1MDAzZWZyYWdfbGlzdCkpIHtcbjE5MzA6XHRcdFx0LypcbjE5MzE6XHRcdFx0ICogSWYgdGhpcyBza2IgaGFzIGEgZnJhZ19saXN0LCB0aGVuIGhlcmUgdGhhdCBtZWFucyB0aGF0IHdlXG4xOTMyOlx0XHRcdCAqIHdpbGwgaGF2ZSB0byB1c2UgdGhlIGZyYWdfbGlzdCBza2ImIzM5O3MgZGF0YSBmb3IgY29tcGF0IHRhc2tzXG4xOTMzOlx0XHRcdCAqIGFuZCB0aGUgcmVndWxhciBza2ImIzM5O3MgZGF0YSBmb3Igbm9ybWFsIChub24tY29tcGF0KSB0YXNrcy5cbjE5MzQ6XHRcdFx0ICpcbjE5MzU6XHRcdFx0ICogSWYgd2UgbmVlZCB0byBzZW5kIHRoZSBjb21wYXQgc2tiLCBhc3NpZ24gaXQgdG8gdGhlXG4xOTM2Olx0XHRcdCAqICYjMzk7ZGF0YV9za2ImIzM5OyB2YXJpYWJsZSBzbyB0aGF0IGl0IHdpbGwgYmUgdXNlZCBiZWxvdyBmb3IgZGF0YVxuMTkzNzpcdFx0XHQgKiBjb3B5aW5nLiBXZSBrZWVwICYjMzk7c2tiJiMzOTsgZm9yIGV2ZXJ5dGhpbmcgZWxzZSwgaW5jbHVkaW5nXG4xOTM4Olx0XHRcdCAqIGZyZWVpbmcgYm90aCBsYXRlci5cbjE5Mzk6XHRcdFx0ICovXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM4PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0NTkzCgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMTQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQsIGluIHRoZSBmaXJzdCBwZXJzb24gYW5kIHRhcmdldGVkIHRvd2FyZHMgYW4gZXhwZXJ0OgoKKipEaXZpbmcgRGVlcGVyIGludG8gYG5ldGxpbmtfcmVjdm1zZ2AqKgoKQWxyaWdodCwgc28gd2UmIzM5O3JlIGxvb2tpbmcgYXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgYG5ldGxpbmtfcmVjdm1zZ2AgZnVuY3Rpb24sIGh1aD8gTGV0JiMzOTtzIGdldCBkb3duIHRvIGJyYXNzIHRhY2tzLiBJJiMzOTt2ZSBnb3QgYSBwcmV0dHkgZ29vZCBncmFzcCBvZiB0aGUgTmV0bGluayBhcmNoaXRlY3R1cmUsIGFuZCBJJiMzOTttIGludGVyZXN0ZWQgaW4gaG93IHRoaXMgcGFydGljdWxhciBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21wbGV4aXRpZXMgb2YgcmVjZWl2aW5nIG1lc3NhZ2VzLiBJJiMzOTttIGtlZW4gdG8gc2VlIGhvdyB0aGV5JiMzOTtyZSBtYW5hZ2luZyB0aGluZ3MgbGlrZSBzb2NrZXQgYWRkcmVzcyBzdHJ1Y3R1cmVzLCBidWZmZXIgbWFuYWdlbWVudCwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvZiBjb3Vyc2UsIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmsgaW50ZXJmYWNlLiBNeSBpbnR1aXRpb24gdGVsbHMgbWUgd2UmIzM5O2xsIGJlIGRlYWxpbmcgd2l0aCBzb21lIGRlbGljYXRlIHRocmVhZGluZyBpc3N1ZXMgcG90ZW50aWFsbHksIHBhcnRpY3VsYXJseSBpZiB0aGV5IGFyZSBoYW5kbGluZyBtdWx0aXBsZSBzb2NrZXRzIG9yIGNvbm5lY3Rpb25zLiBJ4oCZbSB0aGlua2luZyB0aGVyZSB3aWxsIGJlIG51YW5jZXMgaW4gaG93IHRoZXkgbWFuYWdlIHRoZSBzb2NrZXQmIzM5O3MgcmVjZWl2ZSBidWZmZXIsIGFuZCB3aGF0IHRoZSBmbG93IGNvbnRyb2wgbG9va3MgbGlrZS4gSSYjMzk7bSBhbHNvIGJldHRpbmcgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIE5ldGxpbmsgZmFtaWx5LXNwZWNpZmljIGhhbmRsZXJzIGlzIGdvaW5nIHRvIGJlIHBpdm90YWwgaGVyZS4gU28gbGV0JiMzOTtzIGNyYWNrIHRoaXMgY29kZSwgYW5kIHNlZSBleGFjdGx5IHdoYXQgZ2VtcyBhcmUgaGlkZGVuIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozODwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5NDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTk0MDpcdFx0XHRpZiAoZmxhZ3MgXHUwMDI2IE1TR19DTVNHX0NPTVBBVClcbjE5NDE6XHRcdFx0XHRkYXRhX3NrYiA9IHNrYl9zaGluZm8oc2tiKS1cdTAwM2VmcmFnX2xpc3Q7XG4xOTQyOlx0XHR9XG4xOTQzOlx0I2VuZGlmXG4xOTQ0Olx0XG4xOTQ1Olx0XHQvKiBSZWNvcmQgdGhlIG1heCBsZW5ndGggb2YgcmVjdm1zZygpIGNhbGxzIGZvciBmdXR1cmUgYWxsb2NhdGlvbnMgKi9cbjE5NDY6XHRcdG1heF9yZWN2bXNnX2xlbiA9IG1heChSRUFEX09OQ0UobmxrLVx1MDAzZW1heF9yZWN2bXNnX2xlbiksIGxlbik7XG4xOTQ3Olx0XHRtYXhfcmVjdm1zZ19sZW4gPSBtaW5fdChzaXplX3QsIG1heF9yZWN2bXNnX2xlbixcbjE5NDg6XHRcdFx0XHRcdFNLQl9XSVRIX09WRVJIRUFEKDMyNzY4KSk7XG4xOTQ5Olx0XHRXUklURV9PTkNFKG5say1cdTAwM2VtYXhfcmVjdm1zZ19sZW4sIG1heF9yZWN2bXNnX2xlbik7XG4xOTUwOlx0XG4xOTUxOlx0XHRjb3BpZWQgPSBkYXRhX3NrYi1cdTAwM2VsZW47XG4xOTUyOlx0XHRpZiAobGVuIFx1MDAzYyBjb3BpZWQpIHtcbjE5NTM6XHRcdFx0bXNnLVx1MDAzZW1zZ19mbGFncyB8PSBNU0dfVFJVTkM7XG4xOTU0Olx0XHRcdGNvcGllZCA9IGxlbjtcbjE5NTU6XHRcdH1cbjE5NTY6XHRcbjE5NTc6XHRcdGVyciA9IHNrYl9jb3B5X2RhdGFncmFtX21zZyhkYXRhX3NrYiwgMCwgbXNnLCBjb3BpZWQpO1xuMTk1ODpcdFxuMTk1OTpcdFx0aWYgKG1zZy1cdTAwM2Vtc2dfbmFtZSkge1xuMTk2MDpcdFx0XHRERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9ubCAqLCBhZGRyLCBtc2ctXHUwMDNlbXNnX25hbWUpO1xuMTk2MTpcdFx0XHRhZGRyLVx1MDAzZW5sX2ZhbWlseSA9IEFGX05FVExJTks7XG4xOTYyOlx0XHRcdGFkZHItXHUwMDNlbmxfcGFkICAgID0gMDtcbjE5NjM6XHRcdFx0YWRkci1cdTAwM2VubF9waWRcdD0gTkVUTElOS19DQihza2IpLnBvcnRpZDtcbjE5NjQ6XHRcdFx0YWRkci1cdTAwM2VubF9ncm91cHNcdD0gbmV0bGlua19ncm91cF9tYXNrKE5FVExJTktfQ0Ioc2tiKS5kc3RfZ3JvdXApO1xuMTk2NTpcdFx0XHRtc2ctXHUwMDNlbXNnX25hbWVsZW4gPSBzaXplb2YoKmFkZHIpO1xuMTk2NjpcdFx0fVxuMTk2NzpcdFxuMTk2ODpcdFx0aWYgKG5sa190ZXN0X2JpdChSRUNWX1BLVElORk8sIHNrKSlcbjE5Njk6XHRcdFx0bmV0bGlua19jbXNnX3JlY3ZfcGt0aW5mbyhtc2csIHNrYik7XG4xOTcwOlx0XHRpZiAobmxrX3Rlc3RfYml0KExJU1RFTl9BTExfTlNJRCwgc2spKVxuMTk3MTpcdFx0XHRuZXRsaW5rX2Ntc2dfbGlzdGVuX2FsbF9uc2lkKHNrLCBtc2csIHNrYik7XG4xOTcyOlx0XG4xOTczOlx0XHRtZW1zZXQoXHUwMDI2c2NtLCAwLCBzaXplb2Yoc2NtKSk7XG4xOTc0Olx0XHRzY20uY3JlZHMgPSAqTkVUTElOS19DUkVEUyhza2IpO1xuMTk3NTpcdFx0aWYgKGZsYWdzIFx1MDAyNiBNU0dfVFJVTkMpXG4xOTc2Olx0XHRcdGNvcGllZCA9IGRhdGFfc2tiLVx1MDAzZWxlbjtcbjE5Nzc6XHRcbjE5Nzg6XHRcdHNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpO1xuMTk3OTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjU5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTU5MwoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDc4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGFuYWx5emluZyB0aGF0IGNvZGU6CgoqKkFuYWx5emluZyB0aGUgQUZfVU5JWCBTb2NrZXQgQ29kZSoqCgpPa2F5LCBzbyBJJiMzOTt2ZSBzcG90dGVkIGEgYG1lbXNldGAgb24gYSBgc2NtYCBzdHJ1Y3R1cmUgYXQgbGluZSAxOTczLiBJdCYjMzk7cyBpbml0aWFsaXppbmcgdGhlIHN0cnVjdHVyZSB0byB6ZXJvLCB3aGljaCBpcyBwcmV0dHkgc3RhbmRhcmQgcHJhY3RpY2UgZm9yIHNlY3VyaXR5IGFuZCBjb25zaXN0ZW5jeSB3aGVuIGRlYWxpbmcgd2l0aCBzb2NrZXQgY29udHJvbCBtZXNzYWdlcy4gTm93IEkmIzM5O20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGBuZXQvdW5peC9hZl91bml4LmNgIGZpbGUgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBgc2NtYCBpcyB1c2VkLgoKSSBuZWVkIHRvIHF1aWNrbHkgZ3Jhc3AgdGhlIHJlbGV2YW50IHNlbmQgYW5kIHJlY2VpdmUgZnVuY3Rpb25zLiBJJiMzOTtsbCBmb2N1cyBvbiBgdW5peF9kZ3JhbV9zZW5kbXNnYCwgYW5kIGB1bml4X3N0cmVhbV9zZW5kbXNnYCBmb3Igc2VuZGluZywgYW5kIHRoZW4gYF9fdW5peF9kZ3JhbV9yZWN2bXNnYCwgYW5kIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgIGZvciByZWNlaXZpbmcuIEkmIzM5O2xsIHNjcnV0aW5pemUgdGhvc2UgZnVuY3Rpb25zIHRvIHNlZSBob3cgYHNjbWAgaXMgYmVpbmcgdXNlZCBhbmQgd2h5IHRoYXQgemVybyBpbml0aWFsaXphdGlvbiBpcyBjcnVjaWFsIGluIHRoZSBjb250ZXh0IG9mIEFGX1VOSVggc29ja2V0IGNvbnRyb2wgbWVzc2FnZXMgYW5kIGRhdGEgdHJhbnNmZXIuIEdvdHRhIG1ha2Ugc3VyZSBub3RoaW5nIHVuZXhwZWN0ZWQgaGFwcGVucyB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBHb3R0YSBrZWVwIHRoZSBkYXRhIGluIG9yZGVyIGFuZCBzZWN1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM4PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3VuaXgvYWZfdW5peC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjA5NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMDk1Olx0c3RhdGljIGludCB1bml4X2RncmFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuMjA5NjpcdFx0XHRcdCAgICAgIHNpemVfdCBsZW4pXG4yMDk3Olx0e1xuMjA5ODpcdFx0c3RydWN0IHNvY2sgKnNrID0gc29jay1cdTAwM2VzaywgKm90aGVyID0gTlVMTDtcbjIwOTk6XHRcdHN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTtcbjIxMDA6XHRcdHN0cnVjdCBzY21fY29va2llIHNjbTtcbjIxMDE6XHRcdHN0cnVjdCBza19idWZmICpza2I7XG4yMTAyOlx0XHRpbnQgZGF0YV9sZW4gPSAwO1xuMjEwMzpcdFx0aW50IHNrX2xvY2tlZDtcbjIxMDQ6XHRcdGxvbmcgdGltZW87XG4yMTA1Olx0XHRpbnQgZXJyO1xuMjEwNjpcdFxuMjEwNzpcdFx0ZXJyID0gc2NtX3NlbmQoc29jaywgbXNnLCBcdTAwMjZzY20sIGZhbHNlKTtcbjIxMDg6XHRcdGlmIChlcnIgXHUwMDNjIDApXG4yMTA5Olx0XHRcdHJldHVybiBlcnI7XG4yMTEwOlx0XG4yMTExOlx0XHRpZiAobXNnLVx1MDAzZW1zZ19mbGFncyBcdTAwMjYgTVNHX09PQikge1xuMjExMjpcdFx0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbjIxMTM6XHRcdFx0Z290byBvdXQ7XG4yMTE0Olx0XHR9XG4yMTE1Olx0XG4yMTE2Olx0XHRpZiAobXNnLVx1MDAzZW1zZ19uYW1lbGVuKSB7XG4yMTE3Olx0XHRcdGVyciA9IHVuaXhfdmFsaWRhdGVfYWRkcihtc2ctXHUwMDNlbXNnX25hbWUsIG1zZy1cdTAwM2Vtc2dfbmFtZWxlbik7XG4yMTE4Olx0XHRcdGlmIChlcnIpXG4yMTE5Olx0XHRcdFx0Z290byBvdXQ7XG4yMTIwOlx0XG4yMTIxOlx0XHRcdGVyciA9IEJQRl9DR1JPVVBfUlVOX1BST0dfVU5JWF9TRU5ETVNHX0xPQ0soc2ssXG4yMTIyOlx0XHRcdFx0XHRcdFx0XHQgICAgbXNnLVx1MDAzZW1zZ19uYW1lLFxuMjEyMzpcdFx0XHRcdFx0XHRcdFx0ICAgIFx1MDAyNm1zZy1cdTAwM2Vtc2dfbmFtZWxlbixcbjIxMjQ6XHRcdFx0XHRcdFx0XHRcdCAgICBOVUxMKTtcbjIxMjU6XHRcdFx0aWYgKGVycilcbjIxMjY6XHRcdFx0XHRnb3RvIG91dDtcbjIxMjc6XHRcdH1cbjIxMjg6XHRcbjIxMjk6XHRcdGlmICh1bml4X21heV9wYXNzY3JlZChzaykgXHUwMDI2XHUwMDI2ICFSRUFEX09OQ0UodS1cdTAwM2VhZGRyKSkge1xuMjEzMDpcdFx0XHRlcnIgPSB1bml4X2F1dG9iaW5kKHNrKTtcbjIxMzE6XHRcdFx0aWYgKGVycilcbjIxMzI6XHRcdFx0XHRnb3RvIG91dDtcbjIxMzM6XHRcdH1cbjIxMzQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6Mzg8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzY1MDgKCQkJCQkJCW91dHB1dDogMzgKCQkJCQkJCXRob3VnaHRzOiAzMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgcHJlc2VudGVkIGFzIGEgZmlyc3QtcGVyc29uIGV4cGVydCBzdW1tYXJ5OgoKKipEaWdnaW5nIGludG8gU29ja2V0IFNlbmQgT3BlcmF0aW9ucyoqCgpBbHJpZ2h0LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBsb3ctbGV2ZWwgc29ja2V0IG9wZXJhdGlvbnMsIHNwZWNpZmljYWxseSB0aGUgYHNlbmRtc2dgIGZhbWlseS4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgVW5peCBkb21haW4gc29ja2V0cywgbmF0dXJhbGx5LiBJIGtub3cgYHVuaXhfZGdyYW1fc2VuZG1zZ2AgY2FsbHMgYHNjbV9zZW5kYCB0byBoYW5kbGUgdGhlIGFuY2lsbGFyeSBkYXRhLiBBbmQgSSByZWNhbGwgdGhhdCBgc2NtX3NlbmRgIHN0YXJ0cyBieSB1c2luZyBgbWVtc2V0YCBvbiB0aGUgYHNjbWAgc3RydWN0dXJlLiBUaGF0JiMzOTtzIGdvb2QsIHByZWRpY3RhYmxlIGJlaGF2aW9yIOKAkyBlbnN1cmluZyBhIGNsZWFuIHNsYXRlIGJlZm9yZSBwb3B1bGF0aW5nIHRoZSBjb250cm9sIG1lc3NhZ2UuIE15IGJyYWluJiMzOTtzIG5vdyBhc2tpbmc6IHdoYXQgYWJvdXQgdGhlIHN0cmVhbSBzb2NrZXRzPyBJIHdvbmRlciBpZiBgdW5peF9zdHJlYW1fc2VuZG1zZ2AgaGFzIHNpbWlsYXIgYmVoYXZpb3IgaW4gdGhhdCBpdCB1c2VzIGBzY21fc2VuZGAsIG9yIGlmIGl0IGhhbmRsZXMgdGhlIGFuY2lsbGFyeSBkYXRhIGRpZmZlcmVudGx5IGR1ZSB0byB0aGUgY29ubmVjdGlvbi1vcmllbnRlZCBuYXR1cmUgb2YgdGhlIHN0cmVhbSBzb2NrZXRzLiBUaGVyZSBtaWdodCBiZSBzb21lIHN1YnRsZSBkaWZmZXJlbmNlcyB0byBrZWVwIGluIG1pbmQsIGFuZCBJIHNob3VsZCByZWFsbHkgbWFrZSBhIG5vdGUgdG8gY2hlY2sgdGhhdCBjb2RlIHBhdGggdG9vLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC91bml4L2FmX3VuaXguYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIzODksCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjM4OTpcdHN0YXRpYyBpbnQgdW5peF9zdHJlYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4yMzkwOlx0XHRcdFx0ICAgICAgIHNpemVfdCBsZW4pXG4yMzkxOlx0e1xuMjM5MjpcdFx0c3RydWN0IHNvY2sgKnNrID0gc29jay1cdTAwM2VzaztcbjIzOTM6XHRcdHN0cnVjdCBza19idWZmICpza2IgPSBOVUxMO1xuMjM5NDpcdFx0c3RydWN0IHNvY2sgKm90aGVyID0gTlVMTDtcbjIzOTU6XHRcdHN0cnVjdCB1bml4X3NvY2sgKm90aGVydTtcbjIzOTY6XHRcdHN0cnVjdCBzY21fY29va2llIHNjbTtcbjIzOTc6XHRcdGJvb2wgZmRzX3NlbnQgPSBmYWxzZTtcbjIzOTg6XHRcdGludCBlcnIsIHNlbnQgPSAwO1xuMjM5OTpcdFxuMjQwMDpcdFx0ZXJyID0gc2NtX3NlbmQoc29jaywgbXNnLCBcdTAwMjZzY20sIGZhbHNlKTtcbjI0MDE6XHRcdGlmIChlcnIgXHUwMDNjIDApXG4yNDAyOlx0XHRcdHJldHVybiBlcnI7XG4yNDAzOlx0XG4yNDA0Olx0XHRpZiAobXNnLVx1MDAzZW1zZ19mbGFncyBcdTAwMjYgTVNHX09PQikge1xuMjQwNTpcdFx0XHRlcnIgPSAtRU9QTk9UU1VQUDtcbjI0MDY6XHQjaWYgSVNfRU5BQkxFRChDT05GSUdfQUZfVU5JWF9PT0IpXG4yNDA3Olx0XHRcdGlmIChsZW4pXG4yNDA4Olx0XHRcdFx0bGVuLS07XG4yNDA5Olx0XHRcdGVsc2VcbjI0MTA6XHQjZW5kaWZcbjI0MTE6XHRcdFx0XHRnb3RvIG91dF9lcnI7XG4yNDEyOlx0XHR9XG4yNDEzOlx0XG4yNDE0Olx0XHRpZiAobXNnLVx1MDAzZW1zZ19uYW1lbGVuKSB7XG4yNDE1Olx0XHRcdGVyciA9IFJFQURfT05DRShzay1cdTAwM2Vza19zdGF0ZSkgPT0gVENQX0VTVEFCTElTSEVEID8gLUVJU0NPTk4gOiAtRU9QTk9UU1VQUDtcbjI0MTY6XHRcdFx0Z290byBvdXRfZXJyO1xuMjQxNzpcdFx0fVxuMjQxODpcdFxuMjQxOTpcdFx0b3RoZXIgPSB1bml4X3BlZXIoc2spO1xuMjQyMDpcdFx0aWYgKCFvdGhlcikge1xuMjQyMTpcdFx0XHRlcnIgPSAtRU5PVENPTk47XG4yNDIyOlx0XHRcdGdvdG8gb3V0X2VycjtcbjI0MjM6XHRcdH1cbjI0MjQ6XHRcbjI0MjU6XHRcdG90aGVydSA9IHVuaXhfc2sob3RoZXIpO1xuMjQyNjpcdFxuMjQyNzpcdFx0aWYgKFJFQURfT05DRShzay1cdTAwM2Vza19zaHV0ZG93bikgXHUwMDI2IFNFTkRfU0hVVERPV04pXG4yNDI4Olx0XHRcdGdvdG8gb3V0X3BpcGU7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM3MzU1CgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNDYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHByZXNlbnRlZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZToKCioqRGl2aW5nIGludG8gdGhlIFVuaXggU29ja2V0IEltcGxlbWVudGF0aW9uKioKClJpZ2h0LCBgdW5peF9zdHJlYW1fc2VuZG1zZ2AgaGFzIG1lIGludGVyZXN0ZWQuIEl0IGxvb2tzIGxpa2UgaXQgdXRpbGl6ZXMgYHNjbV9zZW5kYCwgYW5kIHRoYXQgZnVuY3Rpb24mIzM5O3MgbWVtc2V0dGluZyBvZiBgc2NtYCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZC4gSSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBoYXBwZW5pbmcgbW9yZSBkZWVwbHkuIE5vdyBJJiMzOTttIGdvaW5nIHRvIGxvb2sgYXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVjZWl2ZSBwYXRoLiBJJiMzOTtsbCBuZWVkIHRvIGNoZWNrIGhvdyB0aGUgZGF0YWdyYW0gY2FzZSBpcyBoYW5kbGVkLCBzcGVjaWZpY2FsbHkgYF9fdW5peF9kZ3JhbV9yZWN2bXNnYC4gVGhlbiwgdG8gcm91bmQgdGhpbmdzIG91dCwgSSYjMzk7bGwgbmVlZCB0byBmb2xsb3cgaG93IHRoZSBzdHJlYW0gZGF0YSBpcyByZWFkIGluIGdlbmVyYWwsIHNvIGxldCYjMzk7cyBjaGVjayBgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljYC4gVGhhdCBzaG91bGQgZ2l2ZSBtZSBhIGdvb2QgaGFuZGxlIG9uIHRoZSBjb21wbGV0ZSBkYXRhIGZsb3cuIFRoaXMgd2lsbCBsaWtlbHkgZXhwb3NlIHRoZSBpbnRlcmFjdGlvbiBhbmQgc3luY2hyb25pemF0aW9uIGFyb3VuZCB0aG9zZSBTQ00gc3RydWN0dXJlcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6Mzk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNTc0LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI1NzQ6XHRpbnQgX191bml4X2RncmFtX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLFxuMjU3NTpcdFx0XHRcdCBpbnQgZmxhZ3MpXG4yNTc2Olx0e1xuMjU3NzpcdFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xuMjU3ODpcdFx0c3RydWN0IHNvY2tldCAqc29jayA9IHNrLVx1MDAzZXNrX3NvY2tldDtcbjI1Nzk6XHRcdHN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTtcbjI1ODA6XHRcdHN0cnVjdCBza19idWZmICpza2IsICpsYXN0O1xuMjU4MTpcdFx0bG9uZyB0aW1lbztcbjI1ODI6XHRcdGludCBza2lwO1xuMjU4MzpcdFx0aW50IGVycjtcbjI1ODQ6XHRcbjI1ODU6XHRcdGVyciA9IC1FT1BOT1RTVVBQO1xuMjU4NjpcdFx0aWYgKGZsYWdzXHUwMDI2TVNHX09PQilcbjI1ODc6XHRcdFx0Z290byBvdXQ7XG4yNTg4Olx0XG4yNTg5Olx0XHR0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzIFx1MDAyNiBNU0dfRE9OVFdBSVQpO1xuMjU5MDpcdFxuMjU5MTpcdFx0ZG8ge1xuMjU5MjpcdFx0XHRtdXRleF9sb2NrKFx1MDAyNnUtXHUwMDNlaW9sb2NrKTtcbjI1OTM6XHRcbjI1OTQ6XHRcdFx0c2tpcCA9IHNrX3BlZWtfb2Zmc2V0KHNrLCBmbGFncyk7XG4yNTk1Olx0XHRcdHNrYiA9IF9fc2tiX3RyeV9yZWN2X2RhdGFncmFtKHNrLCBcdTAwMjZzay1cdTAwM2Vza19yZWNlaXZlX3F1ZXVlLCBmbGFncyxcbjI1OTY6XHRcdFx0XHRcdFx0ICAgICAgXHUwMDI2c2tpcCwgXHUwMDI2ZXJyLCBcdTAwMjZsYXN0KTtcbjI1OTc6XHRcdFx0aWYgKHNrYikge1xuMjU5ODpcdFx0XHRcdGlmICghKGZsYWdzIFx1MDAyNiBNU0dfUEVFSykpXG4yNTk5Olx0XHRcdFx0XHRzY21fc3RhdF9kZWwoc2ssIHNrYik7XG4yNjAwOlx0XHRcdFx0YnJlYWs7XG4yNjAxOlx0XHRcdH1cbjI2MDI6XHRcbjI2MDM6XHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNnUtXHUwMDNlaW9sb2NrKTtcbjI2MDQ6XHRcbjI2MDU6XHRcdFx0aWYgKGVyciAhPSAtRUFHQUlOKVxuMjYwNjpcdFx0XHRcdGJyZWFrO1xuMjYwNzpcdFx0fSB3aGlsZSAodGltZW8gXHUwMDI2XHUwMDI2XG4yNjA4Olx0XHRcdCAhX19za2Jfd2FpdF9mb3JfbW9yZV9wYWNrZXRzKHNrLCBcdTAwMjZzay1cdTAwM2Vza19yZWNlaXZlX3F1ZXVlLFxuMjYwOTpcdFx0XHRcdFx0XHQgICAgICBcdTAwMjZlcnIsIFx1MDAyNnRpbWVvLCBsYXN0KSk7XG4yNjEwOlx0XG4yNjExOlx0XHRpZiAoIXNrYikgeyAvKiBpbXBsaWVzIGlvbG9jayB1bmxvY2tlZCAqL1xuMjYxMjpcdFx0XHQvKiBTaWduYWwgRU9GIG9uIGRpc2Nvbm5lY3RlZCBub24tYmxvY2tpbmcgU0VRUEFDS0VUIHNvY2tldC4gKi9cbjI2MTM6XHRcdFx0aWYgKHNrLVx1MDAzZXNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQgXHUwMDI2XHUwMDI2IGVyciA9PSAtRUFHQUlOIFx1MDAyNlx1MDAyNlxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzODI0NQoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDE3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBhbmFseXppbmcgdGhhdCBjb2RlIHNuaXBwZXQ6CgoqKkRpdmluZyBEZWVwZXIgaW50byBgX191bml4X2RncmFtX3JlY3Ztc2dgKioKCk9rYXksIHNvIHdlJiMzOTtyZSBsb29raW5nIGF0IHRoZSByZW1haW5kZXIgb2YgdGhlIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBjb21wbGV0ZSBvcGVyYXRpb25hbCBmbG93IHRvIHRydWx5IGdyYXNwIGl0cyBpbXBsaWNhdGlvbnMgZm9yIHRoZSBvdmVyYWxsIHN5c3RlbSBiZWhhdmlvci4gV2hhdCBhcmUgdGhlIHNwZWNpZmljIGNvbmRpdGlvbnMgdGhhdCB0cmlnZ2VyIHBhcnRpY3VsYXIgcGF0aHMgd2l0aGluIHRoaXMgcm91dGluZT8gSG93IGRvZXMgaXQgaGFuZGxlIHBvdGVudGlhbCBlcnJvcnMsIGFuZCB3aGF0IGFyZSB0aGUgaW1wbGljYXRpb25zIG9mIHRob3NlIGVycm9yIGNvbmRpdGlvbnM/IEFyZSB0aGVyZSBhbnkgc3VidGxlIHJhY2UgY29uZGl0aW9ucyBvciBjb25jdXJyZW5jeSBpc3N1ZXMgdGhhdCBtaWdodCBlbWVyZ2Ugd2l0aGluIHRoaXMgZnVuY3Rpb24/IEkmIzM5O2xsIG5lZWQgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgaG93IGRhdGEgaXMgdmFsaWRhdGVkIGFuZCBjb3BpZWQsIGFzIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9ucyBhcmUgb2Z0ZW4gYSBzb3VyY2Ugb2YgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gTm93LCBsZXQmIzM5O3Mgc3RhcnQgZGlzc2VjdGluZyBpdCBsaW5lIGJ5IGxpbmUsIHBheWluZyBjbG9zZSBhdHRlbnRpb24gdG8gZGF0YSBzdHJ1Y3R1cmUgaW50ZXJhY3Rpb25zLiBUaGUgY3JpdGljYWwgcGF0aCB3b3VsZCBiZSB3aGVyZSB0aGUgZGF0YSBnZXRzIG1hcnNoYWxlZCwgYW5kIGlmIGFueSBsb2NrcyBhcmUgbmVlZGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjY2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC91bml4L2FmX3VuaXguYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI2NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjY1MDpcdFx0XHRcdHVuaXhfZGV0YWNoX2ZkcyhcdTAwMjZzY20sIHNrYik7XG4yNjUxOlx0XG4yNjUyOlx0XHRcdHNrX3BlZWtfb2Zmc2V0X2J3ZChzaywgc2tiLVx1MDAzZWxlbik7XG4yNjUzOlx0XHR9IGVsc2Uge1xuMjY1NDpcdFx0XHQvKiBJdCBpcyBxdWVzdGlvbmFibGU6IG9uIFBFRUsgd2UgY291bGQ6XG4yNjU1Olx0XHRcdCAgIC0gZG8gbm90IHJldHVybiBmZHMgLSBnb29kLCBidXQgdG9vIHNpbXBsZSA4KVxuMjY1NjpcdFx0XHQgICAtIHJldHVybiBmZHMsIGFuZCBkbyBub3QgcmV0dXJuIHRoZW0gb24gcmVhZCAob2xkIHN0cmF0ZWd5LFxuMjY1NzpcdFx0XHQgICAgIGFwcGFyZW50bHkgd3JvbmcpXG4yNjU4Olx0XHRcdCAgIC0gY2xvbmUgZmRzIChJIGNob3NlIGl0IGZvciBub3csIGl0IGlzIHRoZSBtb3N0IHVuaXZlcnNhbFxuMjY1OTpcdFx0XHQgICAgIHNvbHV0aW9uKVxuMjY2MDpcdFxuMjY2MTpcdFx0XHQgICBQT1NJWCAxMDAzLjFnIGRvZXMgbm90IGFjdHVhbGx5IGRlZmluZSB0aGlzIGNsZWFybHlcbjI2NjI6XHRcdFx0ICAgYXQgYWxsLiBQT1NJWCAxMDAzLjFnIGRvZXNuJiMzOTt0IGRlZmluZSBhIGxvdCBvZiB0aGluZ3NcbjI2NjM6XHRcdFx0ICAgY2xlYXJseSBob3dldmVyIVxuMjY2NDpcdFxuMjY2NTpcdFx0XHQqL1xuMjY2NjpcdFxuMjY2NzpcdFx0XHRza19wZWVrX29mZnNldF9md2Qoc2ssIHNpemUpO1xuMjY2ODpcdFxuMjY2OTpcdFx0XHRpZiAoVU5JWENCKHNrYikuZnApXG4yNjcwOlx0XHRcdFx0dW5peF9wZWVrX2ZkcyhcdTAwMjZzY20sIHNrYik7XG4yNjcxOlx0XHR9XG4yNjcyOlx0XHRlcnIgPSAoZmxhZ3MgXHUwMDI2IE1TR19UUlVOQykgPyBza2ItXHUwMDNlbGVuIC0gc2tpcCA6IHNpemU7XG4yNjczOlx0XG4yNjc0Olx0XHRzY21fcmVjdl91bml4KHNvY2ssIG1zZywgXHUwMDI2c2NtLCBmbGFncyk7XG4yNjc1Olx0XG4yNjc2Olx0b3V0X2ZyZWU6XG4yNjc3Olx0XHRza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTtcbjI2Nzg6XHRcdG11dGV4X3VubG9jayhcdTAwMjZ1LVx1MDAzZWlvbG9jayk7XG4yNjc5Olx0b3V0OlxuMjY4MDpcdFx0cmV0dXJuIGVycjtcbjI2ODE6XHR9XG4yNjgyOlx0XG4yNjgzOlx0c3RhdGljIGludCB1bml4X2RncmFtX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSxcbjI2ODQ6XHRcdFx0XHQgICAgICBpbnQgZmxhZ3MpXG4yNjg1Olx0e1xuMjY4NjpcdFx0c3RydWN0IHNvY2sgKnNrID0gc29jay1cdTAwM2VzaztcbjI2ODc6XHRcbjI2ODg6XHQjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4yNjg5Olx0XHRjb25zdCBzdHJ1Y3QgcHJvdG8gKnByb3QgPSBSRUFEX09OQ0Uoc2stXHUwMDNlc2tfcHJvdCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM5MTAxCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNTEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AgSW5pdGlhbGl6YXRpb24qKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBzY21gIGlzIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgYF9fdW5peF9kZ3JhbV9yZWN2bXNnYCBmdW5jdGlvbi4gTGV0JiMzOTtzIGdldCByaWdodCB0byBpdC4gSSYjMzk7bSBnb2luZyB0byBzdGFydCBieSBleGFtaW5pbmcgbGluZXMgMjYxNS0yNjUwIG9mIHRoYXQgZnVuY3Rpb24uIFRoYXQmIzM5O3MgdXN1YWxseSBhIGdvb2QgcGxhY2UgdG8gc3RhcnQgZm9yIHRoaXMga2luZCBvZiB0aGluZy4gTGV0JiMzOTtzIHNlZSB3aGF0IHRoZSBjb2RlIGlzIHRlbGxpbmcgdXMuIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBjbG9zZWx5IGF0IGhvdyB0aGUgY29udHJvbCBtZXNzYWdlIGRhdGEgaXMgaGFuZGxlZCBhbmQgYWxsb2NhdGVkLCBwYXJ0aWN1bGFybHkgZm9jdXNpbmcgb24gYW55IHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgb3IgcmVzb3VyY2UgbGltaXRhdGlvbnMuIFRoaXMgaXMgbGlrZWx5IHdoZXJlIHRoZSBjb3JlIG9mIHRoZSBwcm9ibGVtIGxpZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L3VuaXgvYWZfdW5peC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjYyNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyNjI1Olx0XHRcdHVuaXhfY29weV9hZGRyKG1zZywgc2tiLVx1MDAzZXNrKTtcbjI2MjY6XHRcbjI2Mjc6XHRcdFx0QlBGX0NHUk9VUF9SVU5fUFJPR19VTklYX1JFQ1ZNU0dfTE9DSyhzayxcbjI2Mjg6XHRcdFx0XHRcdFx0XHQgICAgICBtc2ctXHUwMDNlbXNnX25hbWUsXG4yNjI5Olx0XHRcdFx0XHRcdFx0ICAgICAgXHUwMDI2bXNnLVx1MDAzZW1zZ19uYW1lbGVuKTtcbjI2MzA6XHRcdH1cbjI2MzE6XHRcbjI2MzI6XHRcdGlmIChzaXplIFx1MDAzZSBza2ItXHUwMDNlbGVuIC0gc2tpcClcbjI2MzM6XHRcdFx0c2l6ZSA9IHNrYi1cdTAwM2VsZW4gLSBza2lwO1xuMjYzNDpcdFx0ZWxzZSBpZiAoc2l6ZSBcdTAwM2Mgc2tiLVx1MDAzZWxlbiAtIHNraXApXG4yNjM1Olx0XHRcdG1zZy1cdTAwM2Vtc2dfZmxhZ3MgfD0gTVNHX1RSVU5DO1xuMjYzNjpcdFxuMjYzNzpcdFx0ZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fbXNnKHNrYiwgc2tpcCwgbXNnLCBzaXplKTtcbjI2Mzg6XHRcdGlmIChlcnIpXG4yNjM5Olx0XHRcdGdvdG8gb3V0X2ZyZWU7XG4yNjQwOlx0XG4yNjQxOlx0XHRpZiAoc29ja19mbGFnKHNrLCBTT0NLX1JDVlRTVEFNUCkpXG4yNjQyOlx0XHRcdF9fc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpO1xuMjY0MzpcdFxuMjY0NDpcdFx0bWVtc2V0KFx1MDAyNnNjbSwgMCwgc2l6ZW9mKHNjbSkpO1xuMjY0NTpcdFxuMjY0NjpcdFx0dW5peF9za2JfdG9fc2NtKHNrYiwgXHUwMDI2c2NtKTtcbjI2NDc6XHRcbjI2NDg6XHRcdGlmICghKGZsYWdzIFx1MDAyNiBNU0dfUEVFSykpIHtcbjI2NDk6XHRcdFx0aWYgKFVOSVhDQihza2IpLmZwKVxuMjY1MDpcdFx0XHRcdHVuaXhfZGV0YWNoX2ZkcyhcdTAwMjZzY20sIHNrYik7XG4yNjUxOlx0XG4yNjUyOlx0XHRcdHNrX3BlZWtfb2Zmc2V0X2J3ZChzaywgc2tiLVx1MDAzZWxlbik7XG4yNjUzOlx0XHR9IGVsc2Uge1xuMjY1NDpcdFx0XHQvKiBJdCBpcyBxdWVzdGlvbmFibGU6IG9uIFBFRUsgd2UgY291bGQ6XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM5ODEyCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogNTMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgIGFmdGVyIFNDTSBJbml0aWFsaXphdGlvbioqCgpPa2F5LCBzbyBJJiMzOTt2ZSBqdXN0IHplcm9lZCBvdXQgdGhlIGBzY21gIHN0cnVjdCB3aXRoIGBtZW1zZXRgIGFuZCB0aGVuIHBvcHVsYXRlZCBpdCB3aXRoIGB1bml4X3NrYl90b19zY21gIHVzaW5nIHRoZSBjdXJyZW50IGBza2JgLiBUaGF0JiMzOTtzIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uLCBlbnN1cmluZyBhIGNsZWFuIHNsYXRlIGJlZm9yZSBwb3RlbnRpYWxseSByZWFkaW5nIGNvbnRyb2wgZGF0YS4gTm93LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0JiMzOTtzIGhhcHBlbmluZyB3aXRoaW4gYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AuIEkmIzM5O20gZ29pbmcgdG8gY2FyZWZ1bGx5IHRyYWNlIGl0cyBsb2dpYyBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBpbml0aWFsaXplZCBgc2NtYC4gSSBleHBlY3QgaXQmIzM5O2xsIHVzZSB0aGlzIGBzY21gIGluZm9ybWF0aW9uIHRvIGRldGVybWluZSBob3cgdGhlIHJlYWQgb3BlcmF0aW9uIHByb2NlZWRzLCBwYXJ0aWN1bGFybHkgd2l0aCByZXNwZWN0IHRvIGFueSBhdHRhY2hlZCBhbmNpbGxhcnkgZGF0YSBvciBjb250cm9sIG1lc3NhZ2VzLiBUaW1lIHRvIGRpdmUgaW4gYW5kIHNlZSBob3cgdGhlIGRhdGEgZmxvdyBpcyBoYW5kbGVkIGZyb20gaGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyOTI1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDQ1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzI5MjU6XHRcdHN0cnVjdCBzb2NrICpzayA9IHNvY2stXHUwMDNlc2s7XG4yOTI2Olx0XHRzaXplX3Qgc2l6ZSA9IHN0YXRlLVx1MDAzZXNpemU7XG4yOTI3Olx0XHRpbnQgZmxhZ3MgPSBzdGF0ZS1cdTAwM2VmbGFncztcbjI5Mjg6XHRcdGJvb2wgY2hlY2tfY3JlZHMgPSBmYWxzZTtcbjI5Mjk6XHRcdHN0cnVjdCBzY21fY29va2llIHNjbTtcbjI5MzA6XHRcdHN0cnVjdCB1bml4X3NvY2sgKnU7XG4yOTMxOlx0XHRpbnQgY29waWVkID0gMDtcbjI5MzI6XHRcdGludCBlcnIgPSAwO1xuMjkzMzpcdFx0bG9uZyB0aW1lbztcbjI5MzQ6XHRcdGludCB0YXJnZXQ7XG4yOTM1Olx0XHRpbnQgc2tpcDtcbjI5MzY6XHRcbjI5Mzc6XHRcdGlmICh1bmxpa2VseShSRUFEX09OQ0Uoc2stXHUwMDNlc2tfc3RhdGUpICE9IFRDUF9FU1RBQkxJU0hFRCkpIHtcbjI5Mzg6XHRcdFx0ZXJyID0gLUVJTlZBTDtcbjI5Mzk6XHRcdFx0Z290byBvdXQ7XG4yOTQwOlx0XHR9XG4yOTQxOlx0XG4yOTQyOlx0XHRpZiAodW5saWtlbHkoZmxhZ3MgXHUwMDI2IE1TR19PT0IpKSB7XG4yOTQzOlx0XHRcdGVyciA9IC1FT1BOT1RTVVBQO1xuMjk0NDpcdCNpZiBJU19FTkFCTEVEKENPTkZJR19BRl9VTklYX09PQilcbjI5NDU6XHRcdFx0ZXJyID0gdW5peF9zdHJlYW1fcmVjdl91cmcoc3RhdGUpO1xuMjk0NjpcdCNlbmRpZlxuMjk0NzpcdFx0XHRnb3RvIG91dDtcbjI5NDg6XHRcdH1cbjI5NDk6XHRcbjI5NTA6XHRcdHRhcmdldCA9IHNvY2tfcmN2bG93YXQoc2ssIGZsYWdzIFx1MDAyNiBNU0dfV0FJVEFMTCwgc2l6ZSk7XG4yOTUxOlx0XHR0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIG5vYmxvY2spO1xuMjk1MjpcdFxuMjk1MzpcdFx0bWVtc2V0KFx1MDAyNnNjbSwgMCwgc2l6ZW9mKHNjbSkpO1xuMjk1NDpcdFxuMjk1NTpcdFx0dSA9IHVuaXhfc2soc2spO1xuMjk1NjpcdFxuMjk1NzpcdHJlZG86XG4yOTU4Olx0XHQvKiBMb2NrIHRoZSBzb2NrZXQgdG8gcHJldmVudCBxdWV1ZSBkaXNvcmRlcmluZ1xuMjk1OTpcdFx0ICogd2hpbGUgc2xlZXBzIGluIG1lbWNweV90b21zZ1xuMjk2MDpcdFx0ICovXG4yOTYxOlx0XHRtdXRleF9sb2NrKFx1MDAyNnUtXHUwMDNlaW9sb2NrKTtcbjI5NjI6XHRcbjI5NjM6XHRcdHNraXAgPSBtYXgoc2tfcGVla19vZmZzZXQoc2ssIGZsYWdzKSwgMCk7XG4yOTY0Olx0XG4yOTY1Olx0XHRkbyB7XG4yOTY2Olx0XHRcdHN0cnVjdCBza19idWZmICpza2IsICpsYXN0O1xuMjk2NzpcdFx0XHRpbnQgY2h1bms7XG4yOTY4Olx0XG4yOTY5Olx0XHRcdHVuaXhfc3RhdGVfbG9jayhzayk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzEvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQwNjc1CgkJCQkJCQlvdXRwdXQ6IDI2CgkJCQkJCQl0aG91Z2h0czogNzkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBhbiBleHBlcnQgaW4gdGhlIGZpZWxkOgoKKipEZWJ1Z2dpbmcgYSBQb3RlbnRpYWwgU29ja2V0IENvbnRyb2wgTWVzc2FnZSAoU0NNKSBJc3N1ZSoqCgpPa2F5LCBzbyBgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljYCBpcyB6ZXJvaW5nIG91dCB0aGUgYHNjbWAgc3RydWN0dXJlIHdpdGggYG1lbXNldGAgb24gbGluZSAyOTUzLiBUaGF0JiMzOTtzIGdvb2QgcHJhY3RpY2UsIGVuc3VyaW5nIGEgY2xlYW4gc2xhdGUgYmVmb3JlIHBvdGVudGlhbGx5IHJlY2VpdmluZyBjb250cm9sIG1lc3NhZ2VzLiBOb3csIGEgY3JpdGljYWwgcXVlc3Rpb24gYXJpc2VzOiBpcyB0aGUgYFVOSVhDQihza2IpYCBkYXRhIHN0cnVjdHVyZSBwcm9wZXJseSBpbml0aWFsaXplZCBvciByZXNldCAqYmVmb3JlKiB0aGF0IHBvaW50PyBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGF0IGEgc3RhbGUgb3IgdW5pbml0aWFsaXplZCBgVU5JWENCKHNrYilgIGNvdWxkIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBvciBtZW1vcnkgY29ycnVwdGlvbiwgZXNwZWNpYWxseSByZWxhdGVkIHRvIHRoZSBoYW5kbGluZyBvZiBzb2NrZXQgY29udHJvbCBtZXNzYWdlcy4gSSBuZWVkIHRvIHRyYWNlIHRoZSBsaWZlY3ljbGUgb2YgYFVOSVhDQihza2IpYC4gTGV0JiMzOTtzIHVzZSBgZ3JlcGAgd2l0aGluIHRoZSBgbmV0L3VuaXgvYCBkaXJlY3RvcnkgdG8gaHVudCBkb3duIGV2ZXJ5IGluc3RhbmNlIG9mIGBVTklYQ0JgLiBUaGF0IHdpbGwgc2hvdyBtZSBpdHMgaW5pdGlhbGl6YXRpb24gcG9pbnRzLiBJIHdhbnQgdG8gc2VlIGhvdyBhbmQgd2hlcmUgaXQmIzM5O3Mgc2V0IGFuZCByZXNldCB0byBjb25maXJtIGl0IGlzIGhhbmRsZWQgY29ycmVjdGx5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjcyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtVTklYQ0ImIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdW5peCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmM9MjU2PXN0YXRpYyB2b2lkIHVuaXhfZ2V0X3NlY2RhdGEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC91bml4L2FmX3VuaXguYy0yNTcte1xubmV0L3VuaXgvYWZfdW5peC5jOjI1ODpcdFVOSVhDQihza2IpLnNlY2lkID0gc2NtLVx1MDAzZXNlY2lkO1xubmV0L3VuaXgvYWZfdW5peC5jLTI1OS19XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTI2MT1zdGF0aWMgaW5saW5lIHZvaWQgdW5peF9zZXRfc2VjZGF0YShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxubmV0L3VuaXgvYWZfdW5peC5jLTI2Mi17XG5uZXQvdW5peC9hZl91bml4LmM6MjYzOlx0c2NtLVx1MDAzZXNlY2lkID0gVU5JWENCKHNrYikuc2VjaWQ7XG5uZXQvdW5peC9hZl91bml4LmMtMjY0LX1cbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjY2PXN0YXRpYyBpbmxpbmUgYm9vbCB1bml4X3NlY2RhdGFfZXEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC91bml4L2FmX3VuaXguYy0yNjcte1xubmV0L3VuaXgvYWZfdW5peC5jOjI2ODpcdHJldHVybiAoc2NtLVx1MDAzZXNlY2lkID09IFVOSVhDQihza2IpLnNlY2lkKTtcbm5ldC91bml4L2FmX3VuaXguYy0yNjktfVxuLS1cbm5ldC91bml4L2FmX3VuaXguYz02NjA9c3RhdGljIHVuc2lnbmVkIGludCB1bml4X3NrYl9sZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcbm5ldC91bml4L2FmX3VuaXguYy02NjEte1xubmV0L3VuaXgvYWZfdW5peC5jOjY2MjpcdHJldHVybiBza2ItXHUwMDNlbGVuIC0gVU5JWENCKHNrYikuY29uc3VtZWQ7XG5uZXQvdW5peC9hZl91bml4LmMtNjYzLX1cbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MTk0MD1zdGF0aWMgaW50IHVuaXhfYXR0YWNoX2ZkcyhzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0xOTQ0LVxubmV0L3VuaXgvYWZfdW5peC5jOjE5NDU6XHRVTklYQ0Ioc2tiKS5mcCA9IHNjbS1cdTAwM2VmcDtcbm5ldC91bml4L2FmX3VuaXguYy0xOTQ2LVx0c2NtLVx1MDAzZWZwID0gTlVMTDtcbm5ldC91bml4L2FmX3VuaXguYy0xOTQ3LVxubmV0L3VuaXgvYWZfdW5peC5jOjE5NDg6XHRpZiAodW5peF9wcmVwYXJlX2ZwbChVTklYQ0Ioc2tiKS5mcCkpXG5uZXQvdW5peC9hZl91bml4LmMtMTk0OS1cdFx0cmV0dXJuIC1FTk9NRU07XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTE5NTQ9c3RhdGljIHZvaWQgdW5peF9kZXRhY2hfZmRzKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdW5peC9hZl91bml4LmMtMTk1NS17XG5uZXQvdW5peC9hZl91bml4LmM6MTk1NjpcdHNjbS1cdTAwM2VmcCA9IFVOSVhDQihza2IpLmZwO1xubmV0L3VuaXgvYWZfdW5peC5jOjE5NTc6XHRVTklYQ0Ioc2tiKS5mcCA9IE5VTEw7XG5uZXQvdW5peC9hZl91bml4LmMtMTk1OC1cbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MTk2Mj1zdGF0aWMgdm9pZCB1bml4X3BlZWtfZmRzKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IpXG5uZXQvdW5peC9hZl91bml4LmMtMTk2My17XG5uZXQvdW5peC9hZl91bml4LmM6MTk2NDpcdHNjbS1cdTAwM2VmcCA9IHNjbV9mcF9kdXAoVU5JWENCKHNrYikuZnApO1xubmV0L3VuaXgvYWZfdW5peC5jLTE5NjUtXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTE5Njk9c3RhdGljIHZvaWQgdW5peF9kZXN0cnVjdF9zY20oc3RydWN0IHNrX2J1ZmYgKnNrYilcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMTk3Mi1cbm5ldC91bml4L2FmX3VuaXguYzoxOTczOlx0c3dhcF9waWRzKHNjbS5waWQsIFVOSVhDQihza2IpLnBpZCk7XG5uZXQvdW5peC9hZl91bml4LmMtMTk3NC1cbm5ldC91bml4L2FmX3VuaXguYzoxOTc1Olx0aWYgKFVOSVhDQihza2IpLmZwKVxubmV0L3VuaXgvYWZfdW5peC5jLTE5NzYtXHRcdHVuaXhfZGV0YWNoX2ZkcyhcdTAwMjZzY20sIHNrYik7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTE5ODc9c3RhdGljIGludCB1bml4X3NjbV90b19za2Ioc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBzZW5kX2Zkcylcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMTk5MC1cbm5ldC91bml4L2FmX3VuaXguYzoxOTkxOlx0Z2V0X3BpZHMoVU5JWENCKHNrYikucGlkLCBzY20tXHUwMDNlcGlkKTtcbm5ldC91bml4L2FmX3VuaXguYzoxOTkyOlx0VU5JWENCKHNrYikudWlkID0gc2NtLVx1MDAzZWNyZWRzLnVpZDtcbm5ldC91bml4L2FmX3VuaXguYzoxOTkzOlx0VU5JWENCKHNrYikuZ2lkID0gc2NtLVx1MDAzZWNyZWRzLmdpZDtcbm5ldC91bml4L2FmX3VuaXguYzoxOTk0Olx0VU5JWENCKHNrYikuZnAgPSBOVUxMO1xubmV0L3VuaXgvYWZfdW5peC5jLTE5OTUtXHR1bml4X2dldF9zZWNkYXRhKHNjbSwgc2tiKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjAwMz1zdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbm5ldC91bml4L2FmX3VuaXguYy0yMDA0LXtcbm5ldC91bml4L2FmX3VuaXguYzoyMDA1Olx0Z2V0X3BpZHMoc2NtLVx1MDAzZXBpZCwgVU5JWENCKHNrYikucGlkKTtcbm5ldC91bml4L2FmX3VuaXguYy0yMDA2LVx0c2NtLVx1MDAzZWNyZWRzLnBpZCA9IHBpZF92bnIoc2NtLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdKTtcbm5ldC91bml4L2FmX3VuaXguYzoyMDA3Olx0c2NtLVx1MDAzZWNyZWRzLnVpZCA9IFVOSVhDQihza2IpLnVpZDtcbm5ldC91bml4L2FmX3VuaXguYzoyMDA4Olx0c2NtLVx1MDAzZWNyZWRzLmdpZCA9IFVOSVhDQihza2IpLmdpZDtcbm5ldC91bml4L2FmX3VuaXguYy0yMDA5LVx0dW5peF9zZXRfc2VjZGF0YShzY20sIHNrYik7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTIwMjU9c3RhdGljIGludCB1bml4X21heWJlX2FkZF9jcmVkcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTIwMjcte1xubmV0L3VuaXgvYWZfdW5peC5jOjIwMjg6XHRpZiAoVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0pXG5uZXQvdW5peC9hZl91bml4LmMtMjAyOS1cdFx0cmV0dXJuIDA7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTIwMzQtXG5uZXQvdW5peC9hZl91bml4LmM6MjAzNTpcdFx0Z2V0X3Rhc2tfcGlkcyhVTklYQ0Ioc2tiKS5waWQsIGN1cnJlbnQpO1xubmV0L3VuaXgvYWZfdW5peC5jOjIwMzY6XHRcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoVU5JWENCKHNrYikucGlkKTtcbm5ldC91bml4L2FmX3VuaXguYy0yMDM3LVx0XHRpZiAodW5saWtlbHkoZXJyKSkge1xubmV0L3VuaXgvYWZfdW5peC5jOjIwMzg6XHRcdFx0cHV0X3BpZHMoVU5JWENCKHNrYikucGlkKTtcbm5ldC91bml4L2FmX3VuaXguYy0yMDM5LVx0XHRcdHJldHVybiBlcnI7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTIwNDEtXG5uZXQvdW5peC9hZl91bml4LmM6MjA0MjpcdFx0Y3VycmVudF91aWRfZ2lkKFx1MDAyNlVOSVhDQihza2IpLnVpZCwgXHUwMDI2VU5JWENCKHNrYikuZ2lkKTtcbm5ldC91bml4L2FmX3VuaXguYy0yMDQzLVx0fVxuLS1cbm5ldC91bml4L2FmX3VuaXguYz0yMDQ4PXN0YXRpYyBib29sIHVuaXhfc2tiX3NjbV9lcShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTIwNTItXHRpZiAoc2stXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZCBcdTAwMjZcdTAwMjZcbm5ldC91bml4L2FmX3VuaXguYzoyMDUzOlx0ICAgIFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1BJRF0gIT0gc2NtLVx1MDAzZXBpZFtQSURUWVBFX1BJRF0pXG5uZXQvdW5peC9hZl91bml4LmMtMjA1NC1cdFx0cmV0dXJuIGZhbHNlO1xubmV0L3VuaXgvYWZfdW5peC5jLTIwNTUtXG5uZXQvdW5peC9hZl91bml4LmM6MjA1NjpcdHJldHVybiBVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9UR0lEXSA9PSBzY20tXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gXHUwMDI2XHUwMDI2XG5uZXQvdW5peC9hZl91bml4LmM6MjA1NzpcdCAgICAgICB1aWRfZXEoVU5JWENCKHNrYikudWlkLCBzY20tXHUwMDNlY3JlZHMudWlkKSBcdTAwMjZcdTAwMjZcbm5ldC91bml4L2FmX3VuaXguYzoyMDU4Olx0ICAgICAgIGdpZF9lcShVTklYQ0Ioc2tiKS5naWQsIHNjbS1cdTAwM2VjcmVkcy5naWQpIFx1MDAyNlx1MDAyNlxubmV0L3VuaXgvYWZfdW5peC5jLTIwNTktXHQgICAgICAgdW5peF9zZWNkYXRhX2VxKHNjbSwgc2tiKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjA2Mj1zdGF0aWMgdm9pZCBzY21fc3RhdF9hZGQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxubmV0L3VuaXgvYWZfdW5peC5jLTIwNjMte1xubmV0L3VuaXgvYWZfdW5peC5jOjIwNjQ6XHRzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKmZwID0gVU5JWENCKHNrYikuZnA7XG5uZXQvdW5peC9hZl91bml4LmMtMjA2NS1cdHN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjA3Mz1zdGF0aWMgdm9pZCBzY21fc3RhdF9kZWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxubmV0L3VuaXgvYWZfdW5peC5jLTIwNzQte1xubmV0L3VuaXgvYWZfdW5peC5jOjIwNzU6XHRzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKmZwID0gVU5JWENCKHNrYikuZnA7XG5uZXQvdW5peC9hZl91bml4LmMtMjA3Ni1cdHN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjA5NT1zdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTIyNDktXG5uZXQvdW5peC9hZl91bml4LmM6MjI1MDpcdGlmIChVTklYQ0Ioc2tiKS5mcCBcdTAwMjZcdTAwMjYgIW90aGVyLVx1MDAzZXNrX3NjbV9yaWdodHMpIHtcbm5ldC91bml4L2FmX3VuaXguYy0yMjUxLVx0XHRlcnIgPSAtRVBFUk07XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTIzMjk9c3RhdGljIGludCBxdWV1ZV9vb2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpvdGhlcixcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMjM2Mi1cbm5ldC91bml4L2FmX3VuaXguYzoyMzYzOlx0aWYgKFVOSVhDQihza2IpLmZwIFx1MDAyNlx1MDAyNiAhb3RoZXItXHUwMDNlc2tfc2NtX3JpZ2h0cykge1xubmV0L3VuaXgvYWZfdW5peC5jLTIzNjQtXHRcdGVyciA9IC1FUEVSTTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjM4OT1zdGF0aWMgaW50IHVuaXhfc3RyZWFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0yNDg5LVxubmV0L3VuaXgvYWZfdW5peC5jOjI0OTA6XHRcdGlmIChVTklYQ0Ioc2tiKS5mcCBcdTAwMjZcdTAwMjYgIW90aGVyLVx1MDAzZXNrX3NjbV9yaWdodHMpIHtcbm5ldC91bml4L2FmX3VuaXguYy0yNDkxLVx0XHRcdHVuaXhfc3RhdGVfdW5sb2NrKG90aGVyKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MjU3ND1pbnQgX191bml4X2RncmFtX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0yNjQ4LVx0aWYgKCEoZmxhZ3MgXHUwMDI2IE1TR19QRUVLKSkge1xubmV0L3VuaXgvYWZfdW5peC5jOjI2NDk6XHRcdGlmIChVTklYQ0Ioc2tiKS5mcClcbm5ldC91bml4L2FmX3VuaXguYy0yNjUwLVx0XHRcdHVuaXhfZGV0YWNoX2ZkcyhcdTAwMjZzY20sIHNrYik7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTI2NjgtXG5uZXQvdW5peC9hZl91bml4LmM6MjY2OTpcdFx0aWYgKFVOSVhDQihza2IpLmZwKVxubmV0L3VuaXgvYWZfdW5peC5jLTI2NzAtXHRcdFx0dW5peF9wZWVrX2ZkcyhcdTAwMjZzY20sIHNrYik7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTI3Njk9c3RhdGljIGludCB1bml4X3N0cmVhbV9yZWN2X3VyZyhzdHJ1Y3QgdW5peF9zdHJlYW1fcmVhZF9zdGF0ZSAqc3RhdGUpXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTI4MDYtXHRpZiAoIShzdGF0ZS1cdTAwM2VmbGFncyBcdTAwMjYgTVNHX1BFRUspKVxubmV0L3VuaXgvYWZfdW5peC5jOjI4MDc6XHRcdFVOSVhDQihvb2Jfc2tiKS5jb25zdW1lZCAmIzQzOz0gMTtcbm5ldC91bml4L2FmX3VuaXguYy0yODA4LVxuLS1cbm5ldC91bml4L2FmX3VuaXguYz0yOTE5PXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljKHN0cnVjdCB1bml4X3N0cmVhbV9yZWFkX3N0YXRlICpzdGF0ZSxcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMzA2NC1cdFx0aWYgKCEoZmxhZ3MgXHUwMDI2IE1TR19QRUVLKSkge1xubmV0L3VuaXgvYWZfdW5peC5jOjMwNjU6XHRcdFx0VU5JWENCKHNrYikuY29uc3VtZWQgJiM0Mzs9IGNodW5rO1xubmV0L3VuaXgvYWZfdW5peC5jLTMwNjYtXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTMwNjgtXG5uZXQvdW5peC9hZl91bml4LmM6MzA2OTpcdFx0XHRpZiAoVU5JWENCKHNrYikuZnApIHtcbm5ldC91bml4L2FmX3VuaXguYy0zMDcwLVx0XHRcdFx0c2NtX3N0YXRfZGVsKHNrLCBza2IpO1xuLS1cbm5ldC91bml4L2FmX3VuaXguYy0zMDg5LVx0XHRcdCAqL1xubmV0L3VuaXgvYWZfdW5peC5jOjMwOTA6XHRcdFx0aWYgKFVOSVhDQihza2IpLmZwKVxubmV0L3VuaXgvYWZfdW5peC5jLTMwOTEtXHRcdFx0XHR1bml4X3BlZWtfZmRzKFx1MDAyNnNjbSwgc2tiKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtMzA5NC1cbm5ldC91bml4L2FmX3VuaXguYzozMDk1Olx0XHRcdGlmIChVTklYQ0Ioc2tiKS5mcClcbm5ldC91bml4L2FmX3VuaXguYy0zMDk2LVx0XHRcdFx0YnJlYWs7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTMxMjg9c3RhdGljIGludCB1bml4X3N0cmVhbV9yZWFkX2FjdG9yKHN0cnVjdCBza19idWZmICpza2IsXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTMxMzMtXG5uZXQvdW5peC9hZl91bml4LmM6MzEzNDpcdHJldCA9IHNrYl9jb3B5X2RhdGFncmFtX21zZyhza2IsIFVOSVhDQihza2IpLmNvbnN1bWVkICYjNDM7IHNraXAsXG5uZXQvdW5peC9hZl91bml4LmMtMzEzNS1cdFx0XHRcdCAgICBzdGF0ZS1cdTAwM2Vtc2csIGNodW5rKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmM9MzE3ND1zdGF0aWMgaW50IHVuaXhfc3RyZWFtX3NwbGljZV9hY3RvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuLS1cbm5ldC91bml4L2FmX3VuaXguYy0zMTc4LVx0cmV0dXJuIHNrYl9zcGxpY2VfYml0cyhza2IsIHN0YXRlLVx1MDAzZXNvY2tldC1cdTAwM2Vzayxcbm5ldC91bml4L2FmX3VuaXguYzozMTc5Olx0XHRcdCAgICAgICBVTklYQ0Ioc2tiKS5jb25zdW1lZCAmIzQzOyBza2lwLFxubmV0L3VuaXgvYWZfdW5peC5jLTMxODAtXHRcdFx0ICAgICAgIHN0YXRlLVx1MDAzZXBpcGUsIGNodW5rLCBzdGF0ZS1cdTAwM2VzcGxpY2VfZmxhZ3MpO1xuLS1cbm5ldC91bml4L2FmX3VuaXguaD0xND1zdHJ1Y3QgdW5peF9za2JfcGFybXMge1xuLS1cbm5ldC91bml4L2FmX3VuaXguaC0yNC1cbm5ldC91bml4L2FmX3VuaXguaDoyNTojZGVmaW5lIFVOSVhDQihza2IpXHQoKihzdHJ1Y3QgdW5peF9za2JfcGFybXMgKilcdTAwMjYoKHNrYiktXHUwMDNlY2IpKVxubmV0L3VuaXgvYWZfdW5peC5oLTI2LVxuLS1cbm5ldC91bml4L2dhcmJhZ2UuYz02MDY9c3RhdGljIHZvaWQgdW5peF9nYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspXG4tLVxubmV0L3VuaXgvZ2FyYmFnZS5jLTYyOS1cdHNrYl9xdWV1ZV93YWxrKFx1MDAyNmhpdGxpc3QsIHNrYikge1xubmV0L3VuaXgvZ2FyYmFnZS5jOjYzMDpcdFx0aWYgKFVOSVhDQihza2IpLmZwKVxubmV0L3VuaXgvZ2FyYmFnZS5jOjYzMTpcdFx0XHRVTklYQ0Ioc2tiKS5mcC1cdTAwM2VkZWFkID0gdHJ1ZTtcbm5ldC91bml4L2dhcmJhZ2UuYy02MzItXHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQ0ODQ5CgkJCQkJCQlvdXRwdXQ6IDM1CgkJCQkJCQl0aG91Z2h0czogNDMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIG15IG93biBtZW50YWwgcHJvY2VzcywgZ2l2ZW4gbXkgZXhwZXJ0aXNlOgoKKipFeGFtaW5pbmcgdGhlIFVuaXggU29ja2V0IENvbnRyb2wgQmxvY2sgUGFyYW1ldGVycyoqCgpBbHJpZ2h0LCB0aW1lIHRvIGdldCB0byB0aGUgY29yZSBvZiB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYHN0cnVjdCB1bml4X3NrYl9wYXJtc2AgaXMgbGFpZCBvdXQsIGVzcGVjaWFsbHkgaW4gcmVsYXRpb24gdG8gdGhlIGBza2ItJmd0O2NiYCBmaWVsZC4gSSBrbm93IHRoYXQmIzM5O3Mgd2hlcmUgYSBsb3Qgb2YgdGhlIGNydWNpYWwgcGVyLXNvY2tldCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIExpbnV4IG5ldHdvcmtpbmcgc3RhY2ssIHNvIGZpZ3VyaW5nIG91dCBpdHMgc3RydWN0dXJlIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBVbml4IHNvY2tldCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBMZXQmIzM5O3MgZGVsdmUgaW50byB0aGF0IGBhZl91bml4LmhgIGZpbGUgYW5kIGdldCBhIGdvb2QgZ3Jhc3Agb2Ygd2hhdCBkYXRhIG1lbWJlcnMgY29uc3RpdHV0ZSB0aGF0IHN0cnVjdHVyZSwgdGhlaXIgdHlwZXMsIGFuZCBjcnVjaWFsbHksIHdoYXQgdGhlIG92ZXJhbGwgbWVtb3J5IGZvb3RwcmludCBvZiBgc3RydWN0IHVuaXhfc2tiX3Bhcm1zYCB3aWxsIGJlLCBzbyBJIGNhbiBhY2NvdW50IGZvciBpdCBpbiBhbnkgY2FsY3VsYXRpb25zIHJlbGF0ZWQgdG8gc29ja2V0IGJ1ZmZlciBtYW5hZ2VtZW50LiBUaGF0IGhlYWRlciBmaWxlIHNob3VsZCBoYXZlIGFsbCB0aGUgYW5zd2Vycy4gTGV0JiMzOTtzIGdldCB0byBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDM1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xuICAgMjpcdCNpZm5kZWYgX19BRl9VTklYX0hcbiAgIDM6XHQjZGVmaW5lIF9fQUZfVU5JWF9IXG4gICA0Olx0XG4gICA1Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvcGlkX3R5cGVzLmhcdTAwM2VcbiAgIDY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC91aWRnaWQuaFx1MDAzZVxuICAgNzpcdFxuICAgODpcdCNkZWZpbmUgVU5JWF9IQVNIX01PRFx0KDI1NiAtIDEpXG4gICA5Olx0I2RlZmluZSBVTklYX0hBU0hfU0laRVx0KDI1NiAqIDIpXG4gIDEwOlx0I2RlZmluZSBVTklYX0hBU0hfQklUU1x0OFxuICAxMTpcdFxuICAxMjpcdHN0cnVjdCBzb2NrICp1bml4X3BlZXJfZ2V0KHN0cnVjdCBzb2NrICpzayk7XG4gIDEzOlx0XG4gIDE0Olx0c3RydWN0IHVuaXhfc2tiX3Bhcm1zIHtcbiAgMTU6XHRcdERFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7XHQvKiBza2IgY3JlZGVudGlhbHMgYnkgcGlkIHR5cGUgKi9cbiAgMTY6XHRcdGt1aWRfdFx0XHRcdHVpZDtcbiAgMTc6XHRcdGtnaWRfdFx0XHRcdGdpZDtcbiAgMTg6XHRcdHN0cnVjdCBzY21fZnBfbGlzdFx0KmZwO1x0XHQvKiBQYXNzZWQgZmlsZXNcdFx0Ki9cbiAgMTk6XHQjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktcbiAgMjA6XHRcdHUzMlx0XHRcdHNlY2lkO1x0XHQvKiBTZWN1cml0eSBJRFx0XHQqL1xuICAyMTpcdCNlbmRpZlxuICAyMjpcdFx0dTMyXHRcdFx0Y29uc3VtZWQ7XG4gIDIzOlx0fSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XG4gIDI0Olx0XG4gIDI1Olx0I2RlZmluZSBVTklYQ0Ioc2tiKVx0KCooc3RydWN0IHVuaXhfc2tiX3Bhcm1zICopXHUwMDI2KChza2IpLVx1MDAzZWNiKSlcbiAgMjY6XHRcbiAgMjc6XHQvKiBHQyBmb3IgU0NNX1JJR0hUUyAqL1xuICAyODpcdHZvaWQgdW5peF9hZGRfZWRnZXMoc3RydWN0IHNjbV9mcF9saXN0ICpmcGwsIHN0cnVjdCB1bml4X3NvY2sgKnJlY2VpdmVyKTtcbiAgMjk6XHR2b2lkIHVuaXhfZGVsX2VkZ2VzKHN0cnVjdCBzY21fZnBfbGlzdCAqZnBsKTtcbiAgMzA6XHR2b2lkIHVuaXhfdXBkYXRlX2VkZ2VzKHN0cnVjdCB1bml4X3NvY2sgKnJlY2VpdmVyKTtcbiAgMzE6XHRpbnQgdW5peF9wcmVwYXJlX2ZwbChzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKmZwbCk7XG4gIDMyOlx0dm9pZCB1bml4X2Rlc3Ryb3lfZnBsKHN0cnVjdCBzY21fZnBfbGlzdCAqZnBsKTtcbiAgMzM6XHR2b2lkIHVuaXhfcGVla19mcGwoc3RydWN0IHNjbV9mcF9saXN0ICpmcGwpO1xuICAzNDpcdHZvaWQgdW5peF9zY2hlZHVsZV9nYyhzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXIpO1xuICAzNTpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjc1LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0NTcwNgoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDE1NzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIFVOSVggRG9tYWluIFNvY2tldCBDcmVkZW50aWFscyBpbiBTS0JzKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24gc3lzdGVtYXRpY2FsbHkuIEZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgc2l6ZSBvZiB0aGUgYHVuaXhfc2tiX3Bhcm1zYCBzdHJ1Y3R1cmUgd2l0aGluIHRoZSBgc2tfYnVmZmAmIzM5O3MgY29udHJvbCBidWZmZXIgKGBza2ItJmd0O2NiYCkuICBJdCBsb29rcyBsaWtlIHRoZSBgcGlkYCBmaWVsZCAodHdvIHBvaW50ZXJzKSB0YWtlcyAxNiBieXRlcywgdGhlIGB1aWRgIGFuZCBgZ2lkYCB0YWtlIDggYnl0ZXMsIHRoZSBgZnBgIHBvaW50ZXIgYW5vdGhlciA4LCBhbmQgYHNlY2lkYCBhbmQgYGNvbnN1bWVkYCBhbiBhZGRpdGlvbmFsIDgsIHN1bW1pbmcgdG8gYSB0b3RhbCBvZiA0MCBieXRlcy4gIFNpbmNlIHRoZSBgc2tiLSZndDtjYmAgaXMgNDggYnl0ZXMgb24gYSA2NC1iaXQgc3lzdGVtLCB0aGF0IHNlZW1zIGxpa2UgYSBnb29kIGZpdC4gQnV0IHdhaXQsIHdoZW5ldmVyIGFuIHNrYiBpcyBhbGxvY2F0ZWQgKGUuZy4gYHNvY2tfYWxsb2Nfc2VuZF9wc2tiYCksIGBza2ItJmd0O2NiYCBpcyBpbml0aWFsaXplZCB0byB6ZXJvIHVzaW5nIGBtZW1zZXRgLgoKTm93IEkgbmVlZCB0byBzZWUgaG93IHRoZSBkYXRhIHdpdGhpbiBgdW5peF9za2JfcGFybXNgIGlzIHBvcHVsYXRlZC4gYHVuaXhfc2NtX3RvX3NrYmAgYXBwZWFycyB0byBiZSB0aGUga2V5IGZ1bmN0aW9uLiBJdCYjMzk7cyBjYWxsaW5nIGBnZXRfcGlkc2AgdG8gY29weSB0aGUgUElEcywgYW5kIHRoZW4gaXQgc2V0cyBgdWlkYCwgYGdpZGAsIGFuZCBgZnBgLiAgSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgZXhhY3QgYGdldF9waWRzYCBpbXBsZW1lbnRhdGlvbi4gSSYjMzk7bGwgbmVlZCB0byBsb29rIGF0IGB1bml4X21heWJlX2FkZF9jcmVkc2AgZnVuY3Rpb24uCgpBbHJpZ2h0LCBgdW5peF9tYXliZV9hZGRfY3JlZHNgIGlzIGludGVyZXN0aW5nLiBJZiB0aGUgYFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1RHSURdYCBpcyBub3Qgc2V0IGFuZCB0aGUgY29uZGl0aW9ucyBmb3IgcGFzc2luZyBjcmVkZW50aWFscyBhcmUgbm90IG1ldCwgdGhlIGNvZGUgKmRvZXNuJiMzOTt0KiBwb3B1bGF0ZSBgVU5JWENCKHNrYikucGlkYC4gIFRoaXMgbWVhbnMgYFVOSVhDQihza2IpLnBpZGAgcmVtYWlucyB1bmluaXRpYWxpemVkLiBDcml0aWNhbGx5LCBpZiBgcGlkZnNfcmVnaXN0ZXJfcGlkc2AgZmFpbHMsIHRoZW4gYHB1dF9waWRzYCBpcyBjYWxsZWQuIExldCYjMzk7cyBsb29rIGF0IGBfX3B1dF9waWRzYCwgaXQgd2lsbCBzZXQgYWxsIGBwaWRzW3R5cGVdYCB0byBgTlVMTGAuCgpUaGUgbmV4dCBmdW5jdGlvbiB0byBjaGVjayBpcyBgdW5peF9za2JfdG9fc2NtYCwgd2hpY2ggY29waWVzIHRoZSBjcmVkZW50aWFscyBiYWNrIG91dC4gYGdldF9waWRzYCB3aWxsIGhhbmRsZSBOVUxMIHBvaW50ZXJzLiBPa2F5LCBpZiB0aGUgYHBpZGAgaXMgTlVMTCBpbiB0aGUgYFVOSVhDQihza2IpYCwgdGhlIGBnZXRfcGlkc2Agd2lsbCBiZSBjYWxsZWQgd2l0aCBOVUxMLCBhbmQgcmV0dXJucyBOVUxMLCBzbyBubyByZWZjb3VudCBpc3N1ZS4gQW5kIGBwaWRfdm5yKE5VTEwpYCBpcyAwLgoKTm93IEkgcmVtZW1iZXIgYSBwb3RlbnRpYWwgYHNjbV9yZXBsYWNlX3BpZGAgZnVuY3Rpb24uIEkgaGF2ZSB0byBsb29rIGF0IGhvdyBgc2NtX3JlcGxhY2VfcGlkYCBmdW5jdGlvbnMuIEl0IHVzZXMgYHBpZGZzX3JlZ2lzdGVyX3BpZGAgYW5kIGBnZXRfcGlkYC4gTGV0JiMzOTtzIGZvY3VzIG9uIHRoZSBjb21tZW50IHRoYXQgc2F5cyBgLyogZHJvcCBhbGwgcHJldmlvdXMgcmVmZXJlbmNlcyAqL2AuIEkgc3VzcGVjdCB0aGVyZSBtaWdodCBiZSBhIHBvdGVudGlhbCBpc3N1ZSByZWxhdGVkIHRvIHRoZSByZWZlcmVuY2UgY291bnRpbmcgb2YgdGhlIGBwaWRgIHN0cnVjdHVyZXMuIExldCYjMzk7cyByZXZpZXcgdGhlIGNvZGUmIzM5O3MgaGlzdG9yeSB1c2luZyBnaXQsIHNvIEkgY2FuIHNlZSB3aGF0IGNoYW5nZWQuIFRoZSBnaXQgZGlmZiBiZWZvcmUgdGhlIHBhdGNoIHNob3dzIHRoYXQgYmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgZGlkbiYjMzk7dCBhY3R1YWxseSBkcm9wIGFsbCBwcmV2aW91cyByZWZlcmVuY2VzLCBpdCBqdXN0IG92ZXJ3cm90ZSB0aGUgb2xkIHBvaW50ZXIsIHNvIHRoZXJlIHdhcyBhIGxlYWshCgpJIHdpbGwgY2hlY2sgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIGluIHRoZSBsaW5lcyAxNDUtMjMwLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjc2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9jb3JlL3NjbS5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTQ1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDg1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAxNDU6XHRcdFx0a2ZyZWUoZnBsKTtcbiAxNDY6XHRcdH1cbiAxNDc6XHR9XG4gMTQ4Olx0RVhQT1JUX1NZTUJPTChfX3NjbV9kZXN0cm95KTtcbiAxNDk6XHRcbiAxNTA6XHRzdGF0aWMgaW5saW5lIGludCBzY21fcmVwbGFjZV9waWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHBpZCAqcGlkKVxuIDE1MTpcdHtcbiAxNTI6XHRcdHN0cnVjdCBwaWQgKnRocmVhZF9waWQ7XG4gMTUzOlx0XHRpbnQgZXJyO1xuIDE1NDpcdFxuIDE1NTpcdFx0LyogZHJvcCBhbGwgcHJldmlvdXMgcmVmZXJlbmNlcyAqL1xuIDE1NjpcdFx0c2NtX2Rlc3Ryb3lfY3JlZChzY20pO1xuIDE1NzpcdFxuIDE1ODpcdFx0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XG4gMTU5Olx0XHRpZiAodW5saWtlbHkoZXJyKSlcbiAxNjA6XHRcdFx0cmV0dXJuIGVycjtcbiAxNjE6XHRcbiAxNjI6XHRcdC8qIEEgc2VuZGVyIG5hbWluZyBpdHMgb3duIHRocmVhZC1ncm91cCBzZW5kcyBmcm9tIHRoZSBjdXJyZW50IHRocmVhZC4gKi9cbiAxNjM6XHRcdGlmIChwaWQgPT0gdGFza190Z2lkKGN1cnJlbnQpKVxuIDE2NDpcdFx0XHR0aHJlYWRfcGlkID0gdGFza19waWQoY3VycmVudCk7XG4gMTY1Olx0XHRlbHNlXG4gMTY2Olx0XHRcdHRocmVhZF9waWQgPSBwaWQ7XG4gMTY3Olx0XG4gMTY4Olx0XHRlcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQodGhyZWFkX3BpZCk7XG4gMTY5Olx0XHRpZiAodW5saWtlbHkoZXJyKSlcbiAxNzA6XHRcdFx0cmV0dXJuIGVycjtcbiAxNzE6XHRcbiAxNzI6XHRcdHNjbS1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSA9IHBpZDtcbiAxNzM6XHRcdHNjbS1cdTAwM2VwaWRbUElEVFlQRV9QSURdID0gZ2V0X3BpZCh0aHJlYWRfcGlkKTtcbiAxNzQ6XHRcdHNjbS1cdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHBpZCk7XG4gMTc1Olx0XHRyZXR1cm4gMDtcbiAxNzY6XHR9XG4gMTc3Olx0XG4gMTc4Olx0aW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqcClcbiAxNzk6XHR7XG4gMTgwOlx0XHRjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzICpvcHMgPSBSRUFEX09OQ0Uoc29jay1cdTAwM2VvcHMpO1xuIDE4MTpcdFx0c3RydWN0IGNtc2doZHIgKmNtc2c7XG4gMTgyOlx0XHRpbnQgZXJyO1xuIDE4MzpcdFxuIDE4NDpcdFx0Zm9yX2VhY2hfY21zZ2hkcihjbXNnLCBtc2cpIHtcbiAxODU6XHRcdFx0ZXJyID0gLUVJTlZBTDtcbiAxODY6XHRcbiAxODc6XHRcdFx0LyogVmVyaWZ5IHRoYXQgY21zZ19sZW4gaXMgYXQgbGVhc3Qgc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSAqL1xuIDE4ODpcdFx0XHQvKiBUaGUgZmlyc3QgY2hlY2sgd2FzIG9taXR0ZWQgaW4gXHUwMDNjPSAyLjIuNS4gVGhlIHJlYXNvbmluZyB3YXNcbiAxODk6XHRcdFx0ICAgdGhhdCBwYXJzZXIgY2hlY2tzIGNtc2dfbGVuIGluIGFueSBjYXNlLCBzbyB0aGF0XG4gMTkwOlx0XHRcdCAgIGFkZGl0aW9uYWwgY2hlY2sgd291bGQgYmUgd29yayBkdXBsaWNhdGlvbi5cbiAxOTE6XHRcdFx0ICAgQnV0IGlmIGNtc2dfbGV2ZWwgaXMgbm90IFNPTF9TT0NLRVQsIHdlIGRvIG5vdCBjaGVja1xuIDE5MjpcdFx0XHQgICBmb3IgdG9vIHNob3J0IGFuY2lsbGFyeSBkYXRhIG9iamVjdCBhdCBhbGwhIE9vcHMuXG4gMTkzOlx0XHRcdCAgIE9LLCBsZXQmIzM5O3MgYWRkIGl0Li4uXG4gMTk0Olx0XHRcdCAqL1xuIDE5NTpcdFx0XHRpZiAoIUNNU0dfT0sobXNnLCBjbXNnKSlcbiAxOTY6XHRcdFx0XHRnb3RvIGVycm9yO1xuIDE5NzpcdFxuIDE5ODpcdFx0XHRpZiAoY21zZy1cdTAwM2VjbXNnX2xldmVsICE9IFNPTF9TT0NLRVQpXG4gMTk5Olx0XHRcdFx0Y29udGludWU7XG4gMjAwOlx0XG4gMjAxOlx0XHRcdHN3aXRjaCAoY21zZy1cdTAwM2VjbXNnX3R5cGUpXG4gMjAyOlx0XHRcdHtcbiAyMDM6XHRcdFx0Y2FzZSBTQ01fUklHSFRTOlxuIDIwNDpcdFx0XHRcdGlmICghb3BzIHx8IG9wcy1cdTAwM2VmYW1pbHkgIT0gUEZfVU5JWClcbiAyMDU6XHRcdFx0XHRcdGdvdG8gZXJyb3I7XG4gMjA2Olx0XHRcdFx0ZXJyPXNjbV9mcF9jb3B5KGNtc2csIFx1MDAyNnAtXHUwMDNlZnApO1xuIDIwNzpcdFx0XHRcdGlmIChlcnJcdTAwM2MwKVxuIDIwODpcdFx0XHRcdFx0Z290byBlcnJvcjtcbiAyMDk6XHRcdFx0XHRicmVhaztcbiAyMTA6XHRcdFx0Y2FzZSBTQ01fQ1JFREVOVElBTFM6XG4gMjExOlx0XHRcdHtcbiAyMTI6XHRcdFx0XHRzdHJ1Y3QgdWNyZWQgY3JlZHM7XG4gMjEzOlx0XHRcdFx0a3VpZF90IHVpZDtcbiAyMTQ6XHRcdFx0XHRrZ2lkX3QgZ2lkO1xuIDIxNTpcdFx0XHRcdGlmIChjbXNnLVx1MDAzZWNtc2dfbGVuICE9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgdWNyZWQpKSlcbiAyMTY6XHRcdFx0XHRcdGdvdG8gZXJyb3I7XG4gMjE3Olx0XHRcdFx0bWVtY3B5KFx1MDAyNmNyZWRzLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZihzdHJ1Y3QgdWNyZWQpKTtcbiAyMTg6XHRcdFx0XHRlcnIgPSBzY21fY2hlY2tfY3JlZHMoXHUwMDI2Y3JlZHMpO1xuIDIxOTpcdFx0XHRcdGlmIChlcnIpXG4gMjIwOlx0XHRcdFx0XHRnb3RvIGVycm9yO1xuIDIyMTpcdFxuIDIyMjpcdFx0XHRcdGlmICghcC1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSB8fFxuIDIyMzpcdFx0XHRcdCAgICBwaWRfdm5yKHAtXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0pICE9IGNyZWRzLnBpZCkge1xuIDIyNDpcdFx0XHRcdFx0c3RydWN0IHBpZCAqcGlkO1xuIDIyNTpcdFx0XHRcdFx0ZXJyID0gLUVTUkNIO1xuIDIyNjpcdFx0XHRcdFx0cGlkID0gZmluZF9nZXRfcGlkKGNyZWRzLnBpZCk7XG4gMjI3Olx0XHRcdFx0XHRpZiAoIXBpZClcbiAyMjg6XHRcdFx0XHRcdFx0Z290byBlcnJvcjtcbiAyMjk6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43Ny8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDkyMjgKCQkJCQkJCW91dHB1dDogMTgKCQkJCQkJCXRob3VnaHRzOiA1MTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQb3RlbnRpYWwgSXNzdWUgd2l0aCBzY21fcGlkZmRfcmVjdioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgYHNjbV9kZXN0cm95X2NyZWQoc2NtKWAgd2hpY2gsIGFzIGV4cGVjdGVkLCBjYWxscyBgcHV0X3BpZHMoc2NtLSZndDtwaWQpYC4gTWFrZXMgc2Vuc2UuIE5vdywgbGV0JiMzOTtzIGRpdmUgaW50byBgc2NtX3BpZGZkX3JlY3ZgIHNpbmNlIHRoYXQmIzM5O3Mgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gTGluZSAxNTYgb2YgdGhlIGNvZGUsIGNhbGxzIGBzY21fZGVzdHJveV9jcmVkKHNjbSlgLgoKSW4gYHNjbV9waWRmZF9yZWN2YCwgSSBzZWUgYHBpZGZkYCBpcyBhIGxvY2FsIGludGVnZXIgaW5pdGlhbGl6ZWQgdmlhIGBwaWRmZCA9IHBpZGZkX3ByZXBhcmUoLi4uKWAuIFRoZSBmdW5jdGlvbiBpbmNsdWRlcyBhbiBlYXJseSByZXR1cm4gaWYgdGhlIGBwaWRgIGlzIGBOVUxMYCwgd2hpY2ggaXMgbm9ybWFsLiBUaGUgY29yZSBxdWVzdGlvbiBpcyBhcm91bmQgYHBpZGZkX3ByZXBhcmVgLiBUaGUgY29kZSBzdWdnZXN0cyBgcGlkZmRgIGNvdWxkIGJlIG5lZ2F0aXZlIGlmIGBwaWRmZF9wcmVwYXJlYCBmYWlscyAob3IgZXZlbiB0aHJvdWdoIGBwdXRfY21zZ2ApLiBJIGNhbiBzZWUgdGhhdCBgcHV0X2Ntc2dgIG1pZ2h0IHJldHVybiBhbiBlcnJvciB3aGVuIHVzaW5nIGAmYW1wO3BpZGZkYC4gQnV0IGhhbmcgb24uLi4gd2hhdCBpZiBgcGlkZmRfcHJlcGFyZWAgcmV0dXJucyBhICpuZWdhdGl2ZSBlcnJvciBjb2RlKiBpdHNlbGY/IEkgbmVlZCB0byBjaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBgcGlkZmRfcHJlcGFyZWAgdG8gY29uZmlybSB0aGUgcG9zc2libGUgZXJyb3IgaGFuZGxpbmcuIEkgbmVlZCB0byBrbm93IHdoYXQgdGhvc2UgZXJyb3IgY29kZXMgYXJlLCBhbmQgd2hhdCBoYXBwZW5zIHdoZW4gdGhleSBnZXQgcGFzc2VkIGFyb3VuZCBpbiB0aGUgb3RoZXIgZnVuY3Rpb24gY2FsbHMuIElzIHRoZSBuZWdhdGl2ZSBgcGlkZmRgIHZhbHVlIGJlaW5nIGNoZWNrZWQgcHJvcGVybHkgdGhyb3VnaG91dCB0aGUgcHJvY2Vzcz8gSSYjMzk7bSBnb2luZyB0byBmb2xsb3cgdGhlIGxvZ2ljIG9mIGBwaWRmZF9wcmVwYXJlYCBhbmQgdGhlbiBgcHV0X2Ntc2dgIGNhbGxzIHRvIGNvbmZpcm0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3BpZGZkX3ByZXBhcmUmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7ZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYz04MzY9c3RhdGljIHNzaXplX3QgY29weV9ldmVudF90b191c2VyKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsXG4tLVxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYy05MTQtXHRcdGlmIChtZXRhZGF0YS5waWQpXG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jOjkxNTpcdFx0XHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUoZXZlbnQtXHUwMDNlcGlkLCBwaWRmZF9mbGFncywgXHUwMDI2cGlkZmRfZmlsZSk7XG5mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jLTkxNi1cbi0tXG5pbmNsdWRlL2xpbnV4L3BpZC5oPTg2PXN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2soaW50IHBpZGZkLCB1bnNpZ25lZCBpbnQgKmZsYWdzKTtcbmluY2x1ZGUvbGludXgvcGlkLmg6ODc6aW50IHBpZGZkX3ByZXBhcmUoc3RydWN0IHBpZCAqcGlkLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBmaWxlICoqcmV0X2ZpbGUpO1xuaW5jbHVkZS9saW51eC9waWQuaC04OC12b2lkIGRvX25vdGlmeV9waWRmZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spO1xuLS1cbmtlcm5lbC9mb3JrLmM9MTg2Mj1zdGF0aWMgaW5saW5lIHZvaWQgcmN1X2NvcHlfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXG4tLVxua2VybmVsL2ZvcmsuYy0xODgxLS8qKlxua2VybmVsL2ZvcmsuYzoxODgyOiAqIHBpZGZkX3ByZXBhcmUgLSBhbGxvY2F0ZSBhIG5ldyBwaWRmZF9maWxlIGFuZCByZXNlcnZlIGEgcGlkZmRcbmtlcm5lbC9mb3JrLmMtMTg4My0gKiBAcGlkOiAgIHRoZSBzdHJ1Y3QgcGlkIGZvciB3aGljaCB0byBjcmVhdGUgYSBwaWRmZFxuLS1cbmtlcm5lbC9mb3JrLmMtMTkwNy0gKi9cbmtlcm5lbC9mb3JrLmM6MTkwODppbnQgcGlkZmRfcHJlcGFyZShzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IGZpbGUgKipyZXRfZmlsZSlcbmtlcm5lbC9mb3JrLmMtMTkwOS17XG4tLVxua2VybmVsL2ZvcmsuYz0yMDEyPV9fbGF0ZW50X2VudHJvcHkgc3RydWN0IHRhc2tfc3RydWN0ICpjb3B5X3Byb2Nlc3MoXG4tLVxua2VybmVsL2ZvcmsuYy0yMzQ3LVx0XHQgKi9cbmtlcm5lbC9mb3JrLmM6MjM0ODpcdFx0cmV0dmFsID0gcGlkZmRfcHJlcGFyZShwaWQsIGZsYWdzLCBcdTAwMjZwaWRmaWxlKTtcbmtlcm5lbC9mb3JrLmMtMjM0OS1cdFx0aWYgKHJldHZhbCBcdTAwM2MgMClcbi0tXG5rZXJuZWwvcGlkLmM9NjcxPXN0YXRpYyBpbnQgcGlkZmRfY3JlYXRlKHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgaW50IGZsYWdzKVxuLS1cbmtlcm5lbC9waWQuYy02NzUtXG5rZXJuZWwvcGlkLmM6Njc2Olx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBpZCwgZmxhZ3MsIFx1MDAyNnBpZGZkX2ZpbGUpO1xua2VybmVsL3BpZC5jLTY3Ny1cdGlmIChwaWRmZCBcdTAwM2MgMClcbi0tXG5uZXQvY29yZS9zY20uYz01MDI9c3RhdGljIHZvaWQgc2NtX3BpZGZkX3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4tLVxubmV0L2NvcmUvc2NtLmMtNTI5LVxubmV0L2NvcmUvc2NtLmM6NTMwOlx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBpZCwgZmxhZ3MsIFx1MDAyNnBpZGZkX2ZpbGUpO1xubmV0L2NvcmUvc2NtLmMtNTMxLVxuLS1cbm5ldC9jb3JlL3NvY2suYz0xNzQ3PXN0YXRpYyBpbnQgc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHBpZF90eXBlIHR5cGUsXG4tLVxubmV0L2NvcmUvc29jay5jLTE3NzItXG5uZXQvY29yZS9zb2NrLmM6MTc3MzpcdHBpZGZkID0gcGlkZmRfcHJlcGFyZShwZWVyX3BpZCwgZmxhZ3MsIFx1MDAyNnBpZGZkX2ZpbGUpO1xubmV0L2NvcmUvc29jay5jLTE3NzQtXHRwdXRfcGlkKHBlZXJfcGlkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43OS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTA4NzUKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiA3MTgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIGBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZGAgYW5kIGBTT19QQVNTUElERkRfVEhSRUFEYCBmb3IgUElERkQgSGFuZGxpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gSSYjMzk7bSBsb29raW5nIGF0IGhvdyB3ZSByZXRyaWV2ZSBQSURGRHMgcmVsYXRlZCB0byBzb2NrZXQgcGVlcnMsIHNwZWNpZmljYWxseSB0aHJvdWdoIGBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZGAuIFRoZSBtYWluIHRoaW5nIEkmIzM5O20gZm9jdXNlZCBvbiBpcyB0aGUgZGF0YSB0cmFuc2ZlciBhbmQgZXJyb3IgaGFuZGxpbmcuCgpGaXJzdCwgd2l0aGluIGBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZGAsIGBsZW5gIGlzIGNyaXRpY2FsOyBpdCYjMzk7cyBiZWluZyBib3VuZGVkIGJ5IGBzaXplb2YocGlkZmQpYCBlbnN1cmluZyB0aGF0IHdlIGRvbiYjMzk7dCBvdmVyZmxvdyB0aGUgYnVmZmVyLiBgcGlkZmRgIGl0c2VsZiBpcyBhbiBgaW50YCwgYW5kIGluaXRpYWxpemVkIGJ5IGBwaWRmZF9wcmVwYXJlYC4gVGhlIGNvZGUgc2VlbXMgY2FyZWZ1bCwgY2hlY2tpbmcgdGhlIHJldHVybiB2YWx1ZXMgb2YgYGNvcHlfdG9fc29ja3B0cmAsIGFuZCBjbGVhbmluZyB1cCB3aXRoIGBwdXRfdW51c2VkX2ZkYCBhbmQgYGZwdXRgIGlmIGFuIGVycm9yIG9jY3Vycy4gSSBzZWUgd2UgaGF2ZSB0d28gY29weSBvcGVyYXRpb25zOiB0aGUgZmlyc3QsIGBjb3B5X3RvX3NvY2twdHIob3B0dmFsLCAmYW1wO3BpZGZkLCBsZW4pYCwgY29waWVzIHVwIHRvIDQgYnl0ZXMgZnJvbSB0aGUgaW5pdGlhbGl6ZWQgYHBpZGZkYCwgYW5kIHRoZSBzZWNvbmQgb25lLCBgY29weV90b19zb2NrcHRyKG9wdGxlbiwgJmFtcDtsZW4sIHNpemVvZihpbnQpKWAsIGNvcGllcyA0IGJ5dGVzIGZyb20gdGhlIGluaXRpYWxpemVkIGBsZW5gIHRvIHRoZSBjYWxsZXIuIFNvIGZhciwgdGhlIGRpcmVjdCBQSURGRCByZXRyaWV2YWwgYW5kIHRyYW5zZmVyIGxvb2sgcHJldHR5IHNvdW5kLCB3aXRoIGRlZmVuc2l2ZSBwcm9ncmFtbWluZyBhcm91bmQgcG90ZW50aWFsIGNvcHkgZmFpbHVyZXMuCgpUaGVuLCBJJiMzOTttIGNoZWNraW5nIGhvdyB0aGUgYFNPX1BBU1NQSURGRF9USFJFQURgIG9wdGlvbiBpcyBoYW5kbGVkIHdpdGhpbiBgc2tfZ2V0c29ja29wdGAuIElmIHRoZSBzb2NrZXQgaXMgbm90IEFGX1VOSVgsIGBFT1BOT1RTVVBQYCBpcyByZXR1cm5lZC4gSW4gdGhlIGBTT19QQVNTUElERkRfVEhSRUFEYCBjYXNlLCB0aGUgdmFsdWUgYHYudmFsYCBpcyBzZXQgd2l0aCBgc2stJmd0O3NrX3NjbV9waWRmZF90aHJlYWRgLiBJIG5lZWQgdG8gdHJhY2sgZG93biBob3cgYHYudmFsYCBpcyB1bHRpbWF0ZWx5IHVzZWQgYnkgYHNrX2dldHNvY2tvcHRgLgoKSW4gZ2VuZXJhbCwgdGhlIGNvZGUgc2VlbXMgd2VsbC1zdHJ1Y3R1cmVkLCBidXQgSSBuZWVkIHRvIHNlZSB0aGUgY29tcGxldGUgcGljdHVyZSBvZiBob3cgdGhlIGRhdGEgZmxvd3MgZnJvbSB0aGUgc29ja2V0IGludGVybmFscyB0byB0aGUgdXNlciBzcGFjZSB0byBiZSBjb25maWRlbnQsIGVzcGVjaWFsbHkgaW4gcmVnYXJkIHRvIHRoZSBQSURGRCBoYW5kbGluZy4gSSYjMzk7bGwgbmVlZCB0byBkcmlsbCBkb3duIGRlZXBlciBpbnRvIHRoZSBgbmV0L2NvcmUvc29jay5jYCBhbmQgcG90ZW50aWFsbHkgaG93IHRob3NlIHZhbHVlcyBhcmUgY29uc3VtZWQgYnkgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+ODAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2Nhc2UgU09fUEFTU1BJREZEOiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9jb3JlL3NvY2suYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvY29yZS9zb2NrLmM9MTE5ND1pbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG4tLVxubmV0L2NvcmUvc29jay5jLTE1NzItXG5uZXQvY29yZS9zb2NrLmM6MTU3MzpcdGNhc2UgU09fUEFTU1BJREZEOlxubmV0L2NvcmUvc29jay5jLTE1NzQtXHRcdGlmIChza19pc191bml4KHNrKSkge1xuLS1cbm5ldC9jb3JlL3NvY2suYz0xNzkwPWludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcbi0tXG5uZXQvY29yZS9zb2NrLmMtMTk0Ni1cbm5ldC9jb3JlL3NvY2suYzoxOTQ3Olx0Y2FzZSBTT19QQVNTUElERkQ6XG5uZXQvY29yZS9zb2NrLmMtMTk0OC1cdFx0aWYgKCFza19pc191bml4KHNrKSlcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTIzMDgKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6CgoqKkRpdmluZyBpbnRvIGBuZXQvY29yZS9zb2NrLmNgKioKCkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBUaGUgcHJvYmxlbSBhdCBoYW5kIG5lY2Vzc2l0YXRlcyBhIGxvb2sgYXQgdGhlIGNvcmUgc29ja2V0IGNvZGUuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgcmV2aWV3aW5nIGxpbmVzIDE5NDUtMTk2MCB3aXRoaW4gYG5ldC9jb3JlL3NvY2suY2AuIFRoZXNlIGxpbmVzIGxpa2VseSBpbnZvbHZlIHRoZSBjcnVjaWFsIHBhcnQgb2Ygc29ja2V0IGZ1bmN0aW9uYWxpdHkgdGhhdCYjMzk7cyBjYXVzaW5nIHRoaXMgaXNzdWUuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBvbiB3aGVyZSB0aGUgcHJvYmxlbSBtaWdodCBleGlzdCBieSByZXZpZXdpbmcgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQgYW5kIGZ1bmN0aW9ucyB0aGlzIGFyZWEgb2YgdGhlIGNvZGUgaW50ZXJhY3RzIHdpdGguIExldCYjMzk7cyBzZWUgd2hhdCB3ZSBjYW4gZmluZC4gSSBleHBlY3QgdGhpcyBzZWN0aW9uIGRlYWxzIHdpdGggW2luc2VydCBleHBlY3RhdGlvbiBiYXNlZCBvbiBleHBlcnRpc2UgYW5kIGFzc3VtZWQgcHJvYmxlbSBkb21haW4gLSBlLmcuLCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQsIGRhdGEgdHJhbnNtaXNzaW9uLCBlcnJvciBoYW5kbGluZywgZXRjLl0uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+ODIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2NvcmUvc29jay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTk0NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxOTQ1Olx0XHRcdGJyZWFrO1xuMTk0NjpcdFxuMTk0NzpcdFx0Y2FzZSBTT19QQVNTUElERkQ6XG4xOTQ4Olx0XHRcdGlmICghc2tfaXNfdW5peChzaykpXG4xOTQ5Olx0XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuMTk1MDpcdFxuMTk1MTpcdFx0XHR2LnZhbCA9IHNrLVx1MDAzZXNrX3NjbV9waWRmZDtcbjE5NTI6XHRcdFx0YnJlYWs7XG4xOTUzOlx0XG4xOTU0Olx0XHRjYXNlIFNPX1BBU1NQSURGRF9USFJFQUQ6XG4xOTU1Olx0XHRcdGlmICghc2tfaXNfdW5peChzaykpXG4xOTU2Olx0XHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuMTk1NzpcdFxuMTk1ODpcdFx0XHR2LnZhbCA9IHNrLVx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQ7XG4xOTU5Olx0XHRcdGJyZWFrO1xuMTk2MDpcdFxuMTk2MTpcdFx0Y2FzZSBTT19QQVNTUklHSFRTOlxuMTk2MjpcdFx0XHRpZiAoIXNrX2lzX3VuaXgoc2spKVxuMTk2MzpcdFx0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbjE5NjQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44My8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTI4MDIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxNTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIENvcmUgRHVtcCBQYXJhbWV0ZXIgSW5pdGlhbGl6YXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcy4gYHYudmFsYCBiZWluZyB0aGUgc3RhbmRhcmQgZm9yIGludGVnZXIgcmV0dXJuIHZhbHVlcyBpbiBgc2tfZ2V0c29ja29wdGAgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IHRvIGtlZXAgaW4gbWluZC4gTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBjb3JlIGR1bXAgbWVjaGFuaXNtLCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gaG93IHRoZSBwYXJhbWV0ZXJzIGFyZSBiZWluZyBoYW5kbGVkLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZXhhbWluZSBgY29yZWR1bXAuY2AgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdyBvZiBleGVjdXRpb24uCgpMZXQmIzM5O3MgYmVnaW4gYnkgY2hlY2tpbmcgZm9yIGNoYW5nZXMgd2l0aGluIGBmcy9jb3JlZHVtcC5jYCwgaG9wZWZ1bGx5IHdlIGZpbmQgdGhlIHNvdXJjZSBvZiB0aGlzIHByb2JsZW0gdGhlcmUuIFdpdGhpbiB0aGUgZmlsZSwgSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSBgY29yZWR1bXBfcGFyc2VgIGZ1bmN0aW9uOyB0aGF0IHNvdW5kcyBsaWtlIGEgcmVsZXZhbnQgc3RhcnRpbmcgcG9pbnQuIEkgc2VlIGB0YXNrX3BpZHMoY3BybS0mZ3Q7cGlkLCBjdXJyZW50KTtgIGJlaW5nIGNhbGxlZCBpbiBgY29yZWR1bXBfcGFyc2VgLiBPa2F5LCBhbmQgd2l0aGluIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCwgSSBzZWUgYERFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7YC4KCk5vdywgdGhlIGNydWNpYWwgcXVlc3Rpb24gaXMgaG93IHRoaXMgYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsaWZlY3ljbGUgb2YgdGhpcyBzdHJ1Y3R1cmUgdG8gdW5kZXJzdGFuZCBob3cgaXQgY2FuIGdvIHdyb25nLiBTbywgSSBuZWVkIHRvIGxvb2sgZm9yIHdoZXJlIGl0IGlzIGFsbG9jYXRlZCBvciBjcmVhdGVkLiBMZXQmIzM5O3MgZ28gYWhlYWQgYW5kIHNlYXJjaCBmb3IgaW5zdGFuY2VzIG9mIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCB3aXRoaW4gYGZzL2NvcmVkdW1wLmNgIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gaXRzIGNyZWF0aW9uLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44NC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29yZWR1bXBfcGFyYW1zJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7ZnMvY29yZWR1bXAuYyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jLTY4LVxuZnMvY29yZWR1bXAuYzo2OTpzdGF0aWMgYm9vbCBkdW1wX3ZtYV9zbmFwc2hvdChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKTtcbmZzL2NvcmVkdW1wLmM6NzA6c3RhdGljIHZvaWQgZnJlZV92bWFfc25hcHNob3Qoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSk7XG5mcy9jb3JlZHVtcC5jLTcxLVxuLS1cbmZzL2NvcmVkdW1wLmM9MTk4PXN0YXRpYyBpbnQgY25fcHJpbnRfZXhlX2ZpbGUoc3RydWN0IGNvcmVfbmFtZSAqY24sIGJvb2wgbmFtZV9vbmx5KVxuLS1cbmZzL2NvcmVkdW1wLmMtMjM4LSAqL1xuZnMvY29yZWR1bXAuYzoyMzk6c3RhdGljIGJvb2wgY29yZWR1bXBfcGFyc2Uoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXG5mcy9jb3JlZHVtcC5jLTI0MC1cdFx0XHQgICBzaXplX3QgKiphcmd2LCBpbnQgKmFyZ2MpXG4tLVxuZnMvY29yZWR1bXAuYz02MjM9c3RhdGljIGludCB1bWhfY29yZWR1bXBfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldylcbi0tXG5mcy9jb3JlZHVtcC5jLTYyNS1cdHN0cnVjdCBmaWxlICpmaWxlc1syXTtcbmZzL2NvcmVkdW1wLmM6NjI2Olx0c3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3AgPSAoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqKWluZm8tXHUwMDNlZGF0YTtcbmZzL2NvcmVkdW1wLmMtNjI3LVx0aW50IGVycjtcbi0tXG5mcy9jb3JlZHVtcC5jLTY3MS0jaWZkZWYgQ09ORklHX1VOSVhcbmZzL2NvcmVkdW1wLmM6NjcyOnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL2NvcmVkdW1wLmMtNjczLXtcbi0tXG5mcy9jb3JlZHVtcC5jPTc4Nz1zdGF0aWMgaW5saW5lIHZvaWQgY29yZWR1bXBfc29ja19zaHV0ZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSlcbi0tXG5mcy9jb3JlZHVtcC5jLTc5OC1cbmZzL2NvcmVkdW1wLmM6Nzk5OnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL2NvcmVkdW1wLmMtODAwLXtcbi0tXG5mcy9jb3JlZHVtcC5jLTg2MS1cbmZzL2NvcmVkdW1wLmM6ODYyOnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tldChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbmZzL2NvcmVkdW1wLmMtODYzLXtcbi0tXG5mcy9jb3JlZHVtcC5jPTg3MT1zdGF0aWMgaW5saW5lIHZvaWQgY29yZWR1bXBfc29ja19zaHV0ZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSkgeyB9XG5mcy9jb3JlZHVtcC5jOjg3MjpzdGF0aWMgaW5saW5lIGJvb2wgY29yZWR1bXBfc29ja2V0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKSB7IHJldHVybiBmYWxzZTsgfVxuZnMvY29yZWR1bXAuYy04NzMtI2VuZGlmXG4tLVxuZnMvY29yZWR1bXAuYy04NzUtLyogY3BybS1cdTAwM2VkdW1wYWJsZSBpcyB0aGUgc25hcHNob3Qgb2YgdGFzayBkdW1wYWJpbGl0eSBhdCBkdW1wIHN0YXJ0LiAqL1xuZnMvY29yZWR1bXAuYzo4NzY6c3RhdGljIGlubGluZSBib29sIGNvcmVkdW1wX2ZvcmNlX3N1aWRfc2FmZShjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuZnMvY29yZWR1bXAuYy04Nzcte1xuLS1cbmZzL2NvcmVkdW1wLmMtODgxLVxuZnMvY29yZWR1bXAuYzo4ODI6c3RhdGljIGJvb2wgY29yZWR1bXBfZmlsZShzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbmZzL2NvcmVkdW1wLmMtODgzLVx0XHRcdCAgY29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10KVxuLS1cbmZzL2NvcmVkdW1wLmMtOTcyLVxuZnMvY29yZWR1bXAuYzo5NzM6c3RhdGljIGJvb2wgY29yZWR1bXBfcGlwZShzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbmZzL2NvcmVkdW1wLmMtOTc0LVx0XHRcdCAgc2l6ZV90ICphcmd2LCBpbnQgYXJnYylcbi0tXG5mcy9jb3JlZHVtcC5jPTEwMzk9c3RhdGljIGJvb2wgY29yZWR1bXBfd3JpdGUoc3RydWN0IGNvcmVfbmFtZSAqY24sXG5mcy9jb3JlZHVtcC5jOjEwNDA6XHRcdFx0ICBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuZnMvY29yZWR1bXAuYy0xMDQxLVx0XHRcdCAgY29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10KVxuLS1cbmZzL2NvcmVkdW1wLmMtMTA2Ni1cbmZzL2NvcmVkdW1wLmM6MTA2NzpzdGF0aWMgdm9pZCBjb3JlZHVtcF9jbGVhbnVwKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuZnMvY29yZWR1bXAuYy0xMDY4LXtcbi0tXG5mcy9jb3JlZHVtcC5jLTEwNzgtXG5mcy9jb3JlZHVtcC5jOjEwNzk6c3RhdGljIGlubGluZSBib29sIGNvcmVkdW1wX3NraXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbmZzL2NvcmVkdW1wLmMtMTA4MC1cdFx0XHRcdCBjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQpXG4tLVxuZnMvY29yZWR1bXAuYy0xMDkwLVxuZnMvY29yZWR1bXAuYzoxMDkxOnN0YXRpYyB2b2lkIGRvX2NvcmVkdW1wKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxuZnMvY29yZWR1bXAuYy0xMDkyLVx0XHRcdHNpemVfdCAqKmFyZ3YsIGludCAqYXJnYywgY29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10KVxuLS1cbmZzL2NvcmVkdW1wLmM9MTE2MD12b2lkIHZmc19jb3JlZHVtcChjb25zdCBrZXJuZWxfc2lnaW5mb190ICpzaWdpbmZvKVxuLS1cbmZzL2NvcmVkdW1wLmMtMTE2Ny1cdGludCBhcmdjID0gMDtcbmZzL2NvcmVkdW1wLmM6MTE2ODpcdHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHtcbmZzL2NvcmVkdW1wLmMtMTE2OS1cdFx0LnNpZ2luZm8gPSBzaWdpbmZvLFxuLS1cbmZzL2NvcmVkdW1wLmMtMTIwOC0gKi9cbmZzL2NvcmVkdW1wLmM6MTIwOTpzdGF0aWMgaW50IF9fZHVtcF9lbWl0KHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sIGNvbnN0IHZvaWQgKmFkZHIsIGludCBucilcbmZzL2NvcmVkdW1wLmMtMTIxMC17XG4tLVxuZnMvY29yZWR1bXAuYy0xMjI4LVxuZnMvY29yZWR1bXAuYzoxMjI5OnN0YXRpYyBpbnQgX19kdW1wX3NraXAoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgc2l6ZV90IG5yKVxuZnMvY29yZWR1bXAuYy0xMjMwLXtcbi0tXG5mcy9jb3JlZHVtcC5jLTEyNDktXG5mcy9jb3JlZHVtcC5jOjEyNTA6aW50IGR1bXBfZW1pdChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCBjb25zdCB2b2lkICphZGRyLCBpbnQgbnIpXG5mcy9jb3JlZHVtcC5jLTEyNTEte1xuLS1cbmZzL2NvcmVkdW1wLmM9MTI1OT1FWFBPUlRfU1lNQk9MKGR1bXBfZW1pdCk7XG5mcy9jb3JlZHVtcC5jLTEyNjAtXG5mcy9jb3JlZHVtcC5jOjEyNjE6dm9pZCBkdW1wX3NraXBfdG8oc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgdW5zaWduZWQgbG9uZyBwb3MpXG5mcy9jb3JlZHVtcC5jLTEyNjIte1xuLS1cbmZzL2NvcmVkdW1wLmM9MTI2NT1FWFBPUlRfU1lNQk9MKGR1bXBfc2tpcF90byk7XG5mcy9jb3JlZHVtcC5jLTEyNjYtXG5mcy9jb3JlZHVtcC5jOjEyNjc6dm9pZCBkdW1wX3NraXAoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgc2l6ZV90IG5yKVxuZnMvY29yZWR1bXAuYy0xMjY4LXtcbi0tXG5mcy9jb3JlZHVtcC5jPTEyNzE9RVhQT1JUX1NZTUJPTChkdW1wX3NraXApO1xuLS1cbmZzL2NvcmVkdW1wLmMtMTI3My0jaWZkZWYgQ09ORklHX0VMRl9DT1JFXG5mcy9jb3JlZHVtcC5jOjEyNzQ6c3RhdGljIGludCBkdW1wX2VtaXRfcGFnZShzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCBzdHJ1Y3QgcGFnZSAqcGFnZSlcbmZzL2NvcmVkdW1wLmMtMTI3NS17XG4tLVxuZnMvY29yZWR1bXAuYz0xMzMwPXN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKmR1bXBfcGFnZV9jb3B5KHN0cnVjdCBwYWdlICpzcmMsIHN0cnVjdCBwYWdlICpkc3QpXG4tLVxuZnMvY29yZWR1bXAuYy0xMzM1LVxuZnMvY29yZWR1bXAuYzoxMzM2OmludCBkdW1wX3VzZXJfcmFuZ2Uoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgdW5zaWduZWQgbG9uZyBzdGFydCxcbmZzL2NvcmVkdW1wLmMtMTMzNy1cdFx0ICAgIHVuc2lnbmVkIGxvbmcgbGVuKVxuLS1cbmZzL2NvcmVkdW1wLmMtMTM5OS1cbmZzL2NvcmVkdW1wLmM6MTQwMDppbnQgZHVtcF9hbGlnbihzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCBpbnQgYWxpZ24pXG5mcy9jb3JlZHVtcC5jLTE0MDEte1xuLS1cbmZzL2NvcmVkdW1wLmM9MTY3Nj1zdGF0aWMgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpjb3JlZHVtcF9uZXh0X3ZtYShzdHJ1Y3Qgdm1hX2l0ZXJhdG9yICp2bWksXG4tLVxuZnMvY29yZWR1bXAuYy0xNjg4LVxuZnMvY29yZWR1bXAuYzoxNjg5OnN0YXRpYyB2b2lkIGZyZWVfdm1hX3NuYXBzaG90KHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXG5mcy9jb3JlZHVtcC5jLTE2OTAte1xuLS1cbmZzL2NvcmVkdW1wLmM9MTcwMz1zdGF0aWMgaW50IGNtcF92bWFfc2l6ZShjb25zdCB2b2lkICp2bWFfbWV0YV9saHNfcHRyLCBjb25zdCB2b2lkICp2bWFfbWV0YV9yaHNfcHRyKVxuLS1cbmZzL2NvcmVkdW1wLmMtMTcxOC0gKi9cbmZzL2NvcmVkdW1wLmM6MTcxOTpzdGF0aWMgYm9vbCBkdW1wX3ZtYV9zbmFwc2hvdChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuZnMvY29yZWR1bXAuYy0xNzIwLXtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44NS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDI8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNTUzNzAKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyMAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgYHZmc19jb3JlZHVtcGAgYW5kIGBjcHJtYCoqCgpPa2F5LCBzbyBJJiMzOTttIGRpZ2dpbmcgaW50byBgdmZzX2NvcmVkdW1wYCBhbmQgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIHNlZSBob3cgYGNwcm1gIGlzIGRlY2xhcmVkIGFuZCB1dGlsaXplZCB3aXRoaW4gdGhhdCBjb250ZXh0LiBUaGUgZ29hbCBoZXJlIGlzIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgaW50ZXJhY3Rpb24gYW5kIGFueSBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzIG9yIGNvbnN0cmFpbnRzLiBJJiMzOTttIGFzc3VtaW5nIHRoZXJlJiMzOTtzIHNvbWUgaW50ZXJlc3RpbmcgbG9naWMgb3IgZGF0YSBmbG93IHRoYXQgSSBuZWVkIHRvIGRpc3NlY3QuIExldCYjMzk7cyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzLiBUaW1lIHRvIHB1dCBvbiB0aGUgZGV0ZWN0aXZlIGhhdCEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD44Ni8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtmcy9jb3JlZHVtcC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTE2NSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxMTY1Olx0XHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXHUwMDNlbW07XG4xMTY2Olx0XHRjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQgPSBtbS1cdTAwM2ViaW5mbXQ7XG4xMTY3Olx0XHRpbnQgYXJnYyA9IDA7XG4xMTY4Olx0XHRzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zIGNwcm0gPSB7XG4xMTY5Olx0XHRcdC5zaWdpbmZvID0gc2lnaW5mbyxcbjExNzA6XHRcdFx0LmxpbWl0ID0gcmxpbWl0KFJMSU1JVF9DT1JFKSxcbjExNzE6XHRcdFx0LyogU25hcHNob3QgTU1GX0RVTVBfRklMVEVSXyogKHVubG9ja2VkKSBhbmQgZHVtcGFibGUgZm9yIHRoZSBkdW1wLiAqL1xuMTE3MjpcdFx0XHQubW1fZmxhZ3MgPSBfX21tX2ZsYWdzX2dldF93b3JkKG1tKSxcbjExNzM6XHRcdFx0LmR1bXBhYmxlID0gdGFza19leGVjX3N0YXRlX2dldF9kdW1wYWJsZShjdXJyZW50KSxcbjExNzQ6XHRcdFx0LnZtYV9tZXRhID0gTlVMTCxcbjExNzU6XHRcdFx0LmNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCksXG4xMTc2Olx0XHR9O1xuMTE3NzpcdFxuMTE3ODpcdFx0YXVkaXRfY29yZV9kdW1wcyhzaWdpbmZvLVx1MDAzZXNpX3NpZ25vKTtcbjExNzk6XHRcbjExODA6XHRcdGlmIChjb3JlZHVtcF9za2lwKFx1MDAyNmNwcm0sIGJpbmZtdCkpXG4xMTgxOlx0XHRcdHJldHVybjtcbjExODI6XHRcbjExODM6XHRcdENMQVNTKHByZXBhcmVfY3JlZHMsIGNyZWQpKCk7XG4xMTg0Olx0XHRpZiAoIWNyZWQpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+ODcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU1ODgxCgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjExNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgUG90ZW50aWFsIE5VTEwgUG9pbnRlciBEZXJlZmVyZW5jZXMgd2l0aCBQSUQgSGFuZGxpbmcqKgoKT2theSwgc28gSSYjMzk7bSBkaWdnaW5nIGludG8gdGhpcyBgY29yZWR1bXBfcGFyYW1zYCBzdHJ1Y3QsIHNwZWNpZmljYWxseSB0aGUgYGNwcm0ucGlkYCBhcnJheSwgd2hpY2gsIGFzIEkgc2VlIGl0LCBpcyBpbml0aWFsaXplZCB0byB6ZXJvIHRoYW5rcyB0byB0aGUgc3RydWN0JiMzOTtzIGluaXRpYWxpemF0aW9uLiBJJiMzOTttIGZvY3VzaW5nIG9uIHBvdGVudGlhbCBudWxsIHBvaW50ZXIgZGVyZWZlcmVuY2VzIHdoZW4gd29ya2luZyB3aXRoIFBJRHMuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBmb2xsb3cgdGhlIGNvZGUgcGF0aHMgd2hlcmUgdGhlIGBwaWRgIGFycmF5IGlzIHV0aWxpemVkLgoKRmlyc3QsIEkgZXhhbWluZWQgYHBpZGZzLmNgIGFuZCBmb3VuZCBgX19waWRmc19yZWdpc3Rlcl9waWRzYCwgd2hpY2ggaXRlcmF0ZXMgdGhyb3VnaCBgcGlkc2AgdXAgdG8gYSBgbGFzdGAgcGlkIHR5cGUuICBJIHRoZW4gbG9va2VkIGludG8gYHBpZGZzX2NvcmVkdW1wYCwgd2hlcmUgdGhlIGxvb3AgYGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgJmx0Oz0gcGlkc19sYXN0KGNwcm0tJmd0O3BpZCk7IHR5cGUmIzQzOyYjNDM7KWAgaXMgdXRpbGl6ZWQsIHdoaWNoIGluIHR1cm4gY2FsbHMgYHBpZGZzX2NvcmVkdW1wX3BpZGAuIFRoYXQmIzM5O3Mgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4KCkkgdG9vayBhIGxvb2sgYXQgYHBpZHNfbGFzdGAgYW5kIGZpZ3VyZWQgb3V0IGhvdyB0aGUgbG9vcCBib3VuZCBpcyBjYWxjdWxhdGVkIHdoZW4gYERFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7YCBpcyB1c2VkLiAgRXNzZW50aWFsbHksIHRoZSBsb29wIGl0ZXJhdGVzIG92ZXIgdGhlIGBQSURUWVBFX1BJRGAgYW5kIGBQSURUWVBFX1RHSURgIHR5cGVzLiBUaGVuIEkgd2VudCB0byBgcGlkZnNfY29yZWR1bXBfcGlkYCwgYW5kIHNhdyB0aGF0IHRoZXJlJiMzOTtzIGEgZGVyZWZlcmVuY2UgYGF0dHIgPSBSRUFEX09OQ0UocGlkLSZndDthdHRyKTtgIGFuZCBJIHRob3VnaHQsICYjMzQ7V2FpdCwgd2hhdCBpZiBgcGlkYCBpcyBOVUxMPyYjMzQ7IFRoYXQmIzM5O2QgYmUgYSBjcmFzaCwgd2hpY2ggaXMgd2hhdCBJJiMzOTttIGxvb2tpbmcgZm9yIQoKSSB3ZW50IGJhY2sgdG8gdHJhY2Ugd2hlcmUgYGNwcm0tJmd0O3BpZFt0eXBlXWAgZ2V0cyBwb3B1bGF0ZWQuIEluIGBjb3JlZHVtcF9wYXJzZWAgYW5kIGBjb3JlZHVtcF9zb2NrX2Nvbm5lY3RgLCBJIHNhdyBgdGFza19waWRzKGNwcm0tJmd0O3BpZCwgY3VycmVudCk7YCwgc28gSSBmb2xsb3dlZCB0aGF0LiAgYHRhc2tfcGlkc2AgY2FsbHMgYF9fdGFza19waWRzYCwgd2hpY2ggdXNlcyBhIGxvb3AgdGhhdCwgZm9yIGBjdXJyZW50YCwgc2hvdWxkICpuZXZlciogcmV0dXJuIE5VTEwgYHBpZGAgdmFsdWVzIGZvciBgUElEVFlQRV9QSURgIG9yIGBQSURUWVBFX1RHSURgLiBUaGF0IHNlZW1zIHNhZmUuCgpJIG1vdmVkIG9uIHRvIGxvb2sgdGhyb3VnaCB0aGUgYGluY2x1ZGUvbGludXgvcGlkLmhgIGZpbGUsIGFuZCBmb3VuZCBvdGhlciBmdW5jdGlvbnMsIHN1Y2ggYXMgYF9fZ2V0X3BpZHNgLCBgX19wdXRfcGlkc2AsIGBfX3N3YXBfcGlkc2AsIGBfX3BpZHNfZXF1YWxgLCBgX190YXNrX3BpZHNgLCBhbmQgYF9fZ2V0X3Rhc2tfcGlkc2AuICBUaGVzZSBhbGwgbG9vayByZWFzb25hYmxlIGluIHRlcm1zIG9mIG51bGwtY2hlY2tpbmcgYmVjYXVzZSB0aGV5IGdlbmVyYWxseSBpdGVyYXRlIG92ZXIgYSBrbm93biB2YWxpZCByYW5nZSBvZiBwaWQgdHlwZXMsIG9yLCBpbiB0aGUgY2FzZSBvZiBgdGFza19waWRzYCBmdW5jdGlvbnMsIHJlY2VpdmUgYSBgdGFza2Agd2hpY2ggZ3VhcmFudGVlcyBhIFBJRC4KCkkgdGhlbiBzdGFydGVkIHRvIGNoZWNrIHRoZSBibHVldG9vdGggY2hhbmdlcy4gSW4gYG5ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmNgLCBJIG5vdGljZWQgdGhhdCBgc2stJmd0O3NrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF1gIGNhbiBwb3RlbnRpYWxseSBnZXQgaW5pdGlhbGl6ZWQgdmlhIGBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSlgLiBUaGUgc3RydWN0IGBzb2NrYCB1c2VzIGBERUNMQVJFX1BJRFMoc2tfcGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7YCwgd2hpY2ggbWVhbnMgYHNrLSZndDtza19wZWVyX3BpZFtQSURUWVBFX1BJRF1gIHdpbGwgYmUgMCAoTlVMTCkuIFRoaXMgbG9va3MgcHJvbWlzaW5nIQoKSSBjb250aW51ZWQgdG8gY2hlY2sgdGhlIGZ1bmN0aW9uczogYGJ0X2FjY2VwdF9lbnF1ZXVlYCwgYG5ldC9ibHVldG9vdGgvaGNpX3NvY2suY2AsIGBuZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suY2AsIGFuZCBgX19za19kZXN0cnVjdGAsIGFuZCByZWFsaXplZCB0aGUgUElEIGNhbiBiZSBOVUxMIGluIHRob3NlIGZ1bmN0aW9ucy4KCkZpbmFsbHksIEkgY2hlY2tlZCBgbmV0L3VuaXgvYWZfdW5peC5jYCB0byBzZWUgaG93IGB1bml4X3BlZXJjcmVkYCBpcyB1c2VkIHNpbmNlIGl0IHVzZXMgdGhlIHNhbWUgYERFQ0xBUkVfUElEU2AgbWFjcm8uCgpTbywgaW4gc3VtbWFyeSwgSSYjMzk7bSBmaW5kaW5nIHBsYWNlcyB3aGVyZSBQSURzIGFyZSBwb3RlbnRpYWxseSBOVUxMIGFuZCB0aGVuIGJlaW5nIGRlcmVmZXJlbmNlZCwgd2hpY2ggaXMgd2hhdCBJIHdhcyBsb29raW5nIGZvci4gTm93IEkgbmVlZCB0byBkZWNpZGUgaWYgdGhlc2UgcG90ZW50aWFsIE5VTExzIHJlcHJlc2VudCBhY3R1YWwgdnVsbmVyYWJpbGl0aWVzIG9yIGFyZSBoYW5kbGVkIHNhZmVseSBlbHNld2hlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+ODgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3VuaXhfcGVlcmNyZWQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvdW5peCYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvdW5peC9hZl91bml4LmM9NjY1PXN0YXRpYyB2b2lkIHVuaXhfcmVsZWFzZV9zb2NrKHN0cnVjdCBzb2NrICpzaywgaW50IGVtYnJpb24pXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTczOC1cbm5ldC91bml4L2FmX3VuaXguYzo3Mzk6c3RydWN0IHVuaXhfcGVlcmNyZWQge1xubmV0L3VuaXgvYWZfdW5peC5jLTc0MC1cdERFQ0xBUkVfUElEUyhwZWVyX3BpZCwgUElEVFlQRV9UR0lEKTtcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtNzQzLVxubmV0L3VuaXgvYWZfdW5peC5jOjc0NDpzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX3BlZXJjcmVkKHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbm5ldC91bml4L2FmX3VuaXguYy03NDUte1xuLS1cbm5ldC91bml4L2FmX3VuaXguYy03NTgtXG5uZXQvdW5peC9hZl91bml4LmM6NzU5OnN0YXRpYyB2b2lkIGRyb3BfcGVlcmNyZWQoc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxubmV0L3VuaXgvYWZfdW5peC5jLTc2MC17XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTc3MD1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9wZWVyY3JlZChzdHJ1Y3Qgc29jayAqc2ssXG5uZXQvdW5peC9hZl91bml4LmM6NzcxOlx0XHRcdFx0IGNvbnN0IHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbm5ldC91bml4L2FmX3VuaXguYy03NzIte1xuLS1cbm5ldC91bml4L2FmX3VuaXguYy03NzYtXG5uZXQvdW5peC9hZl91bml4LmM6Nzc3OnN0YXRpYyB2b2lkIHVwZGF0ZV9wZWVyY3JlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbm5ldC91bml4L2FmX3VuaXguYy03Nzgte1xuLS1cbm5ldC91bml4L2FmX3VuaXguYz04MDU9c3RhdGljIGludCB1bml4X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZylcbi0tXG5uZXQvdW5peC9hZl91bml4LmMtODA5LVx0c3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spO1xubmV0L3VuaXgvYWZfdW5peC5jOjgxMDpcdHN0cnVjdCB1bml4X3BlZXJjcmVkIHBlZXJjcmVkID0ge307XG5uZXQvdW5peC9hZl91bml4LmMtODExLVxuLS1cbm5ldC91bml4L2FmX3VuaXguYz0xNjMxPXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqdWFkZHIsXG4tLVxubmV0L3VuaXgvYWZfdW5peC5jLTE2MzYtXHRzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayksICpuZXd1LCAqb3RoZXJ1O1xubmV0L3VuaXgvYWZfdW5peC5jOjE2Mzc6XHRzdHJ1Y3QgdW5peF9wZWVyY3JlZCBwZWVyY3JlZCA9IHt9O1xubmV0L3VuaXgvYWZfdW5peC5jLTE2MzgtXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7XG4tLVxubmV0L3VuaXgvYWZfdW5peC5jPTE4MTE9c3RhdGljIGludCB1bml4X3NvY2tldHBhaXIoc3RydWN0IHNvY2tldCAqc29ja2EsIHN0cnVjdCBzb2NrZXQgKnNvY2tiKVxubmV0L3VuaXgvYWZfdW5peC5jLTE4MTIte1xubmV0L3VuaXgvYWZfdW5peC5jOjE4MTM6XHRzdHJ1Y3QgdW5peF9wZWVyY3JlZCBza2FfcGVlcmNyZWQgPSB7fSwgc2tiX3BlZXJjcmVkID0ge307XG5uZXQvdW5peC9hZl91bml4LmMtMTgxNC1cdHN0cnVjdCBzb2NrICpza2EgPSBzb2NrYS1cdTAwM2VzaywgKnNrYiA9IHNvY2tiLVx1MDAzZXNrO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjg5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1OTU3OAoJCQkJCQkJb3V0cHV0OiAyMAoJCQkJCQkJdGhvdWdodHM6IDI1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiBVbml4IFNvY2tldCBQZWVyIENyZWRlbnRpYWxzKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCBob3cgcGVlciBjcmVkZW50aWFscyBhcmUgaGFuZGxlZCBpbiB0aGVzZSBVbml4IHNvY2tldCBmdW5jdGlvbnMg4oCTIGB1bml4X2xpc3RlbmAsIGB1bml4X3N0cmVhbV9jb25uZWN0YCwgYW5kIGB1bml4X3NvY2tldHBhaXJgLiBJIHNlZSB0aGF0IGluIGFsbCB0aHJlZSwgdGhlIGBzdHJ1Y3QgdW5peF9wZWVyY3JlZGAgaXMgaW5pdGlhbGl6ZWQgdXNpbmcgYHt9YC4gVGhhdCYjMzk7cyB0aGUgYmFzZWxpbmUuIE5vdywgdGhlIGtleSBzZWVtcyB0byBiZSBpbiBgcHJlcGFyZV9wZWVyY3JlZGAuCgpJbiBgcHJlcGFyZV9wZWVyY3JlZGAsIGZpcnN0IEkgc2VlIHRoYXQgdGhlIHByb2Nlc3MgSURzIGFyZSBvYnRhaW5lZCB1c2luZyBgZ2V0X3Rhc2tfcGlkc2AuIFRoZW4sIHRoZXNlIElEcyBhcmUgcmVnaXN0ZXJlZCB1c2luZyBgcGlkZnNfcmVnaXN0ZXJfcGlkc2AuIElmIHRoZXJlJiMzOTtzIGFuIGVycm9yIGR1cmluZyBQSUQgcmVnaXN0cmF0aW9uLCBgcHV0X3BpZHNgIGlzIGNhbGxlZCBmb3IgY2xlYW51cCwgYW5kIEkgYXNzdW1lIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgYmVjb21lIGludmFsaWQgb3IgTlVMTC4gSWYgdGhhdCBmYWlscywgdGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IgYW5kIHNldHMgdGhlIHN0cnVjdCBlbGVtZW50cyB0byBOVUxMLiBUaGlzIGlzIGltcG9ydGFudCB0byBub3RlIC0gZmFpbHVyZSB0byByZWdpc3RlciBQSURzIHJlcXVpcmVzIHRoYXQgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwLgoKSWYgYHByZXBhcmVfcGVlcmNyZWRgICpzdWNjZWVkcyosIGhvd2V2ZXIsIHRoZW4gYHBlZXJfcGlkYCBhbmQgYHBlZXJfY3JlZGAgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBJdCBsb29rcyBsaWtlIGBwZWVyX2NyZWRgIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjdXJyZW50IGNyZWRlbnRpYWwgdXNpbmcgYGdldF9jdXJyZW50X2NyZWQoKWAuIFNvLCB0aGUgZW50aXJlIHN0cnVjdCBpcyB3ZWxsIGRlZmluZWQgd2l0aCBhbGwgbmVlZGVkIGNyZWRlbnRpYWxzLgoKTm93LCBteSBuZXh0IG1vdmUgaXMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBgc3RydWN0IHVuaXhfcGVlcmNyZWRgIGlzIHVsdGltYXRlbHkgdXNlZC4gSSBuZWVkIHRvIGludmVzdGlnYXRlIGBjcmVkX3RvX3VjcmVkYC4gTGV0IG1lIGNoZWNrIGBuZXQvY29yZS9zb2NrLmNgIG9yIHdoZXJldmVyIGVsc2UgaXQgaXMgY2FsbGVkLiBBIHNlYXJjaCBmb3IgYGNyZWRfdG9fdWNyZWRgIHNob3VsZCByZXZlYWwgd2hlcmUgdGhpcyBjcmVkZW50aWFsIGluZm9ybWF0aW9uIGlzIGFjdHVhbGx5IHRyYW5zbGF0ZWQgb3IgdXNlZCBpbiB0aGUgb3ZlcmFsbCBuZXR3b3JrIHN0YWNrLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjcmVkX3RvX3VjcmVkJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9jb3JlL3NvY2suYz0xNzA3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3JlZCAqc2tfZ2V0X3BlZXJfY3JlZChzdHJ1Y3Qgc29jayAqc2spXG4tLVxubmV0L2NvcmUvc29jay5jLTE3MTctXG5uZXQvY29yZS9zb2NrLmM6MTcxODpzdGF0aWMgdm9pZCBjcmVkX3RvX3VjcmVkKHN0cnVjdCBwaWQgKnBpZCwgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsXG5uZXQvY29yZS9zb2NrLmMtMTcxOS1cdFx0XHQgIHN0cnVjdCB1Y3JlZCAqdWNyZWQpXG4tLVxubmV0L2NvcmUvc29jay5jPTE3OTA9aW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuLS1cbm5ldC9jb3JlL3NvY2suYy0xOTc0LVx0XHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbm5ldC9jb3JlL3NvY2suYzoxOTc1Olx0XHRjcmVkX3RvX3VjcmVkKHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0sIHNrLVx1MDAzZXNrX3BlZXJfY3JlZCxcbm5ldC9jb3JlL3NvY2suYy0xOTc2LVx0XHRcdCAgICAgIFx1MDAyNnBlZXJjcmVkKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45MS8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMzEgMTI6NDQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjA0NDMKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBgY3JlZF90b191Y3JlZGAqKgoKT2theSwgdGltZSB0byBnZXQgdG8gdGhlIGhlYXJ0IG9mIHRoZSBtYXR0ZXIuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBjcmVkZW50aWFscyBhcmUgYmVpbmcgaGFuZGxlZCBhdCB0aGUgc29ja2V0IGxheWVyLiBNeSBpbnN0aW5jdCB0ZWxscyBtZSB0aGUgcGxhY2UgdG8gc3RhcnQgaXMgYGNyZWRfdG9fdWNyZWRgIHdpdGhpbiBgbmV0L2NvcmUvc29jay5jYC4gVGhhdCYjMzk7cyB3aGVyZSBJIGFudGljaXBhdGUgdGhlIGNvcmUgbWFwcGluZyBiZXR3ZWVuIHRoZSBrZXJuZWwmIzM5O3MgY3JlZGVudGlhbCBzdHJ1Y3R1cmVzIGFuZCB0aGUgdXNlciBzcGFjZSBjcmVkZW50aWFscyAodWNyZWQpIHdpbGwgcmVzaWRlLiBJdCYjMzk7cyBhIGNyaXRpY2FsIGZ1bmN0aW9uIGZvciBzZWN1cml0eSBjb250ZXh0IHByb3BhZ2F0aW9uLCBzbyBJIG5lZWQgdG8gc2VlIGhvdyBpdCYjMzk7cyBpbXBsZW1lbnRlZCBhbmQgaWRlbnRpZnkgYW55IHBvdGVudGlhbCBnb3RjaGFzIG9yIGVkZ2UgY2FzZXMuIEkmIzM5O2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiBzb2NrZXRzLCBhbnkgaW1wbGljaXQgYXNzdW1wdGlvbnMgYWJvdXQgY3JlZGVudGlhbCBzb3VyY2VzLCBhbmQgaG93IGl0IGRlYWxzIHdpdGggc2l0dWF0aW9ucyB3aGVyZSBjcmVkZW50aWFsIGluZm9ybWF0aW9uIG1pZ2h0IGJlIGluY29tcGxldGUgb3Igc3RhbGUuIFRoaXMgZnVuY3Rpb24mIzM5O3MgaW1wbGVtZW50YXRpb24gc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIHRvIHVuZGVyc3RhbmQgdGhlIGJlaGF2aW9yIG9mIHRoZSBzb2NrZXQgbGF5ZXIuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OTIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bmV0L2NvcmUvc29jay5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMTcxNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsxNzE1Olx0XHRyZXR1cm4gY3JlZDtcbjE3MTY6XHR9XG4xNzE3Olx0XG4xNzE4Olx0c3RhdGljIHZvaWQgY3JlZF90b191Y3JlZChzdHJ1Y3QgcGlkICpwaWQsIGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLFxuMTcxOTpcdFx0XHRcdCAgc3RydWN0IHVjcmVkICp1Y3JlZClcbjE3MjA6XHR7XG4xNzIxOlx0XHR1Y3JlZC1cdTAwM2VwaWQgPSBwaWRfdm5yKHBpZCk7XG4xNzIyOlx0XHR1Y3JlZC1cdTAwM2V1aWQgPSB1Y3JlZC1cdTAwM2VnaWQgPSAtMTtcbjE3MjM6XHRcdGlmIChjcmVkKSB7XG4xNzI0Olx0XHRcdHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqY3VycmVudF9ucyA9IGN1cnJlbnRfdXNlcl9ucygpO1xuMTcyNTpcdFxuMTcyNjpcdFx0XHR1Y3JlZC1cdTAwM2V1aWQgPSBmcm9tX2t1aWRfbXVuZ2VkKGN1cnJlbnRfbnMsIGNyZWQtXHUwMDNlZXVpZCk7XG4xNzI3Olx0XHRcdHVjcmVkLVx1MDAzZWdpZCA9IGZyb21fa2dpZF9tdW5nZWQoY3VycmVudF9ucywgY3JlZC1cdTAwM2VlZ2lkKTtcbjE3Mjg6XHRcdH1cbjE3Mjk6XHR9XG4xNzMwOlx0XG4xNzMxOlx0c3RhdGljIGludCBncm91cHNfdG9fdXNlcihzb2NrcHRyX3QgZHN0LCBjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqc3JjKVxuMTczMjpcdHtcbjE3MzM6XHRcdHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucyA9IGN1cnJlbnRfdXNlcl9ucygpO1xuMTczNDpcdFx0aW50IGk7XG4xNzM1Olx0XG4xNzM2Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBzcmMtXHUwMDNlbmdyb3VwczsgaSYjNDM7JiM0MzspIHtcbjE3Mzc6XHRcdFx0Z2lkX3QgZ2lkID0gZnJvbV9rZ2lkX211bmdlZCh1c2VyX25zLCBzcmMtXHUwMDNlZ2lkW2ldKTtcbjE3Mzg6XHRcbjE3Mzk6XHRcdFx0aWYgKGNvcHlfdG9fc29ja3B0cl9vZmZzZXQoZHN0LCBpICogc2l6ZW9mKGdpZCksIFx1MDAyNmdpZCwgc2l6ZW9mKGdpZCkpKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8zMSAxMjo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2MTEyNAoJCQkJCQkJb3V0cHV0OiA1MzUKCQkJCQkJCXRob3VnaHRzOiAxMzk4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEFzc2Vzc21lbnQ6IE5vIExlYWtzIG9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IERldGVjdGVkKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIE15IGFuYWx5c2lzIGZvY3VzZXMgb24gcG90ZW50aWFsIGluZm9ybWF0aW9uIGxlYWtzIGFuZCB0aGUgcHJlc2VuY2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgaW4gdGhlIHJlbGV2YW50IHNvY2tldCBjb2RlLCBzcGVjaWZpY2FsbHkgY29uY2VybmluZyB0aGUgYFNPX1BFRVJDUkVEYCBhbmQgYFNPX1BFRVJQSURGRGAgc29ja2V0IG9wdGlvbnMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgoKRmlyc3QsIEkgZXhhbWluZWQgYHNrX2dldHNvY2tvcHRgLiAgV2l0aGluIGBjYXNlIFNPX1BFRVJDUkVEYCwgdGhlIGNvZGUgcmV0cmlldmVzIHBlZXIgY3JlZGVudGlhbHMgaW50byBhIGBzdHJ1Y3QgdWNyZWRgLiBJIHNlZSB0aGF0IGBjcmVkX3RvX3VjcmVkYCBwb3B1bGF0ZXMgYWxsIHRoZSBmaWVsZHMgKFBJRCwgVUlELCBHSUQpIG9mIGBwZWVyY3JlZGAgYmVmb3JlIGNvcHlpbmcgaXQgdG8gdXNlciBzcGFjZS4gIEFsc28sIGBzdHJ1Y3QgdWNyZWRgIGlzIHRpZ2h0bHkgcGFja2VkOyB0aGVyZSYjMzk7cyBubyBwYWRkaW5nIG9uIGVpdGhlciAzMi1iaXQgb3IgNjQtYml0IGFyY2hpdGVjdHVyZXMsIHNvIHRoZXJlIGFyZSBubyBjb25jZXJucyBhYm91dCBhY2NpZGVudGFsbHkgbGVha2luZyB1bmluaXRpYWxpemVkIGRhdGEgd2l0aGluIHRoZSBzdHJ1Y3QuCgpOZXh0LCBJIGxvb2tlZCBhdCBgc2tfZ2V0c29ja29wdF9wZWVycGlkZmRgLiBIZXJlLCB0aGUgY29kZSBwcmVwYXJlcyBhbmQgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciAoYHBpZGZkYCkgcmVwcmVzZW50aW5nIHRoZSBwZWVyJiMzOTtzIHByb2Nlc3MuIFRoZSBgcGlkZmRgIGlzIGNyZWF0ZWQgYnkgYHBpZGZkX3ByZXBhcmVgIGFuZCB0aGVuIGNvcGllZCB0byB1c2VyIHNwYWNlLiBUaGUgY29kZSBwcm9wZXJseSBoYW5kbGVzIHRoZSBsZW5ndGggYW5kIHRoZXJlIGlzIG5vIGV2aWRlbmNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGxlYWtlZC4KClRoZSBgc2NtX3BpZGZkX3JlY3ZgIGZ1bmN0aW9uIHdhcyBuZXh0LiBUaGlzIGZ1bmN0aW9uIGFsc28gd3JpdGVzIGEgYHBpZGZkYCB0byB1c2VyIHNwYWNlIHdpdGhpbiBhbiBTQ00gbWVzc2FnZS4gSXQgY2FsbHMgYHBpZGZkX3ByZXBhcmVgIHdoaWNoIGFzc2lnbnMgYSB2YWx1ZSB0byBgcGlkZmRgIGJlZm9yZSBzZW5kaW5nIGl0LgoKVGhlbiwgSSB3ZW50IHRocm91Z2ggYSBjaGVja2xpc3QgdG8gbG9vayBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2UuIEkgY29uZmlybWVkIHRoYXQ6CgoxLiAgYHNjbV9jb29raWVgIGluc3RhbmNlcyBhcmUgemVyb2VkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KMi4gIGBzay0mZ3Q7c2tfcGVlcl9waWRgIGlzIGV4cGxpY2l0bHkgemVyb2VkIGR1cmluZyBzb2NrZXQgaW5pdGlhbGl6YXRpb24sIHByZXZlbnRpbmcgYW55IHBvdGVudGlhbCBsZWFrcyBmcm9tIHVuaW5pdGlhbGl6ZWQgUElEcy4KMy4gIFRoZSBgY3BybS5waWRgIGZpZWxkIHdpdGhpbiBgc3RydWN0IGNvcmVkdW1wX3BhcmFtc2AgaXMgemVyby1pbml0aWFsaXplZC4KNC4gIGB1bml4X3BlZXJjcmVkYCBzdHJ1Y3R1cmVzIGFyZSBpbml0aWFsaXplZCBhbmQgZnVsbHkgcG9wdWxhdGVkLgo1LiAgYHNrYi0mZ3Q7Y2JgICh3aGVyZSBgVU5JWENCKHNrYilgIGlzIGxvY2F0ZWQpIGlzIHplcm9lZCB1cG9uIFNLQiBhbGxvY2F0aW9uLgo2LiAgQml0ZmllbGRzIHdpdGhpbiBgc3RydWN0IHNvY2tgIGFyZSBhbGwgY29ycmVjdGx5IGluaXRpYWxpemVkIChyZWxldmFudCB0byBgc2tfc2NtX3BpZGZkX3RocmVhZGAgYW5kIHJlbGF0ZWQgZmxhZ3MpIGR1cmluZyBhbGxvY2F0aW9uLCBzcGVjaWZpY2FsbHkgYnkgYGt6YWxsb2NgIG9yIGBza19hbGxvY2AsIGJvdGggb2Ygd2hpY2ggemVybyBtZW1vcnkuCjcuICBJIGZvdW5kIG5vIGluc3RhbmNlcyB3aGVyZSB1bmluaXRpYWxpemVkIG1lbW9yeSBpcyByZWFkIG9yIGxlYWtlZCBhY3Jvc3MgdGhlIHVzZXIva2VybmVsIGJvdW5kYXJ5Lgo4LiAgSSBjb25zaWRlcmVkIHRoZSBwb3NzaWJpbGl0eSBvZiBtZW1vcnkgY29ycnVwdGlvbiwgdXNlLWFmdGVyLWZyZWUsIHJlZmVyZW5jZSBjb3VudGluZyBlcnJvcnMsIE5VTEwgZGVyZWZlcmVuY2VzLCBvciBsb2NraW5nIGJ1Z3MsIGJ1dCB0aGlzIHdvdWxkIGJlIGNhdWdodCBieSBLQVNBTiBvciBzdGFuZGFyZCBkZWJ1Z2dlcnMsIGxpa2UgTE9DS0RFUCBvciBQUk9WRVxfTE9DS0lORy4KCkkgdGhlbiBkaWQgYSBmaW5hbCByZXZpZXcgYWdhaW5zdCBLTVNBTi1zcGVjaWZpYyBjcml0ZXJpYToKCiogICBJIHNhdyBubyBjYXNlcyBvZiBrZXJuZWwgc3RydWN0dXJlcyBiZWluZyBzZW50IHRvIHVzZXIgc3BhY2Ugd2hlcmUgZmllbGRzIG9yIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkLgoqICAgSSBmb3VuZCBubyBjb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCByZWxpZXMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuCiogICBJIG9ic2VydmVkIG5vIGFsbG9jYXRpb25zIG9yIGluaXRpYWxpemF0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIHRoYXQgY291bGQgbGVhZCB0byBpc3N1ZXMuCiogICBUaGVyZSBhcmUgbm8gY2FzZXMgb2YgYm91bmRzIGNoZWNrcyBvciBsZW5ndGggY2hlY2tzIGFsbG93aW5nIGFjY2VzcyB0byB1bmluaXRpYWxpemVkIGJ5dGVzLgoKQmFzZWQgb24gdGhpcyBjb21wcmVoZW5zaXZlIGFuYWx5c2lzLCBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHRoZXJlIGFyZSBubyBLTVNBTi1yZWxldmFudCBpc3N1ZXMuIFRoZSBjb2RlIGFwcGVhcnMgdG8gYmUgY2xlYW4gd2l0aCBubyBwb3RlbnRpYWwgZm9yIGluZm9ybWF0aW9uIGxlYWtzIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZXJlZm9yZSwgTmVlZHNLTVNBTiBzaG91bGQgYmUgZmFsc2UsIGFuZCBJJiMzOTtsbCBjYWxsIHNldC1yZXN1bHRzIHdpdGggdGhpcyBjb25jbHVzaW9uIGFuZCBteSBkZXRhaWxlZCByZWFzb25pbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OTQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzMxIDEyOjQ1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRocmVhZCBwaWRmZHMgaW4gVU5JWCBkb21haW4gc29ja2V0cyBhbmQgY29yZWR1bXAgbWVjaGFuaXNtcyAoU09fUEFTU1BJREZEX1RIUkVBRCwgU09fUEVFUlBJREZEX1RIUkVBRCkuXG5cbktleSBhcmVhcyBhbmFseXplZCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XG4xLiBgREVDTEFSRV9QSURTYCBhcnJheXMgaW4gYHN0cnVjdCBzY21fY29va2llYCwgYHN0cnVjdCBzb2NrYCwgYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgLCBgc3RydWN0IHVuaXhfcGVlcmNyZWRgLCBhbmQgYHN0cnVjdCB1bml4X3NrYl9wYXJtc2A6XG4gICAtIGBzdHJ1Y3Qgc29ja2AgaW5zdGFuY2VzIGFyZSBhbGxvY2F0ZWQgd2l0aCBgc2tfYWxsb2MoKWAgKHplcm9lZCkgYW5kIGV4cGxpY2l0bHkgcmVzZXQgaW4gYHNvY2tfaW5pdF9kYXRhX3VpZCgpYCB3aXRoIGBtZW1zZXQoc2stXHUwMDNlc2tfcGVlcl9waWQsIDAsIC4uLilgLlxuICAgLSBgc3RydWN0IHNjbV9jb29raWVgIG9iamVjdHMgYXJlIGNvbnNpc3RlbnRseSB6ZXJvLWluaXRpYWxpemVkIChlaXRoZXIgdmlhIGRlc2lnbmF0ZWQgemVybyBpbml0aWFsaXplcnMgYD0ge31gIG9yIGBtZW1zZXQoLi4uLCAwLCBzaXplb2YoLi4uKSlgKSBhY3Jvc3MgYWxsIGNhbGxlcnMgKGBzY21fc2VuZGAsIGB1bml4X2Rlc3RydWN0X3NjbWAsIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AsIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgLCBgaGNpX3NvY2tfcmVjdm1zZ2AsIGBuZXRsaW5rX3JlY3Ztc2dgKS5cbiAgIC0gYHN0cnVjdCB1bml4X3BlZXJjcmVkYCBpbnN0YW5jZXMgYXJlIHplcm8taW5pdGlhbGl6ZWQgKGA9IHt9YCkgaW4gYHVuaXhfbGlzdGVuYCwgYHVuaXhfc3RyZWFtX2Nvbm5lY3RgLCBhbmQgYHVuaXhfc29ja2V0cGFpcmAgYmVmb3JlIGBwcmVwYXJlX3BlZXJjcmVkKClgLlxuICAgLSBgc2tiLVx1MDAzZWNiYCBjb250YWluaW5nIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgIGlzIHplcm9lZCBkdXJpbmcgYF9fYWxsb2Nfc2tiKClgLlxuICAgLSBgc3RydWN0IGNvcmVkdW1wX3BhcmFtc2AgaXMgemVyby1pbml0aWFsaXplZCB2aWEgZGVzaWduYXRlZCBpbml0aWFsaXplcnMgaW4gYHZmc19jb3JlZHVtcCgpYC5cbjIuIFNvY2tldCBvcHRpb24gaGFuZGxlcnMgYW5kIGNtc2cgaGVscGVyczpcbiAgIC0gYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKClgIGNvcGllcyBhbiBpbml0aWFsaXplZCBgaW50IHBpZGZkYCBhbmQgYGludCBsZW5gIHRvIHVzZXIgc3BhY2UuXG4gICAtIGBzY21fcGlkZmRfcmVjdigpYCBpbml0aWFsaXplcyBgcGlkZmRgIGZyb20gYHBpZGZkX3ByZXBhcmUoKWAgYmVmb3JlIHdyaXRpbmcgdmlhIGBwdXRfY21zZygpYC5cbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlIG9yIHJlYWQgaW4gY29uZGl0aW9uYWwgbG9naWMuXG4zLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIChlLmcuIHBpZCByZWZlcmVuY2UgbWFuYWdlbWVudCwgdXNlLWFmdGVyLWZyZWUsIGxvY2tpbmcgYXJvdW5kIGBza19wZWVyX2xvY2tgLCBOVUxMIGRlcmVmZXJlbmNlKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cblxuVGh1cywgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHdhcnJhbnRpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgdGhyZWFkIHBpZGZkcyBpbiBVTklYIGRvbWFpbiBzb2NrZXRzIGFuZCBjb3JlZHVtcCBtZWNoYW5pc21zIChTT19QQVNTUElERkRfVEhSRUFELCBTT19QRUVSUElERkRfVEhSRUFEKS5cblxuS2V5IGFyZWFzIGFuYWx5emVkIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcbjEuIGBERUNMQVJFX1BJRFNgIGFycmF5cyBpbiBgc3RydWN0IHNjbV9jb29raWVgLCBgc3RydWN0IHNvY2tgLCBgc3RydWN0IGNvcmVkdW1wX3BhcmFtc2AsIGBzdHJ1Y3QgdW5peF9wZWVyY3JlZGAsIGFuZCBgc3RydWN0IHVuaXhfc2tiX3Bhcm1zYDpcbiAgIC0gYHN0cnVjdCBzb2NrYCBpbnN0YW5jZXMgYXJlIGFsbG9jYXRlZCB3aXRoIGBza19hbGxvYygpYCAoemVyb2VkKSBhbmQgZXhwbGljaXRseSByZXNldCBpbiBgc29ja19pbml0X2RhdGFfdWlkKClgIHdpdGggYG1lbXNldChzay1cdTAwM2Vza19wZWVyX3BpZCwgMCwgLi4uKWAuXG4gICAtIGBzdHJ1Y3Qgc2NtX2Nvb2tpZWAgb2JqZWN0cyBhcmUgY29uc2lzdGVudGx5IHplcm8taW5pdGlhbGl6ZWQgKGVpdGhlciB2aWEgZGVzaWduYXRlZCB6ZXJvIGluaXRpYWxpemVycyBgPSB7fWAgb3IgYG1lbXNldCguLi4sIDAsIHNpemVvZiguLi4pKWApIGFjcm9zcyBhbGwgY2FsbGVycyAoYHNjbV9zZW5kYCwgYHVuaXhfZGVzdHJ1Y3Rfc2NtYCwgYF9fdW5peF9kZ3JhbV9yZWN2bXNnYCwgYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AsIGBoY2lfc29ja19yZWN2bXNnYCwgYG5ldGxpbmtfcmVjdm1zZ2ApLlxuICAgLSBgc3RydWN0IHVuaXhfcGVlcmNyZWRgIGluc3RhbmNlcyBhcmUgemVyby1pbml0aWFsaXplZCAoYD0ge31gKSBpbiBgdW5peF9saXN0ZW5gLCBgdW5peF9zdHJlYW1fY29ubmVjdGAsIGFuZCBgdW5peF9zb2NrZXRwYWlyYCBiZWZvcmUgYHByZXBhcmVfcGVlcmNyZWQoKWAuXG4gICAtIGBza2ItXHUwMDNlY2JgIGNvbnRhaW5pbmcgYHN0cnVjdCB1bml4X3NrYl9wYXJtc2AgaXMgemVyb2VkIGR1cmluZyBgX19hbGxvY19za2IoKWAuXG4gICAtIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCBpcyB6ZXJvLWluaXRpYWxpemVkIHZpYSBkZXNpZ25hdGVkIGluaXRpYWxpemVycyBpbiBgdmZzX2NvcmVkdW1wKClgLlxuMi4gU29ja2V0IG9wdGlvbiBoYW5kbGVycyBhbmQgY21zZyBoZWxwZXJzOlxuICAgLSBgc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoKWAgY29waWVzIGFuIGluaXRpYWxpemVkIGBpbnQgcGlkZmRgIGFuZCBgaW50IGxlbmAgdG8gdXNlciBzcGFjZS5cbiAgIC0gYHNjbV9waWRmZF9yZWN2KClgIGluaXRpYWxpemVzIGBwaWRmZGAgZnJvbSBgcGlkZmRfcHJlcGFyZSgpYCBiZWZvcmUgd3JpdGluZyB2aWEgYHB1dF9jbXNnKClgLlxuICAgLSBObyBzdHJ1Y3R1cmUgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgZXhwb3NlZCB0byB1c2Vyc3BhY2Ugb3IgcmVhZCBpbiBjb25kaXRpb25hbCBsb2dpYy5cbjMuIFBvdGVudGlhbCBpc3N1ZXMgaW4gdGhpcyBwYXRjaCBzZXJpZXMgKGUuZy4gcGlkIHJlZmVyZW5jZSBtYW5hZ2VtZW50LCB1c2UtYWZ0ZXItZnJlZSwgbG9ja2luZyBhcm91bmQgYHNrX3BlZXJfbG9ja2AsIE5VTEwgZGVyZWZlcmVuY2UpIGFyZSBkZXRlY3RhYmxlIGJ5IEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLlxuXG5UaHVzLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2FycmFudGluZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMwOjI0LjQ4ODY2NTYyNVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg5MjgwODQzNDM2OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJVTklYXCIsXG4gICAgXCJDT1JFRFVNUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNrX3NldHNvY2tvcHRcIixcbiAgICBcInNrX2dldHNvY2tvcHRcIixcbiAgICBcInNjbV9yZWN2X3VuaXhcIixcbiAgICBcIl9fc2NtX3NlbmRcIixcbiAgICBcIl9fcGlkZnNfcmVnaXN0ZXJfcGlkc1wiLFxuICAgIFwicGlkZnNfY29yZWR1bXBcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRocmVhZCBwaWRmZHMgaW4gVU5JWCBkb21haW4gc29ja2V0cyBhbmQgY29yZWR1bXAgbWVjaGFuaXNtcyAoU09fUEFTU1BJREZEX1RIUkVBRCwgU09fUEVFUlBJREZEX1RIUkVBRCkuXFxuXFxuS2V5IGFyZWFzIGFuYWx5emVkIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcXG4xLiBgREVDTEFSRV9QSURTYCBhcnJheXMgaW4gYHN0cnVjdCBzY21fY29va2llYCwgYHN0cnVjdCBzb2NrYCwgYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgLCBgc3RydWN0IHVuaXhfcGVlcmNyZWRgLCBhbmQgYHN0cnVjdCB1bml4X3NrYl9wYXJtc2A6XFxuICAgLSBgc3RydWN0IHNvY2tgIGluc3RhbmNlcyBhcmUgYWxsb2NhdGVkIHdpdGggYHNrX2FsbG9jKClgICh6ZXJvZWQpIGFuZCBleHBsaWNpdGx5IHJlc2V0IGluIGBzb2NrX2luaXRfZGF0YV91aWQoKWAgd2l0aCBgbWVtc2V0KHNrLVxcdTAwM2Vza19wZWVyX3BpZCwgMCwgLi4uKWAuXFxuICAgLSBgc3RydWN0IHNjbV9jb29raWVgIG9iamVjdHMgYXJlIGNvbnNpc3RlbnRseSB6ZXJvLWluaXRpYWxpemVkIChlaXRoZXIgdmlhIGRlc2lnbmF0ZWQgemVybyBpbml0aWFsaXplcnMgYD0ge31gIG9yIGBtZW1zZXQoLi4uLCAwLCBzaXplb2YoLi4uKSlgKSBhY3Jvc3MgYWxsIGNhbGxlcnMgKGBzY21fc2VuZGAsIGB1bml4X2Rlc3RydWN0X3NjbWAsIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AsIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgLCBgaGNpX3NvY2tfcmVjdm1zZ2AsIGBuZXRsaW5rX3JlY3Ztc2dgKS5cXG4gICAtIGBzdHJ1Y3QgdW5peF9wZWVyY3JlZGAgaW5zdGFuY2VzIGFyZSB6ZXJvLWluaXRpYWxpemVkIChgPSB7fWApIGluIGB1bml4X2xpc3RlbmAsIGB1bml4X3N0cmVhbV9jb25uZWN0YCwgYW5kIGB1bml4X3NvY2tldHBhaXJgIGJlZm9yZSBgcHJlcGFyZV9wZWVyY3JlZCgpYC5cXG4gICAtIGBza2ItXFx1MDAzZWNiYCBjb250YWluaW5nIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgIGlzIHplcm9lZCBkdXJpbmcgYF9fYWxsb2Nfc2tiKClgLlxcbiAgIC0gYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgIGlzIHplcm8taW5pdGlhbGl6ZWQgdmlhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzIGluIGB2ZnNfY29yZWR1bXAoKWAuXFxuMi4gU29ja2V0IG9wdGlvbiBoYW5kbGVycyBhbmQgY21zZyBoZWxwZXJzOlxcbiAgIC0gYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKClgIGNvcGllcyBhbiBpbml0aWFsaXplZCBgaW50IHBpZGZkYCBhbmQgYGludCBsZW5gIHRvIHVzZXIgc3BhY2UuXFxuICAgLSBgc2NtX3BpZGZkX3JlY3YoKWAgaW5pdGlhbGl6ZXMgYHBpZGZkYCBmcm9tIGBwaWRmZF9wcmVwYXJlKClgIGJlZm9yZSB3cml0aW5nIHZpYSBgcHV0X2Ntc2coKWAuXFxuICAgLSBObyBzdHJ1Y3R1cmUgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgZXhwb3NlZCB0byB1c2Vyc3BhY2Ugb3IgcmVhZCBpbiBjb25kaXRpb25hbCBsb2dpYy5cXG4zLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIChlLmcuIHBpZCByZWZlcmVuY2UgbWFuYWdlbWVudCwgdXNlLWFmdGVyLWZyZWUsIGxvY2tpbmcgYXJvdW5kIGBza19wZWVyX2xvY2tgLCBOVUxMIGRlcmVmZXJlbmNlKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cXG5cXG5UaHVzLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2FycmFudGluZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgU09fUEFTU1BJREZEX1RIUkVBRCBhbmQgU09fUEVFUlBJREZEX1RIUkVBRCBzb2NrZXQgb3B0aW9ucyB0byBhbGxvdyBwYXNzaW5nIGFuZCBxdWVyeWluZyB0aHJlYWQtc3BlY2lmaWMgcGlkZmRzIG92ZXIgVU5JWCBkb21haW4gc29ja2V0cy4gSXQgdXBkYXRlcyBzdHJ1Y3Qgc29jaywgU0NNIGNyZWRlbnRpYWwgcGFzc2luZywgVU5JWCBzb2NrZXQgcmVhZC93cml0ZSBjcmVkZW50aWFsIG1hdGNoaW5nLCBwaWRmcyBwaWQgcmVnaXN0cmF0aW9uLCBhbmQgY29yZWR1bXAgbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMwOjI0LjQ4ODY3MDgxNVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTUxODYxNDQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgMzMyYjAzYTU5Nzg3NjcxMjk0ZTUxN2QwMzVmNTQ1ZGQ5OTIwNjNiMVxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjozMDoyMyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcXG5pbmRleCA5NDZhNWZhZDI2OTEyLi41ZDM1MjRjMjZiMmJjIDEwMDY0NFxcbi0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxcbisrKyBiL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxcbkBAIC0xNTcsNiArMTU3LDEwIEBAXFxuIFxcbiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DICAgICAgODVcXG4gXFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICA4NlxcbitcXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEICAgIDg3XFxuK1xcbiAjaWYgIWRlZmluZWQoX19LRVJORUxfXylcXG4gXFxuICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjRcXG5kaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxcbmluZGV4IGYxNjQxZGRlMTM1ZmMuLjI0NWE0M2Y1MmZiMWEgMTAwNjQ0XFxuLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcXG4rKysgYi9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxcbkBAIC0xNjgsNiArMTY4LDEwIEBAXFxuIFxcbiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DICAgICAgODVcXG4gXFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICA4NlxcbitcXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEICAgIDg3XFxuK1xcbiAjaWYgIWRlZmluZWQoX19LRVJORUxfXylcXG4gXFxuICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjRcXG5kaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaCBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcXG5pbmRleCBmM2EzODE1YzdkYzI5Li5mMjM3MTBlMWM2NzE0IDEwMDY0NFxcbi0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcXG4rKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXFxuQEAgLTE0OSw2ICsxNDksMTAgQEBcXG4gXFxuICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkNcXHQweDQwNTNcXG4gXFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRFxcdDB4NDA1NFxcbitcXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEXFx0MHg0MDU1XFxuK1xcbiAjaWYgIWRlZmluZWQoX19LRVJORUxfXylcXG4gXFxuICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjRcXG5kaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXFxuaW5kZXggNzkwN2YzYjFmMGVlMC4uYjM1YjI1YmRlZmMyYiAxMDA2NDRcXG4tLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcXG4rKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcXG5AQCAtMTUwLDYgKzE1MCwxMCBAQFxcbiBcXG4gI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQyAgICAgICAgMHgwMDVlXFxuIFxcbisjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgICAgICAweDAwNWZcXG4rXFxuKyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCAgICAgIDB4MDA2MFxcbitcXG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXFxuIFxcbiBcXG5kaWZmIC0tZ2l0IGEvZnMvY29yZWR1bXAuYyBiL2ZzL2NvcmVkdW1wLmNcXG5pbmRleCBhYzNjZDc0ODA4YzY0Li5iNWZmNGIzZTE4MzFlIDEwMDY0NFxcbi0tLSBhL2ZzL2NvcmVkdW1wLmNcXG4rKysgYi9mcy9jb3JlZHVtcC5jXFxuQEAgLTQ1NCw3ICs0NTQsNyBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9wYXJzZShzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG4gXFx0XFx0XFx0XFx0ICogbGVhZGVyIHdlIGtub3cgdGhhdCB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlclxcbiBcXHRcXHRcXHRcXHQgKiBjYW5ub3QgYmUgcmVhcGVkIHVudGlsIEBjdXJyZW50IGhhcyBleGl0ZWQuXFxuIFxcdFxcdFxcdFxcdCAqL1xcbi1cXHRcXHRcXHRcXHRjcHJtLVxcdTAwM2VwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XFxuK1xcdFxcdFxcdFxcdHRhc2tfcGlkcyhjcHJtLVxcdTAwM2VwaWQsIGN1cnJlbnQpO1xcbiBcXHRcXHRcXHRcXHRlcnIgPSBjbl9wcmludGYoY24sIFxcXCIlZFxcXCIsIENPUkVEVU1QX1BJREZEX05VTUJFUik7XFxuIFxcdFxcdFxcdFxcdGJyZWFrO1xcbiBcXHRcXHRcXHR9XFxuQEAgLTYyNiwxMyArNjI2LDE3IEBAIHN0YXRpYyBpbnQgdW1oX2NvcmVkdW1wX3NldHVwKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpXFxuIFxcdHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwID0gKHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKilpbmZvLVxcdTAwM2VkYXRhO1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4tXFx0aWYgKGNwLVxcdTAwM2VwaWQpIHtcXG4rXFx0aWYgKGNwLVxcdTAwM2VwaWRbUElEVFlQRV9UR0lEXSkge1xcbiBcXHRcXHRzdHJ1Y3QgZmlsZSAqcGlkZnNfZmlsZSBfX2ZyZWUoZnB1dCkgPSBOVUxMO1xcbiBcXG4tXFx0XFx0cGlkZnNfZmlsZSA9IHBpZGZzX2FsbG9jX2ZpbGUoY3AtXFx1MDAzZXBpZCwgMCk7XFxuK1xcdFxcdHBpZGZzX2ZpbGUgPSBwaWRmc19hbGxvY19maWxlKGNwLVxcdTAwM2VwaWRbUElEVFlQRV9UR0lEXSwgMCk7XFxuIFxcdFxcdGlmIChJU19FUlIocGlkZnNfZmlsZSkpXFxuIFxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHBpZGZzX2ZpbGUpO1xcbiBcXG4rXFx0XFx0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhjcC1cXHUwMDNlcGlkKTtcXG4rXFx0XFx0aWYgKGVycilcXG4rXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFxuIFxcdFxcdHBpZGZzX2NvcmVkdW1wKGNwKTtcXG4gXFxuIFxcdFxcdC8qXFxuQEAgLTY5NSwxMiArNjk5LDEyIEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqXFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIFNldCB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlciBwaWQgd2hpY2ggaXMgdXNlZCBmb3IgdGhlIHBlZXJcXG4tXFx0ICogY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy4gVGhlbiBpbW1lZGlhdGVseSByZWdpc3Rlclxcbi1cXHQgKiBpdCBpbiBwaWRmcy4uLlxcbitcXHQgKiBTZXQgdGhlIHBpZHMgb2YgdGhlIGR1bXBpbmcgdGhyZWFkIGFuZCBpdHMgdGhyZWFkLWdyb3VwIGxlYWRlclxcbitcXHQgKiB3aGljaCBhcmUgdXNlZCBmb3IgdGhlIHBlZXIgY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy5cXG4rXFx0ICogVGhlbiBpbW1lZGlhdGVseSByZWdpc3RlciB0aGVtIGluIHBpZGZzLi4uXFxuIFxcdCAqL1xcbi1cXHRjcHJtLVxcdTAwM2VwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XFxuLVxcdHJldHZhbCA9IHBpZGZzX3JlZ2lzdGVyX3BpZChjcHJtLVxcdTAwM2VwaWQpO1xcbitcXHR0YXNrX3BpZHMoY3BybS1cXHUwMDNlcGlkLCBjdXJyZW50KTtcXG4rXFx0cmV0dmFsID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhjcHJtLVxcdTAwM2VwaWQpO1xcbiBcXHRpZiAocmV0dmFsKVxcbiBcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIFxcbkBAIC03MjIsNyArNzI2LDcgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcXG4gXFx0fVxcbiBcXG4gXFx0LyogLi4uIGFuZCB2YWxpZGF0ZSB0aGF0IEBza19wZWVyX3BpZCBtYXRjaGVzIEBjcHJtLnBpZC4gKi9cXG4tXFx0aWYgKFdBUk5fT05fT05DRSh1bml4X3BlZXIoc29ja2V0LVxcdTAwM2VzayktXFx1MDAzZXNrX3BlZXJfcGlkICE9IGNwcm0tXFx1MDAzZXBpZCkpXFxuK1xcdGlmIChXQVJOX09OX09OQ0UoIXBpZHNfZXF1YWwodW5peF9wZWVyKHNvY2tldC1cXHUwMDNlc2spLVxcdTAwM2Vza19wZWVyX3BpZCwgY3BybS1cXHUwMDNlcGlkKSkpXFxuIFxcdFxcdHJldHVybiBmYWxzZTtcXG4gXFxuIFxcdGNwcm0tXFx1MDAzZWxpbWl0ID0gUkxJTV9JTkZJTklUWTtcXG5kaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmNcXG5pbmRleCBhNmE2NDNmMTVkMDhhLi4yOTI5OWIyYzdjYTcxIDEwMDY0NFxcbi0tLSBhL2ZzL3BpZGZzLmNcXG4rKysgYi9mcy9waWRmcy5jXFxuQEAgLTc5Myw5ICs3OTMsOSBAQCB2b2lkIHBpZGZzX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuIH1cXG4gXFxuICNpZmRlZiBDT05GSUdfQ09SRURVTVBcXG4tdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbitzdGF0aWMgdm9pZCBwaWRmc19jb3JlZHVtcF9waWQoc3RydWN0IHBpZCAqcGlkLFxcbitcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4ge1xcbi1cXHRzdHJ1Y3QgcGlkICpwaWQgPSBjcHJtLVxcdTAwM2VwaWQ7XFxuIFxcdHN0cnVjdCBwaWRmc19hdHRyICphdHRyO1xcbiBcXG4gXFx0YXR0ciA9IFJFQURfT05DRShwaWQtXFx1MDAzZWF0dHIpO1xcbkBAIC04MTQsNiArODE0LDEzIEBAIHZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4gXFx0c21wX3dtYigpO1xcbiBcXHRzZXRfYml0KFBJREZTX0FUVFJfQklUX0NPUkVEVU1QLCBcXHUwMDI2YXR0ci1cXHUwMDNlYXR0cl9tYXNrKTtcXG4gfVxcbitcXG4rdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbit7XFxuK1xcdC8qIFRoZSBkdW1waW5nIHRocmVhZCdzIHBpZGZkIHJlcG9ydHMgdGhlIGNvcmVkdW1wIGFzIHdlbGwuICovXFxuK1xcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXFx1MDAzYz0gcGlkc19sYXN0KGNwcm0tXFx1MDAzZXBpZCk7IHR5cGUrKylcXG4rXFx0XFx0cGlkZnNfY29yZWR1bXBfcGlkKGNwcm0tXFx1MDAzZXBpZFt0eXBlXSwgY3BybSk7XFxuK31cXG4gI2VuZGlmXFxuIFxcbiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpwaWRmc19tbnQgX19yb19hZnRlcl9pbml0O1xcbkBAIC0xMDcwLDYgKzEwNzcsMjIgQEAgaW50IHBpZGZzX3JlZ2lzdGVyX3BpZF9nZnAoc3RydWN0IHBpZCAqcGlkLCBnZnBfdCBnZnApXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbisvKiBSZWdpc3RlciB0aGUgcGlkcyB1cCB0byBwaWQgdHlwZSBAbGFzdCBvZiBAcGlkcyBpbiBwaWRmcy4gKi9cXG4raW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KVxcbit7XFxuK1xcdGlmIChXQVJOX09OX09OQ0UobGFzdCBcXHUwMDNlPSBQSURUWVBFX01BWCkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4rXFx0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcXHUwMDNjPSBsYXN0OyB0eXBlKyspIHtcXG4rXFx0XFx0aW50IHJldCA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWRzW3R5cGVdKTtcXG4rXFxuK1xcdFxcdGlmICh1bmxpa2VseShyZXQpKVxcbitcXHRcXHRcXHRyZXR1cm4gcmV0O1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4gc3RhdGljIHN0cnVjdCBkZW50cnkgKnBpZGZzX3N0YXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICoqc3Rhc2hlZCxcXG4gXFx0XFx0XFx0XFx0XFx0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSlcXG4ge1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmggYi9pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmhcXG5pbmRleCA3YjM4ZWUyZTc5MTNiLi4wYmJiN2RlNmE0MDIxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaFxcbkBAIC01LDYgKzUsNyBAQFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvdHlwZXMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21tLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9mcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkX3R5cGVzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC9zY2hlZC9jb3JlZHVtcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjYXNtL3NpZ2luZm8uaFxcdTAwM2VcXG4gXFxuQEAgLTMyLDcgKzMzLDggQEAgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyB7XFxuIFxcdGludCB2bWFfY291bnQ7XFxuIFxcdHNpemVfdCB2bWFfZGF0YV9zaXplO1xcbiBcXHRzdHJ1Y3QgY29yZV92bWFfbWV0YWRhdGEgKnZtYV9tZXRhO1xcbi1cXHRzdHJ1Y3QgcGlkICpwaWQ7XFxuK1xcdC8qIER1bXBpbmcgdGhyZWFkIGFuZCBpdHMgdGhyZWFkLWdyb3VwIGxlYWRlciBieSBwaWQgdHlwZS4gKi9cXG4rXFx0REVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTtcXG4gfTtcXG4gXFxuIGV4dGVybiB1bnNpZ25lZCBpbnQgY29yZV9maWxlX25vdGVfc2l6ZV9saW1pdDtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWQuaCBiL2luY2x1ZGUvbGludXgvcGlkLmhcXG5pbmRleCBkZGFlZjBiYmM4YmEzLi44NzYzNWQwY2MxZjcxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvcGlkLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BpZC5oXFxuQEAgLTIsNiArMiw5IEBAXFxuICNpZm5kZWYgX0xJTlVYX1BJRF9IXFxuICNkZWZpbmUgX0xJTlVYX1BJRF9IXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYXJyYXlfc2l6ZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9taW5tYXguaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L3BpZF90eXBlcy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcmN1bGlzdC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvcmN1cGRhdGUuaFxcdTAwM2VcXG5AQCAtOTIsNiArOTUsNTYgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkICpnZXRfcGlkKHN0cnVjdCBwaWQgKnBpZClcXG4gfVxcbiBcXG4gZXh0ZXJuIHZvaWQgcHV0X3BpZChzdHJ1Y3QgcGlkICpwaWQpO1xcbitcXG4rLypcXG4rICogSGVscGVycyBmb3IgYXJyYXlzIG9mIHN0cnVjdCBwaWQgaW5kZXhlZCBieSBwaWQgdHlwZSBkZWNsYXJlZCB3aXRoXFxuKyAqIERFQ0xBUkVfUElEUygpLiBUaGUgYXJyYXkgY292ZXJzIFBJRFRZUEVfUElEIHVwIHRvIHRoZSBwaWQgdHlwZSBpdFxcbisgKiB3YXMgZGVjbGFyZWQgd2l0aCBhbmQgdGhlIGhlbHBlcnMgdGFrZSB0aGF0IGJvdW5kIGZyb20gdGhlIGFycmF5LlxcbisgKi9cXG4rc3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3BpZHMoc3RydWN0IHBpZCAqKmRzdCwgc3RydWN0IHBpZCAqY29uc3QgKnNyYyxcXG4rXFx0XFx0XFx0ICAgICAgZW51bSBwaWRfdHlwZSBsYXN0KVxcbit7XFxuK1xcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXFx1MDAzYz0gbGFzdDsgdHlwZSsrKVxcbitcXHRcXHRkc3RbdHlwZV0gPSBnZXRfcGlkKHNyY1t0eXBlXSk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B1dF9waWRzKHN0cnVjdCBwaWQgKipwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QpXFxuK3tcXG4rXFx0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcXHUwMDNjPSBsYXN0OyB0eXBlKyspIHtcXG4rXFx0XFx0cHV0X3BpZChwaWRzW3R5cGVdKTtcXG4rXFx0XFx0cGlkc1t0eXBlXSA9IE5VTEw7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9waWRzKHN0cnVjdCBwaWQgKiphLCBzdHJ1Y3QgcGlkICoqYixcXG4rXFx0XFx0XFx0ICAgICAgIGVudW0gcGlkX3R5cGUgbGFzdClcXG4re1xcbitcXHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFxcdTAwM2M9IGxhc3Q7IHR5cGUrKylcXG4rXFx0XFx0c3dhcChhW3R5cGVdLCBiW3R5cGVdKTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIF9fcGlkc19lcXVhbChzdHJ1Y3QgcGlkICpjb25zdCAqYSwgc3RydWN0IHBpZCAqY29uc3QgKmIsXFxuK1xcdFxcdFxcdFxcdGVudW0gcGlkX3R5cGUgbGFzdClcXG4re1xcbitcXHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFxcdTAwM2M9IGxhc3Q7IHR5cGUrKylcXG4rXFx0XFx0aWYgKGFbdHlwZV0gIT0gYlt0eXBlXSlcXG4rXFx0XFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rLyogVGhlIGxhc3QgcGlkIHR5cGUgYW4gYXJyYXkgZGVjbGFyZWQgd2l0aCBERUNMQVJFX1BJRFMoKSBjb3ZlcnMuICovXFxuKyNkZWZpbmUgcGlkc19sYXN0KHBpZHMpXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQoKGVudW0gcGlkX3R5cGUpKEFSUkFZX1NJWkUocGlkcykgLSAxICtcXHRcXHRcXHRcXHRcXFxcXFxuK1xcdFxcdFxcdCBCVUlMRF9CVUdfT05fWkVSTyhBUlJBWV9TSVpFKHBpZHMpIFxcdTAwM2UgUElEVFlQRV9NQVgpKSlcXG4rXFxuKyNkZWZpbmUgX19waWRzX2xhc3QyKGEsIGIpXFx0XFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHQocGlkc19sYXN0KGEpICsgQlVJTERfQlVHX09OX1pFUk8oQVJSQVlfU0laRShhKSAhPSBBUlJBWV9TSVpFKGIpKSlcXG4rXFxuKyNkZWZpbmUgZ2V0X3BpZHMoZHN0LCBzcmMpXFx0X19nZXRfcGlkcyhkc3QsIHNyYywgX19waWRzX2xhc3QyKGRzdCwgc3JjKSlcXG4rI2RlZmluZSBwdXRfcGlkcyhwaWRzKVxcdFxcdF9fcHV0X3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpKVxcbisjZGVmaW5lIHN3YXBfcGlkcyhhLCBiKVxcdFxcdF9fc3dhcF9waWRzKGEsIGIsIF9fcGlkc19sYXN0MihhLCBiKSlcXG4rI2RlZmluZSBwaWRzX2VxdWFsKGEsIGIpXFx0X19waWRzX2VxdWFsKGEsIGIsIF9fcGlkc19sYXN0MihhLCBiKSlcXG4rXFxuIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBpZF90YXNrKHN0cnVjdCBwaWQgKnBpZCwgZW51bSBwaWRfdHlwZSk7XFxuIHN0YXRpYyBpbmxpbmUgYm9vbCBwaWRfaGFzX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpXFxuIHtcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmhcXG5pbmRleCBjMmFlZTFkOTFkY2ZkLi4zMzAyNjkwYTJhMjgxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmhcXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oXFxuQEAgLTIsNiArMiw4IEBAXFxuICNpZm5kZWYgX0xJTlVYX1BJRF9UWVBFU19IXFxuICNkZWZpbmUgX0xJTlVYX1BJRF9UWVBFU19IXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcXHUwMDNlXFxuK1xcbiBlbnVtIHBpZF90eXBlIHtcXG4gXFx0UElEVFlQRV9QSUQsXFxuIFxcdFBJRFRZUEVfVEdJRCxcXG5AQCAtMTAsNiArMTIsMTIgQEAgZW51bSBwaWRfdHlwZSB7XFxuIFxcdFBJRFRZUEVfTUFYLFxcbiB9O1xcbiBcXG4rc3RydWN0IHBpZDtcXG4rXFxuKy8qIEFuIGFycmF5IG9mIHN0cnVjdCBwaWQgaW5kZXhlZCBieSBwaWQgdHlwZSwgUElEVFlQRV9QSUQgdXAgdG8gQGxhc3QuICovXFxuKyNkZWZpbmUgREVDTEFSRV9QSURTKG5hbWUsIGxhc3QpXFx0XFx0XFx0XFx0XFx0XFxcXFxcbitcXHRzdHJ1Y3QgcGlkICpuYW1lWyhsYXN0KSArIDEgKyBCVUlMRF9CVUdfT05fWkVSTygobGFzdCkgXFx1MDAzZT0gUElEVFlQRV9NQVgpXVxcbitcXG4gc3RydWN0IHBpZF9uYW1lc3BhY2U7XFxuIGV4dGVybiBzdHJ1Y3QgcGlkX25hbWVzcGFjZSBpbml0X3BpZF9ucztcXG4gXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkZnMuaCBiL2luY2x1ZGUvbGludXgvcGlkZnMuaFxcbmluZGV4IDBhYmY3ZGE5YWIyMzYuLjNjMWU4MmYxYTM2OTEgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9waWRmcy5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9waWRmcy5oXFxuQEAgLTMsNiArMyw3IEBAXFxuICNkZWZpbmUgX0xJTlVYX1BJRF9GU19IXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvZ2ZwX3R5cGVzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9waWQuaFxcdTAwM2VcXG4gXFxuIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXM7XFxuIFxcbkBAIC0zMiw1ICszMyw5IEBAIHN0YXRpYyBpbmxpbmUgaW50IHBpZGZzX3JlZ2lzdGVyX3BpZChzdHJ1Y3QgcGlkICpwaWQpXFxuIH1cXG4gXFxuIHZvaWQgcGlkZnNfZnJlZV9waWQoc3RydWN0IHBpZCAqcGlkKTtcXG4raW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KTtcXG4rXFxuKy8qIFJlZ2lzdGVyIHRoZSBwaWRzIG9mIGFuIGFycmF5IGRlY2xhcmVkIHdpdGggREVDTEFSRV9QSURTKCkuICovXFxuKyNkZWZpbmUgcGlkZnNfcmVnaXN0ZXJfcGlkcyhwaWRzKVxcdF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcykpXFxuIFxcbiAjZW5kaWYgLyogX0xJTlVYX1BJRF9GU19IICovXFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXFxuaW5kZXggNTg0YWU4OGI0MzVlOS4uOTQ0NGI0Nzc4OWEwOCAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxcbkBAIC02NzcsNiArNjc3LDI0IEBAIHN0cnVjdCBwaWQgKnRhc2tfcGlkX3R5cGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBlbnVtIHBpZF90eXBlIHR5cGUpXFxuIFxcdHJldHVybiBwaWQ7XFxuIH1cXG4gXFxuKy8qIEZpbGwgQHBpZHMgd2l0aCB0aGUgcGlkIHR5cGVzIG9mIEB0YXNrIHVwIHRvIEBsYXN0LCB3aXRob3V0IHJlZmVyZW5jZXMuICovXFxuK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3Rhc2tfcGlkcyhzdHJ1Y3QgcGlkICoqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0LFxcbitcXHRcXHRcXHQgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxcbit7XFxuK1xcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXFx1MDAzYz0gbGFzdDsgdHlwZSsrKVxcbitcXHRcXHRwaWRzW3R5cGVdID0gdGFza19waWRfdHlwZSh0YXNrLCB0eXBlKTtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3Rhc2tfcGlkcyhzdHJ1Y3QgcGlkICoqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0LFxcbitcXHRcXHRcXHRcXHQgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXFxuK3tcXG4rXFx0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcXHUwMDNjPSBsYXN0OyB0eXBlKyspXFxuK1xcdFxcdHBpZHNbdHlwZV0gPSBnZXRfcGlkKHRhc2tfcGlkX3R5cGUodGFzaywgdHlwZSkpO1xcbit9XFxuK1xcbisjZGVmaW5lIHRhc2tfcGlkcyhwaWRzLCB0YXNrKVxcdFxcdF9fdGFza19waWRzKHBpZHMsIHBpZHNfbGFzdChwaWRzKSwgdGFzaylcXG4rI2RlZmluZSBnZXRfdGFza19waWRzKHBpZHMsIHRhc2spXFx0X19nZXRfdGFza19waWRzKHBpZHMsIHBpZHNfbGFzdChwaWRzKSwgdGFzaylcXG4rXFxuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBpZCAqdGFza190Z2lkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcXG4ge1xcbiBcXHRyZXR1cm4gdGFzay1cXHUwMDNlc2lnbmFsLVxcdTAwM2VwaWRzW1BJRFRZUEVfVEdJRF07XFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjbS5oIGIvaW5jbHVkZS9uZXQvc2NtLmhcXG5pbmRleCA4NmFlNmJjMTA5ZWM2Li5hYTdkMTVjNWZjMjcxIDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvbmV0L3NjbS5oXFxuKysrIGIvaW5jbHVkZS9uZXQvc2NtLmhcXG5AQCAtNDIsNyArNDIsNyBAQCBzdHJ1Y3Qgc2NtX2ZwX2xpc3Qge1xcbiB9O1xcbiBcXG4gc3RydWN0IHNjbV9jb29raWUge1xcbi1cXHRzdHJ1Y3QgcGlkXFx0XFx0KnBpZDtcXHRcXHQvKiBTa2IgY3JlZGVudGlhbHMgKi9cXG4rXFx0REVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTtcXHQvKiBTa2IgY3JlZGVudGlhbHMgYnkgcGlkIHR5cGUgKi9cXG4gXFx0c3RydWN0IHNjbV9mcF9saXN0XFx0KmZwO1xcdFxcdC8qIFBhc3NlZCBmaWxlc1xcdFxcdCovXFxuIFxcdHN0cnVjdCBzY21fY3JlZHNcXHRjcmVkcztcXHRcXHQvKiBTa2IgY3JlZGVudGlhbHNcXHQqL1xcbiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktcXG5AQCAtNjksNyArNjksNyBAQCBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNjbV9jb1xcbiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9zZXRfY3JlZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLFxcbiBcXHRcXHRcXHRcXHQgICAgc3RydWN0IHBpZCAqcGlkLCBrdWlkX3QgdWlkLCBrZ2lkX3QgZ2lkKVxcbiB7XFxuLVxcdHNjbS1cXHUwMDNlcGlkID0gZ2V0X3BpZChwaWQpO1xcbitcXHRzY20tXFx1MDAzZXBpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwaWQpO1xcbiBcXHRzY20tXFx1MDAzZWNyZWRzLnBpZCA9IHBpZF92bnIocGlkKTtcXG4gXFx0c2NtLVxcdTAwM2VjcmVkcy51aWQgPSB1aWQ7XFxuIFxcdHNjbS1cXHUwMDNlY3JlZHMuZ2lkID0gZ2lkO1xcbkBAIC03Nyw4ICs3Nyw3IEBAIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX3NldF9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20sXFxuIFxcbiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9kZXN0cm95X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG4ge1xcbi1cXHRwdXRfcGlkKHNjbS1cXHUwMDNlcGlkKTtcXG4tXFx0c2NtLVxcdTAwM2VwaWQgPSBOVUxMO1xcbitcXHRwdXRfcGlkcyhzY20tXFx1MDAzZXBpZCk7XFxuIH1cXG4gXFxuIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oXFxuaW5kZXggNTExODUyMjJhYWMyOS4uNjdiNzQzYmFiMjIwZSAxMDA2NDRcXG4tLS0gYS9pbmNsdWRlL25ldC9zb2NrLmhcXG4rKysgYi9pbmNsdWRlL25ldC9zb2NrLmhcXG5AQCAtMzAxLDcgKzMwMSw3IEBAIHN0cnVjdCBza19maWx0ZXI7XFxuICAgKlxcdEBza190eXBlOiBzb2NrZXQgdHlwZSAoJVNPQ0tfU1RSRUFNLCBldGMpXFxuICAgKlxcdEBza19wcm90b2NvbDogd2hpY2ggcHJvdG9jb2wgdGhpcyBzb2NrZXQgYmVsb25ncyBpbiB0aGlzIG5ldHdvcmsgZmFtaWx5XFxuICAgKlxcdEBza19wZWVyX2xvY2s6IGxvY2sgcHJvdGVjdGluZyBAc2tfcGVlcl9waWQgYW5kIEBza19wZWVyX2NyZWRcXG4tICAqXFx0QHNrX3BlZXJfcGlkOiBcXHUwMDI2c3RydWN0IHBpZCBmb3IgdGhpcyBzb2NrZXQncyBwZWVyXFxuKyAgKlxcdEBza19wZWVyX3BpZDogXFx1MDAyNnN0cnVjdCBwaWQgZm9yIHRoaXMgc29ja2V0J3MgcGVlciwgYnkgcGlkIHR5cGVcXG4gICAqXFx0QHNrX3BlZXJfY3JlZDogJVNPX1BFRVJDUkVEIHNldHRpbmdcXG4gICAqXFx0QHNrX3Jjdmxvd2F0OiAlU09fUkNWTE9XQVQgc2V0dGluZ1xcbiAgICpcXHRAc2tfcmN2dGltZW86ICVTT19SQ1ZUSU1FTyBzZXR0aW5nXFxuQEAgLTM1Niw2ICszNTYsNyBAQCBzdHJ1Y3Qgc2tfZmlsdGVyO1xcbiAgICpcXHRAc2tfc2NtX3NlY3VyaXR5OiBmbGFnZ2VkIGJ5IFNPX1BBU1NTRUMgdG8gcmVjdiBTQ01fU0VDVVJJVFlcXG4gICAqXFx0QHNrX3NjbV9waWRmZDogZmxhZ2dlZCBieSBTT19QQVNTUElERkQgdG8gcmVjdiBTQ01fUElERkRcXG4gICAqXFx0QHNrX3NjbV9yaWdodHM6IGZsYWdnZWQgYnkgU09fUEFTU1JJR0hUUyB0byByZWN2IFNDTV9SSUdIVFNcXG4rICAqXFx0QHNrX3NjbV9waWRmZF90aHJlYWQ6IGZsYWdnZWQgYnkgU09fUEFTU1BJREZEX1RIUkVBRCB0byByZWN2IGEgdGhyZWFkIFNDTV9QSURGRFxcbiAgICpcXHRAc2tfc2NtX3VudXNlZDogdW51c2VkIGZsYWdzIGZvciBzY21fcmVjdigpXFxuICAgKlxcdEBuc190cmFja2VyOiB0cmFja2VyIGZvciBuZXRucyByZWZlcmVuY2VcXG4gICAqXFx0QHNrX3VzZXJfZnJhZ3M6IHhhcnJheSBvZiBwYWdlcyB0aGUgdXNlciBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIG9uLlxcbkBAIC01NDUsNyArNTQ2LDcgQEAgc3RydWN0IHNvY2sge1xcbiBcXHR1NjRcXHRcXHRcXHRza19pbm87XFxuIFxcdHNwaW5sb2NrX3RcXHRcXHRza19wZWVyX2xvY2s7XFxuIFxcdGludFxcdFxcdFxcdHNrX2JpbmRfcGhjO1xcbi1cXHRzdHJ1Y3QgcGlkXFx0XFx0KnNrX3BlZXJfcGlkO1xcbitcXHRERUNMQVJFX1BJRFMoc2tfcGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7XFxuIFxcdGNvbnN0IHN0cnVjdCBjcmVkXFx0KnNrX3BlZXJfY3JlZDtcXG4gXFxuIFxcdGt0aW1lX3RcXHRcXHRcXHRza19zdGFtcDtcXG5AQCAtNTYyLDcgKzU2Myw4IEBAIHN0cnVjdCBzb2NrIHtcXG4gXFx0XFx0XFx0XFx0c2tfc2NtX3NlY3VyaXR5IDogMSxcXG4gXFx0XFx0XFx0XFx0c2tfc2NtX3BpZGZkIDogMSxcXG4gXFx0XFx0XFx0XFx0c2tfc2NtX3JpZ2h0cyA6IDEsXFxuLVxcdFxcdFxcdFxcdHNrX3NjbV91bnVzZWQgOiA0O1xcbitcXHRcXHRcXHRcXHRza19zY21fcGlkZmRfdGhyZWFkIDogMSxcXG4rXFx0XFx0XFx0XFx0c2tfc2NtX3VudXNlZCA6IDM7XFxuIFxcdFxcdH07XFxuIFxcdH07XFxuIFxcdHU4XFx0XFx0XFx0c2tfY2xvY2tpZDtcXG5AQCAtMjk4Niw2ICsyOTg4LDEyIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBza19pc19zdHJlYW1fdW5peChjb25zdCBzdHJ1Y3Qgc29jayAqc2spXFxuIFxcdHJldHVybiBza19pc191bml4KHNrKSBcXHUwMDI2XFx1MDAyNiBzay1cXHUwMDNlc2tfdHlwZSA9PSBTT0NLX1NUUkVBTTtcXG4gfVxcbiBcXG4rLyogU09fUEFTU1BJREZEIG9yIFNPX1BBU1NQSURGRF9USFJFQUQgYXNrZWQgZm9yIGFuIFNDTV9QSURGRC4gKi9cXG4rc3RhdGljIGlubGluZSBib29sIHNrX3NjbV9waWRmZF93YW50ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxcbit7XFxuK1xcdHJldHVybiBzay1cXHUwMDNlc2tfc2NtX3BpZGZkIHx8IHNrLVxcdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkO1xcbit9XFxuK1xcbiBzdGF0aWMgaW5saW5lIGJvb2wgc2tfaXNfdnNvY2soY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxcbiB7XFxuIFxcdHJldHVybiBzay1cXHUwMDNlc2tfZmFtaWx5ID09IEFGX1ZTT0NLO1xcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmggYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmhcXG5pbmRleCA4NGVhN2I5MjkzNmUyLi41NmZlZDdhYjI3YWI4IDEwMDY0NFxcbi0tLSBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaFxcbisrKyBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaFxcbkBAIC0xNTIsNiArMTUyLDEwIEBAXFxuIFxcbiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DXFx0ODVcXG4gXFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRFxcdDg2XFxuK1xcbisjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQURcXHQ4N1xcbitcXG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXFxuIFxcbiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0IHx8IChkZWZpbmVkKF9feDg2XzY0X18pIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoX19JTFAzMl9fKSlcXG5kaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmNcXG5pbmRleCA0MTFkNjZmMjQzOTNkLi43NzU4ZTllYTM4NDhjIDEwMDY0NFxcbi0tLSBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmNcXG4rKysgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jXFxuQEAgLTE2MSw3ICsxNjEsNyBAQCBzdHJ1Y3Qgc29jayAqYnRfc29ja19hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssXFxuIFxcdC8qIEluaXQgcGVlciBpbmZvcm1hdGlvbiBzbyBpdCBjYW4gYmUgcHJvcGVybHkgbW9uaXRvcmVkICovXFxuIFxcdGlmICgha2Vybikge1xcbiBcXHRcXHRzcGluX2xvY2soXFx1MDAyNnNrLVxcdTAwM2Vza19wZWVyX2xvY2spO1xcbi1cXHRcXHRzay1cXHUwMDNlc2tfcGVlcl9waWQgID0gZ2V0X3BpZCh0YXNrX3RnaWQoY3VycmVudCkpO1xcbitcXHRcXHRzay1cXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSAgPSBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSk7XFxuIFxcdFxcdHNrLVxcdTAwM2Vza19wZWVyX2NyZWQgPSBnZXRfY3VycmVudF9jcmVkKCk7XFxuIFxcdFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzay1cXHUwMDNlc2tfcGVlcl9sb2NrKTtcXG4gXFx0fVxcbkBAIC0yMzUsOSArMjM1LDkgQEAgdm9pZCBidF9hY2NlcHRfZW5xdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgYmgpXFxuIFxcdCAqIHNvY2tldCBpcyBhbGxvY2F0ZWQgYnkgdGhlIGtlcm5lbC5cXG4gXFx0ICovXFxuIFxcdHNwaW5fbG9jayhcXHUwMDI2c2stXFx1MDAzZXNrX3BlZXJfbG9jayk7XFxuLVxcdG9sZF9waWQgPSBzay1cXHUwMDNlc2tfcGVlcl9waWQ7XFxuK1xcdG9sZF9waWQgPSBzay1cXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXTtcXG4gXFx0b2xkX2NyZWQgPSBzay1cXHUwMDNlc2tfcGVlcl9jcmVkO1xcbi1cXHRzay1cXHUwMDNlc2tfcGVlcl9waWQgPSBnZXRfcGlkKHBhcmVudC1cXHUwMDNlc2tfcGVlcl9waWQpO1xcbitcXHRzay1cXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSA9IGdldF9waWQocGFyZW50LVxcdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKTtcXG4gXFx0c2stXFx1MDAzZXNrX3BlZXJfY3JlZCA9IGdldF9jcmVkKHBhcmVudC1cXHUwMDNlc2tfcGVlcl9jcmVkKTtcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNrLVxcdTAwM2Vza19wZWVyX2xvY2spO1xcbiBcXG5kaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jXFxuaW5kZXggMDcwY2EzODhmOWFjZS4uOTFlNDczOGVhYmRiMCAxMDA2NDRcXG4tLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNcXG4rKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNcXG5AQCAtMjczLDIxICsyNzMsMjEgQEAgc3RhdGljIHZvaWQgaGNpX3NvY2tfY29weV9jcmVkcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXFxuIFxcdGNyZWRzID0gXFx1MDAyNmJ0X2NiKHNrYiktXFx1MDAzZWNyZWRzO1xcbiBcXG4gXFx0LyogQ2hlY2sgaWYgcGVlciBjcmVkZW50aWFscyBpcyBzZXQgKi9cXG4tXFx0aWYgKCFzay1cXHUwMDNlc2tfcGVlcl9waWQpIHtcXG4rXFx0aWYgKCFzay1cXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkge1xcbiBcXHRcXHQvKiBDaGVjayBpZiBwYXJlbnQgcGVlciBjcmVkZW50aWFscyBpcyBzZXQgKi9cXG4tXFx0XFx0aWYgKGJ0X3NrKHNrKS1cXHUwMDNlcGFyZW50IFxcdTAwMjZcXHUwMDI2IGJ0X3NrKHNrKS1cXHUwMDNlcGFyZW50LVxcdTAwM2Vza19wZWVyX3BpZClcXG4rXFx0XFx0aWYgKGJ0X3NrKHNrKS1cXHUwMDNlcGFyZW50IFxcdTAwMjZcXHUwMDI2IGJ0X3NrKHNrKS1cXHUwMDNlcGFyZW50LVxcdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKVxcbiBcXHRcXHRcXHRzayA9IGJ0X3NrKHNrKS1cXHUwMDNlcGFyZW50O1xcbiBcXHRcXHRlbHNlXFxuIFxcdFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbiBcXG4gXFx0LyogQ2hlY2sgaWYgc2NtX2NyZWRzIGFscmVhZHkgc2V0ICovXFxuLVxcdGlmIChjcmVkcy1cXHUwMDNlcGlkID09IHBpZF92bnIoc2stXFx1MDAzZXNrX3BlZXJfcGlkKSlcXG4rXFx0aWYgKGNyZWRzLVxcdTAwM2VwaWQgPT0gcGlkX3Zucihzay1cXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkpXFxuIFxcdFxcdHJldHVybjtcXG4gXFxuIFxcdG1lbXNldChjcmVkcywgMCwgc2l6ZW9mKCpjcmVkcykpO1xcbiBcXG4tXFx0Y3JlZHMtXFx1MDAzZXBpZCA9IHBpZF92bnIoc2stXFx1MDAzZXNrX3BlZXJfcGlkKTtcXG4rXFx0Y3JlZHMtXFx1MDAzZXBpZCA9IHBpZF92bnIoc2stXFx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pO1xcbiBcXHRpZiAoc2stXFx1MDAzZXNrX3BlZXJfY3JlZCkge1xcbiBcXHRcXHRjcmVkcy1cXHUwMDNldWlkID0gc2stXFx1MDAzZXNrX3BlZXJfY3JlZC1cXHUwMDNldWlkO1xcbiBcXHRcXHRjcmVkcy1cXHUwMDNlZ2lkID0gc2stXFx1MDAzZXNrX3BlZXJfY3JlZC1cXHUwMDNlZ2lkO1xcbmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jXFxuaW5kZXggMTE5NGMzN2U0NjZmMS4uODcyZDhmYjMxYjZmYiAxMDA2NDRcXG4tLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suY1xcbisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jXFxuQEAgLTE4OTAsNyArMTg5MCw3IEBAIHN0YXRpYyBzdHJ1Y3QgcGlkICpsMmNhcF9zb2NrX2dldF9wZWVyX3BpZF9jYihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbilcXG4ge1xcbiBcXHRzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLVxcdTAwM2VkYXRhO1xcbiBcXG4tXFx0cmV0dXJuIHNrLVxcdTAwM2Vza19wZWVyX3BpZDtcXG4rXFx0cmV0dXJuIHNrLVxcdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdO1xcbiB9XFxuIFxcbiBzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX3N1c3BlbmRfY2Ioc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pXFxuZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NjbS5jIGIvbmV0L2NvcmUvc2NtLmNcXG5pbmRleCBmMGQ0NGVjZGIxMWZjLi5kNjk3Njg0MTRhZjQ4IDEwMDY0NFxcbi0tLSBhL25ldC9jb3JlL3NjbS5jXFxuKysrIGIvbmV0L2NvcmUvc2NtLmNcXG5AQCAtMTQ5LDYgKzE0OSw3IEBAIEVYUE9SVF9TWU1CT0woX19zY21fZGVzdHJveSk7XFxuIFxcbiBzdGF0aWMgaW5saW5lIGludCBzY21fcmVwbGFjZV9waWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHBpZCAqcGlkKVxcbiB7XFxuK1xcdHN0cnVjdCBwaWQgKnRocmVhZF9waWQ7XFxuIFxcdGludCBlcnI7XFxuIFxcbiBcXHQvKiBkcm9wIGFsbCBwcmV2aW91cyByZWZlcmVuY2VzICovXFxuQEAgLTE1OCw3ICsxNTksMTggQEAgc3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZClcXG4gXFx0aWYgKHVubGlrZWx5KGVycikpXFxuIFxcdFxcdHJldHVybiBlcnI7XFxuIFxcbi1cXHRzY20tXFx1MDAzZXBpZCA9IHBpZDtcXG4rXFx0LyogQSBzZW5kZXIgbmFtaW5nIGl0cyBvd24gdGhyZWFkLWdyb3VwIHNlbmRzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLiAqL1xcbitcXHRpZiAocGlkID09IHRhc2tfdGdpZChjdXJyZW50KSlcXG4rXFx0XFx0dGhyZWFkX3BpZCA9IHRhc2tfcGlkKGN1cnJlbnQpO1xcbitcXHRlbHNlXFxuK1xcdFxcdHRocmVhZF9waWQgPSBwaWQ7XFxuK1xcbitcXHRlcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQodGhyZWFkX3BpZCk7XFxuK1xcdGlmICh1bmxpa2VseShlcnIpKVxcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0c2NtLVxcdTAwM2VwaWRbUElEVFlQRV9UR0lEXSA9IHBpZDtcXG4rXFx0c2NtLVxcdTAwM2VwaWRbUElEVFlQRV9QSURdID0gZ2V0X3BpZCh0aHJlYWRfcGlkKTtcXG4gXFx0c2NtLVxcdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHBpZCk7XFxuIFxcdHJldHVybiAwO1xcbiB9XFxuQEAgLTIwNyw3ICsyMTksOCBAQCBpbnQgX19zY21fc2VuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpwKVxcbiBcXHRcXHRcXHRpZiAoZXJyKVxcbiBcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbiBcXG4tXFx0XFx0XFx0aWYgKCFwLVxcdTAwM2VwaWQgfHwgcGlkX3ZucihwLVxcdTAwM2VwaWQpICE9IGNyZWRzLnBpZCkge1xcbitcXHRcXHRcXHRpZiAoIXAtXFx1MDAzZXBpZFtQSURUWVBFX1RHSURdIHx8XFxuK1xcdFxcdFxcdCAgICBwaWRfdm5yKHAtXFx1MDAzZXBpZFtQSURUWVBFX1RHSURdKSAhPSBjcmVkcy5waWQpIHtcXG4gXFx0XFx0XFx0XFx0c3RydWN0IHBpZCAqcGlkO1xcbiBcXHRcXHRcXHRcXHRlcnIgPSAtRVNSQ0g7XFxuIFxcdFxcdFxcdFxcdHBpZCA9IGZpbmRfZ2V0X3BpZChjcmVkcy5waWQpO1xcbkBAIC00ODYsOSArNDk5LDEzIEBAIHN0YXRpYyBib29sIHNjbV9oYXNfc2VjZGF0YShzdHJ1Y3Qgc29jayAqc2spXFxuIH1cXG4gI2VuZGlmXFxuIFxcbi1zdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pXFxuK3N0YXRpYyB2b2lkIHNjbV9waWRmZF9yZWN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbitcXHRcXHRcXHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxcbiB7XFxuK1xcdGVudW0gcGlkX3R5cGUgdHlwZSA9IHNrLVxcdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkID8gUElEVFlQRV9QSUQgOiBQSURUWVBFX1RHSUQ7XFxuK1xcdHN0cnVjdCBwaWQgKnBpZCA9IHNjbS1cXHUwMDNlcGlkW3R5cGVdO1xcbiBcXHRzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IFBJREZEX1NUQUxFO1xcbiBcXHRpbnQgbGVuLCBwaWRmZDtcXG4gXFxuIFxcdC8qIHB1dF9jbXNnKCkgZG9lc24ndCByZXR1cm4gYW4gZXJyb3IgaWYgQ01TRyBpcyB0cnVuY2F0ZWQsXFxuQEAgLTUwNCwxMCArNTIxLDEzIEBAIHN0YXRpYyB2b2lkIHNjbV9waWRmZF9yZWN2KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoIXNjbS1cXHUwMDNlcGlkKVxcbitcXHRpZiAoIXBpZClcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXG4tXFx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHNjbS1cXHUwMDNlcGlkLCBQSURGRF9TVEFMRSwgXFx1MDAyNnBpZGZkX2ZpbGUpO1xcbitcXHRpZiAodHlwZSA9PSBQSURUWVBFX1BJRClcXG4rXFx0XFx0ZmxhZ3MgfD0gUElERkRfVEhSRUFEO1xcbitcXG4rXFx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBpZCwgZmxhZ3MsIFxcdTAwMjZwaWRmZF9maWxlKTtcXG4gXFxuIFxcdGlmIChwdXRfY21zZyhtc2csIFNPTF9TT0NLRVQsIFNDTV9QSURGRCwgc2l6ZW9mKGludCksIFxcdTAwMjZwaWRmZCkpIHtcXG4gXFx0XFx0aWYgKHBpZGZkX2ZpbGUpIHtcXG5AQCAtNTI2LDcgKzU0Niw3IEBAIHN0YXRpYyBib29sIF9fc2NtX3JlY3ZfY29tbW9uKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbiBcXHRcXHRcXHQgICAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpXFxuIHtcXG4gXFx0aWYgKCFtc2ctXFx1MDAzZW1zZ19jb250cm9sKSB7XFxuLVxcdFxcdGlmIChzay1cXHUwMDNlc2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrLVxcdTAwM2Vza19zY21fcGlkZmQgfHxcXG4rXFx0XFx0aWYgKHNrLVxcdTAwM2Vza19zY21fY3JlZGVudGlhbHMgfHwgc2tfc2NtX3BpZGZkX3dhbnRlZChzaykgfHxcXG4gXFx0XFx0ICAgIHNjbS1cXHUwMDNlZnAgfHwgc2NtX2hhc19zZWNkYXRhKHNrKSlcXG4gXFx0XFx0XFx0bXNnLVxcdTAwM2Vtc2dfZmxhZ3MgfD0gTVNHX0NUUlVOQztcXG4gXFxuQEAgLTU3Myw4ICs1OTMsOCBAQCB2b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbiBcXHRcXHRzY21fZGV0YWNoX2Zkcyhtc2csIHNjbSwgUkVBRF9PTkNFKHUtXFx1MDAzZXNjbV9yaWdodHNfbm90cnVuYykpO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAoc29jay1cXHUwMDNlc2stXFx1MDAzZXNrX3NjbV9waWRmZClcXG4tXFx0XFx0c2NtX3BpZGZkX3JlY3YobXNnLCBzY20pO1xcbitcXHRpZiAoc2tfc2NtX3BpZGZkX3dhbnRlZChzb2NrLVxcdTAwM2VzaykpXFxuK1xcdFxcdHNjbV9waWRmZF9yZWN2KHNvY2stXFx1MDAzZXNrLCBtc2csIHNjbSk7XFxuIFxcbiBcXHRzY21fZGVzdHJveV9jcmVkKHNjbSk7XFxuIH1cXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jXFxuaW5kZXggMWFkNDE5MDRkYjI1Yi4uY2IyZmZkMzI5YmM2NyAxMDA2NDRcXG4tLS0gYS9uZXQvY29yZS9zb2NrLmNcXG4rKysgYi9uZXQvY29yZS9zb2NrLmNcXG5AQCAtMTU3MSwxMCArMTU3MSwyNSBAQCBpbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxuIFxcdFxcdGJyZWFrO1xcbiBcXG4gXFx0Y2FzZSBTT19QQVNTUElERkQ6XFxuLVxcdFxcdGlmIChza19pc191bml4KHNrKSlcXG4rXFx0XFx0aWYgKHNrX2lzX3VuaXgoc2spKSB7XFxuK1xcdFxcdFxcdC8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRF9USFJFQUQuICovXFxuIFxcdFxcdFxcdHNrLVxcdTAwM2Vza19zY21fcGlkZmQgPSB2YWxib29sO1xcbi1cXHRcXHRlbHNlXFxuK1xcdFxcdFxcdGlmICh2YWxib29sKVxcbitcXHRcXHRcXHRcXHRzay1cXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZCA9IDA7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdHJldCA9IC1FT1BOT1RTVVBQO1xcbitcXHRcXHR9XFxuK1xcdFxcdGJyZWFrO1xcbitcXG4rXFx0Y2FzZSBTT19QQVNTUElERkRfVEhSRUFEOlxcbitcXHRcXHRpZiAoc2tfaXNfdW5peChzaykpIHtcXG4rXFx0XFx0XFx0LyogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggU09fUEFTU1BJREZELiAqL1xcbitcXHRcXHRcXHRzay1cXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZCA9IHZhbGJvb2w7XFxuK1xcdFxcdFxcdGlmICh2YWxib29sKVxcbitcXHRcXHRcXHRcXHRzay1cXHUwMDNlc2tfc2NtX3BpZGZkID0gMDtcXG4rXFx0XFx0fSBlbHNlIHtcXG4gXFx0XFx0XFx0cmV0ID0gLUVPUE5PVFNVUFA7XFxuK1xcdFxcdH1cXG4gXFx0XFx0YnJlYWs7XFxuIFxcbiBcXHRjYXNlIFNPX1BBU1NSSUdIVFM6XFxuQEAgLTE3MjgsNiArMTc0Myw1MCBAQCBzdGF0aWMgaW50IGdyb3Vwc190b191c2VyKHNvY2twdHJfdCBkc3QsIGNvbnN0IHN0cnVjdCBncm91cF9pbmZvICpzcmMpXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbisvKiBIYW5kIG91dCBhIHBpZGZkIGZvciBAdHlwZSBvZiB0aGUgc29ja2V0J3MgcGVlciB2aWEgU09fUEVFUlBJREZEKi4gKi9cXG4rc3RhdGljIGludCBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZChzdHJ1Y3Qgc29jayAqc2ssIGVudW0gcGlkX3R5cGUgdHlwZSxcXG4rXFx0XFx0XFx0XFx0ICAgc29ja3B0cl90IG9wdHZhbCwgc29ja3B0cl90IG9wdGxlbiwgaW50IGxlbilcXG4re1xcbitcXHRzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XFxuK1xcdHN0cnVjdCBwaWQgKnBlZXJfcGlkO1xcbitcXHRpbnQgcGlkZmQ7XFxuK1xcbitcXHRpZiAobGVuIFxcdTAwM2Ugc2l6ZW9mKHBpZGZkKSlcXG4rXFx0XFx0bGVuID0gc2l6ZW9mKHBpZGZkKTtcXG4rXFxuK1xcdHNwaW5fbG9jayhcXHUwMDI2c2stXFx1MDAzZXNrX3BlZXJfbG9jayk7XFxuK1xcdHBlZXJfcGlkID0gZ2V0X3BpZChzay1cXHUwMDNlc2tfcGVlcl9waWRbdHlwZV0pO1xcbitcXHRzcGluX3VubG9jayhcXHUwMDI2c2stXFx1MDAzZXNrX3BlZXJfbG9jayk7XFxuK1xcbitcXHRpZiAoIXBlZXJfcGlkKVxcbitcXHRcXHRyZXR1cm4gLUVOT0RBVEE7XFxuK1xcbitcXHQvKiBUaGUgdXNlIG9mIFBJREZEX1NUQUxFIHJlcXVpcmVzIHN0YXNoaW5nIG9mIHN0cnVjdCBwaWQgb24gcGlkZnNcXG4rXFx0ICogd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuXFxuK1xcdCAqL1xcbitcXHRpZiAoc2stXFx1MDAzZXNrX2ZhbWlseSA9PSBBRl9VTklYKVxcbitcXHRcXHRmbGFncyB8PSBQSURGRF9TVEFMRTtcXG4rXFx0aWYgKHR5cGUgPT0gUElEVFlQRV9QSUQpXFxuK1xcdFxcdGZsYWdzIHw9IFBJREZEX1RIUkVBRDtcXG4rXFxuK1xcdHBpZGZkID0gcGlkZmRfcHJlcGFyZShwZWVyX3BpZCwgZmxhZ3MsIFxcdTAwMjZwaWRmZF9maWxlKTtcXG4rXFx0cHV0X3BpZChwZWVyX3BpZCk7XFxuK1xcdGlmIChwaWRmZCBcXHUwMDNjIDApXFxuK1xcdFxcdHJldHVybiBwaWRmZDtcXG4rXFxuK1xcdGlmIChjb3B5X3RvX3NvY2twdHIob3B0dmFsLCBcXHUwMDI2cGlkZmQsIGxlbikgfHxcXG4rXFx0ICAgIGNvcHlfdG9fc29ja3B0cihvcHRsZW4sIFxcdTAwMjZsZW4sIHNpemVvZihpbnQpKSkge1xcbitcXHRcXHRwdXRfdW51c2VkX2ZkKHBpZGZkKTtcXG4rXFx0XFx0ZnB1dChwaWRmZF9maWxlKTtcXG4rXFxuK1xcdFxcdHJldHVybiAtRUZBVUxUO1xcbitcXHR9XFxuK1xcbitcXHRmZF9pbnN0YWxsKHBpZGZkLCBwaWRmZF9maWxlKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuIGludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcXG4gXFx0XFx0ICBzb2NrcHRyX3Qgb3B0dmFsLCBzb2NrcHRyX3Qgb3B0bGVuKVxcbiB7XFxuQEAgLTE4OTIsNiArMTk1MSwxMyBAQCBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxuIFxcdFxcdHYudmFsID0gc2stXFx1MDAzZXNrX3NjbV9waWRmZDtcXG4gXFx0XFx0YnJlYWs7XFxuIFxcbitcXHRjYXNlIFNPX1BBU1NQSURGRF9USFJFQUQ6XFxuK1xcdFxcdGlmICghc2tfaXNfdW5peChzaykpXFxuK1xcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4rXFxuK1xcdFxcdHYudmFsID0gc2stXFx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQ7XFxuK1xcdFxcdGJyZWFrO1xcbitcXG4gXFx0Y2FzZSBTT19QQVNTUklHSFRTOlxcbiBcXHRcXHRpZiAoIXNrX2lzX3VuaXgoc2spKVxcbiBcXHRcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuQEAgLTE5MDYsNyArMTk3Miw4IEBAIGludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcXG4gXFx0XFx0XFx0bGVuID0gc2l6ZW9mKHBlZXJjcmVkKTtcXG4gXFxuIFxcdFxcdHNwaW5fbG9jayhcXHUwMDI2c2stXFx1MDAzZXNrX3BlZXJfbG9jayk7XFxuLVxcdFxcdGNyZWRfdG9fdWNyZWQoc2stXFx1MDAzZXNrX3BlZXJfcGlkLCBzay1cXHUwMDNlc2tfcGVlcl9jcmVkLCBcXHUwMDI2cGVlcmNyZWQpO1xcbitcXHRcXHRjcmVkX3RvX3VjcmVkKHNrLVxcdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdLCBzay1cXHUwMDNlc2tfcGVlcl9jcmVkLFxcbitcXHRcXHRcXHQgICAgICBcXHUwMDI2cGVlcmNyZWQpO1xcbiBcXHRcXHRzcGluX3VubG9jayhcXHUwMDI2c2stXFx1MDAzZXNrX3BlZXJfbG9jayk7XFxuIFxcbiBcXHRcXHRpZiAoY29weV90b19zb2NrcHRyKG9wdHZhbCwgXFx1MDAyNnBlZXJjcmVkLCBsZW4pKVxcbkBAIC0xOTE1LDQ1ICsxOTgyLDE0IEBAIGludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcXG4gXFx0fVxcbiBcXG4gXFx0Y2FzZSBTT19QRUVSUElERkQ6XFxuLVxcdHtcXG4tXFx0XFx0c3RydWN0IHBpZCAqcGVlcl9waWQ7XFxuLVxcdFxcdHN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDtcXG4tXFx0XFx0dW5zaWduZWQgaW50IGZsYWdzID0gMDtcXG4tXFx0XFx0aW50IHBpZGZkO1xcbi1cXG4tXFx0XFx0aWYgKGxlbiBcXHUwMDNlIHNpemVvZihwaWRmZCkpXFxuLVxcdFxcdFxcdGxlbiA9IHNpemVvZihwaWRmZCk7XFxuLVxcbi1cXHRcXHRzcGluX2xvY2soXFx1MDAyNnNrLVxcdTAwM2Vza19wZWVyX2xvY2spO1xcbi1cXHRcXHRwZWVyX3BpZCA9IGdldF9waWQoc2stXFx1MDAzZXNrX3BlZXJfcGlkKTtcXG4tXFx0XFx0c3Bpbl91bmxvY2soXFx1MDAyNnNrLVxcdTAwM2Vza19wZWVyX2xvY2spO1xcbitcXHRcXHRyZXR1cm4gc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc2ssIFBJRFRZUEVfVEdJRCwgb3B0dmFsLCBvcHRsZW4sIGxlbik7XFxuIFxcbi1cXHRcXHRpZiAoIXBlZXJfcGlkKVxcbi1cXHRcXHRcXHRyZXR1cm4gLUVOT0RBVEE7XFxuLVxcbi1cXHRcXHQvKiBUaGUgdXNlIG9mIFBJREZEX1NUQUxFIHJlcXVpcmVzIHN0YXNoaW5nIG9mIHN0cnVjdCBwaWRcXG4tXFx0XFx0ICogb24gcGlkZnMgd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYXFxuLVxcdFxcdCAqIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoc2stXFx1MDAzZXNrX2ZhbWlseSA9PSBBRl9VTklYKVxcbi1cXHRcXHRcXHRmbGFncyA9IFBJREZEX1NUQUxFO1xcbi1cXG4tXFx0XFx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBlZXJfcGlkLCBmbGFncywgXFx1MDAyNnBpZGZkX2ZpbGUpO1xcbi1cXHRcXHRwdXRfcGlkKHBlZXJfcGlkKTtcXG4tXFx0XFx0aWYgKHBpZGZkIFxcdTAwM2MgMClcXG4tXFx0XFx0XFx0cmV0dXJuIHBpZGZkO1xcbi1cXG4tXFx0XFx0aWYgKGNvcHlfdG9fc29ja3B0cihvcHR2YWwsIFxcdTAwMjZwaWRmZCwgbGVuKSB8fFxcbi1cXHRcXHQgICAgY29weV90b19zb2NrcHRyKG9wdGxlbiwgXFx1MDAyNmxlbiwgc2l6ZW9mKGludCkpKSB7XFxuLVxcdFxcdFxcdHB1dF91bnVzZWRfZmQocGlkZmQpO1xcbi1cXHRcXHRcXHRmcHV0KHBpZGZkX2ZpbGUpO1xcbi1cXG4tXFx0XFx0XFx0cmV0dXJuIC1FRkFVTFQ7XFxuLVxcdFxcdH1cXG4rXFx0Y2FzZSBTT19QRUVSUElERkRfVEhSRUFEOlxcbitcXHRcXHQvKiBPbmx5IEFGX1VOSVggcmVjb3JkcyB0aGUgcGVlcidzIGNvbm5lY3RpbmcgdGhyZWFkLiAqL1xcbitcXHRcXHRpZiAoIXNrX2lzX3VuaXgoc2spKVxcbitcXHRcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuIFxcbi1cXHRcXHRmZF9pbnN0YWxsKHBpZGZkLCBwaWRmZF9maWxlKTtcXG4tXFx0XFx0cmV0dXJuIDA7XFxuLVxcdH1cXG4rXFx0XFx0cmV0dXJuIHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKHNrLCBQSURUWVBFX1BJRCwgb3B0dmFsLCBvcHRsZW4sIGxlbik7XFxuIFxcbiBcXHRjYXNlIFNPX1BFRVJHUk9VUFM6XFxuIFxcdHtcXG5AQCAtMjM3OSw3ICsyNDE1LDcgQEAgc3RhdGljIHZvaWQgX19za19kZXN0cnVjdChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpXFxuIFxcbiBcXHQvKiBXZSBkbyBub3QgbmVlZCB0byBhY3F1aXJlIHNrLVxcdTAwM2Vza19wZWVyX2xvY2ssIHdlIGFyZSB0aGUgbGFzdCB1c2VyLiAqL1xcbiBcXHRwdXRfY3JlZChzay1cXHUwMDNlc2tfcGVlcl9jcmVkKTtcXG4tXFx0cHV0X3BpZChzay1cXHUwMDNlc2tfcGVlcl9waWQpO1xcbitcXHRwdXRfcGlkcyhzay1cXHUwMDNlc2tfcGVlcl9waWQpO1xcbiBcXG4gXFx0aWYgKGxpa2VseShzay1cXHUwMDNlc2tfbmV0X3JlZmNudCkpIHtcXG4gXFx0XFx0cHV0X25ldF90cmFjayhuZXQsIFxcdTAwMjZzay1cXHUwMDNlbnNfdHJhY2tlcik7XFxuQEAgLTM3NzUsNyArMzgxMSw3IEBAIHZvaWQgc29ja19pbml0X2RhdGFfdWlkKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrICpzaywga3VpZF90IHVpZClcXG4gXFx0c2stXFx1MDAzZXNrX2ZyYWcub2Zmc2V0XFx0PVxcdDA7XFxuIFxcdHNrLVxcdTAwM2Vza19wZWVrX29mZlxcdFxcdD1cXHQtMTtcXG4gXFxuLVxcdHNrLVxcdTAwM2Vza19wZWVyX3BpZCBcXHQ9XFx0TlVMTDtcXG4rXFx0bWVtc2V0KHNrLVxcdTAwM2Vza19wZWVyX3BpZCwgMCwgc2l6ZW9mKHNrLVxcdTAwM2Vza19wZWVyX3BpZCkpO1xcbiBcXHRzay1cXHUwMDNlc2tfcGVlcl9jcmVkXFx0PVxcdE5VTEw7XFxuIFxcdHNwaW5fbG9ja19pbml0KFxcdTAwMjZzay1cXHUwMDNlc2tfcGVlcl9sb2NrKTtcXG4gXFxuZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguY1xcbmluZGV4IDEzZjk5MjZiZjIwNTcuLjU2M2Q5ODI3YzVjYzUgMTAwNjQ0XFxuLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5jXFxuKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jXFxuQEAgLTczNyw1NyArNzM3LDUzIEBAIHN0YXRpYyB2b2lkIHVuaXhfcmVsZWFzZV9zb2NrKHN0cnVjdCBzb2NrICpzaywgaW50IGVtYnJpb24pXFxuIH1cXG4gXFxuIHN0cnVjdCB1bml4X3BlZXJjcmVkIHtcXG4tXFx0c3RydWN0IHBpZCAqcGVlcl9waWQ7XFxuK1xcdERFQ0xBUkVfUElEUyhwZWVyX3BpZCwgUElEVFlQRV9UR0lEKTtcXG4gXFx0Y29uc3Qgc3RydWN0IGNyZWQgKnBlZXJfY3JlZDtcXG4gfTtcXG4gXFxuIHN0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfcGVlcmNyZWQoc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxcbiB7XFxuLVxcdHN0cnVjdCBwaWQgKnBpZDtcXG4gXFx0aW50IGVycjtcXG4gXFxuLVxcdHBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTtcXG4tXFx0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XFxuLVxcdGlmIChsaWtlbHkoIWVycikpIHtcXG4tXFx0XFx0cGVlcmNyZWQtXFx1MDAzZXBlZXJfcGlkID0gZ2V0X3BpZChwaWQpO1xcbi1cXHRcXHRwZWVyY3JlZC1cXHUwMDNlcGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpO1xcbitcXHRnZXRfdGFza19waWRzKHBlZXJjcmVkLVxcdTAwM2VwZWVyX3BpZCwgY3VycmVudCk7XFxuK1xcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMocGVlcmNyZWQtXFx1MDAzZXBlZXJfcGlkKTtcXG4rXFx0aWYgKHVubGlrZWx5KGVycikpIHtcXG4rXFx0XFx0cHV0X3BpZHMocGVlcmNyZWQtXFx1MDAzZXBlZXJfcGlkKTtcXG4rXFx0XFx0cmV0dXJuIGVycjtcXG4gXFx0fVxcbi1cXHRyZXR1cm4gZXJyO1xcbitcXG4rXFx0cGVlcmNyZWQtXFx1MDAzZXBlZXJfY3JlZCA9IGdldF9jdXJyZW50X2NyZWQoKTtcXG4rXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuIHN0YXRpYyB2b2lkIGRyb3BfcGVlcmNyZWQoc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxcbiB7XFxuIFxcdGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gTlVMTDtcXG4tXFx0c3RydWN0IHBpZCAqcGlkID0gTlVMTDtcXG4gXFxuIFxcdG1pZ2h0X3NsZWVwKCk7XFxuIFxcbi1cXHRzd2FwKHBlZXJjcmVkLVxcdTAwM2VwZWVyX3BpZCwgcGlkKTtcXG4rXFx0cHV0X3BpZHMocGVlcmNyZWQtXFx1MDAzZXBlZXJfcGlkKTtcXG4gXFx0c3dhcChwZWVyY3JlZC1cXHUwMDNlcGVlcl9jcmVkLCBjcmVkKTtcXG4tXFxuLVxcdHB1dF9waWQocGlkKTtcXG4gXFx0cHV0X2NyZWQoY3JlZCk7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzayxcXG4gXFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcXG4ge1xcbi1cXHRzay1cXHUwMDNlc2tfcGVlcl9waWQgPSBwZWVyY3JlZC1cXHUwMDNlcGVlcl9waWQ7XFxuK1xcdG1lbWNweShzay1cXHUwMDNlc2tfcGVlcl9waWQsIHBlZXJjcmVkLVxcdTAwM2VwZWVyX3BpZCwgc2l6ZW9mKHNrLVxcdTAwM2Vza19wZWVyX3BpZCkpO1xcbiBcXHRzay1cXHUwMDNlc2tfcGVlcl9jcmVkID0gcGVlcmNyZWQtXFx1MDAzZXBlZXJfY3JlZDtcXG4gfVxcbiBcXG4gc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxcbiB7XFxuIFxcdGNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDtcXG4tXFx0c3RydWN0IHBpZCAqb2xkX3BpZDtcXG4gXFxuIFxcdHNwaW5fbG9jayhcXHUwMDI2c2stXFx1MDAzZXNrX3BlZXJfbG9jayk7XFxuLVxcdG9sZF9waWQgPSBzay1cXHUwMDNlc2tfcGVlcl9waWQ7XFxuK1xcdHN3YXBfcGlkcyhzay1cXHUwMDNlc2tfcGVlcl9waWQsIHBlZXJjcmVkLVxcdTAwM2VwZWVyX3BpZCk7XFxuIFxcdG9sZF9jcmVkID0gc2stXFx1MDAzZXNrX3BlZXJfY3JlZDtcXG4tXFx0aW5pdF9wZWVyY3JlZChzaywgcGVlcmNyZWQpO1xcbitcXHRzay1cXHUwMDNlc2tfcGVlcl9jcmVkID0gcGVlcmNyZWQtXFx1MDAzZXBlZXJfY3JlZDtcXG4gXFx0c3Bpbl91bmxvY2soXFx1MDAyNnNrLVxcdTAwM2Vza19wZWVyX2xvY2spO1xcbiBcXG4tXFx0cGVlcmNyZWQtXFx1MDAzZXBlZXJfcGlkID0gb2xkX3BpZDtcXG4gXFx0cGVlcmNyZWQtXFx1MDAzZXBlZXJfY3JlZCA9IG9sZF9jcmVkO1xcbiB9XFxuIFxcbkBAIC03OTYsMTQgKzc5MiwxNCBAQCBzdGF0aWMgdm9pZCBjb3B5X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBlZXJzaylcXG4gXFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcXHUwMDI2dW5peF9zayhwZWVyc2spLVxcdTAwM2Vsb2NrKTtcXG4gXFxuIFxcdHNwaW5fbG9jayhcXHUwMDI2c2stXFx1MDAzZXNrX3BlZXJfbG9jayk7XFxuLVxcdHNrLVxcdTAwM2Vza19wZWVyX3BpZCA9IGdldF9waWQocGVlcnNrLVxcdTAwM2Vza19wZWVyX3BpZCk7XFxuK1xcdGdldF9waWRzKHNrLVxcdTAwM2Vza19wZWVyX3BpZCwgcGVlcnNrLVxcdTAwM2Vza19wZWVyX3BpZCk7XFxuIFxcdHNrLVxcdTAwM2Vza19wZWVyX2NyZWQgPSBnZXRfY3JlZChwZWVyc2stXFx1MDAzZXNrX3BlZXJfY3JlZCk7XFxuIFxcdHNwaW5fdW5sb2NrKFxcdTAwMjZzay1cXHUwMDNlc2tfcGVlcl9sb2NrKTtcXG4gfVxcbiBcXG4gc3RhdGljIGJvb2wgdW5peF9tYXlfcGFzc2NyZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxcbiB7XFxuLVxcdHJldHVybiBzay1cXHUwMDNlc2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrLVxcdTAwM2Vza19zY21fcGlkZmQ7XFxuK1xcdHJldHVybiBzay1cXHUwMDNlc2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrX3NjbV9waWRmZF93YW50ZWQoc2spO1xcbiB9XFxuIFxcbiBzdGF0aWMgaW50IHVuaXhfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKVxcbkBAIC0xMDYwLDYgKzEwNTYsNyBAQCBzdGF0aWMgYm9vbCB1bml4X2JwZl9ieXBhc3NfZ2V0c29ja29wdChpbnQgbGV2ZWwsIGludCBvcHRuYW1lKVxcbiBcXHRpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCkge1xcbiBcXHRcXHRzd2l0Y2ggKG9wdG5hbWUpIHtcXG4gXFx0XFx0Y2FzZSBTT19QRUVSUElERkQ6XFxuK1xcdFxcdGNhc2UgU09fUEVFUlBJREZEX1RIUkVBRDpcXG4gXFx0XFx0XFx0cmV0dXJuIHRydWU7XFxuIFxcdFxcdGRlZmF1bHQ6XFxuIFxcdFxcdFxcdHJldHVybiBmYWxzZTtcXG5AQCAtMTk3Myw3ICsxOTcwLDcgQEAgc3RhdGljIHZvaWQgdW5peF9kZXN0cnVjdF9zY20oc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4ge1xcbiBcXHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY20gPSB7fTtcXG4gXFxuLVxcdHN3YXAoc2NtLnBpZCwgVU5JWENCKHNrYikucGlkKTtcXG4rXFx0c3dhcF9waWRzKHNjbS5waWQsIFVOSVhDQihza2IpLnBpZCk7XFxuIFxcbiBcXHRpZiAoVU5JWENCKHNrYikuZnApXFxuIFxcdFxcdHVuaXhfZGV0YWNoX2ZkcyhcXHUwMDI2c2NtLCBza2IpO1xcbkBAIC0xOTkxLDcgKzE5ODgsNyBAQCBzdGF0aWMgaW50IHVuaXhfc2NtX3RvX3NrYihzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHNlblxcbiB7XFxuIFxcdGludCBlcnIgPSAwO1xcbiBcXG4tXFx0VU5JWENCKHNrYikucGlkID0gZ2V0X3BpZChzY20tXFx1MDAzZXBpZCk7XFxuK1xcdGdldF9waWRzKFVOSVhDQihza2IpLnBpZCwgc2NtLVxcdTAwM2VwaWQpO1xcbiBcXHRVTklYQ0Ioc2tiKS51aWQgPSBzY20tXFx1MDAzZWNyZWRzLnVpZDtcXG4gXFx0VU5JWENCKHNrYikuZ2lkID0gc2NtLVxcdTAwM2VjcmVkcy5naWQ7XFxuIFxcdFVOSVhDQihza2IpLmZwID0gTlVMTDtcXG5AQCAtMjAwNSw3ICsyMDAyLDEwIEBAIHN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuXFxuIFxcbiBzdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG4ge1xcbi1cXHRzY21fc2V0X2NyZWQoc2NtLCBVTklYQ0Ioc2tiKS5waWQsIFVOSVhDQihza2IpLnVpZCwgVU5JWENCKHNrYikuZ2lkKTtcXG4rXFx0Z2V0X3BpZHMoc2NtLVxcdTAwM2VwaWQsIFVOSVhDQihza2IpLnBpZCk7XFxuK1xcdHNjbS1cXHUwMDNlY3JlZHMucGlkID0gcGlkX3ZucihzY20tXFx1MDAzZXBpZFtQSURUWVBFX1RHSURdKTtcXG4rXFx0c2NtLVxcdTAwM2VjcmVkcy51aWQgPSBVTklYQ0Ioc2tiKS51aWQ7XFxuK1xcdHNjbS1cXHUwMDNlY3JlZHMuZ2lkID0gVU5JWENCKHNrYikuZ2lkO1xcbiBcXHR1bml4X3NldF9zZWNkYXRhKHNjbSwgc2tiKTtcXG4gfVxcbiBcXG5AQCAtMjAyNSwzMCArMjAyNSwzNSBAQCBzdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG4gc3RhdGljIGludCB1bml4X21heWJlX2FkZF9jcmVkcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXFxuIFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBzb2NrICpvdGhlcilcXG4ge1xcbi1cXHRpZiAoVU5JWENCKHNrYikucGlkKVxcbitcXHRpZiAoVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0pXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4gXFx0aWYgKHVuaXhfbWF5X3Bhc3NjcmVkKHNrKSB8fCB1bml4X21heV9wYXNzY3JlZChvdGhlcikgfHxcXG4gXFx0ICAgICFvdGhlci1cXHUwMDNlc2tfc29ja2V0KSB7XFxuLVxcdFxcdHN0cnVjdCBwaWQgKnBpZDtcXG4gXFx0XFx0aW50IGVycjtcXG4gXFxuLVxcdFxcdHBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTtcXG4tXFx0XFx0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XFxuLVxcdFxcdGlmICh1bmxpa2VseShlcnIpKVxcbitcXHRcXHRnZXRfdGFza19waWRzKFVOSVhDQihza2IpLnBpZCwgY3VycmVudCk7XFxuK1xcdFxcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoVU5JWENCKHNrYikucGlkKTtcXG4rXFx0XFx0aWYgKHVubGlrZWx5KGVycikpIHtcXG4rXFx0XFx0XFx0cHV0X3BpZHMoVU5JWENCKHNrYikucGlkKTtcXG4gXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4rXFx0XFx0fVxcbiBcXG4tXFx0XFx0VU5JWENCKHNrYikucGlkID0gZ2V0X3BpZChwaWQpO1xcbiBcXHRcXHRjdXJyZW50X3VpZF9naWQoXFx1MDAyNlVOSVhDQihza2IpLnVpZCwgXFx1MDAyNlVOSVhDQihza2IpLmdpZCk7XFxuIFxcdH1cXG4gXFxuIFxcdHJldHVybiAwO1xcbiB9XFxuIFxcbi1zdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4rc3RhdGljIGJvb2wgdW5peF9za2Jfc2NtX2VxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4gXFx0XFx0XFx0ICAgIHN0cnVjdCBzY21fY29va2llICpzY20pXFxuIHtcXG4tXFx0cmV0dXJuIFVOSVhDQihza2IpLnBpZCA9PSBzY20tXFx1MDAzZXBpZCBcXHUwMDI2XFx1MDAyNlxcbitcXHQvKiBPbmx5IGEgdGhyZWFkIHBpZGZkIHJlY2VpdmVyIGNhbiB0ZWxsIHRocmVhZHMgb2Ygb25lIHByb2Nlc3MgYXBhcnQuICovXFxuK1xcdGlmIChzay1cXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZCBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgVU5JWENCKHNrYikucGlkW1BJRFRZUEVfUElEXSAhPSBzY20tXFx1MDAzZXBpZFtQSURUWVBFX1BJRF0pXFxuK1xcdFxcdHJldHVybiBmYWxzZTtcXG4rXFxuK1xcdHJldHVybiBVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9UR0lEXSA9PSBzY20tXFx1MDAzZXBpZFtQSURUWVBFX1RHSURdIFxcdTAwMjZcXHUwMDI2XFxuIFxcdCAgICAgICB1aWRfZXEoVU5JWENCKHNrYikudWlkLCBzY20tXFx1MDAzZWNyZWRzLnVpZCkgXFx1MDAyNlxcdTAwMjZcXG4gXFx0ICAgICAgIGdpZF9lcShVTklYQ0Ioc2tiKS5naWQsIHNjbS1cXHUwMDNlY3JlZHMuZ2lkKSBcXHUwMDI2XFx1MDAyNlxcbiBcXHQgICAgICAgdW5peF9zZWNkYXRhX2VxKHNjbSwgc2tiKTtcXG5AQCAtMzAyNiw3ICszMDMxLDcgQEAgc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWMoc3RydWN0IHVuaXhfc3RyZWFtX3JlYWRfc3RhdGUgKnN0YXRlLFxcbiBcXG4gXFx0XFx0aWYgKGNoZWNrX2NyZWRzKSB7XFxuIFxcdFxcdFxcdC8qIE5ldmVyIGdsdWUgbWVzc2FnZXMgZnJvbSBkaWZmZXJlbnQgd3JpdGVycyAqL1xcbi1cXHRcXHRcXHRpZiAoIXVuaXhfc2tiX3NjbV9lcShza2IsIFxcdTAwMjZzY20pKVxcbitcXHRcXHRcXHRpZiAoIXVuaXhfc2tiX3NjbV9lcShzaywgc2tiLCBcXHUwMDI2c2NtKSlcXG4gXFx0XFx0XFx0XFx0YnJlYWs7XFxuIFxcdFxcdH0gZWxzZSBpZiAodW5peF9tYXlfcGFzc2NyZWQoc2spKSB7XFxuIFxcdFxcdFxcdC8qIENvcHkgY3JlZGVudGlhbHMgKi9cXG5kaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5oIGIvbmV0L3VuaXgvYWZfdW5peC5oXFxuaW5kZXggODExOWRiZWVmM2EzYy4uNDAyNzQyODk1YWNjYSAxMDA2NDRcXG4tLS0gYS9uZXQvdW5peC9hZl91bml4LmhcXG4rKysgYi9uZXQvdW5peC9hZl91bml4LmhcXG5AQCAtMiw2ICsyLDcgQEBcXG4gI2lmbmRlZiBfX0FGX1VOSVhfSFxcbiAjZGVmaW5lIF9fQUZfVU5JWF9IXFxuIFxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvcGlkX3R5cGVzLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NsaW51eC91aWRnaWQuaFxcdTAwM2VcXG4gXFxuICNkZWZpbmUgVU5JWF9IQVNIX01PRFxcdCgyNTYgLSAxKVxcbkBAIC0xMSw3ICsxMiw3IEBAXFxuIHN0cnVjdCBzb2NrICp1bml4X3BlZXJfZ2V0KHN0cnVjdCBzb2NrICpzayk7XFxuIFxcbiBzdHJ1Y3QgdW5peF9za2JfcGFybXMge1xcbi1cXHRzdHJ1Y3QgcGlkXFx0XFx0KnBpZDtcXHRcXHQvKiBza2IgY3JlZGVudGlhbHNcXHQqL1xcbitcXHRERUNMQVJFX1BJRFMocGlkLCBQSURUWVBFX1RHSUQpO1xcdC8qIHNrYiBjcmVkZW50aWFscyBieSBwaWQgdHlwZSAqL1xcbiBcXHRrdWlkX3RcXHRcXHRcXHR1aWQ7XFxuIFxcdGtnaWRfdFxcdFxcdFxcdGdpZDtcXG4gXFx0c3RydWN0IHNjbV9mcF9saXN0XFx0KmZwO1xcdFxcdC8qIFBhc3NlZCBmaWxlc1xcdFxcdCovXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jXFxuaW5kZXggNDIyNzI4ZjYzMmNhNi4uZWM3M2JiNjkwYmJjYiAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuY1xcbkBAIC01OTIsNiArNTkyLDE4MSBAQCBURVNUX0YoY29yZWR1bXAsIHNvY2tldF9jb3JlZHVtcF9zaWduYWxfc2lnc2VndilcXG4gXFx0d2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7XFxuIH1cXG4gXFxuK3N0YXRpYyBib29sIGNoZWNrX2NvcmVkdW1wX2luZm8oY29uc3Qgc3RydWN0IHBpZGZkX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKndoYXQpXFxuK3tcXG4rXFx0aWYgKCEoaW5mby1cXHUwMDNlbWFzayBcXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApKSB7XFxuK1xcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IFBJREZEX0lORk9fQ09SRURVTVAgbm90IHNldCBpbiBtYXNrXFxcXG5cXFwiLCB3aGF0KTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRpZiAoIShpbmZvLVxcdTAwM2Vjb3JlZHVtcF9tYXNrIFxcdTAwMjYgUElERkRfQ09SRURVTVBFRCkpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogUElERkRfQ09SRURVTVBFRCBub3Qgc2V0IGluIGNvcmVkdW1wX21hc2tcXFxcblxcXCIsIHdoYXQpO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghKGluZm8tXFx1MDAzZW1hc2sgXFx1MDAyNiBQSURGRF9JTkZPX0NPUkVEVU1QX1NJR05BTCkgfHwgaW5mby1cXHUwMDNlY29yZWR1bXBfc2lnbmFsICE9IFNJR1NFR1YpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogY29yZWR1bXBfc2lnbmFsPSVkLCBleHBlY3RlZCBTSUdTRUdWPSVkXFxcXG5cXFwiLFxcbitcXHRcXHRcXHR3aGF0LCBpbmZvLVxcdTAwM2Vjb3JlZHVtcF9zaWduYWwsIFNJR1NFR1YpO1xcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICghKGluZm8tXFx1MDAzZW1hc2sgXFx1MDAyNiBQSURGRF9JTkZPX0NPUkVEVU1QX0NPREUpIHx8IGluZm8tXFx1MDAzZWNvcmVkdW1wX2NvZGUgIT0gU0VHVl9NQVBFUlIpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCIlczogY29yZWR1bXBfY29kZT0lZCwgZXhwZWN0ZWQgU0VHVl9NQVBFUlI9JWRcXFxcblxcXCIsXFxuK1xcdFxcdFxcdHdoYXQsIGluZm8tXFx1MDAzZWNvcmVkdW1wX2NvZGUsIFNFR1ZfTUFQRVJSKTtcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXHR9XFxuK1xcbitcXHRyZXR1cm4gdHJ1ZTtcXG4rfVxcbitcXG4rLypcXG4rICogVGVzdDogUElERkRfSU5GT19DT1JFRFVNUCBvbiB0aGUgZHVtcGluZyB0aHJlYWQncyBwaWRmZFxcbisgKlxcbisgKiBDcmFzaCBmcm9tIGEgbm9uLWxlYWRlciB0aHJlYWQgYW5kIHZlcmlmeSB0aGF0IHRoZSBwaWRmZCBmcm9tXFxuKyAqIFNPX1BFRVJQSURGRF9USFJFQUQgcmVmZXJzIHRvIHRoYXQgdGhyZWFkIGFuZCByZXBvcnRzIHRoZSBjb3JlZHVtcFxcbisgKiBsaWtlIHRoZSB0aHJlYWQtZ3JvdXAgbGVhZGVyJ3MgcGlkZmQgZnJvbSBTT19QRUVSUElERkQgZG9lcy5cXG4rICovXFxuK1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X2NvcmVkdW1wX3RocmVhZClcXG4re1xcbitcXHRpbnQgcGlkZmQsIHJldCwgc3RhdHVzO1xcbitcXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XFxuK1xcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm8gPSB7fTtcXG4rXFx0aW50IGlwY19zb2NrZXRzWzJdO1xcbitcXHRjaGFyIGM7XFxuK1xcbitcXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKFxcXCJAL3RtcC9jb3JlZHVtcC5zb2NrZXRcXFwiKSk7XFxuK1xcbitcXHRyZXQgPSBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLCBpcGNfc29ja2V0cyk7XFxuK1xcdEFTU0VSVF9FUShyZXQsIDApO1xcbitcXG4rXFx0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcXG4rXFx0QVNTRVJUX0dFKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIDApO1xcbitcXHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XFxuK1xcdFxcdGludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xO1xcbitcXHRcXHRpbnQgZmRfdGhyZWFkX3BpZGZkID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xO1xcbitcXHRcXHRzdHJ1Y3QgcGlkZmRfaW5mbyB0aHJlYWRfaW5mbyA9IHt9O1xcbitcXHRcXHRpbnQgZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFO1xcbitcXG4rXFx0XFx0Y2xvc2UoaXBjX3NvY2tldHNbMF0pO1xcbitcXG4rXFx0XFx0ZmRfc2VydmVyID0gY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoXFxcIi90bXAvY29yZWR1bXAuc29ja2V0XFxcIik7XFxuK1xcdFxcdGlmIChmZF9zZXJ2ZXIgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogbGlzdGVuIHNvY2tldCBmYWlsZWQ6ICVtXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmICh3cml0ZV9ub2ludHIoaXBjX3NvY2tldHNbMV0sIFxcXCIxXFxcIiwgMSkgXFx1MDAzYyAwKSB7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogaXBjIHdyaXRlIGZhaWxlZDogJW1cXFxcblxcXCIpO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0Y2xvc2UoaXBjX3NvY2tldHNbMV0pO1xcbitcXG4rXFx0XFx0ZmRfY29yZWR1bXAgPSBhY2NlcHQ0KGZkX3NlcnZlciwgTlVMTCwgTlVMTCwgU09DS19DTE9FWEVDKTtcXG4rXFx0XFx0aWYgKGZkX2NvcmVkdW1wIFxcdTAwM2MgMCkge1xcbitcXHRcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGFjY2VwdDQgZmFpbGVkOiAlbVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRmZF9wZWVyX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmQoZmRfY29yZWR1bXApO1xcbitcXHRcXHRpZiAoZmRfcGVlcl9waWRmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBnZXRfcGVlcl9waWRmZCBmYWlsZWRcXFxcblxcXCIpO1xcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0ZmRfdGhyZWFkX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmRfdGhyZWFkKGZkX2NvcmVkdW1wKTtcXG4rXFx0XFx0aWYgKGZkX3RocmVhZF9waWRmZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBnZXRfcGVlcl9waWRmZF90aHJlYWQgZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmICghZ2V0X3BpZGZkX2luZm8oZmRfcGVlcl9waWRmZCwgXFx1MDAyNmluZm8pIHx8XFxuK1xcdFxcdCAgICAhZ2V0X3BpZGZkX2luZm8oZmRfdGhyZWFkX3BpZGZkLCBcXHUwMDI2dGhyZWFkX2luZm8pKSB7XFxuK1xcdFxcdFxcdGZwcmludGYoc3RkZXJyLCBcXFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdC8qIFRoZSBwZWVyIGlzIHRoZSB0aHJlYWQtZ3JvdXAgbGVhZGVyLCB0aGUgZHVtcGluZyB0aHJlYWQgaXMgbm90LiAqL1xcbitcXHRcXHRpZiAoaW5mby5waWQgIT0gaW5mby50Z2lkIHx8IHRocmVhZF9pbmZvLnRnaWQgIT0gaW5mby50Z2lkIHx8XFxuK1xcdFxcdCAgICB0aHJlYWRfaW5mby5waWQgPT0gdGhyZWFkX2luZm8udGdpZCkge1xcbitcXHRcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IHVuZXhwZWN0ZWQgaWRzICVkLyVkIGFuZCAlZC8lZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0aW5mby5waWQsIGluZm8udGdpZCwgdGhyZWFkX2luZm8ucGlkLCB0aHJlYWRfaW5mby50Z2lkKTtcXG4rXFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdH1cXG4rXFxuK1xcdFxcdGlmICghY2hlY2tfY29yZWR1bXBfaW5mbyhcXHUwMDI2aW5mbywgXFxcIlNPX1BFRVJQSURGRFxcXCIpIHx8XFxuK1xcdFxcdCAgICAhY2hlY2tfY29yZWR1bXBfaW5mbyhcXHUwMDI2dGhyZWFkX2luZm8sIFxcXCJTT19QRUVSUElERkRfVEhSRUFEXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0XFx0ZmRfY29yZV9maWxlID0gb3Blbl9jb3JlZHVtcF90bXBmaWxlKHNlbGYtXFx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcXG4rXFx0XFx0aWYgKGZkX2NvcmVfZmlsZSBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBjb3JlIHRtcGZpbGUgZmFpbGVkOiAlbVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHR9XFxuK1xcbitcXHRcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdFxcdGNoYXIgYnVmZmVyWzQwOTZdO1xcbitcXHRcXHRcXHRzc2l6ZV90IGJ5dGVzX3JlYWQsIGJ5dGVzX3dyaXRlO1xcbitcXG4rXFx0XFx0XFx0Ynl0ZXNfcmVhZCA9IHJlYWQoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpO1xcbitcXHRcXHRcXHRpZiAoYnl0ZXNfcmVhZCBcXHUwMDNjIDApIHtcXG4rXFx0XFx0XFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBjb3JlIHJlYWQgZmFpbGVkOiAlbVxcXFxuXFxcIik7XFxuK1xcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHRcXHRcXHR9XFxuK1xcbitcXHRcXHRcXHRpZiAoYnl0ZXNfcmVhZCA9PSAwKVxcbitcXHRcXHRcXHRcXHRicmVhaztcXG4rXFxuK1xcdFxcdFxcdGJ5dGVzX3dyaXRlID0gd3JpdGUoZmRfY29yZV9maWxlLCBidWZmZXIsIGJ5dGVzX3JlYWQpO1xcbitcXHRcXHRcXHRpZiAoYnl0ZXNfcmVhZCAhPSBieXRlc193cml0ZSkge1xcbitcXHRcXHRcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgd3JpdGUgJXpkLyV6ZDogJW1cXFxcblxcXCIsXFxuK1xcdFxcdFxcdFxcdFxcdGJ5dGVzX3JlYWQsIGJ5dGVzX3dyaXRlKTtcXG4rXFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuK1xcdFxcdFxcdH1cXG4rXFx0XFx0fVxcbitcXG4rXFx0XFx0ZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTO1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcXFxcblxcXCIpO1xcbitvdXQ6XFxuK1xcdFxcdGlmIChmZF9jb3JlX2ZpbGUgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0Y2xvc2UoZmRfY29yZV9maWxlKTtcXG4rXFx0XFx0aWYgKGZkX3RocmVhZF9waWRmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZF90aHJlYWRfcGlkZmQpO1xcbitcXHRcXHRpZiAoZmRfcGVlcl9waWRmZCBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZF9wZWVyX3BpZGZkKTtcXG4rXFx0XFx0aWYgKGZkX2NvcmVkdW1wIFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdGNsb3NlKGZkX2NvcmVkdW1wKTtcXG4rXFx0XFx0aWYgKGZkX3NlcnZlciBcXHUwMDNlPSAwKVxcbitcXHRcXHRcXHRjbG9zZShmZF9zZXJ2ZXIpO1xcbitcXHRcXHRfZXhpdChleGl0X2NvZGUpO1xcbitcXHR9XFxuK1xcdHNlbGYtXFx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xcbitcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7XFxuK1xcdEFTU0VSVF9FUShyZWFkX25vaW50cihpcGNfc29ja2V0c1swXSwgXFx1MDAyNmMsIDEpLCAxKTtcXG4rXFx0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzBdKSwgMCk7XFxuK1xcbitcXHRwaWQgPSBmb3JrKCk7XFxuK1xcdEFTU0VSVF9HRShwaWQsIDApO1xcbitcXHRpZiAocGlkID09IDApXFxuK1xcdFxcdGNyYXNoaW5nX2NoaWxkX3RocmVhZCgpO1xcbitcXG4rXFx0cGlkZmQgPSBzeXNfcGlkZmRfb3BlbihwaWQsIDApO1xcbitcXHRBU1NFUlRfR0UocGlkZmQsIDApO1xcbitcXG4rXFx0d2FpdHBpZChwaWQsIFxcdTAwMjZzdGF0dXMsIDApO1xcbitcXHRBU1NFUlRfVFJVRShXSUZTSUdOQUxFRChzdGF0dXMpKTtcXG4rXFx0QVNTRVJUX0VRKFdURVJNU0lHKHN0YXR1cyksIFNJR1NFR1YpO1xcbitcXHRBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7XFxuK1xcbitcXHRBU1NFUlRfVFJVRShnZXRfcGlkZmRfaW5mbyhwaWRmZCwgXFx1MDAyNmluZm8pKTtcXG4rXFx0QVNTRVJUX1RSVUUoISEoaW5mby5tYXNrIFxcdTAwMjYgUElERkRfSU5GT19DT1JFRFVNUCkpO1xcbitcXHRBU1NFUlRfVFJVRSghIShpbmZvLmNvcmVkdW1wX21hc2sgXFx1MDAyNiBQSURGRF9DT1JFRFVNUEVEKSk7XFxuK1xcdEFTU0VSVF9FUShpbmZvLmNvcmVkdW1wX3NpZ25hbCwgU0lHU0VHVik7XFxuK1xcbitcXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcXG4rfVxcbitcXG4gLypcXG4gICogVGVzdDogUElERkRfSU5GT19DT1JFRFVNUF9TSUdOQUwgdmlhIHNpbXBsZSBzb2NrZXQgY29yZWR1bXAgd2l0aCBTSUdBQlJUXFxuICAqXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxcbmluZGV4IGVkNDdmMDFmYTUzYzUuLjQyMTI2NTZlMzFmMDEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXFxuQEAgLTI3LDEwICsyNywxMiBAQCBGSVhUVVJFKGNvcmVkdW1wKVxcbiAvKiBTaGFyZWQgaGVscGVyIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyAqL1xcbiB2b2lkICpkb19ub3RoaW5nKHZvaWQgKmFyZyk7XFxuIHZvaWQgY3Jhc2hpbmdfY2hpbGQodm9pZCk7XFxuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfdGhyZWFkKHZvaWQpO1xcbiBpbnQgY3JlYXRlX2RldGFjaGVkX3RtcGZzKHZvaWQpO1xcbiBpbnQgY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoY29uc3QgY2hhciAqcGF0aCk7XFxuIGJvb2wgc2V0X2NvcmVfcGF0dGVybihjb25zdCBjaGFyICpwYXR0ZXJuKTtcXG4gaW50IGdldF9wZWVyX3BpZGZkKGludCBmZCk7XFxuK2ludCBnZXRfcGVlcl9waWRmZF90aHJlYWQoaW50IGZkKTtcXG4gYm9vbCBnZXRfcGlkZmRfaW5mbyhpbnQgZmRfcGVlcl9waWRmZCwgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pO1xcbiBcXG4gLyogSW5saW5lIGhlbHBlciB0aGF0IHVzZXMgaGFybmVzcyB0eXBlcyAqL1xcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuaW5kZXggMmEyMGZhZjljYjBhZC4uMzYzMDYwNjlmNjJlNSAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXFxuQEAgLTEzLDYgKzEzLDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY3N0cmluZy5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL2Vwb2xsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvaW9jdGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvc29ja2V0LmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvdHlwZXMuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY3N5cy91bi5oXFx1MDAzZVxcbkBAIC0zOCw2ICszOSwxMCBAQCBzdHJ1Y3QgX2ZpeHR1cmVfY29yZWR1bXBfZGF0YSB7XFxuIFxcbiAjZGVmaW5lIE5VTV9USFJFQURfU1BBV04gMTI4XFxuIFxcbisjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQURcXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEIDg3XFxuKyNlbmRpZlxcbitcXG4gdm9pZCAqZG9fbm90aGluZyh2b2lkICphcmcpXFxuIHtcXG4gXFx0KHZvaWQpYXJnO1xcbkBAIC01OSw2ICs2NCwzNiBAQCB2b2lkIGNyYXNoaW5nX2NoaWxkKHZvaWQpXFxuIFxcdGkgPSAqKHZvbGF0aWxlIGludCAqKU5VTEw7XFxuIH1cXG4gXFxuK3N0YXRpYyB2b2lkICpjcmFzaGluZ190aHJlYWQodm9pZCAqYXJnKVxcbit7XFxuK1xcdGludCAqcDtcXG4rXFxuK1xcdCh2b2lkKWFyZztcXG4rXFxuK1xcdC8qIGNyYXNoIG9uIHB1cnBvc2Ugd2l0aCBTRUdWX01BUEVSUiAqL1xcbitcXHRwID0gbW1hcChOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsXFxuK1xcdFxcdCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OWU1PVVMsIC0xLCAwKTtcXG4rXFx0aWYgKHAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcdG11bm1hcChwLCBQQUdFX1NJWkUpO1xcbitcXHQqcCA9IDA7XFxuK1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rdm9pZCBjcmFzaGluZ19jaGlsZF90aHJlYWQodm9pZClcXG4re1xcbitcXHRwdGhyZWFkX3QgdGhyZWFkO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBOVU1fVEhSRUFEX1NQQVdOOyArK2kpXFxuK1xcdFxcdHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZ0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpO1xcbitcXG4rXFx0LyogY3Jhc2ggZnJvbSBhIG5vbi1sZWFkZXIgdGhyZWFkICovXFxuK1xcdHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZ0aHJlYWQsIE5VTEwsIGNyYXNoaW5nX3RocmVhZCwgTlVMTCk7XFxuK1xcdHBhdXNlKCk7XFxuK31cXG4rXFxuIGludCBjcmVhdGVfZGV0YWNoZWRfdG1wZnModm9pZClcXG4ge1xcbiBcXHRpbnQgZmRfY29udGV4dCwgZmRfdG1wZnM7XFxuQEAgLTEzOCw2ICsxNzMsMjAgQEAgaW50IGdldF9wZWVyX3BpZGZkKGludCBmZClcXG4gXFx0cmV0dXJuIGZkX3BlZXJfcGlkZmQ7XFxuIH1cXG4gXFxuK2ludCBnZXRfcGVlcl9waWRmZF90aHJlYWQoaW50IGZkKVxcbit7XFxuK1xcdGludCBmZF9wZWVyX3BpZGZkO1xcbitcXHRzb2NrbGVuX3QgZmRfcGVlcl9waWRmZF9sZW4gPSBzaXplb2YoZmRfcGVlcl9waWRmZCk7XFxuK1xcdGludCByZXQgPSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19QRUVSUElERkRfVEhSRUFELCBcXHUwMDI2ZmRfcGVlcl9waWRmZCxcXG4rXFx0XFx0XFx0ICAgICBcXHUwMDI2ZmRfcGVlcl9waWRmZF9sZW4pO1xcbitcXHRpZiAocmV0IFxcdTAwM2MgMCkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIiVzOiBnZXRzb2Nrb3B0KFNPX1BFRVJQSURGRF9USFJFQUQpIGZhaWxlZDogJW1cXFxcblxcXCIsIF9fZnVuY19fKTtcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXHR9XFxuK1xcdGZwcmludGYoc3RkZXJyLCBcXFwiJXM6IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGlkZmQgJWRcXFxcblxcXCIsIF9fZnVuY19fLCBmZF9wZWVyX3BpZGZkKTtcXG4rXFx0cmV0dXJuIGZkX3BlZXJfcGlkZmQ7XFxuK31cXG4rXFxuIGJvb2wgZ2V0X3BpZGZkX2luZm8oaW50IGZkX3BlZXJfcGlkZmQsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKVxcbiB7XFxuIFxcdGludCByZXQ7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvTWFrZWZpbGVcXG5pbmRleCBhNjZmMTBmYjBjMjMxLi40NWI4NDE3NThmMWJmIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvTWFrZWZpbGVcXG5AQCAtMjMsNiArMjMsOCBAQCBURVNUX0dFTl9GSUxFUyA6PSBzY21fcmlnaHRzX2RlbmlhbF9sc20uYnBmLm9cXG4gaW5jbHVkZSAuLi8uLi9saWIubWtcXG4gaW5jbHVkZSAuLi9icGYubWtcXG4gXFxuKyQoT1VUUFVUKS9zY21fcGlkZmQ6IENGTEFHUyArPSAtcHRocmVhZFxcbitcXG4gJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogJChCUEZPQkopXFxuICQoT1VUUFVUKS9zY21fcmlnaHRzX2RlbmlhbF9sc206IENGTEFHUyArPSAtSSQoU0NSQVRDSF9ESVIpL2luY2x1ZGVcXG4gJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogTERMSUJTICs9IC1sZWxmIC1selxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9zY21fcGlkZmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L3NjbV9waWRmZC5jXFxuaW5kZXggMmMxOGI5MmEyNjAzNS4uYmJiZDVlN2I0ZmE3OCAxMDA2NDRcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9zY21fcGlkZmQuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L3NjbV9waWRmZC5jXFxuQEAgLTEwLDYgKzEwLDcgQEBcXG4gI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NlcnJuby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjcHRocmVhZC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjc3lzL3VuLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvc2lnbmFsLmhcXHUwMDNlXFxuICNpbmNsdWRlIFxcdTAwM2NzeXMvdHlwZXMuaFxcdTAwM2VcXG5AQCAtMjcsNiArMjgsMTQgQEBcXG4gI2RlZmluZSBTQ01fUElERkQgMHgwNFxcbiAjZW5kaWZcXG4gXFxuKyNpZm5kZWYgU09fUEFTU1BJREZEX1RIUkVBRFxcbisjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgODZcXG4rI2VuZGlmXFxuK1xcbisjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQURcXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEIDg3XFxuKyNlbmRpZlxcbitcXG4gI2RlZmluZSBDSElMRF9FWElUX0NPREVfT0sgMTIzXFxuIFxcbiBzdGF0aWMgdm9pZCBjaGlsZF9kaWUoKVxcbkBAIC01NTMsNCArNTYyLDM2MSBAQCBURVNUX0Yoc2NtX3BpZGZkLCB0ZXN0KVxcbiBcXHRjbG9zZShwZmQpO1xcbiB9XFxuIFxcbitzdHJ1Y3QgdGhyZWFkX2lkcyB7XFxuK1xcdHBpZF90IHBpZDtcXG4rXFx0cGlkX3QgdGlkO1xcbit9O1xcbitcXG4rc3RhdGljIHZvaWQgKnNlbmRfaWRzX3RocmVhZCh2b2lkICphcmcpXFxuK3tcXG4rXFx0aW50IGZkID0gKihpbnQgKilhcmc7XFxuK1xcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHtcXG4rXFx0XFx0LnBpZCA9IGdldHBpZCgpLFxcbitcXHRcXHQudGlkID0gZ2V0dGlkKCksXFxuK1xcdH07XFxuK1xcdGNoYXIgc3luYztcXG4rXFxuK1xcdGlmIChzZW5kKGZkLCBcXHUwMDI2aWRzLCBzaXplb2YoaWRzKSwgMCkgIT0gc2l6ZW9mKGlkcykpXFxuK1xcdFxcdHJldHVybiAodm9pZCAqKTE7XFxuK1xcbitcXHQvKiBzdGF5IGFsaXZlIHVudGlsIHRoZSByZWNlaXZlciBoYXMgbG9va2VkIGF0IG91ciBwaWRmZCAqL1xcbitcXHRpZiAocmVhZChmZCwgXFx1MDAyNnN5bmMsIDEpICE9IDEpXFxuK1xcdFxcdHJldHVybiAodm9pZCAqKTE7XFxuK1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIHZvaWQgKnNlbmRfaWRzX2NyZWRzX3RocmVhZCh2b2lkICphcmcpXFxuK3tcXG4rXFx0aW50IGZkID0gKihpbnQgKilhcmc7XFxuK1xcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHtcXG4rXFx0XFx0LnBpZCA9IGdldHBpZCgpLFxcbitcXHRcXHQudGlkID0gZ2V0dGlkKCksXFxuK1xcdH07XFxuK1xcdHN0cnVjdCB1Y3JlZCB1Y3JlZCA9IHtcXG4rXFx0XFx0LnBpZCA9IGdldHBpZCgpLFxcbitcXHRcXHQudWlkID0gZ2V0dWlkKCksXFxuK1xcdFxcdC5naWQgPSBnZXRnaWQoKSxcXG4rXFx0fTtcXG4rXFx0Y2hhciBjb250cm9sW0NNU0dfU1BBQ0Uoc2l6ZW9mKHVjcmVkKSldID0geyAwIH07XFxuK1xcdHN0cnVjdCBpb3ZlYyBpb3Y7XFxuK1xcdHN0cnVjdCBtc2doZHIgbXNnID0geyAwIH07XFxuK1xcdHN0cnVjdCBjbXNnaGRyICpjbXNnO1xcbitcXHRjaGFyIHN5bmM7XFxuK1xcbitcXHRpb3YuaW92X2Jhc2UgPSBcXHUwMDI2aWRzO1xcbitcXHRpb3YuaW92X2xlbiA9IHNpemVvZihpZHMpO1xcbitcXG4rXFx0bXNnLm1zZ19pb3YgPSBcXHUwMDI2aW92O1xcbitcXHRtc2cubXNnX2lvdmxlbiA9IDE7XFxuK1xcdG1zZy5tc2dfY29udHJvbCA9IGNvbnRyb2w7XFxuK1xcdG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjb250cm9sKTtcXG4rXFxuK1xcdGNtc2cgPSBDTVNHX0ZJUlNUSERSKFxcdTAwMjZtc2cpO1xcbitcXHRjbXNnLVxcdTAwM2VjbXNnX2xldmVsID0gU09MX1NPQ0tFVDtcXG4rXFx0Y21zZy1cXHUwMDNlY21zZ190eXBlID0gU0NNX0NSRURFTlRJQUxTO1xcbitcXHRjbXNnLVxcdTAwM2VjbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZih1Y3JlZCkpO1xcbitcXHRtZW1jcHkoQ01TR19EQVRBKGNtc2cpLCBcXHUwMDI2dWNyZWQsIHNpemVvZih1Y3JlZCkpO1xcbitcXG4rXFx0aWYgKHNlbmRtc2coZmQsIFxcdTAwMjZtc2csIDApICE9IHNpemVvZihpZHMpKVxcbitcXHRcXHRyZXR1cm4gKHZvaWQgKikxO1xcbitcXG4rXFx0aWYgKHJlYWQoZmQsIFxcdTAwMjZzeW5jLCAxKSAhPSAxKVxcbitcXHRcXHRyZXR1cm4gKHZvaWQgKikxO1xcbitcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIHRocmVhZF9jbGllbnQoaW50IGZkLCBpbnQgc3luY2ZkLCB2b2lkICooKnNlbmRlcikodm9pZCAqKSlcXG4re1xcbitcXHRwdGhyZWFkX3QgdGhyZWFkO1xcbitcXHR2b2lkICpyZXQ7XFxuK1xcdGNoYXIgc3luYztcXG4rXFxuK1xcdC8qIHdhaXQgdW50aWwgdGhlIHJlY2VpdmVyIGVuYWJsZWQgU09fUEFTU1BJREZEICovXFxuK1xcdGlmIChyZWFkKHN5bmNmZCwgXFx1MDAyNnN5bmMsIDEpICE9IDEpXFxuK1xcdFxcdGNoaWxkX2RpZSgpO1xcbitcXG4rXFx0aWYgKHB0aHJlYWRfY3JlYXRlKFxcdTAwMjZ0aHJlYWQsIE5VTEwsIHNlbmRlciwgXFx1MDAyNmZkKSlcXG4rXFx0XFx0Y2hpbGRfZGllKCk7XFxuK1xcbitcXHRpZiAocHRocmVhZF9qb2luKHRocmVhZCwgXFx1MDAyNnJldCkgfHwgcmV0KVxcbitcXHRcXHRjaGlsZF9kaWUoKTtcXG4rXFxuK1xcdGV4aXQoMCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVjdl9waWRmZChpbnQgZmQsIHN0cnVjdCB0aHJlYWRfaWRzICppZHMpXFxuK3tcXG4rXFx0Y2hhciBjb250cm9sW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXSA9IHsgMCB9O1xcbitcXHRzdHJ1Y3QgaW92ZWMgaW92O1xcbitcXHRzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgMCB9O1xcbitcXHRzdHJ1Y3QgY21zZ2hkciAqY21zZztcXG4rXFx0aW50IHBpZGZkID0gLTE7XFxuK1xcbitcXHRpb3YuaW92X2Jhc2UgPSBpZHM7XFxuK1xcdGlvdi5pb3ZfbGVuID0gc2l6ZW9mKCppZHMpO1xcbitcXG4rXFx0bXNnLm1zZ19pb3YgPSBcXHUwMDI2aW92O1xcbitcXHRtc2cubXNnX2lvdmxlbiA9IDE7XFxuK1xcdG1zZy5tc2dfY29udHJvbCA9IGNvbnRyb2w7XFxuK1xcdG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjb250cm9sKTtcXG4rXFxuK1xcdGlmIChyZWN2bXNnKGZkLCBcXHUwMDI2bXNnLCAwKSAhPSBzaXplb2YoKmlkcykpIHtcXG4rXFx0XFx0bG9nX2VycihcXFwicmVjdm1zZ1xcXCIpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtc2cubXNnX2ZsYWdzIFxcdTAwMjYgKE1TR19UUlVOQyB8IE1TR19DVFJVTkMpKSB7XFxuK1xcdFxcdGxvZ19lcnIoXFxcInJlY3Ztc2c6IHRydW5jYXRlZFxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdGZvciAoY21zZyA9IENNU0dfRklSU1RIRFIoXFx1MDAyNm1zZyk7IGNtc2cgIT0gTlVMTDtcXG4rXFx0ICAgICBjbXNnID0gQ01TR19OWFRIRFIoXFx1MDAyNm1zZywgY21zZykpIHtcXG4rXFx0XFx0aWYgKGNtc2ctXFx1MDAzZWNtc2dfbGV2ZWwgPT0gU09MX1NPQ0tFVCBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgY21zZy1cXHUwMDNlY21zZ190eXBlID09IFNDTV9QSURGRClcXG4rXFx0XFx0XFx0bWVtY3B5KFxcdTAwMjZwaWRmZCwgQ01TR19EQVRBKGNtc2cpLCBzaXplb2YocGlkZmQpKTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIHBpZGZkO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHRocmVhZF9waWRmZF9mbG93KHZvaWQgKigqc2VuZGVyKSh2b2lkICopLCBpbnQgb3B0bmFtZSxcXG4rXFx0XFx0XFx0ICAgICBzdHJ1Y3QgdGhyZWFkX2lkcyAqaWRzLCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbylcXG4re1xcbitcXHRpbnQgc2tbMl07XFxuK1xcdGludCBzeW5jcGlwZVsyXTtcXG4rXFx0aW50IHBpZGZkO1xcbitcXHRpbnQgY2hpbGRfc3RhdHVzID0gMDtcXG4rXFx0cGlkX3QgY2hpbGQ7XFxuK1xcbitcXHRpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2spKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRpZiAocGlwZShzeW5jcGlwZSkpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNoaWxkID0gZm9yaygpO1xcbitcXHRpZiAoY2hpbGQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRpZiAoY2hpbGQgPT0gMCkge1xcbitcXHRcXHRjbG9zZShza1swXSk7XFxuK1xcdFxcdGNsb3NlKHN5bmNwaXBlWzFdKTtcXG4rXFx0XFx0dGhyZWFkX2NsaWVudChza1sxXSwgc3luY3BpcGVbMF0sIHNlbmRlcik7XFxuK1xcdH1cXG4rXFx0Y2xvc2Uoc2tbMV0pO1xcbitcXHRjbG9zZShzeW5jcGlwZVswXSk7XFxuK1xcbitcXHRpbnQgb24gPSAxO1xcbitcXG4rXFx0aWYgKHNldHNvY2tvcHQoc2tbMF0sIFNPTF9TT0NLRVQsIG9wdG5hbWUsIFxcdTAwMjZvbiwgc2l6ZW9mKG9uKSkpIHtcXG4rXFx0XFx0bG9nX2VycihcXFwiRmFpbGVkIHRvIHNldCBwaWRmZCBwYXNzaW5nIG9wdGlvblxcXCIpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdGlmICh3cml0ZShzeW5jcGlwZVsxXSwgXFxcIjFcXFwiLCAxKSAhPSAxKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGNsb3NlKHN5bmNwaXBlWzFdKTtcXG4rXFxuK1xcdHBpZGZkID0gcmVjdl9waWRmZChza1swXSwgaWRzKTtcXG4rXFx0aWYgKHBpZGZkIFxcdTAwM2MgMClcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0aW5mby1cXHUwMDNlbWFzayA9IFBJREZEX0lORk9fUElEO1xcbitcXHRpZiAoaW9jdGwocGlkZmQsIFBJREZEX0dFVF9JTkZPLCBpbmZvKSkge1xcbitcXHRcXHRsb2dfZXJyKFxcXCJpb2N0bChQSURGRF9HRVRfSU5GTylcXFwiKTtcXG4rXFx0XFx0Y2xvc2UocGlkZmQpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFx0Y2xvc2UocGlkZmQpO1xcbitcXG4rXFx0LyogcmVsZWFzZSB0aGUgc2VuZGluZyB0aHJlYWQgKi9cXG4rXFx0aWYgKHdyaXRlKHNrWzBdLCBcXFwieFxcXCIsIDEpICE9IDEpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0Y2xvc2Uoc2tbMF0pO1xcbitcXG4rXFx0d2FpdHBpZChjaGlsZCwgXFx1MDAyNmNoaWxkX3N0YXR1cywgMCk7XFxuK1xcdGlmICghV0lGRVhJVEVEKGNoaWxkX3N0YXR1cykgfHwgV0VYSVRTVEFUVVMoY2hpbGRfc3RhdHVzKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgc29ja29wdF9zZXQoaW50IGZkLCBpbnQgb3B0bmFtZSwgaW50IHZhbClcXG4re1xcbitcXHRyZXR1cm4gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgXFx1MDAyNnZhbCwgc2l6ZW9mKHZhbCkpO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHNvY2tvcHRfZ2V0KGludCBmZCwgaW50IG9wdG5hbWUpXFxuK3tcXG4rXFx0c29ja2xlbl90IGxlbiA9IHNpemVvZihpbnQpO1xcbitcXHRpbnQgdmFsID0gLTE7XFxuK1xcbitcXHRpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgXFx1MDAyNnZhbCwgXFx1MDAyNmxlbikpXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHJldHVybiB2YWw7XFxuK31cXG4rXFxuK1RFU1Qoc2NtX3BpZGZkX3NldHNvY2tvcHRfdmFsdWVzKVxcbit7XFxuK1xcdGludCBza1syXTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaykpO1xcbitcXG4rXFx0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFELCAxKSk7XFxuK1xcdEFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpO1xcbitcXHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xcbitcXG4rXFx0LyogVGhlIG9wdGlvbiBzZXQgbGFzdCB3aW5zLiAqL1xcbitcXHRBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRCwgMSkpO1xcbitcXHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xcbitcXHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCwgMSkpO1xcbitcXHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkQpKTtcXG4rXFxuK1xcdC8qIERpc2FibGluZyBvbmUgb3B0aW9uIGxlYXZlcyB0aGUgb3RoZXIgYWxvbmUuICovXFxuK1xcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZELCAwKSk7XFxuK1xcdEFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpO1xcbitcXHRBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQsIDApKTtcXG4rXFx0QVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkQpKTtcXG4rXFx0QVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7XFxuK1xcbitcXHRjbG9zZShza1swXSk7XFxuK1xcdGNsb3NlKHNrWzFdKTtcXG4rfVxcbitcXG4rVEVTVChzY21fcGlkZmRfdGhyZWFkKVxcbit7XFxuK1xcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcztcXG4rXFx0c3RydWN0IHBpZGZkX2luZm8gaW5mbztcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2aWRzLCBcXHUwMDI2aW5mbykpO1xcbitcXHRBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7XFxuK1xcdEVYUEVDVF9FUShpZHMudGlkLCBpbmZvLnBpZCk7XFxuK1xcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpO1xcbit9XFxuK1xcbitURVNUKHNjbV9waWRmZF90aHJlYWRfZ3JvdXApXFxuK3tcXG4rXFx0c3RydWN0IHRocmVhZF9pZHMgaWRzO1xcbitcXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvO1xcbitcXG4rXFx0QVNTRVJUX0VRKDAsIHRocmVhZF9waWRmZF9mbG93KHNlbmRfaWRzX3RocmVhZCwgU09fUEFTU1BJREZELFxcbitcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmlkcywgXFx1MDAyNmluZm8pKTtcXG4rXFx0QVNTRVJUX05FKGlkcy5waWQsIGlkcy50aWQpO1xcbitcXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby5waWQpO1xcbitcXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTtcXG4rfVxcbitcXG4rVEVTVChzY21fcGlkZmRfdGhyZWFkX2NyZWRzKVxcbit7XFxuK1xcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcztcXG4rXFx0c3RydWN0IHBpZGZkX2luZm8gaW5mbztcXG4rXFxuK1xcdEFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc19jcmVkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsXFxuK1xcdFxcdFxcdFxcdCAgICAgICBcXHUwMDI2aWRzLCBcXHUwMDI2aW5mbykpO1xcbitcXHRBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7XFxuK1xcdEVYUEVDVF9FUShpZHMudGlkLCBpbmZvLnBpZCk7XFxuK1xcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCAqcGVlcl9jb25uZWN0X3RocmVhZCh2b2lkICphcmcpXFxuK3tcXG4rXFx0c3RydWN0IHNvY2tfYWRkciAqc2EgPSBhcmc7XFxuK1xcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHtcXG4rXFx0XFx0LnBpZCA9IGdldHBpZCgpLFxcbitcXHRcXHQudGlkID0gZ2V0dGlkKCksXFxuK1xcdH07XFxuK1xcdGludCBmZDtcXG4rXFx0Y2hhciBzeW5jO1xcbitcXG4rXFx0ZmQgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gKHZvaWQgKikxO1xcbitcXG4rXFx0aWYgKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilcXHUwMDI2c2EtXFx1MDAzZWxpc3Rlbl9hZGRyLCBzYS1cXHUwMDNlYWRkcmxlbikpXFxuK1xcdFxcdHJldHVybiAodm9pZCAqKTE7XFxuK1xcbitcXHRpZiAoc2VuZChmZCwgXFx1MDAyNmlkcywgc2l6ZW9mKGlkcyksIDApICE9IHNpemVvZihpZHMpKVxcbitcXHRcXHRyZXR1cm4gKHZvaWQgKikxO1xcbitcXG4rXFx0Lyogc3RheSBhbGl2ZSB1bnRpbCB0aGUgc2VydmVyIGhhcyBsb29rZWQgYXQgb3VyIHBpZGZkICovXFxuK1xcdGlmIChyZWFkKGZkLCBcXHUwMDI2c3luYywgMSkgIT0gMSlcXG4rXFx0XFx0cmV0dXJuICh2b2lkICopMTtcXG4rXFxuK1xcdGNsb3NlKGZkKTtcXG4rXFx0cmV0dXJuIE5VTEw7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcGVlcl9waWRmZF9pbmZvKGludCBmZCwgaW50IG9wdG5hbWUsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKVxcbit7XFxuK1xcdGludCBwaWRmZDtcXG4rXFx0c29ja2xlbl90IGxlbiA9IHNpemVvZihwaWRmZCk7XFxuK1xcbitcXHRpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgXFx1MDAyNnBpZGZkLCBcXHUwMDI2bGVuKSkge1xcbitcXHRcXHRsb2dfZXJyKFxcXCJnZXRzb2Nrb3B0KFNPX1BFRVJQSURGRCopXFxcIik7XFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFx0fVxcbitcXG4rXFx0aW5mby1cXHUwMDNlbWFzayA9IFBJREZEX0lORk9fUElEO1xcbitcXHRpZiAoaW9jdGwocGlkZmQsIFBJREZEX0dFVF9JTkZPLCBpbmZvKSkge1xcbitcXHRcXHRsb2dfZXJyKFxcXCJpb2N0bChQSURGRF9HRVRfSU5GTylcXFwiKTtcXG4rXFx0XFx0Y2xvc2UocGlkZmQpO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdGNsb3NlKHBpZGZkKTtcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmV0dXJucyBhIHBpZGZkIGZvciB0aGUgcGVlcidzIGNvbm5lY3RpbmcgdGhyZWFkLiAqL1xcbitURVNUKHNvX3BlZXJwaWRmZF90aHJlYWQpXFxuK3tcXG4rXFx0c3RydWN0IHNvY2tfYWRkciBzYTtcXG4rXFx0c3RydWN0IHRocmVhZF9pZHMgaWRzO1xcbitcXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvO1xcbitcXHRwdGhyZWFkX3QgdGhyZWFkO1xcbitcXHR2b2lkICp0cmV0O1xcbitcXHRpbnQgc2VydmVyLCBjZmQ7XFxuK1xcbitcXHRzZXJ2ZXIgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApO1xcbitcXHRBU1NFUlRfTEUoMCwgc2VydmVyKTtcXG4rXFxuK1xcdGZpbGxfc29ja2FkZHIoXFx1MDAyNnNhLCB0cnVlKTtcXG4rXFx0QVNTRVJUX0VRKDAsIGJpbmQoc2VydmVyLCAoc3RydWN0IHNvY2thZGRyICopXFx1MDAyNnNhLmxpc3Rlbl9hZGRyLCBzYS5hZGRybGVuKSk7XFxuK1xcdEFTU0VSVF9FUSgwLCBsaXN0ZW4oc2VydmVyLCAxKSk7XFxuK1xcbitcXHRBU1NFUlRfRVEoMCwgcHRocmVhZF9jcmVhdGUoXFx1MDAyNnRocmVhZCwgTlVMTCwgcGVlcl9jb25uZWN0X3RocmVhZCwgXFx1MDAyNnNhKSk7XFxuK1xcbitcXHRjZmQgPSBhY2NlcHQoc2VydmVyLCBOVUxMLCBOVUxMKTtcXG4rXFx0QVNTRVJUX0xFKDAsIGNmZCk7XFxuK1xcbitcXHRBU1NFUlRfRVEoc2l6ZW9mKGlkcyksIHJlY3YoY2ZkLCBcXHUwMDI2aWRzLCBzaXplb2YoaWRzKSwgTVNHX1dBSVRBTEwpKTtcXG4rXFx0QVNTRVJUX05FKGlkcy5waWQsIGlkcy50aWQpO1xcbitcXG4rXFx0LyogU09fUEVFUlBJREZEIHJlZmVycyB0byB0aGUgcGVlcidzIHRocmVhZC1ncm91cC4gKi9cXG4rXFx0QVNTRVJUX0VRKDAsIHBlZXJfcGlkZmRfaW5mbyhjZmQsIFNPX1BFRVJQSURGRCwgXFx1MDAyNmluZm8pKTtcXG4rXFx0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8ucGlkKTtcXG4rXFx0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XFxuK1xcbitcXHQvKiBTT19QRUVSUElERkRfVEhSRUFEIHJlZmVycyB0byB0aGUgY29ubmVjdGluZyB0aHJlYWQuICovXFxuK1xcdEFTU0VSVF9FUSgwLCBwZWVyX3BpZGZkX2luZm8oY2ZkLCBTT19QRUVSUElERkRfVEhSRUFELCBcXHUwMDI2aW5mbykpO1xcbitcXHRFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpO1xcbitcXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTtcXG4rXFxuK1xcdC8qIHJlbGVhc2UgdGhlIGNvbm5lY3RpbmcgdGhyZWFkICovXFxuK1xcdEFTU0VSVF9FUSgxLCB3cml0ZShjZmQsIFxcXCJ4XFxcIiwgMSkpO1xcbitcXHRBU1NFUlRfRVEoMCwgcHRocmVhZF9qb2luKHRocmVhZCwgXFx1MDAyNnRyZXQpKTtcXG4rXFx0QVNTRVJUX0VRKE5VTEwsIHRyZXQpO1xcbitcXG4rXFx0Y2xvc2UoY2ZkKTtcXG4rXFx0Y2xvc2Uoc2VydmVyKTtcXG4rfVxcbitcXG4gVEVTVF9IQVJORVNTX01BSU5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzA6MjUuMDQxMzgzNjMzWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjoyNTYyMjY2OTQxNDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVU5JWFwiLFxuICAgIFwiQ09SRURVTVBcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJza19zZXRzb2Nrb3B0XCIsXG4gICAgXCJza19nZXRzb2Nrb3B0XCIsXG4gICAgXCJzY21fcmVjdl91bml4XCIsXG4gICAgXCJfX3NjbV9zZW5kXCIsXG4gICAgXCJfX3BpZGZzX3JlZ2lzdGVyX3BpZHNcIixcbiAgICBcInBpZGZzX2NvcmVkdW1wXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgU09fUEFTU1BJREZEX1RIUkVBRCBhbmQgU09fUEVFUlBJREZEX1RIUkVBRCBzb2NrZXQgb3B0aW9ucyB0byBhbGxvdyBwYXNzaW5nIGFuZCBxdWVyeWluZyB0aHJlYWQtc3BlY2lmaWMgcGlkZmRzIG92ZXIgVU5JWCBkb21haW4gc29ja2V0cy4gSXQgdXBkYXRlcyBzdHJ1Y3Qgc29jaywgU0NNIGNyZWRlbnRpYWwgcGFzc2luZywgVU5JWCBzb2NrZXQgcmVhZC93cml0ZSBjcmVkZW50aWFsIG1hdGNoaW5nLCBwaWRmcyBwaWQgcmVnaXN0cmF0aW9uLCBhbmQgY29yZWR1bXAgbm90aWZpY2F0aW9uIG1lY2hhbmlzbXMuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDMzMmIwM2E1OTc4NzY3MTI5NGU1MTdkMDM1ZjU0NWRkOTkyMDYzYjFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgTW9uIEF1ZyAzMSAxMjozMDoyMyAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuaW5kZXggOTQ2YTVmYWQyNjkxMi4uNWQzNTI0YzI2YjJiYyAxMDA2NDRcbi0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5AQCAtMTU3LDYgKzE1NywxMCBAQFxuIFxuICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkMgICAgICA4NVxuIFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICA4NlxuK1xuKyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCAgICA4N1xuK1xuICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKVxuIFxuICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjRcbmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5pbmRleCBmMTY0MWRkZTEzNWZjLi4yNDVhNDNmNTJmYjFhIDEwMDY0NFxuLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5AQCAtMTY4LDYgKzE2OCwxMCBAQFxuIFxuICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkMgICAgICA4NVxuIFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICA4NlxuK1xuKyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCAgICA4N1xuK1xuICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKVxuIFxuICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjRcbmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuaW5kZXggZjNhMzgxNWM3ZGMyOS4uZjIzNzEwZTFjNjcxNCAxMDA2NDRcbi0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbkBAIC0xNDksNiArMTQ5LDEwIEBAXG4gXG4gI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQ1x0MHg0MDUzXG4gXG4rI2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEXHQweDQwNTRcbitcbisjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQURcdDB4NDA1NVxuK1xuICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKVxuIFxuICNpZiBfX0JJVFNfUEVSX0xPTkcgPT0gNjRcbmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbmluZGV4IDc5MDdmM2IxZjBlZTAuLmIzNWIyNWJkZWZjMmIgMTAwNjQ0XG4tLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuQEAgLTE1MCw2ICsxNTAsMTAgQEBcbiBcbiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DICAgICAgICAweDAwNWVcbiBcbisjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgICAgICAweDAwNWZcbitcbisjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgICAgICAweDAwNjBcbitcbiAjaWYgIWRlZmluZWQoX19LRVJORUxfXylcbiBcbiBcbmRpZmYgLS1naXQgYS9mcy9jb3JlZHVtcC5jIGIvZnMvY29yZWR1bXAuY1xuaW5kZXggYWMzY2Q3NDgwOGM2NC4uYjVmZjRiM2UxODMxZSAxMDA2NDRcbi0tLSBhL2ZzL2NvcmVkdW1wLmNcbisrKyBiL2ZzL2NvcmVkdW1wLmNcbkBAIC00NTQsNyArNDU0LDcgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfcGFyc2Uoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXG4gXHRcdFx0XHQgKiBsZWFkZXIgd2Uga25vdyB0aGF0IHRoZSB0aHJlYWQtZ3JvdXAgbGVhZGVyXG4gXHRcdFx0XHQgKiBjYW5ub3QgYmUgcmVhcGVkIHVudGlsIEBjdXJyZW50IGhhcyBleGl0ZWQuXG4gXHRcdFx0XHQgKi9cbi1cdFx0XHRcdGNwcm0tXHUwMDNlcGlkID0gdGFza190Z2lkKGN1cnJlbnQpO1xuK1x0XHRcdFx0dGFza19waWRzKGNwcm0tXHUwMDNlcGlkLCBjdXJyZW50KTtcbiBcdFx0XHRcdGVyciA9IGNuX3ByaW50ZihjbiwgXCIlZFwiLCBDT1JFRFVNUF9QSURGRF9OVU1CRVIpO1xuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdFx0fVxuQEAgLTYyNiwxMyArNjI2LDE3IEBAIHN0YXRpYyBpbnQgdW1oX2NvcmVkdW1wX3NldHVwKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpXG4gXHRzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcCA9IChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICopaW5mby1cdTAwM2VkYXRhO1xuIFx0aW50IGVycjtcbiBcbi1cdGlmIChjcC1cdTAwM2VwaWQpIHtcbitcdGlmIChjcC1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSkge1xuIFx0XHRzdHJ1Y3QgZmlsZSAqcGlkZnNfZmlsZSBfX2ZyZWUoZnB1dCkgPSBOVUxMO1xuIFxuLVx0XHRwaWRmc19maWxlID0gcGlkZnNfYWxsb2NfZmlsZShjcC1cdTAwM2VwaWQsIDApO1xuK1x0XHRwaWRmc19maWxlID0gcGlkZnNfYWxsb2NfZmlsZShjcC1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSwgMCk7XG4gXHRcdGlmIChJU19FUlIocGlkZnNfZmlsZSkpXG4gXHRcdFx0cmV0dXJuIFBUUl9FUlIocGlkZnNfZmlsZSk7XG4gXG4rXHRcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoY3AtXHUwMDNlcGlkKTtcbitcdFx0aWYgKGVycilcbitcdFx0XHRyZXR1cm4gZXJyO1xuK1xuIFx0XHRwaWRmc19jb3JlZHVtcChjcCk7XG4gXG4gXHRcdC8qXG5AQCAtNjk1LDEyICs2OTksMTIgQEAgc3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0Lypcbi1cdCAqIFNldCB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlciBwaWQgd2hpY2ggaXMgdXNlZCBmb3IgdGhlIHBlZXJcbi1cdCAqIGNyZWRlbnRpYWxzIGR1cmluZyBjb25uZWN0KCkgYmVsb3cuIFRoZW4gaW1tZWRpYXRlbHkgcmVnaXN0ZXJcbi1cdCAqIGl0IGluIHBpZGZzLi4uXG4rXHQgKiBTZXQgdGhlIHBpZHMgb2YgdGhlIGR1bXBpbmcgdGhyZWFkIGFuZCBpdHMgdGhyZWFkLWdyb3VwIGxlYWRlclxuK1x0ICogd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBwZWVyIGNyZWRlbnRpYWxzIGR1cmluZyBjb25uZWN0KCkgYmVsb3cuXG4rXHQgKiBUaGVuIGltbWVkaWF0ZWx5IHJlZ2lzdGVyIHRoZW0gaW4gcGlkZnMuLi5cbiBcdCAqL1xuLVx0Y3BybS1cdTAwM2VwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG4tXHRyZXR2YWwgPSBwaWRmc19yZWdpc3Rlcl9waWQoY3BybS1cdTAwM2VwaWQpO1xuK1x0dGFza19waWRzKGNwcm0tXHUwMDNlcGlkLCBjdXJyZW50KTtcbitcdHJldHZhbCA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoY3BybS1cdTAwM2VwaWQpO1xuIFx0aWYgKHJldHZhbClcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuQEAgLTcyMiw3ICs3MjYsNyBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX2Nvbm5lY3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxuIFx0fVxuIFxuIFx0LyogLi4uIGFuZCB2YWxpZGF0ZSB0aGF0IEBza19wZWVyX3BpZCBtYXRjaGVzIEBjcHJtLnBpZC4gKi9cbi1cdGlmIChXQVJOX09OX09OQ0UodW5peF9wZWVyKHNvY2tldC1cdTAwM2VzayktXHUwMDNlc2tfcGVlcl9waWQgIT0gY3BybS1cdTAwM2VwaWQpKVxuK1x0aWYgKFdBUk5fT05fT05DRSghcGlkc19lcXVhbCh1bml4X3BlZXIoc29ja2V0LVx1MDAzZXNrKS1cdTAwM2Vza19wZWVyX3BpZCwgY3BybS1cdTAwM2VwaWQpKSlcbiBcdFx0cmV0dXJuIGZhbHNlO1xuIFxuIFx0Y3BybS1cdTAwM2VsaW1pdCA9IFJMSU1fSU5GSU5JVFk7XG5kaWZmIC0tZ2l0IGEvZnMvcGlkZnMuYyBiL2ZzL3BpZGZzLmNcbmluZGV4IGE2YTY0M2YxNWQwOGEuLjI5Mjk5YjJjN2NhNzEgMTAwNjQ0XG4tLS0gYS9mcy9waWRmcy5jXG4rKysgYi9mcy9waWRmcy5jXG5AQCAtNzkzLDkgKzc5Myw5IEBAIHZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcbiB9XG4gXG4gI2lmZGVmIENPTkZJR19DT1JFRFVNUFxuLXZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbitzdGF0aWMgdm9pZCBwaWRmc19jb3JlZHVtcF9waWQoc3RydWN0IHBpZCAqcGlkLFxuK1x0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuIHtcbi1cdHN0cnVjdCBwaWQgKnBpZCA9IGNwcm0tXHUwMDNlcGlkO1xuIFx0c3RydWN0IHBpZGZzX2F0dHIgKmF0dHI7XG4gXG4gXHRhdHRyID0gUkVBRF9PTkNFKHBpZC1cdTAwM2VhdHRyKTtcbkBAIC04MTQsNiArODE0LDEzIEBAIHZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcbiBcdHNtcF93bWIoKTtcbiBcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFx1MDAyNmF0dHItXHUwMDNlYXR0cl9tYXNrKTtcbiB9XG4rXG4rdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuK3tcbitcdC8qIFRoZSBkdW1waW5nIHRocmVhZCdzIHBpZGZkIHJlcG9ydHMgdGhlIGNvcmVkdW1wIGFzIHdlbGwuICovXG4rXHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFx1MDAzYz0gcGlkc19sYXN0KGNwcm0tXHUwMDNlcGlkKTsgdHlwZSsrKVxuK1x0XHRwaWRmc19jb3JlZHVtcF9waWQoY3BybS1cdTAwM2VwaWRbdHlwZV0sIGNwcm0pO1xuK31cbiAjZW5kaWZcbiBcbiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpwaWRmc19tbnQgX19yb19hZnRlcl9pbml0O1xuQEAgLTEwNzAsNiArMTA3NywyMiBAQCBpbnQgcGlkZnNfcmVnaXN0ZXJfcGlkX2dmcChzdHJ1Y3QgcGlkICpwaWQsIGdmcF90IGdmcClcbiBcdHJldHVybiAwO1xuIH1cbiBcbisvKiBSZWdpc3RlciB0aGUgcGlkcyB1cCB0byBwaWQgdHlwZSBAbGFzdCBvZiBAcGlkcyBpbiBwaWRmcy4gKi9cbitpbnQgX19waWRmc19yZWdpc3Rlcl9waWRzKHN0cnVjdCBwaWQgKmNvbnN0ICpwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QpXG4re1xuK1x0aWYgKFdBUk5fT05fT05DRShsYXN0IFx1MDAzZT0gUElEVFlQRV9NQVgpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcbitcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBsYXN0OyB0eXBlKyspIHtcbitcdFx0aW50IHJldCA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWRzW3R5cGVdKTtcbitcbitcdFx0aWYgKHVubGlrZWx5KHJldCkpXG4rXHRcdFx0cmV0dXJuIHJldDtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqcGlkZnNfc3Rhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKipzdGFzaGVkLFxuIFx0XHRcdFx0XHQgc3RydWN0IGRlbnRyeSAqZGVudHJ5KVxuIHtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmggYi9pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmhcbmluZGV4IDdiMzhlZTJlNzkxM2IuLjBiYmI3ZGU2YTQwMjEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2NvcmVkdW1wLmhcbisrKyBiL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaFxuQEAgLTUsNiArNSw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21tLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9mcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGlkX3R5cGVzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9zY2hlZC9jb3JlZHVtcC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjYXNtL3NpZ2luZm8uaFx1MDAzZVxuIFxuQEAgLTMyLDcgKzMzLDggQEAgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyB7XG4gXHRpbnQgdm1hX2NvdW50O1xuIFx0c2l6ZV90IHZtYV9kYXRhX3NpemU7XG4gXHRzdHJ1Y3QgY29yZV92bWFfbWV0YWRhdGEgKnZtYV9tZXRhO1xuLVx0c3RydWN0IHBpZCAqcGlkO1xuK1x0LyogRHVtcGluZyB0aHJlYWQgYW5kIGl0cyB0aHJlYWQtZ3JvdXAgbGVhZGVyIGJ5IHBpZCB0eXBlLiAqL1xuK1x0REVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTtcbiB9O1xuIFxuIGV4dGVybiB1bnNpZ25lZCBpbnQgY29yZV9maWxlX25vdGVfc2l6ZV9saW1pdDtcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZC5oIGIvaW5jbHVkZS9saW51eC9waWQuaFxuaW5kZXggZGRhZWYwYmJjOGJhMy4uODc2MzVkMGNjMWY3MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvcGlkLmhcbisrKyBiL2luY2x1ZGUvbGludXgvcGlkLmhcbkBAIC0yLDYgKzIsOSBAQFxuICNpZm5kZWYgX0xJTlVYX1BJRF9IXG4gI2RlZmluZSBfTElOVVhfUElEX0hcbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9hcnJheV9zaXplLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9idWlsZF9idWcuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21pbm1heC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvcGlkX3R5cGVzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VsaXN0LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9yY3VwZGF0ZS5oXHUwMDNlXG5AQCAtOTIsNiArOTUsNTYgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkICpnZXRfcGlkKHN0cnVjdCBwaWQgKnBpZClcbiB9XG4gXG4gZXh0ZXJuIHZvaWQgcHV0X3BpZChzdHJ1Y3QgcGlkICpwaWQpO1xuK1xuKy8qXG4rICogSGVscGVycyBmb3IgYXJyYXlzIG9mIHN0cnVjdCBwaWQgaW5kZXhlZCBieSBwaWQgdHlwZSBkZWNsYXJlZCB3aXRoXG4rICogREVDTEFSRV9QSURTKCkuIFRoZSBhcnJheSBjb3ZlcnMgUElEVFlQRV9QSUQgdXAgdG8gdGhlIHBpZCB0eXBlIGl0XG4rICogd2FzIGRlY2xhcmVkIHdpdGggYW5kIHRoZSBoZWxwZXJzIHRha2UgdGhhdCBib3VuZCBmcm9tIHRoZSBhcnJheS5cbisgKi9cbitzdGF0aWMgaW5saW5lIHZvaWQgX19nZXRfcGlkcyhzdHJ1Y3QgcGlkICoqZHN0LCBzdHJ1Y3QgcGlkICpjb25zdCAqc3JjLFxuK1x0XHRcdCAgICAgIGVudW0gcGlkX3R5cGUgbGFzdClcbit7XG4rXHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFx1MDAzYz0gbGFzdDsgdHlwZSsrKVxuK1x0XHRkc3RbdHlwZV0gPSBnZXRfcGlkKHNyY1t0eXBlXSk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B1dF9waWRzKHN0cnVjdCBwaWQgKipwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QpXG4re1xuK1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUrKykge1xuK1x0XHRwdXRfcGlkKHBpZHNbdHlwZV0pO1xuK1x0XHRwaWRzW3R5cGVdID0gTlVMTDtcbitcdH1cbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIF9fc3dhcF9waWRzKHN0cnVjdCBwaWQgKiphLCBzdHJ1Y3QgcGlkICoqYixcbitcdFx0XHQgICAgICAgZW51bSBwaWRfdHlwZSBsYXN0KVxuK3tcbitcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBsYXN0OyB0eXBlKyspXG4rXHRcdHN3YXAoYVt0eXBlXSwgYlt0eXBlXSk7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3BpZHNfZXF1YWwoc3RydWN0IHBpZCAqY29uc3QgKmEsIHN0cnVjdCBwaWQgKmNvbnN0ICpiLFxuK1x0XHRcdFx0ZW51bSBwaWRfdHlwZSBsYXN0KVxuK3tcbitcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBsYXN0OyB0eXBlKyspXG4rXHRcdGlmIChhW3R5cGVdICE9IGJbdHlwZV0pXG4rXHRcdFx0cmV0dXJuIGZhbHNlO1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qIFRoZSBsYXN0IHBpZCB0eXBlIGFuIGFycmF5IGRlY2xhcmVkIHdpdGggREVDTEFSRV9QSURTKCkgY292ZXJzLiAqL1xuKyNkZWZpbmUgcGlkc19sYXN0KHBpZHMpXHRcdFx0XHRcdFx0XHRcXFxuK1x0KChlbnVtIHBpZF90eXBlKShBUlJBWV9TSVpFKHBpZHMpIC0gMSArXHRcdFx0XHRcXFxuK1x0XHRcdCBCVUlMRF9CVUdfT05fWkVSTyhBUlJBWV9TSVpFKHBpZHMpIFx1MDAzZSBQSURUWVBFX01BWCkpKVxuK1xuKyNkZWZpbmUgX19waWRzX2xhc3QyKGEsIGIpXHRcdFx0XHRcdFx0XFxcbitcdChwaWRzX2xhc3QoYSkgKyBCVUlMRF9CVUdfT05fWkVSTyhBUlJBWV9TSVpFKGEpICE9IEFSUkFZX1NJWkUoYikpKVxuK1xuKyNkZWZpbmUgZ2V0X3BpZHMoZHN0LCBzcmMpXHRfX2dldF9waWRzKGRzdCwgc3JjLCBfX3BpZHNfbGFzdDIoZHN0LCBzcmMpKVxuKyNkZWZpbmUgcHV0X3BpZHMocGlkcylcdFx0X19wdXRfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcykpXG4rI2RlZmluZSBzd2FwX3BpZHMoYSwgYilcdFx0X19zd2FwX3BpZHMoYSwgYiwgX19waWRzX2xhc3QyKGEsIGIpKVxuKyNkZWZpbmUgcGlkc19lcXVhbChhLCBiKVx0X19waWRzX2VxdWFsKGEsIGIsIF9fcGlkc19sYXN0MihhLCBiKSlcbitcbiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpwaWRfdGFzayhzdHJ1Y3QgcGlkICpwaWQsIGVudW0gcGlkX3R5cGUpO1xuIHN0YXRpYyBpbmxpbmUgYm9vbCBwaWRfaGFzX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpXG4ge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oXG5pbmRleCBjMmFlZTFkOTFkY2ZkLi4zMzAyNjkwYTJhMjgxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaFxuKysrIGIvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaFxuQEAgLTIsNiArMiw4IEBAXG4gI2lmbmRlZiBfTElOVVhfUElEX1RZUEVTX0hcbiAjZGVmaW5lIF9MSU5VWF9QSURfVFlQRVNfSFxuIFxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1aWxkX2J1Zy5oXHUwMDNlXG4rXG4gZW51bSBwaWRfdHlwZSB7XG4gXHRQSURUWVBFX1BJRCxcbiBcdFBJRFRZUEVfVEdJRCxcbkBAIC0xMCw2ICsxMiwxMiBAQCBlbnVtIHBpZF90eXBlIHtcbiBcdFBJRFRZUEVfTUFYLFxuIH07XG4gXG4rc3RydWN0IHBpZDtcbitcbisvKiBBbiBhcnJheSBvZiBzdHJ1Y3QgcGlkIGluZGV4ZWQgYnkgcGlkIHR5cGUsIFBJRFRZUEVfUElEIHVwIHRvIEBsYXN0LiAqL1xuKyNkZWZpbmUgREVDTEFSRV9QSURTKG5hbWUsIGxhc3QpXHRcdFx0XHRcdFxcXG4rXHRzdHJ1Y3QgcGlkICpuYW1lWyhsYXN0KSArIDEgKyBCVUlMRF9CVUdfT05fWkVSTygobGFzdCkgXHUwMDNlPSBQSURUWVBFX01BWCldXG4rXG4gc3RydWN0IHBpZF9uYW1lc3BhY2U7XG4gZXh0ZXJuIHN0cnVjdCBwaWRfbmFtZXNwYWNlIGluaXRfcGlkX25zO1xuIFxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkZnMuaCBiL2luY2x1ZGUvbGludXgvcGlkZnMuaFxuaW5kZXggMGFiZjdkYTlhYjIzNi4uM2MxZTgyZjFhMzY5MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvcGlkZnMuaFxuKysrIGIvaW5jbHVkZS9saW51eC9waWRmcy5oXG5AQCAtMyw2ICszLDcgQEBcbiAjZGVmaW5lIF9MSU5VWF9QSURfRlNfSFxuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2dmcF90eXBlcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvcGlkLmhcdTAwM2VcbiBcbiBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zO1xuIFxuQEAgLTMyLDUgKzMzLDkgQEAgc3RhdGljIGlubGluZSBpbnQgcGlkZnNfcmVnaXN0ZXJfcGlkKHN0cnVjdCBwaWQgKnBpZClcbiB9XG4gXG4gdm9pZCBwaWRmc19mcmVlX3BpZChzdHJ1Y3QgcGlkICpwaWQpO1xuK2ludCBfX3BpZGZzX3JlZ2lzdGVyX3BpZHMoc3RydWN0IHBpZCAqY29uc3QgKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdCk7XG4rXG4rLyogUmVnaXN0ZXIgdGhlIHBpZHMgb2YgYW4gYXJyYXkgZGVjbGFyZWQgd2l0aCBERUNMQVJFX1BJRFMoKS4gKi9cbisjZGVmaW5lIHBpZGZzX3JlZ2lzdGVyX3BpZHMocGlkcylcdF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcykpXG4gXG4gI2VuZGlmIC8qIF9MSU5VWF9QSURfRlNfSCAqL1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5pbmRleCA1ODRhZTg4YjQzNWU5Li45NDQ0YjQ3Nzg5YTA4IDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaFxuQEAgLTY3Nyw2ICs2NzcsMjQgQEAgc3RydWN0IHBpZCAqdGFza19waWRfdHlwZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGVudW0gcGlkX3R5cGUgdHlwZSlcbiBcdHJldHVybiBwaWQ7XG4gfVxuIFxuKy8qIEZpbGwgQHBpZHMgd2l0aCB0aGUgcGlkIHR5cGVzIG9mIEB0YXNrIHVwIHRvIEBsYXN0LCB3aXRob3V0IHJlZmVyZW5jZXMuICovXG4rc3RhdGljIGlubGluZSB2b2lkIF9fdGFza19waWRzKHN0cnVjdCBwaWQgKipwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QsXG4rXHRcdFx0ICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbit7XG4rXHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFx1MDAzYz0gbGFzdDsgdHlwZSsrKVxuK1x0XHRwaWRzW3R5cGVdID0gdGFza19waWRfdHlwZSh0YXNrLCB0eXBlKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIF9fZ2V0X3Rhc2tfcGlkcyhzdHJ1Y3QgcGlkICoqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0LFxuK1x0XHRcdFx0ICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuK3tcbitcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBsYXN0OyB0eXBlKyspXG4rXHRcdHBpZHNbdHlwZV0gPSBnZXRfcGlkKHRhc2tfcGlkX3R5cGUodGFzaywgdHlwZSkpO1xuK31cbitcbisjZGVmaW5lIHRhc2tfcGlkcyhwaWRzLCB0YXNrKVx0XHRfX3Rhc2tfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcyksIHRhc2spXG4rI2RlZmluZSBnZXRfdGFza19waWRzKHBpZHMsIHRhc2spXHRfX2dldF90YXNrX3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpLCB0YXNrKVxuK1xuIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBpZCAqdGFza190Z2lkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaylcbiB7XG4gXHRyZXR1cm4gdGFzay1cdTAwM2VzaWduYWwtXHUwMDNlcGlkc1tQSURUWVBFX1RHSURdO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjbS5oIGIvaW5jbHVkZS9uZXQvc2NtLmhcbmluZGV4IDg2YWU2YmMxMDllYzYuLmFhN2QxNWM1ZmMyNzEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9zY20uaFxuKysrIGIvaW5jbHVkZS9uZXQvc2NtLmhcbkBAIC00Miw3ICs0Miw3IEBAIHN0cnVjdCBzY21fZnBfbGlzdCB7XG4gfTtcbiBcbiBzdHJ1Y3Qgc2NtX2Nvb2tpZSB7XG4tXHRzdHJ1Y3QgcGlkXHRcdCpwaWQ7XHRcdC8qIFNrYiBjcmVkZW50aWFscyAqL1xuK1x0REVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTtcdC8qIFNrYiBjcmVkZW50aWFscyBieSBwaWQgdHlwZSAqL1xuIFx0c3RydWN0IHNjbV9mcF9saXN0XHQqZnA7XHRcdC8qIFBhc3NlZCBmaWxlc1x0XHQqL1xuIFx0c3RydWN0IHNjbV9jcmVkc1x0Y3JlZHM7XHRcdC8qIFNrYiBjcmVkZW50aWFsc1x0Ki9cbiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktcbkBAIC02OSw3ICs2OSw3IEBAIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdW5peF9nZXRfcGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc2NtX2NvXG4gc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSxcbiBcdFx0XHRcdCAgICBzdHJ1Y3QgcGlkICpwaWQsIGt1aWRfdCB1aWQsIGtnaWRfdCBnaWQpXG4ge1xuLVx0c2NtLVx1MDAzZXBpZCA9IGdldF9waWQocGlkKTtcbitcdHNjbS1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSA9IGdldF9waWQocGlkKTtcbiBcdHNjbS1cdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHBpZCk7XG4gXHRzY20tXHUwMDNlY3JlZHMudWlkID0gdWlkO1xuIFx0c2NtLVx1MDAzZWNyZWRzLmdpZCA9IGdpZDtcbkBAIC03Nyw4ICs3Nyw3IEBAIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX3NldF9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20sXG4gXG4gc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveV9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20pXG4ge1xuLVx0cHV0X3BpZChzY20tXHUwMDNlcGlkKTtcbi1cdHNjbS1cdTAwM2VwaWQgPSBOVUxMO1xuK1x0cHV0X3BpZHMoc2NtLVx1MDAzZXBpZCk7XG4gfVxuIFxuIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zb2NrLmggYi9pbmNsdWRlL25ldC9zb2NrLmhcbmluZGV4IDUxMTg1MjIyYWFjMjkuLjY3Yjc0M2JhYjIyMGUgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL25ldC9zb2NrLmhcbisrKyBiL2luY2x1ZGUvbmV0L3NvY2suaFxuQEAgLTMwMSw3ICszMDEsNyBAQCBzdHJ1Y3Qgc2tfZmlsdGVyO1xuICAgKlx0QHNrX3R5cGU6IHNvY2tldCB0eXBlICglU09DS19TVFJFQU0sIGV0YylcbiAgICpcdEBza19wcm90b2NvbDogd2hpY2ggcHJvdG9jb2wgdGhpcyBzb2NrZXQgYmVsb25ncyBpbiB0aGlzIG5ldHdvcmsgZmFtaWx5XG4gICAqXHRAc2tfcGVlcl9sb2NrOiBsb2NrIHByb3RlY3RpbmcgQHNrX3BlZXJfcGlkIGFuZCBAc2tfcGVlcl9jcmVkXG4tICAqXHRAc2tfcGVlcl9waWQ6IFx1MDAyNnN0cnVjdCBwaWQgZm9yIHRoaXMgc29ja2V0J3MgcGVlclxuKyAgKlx0QHNrX3BlZXJfcGlkOiBcdTAwMjZzdHJ1Y3QgcGlkIGZvciB0aGlzIHNvY2tldCdzIHBlZXIsIGJ5IHBpZCB0eXBlXG4gICAqXHRAc2tfcGVlcl9jcmVkOiAlU09fUEVFUkNSRUQgc2V0dGluZ1xuICAgKlx0QHNrX3Jjdmxvd2F0OiAlU09fUkNWTE9XQVQgc2V0dGluZ1xuICAgKlx0QHNrX3JjdnRpbWVvOiAlU09fUkNWVElNRU8gc2V0dGluZ1xuQEAgLTM1Niw2ICszNTYsNyBAQCBzdHJ1Y3Qgc2tfZmlsdGVyO1xuICAgKlx0QHNrX3NjbV9zZWN1cml0eTogZmxhZ2dlZCBieSBTT19QQVNTU0VDIHRvIHJlY3YgU0NNX1NFQ1VSSVRZXG4gICAqXHRAc2tfc2NtX3BpZGZkOiBmbGFnZ2VkIGJ5IFNPX1BBU1NQSURGRCB0byByZWN2IFNDTV9QSURGRFxuICAgKlx0QHNrX3NjbV9yaWdodHM6IGZsYWdnZWQgYnkgU09fUEFTU1JJR0hUUyB0byByZWN2IFNDTV9SSUdIVFNcbisgICpcdEBza19zY21fcGlkZmRfdGhyZWFkOiBmbGFnZ2VkIGJ5IFNPX1BBU1NQSURGRF9USFJFQUQgdG8gcmVjdiBhIHRocmVhZCBTQ01fUElERkRcbiAgICpcdEBza19zY21fdW51c2VkOiB1bnVzZWQgZmxhZ3MgZm9yIHNjbV9yZWN2KClcbiAgICpcdEBuc190cmFja2VyOiB0cmFja2VyIGZvciBuZXRucyByZWZlcmVuY2VcbiAgICpcdEBza191c2VyX2ZyYWdzOiB4YXJyYXkgb2YgcGFnZXMgdGhlIHVzZXIgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSBvbi5cbkBAIC01NDUsNyArNTQ2LDcgQEAgc3RydWN0IHNvY2sge1xuIFx0dTY0XHRcdFx0c2tfaW5vO1xuIFx0c3BpbmxvY2tfdFx0XHRza19wZWVyX2xvY2s7XG4gXHRpbnRcdFx0XHRza19iaW5kX3BoYztcbi1cdHN0cnVjdCBwaWRcdFx0KnNrX3BlZXJfcGlkO1xuK1x0REVDTEFSRV9QSURTKHNrX3BlZXJfcGlkLCBQSURUWVBFX1RHSUQpO1xuIFx0Y29uc3Qgc3RydWN0IGNyZWRcdCpza19wZWVyX2NyZWQ7XG4gXG4gXHRrdGltZV90XHRcdFx0c2tfc3RhbXA7XG5AQCAtNTYyLDcgKzU2Myw4IEBAIHN0cnVjdCBzb2NrIHtcbiBcdFx0XHRcdHNrX3NjbV9zZWN1cml0eSA6IDEsXG4gXHRcdFx0XHRza19zY21fcGlkZmQgOiAxLFxuIFx0XHRcdFx0c2tfc2NtX3JpZ2h0cyA6IDEsXG4tXHRcdFx0XHRza19zY21fdW51c2VkIDogNDtcbitcdFx0XHRcdHNrX3NjbV9waWRmZF90aHJlYWQgOiAxLFxuK1x0XHRcdFx0c2tfc2NtX3VudXNlZCA6IDM7XG4gXHRcdH07XG4gXHR9O1xuIFx0dThcdFx0XHRza19jbG9ja2lkO1xuQEAgLTI5ODYsNiArMjk4OCwxMiBAQCBzdGF0aWMgaW5saW5lIGJvb2wgc2tfaXNfc3RyZWFtX3VuaXgoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxuIFx0cmV0dXJuIHNrX2lzX3VuaXgoc2spIFx1MDAyNlx1MDAyNiBzay1cdTAwM2Vza190eXBlID09IFNPQ0tfU1RSRUFNO1xuIH1cbiBcbisvKiBTT19QQVNTUElERkQgb3IgU09fUEFTU1BJREZEX1RIUkVBRCBhc2tlZCBmb3IgYW4gU0NNX1BJREZELiAqL1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBza19zY21fcGlkZmRfd2FudGVkKGNvbnN0IHN0cnVjdCBzb2NrICpzaylcbit7XG4rXHRyZXR1cm4gc2stXHUwMDNlc2tfc2NtX3BpZGZkIHx8IHNrLVx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQ7XG4rfVxuK1xuIHN0YXRpYyBpbmxpbmUgYm9vbCBza19pc192c29jayhjb25zdCBzdHJ1Y3Qgc29jayAqc2spXG4ge1xuIFx0cmV0dXJuIHNrLVx1MDAzZXNrX2ZhbWlseSA9PSBBRl9WU09DSztcbmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmggYi9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmhcbmluZGV4IDg0ZWE3YjkyOTM2ZTIuLjU2ZmVkN2FiMjdhYjggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvc29ja2V0LmhcbisrKyBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaFxuQEAgLTE1Miw2ICsxNTIsMTAgQEBcbiBcbiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DXHQ4NVxuIFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRFx0ODZcbitcbisjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQURcdDg3XG4rXG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXG4gXG4gI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NCB8fCAoZGVmaW5lZChfX3g4Nl82NF9fKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChfX0lMUDMyX18pKVxuZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jXG5pbmRleCA0MTFkNjZmMjQzOTNkLi43NzU4ZTllYTM4NDhjIDEwMDY0NFxuLS0tIGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguY1xuKysrIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguY1xuQEAgLTE2MSw3ICsxNjEsNyBAQCBzdHJ1Y3Qgc29jayAqYnRfc29ja19hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssXG4gXHQvKiBJbml0IHBlZXIgaW5mb3JtYXRpb24gc28gaXQgY2FuIGJlIHByb3Blcmx5IG1vbml0b3JlZCAqL1xuIFx0aWYgKCFrZXJuKSB7XG4gXHRcdHNwaW5fbG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuLVx0XHRzay1cdTAwM2Vza19wZWVyX3BpZCAgPSBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSk7XG4rXHRcdHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0gID0gZ2V0X3BpZCh0YXNrX3RnaWQoY3VycmVudCkpO1xuIFx0XHRzay1cdTAwM2Vza19wZWVyX2NyZWQgPSBnZXRfY3VycmVudF9jcmVkKCk7XG4gXHRcdHNwaW5fdW5sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4gXHR9XG5AQCAtMjM1LDkgKzIzNSw5IEBAIHZvaWQgYnRfYWNjZXB0X2VucXVldWUoc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKnNrLCBib29sIGJoKVxuIFx0ICogc29ja2V0IGlzIGFsbG9jYXRlZCBieSB0aGUga2VybmVsLlxuIFx0ICovXG4gXHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdG9sZF9waWQgPSBzay1cdTAwM2Vza19wZWVyX3BpZDtcbitcdG9sZF9waWQgPSBzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdO1xuIFx0b2xkX2NyZWQgPSBzay1cdTAwM2Vza19wZWVyX2NyZWQ7XG4tXHRzay1cdTAwM2Vza19wZWVyX3BpZCA9IGdldF9waWQocGFyZW50LVx1MDAzZXNrX3BlZXJfcGlkKTtcbitcdHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0gPSBnZXRfcGlkKHBhcmVudC1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKTtcbiBcdHNrLVx1MDAzZXNrX3BlZXJfY3JlZCA9IGdldF9jcmVkKHBhcmVudC1cdTAwM2Vza19wZWVyX2NyZWQpO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiBcbmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNcbmluZGV4IDA3MGNhMzg4ZjlhY2UuLjkxZTQ3MzhlYWJkYjAgMTAwNjQ0XG4tLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNcbisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suY1xuQEAgLTI3MywyMSArMjczLDIxIEBAIHN0YXRpYyB2b2lkIGhjaV9zb2NrX2NvcHlfY3JlZHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIFx0Y3JlZHMgPSBcdTAwMjZidF9jYihza2IpLVx1MDAzZWNyZWRzO1xuIFxuIFx0LyogQ2hlY2sgaWYgcGVlciBjcmVkZW50aWFscyBpcyBzZXQgKi9cbi1cdGlmICghc2stXHUwMDNlc2tfcGVlcl9waWQpIHtcbitcdGlmICghc2stXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkge1xuIFx0XHQvKiBDaGVjayBpZiBwYXJlbnQgcGVlciBjcmVkZW50aWFscyBpcyBzZXQgKi9cbi1cdFx0aWYgKGJ0X3NrKHNrKS1cdTAwM2VwYXJlbnQgXHUwMDI2XHUwMDI2IGJ0X3NrKHNrKS1cdTAwM2VwYXJlbnQtXHUwMDNlc2tfcGVlcl9waWQpXG4rXHRcdGlmIChidF9zayhzayktXHUwMDNlcGFyZW50IFx1MDAyNlx1MDAyNiBidF9zayhzayktXHUwMDNlcGFyZW50LVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pXG4gXHRcdFx0c2sgPSBidF9zayhzayktXHUwMDNlcGFyZW50O1xuIFx0XHRlbHNlXG4gXHRcdFx0cmV0dXJuO1xuIFx0fVxuIFxuIFx0LyogQ2hlY2sgaWYgc2NtX2NyZWRzIGFscmVhZHkgc2V0ICovXG4tXHRpZiAoY3JlZHMtXHUwMDNlcGlkID09IHBpZF92bnIoc2stXHUwMDNlc2tfcGVlcl9waWQpKVxuK1x0aWYgKGNyZWRzLVx1MDAzZXBpZCA9PSBwaWRfdm5yKHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pKVxuIFx0XHRyZXR1cm47XG4gXG4gXHRtZW1zZXQoY3JlZHMsIDAsIHNpemVvZigqY3JlZHMpKTtcbiBcbi1cdGNyZWRzLVx1MDAzZXBpZCA9IHBpZF92bnIoc2stXHUwMDNlc2tfcGVlcl9waWQpO1xuK1x0Y3JlZHMtXHUwMDNlcGlkID0gcGlkX3Zucihzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKTtcbiBcdGlmIChzay1cdTAwM2Vza19wZWVyX2NyZWQpIHtcbiBcdFx0Y3JlZHMtXHUwMDNldWlkID0gc2stXHUwMDNlc2tfcGVlcl9jcmVkLVx1MDAzZXVpZDtcbiBcdFx0Y3JlZHMtXHUwMDNlZ2lkID0gc2stXHUwMDNlc2tfcGVlcl9jcmVkLVx1MDAzZWdpZDtcbmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jXG5pbmRleCAxMTk0YzM3ZTQ2NmYxLi44NzJkOGZiMzFiNmZiIDEwMDY0NFxuLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmNcbisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jXG5AQCAtMTg5MCw3ICsxODkwLDcgQEAgc3RhdGljIHN0cnVjdCBwaWQgKmwyY2FwX3NvY2tfZ2V0X3BlZXJfcGlkX2NiKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKVxuIHtcbiBcdHN0cnVjdCBzb2NrICpzayA9IGNoYW4tXHUwMDNlZGF0YTtcbiBcbi1cdHJldHVybiBzay1cdTAwM2Vza19wZWVyX3BpZDtcbitcdHJldHVybiBzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBsMmNhcF9zb2NrX3N1c3BlbmRfY2Ioc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pXG5kaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2NtLmMgYi9uZXQvY29yZS9zY20uY1xuaW5kZXggZjBkNDRlY2RiMTFmYy4uZDY5NzY4NDE0YWY0OCAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL3NjbS5jXG4rKysgYi9uZXQvY29yZS9zY20uY1xuQEAgLTE0OSw2ICsxNDksNyBAQCBFWFBPUlRfU1lNQk9MKF9fc2NtX2Rlc3Ryb3kpO1xuIFxuIHN0YXRpYyBpbmxpbmUgaW50IHNjbV9yZXBsYWNlX3BpZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3QgcGlkICpwaWQpXG4ge1xuK1x0c3RydWN0IHBpZCAqdGhyZWFkX3BpZDtcbiBcdGludCBlcnI7XG4gXG4gXHQvKiBkcm9wIGFsbCBwcmV2aW91cyByZWZlcmVuY2VzICovXG5AQCAtMTU4LDcgKzE1OSwxOCBAQCBzdGF0aWMgaW5saW5lIGludCBzY21fcmVwbGFjZV9waWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHBpZCAqcGlkKVxuIFx0aWYgKHVubGlrZWx5KGVycikpXG4gXHRcdHJldHVybiBlcnI7XG4gXG4tXHRzY20tXHUwMDNlcGlkID0gcGlkO1xuK1x0LyogQSBzZW5kZXIgbmFtaW5nIGl0cyBvd24gdGhyZWFkLWdyb3VwIHNlbmRzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLiAqL1xuK1x0aWYgKHBpZCA9PSB0YXNrX3RnaWQoY3VycmVudCkpXG4rXHRcdHRocmVhZF9waWQgPSB0YXNrX3BpZChjdXJyZW50KTtcbitcdGVsc2VcbitcdFx0dGhyZWFkX3BpZCA9IHBpZDtcbitcbitcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZCh0aHJlYWRfcGlkKTtcbitcdGlmICh1bmxpa2VseShlcnIpKVxuK1x0XHRyZXR1cm4gZXJyO1xuK1xuK1x0c2NtLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdID0gcGlkO1xuK1x0c2NtLVx1MDAzZXBpZFtQSURUWVBFX1BJRF0gPSBnZXRfcGlkKHRocmVhZF9waWQpO1xuIFx0c2NtLVx1MDAzZWNyZWRzLnBpZCA9IHBpZF92bnIocGlkKTtcbiBcdHJldHVybiAwO1xuIH1cbkBAIC0yMDcsNyArMjE5LDggQEAgaW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqcClcbiBcdFx0XHRpZiAoZXJyKVxuIFx0XHRcdFx0Z290byBlcnJvcjtcbiBcbi1cdFx0XHRpZiAoIXAtXHUwMDNlcGlkIHx8IHBpZF92bnIocC1cdTAwM2VwaWQpICE9IGNyZWRzLnBpZCkge1xuK1x0XHRcdGlmICghcC1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSB8fFxuK1x0XHRcdCAgICBwaWRfdm5yKHAtXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0pICE9IGNyZWRzLnBpZCkge1xuIFx0XHRcdFx0c3RydWN0IHBpZCAqcGlkO1xuIFx0XHRcdFx0ZXJyID0gLUVTUkNIO1xuIFx0XHRcdFx0cGlkID0gZmluZF9nZXRfcGlkKGNyZWRzLnBpZCk7XG5AQCAtNDg2LDkgKzQ5OSwxMyBAQCBzdGF0aWMgYm9vbCBzY21faGFzX3NlY2RhdGEoc3RydWN0IHNvY2sgKnNrKVxuIH1cbiAjZW5kaWZcbiBcbi1zdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pXG4rc3RhdGljIHZvaWQgc2NtX3BpZGZkX3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4rXHRcdFx0ICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiB7XG4rXHRlbnVtIHBpZF90eXBlIHR5cGUgPSBzay1cdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkID8gUElEVFlQRV9QSUQgOiBQSURUWVBFX1RHSUQ7XG4rXHRzdHJ1Y3QgcGlkICpwaWQgPSBzY20tXHUwMDNlcGlkW3R5cGVdO1xuIFx0c3RydWN0IGZpbGUgKnBpZGZkX2ZpbGUgPSBOVUxMO1xuK1x0dW5zaWduZWQgaW50IGZsYWdzID0gUElERkRfU1RBTEU7XG4gXHRpbnQgbGVuLCBwaWRmZDtcbiBcbiBcdC8qIHB1dF9jbXNnKCkgZG9lc24ndCByZXR1cm4gYW4gZXJyb3IgaWYgQ01TRyBpcyB0cnVuY2F0ZWQsXG5AQCAtNTA0LDEwICs1MjEsMTMgQEAgc3RhdGljIHZvaWQgc2NtX3BpZGZkX3JlY3Yoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuIFx0XHRyZXR1cm47XG4gXHR9XG4gXG4tXHRpZiAoIXNjbS1cdTAwM2VwaWQpXG4rXHRpZiAoIXBpZClcbiBcdFx0cmV0dXJuO1xuIFxuLVx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHNjbS1cdTAwM2VwaWQsIFBJREZEX1NUQUxFLCBcdTAwMjZwaWRmZF9maWxlKTtcbitcdGlmICh0eXBlID09IFBJRFRZUEVfUElEKVxuK1x0XHRmbGFncyB8PSBQSURGRF9USFJFQUQ7XG4rXG4rXHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGlkLCBmbGFncywgXHUwMDI2cGlkZmRfZmlsZSk7XG4gXG4gXHRpZiAocHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTQ01fUElERkQsIHNpemVvZihpbnQpLCBcdTAwMjZwaWRmZCkpIHtcbiBcdFx0aWYgKHBpZGZkX2ZpbGUpIHtcbkBAIC01MjYsNyArNTQ2LDcgQEAgc3RhdGljIGJvb2wgX19zY21fcmVjdl9jb21tb24oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csXG4gXHRcdFx0ICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKVxuIHtcbiBcdGlmICghbXNnLVx1MDAzZW1zZ19jb250cm9sKSB7XG4tXHRcdGlmIChzay1cdTAwM2Vza19zY21fY3JlZGVudGlhbHMgfHwgc2stXHUwMDNlc2tfc2NtX3BpZGZkIHx8XG4rXHRcdGlmIChzay1cdTAwM2Vza19zY21fY3JlZGVudGlhbHMgfHwgc2tfc2NtX3BpZGZkX3dhbnRlZChzaykgfHxcbiBcdFx0ICAgIHNjbS1cdTAwM2VmcCB8fCBzY21faGFzX3NlY2RhdGEoc2spKVxuIFx0XHRcdG1zZy1cdTAwM2Vtc2dfZmxhZ3MgfD0gTVNHX0NUUlVOQztcbiBcbkBAIC01NzMsOCArNTkzLDggQEAgdm9pZCBzY21fcmVjdl91bml4KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbiBcdFx0c2NtX2RldGFjaF9mZHMobXNnLCBzY20sIFJFQURfT05DRSh1LVx1MDAzZXNjbV9yaWdodHNfbm90cnVuYykpO1xuIFx0fVxuIFxuLVx0aWYgKHNvY2stXHUwMDNlc2stXHUwMDNlc2tfc2NtX3BpZGZkKVxuLVx0XHRzY21fcGlkZmRfcmVjdihtc2csIHNjbSk7XG4rXHRpZiAoc2tfc2NtX3BpZGZkX3dhbnRlZChzb2NrLVx1MDAzZXNrKSlcbitcdFx0c2NtX3BpZGZkX3JlY3Yoc29jay1cdTAwM2VzaywgbXNnLCBzY20pO1xuIFxuIFx0c2NtX2Rlc3Ryb3lfY3JlZChzY20pO1xuIH1cbmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmNcbmluZGV4IDFhZDQxOTA0ZGIyNWIuLmNiMmZmZDMyOWJjNjcgMTAwNjQ0XG4tLS0gYS9uZXQvY29yZS9zb2NrLmNcbisrKyBiL25ldC9jb3JlL3NvY2suY1xuQEAgLTE1NzEsMTAgKzE1NzEsMjUgQEAgaW50IHNrX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU09fUEFTU1BJREZEOlxuLVx0XHRpZiAoc2tfaXNfdW5peChzaykpXG4rXHRcdGlmIChza19pc191bml4KHNrKSkge1xuK1x0XHRcdC8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRF9USFJFQUQuICovXG4gXHRcdFx0c2stXHUwMDNlc2tfc2NtX3BpZGZkID0gdmFsYm9vbDtcbi1cdFx0ZWxzZVxuK1x0XHRcdGlmICh2YWxib29sKVxuK1x0XHRcdFx0c2stXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZCA9IDA7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0cmV0ID0gLUVPUE5PVFNVUFA7XG4rXHRcdH1cbitcdFx0YnJlYWs7XG4rXG4rXHRjYXNlIFNPX1BBU1NQSURGRF9USFJFQUQ6XG4rXHRcdGlmIChza19pc191bml4KHNrKSkge1xuK1x0XHRcdC8qIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFNPX1BBU1NQSURGRC4gKi9cbitcdFx0XHRzay1cdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkID0gdmFsYm9vbDtcbitcdFx0XHRpZiAodmFsYm9vbClcbitcdFx0XHRcdHNrLVx1MDAzZXNrX3NjbV9waWRmZCA9IDA7XG4rXHRcdH0gZWxzZSB7XG4gXHRcdFx0cmV0ID0gLUVPUE5PVFNVUFA7XG4rXHRcdH1cbiBcdFx0YnJlYWs7XG4gXG4gXHRjYXNlIFNPX1BBU1NSSUdIVFM6XG5AQCAtMTcyOCw2ICsxNzQzLDUwIEBAIHN0YXRpYyBpbnQgZ3JvdXBzX3RvX3VzZXIoc29ja3B0cl90IGRzdCwgY29uc3Qgc3RydWN0IGdyb3VwX2luZm8gKnNyYylcbiBcdHJldHVybiAwO1xuIH1cbiBcbisvKiBIYW5kIG91dCBhIHBpZGZkIGZvciBAdHlwZSBvZiB0aGUgc29ja2V0J3MgcGVlciB2aWEgU09fUEVFUlBJREZEKi4gKi9cbitzdGF0aWMgaW50IHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKHN0cnVjdCBzb2NrICpzaywgZW51bSBwaWRfdHlwZSB0eXBlLFxuK1x0XHRcdFx0ICAgc29ja3B0cl90IG9wdHZhbCwgc29ja3B0cl90IG9wdGxlbiwgaW50IGxlbilcbit7XG4rXHRzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwO1xuK1x0c3RydWN0IHBpZCAqcGVlcl9waWQ7XG4rXHRpbnQgcGlkZmQ7XG4rXG4rXHRpZiAobGVuIFx1MDAzZSBzaXplb2YocGlkZmQpKVxuK1x0XHRsZW4gPSBzaXplb2YocGlkZmQpO1xuK1xuK1x0c3Bpbl9sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4rXHRwZWVyX3BpZCA9IGdldF9waWQoc2stXHUwMDNlc2tfcGVlcl9waWRbdHlwZV0pO1xuK1x0c3Bpbl91bmxvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbitcbitcdGlmICghcGVlcl9waWQpXG4rXHRcdHJldHVybiAtRU5PREFUQTtcbitcbitcdC8qIFRoZSB1c2Ugb2YgUElERkRfU1RBTEUgcmVxdWlyZXMgc3Rhc2hpbmcgb2Ygc3RydWN0IHBpZCBvbiBwaWRmc1xuK1x0ICogd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuXG4rXHQgKi9cbitcdGlmIChzay1cdTAwM2Vza19mYW1pbHkgPT0gQUZfVU5JWClcbitcdFx0ZmxhZ3MgfD0gUElERkRfU1RBTEU7XG4rXHRpZiAodHlwZSA9PSBQSURUWVBFX1BJRClcbitcdFx0ZmxhZ3MgfD0gUElERkRfVEhSRUFEO1xuK1xuK1x0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBlZXJfcGlkLCBmbGFncywgXHUwMDI2cGlkZmRfZmlsZSk7XG4rXHRwdXRfcGlkKHBlZXJfcGlkKTtcbitcdGlmIChwaWRmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIHBpZGZkO1xuK1xuK1x0aWYgKGNvcHlfdG9fc29ja3B0cihvcHR2YWwsIFx1MDAyNnBpZGZkLCBsZW4pIHx8XG4rXHQgICAgY29weV90b19zb2NrcHRyKG9wdGxlbiwgXHUwMDI2bGVuLCBzaXplb2YoaW50KSkpIHtcbitcdFx0cHV0X3VudXNlZF9mZChwaWRmZCk7XG4rXHRcdGZwdXQocGlkZmRfZmlsZSk7XG4rXG4rXHRcdHJldHVybiAtRUZBVUxUO1xuK1x0fVxuK1xuK1x0ZmRfaW5zdGFsbChwaWRmZCwgcGlkZmRfZmlsZSk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4gaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0XHQgIHNvY2twdHJfdCBvcHR2YWwsIHNvY2twdHJfdCBvcHRsZW4pXG4ge1xuQEAgLTE4OTIsNiArMTk1MSwxMyBAQCBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG4gXHRcdHYudmFsID0gc2stXHUwMDNlc2tfc2NtX3BpZGZkO1xuIFx0XHRicmVhaztcbiBcbitcdGNhc2UgU09fUEFTU1BJREZEX1RIUkVBRDpcbitcdFx0aWYgKCFza19pc191bml4KHNrKSlcbitcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4rXG4rXHRcdHYudmFsID0gc2stXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZDtcbitcdFx0YnJlYWs7XG4rXG4gXHRjYXNlIFNPX1BBU1NSSUdIVFM6XG4gXHRcdGlmICghc2tfaXNfdW5peChzaykpXG4gXHRcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuQEAgLTE5MDYsNyArMTk3Miw4IEBAIGludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcbiBcdFx0XHRsZW4gPSBzaXplb2YocGVlcmNyZWQpO1xuIFxuIFx0XHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdFx0Y3JlZF90b191Y3JlZChzay1cdTAwM2Vza19wZWVyX3BpZCwgc2stXHUwMDNlc2tfcGVlcl9jcmVkLCBcdTAwMjZwZWVyY3JlZCk7XG4rXHRcdGNyZWRfdG9fdWNyZWQoc2stXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSwgc2stXHUwMDNlc2tfcGVlcl9jcmVkLFxuK1x0XHRcdCAgICAgIFx1MDAyNnBlZXJjcmVkKTtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiBcbiBcdFx0aWYgKGNvcHlfdG9fc29ja3B0cihvcHR2YWwsIFx1MDAyNnBlZXJjcmVkLCBsZW4pKVxuQEAgLTE5MTUsNDUgKzE5ODIsMTQgQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0fVxuIFxuIFx0Y2FzZSBTT19QRUVSUElERkQ6XG4tXHR7XG4tXHRcdHN0cnVjdCBwaWQgKnBlZXJfcGlkO1xuLVx0XHRzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7XG4tXHRcdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XG4tXHRcdGludCBwaWRmZDtcbi1cbi1cdFx0aWYgKGxlbiBcdTAwM2Ugc2l6ZW9mKHBpZGZkKSlcbi1cdFx0XHRsZW4gPSBzaXplb2YocGlkZmQpO1xuLVxuLVx0XHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdFx0cGVlcl9waWQgPSBnZXRfcGlkKHNrLVx1MDAzZXNrX3BlZXJfcGlkKTtcbi1cdFx0c3Bpbl91bmxvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbitcdFx0cmV0dXJuIHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKHNrLCBQSURUWVBFX1RHSUQsIG9wdHZhbCwgb3B0bGVuLCBsZW4pO1xuIFxuLVx0XHRpZiAoIXBlZXJfcGlkKVxuLVx0XHRcdHJldHVybiAtRU5PREFUQTtcbi1cbi1cdFx0LyogVGhlIHVzZSBvZiBQSURGRF9TVEFMRSByZXF1aXJlcyBzdGFzaGluZyBvZiBzdHJ1Y3QgcGlkXG4tXHRcdCAqIG9uIHBpZGZzIHdpdGggcGlkZnNfcmVnaXN0ZXJfcGlkKCkgYW5kIG9ubHkgQUZfVU5JWFxuLVx0XHQgKiB3ZXJlIHByZXBhcmVkIGZvciB0aGlzLlxuLVx0XHQgKi9cbi1cdFx0aWYgKHNrLVx1MDAzZXNrX2ZhbWlseSA9PSBBRl9VTklYKVxuLVx0XHRcdGZsYWdzID0gUElERkRfU1RBTEU7XG4tXG4tXHRcdHBpZGZkID0gcGlkZmRfcHJlcGFyZShwZWVyX3BpZCwgZmxhZ3MsIFx1MDAyNnBpZGZkX2ZpbGUpO1xuLVx0XHRwdXRfcGlkKHBlZXJfcGlkKTtcbi1cdFx0aWYgKHBpZGZkIFx1MDAzYyAwKVxuLVx0XHRcdHJldHVybiBwaWRmZDtcbi1cbi1cdFx0aWYgKGNvcHlfdG9fc29ja3B0cihvcHR2YWwsIFx1MDAyNnBpZGZkLCBsZW4pIHx8XG4tXHRcdCAgICBjb3B5X3RvX3NvY2twdHIob3B0bGVuLCBcdTAwMjZsZW4sIHNpemVvZihpbnQpKSkge1xuLVx0XHRcdHB1dF91bnVzZWRfZmQocGlkZmQpO1xuLVx0XHRcdGZwdXQocGlkZmRfZmlsZSk7XG4tXG4tXHRcdFx0cmV0dXJuIC1FRkFVTFQ7XG4tXHRcdH1cbitcdGNhc2UgU09fUEVFUlBJREZEX1RIUkVBRDpcbitcdFx0LyogT25seSBBRl9VTklYIHJlY29yZHMgdGhlIHBlZXIncyBjb25uZWN0aW5nIHRocmVhZC4gKi9cbitcdFx0aWYgKCFza19pc191bml4KHNrKSlcbitcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG4gXG4tXHRcdGZkX2luc3RhbGwocGlkZmQsIHBpZGZkX2ZpbGUpO1xuLVx0XHRyZXR1cm4gMDtcbi1cdH1cbitcdFx0cmV0dXJuIHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKHNrLCBQSURUWVBFX1BJRCwgb3B0dmFsLCBvcHRsZW4sIGxlbik7XG4gXG4gXHRjYXNlIFNPX1BFRVJHUk9VUFM6XG4gXHR7XG5AQCAtMjM3OSw3ICsyNDE1LDcgQEAgc3RhdGljIHZvaWQgX19za19kZXN0cnVjdChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpXG4gXG4gXHQvKiBXZSBkbyBub3QgbmVlZCB0byBhY3F1aXJlIHNrLVx1MDAzZXNrX3BlZXJfbG9jaywgd2UgYXJlIHRoZSBsYXN0IHVzZXIuICovXG4gXHRwdXRfY3JlZChzay1cdTAwM2Vza19wZWVyX2NyZWQpO1xuLVx0cHV0X3BpZChzay1cdTAwM2Vza19wZWVyX3BpZCk7XG4rXHRwdXRfcGlkcyhzay1cdTAwM2Vza19wZWVyX3BpZCk7XG4gXG4gXHRpZiAobGlrZWx5KHNrLVx1MDAzZXNrX25ldF9yZWZjbnQpKSB7XG4gXHRcdHB1dF9uZXRfdHJhY2sobmV0LCBcdTAwMjZzay1cdTAwM2Vuc190cmFja2VyKTtcbkBAIC0zNzc1LDcgKzM4MTEsNyBAQCB2b2lkIHNvY2tfaW5pdF9kYXRhX3VpZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29jayAqc2ssIGt1aWRfdCB1aWQpXG4gXHRzay1cdTAwM2Vza19mcmFnLm9mZnNldFx0PVx0MDtcbiBcdHNrLVx1MDAzZXNrX3BlZWtfb2ZmXHRcdD1cdC0xO1xuIFxuLVx0c2stXHUwMDNlc2tfcGVlcl9waWQgXHQ9XHROVUxMO1xuK1x0bWVtc2V0KHNrLVx1MDAzZXNrX3BlZXJfcGlkLCAwLCBzaXplb2Yoc2stXHUwMDNlc2tfcGVlcl9waWQpKTtcbiBcdHNrLVx1MDAzZXNrX3BlZXJfY3JlZFx0PVx0TlVMTDtcbiBcdHNwaW5fbG9ja19pbml0KFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4gXG5kaWZmIC0tZ2l0IGEvbmV0L3VuaXgvYWZfdW5peC5jIGIvbmV0L3VuaXgvYWZfdW5peC5jXG5pbmRleCAxM2Y5OTI2YmYyMDU3Li41NjNkOTgyN2M1Y2M1IDEwMDY0NFxuLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5jXG4rKysgYi9uZXQvdW5peC9hZl91bml4LmNcbkBAIC03MzcsNTcgKzczNyw1MyBAQCBzdGF0aWMgdm9pZCB1bml4X3JlbGVhc2Vfc29jayhzdHJ1Y3Qgc29jayAqc2ssIGludCBlbWJyaW9uKVxuIH1cbiBcbiBzdHJ1Y3QgdW5peF9wZWVyY3JlZCB7XG4tXHRzdHJ1Y3QgcGlkICpwZWVyX3BpZDtcbitcdERFQ0xBUkVfUElEUyhwZWVyX3BpZCwgUElEVFlQRV9UR0lEKTtcbiBcdGNvbnN0IHN0cnVjdCBjcmVkICpwZWVyX2NyZWQ7XG4gfTtcbiBcbiBzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX3BlZXJjcmVkKHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbiB7XG4tXHRzdHJ1Y3QgcGlkICpwaWQ7XG4gXHRpbnQgZXJyO1xuIFxuLVx0cGlkID0gdGFza190Z2lkKGN1cnJlbnQpO1xuLVx0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZCk7XG4tXHRpZiAobGlrZWx5KCFlcnIpKSB7XG4tXHRcdHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkID0gZ2V0X3BpZChwaWQpO1xuLVx0XHRwZWVyY3JlZC1cdTAwM2VwZWVyX2NyZWQgPSBnZXRfY3VycmVudF9jcmVkKCk7XG4rXHRnZXRfdGFza19waWRzKHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkLCBjdXJyZW50KTtcbitcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQpO1xuK1x0aWYgKHVubGlrZWx5KGVycikpIHtcbitcdFx0cHV0X3BpZHMocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQpO1xuK1x0XHRyZXR1cm4gZXJyO1xuIFx0fVxuLVx0cmV0dXJuIGVycjtcbitcbitcdHBlZXJjcmVkLVx1MDAzZXBlZXJfY3JlZCA9IGdldF9jdXJyZW50X2NyZWQoKTtcbitcdHJldHVybiAwO1xuIH1cbiBcbiBzdGF0aWMgdm9pZCBkcm9wX3BlZXJjcmVkKHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IE5VTEw7XG4tXHRzdHJ1Y3QgcGlkICpwaWQgPSBOVUxMO1xuIFxuIFx0bWlnaHRfc2xlZXAoKTtcbiBcbi1cdHN3YXAocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQsIHBpZCk7XG4rXHRwdXRfcGlkcyhwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCk7XG4gXHRzd2FwKHBlZXJjcmVkLVx1MDAzZXBlZXJfY3JlZCwgY3JlZCk7XG4tXG4tXHRwdXRfcGlkKHBpZCk7XG4gXHRwdXRfY3JlZChjcmVkKTtcbiB9XG4gXG4gc3RhdGljIGlubGluZSB2b2lkIGluaXRfcGVlcmNyZWQoc3RydWN0IHNvY2sgKnNrLFxuIFx0XHRcdFx0IGNvbnN0IHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbiB7XG4tXHRzay1cdTAwM2Vza19wZWVyX3BpZCA9IHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkO1xuK1x0bWVtY3B5KHNrLVx1MDAzZXNrX3BlZXJfcGlkLCBwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCwgc2l6ZW9mKHNrLVx1MDAzZXNrX3BlZXJfcGlkKSk7XG4gXHRzay1cdTAwM2Vza19wZWVyX2NyZWQgPSBwZWVyY3JlZC1cdTAwM2VwZWVyX2NyZWQ7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIHVwZGF0ZV9wZWVyY3JlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcbiB7XG4gXHRjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQ7XG4tXHRzdHJ1Y3QgcGlkICpvbGRfcGlkO1xuIFxuIFx0c3Bpbl9sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4tXHRvbGRfcGlkID0gc2stXHUwMDNlc2tfcGVlcl9waWQ7XG4rXHRzd2FwX3BpZHMoc2stXHUwMDNlc2tfcGVlcl9waWQsIHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkKTtcbiBcdG9sZF9jcmVkID0gc2stXHUwMDNlc2tfcGVlcl9jcmVkO1xuLVx0aW5pdF9wZWVyY3JlZChzaywgcGVlcmNyZWQpO1xuK1x0c2stXHUwMDNlc2tfcGVlcl9jcmVkID0gcGVlcmNyZWQtXHUwMDNlcGVlcl9jcmVkO1xuIFx0c3Bpbl91bmxvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiBcbi1cdHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkID0gb2xkX3BpZDtcbiBcdHBlZXJjcmVkLVx1MDAzZXBlZXJfY3JlZCA9IG9sZF9jcmVkO1xuIH1cbiBcbkBAIC03OTYsMTQgKzc5MiwxNCBAQCBzdGF0aWMgdm9pZCBjb3B5X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2sgKnBlZXJzaylcbiBcdGxvY2tkZXBfYXNzZXJ0X2hlbGQoXHUwMDI2dW5peF9zayhwZWVyc2spLVx1MDAzZWxvY2spO1xuIFxuIFx0c3Bpbl9sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4tXHRzay1cdTAwM2Vza19wZWVyX3BpZCA9IGdldF9waWQocGVlcnNrLVx1MDAzZXNrX3BlZXJfcGlkKTtcbitcdGdldF9waWRzKHNrLVx1MDAzZXNrX3BlZXJfcGlkLCBwZWVyc2stXHUwMDNlc2tfcGVlcl9waWQpO1xuIFx0c2stXHUwMDNlc2tfcGVlcl9jcmVkID0gZ2V0X2NyZWQocGVlcnNrLVx1MDAzZXNrX3BlZXJfY3JlZCk7XG4gXHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCB1bml4X21heV9wYXNzY3JlZChjb25zdCBzdHJ1Y3Qgc29jayAqc2spXG4ge1xuLVx0cmV0dXJuIHNrLVx1MDAzZXNrX3NjbV9jcmVkZW50aWFscyB8fCBzay1cdTAwM2Vza19zY21fcGlkZmQ7XG4rXHRyZXR1cm4gc2stXHUwMDNlc2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrX3NjbV9waWRmZF93YW50ZWQoc2spO1xuIH1cbiBcbiBzdGF0aWMgaW50IHVuaXhfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKVxuQEAgLTEwNjAsNiArMTA1Niw3IEBAIHN0YXRpYyBib29sIHVuaXhfYnBmX2J5cGFzc19nZXRzb2Nrb3B0KGludCBsZXZlbCwgaW50IG9wdG5hbWUpXG4gXHRpZiAobGV2ZWwgPT0gU09MX1NPQ0tFVCkge1xuIFx0XHRzd2l0Y2ggKG9wdG5hbWUpIHtcbiBcdFx0Y2FzZSBTT19QRUVSUElERkQ6XG4rXHRcdGNhc2UgU09fUEVFUlBJREZEX1RIUkVBRDpcbiBcdFx0XHRyZXR1cm4gdHJ1ZTtcbiBcdFx0ZGVmYXVsdDpcbiBcdFx0XHRyZXR1cm4gZmFsc2U7XG5AQCAtMTk3Myw3ICsxOTcwLDcgQEAgc3RhdGljIHZvaWQgdW5peF9kZXN0cnVjdF9zY20oc3RydWN0IHNrX2J1ZmYgKnNrYilcbiB7XG4gXHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY20gPSB7fTtcbiBcbi1cdHN3YXAoc2NtLnBpZCwgVU5JWENCKHNrYikucGlkKTtcbitcdHN3YXBfcGlkcyhzY20ucGlkLCBVTklYQ0Ioc2tiKS5waWQpO1xuIFxuIFx0aWYgKFVOSVhDQihza2IpLmZwKVxuIFx0XHR1bml4X2RldGFjaF9mZHMoXHUwMDI2c2NtLCBza2IpO1xuQEAgLTE5OTEsNyArMTk4OCw3IEBAIHN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuXG4ge1xuIFx0aW50IGVyciA9IDA7XG4gXG4tXHRVTklYQ0Ioc2tiKS5waWQgPSBnZXRfcGlkKHNjbS1cdTAwM2VwaWQpO1xuK1x0Z2V0X3BpZHMoVU5JWENCKHNrYikucGlkLCBzY20tXHUwMDNlcGlkKTtcbiBcdFVOSVhDQihza2IpLnVpZCA9IHNjbS1cdTAwM2VjcmVkcy51aWQ7XG4gXHRVTklYQ0Ioc2tiKS5naWQgPSBzY20tXHUwMDNlY3JlZHMuZ2lkO1xuIFx0VU5JWENCKHNrYikuZnAgPSBOVUxMO1xuQEAgLTIwMDUsNyArMjAwMiwxMCBAQCBzdGF0aWMgaW50IHVuaXhfc2NtX3RvX3NrYihzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHNlblxuIFxuIHN0YXRpYyB2b2lkIHVuaXhfc2tiX3RvX3NjbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuIHtcbi1cdHNjbV9zZXRfY3JlZChzY20sIFVOSVhDQihza2IpLnBpZCwgVU5JWENCKHNrYikudWlkLCBVTklYQ0Ioc2tiKS5naWQpO1xuK1x0Z2V0X3BpZHMoc2NtLVx1MDAzZXBpZCwgVU5JWENCKHNrYikucGlkKTtcbitcdHNjbS1cdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHNjbS1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSk7XG4rXHRzY20tXHUwMDNlY3JlZHMudWlkID0gVU5JWENCKHNrYikudWlkO1xuK1x0c2NtLVx1MDAzZWNyZWRzLmdpZCA9IFVOSVhDQihza2IpLmdpZDtcbiBcdHVuaXhfc2V0X3NlY2RhdGEoc2NtLCBza2IpO1xuIH1cbiBcbkBAIC0yMDI1LDMwICsyMDI1LDM1IEBAIHN0YXRpYyB2b2lkIHVuaXhfc2tiX3RvX3NjbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuIHN0YXRpYyBpbnQgdW5peF9tYXliZV9hZGRfY3JlZHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLFxuIFx0XHRcdFx0Y29uc3Qgc3RydWN0IHNvY2sgKm90aGVyKVxuIHtcbi1cdGlmIChVTklYQ0Ioc2tiKS5waWQpXG4rXHRpZiAoVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0pXG4gXHRcdHJldHVybiAwO1xuIFxuIFx0aWYgKHVuaXhfbWF5X3Bhc3NjcmVkKHNrKSB8fCB1bml4X21heV9wYXNzY3JlZChvdGhlcikgfHxcbiBcdCAgICAhb3RoZXItXHUwMDNlc2tfc29ja2V0KSB7XG4tXHRcdHN0cnVjdCBwaWQgKnBpZDtcbiBcdFx0aW50IGVycjtcbiBcbi1cdFx0cGlkID0gdGFza190Z2lkKGN1cnJlbnQpO1xuLVx0XHRlcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQocGlkKTtcbi1cdFx0aWYgKHVubGlrZWx5KGVycikpXG4rXHRcdGdldF90YXNrX3BpZHMoVU5JWENCKHNrYikucGlkLCBjdXJyZW50KTtcbitcdFx0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhVTklYQ0Ioc2tiKS5waWQpO1xuK1x0XHRpZiAodW5saWtlbHkoZXJyKSkge1xuK1x0XHRcdHB1dF9waWRzKFVOSVhDQihza2IpLnBpZCk7XG4gXHRcdFx0cmV0dXJuIGVycjtcbitcdFx0fVxuIFxuLVx0XHRVTklYQ0Ioc2tiKS5waWQgPSBnZXRfcGlkKHBpZCk7XG4gXHRcdGN1cnJlbnRfdWlkX2dpZChcdTAwMjZVTklYQ0Ioc2tiKS51aWQsIFx1MDAyNlVOSVhDQihza2IpLmdpZCk7XG4gXHR9XG4gXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4tc3RhdGljIGJvb2wgdW5peF9za2Jfc2NtX2VxKHN0cnVjdCBza19idWZmICpza2IsXG4rc3RhdGljIGJvb2wgdW5peF9za2Jfc2NtX2VxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiBcdFx0XHQgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiB7XG4tXHRyZXR1cm4gVU5JWENCKHNrYikucGlkID09IHNjbS1cdTAwM2VwaWQgXHUwMDI2XHUwMDI2XG4rXHQvKiBPbmx5IGEgdGhyZWFkIHBpZGZkIHJlY2VpdmVyIGNhbiB0ZWxsIHRocmVhZHMgb2Ygb25lIHByb2Nlc3MgYXBhcnQuICovXG4rXHRpZiAoc2stXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZCBcdTAwMjZcdTAwMjZcbitcdCAgICBVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9QSURdICE9IHNjbS1cdTAwM2VwaWRbUElEVFlQRV9QSURdKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRyZXR1cm4gVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0gPT0gc2NtLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdIFx1MDAyNlx1MDAyNlxuIFx0ICAgICAgIHVpZF9lcShVTklYQ0Ioc2tiKS51aWQsIHNjbS1cdTAwM2VjcmVkcy51aWQpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICAgIGdpZF9lcShVTklYQ0Ioc2tiKS5naWQsIHNjbS1cdTAwM2VjcmVkcy5naWQpIFx1MDAyNlx1MDAyNlxuIFx0ICAgICAgIHVuaXhfc2VjZGF0YV9lcShzY20sIHNrYik7XG5AQCAtMzAyNiw3ICszMDMxLDcgQEAgc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWMoc3RydWN0IHVuaXhfc3RyZWFtX3JlYWRfc3RhdGUgKnN0YXRlLFxuIFxuIFx0XHRpZiAoY2hlY2tfY3JlZHMpIHtcbiBcdFx0XHQvKiBOZXZlciBnbHVlIG1lc3NhZ2VzIGZyb20gZGlmZmVyZW50IHdyaXRlcnMgKi9cbi1cdFx0XHRpZiAoIXVuaXhfc2tiX3NjbV9lcShza2IsIFx1MDAyNnNjbSkpXG4rXHRcdFx0aWYgKCF1bml4X3NrYl9zY21fZXEoc2ssIHNrYiwgXHUwMDI2c2NtKSlcbiBcdFx0XHRcdGJyZWFrO1xuIFx0XHR9IGVsc2UgaWYgKHVuaXhfbWF5X3Bhc3NjcmVkKHNrKSkge1xuIFx0XHRcdC8qIENvcHkgY3JlZGVudGlhbHMgKi9cbmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmggYi9uZXQvdW5peC9hZl91bml4LmhcbmluZGV4IDgxMTlkYmVlZjNhM2MuLjQwMjc0Mjg5NWFjY2EgMTAwNjQ0XG4tLS0gYS9uZXQvdW5peC9hZl91bml4LmhcbisrKyBiL25ldC91bml4L2FmX3VuaXguaFxuQEAgLTIsNiArMiw3IEBAXG4gI2lmbmRlZiBfX0FGX1VOSVhfSFxuICNkZWZpbmUgX19BRl9VTklYX0hcbiBcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9waWRfdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3VpZGdpZC5oXHUwMDNlXG4gXG4gI2RlZmluZSBVTklYX0hBU0hfTU9EXHQoMjU2IC0gMSlcbkBAIC0xMSw3ICsxMiw3IEBAXG4gc3RydWN0IHNvY2sgKnVuaXhfcGVlcl9nZXQoc3RydWN0IHNvY2sgKnNrKTtcbiBcbiBzdHJ1Y3QgdW5peF9za2JfcGFybXMge1xuLVx0c3RydWN0IHBpZFx0XHQqcGlkO1x0XHQvKiBza2IgY3JlZGVudGlhbHNcdCovXG4rXHRERUNMQVJFX1BJRFMocGlkLCBQSURUWVBFX1RHSUQpO1x0Lyogc2tiIGNyZWRlbnRpYWxzIGJ5IHBpZCB0eXBlICovXG4gXHRrdWlkX3RcdFx0XHR1aWQ7XG4gXHRrZ2lkX3RcdFx0XHRnaWQ7XG4gXHRzdHJ1Y3Qgc2NtX2ZwX2xpc3RcdCpmcDtcdFx0LyogUGFzc2VkIGZpbGVzXHRcdCovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmNcbmluZGV4IDQyMjcyOGY2MzJjYTYuLmVjNzNiYjY5MGJiY2IgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jXG5AQCAtNTkyLDYgKzU5MiwxODEgQEAgVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfY29yZWR1bXBfc2lnbmFsX3NpZ3NlZ3YpXG4gXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wgY2hlY2tfY29yZWR1bXBfaW5mbyhjb25zdCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqd2hhdClcbit7XG4rXHRpZiAoIShpbmZvLVx1MDAzZW1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVApKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBQSURGRF9JTkZPX0NPUkVEVU1QIG5vdCBzZXQgaW4gbWFza1xcblwiLCB3aGF0KTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0aWYgKCEoaW5mby1cdTAwM2Vjb3JlZHVtcF9tYXNrIFx1MDAyNiBQSURGRF9DT1JFRFVNUEVEKSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogUElERkRfQ09SRURVTVBFRCBub3Qgc2V0IGluIGNvcmVkdW1wX21hc2tcXG5cIiwgd2hhdCk7XG4rXHRcdHJldHVybiBmYWxzZTtcbitcdH1cbitcbitcdGlmICghKGluZm8tXHUwMDNlbWFzayBcdTAwMjYgUElERkRfSU5GT19DT1JFRFVNUF9TSUdOQUwpIHx8IGluZm8tXHUwMDNlY29yZWR1bXBfc2lnbmFsICE9IFNJR1NFR1YpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGNvcmVkdW1wX3NpZ25hbD0lZCwgZXhwZWN0ZWQgU0lHU0VHVj0lZFxcblwiLFxuK1x0XHRcdHdoYXQsIGluZm8tXHUwMDNlY29yZWR1bXBfc2lnbmFsLCBTSUdTRUdWKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0aWYgKCEoaW5mby1cdTAwM2VtYXNrIFx1MDAyNiBQSURGRF9JTkZPX0NPUkVEVU1QX0NPREUpIHx8IGluZm8tXHUwMDNlY29yZWR1bXBfY29kZSAhPSBTRUdWX01BUEVSUikge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogY29yZWR1bXBfY29kZT0lZCwgZXhwZWN0ZWQgU0VHVl9NQVBFUlI9JWRcXG5cIixcbitcdFx0XHR3aGF0LCBpbmZvLVx1MDAzZWNvcmVkdW1wX2NvZGUsIFNFR1ZfTUFQRVJSKTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0cmV0dXJuIHRydWU7XG4rfVxuK1xuKy8qXG4rICogVGVzdDogUElERkRfSU5GT19DT1JFRFVNUCBvbiB0aGUgZHVtcGluZyB0aHJlYWQncyBwaWRmZFxuKyAqXG4rICogQ3Jhc2ggZnJvbSBhIG5vbi1sZWFkZXIgdGhyZWFkIGFuZCB2ZXJpZnkgdGhhdCB0aGUgcGlkZmQgZnJvbVxuKyAqIFNPX1BFRVJQSURGRF9USFJFQUQgcmVmZXJzIHRvIHRoYXQgdGhyZWFkIGFuZCByZXBvcnRzIHRoZSBjb3JlZHVtcFxuKyAqIGxpa2UgdGhlIHRocmVhZC1ncm91cCBsZWFkZXIncyBwaWRmZCBmcm9tIFNPX1BFRVJQSURGRCBkb2VzLlxuKyAqL1xuK1RFU1RfRihjb3JlZHVtcCwgc29ja2V0X2NvcmVkdW1wX3RocmVhZClcbit7XG4rXHRpbnQgcGlkZmQsIHJldCwgc3RhdHVzO1xuK1x0cGlkX3QgcGlkLCBwaWRfY29yZWR1bXBfc2VydmVyO1xuK1x0c3RydWN0IHBpZGZkX2luZm8gaW5mbyA9IHt9O1xuK1x0aW50IGlwY19zb2NrZXRzWzJdO1xuK1x0Y2hhciBjO1xuK1xuK1x0QVNTRVJUX1RSVUUoc2V0X2NvcmVfcGF0dGVybihcIkAvdG1wL2NvcmVkdW1wLnNvY2tldFwiKSk7XG4rXG4rXHRyZXQgPSBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNIHwgU09DS19DTE9FWEVDLCAwLCBpcGNfc29ja2V0cyk7XG4rXHRBU1NFUlRfRVEocmV0LCAwKTtcbitcbitcdHBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBmb3JrKCk7XG4rXHRBU1NFUlRfR0UocGlkX2NvcmVkdW1wX3NlcnZlciwgMCk7XG4rXHRpZiAocGlkX2NvcmVkdW1wX3NlcnZlciA9PSAwKSB7XG4rXHRcdGludCBmZF9zZXJ2ZXIgPSAtMSwgZmRfY29yZWR1bXAgPSAtMSwgZmRfcGVlcl9waWRmZCA9IC0xO1xuK1x0XHRpbnQgZmRfdGhyZWFkX3BpZGZkID0gLTEsIGZkX2NvcmVfZmlsZSA9IC0xO1xuK1x0XHRzdHJ1Y3QgcGlkZmRfaW5mbyB0aHJlYWRfaW5mbyA9IHt9O1xuK1x0XHRpbnQgZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFO1xuK1xuK1x0XHRjbG9zZShpcGNfc29ja2V0c1swXSk7XG4rXG4rXHRcdGZkX3NlcnZlciA9IGNyZWF0ZV9hbmRfbGlzdGVuX3VuaXhfc29ja2V0KFwiL3RtcC9jb3JlZHVtcC5zb2NrZXRcIik7XG4rXHRcdGlmIChmZF9zZXJ2ZXIgXHUwMDNjIDApIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBsaXN0ZW4gc29ja2V0IGZhaWxlZDogJW1cXG5cIik7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0aWYgKHdyaXRlX25vaW50cihpcGNfc29ja2V0c1sxXSwgXCIxXCIsIDEpIFx1MDAzYyAwKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogaXBjIHdyaXRlIGZhaWxlZDogJW1cXG5cIik7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0Y2xvc2UoaXBjX3NvY2tldHNbMV0pO1xuK1xuK1x0XHRmZF9jb3JlZHVtcCA9IGFjY2VwdDQoZmRfc2VydmVyLCBOVUxMLCBOVUxMLCBTT0NLX0NMT0VYRUMpO1xuK1x0XHRpZiAoZmRfY29yZWR1bXAgXHUwMDNjIDApIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBhY2NlcHQ0IGZhaWxlZDogJW1cXG5cIik7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0ZmRfcGVlcl9waWRmZCA9IGdldF9wZWVyX3BpZGZkKGZkX2NvcmVkdW1wKTtcbitcdFx0aWYgKGZkX3BlZXJfcGlkZmQgXHUwMDNjIDApIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBnZXRfcGVlcl9waWRmZCBmYWlsZWRcXG5cIik7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0ZmRfdGhyZWFkX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmRfdGhyZWFkKGZkX2NvcmVkdW1wKTtcbitcdFx0aWYgKGZkX3RocmVhZF9waWRmZCBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGdldF9wZWVyX3BpZGZkX3RocmVhZCBmYWlsZWRcXG5cIik7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0aWYgKCFnZXRfcGlkZmRfaW5mbyhmZF9wZWVyX3BpZGZkLCBcdTAwMjZpbmZvKSB8fFxuK1x0XHQgICAgIWdldF9waWRmZF9pbmZvKGZkX3RocmVhZF9waWRmZCwgXHUwMDI2dGhyZWFkX2luZm8pKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogZ2V0X3BpZGZkX2luZm8gZmFpbGVkXFxuXCIpO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdC8qIFRoZSBwZWVyIGlzIHRoZSB0aHJlYWQtZ3JvdXAgbGVhZGVyLCB0aGUgZHVtcGluZyB0aHJlYWQgaXMgbm90LiAqL1xuK1x0XHRpZiAoaW5mby5waWQgIT0gaW5mby50Z2lkIHx8IHRocmVhZF9pbmZvLnRnaWQgIT0gaW5mby50Z2lkIHx8XG4rXHRcdCAgICB0aHJlYWRfaW5mby5waWQgPT0gdGhyZWFkX2luZm8udGdpZCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IHVuZXhwZWN0ZWQgaWRzICVkLyVkIGFuZCAlZC8lZFxcblwiLFxuK1x0XHRcdFx0aW5mby5waWQsIGluZm8udGdpZCwgdGhyZWFkX2luZm8ucGlkLCB0aHJlYWRfaW5mby50Z2lkKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoIWNoZWNrX2NvcmVkdW1wX2luZm8oXHUwMDI2aW5mbywgXCJTT19QRUVSUElERkRcIikgfHxcbitcdFx0ICAgICFjaGVja19jb3JlZHVtcF9pbmZvKFx1MDAyNnRocmVhZF9pbmZvLCBcIlNPX1BFRVJQSURGRF9USFJFQURcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXG4rXHRcdGZkX2NvcmVfZmlsZSA9IG9wZW5fY29yZWR1bXBfdG1wZmlsZShzZWxmLVx1MDAzZWZkX3RtcGZzX2RldGFjaGVkKTtcbitcdFx0aWYgKGZkX2NvcmVfZmlsZSBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgdG1wZmlsZSBmYWlsZWQ6ICVtXFxuXCIpO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdGZvciAoOzspIHtcbitcdFx0XHRjaGFyIGJ1ZmZlcls0MDk2XTtcbitcdFx0XHRzc2l6ZV90IGJ5dGVzX3JlYWQsIGJ5dGVzX3dyaXRlO1xuK1xuK1x0XHRcdGJ5dGVzX3JlYWQgPSByZWFkKGZkX2NvcmVkdW1wLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTtcbitcdFx0XHRpZiAoYnl0ZXNfcmVhZCBcdTAwM2MgMCkge1xuK1x0XHRcdFx0ZnByaW50ZihzdGRlcnIsIFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogY29yZSByZWFkIGZhaWxlZDogJW1cXG5cIik7XG4rXHRcdFx0XHRnb3RvIG91dDtcbitcdFx0XHR9XG4rXG4rXHRcdFx0aWYgKGJ5dGVzX3JlYWQgPT0gMClcbitcdFx0XHRcdGJyZWFrO1xuK1xuK1x0XHRcdGJ5dGVzX3dyaXRlID0gd3JpdGUoZmRfY29yZV9maWxlLCBidWZmZXIsIGJ5dGVzX3JlYWQpO1xuK1x0XHRcdGlmIChieXRlc19yZWFkICE9IGJ5dGVzX3dyaXRlKSB7XG4rXHRcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBjb3JlIHdyaXRlICV6ZC8lemQ6ICVtXFxuXCIsXG4rXHRcdFx0XHRcdGJ5dGVzX3JlYWQsIGJ5dGVzX3dyaXRlKTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcdFx0fVxuK1xuK1x0XHRleGl0X2NvZGUgPSBFWElUX1NVQ0NFU1M7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcXG5cIik7XG4rb3V0OlxuK1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9jb3JlX2ZpbGUpO1xuK1x0XHRpZiAoZmRfdGhyZWFkX3BpZGZkIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF90aHJlYWRfcGlkZmQpO1xuK1x0XHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRfcGVlcl9waWRmZCk7XG4rXHRcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2U9IDApXG4rXHRcdFx0Y2xvc2UoZmRfY29yZWR1bXApO1xuK1x0XHRpZiAoZmRfc2VydmVyIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9zZXJ2ZXIpO1xuK1x0XHRfZXhpdChleGl0X2NvZGUpO1xuK1x0fVxuK1x0c2VsZi1cdTAwM2VwaWRfY29yZWR1bXBfc2VydmVyID0gcGlkX2NvcmVkdW1wX3NlcnZlcjtcbitcbitcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1sxXSksIDApO1xuK1x0QVNTRVJUX0VRKHJlYWRfbm9pbnRyKGlwY19zb2NrZXRzWzBdLCBcdTAwMjZjLCAxKSwgMSk7XG4rXHRFWFBFQ1RfRVEoY2xvc2UoaXBjX3NvY2tldHNbMF0pLCAwKTtcbitcbitcdHBpZCA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWQsIDApO1xuK1x0aWYgKHBpZCA9PSAwKVxuK1x0XHRjcmFzaGluZ19jaGlsZF90aHJlYWQoKTtcbitcbitcdHBpZGZkID0gc3lzX3BpZGZkX29wZW4ocGlkLCAwKTtcbitcdEFTU0VSVF9HRShwaWRmZCwgMCk7XG4rXG4rXHR3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbitcdEFTU0VSVF9UUlVFKFdJRlNJR05BTEVEKHN0YXR1cykpO1xuK1x0QVNTRVJUX0VRKFdURVJNU0lHKHN0YXR1cyksIFNJR1NFR1YpO1xuK1x0QVNTRVJUX1RSVUUoV0NPUkVEVU1QKHN0YXR1cykpO1xuK1xuK1x0QVNTRVJUX1RSVUUoZ2V0X3BpZGZkX2luZm8ocGlkZmQsIFx1MDAyNmluZm8pKTtcbitcdEFTU0VSVF9UUlVFKCEhKGluZm8ubWFzayBcdTAwMjYgUElERkRfSU5GT19DT1JFRFVNUCkpO1xuK1x0QVNTRVJUX1RSVUUoISEoaW5mby5jb3JlZHVtcF9tYXNrIFx1MDAyNiBQSURGRF9DT1JFRFVNUEVEKSk7XG4rXHRBU1NFUlRfRVEoaW5mby5jb3JlZHVtcF9zaWduYWwsIFNJR1NFR1YpO1xuK1xuK1x0d2FpdF9hbmRfY2hlY2tfY29yZWR1bXBfc2VydmVyKHBpZF9jb3JlZHVtcF9zZXJ2ZXIsIF9tZXRhZGF0YSwgc2VsZik7XG4rfVxuK1xuIC8qXG4gICogVGVzdDogUElERkRfSU5GT19DT1JFRFVNUF9TSUdOQUwgdmlhIHNpbXBsZSBzb2NrZXQgY29yZWR1bXAgd2l0aCBTSUdBQlJUXG4gICpcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbmluZGV4IGVkNDdmMDFmYTUzYzUuLjQyMTI2NTZlMzFmMDEgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0LmhcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxuQEAgLTI3LDEwICsyNywxMiBAQCBGSVhUVVJFKGNvcmVkdW1wKVxuIC8qIFNoYXJlZCBoZWxwZXIgZnVuY3Rpb24gZGVjbGFyYXRpb25zICovXG4gdm9pZCAqZG9fbm90aGluZyh2b2lkICphcmcpO1xuIHZvaWQgY3Jhc2hpbmdfY2hpbGQodm9pZCk7XG4rdm9pZCBjcmFzaGluZ19jaGlsZF90aHJlYWQodm9pZCk7XG4gaW50IGNyZWF0ZV9kZXRhY2hlZF90bXBmcyh2b2lkKTtcbiBpbnQgY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoY29uc3QgY2hhciAqcGF0aCk7XG4gYm9vbCBzZXRfY29yZV9wYXR0ZXJuKGNvbnN0IGNoYXIgKnBhdHRlcm4pO1xuIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpO1xuK2ludCBnZXRfcGVlcl9waWRmZF90aHJlYWQoaW50IGZkKTtcbiBib29sIGdldF9waWRmZF9pbmZvKGludCBmZF9wZWVyX3BpZGZkLCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbyk7XG4gXG4gLyogSW5saW5lIGhlbHBlciB0aGF0IHVzZXMgaGFybmVzcyB0eXBlcyAqL1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbmluZGV4IDJhMjBmYWY5Y2IwYWQuLjM2MzA2MDY5ZjYyZTUgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmNcbkBAIC0xMyw2ICsxMyw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvZXBvbGwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9pb2N0bC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9zb2NrZXQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy90eXBlcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3VuLmhcdTAwM2VcbkBAIC0zOCw2ICszOSwxMCBAQCBzdHJ1Y3QgX2ZpeHR1cmVfY29yZWR1bXBfZGF0YSB7XG4gXG4gI2RlZmluZSBOVU1fVEhSRUFEX1NQQVdOIDEyOFxuIFxuKyNpZm5kZWYgU09fUEVFUlBJREZEX1RIUkVBRFxuKyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCA4N1xuKyNlbmRpZlxuK1xuIHZvaWQgKmRvX25vdGhpbmcodm9pZCAqYXJnKVxuIHtcbiBcdCh2b2lkKWFyZztcbkBAIC01OSw2ICs2NCwzNiBAQCB2b2lkIGNyYXNoaW5nX2NoaWxkKHZvaWQpXG4gXHRpID0gKih2b2xhdGlsZSBpbnQgKilOVUxMO1xuIH1cbiBcbitzdGF0aWMgdm9pZCAqY3Jhc2hpbmdfdGhyZWFkKHZvaWQgKmFyZylcbit7XG4rXHRpbnQgKnA7XG4rXG4rXHQodm9pZClhcmc7XG4rXG4rXHQvKiBjcmFzaCBvbiBwdXJwb3NlIHdpdGggU0VHVl9NQVBFUlIgKi9cbitcdHAgPSBtbWFwKE5VTEwsIFBBR0VfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSxcbitcdFx0IE1BUF9QUklWQVRFIHwgTUFQX0FOT05ZTU9VUywgLTEsIDApO1xuK1x0aWYgKHAgPT0gTUFQX0ZBSUxFRClcbitcdFx0cmV0dXJuIE5VTEw7XG4rXHRtdW5tYXAocCwgUEFHRV9TSVpFKTtcbitcdCpwID0gMDtcbitcbitcdHJldHVybiBOVUxMO1xuK31cbitcbit2b2lkIGNyYXNoaW5nX2NoaWxkX3RocmVhZCh2b2lkKVxuK3tcbitcdHB0aHJlYWRfdCB0aHJlYWQ7XG4rXHRpbnQgaTtcbitcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIE5VTV9USFJFQURfU1BBV047ICsraSlcbitcdFx0cHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkLCBOVUxMLCBkb19ub3RoaW5nLCBOVUxMKTtcbitcbitcdC8qIGNyYXNoIGZyb20gYSBub24tbGVhZGVyIHRocmVhZCAqL1xuK1x0cHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkLCBOVUxMLCBjcmFzaGluZ190aHJlYWQsIE5VTEwpO1xuK1x0cGF1c2UoKTtcbit9XG4rXG4gaW50IGNyZWF0ZV9kZXRhY2hlZF90bXBmcyh2b2lkKVxuIHtcbiBcdGludCBmZF9jb250ZXh0LCBmZF90bXBmcztcbkBAIC0xMzgsNiArMTczLDIwIEBAIGludCBnZXRfcGVlcl9waWRmZChpbnQgZmQpXG4gXHRyZXR1cm4gZmRfcGVlcl9waWRmZDtcbiB9XG4gXG4raW50IGdldF9wZWVyX3BpZGZkX3RocmVhZChpbnQgZmQpXG4re1xuK1x0aW50IGZkX3BlZXJfcGlkZmQ7XG4rXHRzb2NrbGVuX3QgZmRfcGVlcl9waWRmZF9sZW4gPSBzaXplb2YoZmRfcGVlcl9waWRmZCk7XG4rXHRpbnQgcmV0ID0gZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUEVFUlBJREZEX1RIUkVBRCwgXHUwMDI2ZmRfcGVlcl9waWRmZCxcbitcdFx0XHQgICAgIFx1MDAyNmZkX3BlZXJfcGlkZmRfbGVuKTtcbitcdGlmIChyZXQgXHUwMDNjIDApIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IGdldHNvY2tvcHQoU09fUEVFUlBJREZEX1RIUkVBRCkgZmFpbGVkOiAlbVxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBzdWNjZXNzZnVsbHkgcmV0cmlldmVkIHBpZGZkICVkXFxuXCIsIF9fZnVuY19fLCBmZF9wZWVyX3BpZGZkKTtcbitcdHJldHVybiBmZF9wZWVyX3BpZGZkO1xuK31cbitcbiBib29sIGdldF9waWRmZF9pbmZvKGludCBmZF9wZWVyX3BpZGZkLCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbylcbiB7XG4gXHRpbnQgcmV0O1xuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvTWFrZWZpbGVcbmluZGV4IGE2NmYxMGZiMGMyMzEuLjQ1Yjg0MTc1OGYxYmYgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvTWFrZWZpbGVcbkBAIC0yMyw2ICsyMyw4IEBAIFRFU1RfR0VOX0ZJTEVTIDo9IHNjbV9yaWdodHNfZGVuaWFsX2xzbS5icGYub1xuIGluY2x1ZGUgLi4vLi4vbGliLm1rXG4gaW5jbHVkZSAuLi9icGYubWtcbiBcbiskKE9VVFBVVCkvc2NtX3BpZGZkOiBDRkxBR1MgKz0gLXB0aHJlYWRcbitcbiAkKE9VVFBVVCkvc2NtX3JpZ2h0c19kZW5pYWxfbHNtOiAkKEJQRk9CSilcbiAkKE9VVFBVVCkvc2NtX3JpZ2h0c19kZW5pYWxfbHNtOiBDRkxBR1MgKz0gLUkkKFNDUkFUQ0hfRElSKS9pbmNsdWRlXG4gJChPVVRQVVQpL3NjbV9yaWdodHNfZGVuaWFsX2xzbTogTERMSUJTICs9IC1sZWxmIC1selxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L3NjbV9waWRmZC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmNcbmluZGV4IDJjMThiOTJhMjYwMzUuLmJiYmQ1ZTdiNGZhNzggMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9zY21fcGlkZmQuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmNcbkBAIC0xMCw2ICsxMCw3IEBAXG4gI2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2Vycm5vLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NwdGhyZWFkLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdW4uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9zaWduYWwuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy90eXBlcy5oXHUwMDNlXG5AQCAtMjcsNiArMjgsMTQgQEBcbiAjZGVmaW5lIFNDTV9QSURGRCAweDA0XG4gI2VuZGlmXG4gXG4rI2lmbmRlZiBTT19QQVNTUElERkRfVEhSRUFEXG4rI2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEIDg2XG4rI2VuZGlmXG4rXG4rI2lmbmRlZiBTT19QRUVSUElERkRfVEhSRUFEXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEIDg3XG4rI2VuZGlmXG4rXG4gI2RlZmluZSBDSElMRF9FWElUX0NPREVfT0sgMTIzXG4gXG4gc3RhdGljIHZvaWQgY2hpbGRfZGllKClcbkBAIC01NTMsNCArNTYyLDM2MSBAQCBURVNUX0Yoc2NtX3BpZGZkLCB0ZXN0KVxuIFx0Y2xvc2UocGZkKTtcbiB9XG4gXG4rc3RydWN0IHRocmVhZF9pZHMge1xuK1x0cGlkX3QgcGlkO1xuK1x0cGlkX3QgdGlkO1xuK307XG4rXG4rc3RhdGljIHZvaWQgKnNlbmRfaWRzX3RocmVhZCh2b2lkICphcmcpXG4re1xuK1x0aW50IGZkID0gKihpbnQgKilhcmc7XG4rXHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHMgPSB7XG4rXHRcdC5waWQgPSBnZXRwaWQoKSxcbitcdFx0LnRpZCA9IGdldHRpZCgpLFxuK1x0fTtcbitcdGNoYXIgc3luYztcbitcbitcdGlmIChzZW5kKGZkLCBcdTAwMjZpZHMsIHNpemVvZihpZHMpLCAwKSAhPSBzaXplb2YoaWRzKSlcbitcdFx0cmV0dXJuICh2b2lkICopMTtcbitcbitcdC8qIHN0YXkgYWxpdmUgdW50aWwgdGhlIHJlY2VpdmVyIGhhcyBsb29rZWQgYXQgb3VyIHBpZGZkICovXG4rXHRpZiAocmVhZChmZCwgXHUwMDI2c3luYywgMSkgIT0gMSlcbitcdFx0cmV0dXJuICh2b2lkICopMTtcbitcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCAqc2VuZF9pZHNfY3JlZHNfdGhyZWFkKHZvaWQgKmFyZylcbit7XG4rXHRpbnQgZmQgPSAqKGludCAqKWFyZztcbitcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHtcbitcdFx0LnBpZCA9IGdldHBpZCgpLFxuK1x0XHQudGlkID0gZ2V0dGlkKCksXG4rXHR9O1xuK1x0c3RydWN0IHVjcmVkIHVjcmVkID0ge1xuK1x0XHQucGlkID0gZ2V0cGlkKCksXG4rXHRcdC51aWQgPSBnZXR1aWQoKSxcbitcdFx0LmdpZCA9IGdldGdpZCgpLFxuK1x0fTtcbitcdGNoYXIgY29udHJvbFtDTVNHX1NQQUNFKHNpemVvZih1Y3JlZCkpXSA9IHsgMCB9O1xuK1x0c3RydWN0IGlvdmVjIGlvdjtcbitcdHN0cnVjdCBtc2doZHIgbXNnID0geyAwIH07XG4rXHRzdHJ1Y3QgY21zZ2hkciAqY21zZztcbitcdGNoYXIgc3luYztcbitcbitcdGlvdi5pb3ZfYmFzZSA9IFx1MDAyNmlkcztcbitcdGlvdi5pb3ZfbGVuID0gc2l6ZW9mKGlkcyk7XG4rXG4rXHRtc2cubXNnX2lvdiA9IFx1MDAyNmlvdjtcbitcdG1zZy5tc2dfaW92bGVuID0gMTtcbitcdG1zZy5tc2dfY29udHJvbCA9IGNvbnRyb2w7XG4rXHRtc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbCk7XG4rXG4rXHRjbXNnID0gQ01TR19GSVJTVEhEUihcdTAwMjZtc2cpO1xuK1x0Y21zZy1cdTAwM2VjbXNnX2xldmVsID0gU09MX1NPQ0tFVDtcbitcdGNtc2ctXHUwMDNlY21zZ190eXBlID0gU0NNX0NSRURFTlRJQUxTO1xuK1x0Y21zZy1cdTAwM2VjbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZih1Y3JlZCkpO1xuK1x0bWVtY3B5KENNU0dfREFUQShjbXNnKSwgXHUwMDI2dWNyZWQsIHNpemVvZih1Y3JlZCkpO1xuK1xuK1x0aWYgKHNlbmRtc2coZmQsIFx1MDAyNm1zZywgMCkgIT0gc2l6ZW9mKGlkcykpXG4rXHRcdHJldHVybiAodm9pZCAqKTE7XG4rXG4rXHRpZiAocmVhZChmZCwgXHUwMDI2c3luYywgMSkgIT0gMSlcbitcdFx0cmV0dXJuICh2b2lkICopMTtcbitcbitcdHJldHVybiBOVUxMO1xuK31cbitcbitzdGF0aWMgdm9pZCB0aHJlYWRfY2xpZW50KGludCBmZCwgaW50IHN5bmNmZCwgdm9pZCAqKCpzZW5kZXIpKHZvaWQgKikpXG4re1xuK1x0cHRocmVhZF90IHRocmVhZDtcbitcdHZvaWQgKnJldDtcbitcdGNoYXIgc3luYztcbitcbitcdC8qIHdhaXQgdW50aWwgdGhlIHJlY2VpdmVyIGVuYWJsZWQgU09fUEFTU1BJREZEICovXG4rXHRpZiAocmVhZChzeW5jZmQsIFx1MDAyNnN5bmMsIDEpICE9IDEpXG4rXHRcdGNoaWxkX2RpZSgpO1xuK1xuK1x0aWYgKHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZCwgTlVMTCwgc2VuZGVyLCBcdTAwMjZmZCkpXG4rXHRcdGNoaWxkX2RpZSgpO1xuK1xuK1x0aWYgKHB0aHJlYWRfam9pbih0aHJlYWQsIFx1MDAyNnJldCkgfHwgcmV0KVxuK1x0XHRjaGlsZF9kaWUoKTtcbitcbitcdGV4aXQoMCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVjdl9waWRmZChpbnQgZmQsIHN0cnVjdCB0aHJlYWRfaWRzICppZHMpXG4re1xuK1x0Y2hhciBjb250cm9sW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkpXSA9IHsgMCB9O1xuK1x0c3RydWN0IGlvdmVjIGlvdjtcbitcdHN0cnVjdCBtc2doZHIgbXNnID0geyAwIH07XG4rXHRzdHJ1Y3QgY21zZ2hkciAqY21zZztcbitcdGludCBwaWRmZCA9IC0xO1xuK1xuK1x0aW92Lmlvdl9iYXNlID0gaWRzO1xuK1x0aW92Lmlvdl9sZW4gPSBzaXplb2YoKmlkcyk7XG4rXG4rXHRtc2cubXNnX2lvdiA9IFx1MDAyNmlvdjtcbitcdG1zZy5tc2dfaW92bGVuID0gMTtcbitcdG1zZy5tc2dfY29udHJvbCA9IGNvbnRyb2w7XG4rXHRtc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbCk7XG4rXG4rXHRpZiAocmVjdm1zZyhmZCwgXHUwMDI2bXNnLCAwKSAhPSBzaXplb2YoKmlkcykpIHtcbitcdFx0bG9nX2VycihcInJlY3Ztc2dcIik7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdGlmIChtc2cubXNnX2ZsYWdzIFx1MDAyNiAoTVNHX1RSVU5DIHwgTVNHX0NUUlVOQykpIHtcbitcdFx0bG9nX2VycihcInJlY3Ztc2c6IHRydW5jYXRlZFwiKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0Zm9yIChjbXNnID0gQ01TR19GSVJTVEhEUihcdTAwMjZtc2cpOyBjbXNnICE9IE5VTEw7XG4rXHQgICAgIGNtc2cgPSBDTVNHX05YVEhEUihcdTAwMjZtc2csIGNtc2cpKSB7XG4rXHRcdGlmIChjbXNnLVx1MDAzZWNtc2dfbGV2ZWwgPT0gU09MX1NPQ0tFVCBcdTAwMjZcdTAwMjZcbitcdFx0ICAgIGNtc2ctXHUwMDNlY21zZ190eXBlID09IFNDTV9QSURGRClcbitcdFx0XHRtZW1jcHkoXHUwMDI2cGlkZmQsIENNU0dfREFUQShjbXNnKSwgc2l6ZW9mKHBpZGZkKSk7XG4rXHR9XG4rXG4rXHRyZXR1cm4gcGlkZmQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgdGhyZWFkX3BpZGZkX2Zsb3codm9pZCAqKCpzZW5kZXIpKHZvaWQgKiksIGludCBvcHRuYW1lLFxuK1x0XHRcdCAgICAgc3RydWN0IHRocmVhZF9pZHMgKmlkcywgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pXG4re1xuK1x0aW50IHNrWzJdO1xuK1x0aW50IHN5bmNwaXBlWzJdO1xuK1x0aW50IHBpZGZkO1xuK1x0aW50IGNoaWxkX3N0YXR1cyA9IDA7XG4rXHRwaWRfdCBjaGlsZDtcbitcbitcdGlmIChzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaykpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGlmIChwaXBlKHN5bmNwaXBlKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y2hpbGQgPSBmb3JrKCk7XG4rXHRpZiAoY2hpbGQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGlmIChjaGlsZCA9PSAwKSB7XG4rXHRcdGNsb3NlKHNrWzBdKTtcbitcdFx0Y2xvc2Uoc3luY3BpcGVbMV0pO1xuK1x0XHR0aHJlYWRfY2xpZW50KHNrWzFdLCBzeW5jcGlwZVswXSwgc2VuZGVyKTtcbitcdH1cbitcdGNsb3NlKHNrWzFdKTtcbitcdGNsb3NlKHN5bmNwaXBlWzBdKTtcbitcbitcdGludCBvbiA9IDE7XG4rXG4rXHRpZiAoc2V0c29ja29wdChza1swXSwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgXHUwMDI2b24sIHNpemVvZihvbikpKSB7XG4rXHRcdGxvZ19lcnIoXCJGYWlsZWQgdG8gc2V0IHBpZGZkIHBhc3Npbmcgb3B0aW9uXCIpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRpZiAod3JpdGUoc3luY3BpcGVbMV0sIFwiMVwiLCAxKSAhPSAxKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRjbG9zZShzeW5jcGlwZVsxXSk7XG4rXG4rXHRwaWRmZCA9IHJlY3ZfcGlkZmQoc2tbMF0sIGlkcyk7XG4rXHRpZiAocGlkZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAtMTtcbitcbitcdGluZm8tXHUwMDNlbWFzayA9IFBJREZEX0lORk9fUElEO1xuK1x0aWYgKGlvY3RsKHBpZGZkLCBQSURGRF9HRVRfSU5GTywgaW5mbykpIHtcbitcdFx0bG9nX2VycihcImlvY3RsKFBJREZEX0dFVF9JTkZPKVwiKTtcbitcdFx0Y2xvc2UocGlkZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXHRjbG9zZShwaWRmZCk7XG4rXG4rXHQvKiByZWxlYXNlIHRoZSBzZW5kaW5nIHRocmVhZCAqL1xuK1x0aWYgKHdyaXRlKHNrWzBdLCBcInhcIiwgMSkgIT0gMSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0Y2xvc2Uoc2tbMF0pO1xuK1xuK1x0d2FpdHBpZChjaGlsZCwgXHUwMDI2Y2hpbGRfc3RhdHVzLCAwKTtcbitcdGlmICghV0lGRVhJVEVEKGNoaWxkX3N0YXR1cykgfHwgV0VYSVRTVEFUVVMoY2hpbGRfc3RhdHVzKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgc29ja29wdF9zZXQoaW50IGZkLCBpbnQgb3B0bmFtZSwgaW50IHZhbClcbit7XG4rXHRyZXR1cm4gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgXHUwMDI2dmFsLCBzaXplb2YodmFsKSk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgc29ja29wdF9nZXQoaW50IGZkLCBpbnQgb3B0bmFtZSlcbit7XG4rXHRzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKGludCk7XG4rXHRpbnQgdmFsID0gLTE7XG4rXG4rXHRpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgXHUwMDI2dmFsLCBcdTAwMjZsZW4pKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXR1cm4gdmFsO1xuK31cbitcbitURVNUKHNjbV9waWRmZF9zZXRzb2Nrb3B0X3ZhbHVlcylcbit7XG4rXHRpbnQgc2tbMl07XG4rXG4rXHRBU1NFUlRfRVEoMCwgc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc2spKTtcbitcbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCwgMSkpO1xuK1x0QVNTRVJUX0VRKDEsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7XG4rXHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xuK1xuK1x0LyogVGhlIG9wdGlvbiBzZXQgbGFzdCB3aW5zLiAqL1xuK1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkQsIDEpKTtcbitcdEFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEKSk7XG4rXHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcbitcbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCwgMSkpO1xuK1x0QVNTRVJUX0VRKDEsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7XG4rXHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xuK1xuK1x0LyogRGlzYWJsaW5nIG9uZSBvcHRpb24gbGVhdmVzIHRoZSBvdGhlciBhbG9uZS4gKi9cbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZELCAwKSk7XG4rXHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X3NldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCwgMCkpO1xuK1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkQpKTtcbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpO1xuK1xuK1x0Y2xvc2Uoc2tbMF0pO1xuK1x0Y2xvc2Uoc2tbMV0pO1xuK31cbitcbitURVNUKHNjbV9waWRmZF90aHJlYWQpXG4re1xuK1x0c3RydWN0IHRocmVhZF9pZHMgaWRzO1xuK1x0c3RydWN0IHBpZGZkX2luZm8gaW5mbztcbitcbitcdEFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsXG4rXHRcdFx0XHQgICAgICAgXHUwMDI2aWRzLCBcdTAwMjZpbmZvKSk7XG4rXHRBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7XG4rXHRFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpO1xuK1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XG4rfVxuK1xuK1RFU1Qoc2NtX3BpZGZkX3RocmVhZF9ncm91cClcbit7XG4rXHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7XG4rXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHRocmVhZF9waWRmZF9mbG93KHNlbmRfaWRzX3RocmVhZCwgU09fUEFTU1BJREZELFxuK1x0XHRcdFx0ICAgICAgIFx1MDAyNmlkcywgXHUwMDI2aW5mbykpO1xuK1x0QVNTRVJUX05FKGlkcy5waWQsIGlkcy50aWQpO1xuK1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8ucGlkKTtcbitcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpO1xuK31cbitcbitURVNUKHNjbV9waWRmZF90aHJlYWRfY3JlZHMpXG4re1xuK1x0c3RydWN0IHRocmVhZF9pZHMgaWRzO1xuK1x0c3RydWN0IHBpZGZkX2luZm8gaW5mbztcbitcbitcdEFTU0VSVF9FUSgwLCB0aHJlYWRfcGlkZmRfZmxvdyhzZW5kX2lkc19jcmVkc190aHJlYWQsIFNPX1BBU1NQSURGRF9USFJFQUQsXG4rXHRcdFx0XHQgICAgICAgXHUwMDI2aWRzLCBcdTAwMjZpbmZvKSk7XG4rXHRBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7XG4rXHRFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpO1xuK1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpwZWVyX2Nvbm5lY3RfdGhyZWFkKHZvaWQgKmFyZylcbit7XG4rXHRzdHJ1Y3Qgc29ja19hZGRyICpzYSA9IGFyZztcbitcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHtcbitcdFx0LnBpZCA9IGdldHBpZCgpLFxuK1x0XHQudGlkID0gZ2V0dGlkKCksXG4rXHR9O1xuK1x0aW50IGZkO1xuK1x0Y2hhciBzeW5jO1xuK1xuK1x0ZmQgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuK1xuK1x0aWYgKGNvbm5lY3QoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZzYS1cdTAwM2VsaXN0ZW5fYWRkciwgc2EtXHUwMDNlYWRkcmxlbikpXG4rXHRcdHJldHVybiAodm9pZCAqKTE7XG4rXG4rXHRpZiAoc2VuZChmZCwgXHUwMDI2aWRzLCBzaXplb2YoaWRzKSwgMCkgIT0gc2l6ZW9mKGlkcykpXG4rXHRcdHJldHVybiAodm9pZCAqKTE7XG4rXG4rXHQvKiBzdGF5IGFsaXZlIHVudGlsIHRoZSBzZXJ2ZXIgaGFzIGxvb2tlZCBhdCBvdXIgcGlkZmQgKi9cbitcdGlmIChyZWFkKGZkLCBcdTAwMjZzeW5jLCAxKSAhPSAxKVxuK1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuK1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcGVlcl9waWRmZF9pbmZvKGludCBmZCwgaW50IG9wdG5hbWUsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKVxuK3tcbitcdGludCBwaWRmZDtcbitcdHNvY2tsZW5fdCBsZW4gPSBzaXplb2YocGlkZmQpO1xuK1xuK1x0aWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIG9wdG5hbWUsIFx1MDAyNnBpZGZkLCBcdTAwMjZsZW4pKSB7XG4rXHRcdGxvZ19lcnIoXCJnZXRzb2Nrb3B0KFNPX1BFRVJQSURGRCopXCIpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRpbmZvLVx1MDAzZW1hc2sgPSBQSURGRF9JTkZPX1BJRDtcbitcdGlmIChpb2N0bChwaWRmZCwgUElERkRfR0VUX0lORk8sIGluZm8pKSB7XG4rXHRcdGxvZ19lcnIoXCJpb2N0bChQSURGRF9HRVRfSU5GTylcIik7XG4rXHRcdGNsb3NlKHBpZGZkKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0Y2xvc2UocGlkZmQpO1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuKy8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmV0dXJucyBhIHBpZGZkIGZvciB0aGUgcGVlcidzIGNvbm5lY3RpbmcgdGhyZWFkLiAqL1xuK1RFU1Qoc29fcGVlcnBpZGZkX3RocmVhZClcbit7XG4rXHRzdHJ1Y3Qgc29ja19hZGRyIHNhO1xuK1x0c3RydWN0IHRocmVhZF9pZHMgaWRzO1xuK1x0c3RydWN0IHBpZGZkX2luZm8gaW5mbztcbitcdHB0aHJlYWRfdCB0aHJlYWQ7XG4rXHR2b2lkICp0cmV0O1xuK1x0aW50IHNlcnZlciwgY2ZkO1xuK1xuK1x0c2VydmVyID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTtcbitcdEFTU0VSVF9MRSgwLCBzZXJ2ZXIpO1xuK1xuK1x0ZmlsbF9zb2NrYWRkcihcdTAwMjZzYSwgdHJ1ZSk7XG4rXHRBU1NFUlRfRVEoMCwgYmluZChzZXJ2ZXIsIChzdHJ1Y3Qgc29ja2FkZHIgKilcdTAwMjZzYS5saXN0ZW5fYWRkciwgc2EuYWRkcmxlbikpO1xuK1x0QVNTRVJUX0VRKDAsIGxpc3RlbihzZXJ2ZXIsIDEpKTtcbitcbitcdEFTU0VSVF9FUSgwLCBwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIHBlZXJfY29ubmVjdF90aHJlYWQsIFx1MDAyNnNhKSk7XG4rXG4rXHRjZmQgPSBhY2NlcHQoc2VydmVyLCBOVUxMLCBOVUxMKTtcbitcdEFTU0VSVF9MRSgwLCBjZmQpO1xuK1xuK1x0QVNTRVJUX0VRKHNpemVvZihpZHMpLCByZWN2KGNmZCwgXHUwMDI2aWRzLCBzaXplb2YoaWRzKSwgTVNHX1dBSVRBTEwpKTtcbitcdEFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTtcbitcbitcdC8qIFNPX1BFRVJQSURGRCByZWZlcnMgdG8gdGhlIHBlZXIncyB0aHJlYWQtZ3JvdXAuICovXG4rXHRBU1NFUlRfRVEoMCwgcGVlcl9waWRmZF9pbmZvKGNmZCwgU09fUEVFUlBJREZELCBcdTAwMjZpbmZvKSk7XG4rXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby5waWQpO1xuK1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XG4rXG4rXHQvKiBTT19QRUVSUElERkRfVEhSRUFEIHJlZmVycyB0byB0aGUgY29ubmVjdGluZyB0aHJlYWQuICovXG4rXHRBU1NFUlRfRVEoMCwgcGVlcl9waWRmZF9pbmZvKGNmZCwgU09fUEVFUlBJREZEX1RIUkVBRCwgXHUwMDI2aW5mbykpO1xuK1x0RVhQRUNUX0VRKGlkcy50aWQsIGluZm8ucGlkKTtcbitcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnRnaWQpO1xuK1xuK1x0LyogcmVsZWFzZSB0aGUgY29ubmVjdGluZyB0aHJlYWQgKi9cbitcdEFTU0VSVF9FUSgxLCB3cml0ZShjZmQsIFwieFwiLCAxKSk7XG4rXHRBU1NFUlRfRVEoMCwgcHRocmVhZF9qb2luKHRocmVhZCwgXHUwMDI2dHJldCkpO1xuK1x0QVNTRVJUX0VRKE5VTEwsIHRyZXQpO1xuK1xuK1x0Y2xvc2UoY2ZkKTtcbitcdGNsb3NlKHNlcnZlcik7XG4rfVxuK1xuIFRFU1RfSEFSTkVTU19NQUlOXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMDoyNS4wNDEzODU2MjNaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTEyOTY4OTc5NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIFRhcmdldCBJZGVudGlmaWNhdGlvbiBhbmQgQW5hbHlzaXMqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGluaXRpYWwgaW1wcmVzc2lvbiBpcyB0aGF0IHRoaXMgcGF0Y2ggaXMgZGVmaW5pdGVseSB3b3J0aCBmdXp6aW5nLiBXZSdyZSBsb29raW5nIGF0IGZ1bmN0aW9uYWwgY2hhbmdlcyB3aXRoaW4gdGhlIGNvcmUga2VybmVsIG5ldHdvcmtpbmcgc3RhY2ssIHVuaXggc29ja2V0cywgcGlkZnMsIGFuZCBjb3JlZHVtcCBtZWNoYW5pc21zLiBUaGUgaW50cm9kdWN0aW9uIG9mIG5ldyBzb2NrZXQgb3B0aW9ucywgYFNPX1BBU1NQSURGRF9USFJFQURgIGFuZCBgU09fUEVFUlBJREZEX1RIUkVBRGAsIGlzIGEgY2xlYXIgaW5kaWNhdGlvbiB0aGF0IG5ldyBjb2RlIHBhdGhzIGFyZSBiZWluZyBvcGVuZWQsIGFuZCB0aGF04oCZcyBhbHdheXMgYSBnb29kIHNpZ24gZm9yIGZ1enppbmcuIFRoZSBmYWN0IHRoYXQgaXQncyB0b3VjaGluZyBgc2NtX3BpZGZkX3JlY3ZgLCBgX19waWRmc19yZWdpc3Rlcl9waWRzYCwgYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkYCwgYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AgKHRocm91Z2ggYHVuaXhfc2tiX3NjbV9lcWApLCBTQ00gY3JlZGVudGlhbCBoYW5kbGluZywgYW5kIGNvcmVkdW1wIGxvZ2ljIGFjcm9zcyBzZXZlcmFsIHN1YnN5c3RlbXMgbWFrZXMgaXQgYSBqdWljeSB0YXJnZXQuIFRoZXNlIGFyZSBhbGwgY3JpdGljYWwgYXJlYXMsIGFuZCBzdWJ0bGUgZXJyb3JzIGhlcmUgY2FuIGxlYWQgdG8gc2lnbmlmaWNhbnQgdnVsbmVyYWJpbGl0aWVzLlxuXG5Ob3csIHRoZSBuZXh0IHN0ZXAgaXMgdG8gbmFpbCBkb3duIHRoZSBzcGVjaWZpYyBmb2N1cyBwb2ludHMuIEkgbmVlZCB0byBpZGVudGlmeSB0aGUga2V5IGZ1bmN0aW9ucyB0aGF0IGFyZSBtb2RpZmllZCwgYXMgd2VsbCBhcyB0aGUgcmVsZXZhbnQgS2NvbmZpZyBvcHRpb25zLiBUaGlzIHdpbGwgaGVscCBtZSBuYXJyb3cgZG93biB0aGUgZnV6emluZyBzY29wZSBhbmQgdGFpbG9yIHRoZSBmdXp6aW5nIGNhbXBhaWducyBmb3IgbWF4aW11bSBlZmZlY3RpdmVuZXNzLiBJJ2xsIGxpa2VseSBuZWVkIHRvIHVzZSBgZ3JlcHBlcmAgb3IganVzdCBtYW51YWxseSBnbyB0aHJvdWdoIHRoZSBjb2RlIHRvIGlkZW50aWZ5IGZ1bmN0aW9ucy4gV2UgaGF2ZSBhIGxvdCBvZiBhcmVhcyB3aGVyZSBwaWRmZHMgYXJlIGJlaW5nIHVzZWQgc28gbGV0J3Mgc3RhcnQgd2l0aCB0aG9zZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI4NjYsIk91dHB1dFRva2VucyI6MjIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NjMsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMDo1MC4xNzEwODA4OTdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg1MzAxNDAyMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJfX3BpZGZzX3JlZ2lzdGVyX3BpZHNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvcGlkZnMuYz0xMDQ1PWludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKVxcbi0tXFxuZnMvcGlkZnMuYy0xMDgwLS8qIFJlZ2lzdGVyIHRoZSBwaWRzIHVwIHRvIHBpZCB0eXBlIEBsYXN0IG9mIEBwaWRzIGluIHBpZGZzLiAqL1xcbmZzL3BpZGZzLmM6MTA4MTppbnQgX19waWRmc19yZWdpc3Rlcl9waWRzKHN0cnVjdCBwaWQgKmNvbnN0ICpwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QpXFxuZnMvcGlkZnMuYy0xMDgyLXtcXG4tLVxcbmluY2x1ZGUvbGludXgvcGlkZnMuaD0zNT12b2lkIHBpZGZzX2ZyZWVfcGlkKHN0cnVjdCBwaWQgKnBpZCk7XFxuaW5jbHVkZS9saW51eC9waWRmcy5oOjM2OmludCBfX3BpZGZzX3JlZ2lzdGVyX3BpZHMoc3RydWN0IHBpZCAqY29uc3QgKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdCk7XFxuaW5jbHVkZS9saW51eC9waWRmcy5oLTM3LVxcbmluY2x1ZGUvbGludXgvcGlkZnMuaC0zOC0vKiBSZWdpc3RlciB0aGUgcGlkcyBvZiBhbiBhcnJheSBkZWNsYXJlZCB3aXRoIERFQ0xBUkVfUElEUygpLiAqL1xcbmluY2x1ZGUvbGludXgvcGlkZnMuaDozOTojZGVmaW5lIHBpZGZzX3JlZ2lzdGVyX3BpZHMocGlkcylcXHRfX3BpZGZzX3JlZ2lzdGVyX3BpZHMocGlkcywgcGlkc19sYXN0KHBpZHMpKVxcbmluY2x1ZGUvbGludXgvcGlkZnMuaC00MC1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzA6NTMuMDI0MTAxMzE5WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjM0MjY4MjQyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJIHdlcmUgdGhpbmtpbmcgdGhyb3VnaCB0aGUgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byB0aGUgYHBpZGZzX2NvcmVkdW1wYCBGdW5jdGlvbioqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgdGFraW5nIGEgbG9vayBhdCB0aGUgYHBpZGZzX2NvcmVkdW1wYCBmdW5jdGlvbi4gSXQncyBsb2NhdGVkIGluIGBmcy9waWRmcy5jYCwgd2hpY2ggbWFrZXMgc2Vuc2U7IHRoaXMgaXMgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gZmluZCBjb3JlIGR1bXAtcmVsYXRlZCBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGUgcGlkZnMgZnJhbWV3b3JrLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQgaGFuZGxlcyBjb3JlIGR1bXBzLCBlc3BlY2lhbGx5IGluIHJlbGF0aW9uIHRvIHByb2Nlc3MgSURzLiBJJ20gaG9waW5nIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiBob3cgdGhpcyBmdW5jdGlvbiBpbnRlcmFjdHMgd2l0aCB0aGUga2VybmVsJ3MgY29yZSBkdW1waW5nIG1lY2hhbmlzbXMgYW5kIHdoYXQgc3BlY2lmaWMgcm9sZXMgcGlkZnMgcGxheXMgaW4gdGhlIG92ZXJhbGwgZmxvdy4gSSdsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkLCB0aGUgZXJyb3IgaGFuZGxpbmcsIGFuZCBhbnkgcG90ZW50aWFsIHNlY3VyaXR5IGNvbnNpZGVyYXRpb25zLiBUaGlzIHNob3VsZCBiZSBhbiBpbnRlcmVzdGluZyBleHBsb3JhdGlvbiBpbnRvIGhvdyB0aGUga2VybmVsIG9yY2hlc3RyYXRlcyBjb3JlIGR1bXBzIHdpdGhpbiBhIFBJRCBmaWxlc3lzdGVtIGNvbnRleHQuIEkgZXhwZWN0IHRvIHNlZSBzb21lIGludGVyZXN0aW5nIGludGVyYWN0aW9ucyB3aXRoIHByb2Nlc3Mgc3RhdGVzIGFuZCBtZW1vcnkgbWFwcGluZy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjQ0NTEsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMDo1OS4zNjY3ODgwMDZaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjEzODg2MjkzNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJwaWRmc19jb3JlZHVtcFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9jb3JlZHVtcC5jPTYyMz1zdGF0aWMgaW50IHVtaF9jb3JlZHVtcF9zZXR1cChzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvLCBzdHJ1Y3QgY3JlZCAqbmV3KVxcbi0tXFxuZnMvY29yZWR1bXAuYy02MzktXFxuZnMvY29yZWR1bXAuYzo2NDA6XFx0XFx0cGlkZnNfY29yZWR1bXAoY3ApO1xcbmZzL2NvcmVkdW1wLmMtNjQxLVxcbi0tXFxuZnMvY29yZWR1bXAuYz02NzI9c3RhdGljIGJvb2wgY29yZWR1bXBfc29ja19jb25uZWN0KHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbi0tXFxuZnMvY29yZWR1bXAuYy03MTQtXFx0ICovXFxuZnMvY29yZWR1bXAuYzo3MTU6XFx0cGlkZnNfY29yZWR1bXAoY3BybSk7XFxuZnMvY29yZWR1bXAuYy03MTYtXFxuLS1cXG5mcy9waWRmcy5jPTMyOT1zdGF0aWMgaW5saW5lIGJvb2wgcGlkX2luX2N1cnJlbnRfcGlkbnMoY29uc3Qgc3RydWN0IHBpZCAqcGlkKVxcbi0tXFxuZnMvcGlkZnMuYy0zMzgtXFxuZnMvcGlkZnMuYzozMzk6c3RhdGljIF9fdTMyIHBpZGZzX2NvcmVkdW1wX21hc2soZW51bSB0YXNrX2R1bXBhYmxlIGR1bXBhYmxlKVxcbmZzL3BpZGZzLmMtMzQwLXtcXG4tLVxcbmZzL3BpZGZzLmM9MzY1PXN0YXRpYyBsb25nIHBpZGZkX2luZm8oc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKVxcbi0tXFxuZnMvcGlkZnMuYy00MzMtXFx0aWYgKChtYXNrIFxcdTAwMjYgUElERkRfSU5GT19DT1JFRFVNUCkgXFx1MDAyNlxcdTAwMjYgIWtpbmZvLmNvcmVkdW1wX21hc2spIHtcXG5mcy9waWRmcy5jOjQzNDpcXHRcXHRraW5mby5jb3JlZHVtcF9tYXNrID0gcGlkZnNfY29yZWR1bXBfbWFzayh0YXNrX2V4ZWNfc3RhdGVfZ2V0X2R1bXBhYmxlKHRhc2spKTtcXG5mcy9waWRmcy5jLTQzNS1cXHRcXHRraW5mby5tYXNrIHw9IFBJREZEX0lORk9fQ09SRURVTVA7XFxuLS1cXG5mcy9waWRmcy5jPTc0OT12b2lkIHBpZGZzX2V4aXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spXFxuLS1cXG5mcy9waWRmcy5jLTc5NS0jaWZkZWYgQ09ORklHX0NPUkVEVU1QXFxuZnMvcGlkZnMuYzo3OTY6c3RhdGljIHZvaWQgcGlkZnNfY29yZWR1bXBfcGlkKHN0cnVjdCBwaWQgKnBpZCxcXG5mcy9waWRmcy5jLTc5Ny1cXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG4tLVxcbmZzL3BpZGZzLmMtODA2LVxcdC8qIE5vdGUgaG93IHdlIHdlcmUgY29yZWR1bXBlZCBhbmQgdGhhdCB3ZSBjb3JlZHVtcGVkLiAqL1xcbmZzL3BpZGZzLmM6ODA3OlxcdGF0dHItXFx1MDAzZWNvcmVkdW1wX21hc2sgPSBwaWRmc19jb3JlZHVtcF9tYXNrKGNwcm0tXFx1MDAzZWR1bXBhYmxlKSB8XFxuZnMvcGlkZnMuYy04MDgtXFx0XFx0XFx0ICAgICAgUElERkRfQ09SRURVTVBFRDtcXG4tLVxcbmZzL3BpZGZzLmMtODE3LVxcbmZzL3BpZGZzLmM6ODE4OnZvaWQgcGlkZnNfY29yZWR1bXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG5mcy9waWRmcy5jLTgxOS17XFxuLS1cXG5mcy9waWRmcy5jLTgyMS1cXHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFxcdTAwM2M9IHBpZHNfbGFzdChjcHJtLVxcdTAwM2VwaWQpOyB0eXBlKyspXFxuZnMvcGlkZnMuYzo4MjI6XFx0XFx0cGlkZnNfY29yZWR1bXBfcGlkKGNwcm0tXFx1MDAzZXBpZFt0eXBlXSwgY3BybSk7XFxuZnMvcGlkZnMuYy04MjMtfVxcbi0tXFxuaW5jbHVkZS9saW51eC9waWRmcy5oPTE1PXZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7XFxuaW5jbHVkZS9saW51eC9waWRmcy5oLTE2LSNpZmRlZiBDT05GSUdfQ09SRURVTVBcXG5pbmNsdWRlL2xpbnV4L3BpZGZzLmg6MTc6dm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKTtcXG5pbmNsdWRlL2xpbnV4L3BpZGZzLmgtMTgtI2VuZGlmXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMxOjAxLjUwNTY1ODYxMloiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU2NzY5NzQ0ODMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQ29kZSBJbnNwZWN0aW9uOiBTb2NrZXQtUmVsYXRlZCBDaGFuZ2VzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlc2UgY29kZSBtb2RpZmljYXRpb25zIGJldHRlci4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGRpdmUgaW50byB0aGUgY29yZSBuZXR3b3JraW5nIGNvZGUsIHNwZWNpZmljYWxseSBleGFtaW5pbmcgaG93IHNvY2tldHMgYXJlIGludGVyYWN0aW5nIHdpdGggdGhlIGNoYW5nZXMuIEknbSBnb2luZyB0byBzdGFydCB3aXRoIGEgc3lzdGVtYXRpYyByZXZpZXcsIGhpdHRpbmcgdGhlIGtleSBmaWxlczogYG5ldC9jb3JlL3NjbS5jYCwgYG5ldC91bml4L2FmX3VuaXguY2AsIGFuZCBgbmV0L2NvcmUvc29jay5jYC4gVGhlc2Ugc2VlbSBsaWtlIHRoZSBtb3N0IGxpa2VseSBjYW5kaWRhdGVzIGZvciByZWxldmFudCBjaGFuZ2VzLiBJJ2xsIGFsc28gYmUgc3VyZSB0byBkb3VibGUtY2hlY2sgdGhlaXIgc3ltYm9scyB0byBjb25maXJtIG15IGFzc3VtcHRpb24sIGFuZCB0byBub3RlIGFueSBub24tc3RhdGljIGZ1bmN0aW9ucyBhcyB0aG9zZSBhcmUgbW9yZSBsaWtlbHkgdG8gYmUgZW50cnkgcG9pbnRzLlxuXG5OZXh0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYmVlbiAqbW9kaWZpZWQqLiBJIGNhbiBzZWUgYSBjb3VwbGUgb2YgZnVuY3Rpb25zIGZyb20gYGZzL3BpZGZzLmNgIC0gYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AgKGV4cG9ydGVkKSBhbmQgYHBpZGZzX2NvcmVkdW1wYCAobm9uLXN0YXRpYykgLSB0aGF0IHNlZW0gcmVsZXZhbnQgdG8gcHJvY2VzcyBJRCBoYW5kbGluZyBkdXJpbmcgYSBjb3JlIGR1bXAuIFRoZW4sIEkgY2FuIHNlZSBjaGFuZ2VzIGluIGBuZXQvY29yZS9zY20uY2AsIHdoZXJlIGBzY21fcmVjdl91bml4YCBjYWxscyBgc2NtX3BpZGZkX3JlY3ZgIGFuZCBgX19zY21fc2VuZGAgaXMgcHJlc2VudC4gSXQgc2VlbXMgbGlrZSB0aGUgU3lzdGVtIENvbnRyb2wgTWVzc2FnZSAoU0NNKSBwYXRoIGhhcyBzb21lIHVwZGF0ZXMuIGBuZXQvY29yZS9zb2NrLmNgIGhhcyBgc2tfc2V0c29ja29wdGAgYW5kIGBza19nZXRzb2Nrb3B0YCAtIHNvY2tldCBvcHRpb25zIHNlZW0gdG8gYmUgYWZmZWN0ZWQsIHdoaWNoIGNvdWxkIGJlIGNvbm5lY3RlZC4gSW4gYG5ldC91bml4L2FmX3VuaXguY2AsIHRoZXJlJ3MgYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AgKHN0YXRpYywgYnV0IGNhbGxlZCBieSBub24tc3RhdGljIGZ1bmN0aW9ucyBsaWtlIGB1bml4X3N0cmVhbV9yZWN2bXNnYCBhbmQgYHVuaXhfZGdyYW1fcmVjdm1zZ2ApIGFsb25nIHdpdGggYHVuaXhfbGlzdGVuYCwgYHVuaXhfc3RyZWFtX2Nvbm5lY3RgLCBldGMuIC0gYmFzaWMgVW5peCBkb21haW4gc29ja2V0IGZ1bmN0aW9ucywgYWxzbyBsaWtlbHkgdG8gYmUgcGVydGluZW50LiBBbmQgZmluYWxseSwgYGZzL2NvcmVkdW1wLmNgLCB3aGVyZSBgZG9fY29yZWR1bXBgIG5vdyBjYWxscyBmdW5jdGlvbnMgbGlrZSBgY29yZWR1bXBfc29ja19jb25uZWN0YCBhbmQgYHVtaF9jb3JlZHVtcF9zZXR1cGAsIHdoaWNoIGFnYWluIHBvaW50cyB0byBzb2NrZXQgaW50ZXJhY3Rpb24gZHVyaW5nIGNvcmVkdW1wcy5cblxuU28sIG92ZXJhbGwsIHRoaXMgbG9va3MgbGlrZSBhIG11bHRpZmFjZXRlZCBjaGFuZ2UsIGxpa2VseSByZWxhdGVkIHRvIGhvdyBzb2NrZXRzLCBQSUQgZmlsZXMsIGFuZCBjb3JlZHVtcHMgaW50ZXJhY3QuIFRoZXJlIHNlZW1zIHRvIGJlIHNvbWUgcmVmYWN0b3JpbmcgZ29pbmcgb24sIGFsb25nIHdpdGggbW9yZSBjYWxscyB0byBgcGlkZmRfcmVjdmAgd2l0aGluIHRoZSBTQ00gcGF0aC4gSSBzaG91bGQgYWxzbyBub3RlIGFueSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlc2UgbW9kaWZpY2F0aW9ucywgYW5kIHNlZSBob3cgdGhleSBhcmUgaW50ZXJsaW5rZWQuIEkgYWxzbyBuZWVkIHRvIG1ha2Ugc3VyZSB0byBkb3VibGUtY2hlY2sgdGhlIHN5bWJvbHMgaW4gYG5ldC9jb3JlL3NjbS5jYCBhbmQgYG5ldC91bml4L2FmX3VuaXguY2AgdG8gY29uZmlybSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBub24tc3RhdGljIGZ1bmN0aW9ucyBhbmQgdGhlaXIgcG90ZW50aWFsIGVudHJ5IHBvaW50cy4gVGhpcyB3aWxsIGdpdmUgbWUgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBtb2RpZmllZCBjb2RlIHBhdGh3YXlzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNTUzNSwiT3V0cHV0VG9rZW5zIjoyMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMTo1OC4yNzU0MTA4MjRaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg0NzIzMTUwMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ2b2lkIHNjbV9yZWN2X3VuaXhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9uZXQvc2NtLmg9MTA0PXZvaWQgc2NtX3JlY3Yoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbmluY2x1ZGUvbmV0L3NjbS5oLTEwNS1cXHQgICAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpO1xcbmluY2x1ZGUvbmV0L3NjbS5oOjEwNjp2b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbmluY2x1ZGUvbmV0L3NjbS5oLTEwNy1cXHRcXHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpO1xcbi0tXFxubmV0L2NvcmUvc2NtLmM9NTgxPUVYUE9SVF9TWU1CT0woc2NtX3JlY3YpO1xcbm5ldC9jb3JlL3NjbS5jLTU4Mi1cXG5uZXQvY29yZS9zY20uYzo1ODM6dm9pZCBzY21fcmVjdl91bml4KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG5uZXQvY29yZS9zY20uYy01ODQtXFx0XFx0ICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMjowMS4xMjI2NDk0NjdaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2MDA1NTE5NTQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgdGhlIHN1bW1hcnksIGFzc3VtaW5nIEknbSBhbiBleHBlcnQgYW5kIHRoaXMgaXMgcGFydCBvZiBhIGRlYnVnZ2luZy9hbmFseXNpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBEZWVwZXI6IEV4cGxvcmluZyBgX19zY21fc2VuZGAqKlxuXG5Pa2F5LCBJJ3ZlIGp1c3QgYmVlbiBsb29raW5nIGF0IHNvbWUgcmVsYXRlZCBmdW5jdGlvbnMgYW5kIGJlaGF2aW9ycywgYW5kIGJlZm9yZSBJIG1vdmUgb24gdG8gYW55dGhpbmcgZWxzZSwgSSBuZWVkIHRvIGNpcmNsZSBiYWNrIGFuZCBkb3VibGUtY2hlY2sgYF9fc2NtX3NlbmRgLiBJJ20gYWxyZWFkeSBwcmV0dHkgZmFtaWxpYXIgd2l0aCB0aGUgc3lzdGVtLWxldmVsIGNvbW11bmljYXRpb24sIGJ1dCBJIGhhdmUgYSBuYWdnaW5nIGZlZWxpbmcgdGhhdCBhIHBvdGVudGlhbCBpc3N1ZSBtaWdodCBiZSBsdXJraW5nIHdpdGhpbiB0aGF0IHBhcnRpY3VsYXIgZnVuY3Rpb24uIEkgbmVlZCB0byBtYWtlIGFic29sdXRlbHkgc3VyZSB0aGF0IGl0J3MgaGFuZGxpbmcgdGhlIGRhdGEgZmxvdyBjb3JyZWN0bHksIHRoYXQgdGhlIGVycm9yIGNoZWNraW5nIGlzIHJvYnVzdCBlbm91Z2gsIGFuZCB0aGF0IHRoZXJlIGFyZW4ndCBhbnkgc3VidGxlIHJhY2UgY29uZGl0aW9ucyBvciBtZW1vcnkgaXNzdWVzIHRoYXQgY291bGQgYmUgdHJpZ2dlcmVkIHVuZGVyIHNwZWNpZmljIGNpcmN1bXN0YW5jZXMuIEl0J3MgYSBrZXkgcGllY2Ugb2YgdGhlIHB1enpsZSwgc28gSSBuZWVkIHRvIG1ha2Ugc3VyZSBJJ20gbm90IG1pc3NpbmcgYW55dGhpbmcuIEknbGwgdGFrZSBhIGNsb3NlIGxvb2sgYXQgaXRzIGludGVyYWN0aW9uIHdpdGggdGhlIG90aGVyIGNvbXBvbmVudHMgSSd2ZSByZXZpZXdlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjY2ODIsIk91dHB1dFRva2VucyI6MTksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMjowNy4xMjgxNzI5MTZaIiwiU2VxIjoxMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI3MzIyODY4NDEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiaW50IF9fc2NtX3NlbmRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9uZXQvc2NtLmg9NTQ9dm9pZCBzY21fZGV0YWNoX2Zkc19jb21wYXQoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBib29sIG5vdHJ1bmMpO1xcbmluY2x1ZGUvbmV0L3NjbS5oOjU1OmludCBfX3NjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSk7XFxuaW5jbHVkZS9uZXQvc2NtLmgtNTYtdm9pZCBfX3NjbV9kZXN0cm95KHN0cnVjdCBzY21fY29va2llICpzY20pO1xcbi0tXFxubmV0L2NvcmUvc2NtLmM9MTUwPXN0YXRpYyBpbmxpbmUgaW50IHNjbV9yZXBsYWNlX3BpZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3QgcGlkICpwaWQpXFxuLS1cXG5uZXQvY29yZS9zY20uYy0xNzctXFxubmV0L2NvcmUvc2NtLmM6MTc4OmludCBfX3NjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnApXFxubmV0L2NvcmUvc2NtLmMtMTc5LXtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzI6MDkuODYwNDcwOTg3WiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjUyOTM4ODk5NTQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzLlxuXG4qKkludmVzdGlnYXRpbmcgU29ja2V0IE9wdGlvbiBNYW5hZ2VtZW50IGluIHRoZSBMaW51eCBLZXJuZWwqKlxuXG5SaWdodCwgSSBuZWVkIHRvIGdldCB0byB0aGUgYm90dG9tIG9mIGhvdyB0aGVzZSBzb2NrZXQgb3B0aW9ucyBhcmUgaGFuZGxlZC4gSSdtIGdvaW5nIHRvIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgYHNrX3NldHNvY2tvcHRgIGFuZCBgc2tfZ2V0c29ja29wdGAgZnVuY3Rpb25zLiBNeSBpbnN0aW5jdHMgdGVsbCBtZSB0aG9zZSBhcmUgdGhlIGtleSBmdW5jdGlvbnMgdG8gdHJhY2UuIEknbGwgaGVhZCBvdmVyIHRvIGBuZXQvY29yZS9zb2NrLmNgIC0gdGhhdCBzZWVtcyBsaWtlIHRoZSBtb3N0IGxvZ2ljYWwgcGxhY2UgdG8gYmVnaW4uIFdhaXQgYSBzZWNvbmQsIGFyZSBgc2tfc2V0c29ja29wdGAgYW5kIGBza19nZXRzb2Nrb3B0YCAqbm90KiBkZWNsYXJlZCBhcyBzdGF0aWM/IFRoYXQgdGhyb3dzIGEgc2xpZ2h0IHdyZW5jaCBpbnRvIG15IGltbWVkaWF0ZSBtZW50YWwgbW9kZWwuIEknbGwgbmVlZCB0byBjb25maXJtIHRoYXQuIE9rYXksIHRvIG1ha2Ugc3VyZSwgSSdsbCBkb3VibGUgY2hlY2sgdGhlIGRlY2xhcmF0aW9ucy4gVGltZSB0byBjaGVjayBgaW5jbHVkZS9uZXQvc29jay5oYCBvciBwb3RlbnRpYWxseSBgbmV0L2NvcmUvc29jay5jYCB0byBzZWUgaG93IHRob3NlIGFyZSBzZXQgdXAuIE5lZWQgdG8gbWFrZSBzdXJlIEkgaGF2ZSB0aGUgZnVsbCBwaWN0dXJlIGJlZm9yZSBJIHN0YXJ0IGRpZ2dpbmcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3MTM0LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzI6MTUuMTU0MzYzNzExWiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNzU0OTUxMDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImludCBza19nZXRzb2Nrb3B0XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbmV0L3NvY2suaD0xODk0PWludCBkb19zb2NrX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgYm9vbCBjb21wYXQsIGludCBsZXZlbCxcXG4tLVxcbmluY2x1ZGUvbmV0L3NvY2suaC0xODk2LVxcbmluY2x1ZGUvbmV0L3NvY2suaDoxODk3OmludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcXG5pbmNsdWRlL25ldC9zb2NrLmgtMTg5OC1cXHRcXHQgIHNvY2twdHJfdCBvcHR2YWwsIHNvY2twdHJfdCBvcHRsZW4pO1xcbi0tXFxubmV0L2NvcmUvc29jay5jPTE3MzE9c3RhdGljIGludCBncm91cHNfdG9fdXNlcihzb2NrcHRyX3QgZHN0LCBjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqc3JjKVxcbi0tXFxubmV0L2NvcmUvc29jay5jLTE3NDYtLyogSGFuZCBvdXQgYSBwaWRmZCBmb3IgQHR5cGUgb2YgdGhlIHNvY2tldCdzIHBlZXIgdmlhIFNPX1BFRVJQSURGRCouICovXFxubmV0L2NvcmUvc29jay5jOjE3NDc6c3RhdGljIGludCBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZChzdHJ1Y3Qgc29jayAqc2ssIGVudW0gcGlkX3R5cGUgdHlwZSxcXG5uZXQvY29yZS9zb2NrLmMtMTc0OC1cXHRcXHRcXHRcXHQgICBzb2NrcHRyX3Qgb3B0dmFsLCBzb2NrcHRyX3Qgb3B0bGVuLCBpbnQgbGVuKVxcbi0tXFxubmV0L2NvcmUvc29jay5jLTE3ODktXFxubmV0L2NvcmUvc29jay5jOjE3OTA6aW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxcbm5ldC9jb3JlL3NvY2suYy0xNzkxLVxcdFxcdCAgc29ja3B0cl90IG9wdHZhbCwgc29ja3B0cl90IG9wdGxlbilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzI6MTcuOTA5MzIwNTIxWiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE0OTk1NDkwOTQ5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBza19zZXRzb2Nrb3B0YCoqXG5cbkFscmlnaHQsIGxldCdzIGdldCBkb3duIHRvIGl0LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgaW5zIGFuZCBvdXRzIG9mIHNvY2tldCBvcHRpb24gc2V0dGluZyBhdCB0aGUgY29yZSBsZXZlbC4gU3BlY2lmaWNhbGx5LCBJJ20gdGhpbmtpbmcgYWJvdXQgYHNrX3NldHNvY2tvcHRgIHdpdGhpbiBgbmV0L2NvcmUvc29jay5jYC4gVGhhdCdzIHdoZXJlIEkgZXhwZWN0IHRvIGZpbmQgdGhlIGZ1bmRhbWVudGFsIHNvY2tldCBvcHRpb24gbWFuYWdlbWVudCBsb2dpYywgdGhlIGhlYXJ0IG9mIGhvdyB0aGVzZSBvcHRpb25zIGdldCBoYW5kbGVkIGJlZm9yZSB0aGV5IHJpcHBsZSBvdXQgdG8gdGhlIGFwcHJvcHJpYXRlIHByb3RvY29sLXNwZWNpZmljIGhhbmRsZXJzLiBJJ20gaG9waW5nIHRvIHNlZSBob3cgdGhlIG9wdGlvbiBkYXRhIGlzIHZhbGlkYXRlZCwgd2hlcmUgdGhlIG9wdGlvbiBnZXRzIGRpc3BhdGNoZWQgYmFzZWQgb24gaXRzIGxldmVsIGFuZCBuYW1lLCBhbmQsIG9mIGNvdXJzZSwgaG93IHRoZSBrZXJuZWwgaGFuZGxlcyBwb3RlbnRpYWwgZXJyb3JzLiBJJ2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGludm9sdmVkLCBsaWtlIGBzb2NrYCBpdHNlbGYgYW5kIGFueSBhc3NvY2lhdGVkIG9wdGlvbiBzdHJ1Y3R1cmVzLCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHdoYXQncyBoYXBwZW5pbmcuIE15IGdvYWwgaGVyZSBpcyB0byBlc3RhYmxpc2ggYSBzb2xpZCBncmFzcCBvZiB0aGlzIGNyaXRpY2FsIGFyZWEuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3Nzk2LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzI6MzIuOTA0ODE1MVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjc1MTU1MzA1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJpbnQgc2tfc2V0c29ja29wdFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9zb2NrLmg9MTg3Nj1zdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NldF9vd25lcl9lZGVtdXgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKVxcbi0tXFxuaW5jbHVkZS9uZXQvc29jay5oLTE4ODctXFxuaW5jbHVkZS9uZXQvc29jay5oOjE4ODg6aW50IHNrX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxcbmluY2x1ZGUvbmV0L3NvY2suaC0xODg5LVxcdFxcdCAgc29ja3B0cl90IG9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbik7XFxuLS1cXG5uZXQvY29yZS9zb2NrLmM9MTE3OD1zdGF0aWMgaW50IHNvY2tvcHRfdmFsaWRhdGVfY2xvY2tpZChfX2tlcm5lbF9jbG9ja2lkX3QgdmFsdWUpXFxuLS1cXG5uZXQvY29yZS9zb2NrLmMtMTE5My1cXG5uZXQvY29yZS9zb2NrLmM6MTE5NDppbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxubmV0L2NvcmUvc29jay5jLTExOTUtXFx0XFx0ICBzb2NrcHRyX3Qgb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMjozNS42NTYzNzY2N1oiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTgxMzEzMjgyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipFeGFtaW5pbmcgVW5peCBTb2NrZXQgQ3JlZGVudGlhbCBIYW5kbGluZyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW4uIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzIHRvIHplcm8gaW4gb24gYG5ldC91bml4L2FmX3VuaXguY2AuIFRoYXQncyB3aGVyZSBJIGV4cGVjdCB0byBmaW5kIHRoZSBmdW5jdGlvbnMgaW52b2x2ZWQgaW4gVW5peCBkb21haW4gc29ja2V0IGNyZWRlbnRpYWwgbWFuYWdlbWVudC4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGJlZW4gY2hhbmdlZCBvciB3aGF0IG1pZ2h0IGJlIHJlbGV2YW50IHRvIG15IGFyZWEgb2YgZXhwZXJ0aXNlLlxuXG5TcGVjaWZpY2FsbHksIEkgbmVlZCB0byB0cmFjZSB0aGUgdXNhZ2Ugb2YgZnVuY3Rpb25zIGxpa2UgYHByZXBhcmVfcGVlcmNyZWRgLCBgdXBkYXRlX3BlZXJjcmVkYCwgYGNvcHlfcGVlcmNyZWRgLCBhbmQgYHVuaXhfbWF5YmVfYWRkX2NyZWRzYC4gVW5kZXJzdGFuZGluZyB0aGUgY2FsbCBncmFwaCBmb3IgdGhlc2Ugd2lsbCBnaXZlIG1lIGEgc29saWQgZ3Jhc3Agb24gaG93IGNyZWRlbnRpYWxzIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBVbml4IHNvY2tldHMgYW5kIGFueSBwb3RlbnRpYWwgdnVsbmVyYWJpbGl0aWVzIG9yIGltcHJvdmVtZW50cyBpbiB0aGUgcmVjZW50IGNvZGUgY2hhbmdlcy5cblxuXG4iLCJJbnB1dFRva2VucyI6MjgyODMsIk91dHB1dFRva2VucyI6NDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3MSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMjo1Ny40Njk1MTI3OTdaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjExNTAxNDcyMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJwcmVwYXJlX3BlZXJjcmVkfHVuaXhfbWF5YmVfYWRkX2NyZWRzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdW5peC9hZl91bml4LmM9NzM5PXN0cnVjdCB1bml4X3BlZXJjcmVkIHtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy03NDMtXFxubmV0L3VuaXgvYWZfdW5peC5jOjc0NDpzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX3BlZXJjcmVkKHN0cnVjdCB1bml4X3BlZXJjcmVkICpwZWVyY3JlZClcXG5uZXQvdW5peC9hZl91bml4LmMtNzQ1LXtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz04MDU9c3RhdGljIGludCB1bml4X2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZylcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy04MTctXFx0XFx0Z290byBvdXQ7XFx0LyogTm8gbGlzdGVucyBvbiBhbiB1bmJvdW5kIHNvY2tldCAqL1xcbm5ldC91bml4L2FmX3VuaXguYzo4MTg6XFx0ZXJyID0gcHJlcGFyZV9wZWVyY3JlZChcXHUwMDI2cGVlcmNyZWQpO1xcbm5ldC91bml4L2FmX3VuaXguYy04MTktXFx0aWYgKGVycilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0xNjMxPXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqdWFkZHIsXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMTY1OS1cXG5uZXQvdW5peC9hZl91bml4LmM6MTY2MDpcXHRlcnIgPSBwcmVwYXJlX3BlZXJjcmVkKFxcdTAwMjZwZWVyY3JlZCk7XFxubmV0L3VuaXgvYWZfdW5peC5jLTE2NjEtXFx0aWYgKGVycilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0xODExPXN0YXRpYyBpbnQgdW5peF9zb2NrZXRwYWlyKHN0cnVjdCBzb2NrZXQgKnNvY2thLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrYilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0xODE2LVxcbm5ldC91bml4L2FmX3VuaXguYzoxODE3OlxcdGVyciA9IHByZXBhcmVfcGVlcmNyZWQoXFx1MDAyNnNrYV9wZWVyY3JlZCk7XFxubmV0L3VuaXgvYWZfdW5peC5jLTE4MTgtXFx0aWYgKGVycilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0xODIwLVxcbm5ldC91bml4L2FmX3VuaXguYzoxODIxOlxcdGVyciA9IHByZXBhcmVfcGVlcmNyZWQoXFx1MDAyNnNrYl9wZWVyY3JlZCk7XFxubmV0L3VuaXgvYWZfdW5peC5jLTE4MjItXFx0aWYgKGVycikge1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTIwMDM9c3RhdGljIHZvaWQgdW5peF9za2JfdG9fc2NtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY21fY29va2llICpzY20pXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjAxMi0vKipcXG5uZXQvdW5peC9hZl91bml4LmM6MjAxMzogKiB1bml4X21heWJlX2FkZF9jcmVkcygpIC0gQWRkcyBjdXJyZW50IHRhc2sgdWlkL2dpZCBhbmQgc3RydWN0IHBpZCB0byBza2IgaWYgbmVlZGVkLlxcbm5ldC91bml4L2FmX3VuaXguYy0yMDE0LSAqIEBza2I6IHNrYiB0byBhdHRhY2ggY3JlZHMgdG8uXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjAyNC0gKi9cXG5uZXQvdW5peC9hZl91bml4LmM6MjAyNTpzdGF0aWMgaW50IHVuaXhfbWF5YmVfYWRkX2NyZWRzKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBzb2NrICpzayxcXG5uZXQvdW5peC9hZl91bml4LmMtMjAyNi1cXHRcXHRcXHRcXHRjb25zdCBzdHJ1Y3Qgc29jayAqb3RoZXIpXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjA5NT1zdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjE4OS1cXG5uZXQvdW5peC9hZl91bml4LmM6MjE5MDpcXHRlcnIgPSB1bml4X21heWJlX2FkZF9jcmVkcyhza2IsIHNrLCBvdGhlcik7XFxubmV0L3VuaXgvYWZfdW5peC5jLTIxOTEtXFx0aWYgKGVycilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yMzI5PXN0YXRpYyBpbnQgcXVldWVfb29iKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqb3RoZXIsXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjM0NC1cXG5uZXQvdW5peC9hZl91bml4LmM6MjM0NTpcXHRlcnIgPSB1bml4X21heWJlX2FkZF9jcmVkcyhza2IsIHNrLCBvdGhlcik7XFxubmV0L3VuaXgvYWZfdW5peC5jLTIzNDYtXFx0aWYgKGVycilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yMzg5PXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjQ2Mi1cXG5uZXQvdW5peC9hZl91bml4LmM6MjQ2MzpcXHRcXHRlcnIgPSB1bml4X21heWJlX2FkZF9jcmVkcyhza2IsIHNrLCBvdGhlcik7XFxubmV0L3VuaXgvYWZfdW5peC5jLTI0NjQtXFx0XFx0aWYgKGVycilcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzI6NTcuNTg0NTM0NjM4WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjExMjEzOTI4NzQxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkFuYWx5emluZyBgbmV0L3VuaXgvYWZfdW5peC5jYCBmb3IgTm9uLVN0YXRpYyBGdW5jdGlvbnMqKlxuXG5SaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkgbmVlZCB0byB0YWtlIGEgbG9vayBhdCBgbmV0L3VuaXgvYWZfdW5peC5jYC4gU3BlY2lmaWNhbGx5LCBJIHdhbnQgdG8gemVybyBpbiBvbiB0aGUgKm5vbi1zdGF0aWMqIGZ1bmN0aW9ucyB3aXRoaW4gdGhhdCBmaWxlLiBJIGtub3cgdGhlIHN0YXRpYyBvbmVzIGFyZSBsaWtlbHkgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscywgc2NvcGVkIG9ubHkgdG8gdGhhdCBjb21waWxhdGlvbiB1bml0LCBidXQgdGhlIG5vbi1zdGF0aWMgb25lc+KApiAqdGhvc2UqIGFyZSB0aGUgaW50ZXJmYWNlIHBvaW50cy4gVGhvc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCB0aGUgcmVzdCBvZiB0aGUga2VybmVsLCBvciBwb3NzaWJseSBldmVuIHVzZXIgc3BhY2UsIG1pZ2h0IGJlIGNhbGxpbmcgaW50by4gVGhhdCdzIHdoZXJlIHRoZSBpbnRlcmVzdGluZyBzdHVmZiB1c3VhbGx5IGxpdmVzLCB0aGUgc3R1ZmYgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgSSB3YW50IHRvIGdyYXNwIHRoZSBiaWdnZXIgcGljdHVyZSBvZiBob3cgVW5peCBkb21haW4gc29ja2V0cyBhcmUgaW1wbGVtZW50ZWQgd2l0aGluIHRoZSBrZXJuZWwuIEknbGwgbmVlZCB0byBzZWUgaG93IHRoZSBzb2NrZXQgY3JlYXRpb24sIGNvbm5lY3Rpb24gaGFuZGxpbmcsIGRhdGEgdHJhbnNmZXIsIGFuZCBjbGVhbnVwIGFyZSBleHBvc2VkLiBJdOKAmXMgYWxsIGFib3V0IHRyYWNpbmcgdGhlIGVudHJ5IHBvaW50cyBhbmQgdGhlIGNvbW11bmljYXRpb24gZmxvdy4gU28sIGxldCdzIHN0YXJ0IHdpdGggYSB0aG9yb3VnaCBzY2FuIG9mIHRoYXQgZmlsZS4gTGV0J3Mgc2VlIHdoYXQgd2UndmUgZ290LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyOTU5NCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMzOjA4Ljc5ODQ2ODgxOVoiLCJTZXEiOjE4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzI1OTM3NDk1LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeaW50IHVuaXhffF52b2lkIHVuaXhfXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJlcnJvclwiOiBcIm5vIG1hdGNoZXNcIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzM6MDkuMTI0NDE4Njk0WiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjk0NzAzMTEzMDksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyB0aGUgVW5peCBEb21haW4gU29ja2V0IEltcGxlbWVudGF0aW9uKipcblxuT2theSwgdGltZSB0byBkaXZlIGludG8gdGhlIG5pdHR5LWdyaXR0eS4gSSBuZWVkIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgaW50ZXJuYWxzIG9mIHRoZSBVbml4IGRvbWFpbiBzb2NrZXQgaW1wbGVtZW50YXRpb24sIGFuZCBzcGVjaWZpY2FsbHksIEknbSBpbnRlcmVzdGVkIGluIGFueSBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgZGVjbGFyZWQgYXMgYHN0YXRpY2AuIEknbSBoZWFkaW5nIHN0cmFpZ2h0IGZvciBgbmV0L3VuaXgvYWZfdW5peC5jYC4gV2h5PyBCZWNhdXNlIHRoYXQncyB3aGVyZSB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IGZvciB0aGlzIHN0dWZmIHR5cGljYWxseSByZXNpZGVzLiBNeSBndXQgdGVsbHMgbWUgdGhpcyB3aWxsIGJlIHRoZSBoZWFydCBvZiBpdCwgYnV0IEkgY291bGQgYmUgd3JvbmcsIG9mIGNvdXJzZS4gTXkgZXhwZXJpZW5jZSBzYXlzIHRoaXMgaXMgYSBnb29kIHBsYWNlIHRvIHN0YXJ0IGh1bnRpbmcgZm9yIGVudHJ5IHBvaW50cyBhbmQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIGtlcm5lbCdzIG5ldHdvcmtpbmcgc3RhY2suIFRoZSBhYnNlbmNlIG9mIGBzdGF0aWNgIGlzIGEgcXVpY2sgdGVsbCwgaW5kaWNhdGluZyBmdW5jdGlvbnMgbGlrZWx5IGV4cG9zZWQgZm9yIHVzZSBlbHNld2hlcmUgaW4gdGhlIGtlcm5lbCBvciBwZXJoYXBzIGV2ZW4gdG8gdXNlci1zcGFjZSB0aHJvdWdoIHNvbWUgY2xldmVyIHRyaWNrZXJ5LiBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gZGlnIHVwLiBUaGlzIHNob3VsZCB0ZWxsIG1lIGEgbG90IGFib3V0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIGhvdyB0aGluZ3MgYXJlIG1lYW50IHRvIGZsb3cuIEknbSBleHBlY3RpbmcgdG8gZmluZCB0aGUga2V5IGZ1bmN0aW9ucyBmb3Igc29ja2V0IGNyZWF0aW9uLCBjb25uZWN0aW9uIGhhbmRsaW5nLCBkYXRhIHRyYW5zZmVyLCBhbmQgY2xlYW51cCwgYW5kIHRoZXNlIGZ1bmN0aW9ucyB3aWxsIG9mZmVyIGtleSBpbnNpZ2h0cyBmb3IgbXkgYW5hbHlzaXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5OTEwLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjEsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzM6MTguNTk0NzMzOTkzWiIsIlNlcSI6MjAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NjYxNTU2NCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJeRVhQT1JUX1NZTUJPTFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdW5peC9hZl91bml4LmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3VuaXgvYWZfdW5peC5jPTI5Mz1zdHJ1Y3Qgc29jayAqdW5peF9wZWVyX2dldChzdHJ1Y3Qgc29jayAqcylcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0zMDMtfVxcbm5ldC91bml4L2FmX3VuaXguYzozMDQ6RVhQT1JUX1NZTUJPTF9HUEwodW5peF9wZWVyX2dldCk7XFxubmV0L3VuaXgvYWZfdW5peC5jLTMwNS1cXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0zMjU0PWxvbmcgdW5peF9pbnFfbGVuKHN0cnVjdCBzb2NrICpzaylcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0zMjc3LX1cXG5uZXQvdW5peC9hZl91bml4LmM6MzI3ODpFWFBPUlRfU1lNQk9MX0dQTCh1bml4X2lucV9sZW4pO1xcbm5ldC91bml4L2FmX3VuaXguYy0zMjc5LVxcbm5ldC91bml4L2FmX3VuaXguYz0zMjgwPWxvbmcgdW5peF9vdXRxX2xlbihzdHJ1Y3Qgc29jayAqc2spXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMzI4My19XFxubmV0L3VuaXgvYWZfdW5peC5jOjMyODQ6RVhQT1JUX1NZTUJPTF9HUEwodW5peF9vdXRxX2xlbik7XFxubmV0L3VuaXgvYWZfdW5peC5jLTMyODUtXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMzOjE4LjY4MTM1ODk3N1oiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjA1Njc1NzAwNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBJbml0aWFsIFRob3VnaHRzIG9uIFNvY2tldCBTZWN1cml0eSoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW4uIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gaG93IHByb2Nlc3MgSURzIGFyZSBtYW5hZ2VkLCBwYXJ0aWN1bGFybHkgYXMgdGhleSByZWxhdGUgdG8gc29ja2V0IHNlY3VyaXR5LiBNeSBtaW5kIGlzIGltbWVkaWF0ZWx5IGRyYXduIHRvIGBhZl91bml4LmNgLiBUaGF0J3Mgd2hlcmUgSSBrbm93IHRoZSBVTklYIHNvY2tldCBmYW1pbHkgaXMgZGVmaW5lZC4gU3BlY2lmaWNhbGx5LCB0aGUgYHByb3RvX29wc2Agc3RydWN0dXJlcyBsaWtlIGB1bml4X3N0cmVhbV9vcHNgLCBgdW5peF9kZ3JhbV9vcHNgLCBhbmQgYHVuaXhfc2VxcGFja2V0X29wc2AgYXJlIHRoZSBrZXkgZW50cnkgcG9pbnRzIEkgbmVlZCB0byBleGFtaW5lIGZvciBob3cgdGhleSBoYW5kbGUgVU5JWCBzb2NrZXRzLlxuXG5JIG5lZWQgdG8gcXVpY2tseSByZWNhbGwgdGhlIGNvcmUgZnVuY3Rpb25zIGludm9sdmVkIGluIHNvY2tldCBvcHRpb24gc2V0dGluZy9nZXR0aW5nIGFuZCBhbmNpbGxhcnkgZGF0YS4gSSByZW1lbWJlciB0aGUgY3JpdGljYWwgZW50cnkgcG9pbnRzOiBgc2tfc2V0c29ja29wdGAsIGBza19nZXRzb2Nrb3B0YCwgYHNjbV9yZWN2X3VuaXhgLCBgX19zY21fc2VuZGAsIGFzIHdlbGwgYXMgYHBpZGZzX2NvcmVkdW1wYCBhbmQgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AgYXJlIHRoZSBpbml0aWFsIGFyZWFzIHRvIHRhcmdldC5cblxuTm93LCBsZXQncyBzd2l0Y2ggZ2VhcnMgYW5kIGludmVzdGlnYXRlIHRoZSBCbHVldG9vdGggaW1wbGVtZW50YXRpb24uIEknbSB0aGlua2luZyBhYm91dCB0aG9zZSByZWNlbnQgY2hhbmdlcywgYW5kIEkgcmVtZW1iZXIgYHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF1gIGdldHRpbmcgdG91Y2hlZCBpbiB0aGUgQmx1ZXRvb3RoIGNvZGUuIExvb2tpbmcgYXQgYG5ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmNgLCBJIHNlZSBgYnRfc29ja19hbGxvY2AgYW5kIGBidF9hY2NlcHRfZW5xdWV1ZWAgc3BlY2lmaWNhbGx5IHRvdWNoaW5nIHRoYXQgZmllbGQuICBJJ2xsIGFsc28gbmVlZCB0byBjaGVjayBgbmV0L2JsdWV0b290aC9oY2lfc29jay5jYCBhbmQgYG5ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jYCBzaW5jZSBJJ3ZlIGdvdCBhIGZlZWxpbmcgc29tZXRoaW5nJ3MgbHVya2luZyB0aGVyZSBhcyB3ZWxsLiBMb29rcyBsaWtlIGBoY2lfc29ja19jb3B5X2NyZWRzYCBhbmQgYGwyY2FwX3NvY2tfZ2V0X3BlZXJfcGlkX2NiYCBhcmUgYWxzbyByZXNwb25zaWJsZSBmb3IgdXBkYXRlcy5cblxuRmluYWxseSwgSSBuZWVkIHRvIHJlbWluZCBteXNlbGYgb2YgdGhlIHJlbGV2YW50IEtjb25maWcgb3B0aW9ucy4gT2J2aW91c2x5LCBgQ09ORklHX1VOSVhgIGNvbnRyb2xzIHRoZSBhdmFpbGFiaWxpdHkgb2YgQUZfVU5JWCBzb2NrZXRzLiBUaGVuLCBgQ09ORklHX0NPUkVEVU1QYCBzZWVtcyB0byBiZSByZWxldmFudC4gVGltZSB0byBzZWUgaWYgdGhlIGBwaWRmc2AgZmVhdHVyZXMgb3IgYW55IG90aGVyIGNhcGFiaWxpdGllcyBhcmUgY29udHJvbGxlZCBieSBLY29uZmlnIG9wdGlvbnMuIEkgbmVlZCB0byBtYWtlIHN1cmUgSSB1bmRlcnN0YW5kIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBsYW5kc2NhcGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNDkzLCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzIwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMzOjM0LjczODExOTExNFoiLCJTZXEiOjIyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzAzODE0Nzg2OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJDT05GSUdfUElEX0ZTfFBJREZTXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2ZoYW5kbGUuYz0xNzA9c3RhdGljIGludCBnZXRfcGF0aF9hbmNob3IoaW50IGZkLCBzdHJ1Y3QgcGF0aCAqcm9vdClcXG4tLVxcbmZzL2ZoYW5kbGUuYy0xODUtXFxuZnMvZmhhbmRsZS5jOjE4NjpcXHRpZiAoZmQgPT0gRkRfUElERlNfUk9PVCkge1xcbmZzL2ZoYW5kbGUuYy0xODctXFx0XFx0cGlkZnNfZ2V0X3Jvb3Qocm9vdCk7XFxuLS1cXG5mcy9waWRmcy5jLTM0LVxcbmZzL3BpZGZzLmM6MzU6I2RlZmluZSBQSURGU19QSURfREVBRCBFUlJfUFRSKC1FU1JDSClcXG5mcy9waWRmcy5jLTM2LVxcbi0tXFxuZnMvcGlkZnMuYz00OT1lbnVtIHBpZGZzX2F0dHJfbWFza19iaXRzIHtcXG5mcy9waWRmcy5jOjUwOlxcdFBJREZTX0FUVFJfQklUX0VYSVRcXHQ9IDAsXFxuZnMvcGlkZnMuYzo1MTpcXHRQSURGU19BVFRSX0JJVF9DT1JFRFVNUFxcdD0gMSxcXG5mcy9waWRmcy5jLTUyLX07XFxuLS1cXG5mcy9waWRmcy5jPTM2NT1zdGF0aWMgbG9uZyBwaWRmZF9pbmZvKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZylcXG4tLVxcbmZzL3BpZGZzLmMtMzk1LVxcdGlmIChtYXNrIFxcdTAwMjYgUElERkRfSU5GT19FWElUKSB7XFxuZnMvcGlkZnMuYzozOTY6XFx0XFx0aWYgKHRlc3RfYml0KFBJREZTX0FUVFJfQklUX0VYSVQsIFxcdTAwMjZhdHRyLVxcdTAwM2VhdHRyX21hc2spKSB7XFxuZnMvcGlkZnMuYy0zOTctXFx0XFx0XFx0c21wX3JtYigpO1xcbi0tXFxuZnMvcGlkZnMuYy00MDctXFx0aWYgKG1hc2sgXFx1MDAyNiBQSURGRF9JTkZPX0NPUkVEVU1QKSB7XFxuZnMvcGlkZnMuYzo0MDg6XFx0XFx0aWYgKHRlc3RfYml0KFBJREZTX0FUVFJfQklUX0NPUkVEVU1QLCBcXHUwMDI2YXR0ci1cXHUwMDNlYXR0cl9tYXNrKSkge1xcbmZzL3BpZGZzLmMtNDA5LVxcdFxcdFxcdHNtcF9ybWIoKTtcXG4tLVxcbmZzL3BpZGZzLmM9NzQ5PXZvaWQgcGlkZnNfZXhpdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaylcXG4tLVxcbmZzL3BpZGZzLmMtNzY4LVxcdFxcdFxcdCAqL1xcbmZzL3BpZGZzLmM6NzY5OlxcdFxcdFxcdHBpZC1cXHUwMDNlYXR0ciA9IFBJREZTX1BJRF9ERUFEO1xcbmZzL3BpZGZzLmMtNzcwLVxcdFxcdFxcdHJldHVybjtcXG4tLVxcbmZzL3BpZGZzLmMtNzkxLVxcdHNtcF93bWIoKTtcXG5mcy9waWRmcy5jOjc5MjpcXHRzZXRfYml0KFBJREZTX0FUVFJfQklUX0VYSVQsIFxcdTAwMjZhdHRyLVxcdTAwM2VhdHRyX21hc2spO1xcbmZzL3BpZGZzLmMtNzkzLX1cXG4tLVxcbmZzL3BpZGZzLmM9Nzk2PXN0YXRpYyB2b2lkIHBpZGZzX2NvcmVkdW1wX3BpZChzdHJ1Y3QgcGlkICpwaWQsXFxuLS1cXG5mcy9waWRmcy5jLTgwMy1cXHRWRlNfV0FSTl9PTl9PTkNFKCFhdHRyKTtcXG5mcy9waWRmcy5jOjgwNDpcXHRWRlNfV0FSTl9PTl9PTkNFKGF0dHIgPT0gUElERlNfUElEX0RFQUQpO1xcbmZzL3BpZGZzLmMtODA1LVxcbi0tXFxuZnMvcGlkZnMuYy04MTQtXFx0c21wX3dtYigpO1xcbmZzL3BpZGZzLmM6ODE1OlxcdHNldF9iaXQoUElERlNfQVRUUl9CSVRfQ09SRURVTVAsIFxcdTAwMjZhdHRyLVxcdTAwM2VhdHRyX21hc2spO1xcbmZzL3BpZGZzLmMtODE2LX1cXG4tLVxcbmZzL3BpZGZzLmM9OTA0PXN0YXRpYyBzdHJ1Y3QgcGlkICpwaWRmc19pbm9fZ2V0X3BpZCh1NjQgaW5vKVxcbi0tXFxuZnMvcGlkZnMuYy05MTUtXFx0XFx0cmV0dXJuIE5VTEw7XFxuZnMvcGlkZnMuYzo5MTY6XFx0aWYgKHRlc3RfYml0KFBJREZTX0FUVFJfQklUX0VYSVQsIFxcdTAwMjZhdHRyLVxcdTAwM2VhdHRyX21hc2spKVxcbmZzL3BpZGZzLmMtOTE3LVxcdFxcdHJldHVybiBOVUxMO1xcbi0tXFxuZnMvcGlkZnMuYz0xMDQ1PWludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKVxcbi0tXFxuZnMvcGlkZnMuYy0xMDU1LVxcdGF0dHIgPSBSRUFEX09OQ0UocGlkLVxcdTAwM2VhdHRyKTtcXG5mcy9waWRmcy5jOjEwNTY6XFx0aWYgKHVubGlrZWx5KGF0dHIgPT0gUElERlNfUElEX0RFQUQpKVxcbmZzL3BpZGZzLmM6MTA1NzpcXHRcXHRyZXR1cm4gUFRSX0VSUihQSURGU19QSURfREVBRCk7XFxuZnMvcGlkZnMuYy0xMDU4LVxcdGlmIChhdHRyKVxcbi0tXFxuZnMvcGlkZnMuYy0xMDcwLVxcdGF0dHIgPSBwaWQtXFx1MDAzZWF0dHI7XFxuZnMvcGlkZnMuYzoxMDcxOlxcdGlmICh1bmxpa2VseShhdHRyID09IFBJREZTX1BJRF9ERUFEKSlcXG5mcy9waWRmcy5jOjEwNzI6XFx0XFx0cmV0dXJuIFBUUl9FUlIoUElERlNfUElEX0RFQUQpO1xcbmZzL3BpZGZzLmMtMTA3My1cXHRpZiAodW5saWtlbHkoYXR0cikpXFxuLS1cXG5pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaD04OD1zdHJ1Y3QgZGVsZWdhdGlvbiB7XFxuLS1cXG5pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaC0xMjQtXFxuaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmg6MTI1OiNkZWZpbmUgRkRfUElERlNfUk9PVFxcdFxcdFxcdC0xMDAwMiAvKiBSb290IG9mIHRoZSBwaWRmcyBmaWxlc3lzdGVtICovXFxuaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmgtMTI2LSNkZWZpbmUgRkRfTlNGU19ST09UXFx0XFx0XFx0LTEwMDAzIC8qIFJvb3Qgb2YgdGhlIG5zZnMgZmlsZXN5c3RlbSAqL1xcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg9NjE9c3RydWN0IHBpZGZkX2luZm8ge1xcbi0tXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmgtMTA5LVxcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjExMDojZGVmaW5lIFBJREZTX0lPQ1RMX01BR0lDIDB4RkZcXG5pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaC0xMTEtXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTEyOiNkZWZpbmUgUElERkRfR0VUX0NHUk9VUF9OQU1FU1BBQ0UgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTEzOiNkZWZpbmUgUElERkRfR0VUX0lQQ19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDIpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE0OiNkZWZpbmUgUElERkRfR0VUX01OVF9OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDMpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE1OiNkZWZpbmUgUElERkRfR0VUX05FVF9OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDQpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE2OiNkZWZpbmUgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDUpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE3OiNkZWZpbmUgUElERkRfR0VUX1BJRF9GT1JfQ0hJTERSRU5fTkFNRVNQQUNFICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDYpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE4OiNkZWZpbmUgUElERkRfR0VUX1RJTUVfTkFNRVNQQUNFICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDcpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTE5OiNkZWZpbmUgUElERkRfR0VUX1RJTUVfRk9SX0NISUxEUkVOX05BTUVTUEFDRSBfSU8oUElERlNfSU9DVExfTUFHSUMsIDgpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTIwOiNkZWZpbmUgUElERkRfR0VUX1VTRVJfTkFNRVNQQUNFICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDkpXFxuaW5jbHVkZS91YXBpL2xpbnV4L3BpZGZkLmg6MTIxOiNkZWZpbmUgUElERkRfR0VUX1VUU19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEwKVxcbmluY2x1ZGUvdWFwaS9saW51eC9waWRmZC5oOjEyMjojZGVmaW5lIFBJREZEX0dFVF9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgX0lPV1IoUElERlNfSU9DVExfTUFHSUMsIDExLCBzdHJ1Y3QgcGlkZmRfaW5mbylcXG5pbmNsdWRlL3VhcGkvbGludXgvcGlkZmQuaC0xMjMtXFxuLS1cXG50b29scy9wZXJmL3RyYWNlL2JlYXV0eS9pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaD04OD1zdHJ1Y3QgZGVsZWdhdGlvbiB7XFxuLS1cXG50b29scy9wZXJmL3RyYWNlL2JlYXV0eS9pbmNsdWRlL3VhcGkvbGludXgvZmNudGwuaC0xMjQtXFxudG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmg6MTI1OiNkZWZpbmUgRkRfUElERlNfUk9PVFxcdFxcdFxcdC0xMDAwMiAvKiBSb290IG9mIHRoZSBwaWRmcyBmaWxlc3lzdGVtICovXFxudG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvaW5jbHVkZS91YXBpL2xpbnV4L2ZjbnRsLmgtMTI2LSNkZWZpbmUgRkRfTlNGU19ST09UXFx0XFx0XFx0LTEwMDAzIC8qIFJvb3Qgb2YgdGhlIG5zZnMgZmlsZXN5c3RlbSAqL1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZmFpbGZzL2ZhaWxmc190ZXN0LmMtMjYtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZmFpbGZzL2ZhaWxmc190ZXN0LmM6Mjc6I2lmbmRlZiBGRF9QSURGU19ST09UXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZmFpbGZzL2ZhaWxmc190ZXN0LmM6Mjg6I2RlZmluZSBGRF9QSURGU19ST09UIC0xMDAwMlxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jLTI5LSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZmFpbGZzL2ZhaWxmc190ZXN0LmM9MTQyPVRFU1QoZmNoZGlyX3JlamVjdHNfb3RoZXJfc2VudGluZWxzKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jLTE0My17XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZmFpbGZzL2ZhaWxmc190ZXN0LmM6MTQ0OlxcdEFTU0VSVF9FUShmY2hkaXIoRkRfUElERlNfUk9PVCksIC0xKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYy0xNDUtXFx0QVNTRVJUX0VRKGVycm5vLCBFQkFERik7XFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9maWxlc3lzdGVtcy9mYWlsZnMvZmFpbGZzX3Rlc3QuYz0xNjY9VEVTVChmY2hyb290X2JhZF9mZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jLTE3MS1cXHQvKiBPbmx5IEZEX0ZBSUxGU19ST09UIGlzIGEgdmFsaWQgc2VudGluZWwuICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlsZXN5c3RlbXMvZmFpbGZzL2ZhaWxmc190ZXN0LmM6MTcyOlxcdEFTU0VSVF9FUShzeXNfZmNocm9vdChGRF9QSURGU19ST09ULCAwKSwgLTEpO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2ZpbGVzeXN0ZW1zL2ZhaWxmcy9mYWlsZnNfdGVzdC5jLTE3My1cXHRBU1NFUlRfRVEoZXJybm8sIEVCQURGKTtcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMzAtXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaDozMTojaWZuZGVmIEZEX1BJREZTX1JPT1RcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjMyOiNkZWZpbmUgRkRfUElERlNfUk9PVCAtMTAwMDJcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTMzLSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC04Mi1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjgzOiNpZm5kZWYgUElERlNfSU9DVExfTUFHSUNcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjg0OiNkZWZpbmUgUElERlNfSU9DVExfTUFHSUMgMHhGRlxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtODUtI2VuZGlmXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTg3LSNpZm5kZWYgUElERkRfR0VUX0NHUk9VUF9OQU1FU1BBQ0VcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjg4OiNkZWZpbmUgUElERkRfR0VUX0NHUk9VUF9OQU1FU1BBQ0UgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC04OS0jZW5kaWZcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtOTEtI2lmbmRlZiBQSURGRF9HRVRfSVBDX05BTUVTUEFDRVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6OTI6I2RlZmluZSBQSURGRF9HRVRfSVBDX05BTUVTUEFDRSAgICAgICAgICAgICAgIF9JTyhQSURGU19JT0NUTF9NQUdJQywgMilcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTkzLSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC05NS0jaWZuZGVmIFBJREZEX0dFVF9NTlRfTkFNRVNQQUNFXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaDo5NjojZGVmaW5lIFBJREZEX0dFVF9NTlRfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCAzKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtOTctI2VuZGlmXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTk5LSNpZm5kZWYgUElERkRfR0VUX05FVF9OQU1FU1BBQ0VcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjEwMDojZGVmaW5lIFBJREZEX0dFVF9ORVRfTkFNRVNQQUNFICAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCA0KVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTAxLSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMDMtI2lmbmRlZiBQSURGRF9HRVRfUElEX05BTUVTUEFDRVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTA0OiNkZWZpbmUgUElERkRfR0VUX1BJRF9OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDUpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMDUtI2VuZGlmXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTEwNy0jaWZuZGVmIFBJREZEX0dFVF9QSURfRk9SX0NISUxEUkVOX05BTUVTUEFDRVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTA4OiNkZWZpbmUgUElERkRfR0VUX1BJRF9GT1JfQ0hJTERSRU5fTkFNRVNQQUNFICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDYpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMDktI2VuZGlmXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTExMS0jaWZuZGVmIFBJREZEX0dFVF9USU1FX05BTUVTUEFDRVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTEyOiNkZWZpbmUgUElERkRfR0VUX1RJTUVfTkFNRVNQQUNFICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDcpXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMTMtI2VuZGlmXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oLTExNS0jaWZuZGVmIFBJREZEX0dFVF9USU1FX0ZPUl9DSElMRFJFTl9OQU1FU1BBQ0VcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjExNjojZGVmaW5lIFBJREZEX0dFVF9USU1FX0ZPUl9DSElMRFJFTl9OQU1FU1BBQ0UgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCA4KVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTE3LSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMTktI2lmbmRlZiBQSURGRF9HRVRfVVNFUl9OQU1FU1BBQ0VcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZC5oOjEyMDojZGVmaW5lIFBJREZEX0dFVF9VU0VSX05BTUVTUEFDRSAgICAgICAgICAgICAgX0lPKFBJREZTX0lPQ1RMX01BR0lDLCA5KVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTIxLSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMjMtI2lmbmRlZiBQSURGRF9HRVRfVVRTX05BTUVTUEFDRVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTI0OiNkZWZpbmUgUElERkRfR0VUX1VUU19OQU1FU1BBQ0UgICAgICAgICAgICAgICBfSU8oUElERlNfSU9DVExfTUFHSUMsIDEwKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTI1LSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmQuaC0xMjctI2lmbmRlZiBQSURGRF9HRVRfSU5GT1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmg6MTI4OiNkZWZpbmUgUElERkRfR0VUX0lORk9cXHRcXHRcXHQgICAgICBfSU9XUihQSURGU19JT0NUTF9NQUdJQywgMTEsIHN0cnVjdCBwaWRmZF9pbmZvKVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkLmgtMTI5LSNlbmRpZlxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmRfZmlsZV9oYW5kbGVfdGVzdC5jPTUwNz1URVNUX0YoZmlsZV9oYW5kbGUsIGRlY29kZV9wdXJlbHlfYmFzZWRfb25fZmlsZV9oYW5kbGUpXFxuLS1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZF9maWxlX2hhbmRsZV90ZXN0LmMtNTIyLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkX2ZpbGVfaGFuZGxlX3Rlc3QuYzo1MjM6XFx0cGlkZmQgPSBvcGVuX2J5X2hhbmRsZV9hdChGRF9QSURGU19ST09ULCBmaCwgMCk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmRfZmlsZV9oYW5kbGVfdGVzdC5jLTUyNC1cXHRBU1NFUlRfR0UocGlkZmQsIDApO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmRfZmlsZV9oYW5kbGVfdGVzdC5jLTUzMC1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZF9maWxlX2hhbmRsZV90ZXN0LmM6NTMxOlxcdHBpZGZkID0gb3Blbl9ieV9oYW5kbGVfYXQoRkRfUElERlNfUk9PVCwgZmgsIE9fQ0xPRVhFQyk7XFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmRfZmlsZV9oYW5kbGVfdGVzdC5jLTUzMi1cXHRBU1NFUlRfR0UocGlkZmQsIDApO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcGlkZmQvcGlkZmRfZmlsZV9oYW5kbGVfdGVzdC5jLTUzOC1cXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9waWRmZC9waWRmZF9maWxlX2hhbmRsZV90ZXN0LmM6NTM5OlxcdHBpZGZkID0gb3Blbl9ieV9oYW5kbGVfYXQoRkRfUElERlNfUk9PVCwgZmgsIE9fTk9OQkxPQ0spO1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3BpZGZkL3BpZGZkX2ZpbGVfaGFuZGxlX3Rlc3QuYy01NDAtXFx0QVNTRVJUX0dFKHBpZGZkLCAwKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzM6MzcuNzc2Mjc3NDMzWiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI3MTEwODE2NjQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBpZiBJIHdlcmUgdGhpbmtpbmcgaXQ6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgQnVpbGQgUHJvY2VzcyBmb3IgYHBpZGZzYCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IGhvdyBgcGlkZnNgIGlzIGFjdHVhbGx5IGJ1aWx0IHdpdGhpbiB0aGlzIGtlcm5lbCBvciBmaWxlIHN5c3RlbSBjb250ZXh0LiBUaGUgb2J2aW91cyBmaXJzdCBwbGFjZSB0byBjaGVjayBpcyB0aGUgYE1ha2VmaWxlYCBpbiB0aGUgYGZzYCBkaXJlY3RvcnkuIFRoYXQncyB0aGUgZ28tdG8gZm9yIGJ1aWxkIGluc3RydWN0aW9ucyB3aXRoaW4gYSBmaWxlIHN5c3RlbSBjb21wb25lbnQuIElmIGl0J3Mgbm90IGRlZmluZWQgdGhlcmUsIG9yIGlmIHRoZXJlJ3Mgc29tZSBjb25kaXRpb25hbCBsb2dpYyBpbnZvbHZlZCwgSSdsbCBuZWVkIHRvIGRpZyBpbnRvIHRoZSBgS2NvbmZpZ2AgZmlsZSB3aXRoaW4gYGZzYCBhcyB3ZWxsLiBUaGF0J3Mgd2hlcmUgYWxsIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGRlY2xhcmVkLCBhbmQgdGhhdCdzIGxpa2VseSB3aGVyZSB0aGUgaW5jbHVzaW9uIG9yIGV4Y2x1c2lvbiBvZiBgcGlkZnNgIGlzIGdvdmVybmVkLiBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgbGlrZSBgQ09ORklHX1BJREZTPXlgIG9yIHNvbWV0aGluZyBzaW1pbGFyLCBhbmQgdGhlbiB0cmFjZSB0aGUgaW1wbGljYXRpb25zIG9mIHRoYXQgc2V0dGluZy4gTGV0J3Mgc3RhcnQgd2l0aCB0aG9zZSB0d28gZmlsZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM1MzY5LCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjAsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzM6NDAuNDg3MzYyNjQ3WiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTE2OTY0OTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicGlkZnNcXFxcLm9cIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiZnNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvTWFrZWZpbGU9MTA9b2JqLXkgOj1cXHRvcGVuLm8gcmVhZF93cml0ZS5vIGZpbGVfdGFibGUubyBzdXBlci5vIFxcXFxcXG4tLVxcbmZzL01ha2VmaWxlLTE3LVxcdFxcdGZzX2RpcmVudC5vIGZzX2NvbnRleHQubyBmc19wYXJzZXIubyBmc29wZW4ubyBpbml0Lm8gXFxcXFxcbmZzL01ha2VmaWxlOjE4OlxcdFxcdGtlcm5lbF9yZWFkX2ZpbGUubyBtbnRfaWRtYXBwaW5nLm8gcmVtYXBfcmFuZ2UubyBwaWRmcy5vIFxcXFxcXG5mcy9NYWtlZmlsZS0xOS1cXHRcXHRmaWxlX2F0dHIubyBmc2Vycm9yLm8gbnVsbGZzLm8gZmFpbGZzLm9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzM6NDAuNjM5MDY2MDk1WiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjgxMzYzNjMwMTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgbXkgb3duOlxuXG4qKkludmVzdGlnYXRpbmcgUG90ZW50aWFsIERlcGVuZGVuY2llcyoqXG5cbkFscmlnaHQsIHNvIGBwaWRmcy5vYCBpcyBjbGVhcmx5IHBhcnQgb2YgdGhlIGZpbGVzeXN0ZW0gc3Vic3lzdGVtLCBhbmQgdGhlIE1ha2VmaWxlIGluIGBmcy9gIGV4cGxpY2l0bHkgZGVjbGFyZXMgaXQgd2l0aCBgb2JqLXlgLiBUaGF0IGdpdmVzIG1lIGEgc3RhcnRpbmcgcG9pbnQuIE5vdywgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiBpdHMgb3ZlcmFsbCByb2xlIGFuZCBhbnkgcG9zc2libGUgY29ubmVjdGlvbnMgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbCwgSSBuZWVkIHRvIGRvIGEgYml0IG9mIHNsZXV0aGluZy4gR2l2ZW4gdGhlIG5hdHVyZSBvZiBQSUQgZmlsZSBzeXN0ZW1zLCBJIHNob3VsZCBwcm9iYWJseSBjaGVjayBvdXQgYG5ldC91bml4L01ha2VmaWxlYCwgYG5ldC9jb3JlL01ha2VmaWxlYCBhbmQgYGZzL2NvcmVkdW1wLmNgIHRvIGxvb2sgZm9yIHNoYXJlZCByZXNvdXJjZXMgb3IgZGVwZW5kZW5jaWVzLiBJdCBtYWtlcyBzZW5zZSB0byBzdGFydCB3aXRoIHRoZXNlIGZpbGVzLCB0aGV5J3JlIGxpa2VseSBjYW5kaWRhdGVzLCBhbmQgdGhpcyB3aWxsIHRlbGwgbWUgaWYgdGhlIG1vZHVsZSBpcyB0aWVkIGludG8gdGhlIG5ldHdvcmsgc3RhY2sgb3IgcmVsYXRlZCBjb3JlIGR1bXBpbmcuIFRoaXMgZ2l2ZXMgbWUgbXkgbmV4dCBsb2dpY2FsIHN0ZXBzIGluIHVuZGVyc3RhbmRpbmcgdGhpcyBtb2R1bGUncyBwbGFjZSBpbiB0aGUgYnJvYWRlciBrZXJuZWwgYXJjaGl0ZWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNTc0NCwiT3V0cHV0VG9rZW5zIjoyNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ2LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMzOjQ4Ljc3NTQzNDg1OFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYyMDY4MDc3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcmVkdW1wXFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImZzXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL01ha2VmaWxlPTQ2PW9iai0kKENPTkZJR19ORlNfQ09NTU9OKVxcdCs9IG5mc19jb21tb24vXFxuZnMvTWFrZWZpbGU6NDc6b2JqLSQoQ09ORklHX0NPUkVEVU1QKVxcdFxcdCs9IGNvcmVkdW1wLm9cXG5mcy9NYWtlZmlsZS00OC1vYmotJChDT05GSUdfU1lTQ1RMKVxcdFxcdCs9IGRyb3BfY2FjaGVzLm8gc3lzY3Rscy5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjMzOjQ4LjkzNzUxMTIyNVoiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMDg2ODU3ODg2MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBpbnRvIHRoZSBVbml4IERvbWFpbiBTb2NrZXQgTWFrZWZpbGUqKlxuXG5Pa2F5LCB0aW1lIHRvIGRpZyBpbi4gVGhlIG5leHQgbG9naWNhbCBzdGVwIHRvIHVuZGVyc3RhbmQgdGhpcyBzeXN0ZW0gaXMgdG8gZXhhbWluZSB0aGUgYG5ldC91bml4L01ha2VmaWxlYC4gVGhhdCdzIHdoZXJlIHRoZSBidWlsZCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBVbml4IGRvbWFpbiBzb2NrZXQgZnVuY3Rpb25hbGl0eSBzaG91bGQgcmVzaWRlLiBJIG5lZWQgdG8gc2VlIGhvdyB0aGUgb2JqZWN0IGZpbGVzIGFyZSBjb21waWxlZCwgbGlua2VkLCBhbmQgcG90ZW50aWFsbHkgd2hhdCBmbGFncyBhcmUgdXNlZCBmb3IgdGhlIGxpbmtlci4gVGhpcyB3aWxsIHRlbGwgbWUgYSBsb3QgYWJvdXQgdGhlIGRlcGVuZGVuY2llcywgb3B0aW1pemF0aW9ucywgYW5kIGFueSBjdXN0b20gY29uZmlndXJhdGlvbnMgc3BlY2lmaWMgdG8gVW5peCBkb21haW4gc29ja2V0cyB3aXRoaW4gdGhpcyBwcm9qZWN0LiBLbm93aW5nIHRoZSBtYWtlZmlsZSB3aWxsIGFsbG93IG1lIHRvIHRyYWNlIHRoZSBidWlsZCBwcm9jZXNzIGFuZCBzZWUgZXhhY3RseSBob3cgdGhlIGNvZGUgdHVybnMgaW50byBhIHJ1bm5hYmxlIGNvbXBvbmVudC4gVGhhdCdzIHVzdWFsbHkgdGhlIGJlc3QgcGxhY2UgdG8gc3RhcnQgd2hlbiB0cnlpbmcgdG8gcmV2ZXJzZSBlbmdpbmVlciBvciB1bmRlcnN0YW5kIGEgbG93LWxldmVsIG1vZHVsZSBsaWtlIHRoaXMsIGFuZCBpdCdsbCBnaXZlIG1lIGEgc3Ryb25nIGZvdW5kYXRpb24gZm9yIGV4cGxvcmluZyB0aGUgYWN0dWFsIHNvdXJjZSBmaWxlcyBsYXRlci5cblxuXG4iLCJJbnB1dFRva2VucyI6MzYxMDEsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMzo1OS44MDYwOTQ2MDhaIiwiU2VxIjoyOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjEyOTUwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvdW5peC9NYWtlZmlsZVwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCB1bml4IGRvbWFpbiBzb2NrZXQgbGF5ZXIuXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdG9iai0kKENPTkZJR19VTklYKVxcdCs9IHVuaXgub1xcbiAgIDc6XFx0XFxuICAgODpcXHR1bml4LXlcXHRcXHRcXHQ6PSBhZl91bml4Lm8gZ2FyYmFnZS5vXFxuICAgOTpcXHR1bml4LSQoQ09ORklHX1NZU0NUTClcXHQrPSBzeXNjdGxfbmV0X3VuaXgub1xcbiAgMTA6XFx0dW5peC0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gdW5peF9icGYub1xcbiAgMTE6XFx0XFxuICAxMjpcXHRvYmotJChDT05GSUdfVU5JWF9ESUFHKVxcdCs9IHVuaXhfZGlhZy5vXFxuICAxMzpcXHR1bml4X2RpYWcteVxcdFxcdDo9IGRpYWcub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozMzo1OS44MDgyMjg4MThaIiwiU2VxIjoyOSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjMxNzI3MzI2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIHRoZSBvbmUgdGhpbmtpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gdGhlIE5ldHdvcmsgQ29yZSBNYWtlZmlsZSoqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBMZXQncyBzZWUgd2hhdCdzIGhhcHBlbmluZyB3aXRoIHRoZSBjb3JlIG5ldHdvcmtpbmcgYnVpbGQgcHJvY2Vzcy4gTXkgaW5zdGluY3QgdGVsbHMgbWUgdGhlIHBsYWNlIHRvIHN0YXJ0IGlzIGxpa2VseSBgbmV0L2NvcmUvTWFrZWZpbGVgLiBUaGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgdG9wLWxldmVsIGRlZmluaXRpb25zIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBrZXJuZWwncyBuZXR3b3JraW5nIHN1YnN5c3RlbSBhcmUgbWFuYWdlZC4gSSdtIGV4cGVjdGluZyB0byBmaW5kIHRoZSBrZXkgYnVpbGQgcnVsZXMgZm9yIHRoZSBmdW5kYW1lbnRhbCBuZXR3b3JraW5nIGNvbXBvbmVudHMg4oCTIHRoaW5ncyBsaWtlIHNvY2tldCBoYW5kbGluZywgcHJvdG9jb2wgcmVnaXN0cmF0aW9uLCBtZW1vcnkgbWFuYWdlbWVudCwgYW5kIG90aGVyIGNydWNpYWwgaW5mcmFzdHJ1Y3R1cmUgZWxlbWVudHMuIEknbSBsb29raW5nIGZvciBob3cgZGlmZmVyZW50IHBhcnRzIG9mIHRoaXMgY29yZSBhcmUgY29tcGlsZWQgYW5kIGxpbmtlZCB0b2dldGhlciwgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzdCBvZiB0aGUga2VybmVsIGJ1aWxkIHByb2Nlc3MuIEknbGwgYmUgc2VhcmNoaW5nIGZvciBpbnNpZ2h0cyBpbnRvIGFueSByZWNlbnQgY2hhbmdlcyBvciB1bnVzdWFsIGJ1aWxkIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWlnaHQgYmUgYWZmZWN0aW5nIHRoaW5ncy4gSSdsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGluY2x1ZGUgcGF0aHMsIGxpbmsgZmxhZ3MsIGFuZCB0YXJnZXQgZGVmaW5pdGlvbnMuIFRoaXMgTWFrZWZpbGUgaG9sZHMgdGhlIHNlY3JldHMgdG8gdW5kZXJzdGFuZGluZyB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgdGhlIG5ldHdvcmsgc3RhY2ssIHNvIGxldCdzIGRpZyBpbiBhbmQgc2VlIHdoYXQgdHJlYXN1cmVzIHdlIGNhbiB1bmVhcnRoIVxuXG5cbiIsIklucHV0VG9rZW5zIjozNjUyMywiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzQ6MDIuMTI1NTA0ODUxWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc3MjAwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9jb3JlL01ha2VmaWxlXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDM1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbiAgIDI6XFx0I1xcbiAgIDM6XFx0IyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IG5ldHdvcmtpbmcgY29yZS5cXG4gICA0OlxcdCNcXG4gICA1OlxcdFxcbiAgIDY6XFx0b2JqLXkgOj0gc29jay5vIHNrYnVmZi5vIGRhdGFncmFtLm8gc3RyZWFtLm8gc2NtLm8gXFxcXFxcbiAgIDc6XFx0XFx0IGdlbl9zdGF0cy5vIGdlbl9lc3RpbWF0b3IubyBuZXRfbmFtZXNwYWNlLm8gc2VjdXJlX3NlcS5vIFxcXFxcXG4gICA4OlxcdFxcdCBmbG93X2Rpc3NlY3Rvci5vXFxuICAgOTpcXHRcXG4gIDEwOlxcdG9iai0kKENPTkZJR19TWVNDVEwpICs9IHN5c2N0bF9uZXRfY29yZS5vXFxuICAxMTpcXHRcXG4gIDEyOlxcdG9iai15XFx0XFx0ICAgICArPSBkZXYubyBkZXZfYXBpLm8gZGV2X2FkZHJfbGlzdHMubyBkc3QubyBuZXRldmVudC5vIFxcXFxcXG4gIDEzOlxcdFxcdFxcdFxcdG5laWdoYm91ci5vIHJ0bmV0bGluay5vIHV0aWxzLm8gbGlua193YXRjaC5vIGZpbHRlci5vIFxcXFxcXG4gIDE0OlxcdFxcdFxcdFxcdHNvY2tfZGlhZy5vIGRldl9pb2N0bC5vIHRzby5vIHNvY2tfcmV1c2Vwb3J0Lm8gXFxcXFxcbiAgMTU6XFx0XFx0XFx0XFx0ZmliX25vdGlmaWVyLm8geGRwLm8gZmxvd19vZmZsb2FkLm8gZ3JvLm8gXFxcXFxcbiAgMTY6XFx0XFx0XFx0XFx0bmV0ZGV2LWdlbmwubyBuZXRkZXYtZ2VubC1nZW4ubyBuZXRkZXZfd29yay5vIGdzby5vXFxuICAxNzpcXHRcXG4gIDE4OlxcdG9iai0kKENPTkZJR19ORVRERVZfQUREUl9MSVNUX1RFU1QpICs9IGRldl9hZGRyX2xpc3RzX3Rlc3Qub1xcbiAgMTk6XFx0XFxuICAyMDpcXHRvYmoteSArPSBuZXQtc3lzZnMub1xcbiAgMjE6XFx0b2JqLXkgKz0gaG90ZGF0YS5vXFxuICAyMjpcXHRvYmoteSArPSBuZXRkZXZfY29uZmlnLm9cXG4gIDIzOlxcdG9iai15ICs9IG5ldGRldl9yeF9xdWV1ZS5vXFxuICAyNDpcXHRvYmoteSArPSBuZXRkZXZfcXVldWVzLm9cXG4gIDI1OlxcdG9iai0kKENPTkZJR19QQUdFX1BPT0wpICs9IHBhZ2VfcG9vbC5vIHBhZ2VfcG9vbF91c2VyLm9cXG4gIDI2OlxcdG9iai0kKENPTkZJR19QUk9DX0ZTKSArPSBuZXQtcHJvY2ZzLm9cXG4gIDI3OlxcdG9iai0kKENPTkZJR19ORVRfUEtUR0VOKSArPSBwa3RnZW4ub1xcbiAgMjg6XFx0b2JqLSQoQ09ORklHX05FVFBPTEwpICs9IG5ldHBvbGwub1xcbiAgMjk6XFx0b2JqLSQoQ09ORklHX0ZJQl9SVUxFUykgKz0gZmliX3J1bGVzLm9cXG4gIDMwOlxcdG9iai0kKENPTkZJR19UUkFDRVBPSU5UUykgKz0gbmV0LXRyYWNlcy5vXFxuICAzMTpcXHRvYmotJChDT05GSUdfTkVUX0RST1BfTU9OSVRPUikgKz0gZHJvcF9tb25pdG9yLm9cXG4gIDMyOlxcdG9iai0kKENPTkZJR19ORVRfSUVFRTgwMjFRX0hFTFBFUlMpICs9IGllZWU4MDIxcV9oZWxwZXJzLm9cXG4gIDMzOlxcdG9iai0kKENPTkZJR19ORVRfU0VMRlRFU1RTKSArPSBzZWxmdGVzdHMub1xcbiAgMzQ6XFx0b2JqLSQoQ09ORklHX05FVFdPUktfUEhZX1RJTUVTVEFNUElORykgKz0gdGltZXN0YW1waW5nLm9cXG4gIDM1OlxcdG9iai0kKENPTkZJR19ORVRfUFRQX0NMQVNTSUZZKSArPSBwdHBfY2xhc3NpZmllci5vXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM0OjAyLjEyNTU4NDQ0MVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzc0Mjk3MzU0NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBLZXJuZWwgT2JqZWN0IERlcGVuZGVuY2llcyBhbmQgRnV6emluZyBGb2N1cyoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGZpZ3VyaW5nIG91dCBob3cgdG8gYXBwcm9hY2ggZnV6emluZyBpdCBlZmZlY3RpdmVseS4gRmlyc3QsIGBzb2NrLm9gIGFuZCBgc2NtLm9gIGFyZSBwYXJ0IG9mIGBvYmoteWAgd2hlbiBgQ09ORklHX05FVGAgaXMgZW5hYmxlZCwgd2hpY2ggaXMgc3RhbmRhcmQuIGBhZl91bml4Lm9gIG5lZWRzIGBDT05GSUdfVU5JWGAsIGFuZCBgY29yZWR1bXAub2AgbmVlZHMgYENPTkZJR19DT1JFRFVNUGAuIE5vdGhpbmcgc3VycHJpc2luZyB0aGVyZS5cblxuTm93LCBsZXQncyBnZXQgZG93biB0byB0aGUgZnV6emluZyBzcGVjaWZpY3MuIFRoZSBnb2FsIGlzIHRvIGlkZW50aWZ5IHRoZSByaWdodCBmb2N1cyBzeW1ib2xzLiBJIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMg4oCTIHRoZSBwdWJsaWMtZmFjaW5nIGZ1bmN0aW9ucywgbm90IGludGVybmFsIGhlbHBlcnMuXG5cbkxldCdzIGJyZWFrIGRvd24gdGhlIGZ1bmN0aW9ucyB0b3VjaGVkIG9yIGNyZWF0ZWQ6XG5cbjEuICBgc2tfc2V0c29ja29wdGAgaW4gYG5ldC9jb3JlL3NvY2suY2Ag4oCTIFRoaXMgaGFuZGxlcyBgU09fUEFTU1BJREZEX1RIUkVBRGAgYW5kIGBTT19QQVNTUElERkRgLCBzbyBpdCdzIGRlZmluaXRlbHkgaW50ZXJlc3RpbmcuXG4yLiAgYHNrX2dldHNvY2tvcHRgIGluIGBuZXQvY29yZS9zb2NrLmNgIOKAkyBIYW5kbGVzIGBTT19QQVNTUElERkRfVEhSRUFEYCwgYFNPX1BFRVJQSURGRGAsIGFuZCBgU09fUEVFUlBJREZEX1RIUkVBRGAuIERlZmluaXRlbHkgd29ydGggaW52ZXN0aWdhdGluZy5cbjMuICBgc2NtX3JlY3ZfdW5peGAgaW4gYG5ldC9jb3JlL3NjbS5jYCDigJMgVGhpcyBjYWxscyBgc2NtX3BpZGZkX3JlY3ZgLCBzbyBpdCdzIGEgcG90ZW50aWFsIGVudHJ5IHBvaW50LlxuNC4gIGBfX3NjbV9zZW5kYCBpbiBgbmV0L2NvcmUvc2NtLmNgIOKAkyBUaGlzIGNhbGxzIGBzY21fcmVwbGFjZV9waWRgLCBzbyBpdCdzIGEgZ29vZCBjYW5kaWRhdGUuXG41LiAgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AgaW4gYGZzL3BpZGZzLmNgIOKAkyBBIG5ldyBmdW5jdGlvbiwgYWx3YXlzIGEgZ29vZCB0YXJnZXQuXG42LiAgYHBpZGZzX2NvcmVkdW1wYCBpbiBgZnMvcGlkZnMuY2Ag4oCTIEl0J3MgYSBtb2RpZmllZCBmdW5jdGlvbiwgc28gd2Ugc2hvdWxkIGxvb2sgaW50byB0aGUgY2hhbmdlcy5cblxuSSdsbCBxdWlja2x5IHNjYW4gZm9yIGFueSBvdGhlciBub24tc3RhdGljIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBwYXRjaCwganVzdCB0byBiZSBzdXJlLiBMZXQncyBsb29rIGF0IGBuZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jYCBvciBvdGhlcnMgdG8gc2VlLiBBaCwgbG9va3MgbGlrZSBgYnRfc29ja19hbGxvY2AsIGFuZCBgYnRfYWNjZXB0X2VucXVldWVgIGluIGBuZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jYCB0aGF0IGFyZSBzbWFsbCB1cGRhdGVzIHRvIGluZGV4IGBza19wZWVyX3BpZFtQSURUWVBFX1RHSURdYCBpbnN0ZWFkIG9mIHNjYWxhciBgc2tfcGVlcl9waWRgLiBOb3QgYSBwcmltYXJ5IGZvY3VzLCBidXQgbWlnaHQgYmUgaW5kaXJlY3RseSBhZmZlY3RlZCwgc28gSSdsbCBrZWVwIGFuIGV5ZSBvbiB0aGVtLlxuXG5BbHJpZ2h0LCBiYWNrIHRvIHRoZSBgRm9jdXNTeW1ib2xzYDpcblxuKiAgIGBza19zZXRzb2Nrb3B0YFxuKiAgIGBza19nZXRzb2Nrb3B0YFxuKiAgIGBzY21fcmVjdl91bml4YFxuKiAgIGBfX3NjbV9zZW5kYFxuKiAgIGBfX3BpZGZzX3JlZ2lzdGVyX3BpZHNgXG4qICAgYHBpZGZzX2NvcmVkdW1wYFxuXG5UaGVzZSBzZWVtIGxpa2UgYSBzb2xpZCBsaXN0IG9mIGVudHJ5IHBvaW50cy5cblxuTm93IGZvciB0aGUgYEVuYWJsZUNvbmZpZ3NgOlxuXG4qICAgYFVOSVhgXG4qICAgYENPUkVEVU1QYFxuXG5BbmQgSSdsbCBkb3VibGUtY2hlY2sgdGhhdCBgTkVUYCBpcyBhbHNvIG5lZWRlZCBzaW5jZSBVTklYIGRlcGVuZHMgb24gaXQuIEdvb2QgdG8gaGF2ZSB0aGF0IGRvY3VtZW50ZWQuIExldCBtZSBjaGVjayBgbmV0L3VuaXgvS2NvbmZpZ2AgdG8gYmUgc3VyZS5cblxuVGhpcyBpcyBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgcHJvY2VzczsgZ29vZCBsaXN0IG9mIGZvY3VzIGZ1bmN0aW9ucywgYW5kIGNvcnJlY3QgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMuIEl0IGlzIGEgc29saWQgYXBwcm9hY2guXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM3NDg1LCJPdXRwdXRUb2tlbnMiOjI1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTQwLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzQ6MjUuODY4NTYwOTQ2WiIsIlNlcSI6MzIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MzE2NTg5ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIFVOSVhcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L3VuaXhcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L3VuaXgvS2NvbmZpZy01LVxcbm5ldC91bml4L0tjb25maWc6Njpjb25maWcgVU5JWFxcbm5ldC91bml4L0tjb25maWctNy1cXHRib29sIFxcXCJVbml4IGRvbWFpbiBzb2NrZXRzXFxcIlxcbi0tXFxubmV0L3VuaXgvS2NvbmZpZz0xOT1jb25maWdcXHRBRl9VTklYX09PQlxcbi0tXFxubmV0L3VuaXgvS2NvbmZpZy0yNS1cXG5uZXQvdW5peC9LY29uZmlnOjI2OmNvbmZpZyBVTklYX0RJQUdcXG5uZXQvdW5peC9LY29uZmlnLTI3LVxcdHRyaXN0YXRlIFxcXCJVTklYOiBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2VcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM0OjI2LjQwMDIyNjcwNloiLCJTZXEiOjMzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0NzQ5NzYyNTM5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpdCB3ZW50OlxuXG4qKkV4YW1pbmluZyBLZXJuZWwgQ29uZmlndXJhdGlvbiBmb3IgQ29yZSBEdW1wcyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjb3JlIGR1bXBzIHdpdGhpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIE15IGluc3RpbmN0IHNheXMgdG8gbG9vayBhdCBgZnMvS2NvbmZpZy5iaW5mbXRgLCB0aGF0J3MgdXN1YWxseSB3aGVyZSB0aGUgYmluYXJ5IGZvcm1hdCBoYW5kbGluZyBpcyBkZWZpbmVkLCBhbmQgY29yZSBkdW1wIGJlaGF2aW9yIGlzIG9mdGVuIGxpbmtlZCB0byBob3cgZXhlY3V0YWJsZXMgYXJlIGhhbmRsZWQuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgY29udGVudHMgb2YgdGhhdCBmaWxlIHRvIHNlZSBpZiB0aGVyZSdzIGEgc3BlY2lmaWMgYENPUkVEVU1QYCBvcHRpb24gb3Igc29tZXRoaW5nIHJlbGF0ZWQgdGhhdCBJIGNhbiB1c2UgdG8gdW5kZXJzdGFuZCBpZiBjb3JlIGR1bXAgZ2VuZXJhdGlvbiBpcyBlbmFibGVkIG9yIGhvdyBpdCBpcyBiZWluZyBjb25maWd1cmVkLiBSaWdodCwgbGV0J3MgZ2V0IHRvIGl0LlxuXG5cbiIsIklucHV0VG9rZW5zIjozODg5MCwiT3V0cHV0VG9rZW5zIjoxOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM0OjMxLjE0OTk5MjQ2NVoiLCJTZXEiOjM0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjkxODM1MTEwOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQ09SRURVTVBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiZnMvS2NvbmZpZy5iaW5mbXQ9MTcxPWNvbmZpZyBCSU5GTVRfTUlTQ19CUEZcXG4tLVxcbmZzL0tjb25maWcuYmluZm10LTE4NC1cXG5mcy9LY29uZmlnLmJpbmZtdDoxODU6Y29uZmlnIENPUkVEVU1QXFxuZnMvS2NvbmZpZy5iaW5mbXQtMTg2LVxcdGJvb2wgXFxcIkVuYWJsZSBjb3JlIGR1bXAgc3VwcG9ydFxcXCIgaWYgRVhQRVJUXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM0OjM0LjA2ODM1NTI1MloiLCJTZXEiOjM1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3MDM1Njc1ODk0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFzc2Vzc21lbnQ6IFBhdGNoIFZlcmlmaWNhdGlvbiBhbmQgSW50ZWdyYXRpb24qKlxuXG5Pa2F5LCBldmVyeXRoaW5nIGxvb2tzIGNsZWFuLCB2ZXJpZmllZCwgYW5kIHJlYWR5IHRvIG1vdmUgZm9yd2FyZC4gVGltZSB0byBzb2xpZGlmeSB0aGlzIGluIG15IG1pbmQuLi4gTGV0J3MgcnVuIHRocm91Z2ggdGhlIGNyaXRpY2FsIHBhcmFtZXRlcnMgdG8gY29uZmlybTpcblxuKiAgICoqYFdvcnRoRnV6emluZ2AqKjogRGVmaW5pdGVseS4gV2UncmUgZGVhbGluZyB3aXRoIG5ldyBzb2NrZXQgb3B0aW9ucyBhbmQgcG90ZW50aWFsIHRocmVhZC1zcGVjaWZpYyBpbnRlcmFjdGlvbnMuIEZ1enppbmcgaXMgZXNzZW50aWFsIHRvIGZsdXNoIG91dCBhbnkgZWRnZSBjYXNlcy5cbiogICAqKmBSZWFzb25pbmdgKio6IFRoaXMgcGF0Y2ggaXMgYWRkaW5nIGBTT19QQVNTUElERkRfVEhSRUFEYCBhbmQgYFNPX1BFRVJQSURGRF9USFJFQURgIG9wdGlvbnMgZm9yIFVOSVggZG9tYWluIHNvY2tldHMuIEl0IGFsbG93cyBmb3IgdGhyZWFkLXNwZWNpZmljIGBwaWRmZGAgcGFzc2luZyBhbmQgcGVlciBjcmVkZW50aWFsIHJldHJpZXZhbCDigJMgdmVyeSBpbXBvcnRhbnQgYWRkaXRpb25zLiBJdCBhbHNvIHVwZGF0ZXMgYHBpZGZzYCBhbmQgY29yZWR1bXAgbG9naWMgdG8gaW5jbHVkZSB0aHJlYWQgYHBpZGZkYCBpbmZvcm1hdGlvbi4gVGhpcyBpcyBzdWJzdGFudGlhbCwgYWZmZWN0aW5nIHNvY2tldCBvcGVyYXRpb25zIGFuZCBkZWJ1Z2dpbmcuXG4qICAgKipgRW5hYmxlQ29uZmlnc2AqKjogV2UncmUgZW5hYmxpbmcgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zOiBcIlVOSVhcIiBhbmQgXCJDT1JFRFVNUFwiLiBUaGlzIGNvbmZpcm1zIHdlJ3JlIGhhbmRsaW5nIHRoZSBjb3JlIGNvbXBvbmVudHMgdGhpcyBwYXRjaCB0b3VjaGVzLlxuKiAgICoqYEZvY3VzU3ltYm9sc2AqKjogVGhlIGNyaXRpY2FsIHN5bWJvbHM6IGBza19zZXRzb2Nrb3B0YCwgYHNrX2dldHNvY2tvcHRgLCBgc2NtX3JlY3ZfdW5peGAsIGBfX3NjbV9zZW5kYCwgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AsIGFuZCBgcGlkZnNfY29yZWR1bXBgLiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSBpbXBhY3RlZCBieSB0aGUgcGF0Y2guIFRoZXkncmUgYWxsIGFjY291bnRlZCBmb3IsIHNvIHdlJ3JlIHNldC5cblxuV2l0aCB0aGVzZSBwYXJhbWV0ZXJzIHZlcmlmaWVkLCBJIGFtIGNvbmZpZGVudCBpbiB0cmlnZ2VyaW5nIHRoZSBgc2V0LXJlc3VsdHNgIGZ1bmN0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjozOTE1OCwiT3V0cHV0VG9rZW5zIjoxNTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzQ6NDEuMTA0MDM1MTE2WiIsIlNlcSI6MzYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY0MDM3MjA4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJVTklYXCIsXG4gICAgXCJDT1JFRFVNUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNrX3NldHNvY2tvcHRcIixcbiAgICBcInNrX2dldHNvY2tvcHRcIixcbiAgICBcInNjbV9yZWN2X3VuaXhcIixcbiAgICBcIl9fc2NtX3NlbmRcIixcbiAgICBcIl9fcGlkZnNfcmVnaXN0ZXJfcGlkc1wiLFxuICAgIFwicGlkZnNfY29yZWR1bXBcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBTT19QQVNTUElERkRfVEhSRUFEIGFuZCBTT19QRUVSUElERkRfVEhSRUFEIHNvY2tldCBvcHRpb25zIHRvIGFsbG93IHBhc3NpbmcgYW5kIHF1ZXJ5aW5nIHRocmVhZC1zcGVjaWZpYyBwaWRmZHMgb3ZlciBVTklYIGRvbWFpbiBzb2NrZXRzLiBJdCB1cGRhdGVzIHN0cnVjdCBzb2NrLCBTQ00gY3JlZGVudGlhbCBwYXNzaW5nLCBVTklYIHNvY2tldCByZWFkL3dyaXRlIGNyZWRlbnRpYWwgbWF0Y2hpbmcsIHBpZGZzIHBpZCByZWdpc3RyYXRpb24sIGFuZCBjb3JlZHVtcCBub3RpZmljYXRpb24gbWVjaGFuaXNtcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJVTklYXCIsXG4gICAgXCJDT1JFRFVNUFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNrX3NldHNvY2tvcHRcIixcbiAgICBcInNrX2dldHNvY2tvcHRcIixcbiAgICBcInNjbV9yZWN2X3VuaXhcIixcbiAgICBcIl9fc2NtX3NlbmRcIixcbiAgICBcIl9fcGlkZnNfcmVnaXN0ZXJfcGlkc1wiLFxuICAgIFwicGlkZnNfY29yZWR1bXBcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBTT19QQVNTUElERkRfVEhSRUFEIGFuZCBTT19QRUVSUElERkRfVEhSRUFEIHNvY2tldCBvcHRpb25zIHRvIGFsbG93IHBhc3NpbmcgYW5kIHF1ZXJ5aW5nIHRocmVhZC1zcGVjaWZpYyBwaWRmZHMgb3ZlciBVTklYIGRvbWFpbiBzb2NrZXRzLiBJdCB1cGRhdGVzIHN0cnVjdCBzb2NrLCBTQ00gY3JlZGVudGlhbCBwYXNzaW5nLCBVTklYIHNvY2tldCByZWFkL3dyaXRlIGNyZWRlbnRpYWwgbWF0Y2hpbmcsIHBpZGZzIHBpZCByZWdpc3RyYXRpb24sIGFuZCBjb3JlZHVtcCBub3RpZmljYXRpb24gbWVjaGFuaXNtcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzQ6NDEuMjY4MDg0MTI0WiIsIlNlcSI6MzcsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MzYwMjkwMDM5NzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozNDo0MS4yNjkwOTA1MDNaIiwiU2VxIjozOCwiTmVzdGluZyI6MiwiVHlwZSI6ImFnZW50IiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo2MzYwMjc5OTE4NzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRocmVhZCBwaWRmZHMgaW4gVU5JWCBkb21haW4gc29ja2V0cyBhbmQgY29yZWR1bXAgbWVjaGFuaXNtcyAoU09fUEFTU1BJREZEX1RIUkVBRCwgU09fUEVFUlBJREZEX1RIUkVBRCkuXFxuXFxuS2V5IGFyZWFzIGFuYWx5emVkIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcXG4xLiBgREVDTEFSRV9QSURTYCBhcnJheXMgaW4gYHN0cnVjdCBzY21fY29va2llYCwgYHN0cnVjdCBzb2NrYCwgYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgLCBgc3RydWN0IHVuaXhfcGVlcmNyZWRgLCBhbmQgYHN0cnVjdCB1bml4X3NrYl9wYXJtc2A6XFxuICAgLSBgc3RydWN0IHNvY2tgIGluc3RhbmNlcyBhcmUgYWxsb2NhdGVkIHdpdGggYHNrX2FsbG9jKClgICh6ZXJvZWQpIGFuZCBleHBsaWNpdGx5IHJlc2V0IGluIGBzb2NrX2luaXRfZGF0YV91aWQoKWAgd2l0aCBgbWVtc2V0KHNrLVxcdTAwM2Vza19wZWVyX3BpZCwgMCwgLi4uKWAuXFxuICAgLSBgc3RydWN0IHNjbV9jb29raWVgIG9iamVjdHMgYXJlIGNvbnNpc3RlbnRseSB6ZXJvLWluaXRpYWxpemVkIChlaXRoZXIgdmlhIGRlc2lnbmF0ZWQgemVybyBpbml0aWFsaXplcnMgYD0ge31gIG9yIGBtZW1zZXQoLi4uLCAwLCBzaXplb2YoLi4uKSlgKSBhY3Jvc3MgYWxsIGNhbGxlcnMgKGBzY21fc2VuZGAsIGB1bml4X2Rlc3RydWN0X3NjbWAsIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AsIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgLCBgaGNpX3NvY2tfcmVjdm1zZ2AsIGBuZXRsaW5rX3JlY3Ztc2dgKS5cXG4gICAtIGBzdHJ1Y3QgdW5peF9wZWVyY3JlZGAgaW5zdGFuY2VzIGFyZSB6ZXJvLWluaXRpYWxpemVkIChgPSB7fWApIGluIGB1bml4X2xpc3RlbmAsIGB1bml4X3N0cmVhbV9jb25uZWN0YCwgYW5kIGB1bml4X3NvY2tldHBhaXJgIGJlZm9yZSBgcHJlcGFyZV9wZWVyY3JlZCgpYC5cXG4gICAtIGBza2ItXFx1MDAzZWNiYCBjb250YWluaW5nIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgIGlzIHplcm9lZCBkdXJpbmcgYF9fYWxsb2Nfc2tiKClgLlxcbiAgIC0gYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgIGlzIHplcm8taW5pdGlhbGl6ZWQgdmlhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzIGluIGB2ZnNfY29yZWR1bXAoKWAuXFxuMi4gU29ja2V0IG9wdGlvbiBoYW5kbGVycyBhbmQgY21zZyBoZWxwZXJzOlxcbiAgIC0gYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKClgIGNvcGllcyBhbiBpbml0aWFsaXplZCBgaW50IHBpZGZkYCBhbmQgYGludCBsZW5gIHRvIHVzZXIgc3BhY2UuXFxuICAgLSBgc2NtX3BpZGZkX3JlY3YoKWAgaW5pdGlhbGl6ZXMgYHBpZGZkYCBmcm9tIGBwaWRmZF9wcmVwYXJlKClgIGJlZm9yZSB3cml0aW5nIHZpYSBgcHV0X2Ntc2coKWAuXFxuICAgLSBObyBzdHJ1Y3R1cmUgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgZXhwb3NlZCB0byB1c2Vyc3BhY2Ugb3IgcmVhZCBpbiBjb25kaXRpb25hbCBsb2dpYy5cXG4zLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIChlLmcuIHBpZCByZWZlcmVuY2UgbWFuYWdlbWVudCwgdXNlLWFmdGVyLWZyZWUsIGxvY2tpbmcgYXJvdW5kIGBza19wZWVyX2xvY2tgLCBOVUxMIGRlcmVmZXJlbmNlKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cXG5cXG5UaHVzLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2FycmFudGluZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMzMyYjAzYTU5Nzg3NjcxMjk0ZTUxN2QwMzVmNTQ1ZGQ5OTIwNjNiMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBNb24gQXVnIDMxIDEyOjMwOjIzIDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5pbmRleCA5NDZhNWZhZDI2OTEyLi41ZDM1MjRjMjZiMmJjIDEwMDY0NFxuLS0tIGEvYXJjaC9hbHBoYS9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG4rKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbkBAIC0xNTcsNiArMTU3LDEwIEBAXG4gXG4gI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQyAgICAgIDg1XG4gXG4rI2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEICAgIDg2XG4rXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEICAgIDg3XG4rXG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXG4gXG4gI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NFxuZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbmluZGV4IGYxNjQxZGRlMTM1ZmMuLjI0NWE0M2Y1MmZiMWEgMTAwNjQ0XG4tLS0gYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmhcbkBAIC0xNjgsNiArMTY4LDEwIEBAXG4gXG4gI2RlZmluZSBTT19SSUdIVFNfTk9UUlVOQyAgICAgIDg1XG4gXG4rI2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEICAgIDg2XG4rXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEICAgIDg3XG4rXG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXG4gXG4gI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NFxuZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vc29ja2V0LmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5pbmRleCBmM2EzODE1YzdkYzI5Li5mMjM3MTBlMWM2NzE0IDEwMDY0NFxuLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuQEAgLTE0OSw2ICsxNDksMTAgQEBcbiBcbiAjZGVmaW5lIFNPX1JJR0hUU19OT1RSVU5DXHQweDQwNTNcbiBcbisjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQURcdDB4NDA1NFxuK1xuKyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRFx0MHg0MDU1XG4rXG4gI2lmICFkZWZpbmVkKF9fS0VSTkVMX18pXG4gXG4gI2lmIF9fQklUU19QRVJfTE9ORyA9PSA2NFxuZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuaW5kZXggNzkwN2YzYjFmMGVlMC4uYjM1YjI1YmRlZmMyYiAxMDA2NDRcbi0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9zb2NrZXQuaFxuKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL3VhcGkvYXNtL3NvY2tldC5oXG5AQCAtMTUwLDYgKzE1MCwxMCBAQFxuIFxuICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkMgICAgICAgIDB4MDA1ZVxuIFxuKyNkZWZpbmUgU09fUEFTU1BJREZEX1RIUkVBRCAgICAgIDB4MDA1ZlxuK1xuKyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRCAgICAgIDB4MDA2MFxuK1xuICNpZiAhZGVmaW5lZChfX0tFUk5FTF9fKVxuIFxuIFxuZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jXG5pbmRleCBhYzNjZDc0ODA4YzY0Li5iNWZmNGIzZTE4MzFlIDEwMDY0NFxuLS0tIGEvZnMvY29yZWR1bXAuY1xuKysrIGIvZnMvY29yZWR1bXAuY1xuQEAgLTQ1NCw3ICs0NTQsNyBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9wYXJzZShzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcbiBcdFx0XHRcdCAqIGxlYWRlciB3ZSBrbm93IHRoYXQgdGhlIHRocmVhZC1ncm91cCBsZWFkZXJcbiBcdFx0XHRcdCAqIGNhbm5vdCBiZSByZWFwZWQgdW50aWwgQGN1cnJlbnQgaGFzIGV4aXRlZC5cbiBcdFx0XHRcdCAqL1xuLVx0XHRcdFx0Y3BybS1cdTAwM2VwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG4rXHRcdFx0XHR0YXNrX3BpZHMoY3BybS1cdTAwM2VwaWQsIGN1cnJlbnQpO1xuIFx0XHRcdFx0ZXJyID0gY25fcHJpbnRmKGNuLCBcIiVkXCIsIENPUkVEVU1QX1BJREZEX05VTUJFUik7XG4gXHRcdFx0XHRicmVhaztcbiBcdFx0XHR9XG5AQCAtNjI2LDEzICs2MjYsMTcgQEAgc3RhdGljIGludCB1bWhfY29yZWR1bXBfc2V0dXAoc3RydWN0IHN1YnByb2Nlc3NfaW5mbyAqaW5mbywgc3RydWN0IGNyZWQgKm5ldylcbiBcdHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwID0gKHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKilpbmZvLVx1MDAzZWRhdGE7XG4gXHRpbnQgZXJyO1xuIFxuLVx0aWYgKGNwLVx1MDAzZXBpZCkge1xuK1x0aWYgKGNwLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdKSB7XG4gXHRcdHN0cnVjdCBmaWxlICpwaWRmc19maWxlIF9fZnJlZShmcHV0KSA9IE5VTEw7XG4gXG4tXHRcdHBpZGZzX2ZpbGUgPSBwaWRmc19hbGxvY19maWxlKGNwLVx1MDAzZXBpZCwgMCk7XG4rXHRcdHBpZGZzX2ZpbGUgPSBwaWRmc19hbGxvY19maWxlKGNwLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdLCAwKTtcbiBcdFx0aWYgKElTX0VSUihwaWRmc19maWxlKSlcbiBcdFx0XHRyZXR1cm4gUFRSX0VSUihwaWRmc19maWxlKTtcbiBcbitcdFx0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhjcC1cdTAwM2VwaWQpO1xuK1x0XHRpZiAoZXJyKVxuK1x0XHRcdHJldHVybiBlcnI7XG4rXG4gXHRcdHBpZGZzX2NvcmVkdW1wKGNwKTtcbiBcbiBcdFx0LypcbkBAIC02OTUsMTIgKzY5OSwxMiBAQCBzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrX2Nvbm5lY3Qoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKlxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4gXHQvKlxuLVx0ICogU2V0IHRoZSB0aHJlYWQtZ3JvdXAgbGVhZGVyIHBpZCB3aGljaCBpcyB1c2VkIGZvciB0aGUgcGVlclxuLVx0ICogY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy4gVGhlbiBpbW1lZGlhdGVseSByZWdpc3RlclxuLVx0ICogaXQgaW4gcGlkZnMuLi5cbitcdCAqIFNldCB0aGUgcGlkcyBvZiB0aGUgZHVtcGluZyB0aHJlYWQgYW5kIGl0cyB0aHJlYWQtZ3JvdXAgbGVhZGVyXG4rXHQgKiB3aGljaCBhcmUgdXNlZCBmb3IgdGhlIHBlZXIgY3JlZGVudGlhbHMgZHVyaW5nIGNvbm5lY3QoKSBiZWxvdy5cbitcdCAqIFRoZW4gaW1tZWRpYXRlbHkgcmVnaXN0ZXIgdGhlbSBpbiBwaWRmcy4uLlxuIFx0ICovXG4tXHRjcHJtLVx1MDAzZXBpZCA9IHRhc2tfdGdpZChjdXJyZW50KTtcbi1cdHJldHZhbCA9IHBpZGZzX3JlZ2lzdGVyX3BpZChjcHJtLVx1MDAzZXBpZCk7XG4rXHR0YXNrX3BpZHMoY3BybS1cdTAwM2VwaWQsIGN1cnJlbnQpO1xuK1x0cmV0dmFsID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhjcHJtLVx1MDAzZXBpZCk7XG4gXHRpZiAocmV0dmFsKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG5AQCAtNzIyLDcgKzcyNiw3IEBAIHN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqXG4gXHR9XG4gXG4gXHQvKiAuLi4gYW5kIHZhbGlkYXRlIHRoYXQgQHNrX3BlZXJfcGlkIG1hdGNoZXMgQGNwcm0ucGlkLiAqL1xuLVx0aWYgKFdBUk5fT05fT05DRSh1bml4X3BlZXIoc29ja2V0LVx1MDAzZXNrKS1cdTAwM2Vza19wZWVyX3BpZCAhPSBjcHJtLVx1MDAzZXBpZCkpXG4rXHRpZiAoV0FSTl9PTl9PTkNFKCFwaWRzX2VxdWFsKHVuaXhfcGVlcihzb2NrZXQtXHUwMDNlc2spLVx1MDAzZXNrX3BlZXJfcGlkLCBjcHJtLVx1MDAzZXBpZCkpKVxuIFx0XHRyZXR1cm4gZmFsc2U7XG4gXG4gXHRjcHJtLVx1MDAzZWxpbWl0ID0gUkxJTV9JTkZJTklUWTtcbmRpZmYgLS1naXQgYS9mcy9waWRmcy5jIGIvZnMvcGlkZnMuY1xuaW5kZXggYTZhNjQzZjE1ZDA4YS4uMjkyOTliMmM3Y2E3MSAxMDA2NDRcbi0tLSBhL2ZzL3BpZGZzLmNcbisrKyBiL2ZzL3BpZGZzLmNcbkBAIC03OTMsOSArNzkzLDkgQEAgdm9pZCBwaWRmc19leGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKVxuIH1cbiBcbiAjaWZkZWYgQ09ORklHX0NPUkVEVU1QXG4tdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuK3N0YXRpYyB2b2lkIHBpZGZzX2NvcmVkdW1wX3BpZChzdHJ1Y3QgcGlkICpwaWQsXG4rXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXG4ge1xuLVx0c3RydWN0IHBpZCAqcGlkID0gY3BybS1cdTAwM2VwaWQ7XG4gXHRzdHJ1Y3QgcGlkZnNfYXR0ciAqYXR0cjtcbiBcbiBcdGF0dHIgPSBSRUFEX09OQ0UocGlkLVx1MDAzZWF0dHIpO1xuQEAgLTgxNCw2ICs4MTQsMTMgQEAgdm9pZCBwaWRmc19jb3JlZHVtcChjb25zdCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxuIFx0c21wX3dtYigpO1xuIFx0c2V0X2JpdChQSURGU19BVFRSX0JJVF9DT1JFRFVNUCwgXHUwMDI2YXR0ci1cdTAwM2VhdHRyX21hc2spO1xuIH1cbitcbit2b2lkIHBpZGZzX2NvcmVkdW1wKGNvbnN0IHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXG4re1xuK1x0LyogVGhlIGR1bXBpbmcgdGhyZWFkJ3MgcGlkZmQgcmVwb3J0cyB0aGUgY29yZWR1bXAgYXMgd2VsbC4gKi9cbitcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBwaWRzX2xhc3QoY3BybS1cdTAwM2VwaWQpOyB0eXBlKyspXG4rXHRcdHBpZGZzX2NvcmVkdW1wX3BpZChjcHJtLVx1MDAzZXBpZFt0eXBlXSwgY3BybSk7XG4rfVxuICNlbmRpZlxuIFxuIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnBpZGZzX21udCBfX3JvX2FmdGVyX2luaXQ7XG5AQCAtMTA3MCw2ICsxMDc3LDIyIEBAIGludCBwaWRmc19yZWdpc3Rlcl9waWRfZ2ZwKHN0cnVjdCBwaWQgKnBpZCwgZ2ZwX3QgZ2ZwKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKy8qIFJlZ2lzdGVyIHRoZSBwaWRzIHVwIHRvIHBpZCB0eXBlIEBsYXN0IG9mIEBwaWRzIGluIHBpZGZzLiAqL1xuK2ludCBfX3BpZGZzX3JlZ2lzdGVyX3BpZHMoc3RydWN0IHBpZCAqY29uc3QgKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdClcbit7XG4rXHRpZiAoV0FSTl9PTl9PTkNFKGxhc3QgXHUwMDNlPSBQSURUWVBFX01BWCkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuK1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUrKykge1xuK1x0XHRpbnQgcmV0ID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHBpZHNbdHlwZV0pO1xuK1xuK1x0XHRpZiAodW5saWtlbHkocmV0KSlcbitcdFx0XHRyZXR1cm4gcmV0O1xuK1x0fVxuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwaWRmc19zdGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqKnN0YXNoZWQsXG4gXHRcdFx0XHRcdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpXG4ge1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaCBiL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaFxuaW5kZXggN2IzOGVlMmU3OTEzYi4uMGJiYjdkZTZhNDAyMSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvY29yZWR1bXAuaFxuKysrIGIvaW5jbHVkZS9saW51eC9jb3JlZHVtcC5oXG5AQCAtNSw2ICs1LDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC90eXBlcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbW0uaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2ZzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9waWRfdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3NjaGVkL2NvcmVkdW1wLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2Nhc20vc2lnaW5mby5oXHUwMDNlXG4gXG5AQCAtMzIsNyArMzMsOCBAQCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zIHtcbiBcdGludCB2bWFfY291bnQ7XG4gXHRzaXplX3Qgdm1hX2RhdGFfc2l6ZTtcbiBcdHN0cnVjdCBjb3JlX3ZtYV9tZXRhZGF0YSAqdm1hX21ldGE7XG4tXHRzdHJ1Y3QgcGlkICpwaWQ7XG4rXHQvKiBEdW1waW5nIHRocmVhZCBhbmQgaXRzIHRocmVhZC1ncm91cCBsZWFkZXIgYnkgcGlkIHR5cGUuICovXG4rXHRERUNMQVJFX1BJRFMocGlkLCBQSURUWVBFX1RHSUQpO1xuIH07XG4gXG4gZXh0ZXJuIHVuc2lnbmVkIGludCBjb3JlX2ZpbGVfbm90ZV9zaXplX2xpbWl0O1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlkLmggYi9pbmNsdWRlL2xpbnV4L3BpZC5oXG5pbmRleCBkZGFlZjBiYmM4YmEzLi44NzYzNWQwY2MxZjcxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9waWQuaFxuKysrIGIvaW5jbHVkZS9saW51eC9waWQuaFxuQEAgLTIsNiArMiw5IEBAXG4gI2lmbmRlZiBfTElOVVhfUElEX0hcbiAjZGVmaW5lIF9MSU5VWF9QSURfSFxuIFxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2FycmF5X3NpemUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2J1aWxkX2J1Zy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvbWlubWF4LmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9waWRfdHlwZXMuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdWxpc3QuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L3JjdXBkYXRlLmhcdTAwM2VcbkBAIC05Miw2ICs5NSw1NiBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBwaWQgKmdldF9waWQoc3RydWN0IHBpZCAqcGlkKVxuIH1cbiBcbiBleHRlcm4gdm9pZCBwdXRfcGlkKHN0cnVjdCBwaWQgKnBpZCk7XG4rXG4rLypcbisgKiBIZWxwZXJzIGZvciBhcnJheXMgb2Ygc3RydWN0IHBpZCBpbmRleGVkIGJ5IHBpZCB0eXBlIGRlY2xhcmVkIHdpdGhcbisgKiBERUNMQVJFX1BJRFMoKS4gVGhlIGFycmF5IGNvdmVycyBQSURUWVBFX1BJRCB1cCB0byB0aGUgcGlkIHR5cGUgaXRcbisgKiB3YXMgZGVjbGFyZWQgd2l0aCBhbmQgdGhlIGhlbHBlcnMgdGFrZSB0aGF0IGJvdW5kIGZyb20gdGhlIGFycmF5LlxuKyAqL1xuK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2dldF9waWRzKHN0cnVjdCBwaWQgKipkc3QsIHN0cnVjdCBwaWQgKmNvbnN0ICpzcmMsXG4rXHRcdFx0ICAgICAgZW51bSBwaWRfdHlwZSBsYXN0KVxuK3tcbitcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBsYXN0OyB0eXBlKyspXG4rXHRcdGRzdFt0eXBlXSA9IGdldF9waWQoc3JjW3R5cGVdKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSB2b2lkIF9fcHV0X3BpZHMoc3RydWN0IHBpZCAqKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdClcbit7XG4rXHRmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFx1MDAzYz0gbGFzdDsgdHlwZSsrKSB7XG4rXHRcdHB1dF9waWQocGlkc1t0eXBlXSk7XG4rXHRcdHBpZHNbdHlwZV0gPSBOVUxMO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgX19zd2FwX3BpZHMoc3RydWN0IHBpZCAqKmEsIHN0cnVjdCBwaWQgKipiLFxuK1x0XHRcdCAgICAgICBlbnVtIHBpZF90eXBlIGxhc3QpXG4re1xuK1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUrKylcbitcdFx0c3dhcChhW3R5cGVdLCBiW3R5cGVdKTtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIF9fcGlkc19lcXVhbChzdHJ1Y3QgcGlkICpjb25zdCAqYSwgc3RydWN0IHBpZCAqY29uc3QgKmIsXG4rXHRcdFx0XHRlbnVtIHBpZF90eXBlIGxhc3QpXG4re1xuK1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUrKylcbitcdFx0aWYgKGFbdHlwZV0gIT0gYlt0eXBlXSlcbitcdFx0XHRyZXR1cm4gZmFsc2U7XG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rLyogVGhlIGxhc3QgcGlkIHR5cGUgYW4gYXJyYXkgZGVjbGFyZWQgd2l0aCBERUNMQVJFX1BJRFMoKSBjb3ZlcnMuICovXG4rI2RlZmluZSBwaWRzX2xhc3QocGlkcylcdFx0XHRcdFx0XHRcdFxcXG4rXHQoKGVudW0gcGlkX3R5cGUpKEFSUkFZX1NJWkUocGlkcykgLSAxICtcdFx0XHRcdFxcXG4rXHRcdFx0IEJVSUxEX0JVR19PTl9aRVJPKEFSUkFZX1NJWkUocGlkcykgXHUwMDNlIFBJRFRZUEVfTUFYKSkpXG4rXG4rI2RlZmluZSBfX3BpZHNfbGFzdDIoYSwgYilcdFx0XHRcdFx0XHRcXFxuK1x0KHBpZHNfbGFzdChhKSArIEJVSUxEX0JVR19PTl9aRVJPKEFSUkFZX1NJWkUoYSkgIT0gQVJSQVlfU0laRShiKSkpXG4rXG4rI2RlZmluZSBnZXRfcGlkcyhkc3QsIHNyYylcdF9fZ2V0X3BpZHMoZHN0LCBzcmMsIF9fcGlkc19sYXN0Mihkc3QsIHNyYykpXG4rI2RlZmluZSBwdXRfcGlkcyhwaWRzKVx0XHRfX3B1dF9waWRzKHBpZHMsIHBpZHNfbGFzdChwaWRzKSlcbisjZGVmaW5lIHN3YXBfcGlkcyhhLCBiKVx0XHRfX3N3YXBfcGlkcyhhLCBiLCBfX3BpZHNfbGFzdDIoYSwgYikpXG4rI2RlZmluZSBwaWRzX2VxdWFsKGEsIGIpXHRfX3BpZHNfZXF1YWwoYSwgYiwgX19waWRzX2xhc3QyKGEsIGIpKVxuK1xuIGV4dGVybiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBpZF90YXNrKHN0cnVjdCBwaWQgKnBpZCwgZW51bSBwaWRfdHlwZSk7XG4gc3RhdGljIGlubGluZSBib29sIHBpZF9oYXNfdGFzayhzdHJ1Y3QgcGlkICpwaWQsIGVudW0gcGlkX3R5cGUgdHlwZSlcbiB7XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvcGlkX3R5cGVzLmhcbmluZGV4IGMyYWVlMWQ5MWRjZmQuLjMzMDI2OTBhMmEyODEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oXG5AQCAtMiw2ICsyLDggQEBcbiAjaWZuZGVmIF9MSU5VWF9QSURfVFlQRVNfSFxuICNkZWZpbmUgX0xJTlVYX1BJRF9UWVBFU19IXG4gXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvYnVpbGRfYnVnLmhcdTAwM2VcbitcbiBlbnVtIHBpZF90eXBlIHtcbiBcdFBJRFRZUEVfUElELFxuIFx0UElEVFlQRV9UR0lELFxuQEAgLTEwLDYgKzEyLDEyIEBAIGVudW0gcGlkX3R5cGUge1xuIFx0UElEVFlQRV9NQVgsXG4gfTtcbiBcbitzdHJ1Y3QgcGlkO1xuK1xuKy8qIEFuIGFycmF5IG9mIHN0cnVjdCBwaWQgaW5kZXhlZCBieSBwaWQgdHlwZSwgUElEVFlQRV9QSUQgdXAgdG8gQGxhc3QuICovXG4rI2RlZmluZSBERUNMQVJFX1BJRFMobmFtZSwgbGFzdClcdFx0XHRcdFx0XFxcbitcdHN0cnVjdCBwaWQgKm5hbWVbKGxhc3QpICsgMSArIEJVSUxEX0JVR19PTl9aRVJPKChsYXN0KSBcdTAwM2U9IFBJRFRZUEVfTUFYKV1cbitcbiBzdHJ1Y3QgcGlkX25hbWVzcGFjZTtcbiBleHRlcm4gc3RydWN0IHBpZF9uYW1lc3BhY2UgaW5pdF9waWRfbnM7XG4gXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWRmcy5oIGIvaW5jbHVkZS9saW51eC9waWRmcy5oXG5pbmRleCAwYWJmN2RhOWFiMjM2Li4zYzFlODJmMWEzNjkxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9waWRmcy5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3BpZGZzLmhcbkBAIC0zLDYgKzMsNyBAQFxuICNkZWZpbmUgX0xJTlVYX1BJRF9GU19IXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvZ2ZwX3R5cGVzLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9waWQuaFx1MDAzZVxuIFxuIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXM7XG4gXG5AQCAtMzIsNSArMzMsOSBAQCBzdGF0aWMgaW5saW5lIGludCBwaWRmc19yZWdpc3Rlcl9waWQoc3RydWN0IHBpZCAqcGlkKVxuIH1cbiBcbiB2b2lkIHBpZGZzX2ZyZWVfcGlkKHN0cnVjdCBwaWQgKnBpZCk7XG4raW50IF9fcGlkZnNfcmVnaXN0ZXJfcGlkcyhzdHJ1Y3QgcGlkICpjb25zdCAqcGlkcywgZW51bSBwaWRfdHlwZSBsYXN0KTtcbitcbisvKiBSZWdpc3RlciB0aGUgcGlkcyBvZiBhbiBhcnJheSBkZWNsYXJlZCB3aXRoIERFQ0xBUkVfUElEUygpLiAqL1xuKyNkZWZpbmUgcGlkZnNfcmVnaXN0ZXJfcGlkcyhwaWRzKVx0X19waWRmc19yZWdpc3Rlcl9waWRzKHBpZHMsIHBpZHNfbGFzdChwaWRzKSlcbiBcbiAjZW5kaWYgLyogX0xJTlVYX1BJRF9GU19IICovXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC9zaWduYWwuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQvc2lnbmFsLmhcbmluZGV4IDU4NGFlODhiNDM1ZTkuLjk0NDRiNDc3ODlhMDggMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oXG5AQCAtNjc3LDYgKzY3NywyNCBAQCBzdHJ1Y3QgcGlkICp0YXNrX3BpZF90eXBlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBwaWRfdHlwZSB0eXBlKVxuIFx0cmV0dXJuIHBpZDtcbiB9XG4gXG4rLyogRmlsbCBAcGlkcyB3aXRoIHRoZSBwaWQgdHlwZXMgb2YgQHRhc2sgdXAgdG8gQGxhc3QsIHdpdGhvdXQgcmVmZXJlbmNlcy4gKi9cbitzdGF0aWMgaW5saW5lIHZvaWQgX190YXNrX3BpZHMoc3RydWN0IHBpZCAqKnBpZHMsIGVudW0gcGlkX3R5cGUgbGFzdCxcbitcdFx0XHQgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuK3tcbitcdGZvciAoZW51bSBwaWRfdHlwZSB0eXBlID0gUElEVFlQRV9QSUQ7IHR5cGUgXHUwMDNjPSBsYXN0OyB0eXBlKyspXG4rXHRcdHBpZHNbdHlwZV0gPSB0YXNrX3BpZF90eXBlKHRhc2ssIHR5cGUpO1xuK31cbitcbitzdGF0aWMgaW5saW5lIHZvaWQgX19nZXRfdGFza19waWRzKHN0cnVjdCBwaWQgKipwaWRzLCBlbnVtIHBpZF90eXBlIGxhc3QsXG4rXHRcdFx0XHQgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spXG4re1xuK1x0Zm9yIChlbnVtIHBpZF90eXBlIHR5cGUgPSBQSURUWVBFX1BJRDsgdHlwZSBcdTAwM2M9IGxhc3Q7IHR5cGUrKylcbitcdFx0cGlkc1t0eXBlXSA9IGdldF9waWQodGFza19waWRfdHlwZSh0YXNrLCB0eXBlKSk7XG4rfVxuK1xuKyNkZWZpbmUgdGFza19waWRzKHBpZHMsIHRhc2spXHRcdF9fdGFza19waWRzKHBpZHMsIHBpZHNfbGFzdChwaWRzKSwgdGFzaylcbisjZGVmaW5lIGdldF90YXNrX3BpZHMocGlkcywgdGFzaylcdF9fZ2V0X3Rhc2tfcGlkcyhwaWRzLCBwaWRzX2xhc3QocGlkcyksIHRhc2spXG4rXG4gc3RhdGljIGlubGluZSBzdHJ1Y3QgcGlkICp0YXNrX3RnaWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKVxuIHtcbiBcdHJldHVybiB0YXNrLVx1MDAzZXNpZ25hbC1cdTAwM2VwaWRzW1BJRFRZUEVfVEdJRF07XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NtLmggYi9pbmNsdWRlL25ldC9zY20uaFxuaW5kZXggODZhZTZiYzEwOWVjNi4uYWE3ZDE1YzVmYzI3MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbmV0L3NjbS5oXG4rKysgYi9pbmNsdWRlL25ldC9zY20uaFxuQEAgLTQyLDcgKzQyLDcgQEAgc3RydWN0IHNjbV9mcF9saXN0IHtcbiB9O1xuIFxuIHN0cnVjdCBzY21fY29va2llIHtcbi1cdHN0cnVjdCBwaWRcdFx0KnBpZDtcdFx0LyogU2tiIGNyZWRlbnRpYWxzICovXG4rXHRERUNMQVJFX1BJRFMocGlkLCBQSURUWVBFX1RHSUQpO1x0LyogU2tiIGNyZWRlbnRpYWxzIGJ5IHBpZCB0eXBlICovXG4gXHRzdHJ1Y3Qgc2NtX2ZwX2xpc3RcdCpmcDtcdFx0LyogUGFzc2VkIGZpbGVzXHRcdCovXG4gXHRzdHJ1Y3Qgc2NtX2NyZWRzXHRjcmVkcztcdFx0LyogU2tiIGNyZWRlbnRpYWxzXHQqL1xuICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS1xuQEAgLTY5LDcgKzY5LDcgQEAgc3RhdGljIF9faW5saW5lX18gdm9pZCB1bml4X2dldF9wZWVyc2VjX2RncmFtKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzY21fY29cbiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9zZXRfY3JlZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLFxuIFx0XHRcdFx0ICAgIHN0cnVjdCBwaWQgKnBpZCwga3VpZF90IHVpZCwga2dpZF90IGdpZClcbiB7XG4tXHRzY20tXHUwMDNlcGlkID0gZ2V0X3BpZChwaWQpO1xuK1x0c2NtLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwaWQpO1xuIFx0c2NtLVx1MDAzZWNyZWRzLnBpZCA9IHBpZF92bnIocGlkKTtcbiBcdHNjbS1cdTAwM2VjcmVkcy51aWQgPSB1aWQ7XG4gXHRzY20tXHUwMDNlY3JlZHMuZ2lkID0gZ2lkO1xuQEAgLTc3LDggKzc3LDcgQEAgc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSxcbiBcbiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9kZXN0cm95X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbiB7XG4tXHRwdXRfcGlkKHNjbS1cdTAwM2VwaWQpO1xuLVx0c2NtLVx1MDAzZXBpZCA9IE5VTEw7XG4rXHRwdXRfcGlkcyhzY20tXHUwMDNlcGlkKTtcbiB9XG4gXG4gc3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaFxuaW5kZXggNTExODUyMjJhYWMyOS4uNjdiNzQzYmFiMjIwZSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaFxuKysrIGIvaW5jbHVkZS9uZXQvc29jay5oXG5AQCAtMzAxLDcgKzMwMSw3IEBAIHN0cnVjdCBza19maWx0ZXI7XG4gICAqXHRAc2tfdHlwZTogc29ja2V0IHR5cGUgKCVTT0NLX1NUUkVBTSwgZXRjKVxuICAgKlx0QHNrX3Byb3RvY29sOiB3aGljaCBwcm90b2NvbCB0aGlzIHNvY2tldCBiZWxvbmdzIGluIHRoaXMgbmV0d29yayBmYW1pbHlcbiAgICpcdEBza19wZWVyX2xvY2s6IGxvY2sgcHJvdGVjdGluZyBAc2tfcGVlcl9waWQgYW5kIEBza19wZWVyX2NyZWRcbi0gICpcdEBza19wZWVyX3BpZDogXHUwMDI2c3RydWN0IHBpZCBmb3IgdGhpcyBzb2NrZXQncyBwZWVyXG4rICAqXHRAc2tfcGVlcl9waWQ6IFx1MDAyNnN0cnVjdCBwaWQgZm9yIHRoaXMgc29ja2V0J3MgcGVlciwgYnkgcGlkIHR5cGVcbiAgICpcdEBza19wZWVyX2NyZWQ6ICVTT19QRUVSQ1JFRCBzZXR0aW5nXG4gICAqXHRAc2tfcmN2bG93YXQ6ICVTT19SQ1ZMT1dBVCBzZXR0aW5nXG4gICAqXHRAc2tfcmN2dGltZW86ICVTT19SQ1ZUSU1FTyBzZXR0aW5nXG5AQCAtMzU2LDYgKzM1Niw3IEBAIHN0cnVjdCBza19maWx0ZXI7XG4gICAqXHRAc2tfc2NtX3NlY3VyaXR5OiBmbGFnZ2VkIGJ5IFNPX1BBU1NTRUMgdG8gcmVjdiBTQ01fU0VDVVJJVFlcbiAgICpcdEBza19zY21fcGlkZmQ6IGZsYWdnZWQgYnkgU09fUEFTU1BJREZEIHRvIHJlY3YgU0NNX1BJREZEXG4gICAqXHRAc2tfc2NtX3JpZ2h0czogZmxhZ2dlZCBieSBTT19QQVNTUklHSFRTIHRvIHJlY3YgU0NNX1JJR0hUU1xuKyAgKlx0QHNrX3NjbV9waWRmZF90aHJlYWQ6IGZsYWdnZWQgYnkgU09fUEFTU1BJREZEX1RIUkVBRCB0byByZWN2IGEgdGhyZWFkIFNDTV9QSURGRFxuICAgKlx0QHNrX3NjbV91bnVzZWQ6IHVudXNlZCBmbGFncyBmb3Igc2NtX3JlY3YoKVxuICAgKlx0QG5zX3RyYWNrZXI6IHRyYWNrZXIgZm9yIG5ldG5zIHJlZmVyZW5jZVxuICAgKlx0QHNrX3VzZXJfZnJhZ3M6IHhhcnJheSBvZiBwYWdlcyB0aGUgdXNlciBpcyBob2xkaW5nIGEgcmVmZXJlbmNlIG9uLlxuQEAgLTU0NSw3ICs1NDYsNyBAQCBzdHJ1Y3Qgc29jayB7XG4gXHR1NjRcdFx0XHRza19pbm87XG4gXHRzcGlubG9ja190XHRcdHNrX3BlZXJfbG9jaztcbiBcdGludFx0XHRcdHNrX2JpbmRfcGhjO1xuLVx0c3RydWN0IHBpZFx0XHQqc2tfcGVlcl9waWQ7XG4rXHRERUNMQVJFX1BJRFMoc2tfcGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7XG4gXHRjb25zdCBzdHJ1Y3QgY3JlZFx0KnNrX3BlZXJfY3JlZDtcbiBcbiBcdGt0aW1lX3RcdFx0XHRza19zdGFtcDtcbkBAIC01NjIsNyArNTYzLDggQEAgc3RydWN0IHNvY2sge1xuIFx0XHRcdFx0c2tfc2NtX3NlY3VyaXR5IDogMSxcbiBcdFx0XHRcdHNrX3NjbV9waWRmZCA6IDEsXG4gXHRcdFx0XHRza19zY21fcmlnaHRzIDogMSxcbi1cdFx0XHRcdHNrX3NjbV91bnVzZWQgOiA0O1xuK1x0XHRcdFx0c2tfc2NtX3BpZGZkX3RocmVhZCA6IDEsXG4rXHRcdFx0XHRza19zY21fdW51c2VkIDogMztcbiBcdFx0fTtcbiBcdH07XG4gXHR1OFx0XHRcdHNrX2Nsb2NraWQ7XG5AQCAtMjk4Niw2ICsyOTg4LDEyIEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBza19pc19zdHJlYW1fdW5peChjb25zdCBzdHJ1Y3Qgc29jayAqc2spXG4gXHRyZXR1cm4gc2tfaXNfdW5peChzaykgXHUwMDI2XHUwMDI2IHNrLVx1MDAzZXNrX3R5cGUgPT0gU09DS19TVFJFQU07XG4gfVxuIFxuKy8qIFNPX1BBU1NQSURGRCBvciBTT19QQVNTUElERkRfVEhSRUFEIGFza2VkIGZvciBhbiBTQ01fUElERkQuICovXG4rc3RhdGljIGlubGluZSBib29sIHNrX3NjbV9waWRmZF93YW50ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKVxuK3tcbitcdHJldHVybiBzay1cdTAwM2Vza19zY21fcGlkZmQgfHwgc2stXHUwMDNlc2tfc2NtX3BpZGZkX3RocmVhZDtcbit9XG4rXG4gc3RhdGljIGlubGluZSBib29sIHNrX2lzX3Zzb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaylcbiB7XG4gXHRyZXR1cm4gc2stXHUwMDNlc2tfZmFtaWx5ID09IEFGX1ZTT0NLO1xuZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaCBiL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaFxuaW5kZXggODRlYTdiOTI5MzZlMi4uNTZmZWQ3YWIyN2FiOCAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9zb2NrZXQuaFxuKysrIGIvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL3NvY2tldC5oXG5AQCAtMTUyLDYgKzE1MiwxMCBAQFxuIFxuICNkZWZpbmUgU09fUklHSFRTX05PVFJVTkNcdDg1XG4gXG4rI2RlZmluZSBTT19QQVNTUElERkRfVEhSRUFEXHQ4NlxuK1xuKyNkZWZpbmUgU09fUEVFUlBJREZEX1RIUkVBRFx0ODdcbitcbiAjaWYgIWRlZmluZWQoX19LRVJORUxfXylcbiBcbiAjaWYgX19CSVRTX1BFUl9MT05HID09IDY0IHx8IChkZWZpbmVkKF9feDg2XzY0X18pIFx1MDAyNlx1MDAyNiBkZWZpbmVkKF9fSUxQMzJfXykpXG5kaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmNcbmluZGV4IDQxMWQ2NmYyNDM5M2QuLjc3NThlOWVhMzg0OGMgMTAwNjQ0XG4tLS0gYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jXG4rKysgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jXG5AQCAtMTYxLDcgKzE2MSw3IEBAIHN0cnVjdCBzb2NrICpidF9zb2NrX2FsbG9jKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jayxcbiBcdC8qIEluaXQgcGVlciBpbmZvcm1hdGlvbiBzbyBpdCBjYW4gYmUgcHJvcGVybHkgbW9uaXRvcmVkICovXG4gXHRpZiAoIWtlcm4pIHtcbiBcdFx0c3Bpbl9sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4tXHRcdHNrLVx1MDAzZXNrX3BlZXJfcGlkICA9IGdldF9waWQodGFza190Z2lkKGN1cnJlbnQpKTtcbitcdFx0c2stXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSAgPSBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSk7XG4gXHRcdHNrLVx1MDAzZXNrX3BlZXJfY3JlZCA9IGdldF9jdXJyZW50X2NyZWQoKTtcbiBcdFx0c3Bpbl91bmxvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiBcdH1cbkBAIC0yMzUsOSArMjM1LDkgQEAgdm9pZCBidF9hY2NlcHRfZW5xdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgYmgpXG4gXHQgKiBzb2NrZXQgaXMgYWxsb2NhdGVkIGJ5IHRoZSBrZXJuZWwuXG4gXHQgKi9cbiBcdHNwaW5fbG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuLVx0b2xkX3BpZCA9IHNrLVx1MDAzZXNrX3BlZXJfcGlkO1xuK1x0b2xkX3BpZCA9IHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF07XG4gXHRvbGRfY3JlZCA9IHNrLVx1MDAzZXNrX3BlZXJfY3JlZDtcbi1cdHNrLVx1MDAzZXNrX3BlZXJfcGlkID0gZ2V0X3BpZChwYXJlbnQtXHUwMDNlc2tfcGVlcl9waWQpO1xuK1x0c2stXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSA9IGdldF9waWQocGFyZW50LVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pO1xuIFx0c2stXHUwMDNlc2tfcGVlcl9jcmVkID0gZ2V0X2NyZWQocGFyZW50LVx1MDAzZXNrX3BlZXJfY3JlZCk7XG4gXHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuIFxuZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suY1xuaW5kZXggMDcwY2EzODhmOWFjZS4uOTFlNDczOGVhYmRiMCAxMDA2NDRcbi0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suY1xuKysrIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jXG5AQCAtMjczLDIxICsyNzMsMjEgQEAgc3RhdGljIHZvaWQgaGNpX3NvY2tfY29weV9jcmVkcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4gXHRjcmVkcyA9IFx1MDAyNmJ0X2NiKHNrYiktXHUwMDNlY3JlZHM7XG4gXG4gXHQvKiBDaGVjayBpZiBwZWVyIGNyZWRlbnRpYWxzIGlzIHNldCAqL1xuLVx0aWYgKCFzay1cdTAwM2Vza19wZWVyX3BpZCkge1xuK1x0aWYgKCFzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdKSB7XG4gXHRcdC8qIENoZWNrIGlmIHBhcmVudCBwZWVyIGNyZWRlbnRpYWxzIGlzIHNldCAqL1xuLVx0XHRpZiAoYnRfc2soc2spLVx1MDAzZXBhcmVudCBcdTAwMjZcdTAwMjYgYnRfc2soc2spLVx1MDAzZXBhcmVudC1cdTAwM2Vza19wZWVyX3BpZClcbitcdFx0aWYgKGJ0X3NrKHNrKS1cdTAwM2VwYXJlbnQgXHUwMDI2XHUwMDI2IGJ0X3NrKHNrKS1cdTAwM2VwYXJlbnQtXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSlcbiBcdFx0XHRzayA9IGJ0X3NrKHNrKS1cdTAwM2VwYXJlbnQ7XG4gXHRcdGVsc2VcbiBcdFx0XHRyZXR1cm47XG4gXHR9XG4gXG4gXHQvKiBDaGVjayBpZiBzY21fY3JlZHMgYWxyZWFkeSBzZXQgKi9cbi1cdGlmIChjcmVkcy1cdTAwM2VwaWQgPT0gcGlkX3Zucihzay1cdTAwM2Vza19wZWVyX3BpZCkpXG4rXHRpZiAoY3JlZHMtXHUwMDNlcGlkID09IHBpZF92bnIoc2stXHUwMDNlc2tfcGVlcl9waWRbUElEVFlQRV9UR0lEXSkpXG4gXHRcdHJldHVybjtcbiBcbiBcdG1lbXNldChjcmVkcywgMCwgc2l6ZW9mKCpjcmVkcykpO1xuIFxuLVx0Y3JlZHMtXHUwMDNlcGlkID0gcGlkX3Zucihzay1cdTAwM2Vza19wZWVyX3BpZCk7XG4rXHRjcmVkcy1cdTAwM2VwaWQgPSBwaWRfdm5yKHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF0pO1xuIFx0aWYgKHNrLVx1MDAzZXNrX3BlZXJfY3JlZCkge1xuIFx0XHRjcmVkcy1cdTAwM2V1aWQgPSBzay1cdTAwM2Vza19wZWVyX2NyZWQtXHUwMDNldWlkO1xuIFx0XHRjcmVkcy1cdTAwM2VnaWQgPSBzay1cdTAwM2Vza19wZWVyX2NyZWQtXHUwMDNlZ2lkO1xuZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmNcbmluZGV4IDExOTRjMzdlNDY2ZjEuLjg3MmQ4ZmIzMWI2ZmIgMTAwNjQ0XG4tLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suY1xuKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmNcbkBAIC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgc3RydWN0IHBpZCAqbDJjYXBfc29ja19nZXRfcGVlcl9waWRfY2Ioc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pXG4ge1xuIFx0c3RydWN0IHNvY2sgKnNrID0gY2hhbi1cdTAwM2VkYXRhO1xuIFxuLVx0cmV0dXJuIHNrLVx1MDAzZXNrX3BlZXJfcGlkO1xuK1x0cmV0dXJuIHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF07XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGwyY2FwX3NvY2tfc3VzcGVuZF9jYihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbilcbmRpZmYgLS1naXQgYS9uZXQvY29yZS9zY20uYyBiL25ldC9jb3JlL3NjbS5jXG5pbmRleCBmMGQ0NGVjZGIxMWZjLi5kNjk3Njg0MTRhZjQ4IDEwMDY0NFxuLS0tIGEvbmV0L2NvcmUvc2NtLmNcbisrKyBiL25ldC9jb3JlL3NjbS5jXG5AQCAtMTQ5LDYgKzE0OSw3IEBAIEVYUE9SVF9TWU1CT0woX19zY21fZGVzdHJveSk7XG4gXG4gc3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZClcbiB7XG4rXHRzdHJ1Y3QgcGlkICp0aHJlYWRfcGlkO1xuIFx0aW50IGVycjtcbiBcbiBcdC8qIGRyb3AgYWxsIHByZXZpb3VzIHJlZmVyZW5jZXMgKi9cbkBAIC0xNTgsNyArMTU5LDE4IEBAIHN0YXRpYyBpbmxpbmUgaW50IHNjbV9yZXBsYWNlX3BpZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3QgcGlkICpwaWQpXG4gXHRpZiAodW5saWtlbHkoZXJyKSlcbiBcdFx0cmV0dXJuIGVycjtcbiBcbi1cdHNjbS1cdTAwM2VwaWQgPSBwaWQ7XG4rXHQvKiBBIHNlbmRlciBuYW1pbmcgaXRzIG93biB0aHJlYWQtZ3JvdXAgc2VuZHMgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQuICovXG4rXHRpZiAocGlkID09IHRhc2tfdGdpZChjdXJyZW50KSlcbitcdFx0dGhyZWFkX3BpZCA9IHRhc2tfcGlkKGN1cnJlbnQpO1xuK1x0ZWxzZVxuK1x0XHR0aHJlYWRfcGlkID0gcGlkO1xuK1xuK1x0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkKHRocmVhZF9waWQpO1xuK1x0aWYgKHVubGlrZWx5KGVycikpXG4rXHRcdHJldHVybiBlcnI7XG4rXG4rXHRzY20tXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gPSBwaWQ7XG4rXHRzY20tXHUwMDNlcGlkW1BJRFRZUEVfUElEXSA9IGdldF9waWQodGhyZWFkX3BpZCk7XG4gXHRzY20tXHUwMDNlY3JlZHMucGlkID0gcGlkX3ZucihwaWQpO1xuIFx0cmV0dXJuIDA7XG4gfVxuQEAgLTIwNyw3ICsyMTksOCBAQCBpbnQgX19zY21fc2VuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpwKVxuIFx0XHRcdGlmIChlcnIpXG4gXHRcdFx0XHRnb3RvIGVycm9yO1xuIFxuLVx0XHRcdGlmICghcC1cdTAwM2VwaWQgfHwgcGlkX3ZucihwLVx1MDAzZXBpZCkgIT0gY3JlZHMucGlkKSB7XG4rXHRcdFx0aWYgKCFwLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdIHx8XG4rXHRcdFx0ICAgIHBpZF92bnIocC1cdTAwM2VwaWRbUElEVFlQRV9UR0lEXSkgIT0gY3JlZHMucGlkKSB7XG4gXHRcdFx0XHRzdHJ1Y3QgcGlkICpwaWQ7XG4gXHRcdFx0XHRlcnIgPSAtRVNSQ0g7XG4gXHRcdFx0XHRwaWQgPSBmaW5kX2dldF9waWQoY3JlZHMucGlkKTtcbkBAIC00ODYsOSArNDk5LDEzIEBAIHN0YXRpYyBib29sIHNjbV9oYXNfc2VjZGF0YShzdHJ1Y3Qgc29jayAqc2spXG4gfVxuICNlbmRpZlxuIFxuLXN0YXRpYyB2b2lkIHNjbV9waWRmZF9yZWN2KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcbitzdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbitcdFx0XHQgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuIHtcbitcdGVudW0gcGlkX3R5cGUgdHlwZSA9IHNrLVx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQgPyBQSURUWVBFX1BJRCA6IFBJRFRZUEVfVEdJRDtcbitcdHN0cnVjdCBwaWQgKnBpZCA9IHNjbS1cdTAwM2VwaWRbdHlwZV07XG4gXHRzdHJ1Y3QgZmlsZSAqcGlkZmRfZmlsZSA9IE5VTEw7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSURGRF9TVEFMRTtcbiBcdGludCBsZW4sIHBpZGZkO1xuIFxuIFx0LyogcHV0X2Ntc2coKSBkb2Vzbid0IHJldHVybiBhbiBlcnJvciBpZiBDTVNHIGlzIHRydW5jYXRlZCxcbkBAIC01MDQsMTAgKzUyMSwxMyBAQCBzdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20pXG4gXHRcdHJldHVybjtcbiBcdH1cbiBcbi1cdGlmICghc2NtLVx1MDAzZXBpZClcbitcdGlmICghcGlkKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUoc2NtLVx1MDAzZXBpZCwgUElERkRfU1RBTEUsIFx1MDAyNnBpZGZkX2ZpbGUpO1xuK1x0aWYgKHR5cGUgPT0gUElEVFlQRV9QSUQpXG4rXHRcdGZsYWdzIHw9IFBJREZEX1RIUkVBRDtcbitcbitcdHBpZGZkID0gcGlkZmRfcHJlcGFyZShwaWQsIGZsYWdzLCBcdTAwMjZwaWRmZF9maWxlKTtcbiBcbiBcdGlmIChwdXRfY21zZyhtc2csIFNPTF9TT0NLRVQsIFNDTV9QSURGRCwgc2l6ZW9mKGludCksIFx1MDAyNnBpZGZkKSkge1xuIFx0XHRpZiAocGlkZmRfZmlsZSkge1xuQEAgLTUyNiw3ICs1NDYsNyBAQCBzdGF0aWMgYm9vbCBfX3NjbV9yZWN2X2NvbW1vbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcbiBcdFx0XHQgICAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBpbnQgZmxhZ3MpXG4ge1xuIFx0aWYgKCFtc2ctXHUwMDNlbXNnX2NvbnRyb2wpIHtcbi1cdFx0aWYgKHNrLVx1MDAzZXNrX3NjbV9jcmVkZW50aWFscyB8fCBzay1cdTAwM2Vza19zY21fcGlkZmQgfHxcbitcdFx0aWYgKHNrLVx1MDAzZXNrX3NjbV9jcmVkZW50aWFscyB8fCBza19zY21fcGlkZmRfd2FudGVkKHNrKSB8fFxuIFx0XHQgICAgc2NtLVx1MDAzZWZwIHx8IHNjbV9oYXNfc2VjZGF0YShzaykpXG4gXHRcdFx0bXNnLVx1MDAzZW1zZ19mbGFncyB8PSBNU0dfQ1RSVU5DO1xuIFxuQEAgLTU3Myw4ICs1OTMsOCBAQCB2b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxuIFx0XHRzY21fZGV0YWNoX2Zkcyhtc2csIHNjbSwgUkVBRF9PTkNFKHUtXHUwMDNlc2NtX3JpZ2h0c19ub3RydW5jKSk7XG4gXHR9XG4gXG4tXHRpZiAoc29jay1cdTAwM2Vzay1cdTAwM2Vza19zY21fcGlkZmQpXG4tXHRcdHNjbV9waWRmZF9yZWN2KG1zZywgc2NtKTtcbitcdGlmIChza19zY21fcGlkZmRfd2FudGVkKHNvY2stXHUwMDNlc2spKVxuK1x0XHRzY21fcGlkZmRfcmVjdihzb2NrLVx1MDAzZXNrLCBtc2csIHNjbSk7XG4gXG4gXHRzY21fZGVzdHJveV9jcmVkKHNjbSk7XG4gfVxuZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NvY2suYyBiL25ldC9jb3JlL3NvY2suY1xuaW5kZXggMWFkNDE5MDRkYjI1Yi4uY2IyZmZkMzI5YmM2NyAxMDA2NDRcbi0tLSBhL25ldC9jb3JlL3NvY2suY1xuKysrIGIvbmV0L2NvcmUvc29jay5jXG5AQCAtMTU3MSwxMCArMTU3MSwyNSBAQCBpbnQgc2tfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG4gXHRcdGJyZWFrO1xuIFxuIFx0Y2FzZSBTT19QQVNTUElERkQ6XG4tXHRcdGlmIChza19pc191bml4KHNrKSlcbitcdFx0aWYgKHNrX2lzX3VuaXgoc2spKSB7XG4rXHRcdFx0LyogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggU09fUEFTU1BJREZEX1RIUkVBRC4gKi9cbiBcdFx0XHRzay1cdTAwM2Vza19zY21fcGlkZmQgPSB2YWxib29sO1xuLVx0XHRlbHNlXG4rXHRcdFx0aWYgKHZhbGJvb2wpXG4rXHRcdFx0XHRzay1cdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkID0gMDtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHRyZXQgPSAtRU9QTk9UU1VQUDtcbitcdFx0fVxuK1x0XHRicmVhaztcbitcbitcdGNhc2UgU09fUEFTU1BJREZEX1RIUkVBRDpcbitcdFx0aWYgKHNrX2lzX3VuaXgoc2spKSB7XG4rXHRcdFx0LyogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggU09fUEFTU1BJREZELiAqL1xuK1x0XHRcdHNrLVx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQgPSB2YWxib29sO1xuK1x0XHRcdGlmICh2YWxib29sKVxuK1x0XHRcdFx0c2stXHUwMDNlc2tfc2NtX3BpZGZkID0gMDtcbitcdFx0fSBlbHNlIHtcbiBcdFx0XHRyZXQgPSAtRU9QTk9UU1VQUDtcbitcdFx0fVxuIFx0XHRicmVhaztcbiBcbiBcdGNhc2UgU09fUEFTU1JJR0hUUzpcbkBAIC0xNzI4LDYgKzE3NDMsNTAgQEAgc3RhdGljIGludCBncm91cHNfdG9fdXNlcihzb2NrcHRyX3QgZHN0LCBjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqc3JjKVxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuKy8qIEhhbmQgb3V0IGEgcGlkZmQgZm9yIEB0eXBlIG9mIHRoZSBzb2NrZXQncyBwZWVyIHZpYSBTT19QRUVSUElERkQqLiAqL1xuK3N0YXRpYyBpbnQgc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHBpZF90eXBlIHR5cGUsXG4rXHRcdFx0XHQgICBzb2NrcHRyX3Qgb3B0dmFsLCBzb2NrcHRyX3Qgb3B0bGVuLCBpbnQgbGVuKVxuK3tcbitcdHN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDtcbitcdHVuc2lnbmVkIGludCBmbGFncyA9IDA7XG4rXHRzdHJ1Y3QgcGlkICpwZWVyX3BpZDtcbitcdGludCBwaWRmZDtcbitcbitcdGlmIChsZW4gXHUwMDNlIHNpemVvZihwaWRmZCkpXG4rXHRcdGxlbiA9IHNpemVvZihwaWRmZCk7XG4rXG4rXHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbitcdHBlZXJfcGlkID0gZ2V0X3BpZChzay1cdTAwM2Vza19wZWVyX3BpZFt0eXBlXSk7XG4rXHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuK1xuK1x0aWYgKCFwZWVyX3BpZClcbitcdFx0cmV0dXJuIC1FTk9EQVRBO1xuK1xuK1x0LyogVGhlIHVzZSBvZiBQSURGRF9TVEFMRSByZXF1aXJlcyBzdGFzaGluZyBvZiBzdHJ1Y3QgcGlkIG9uIHBpZGZzXG4rXHQgKiB3aXRoIHBpZGZzX3JlZ2lzdGVyX3BpZCgpIGFuZCBvbmx5IEFGX1VOSVggd2VyZSBwcmVwYXJlZCBmb3IgdGhpcy5cbitcdCAqL1xuK1x0aWYgKHNrLVx1MDAzZXNrX2ZhbWlseSA9PSBBRl9VTklYKVxuK1x0XHRmbGFncyB8PSBQSURGRF9TVEFMRTtcbitcdGlmICh0eXBlID09IFBJRFRZUEVfUElEKVxuK1x0XHRmbGFncyB8PSBQSURGRF9USFJFQUQ7XG4rXG4rXHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGVlcl9waWQsIGZsYWdzLCBcdTAwMjZwaWRmZF9maWxlKTtcbitcdHB1dF9waWQocGVlcl9waWQpO1xuK1x0aWYgKHBpZGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gcGlkZmQ7XG4rXG4rXHRpZiAoY29weV90b19zb2NrcHRyKG9wdHZhbCwgXHUwMDI2cGlkZmQsIGxlbikgfHxcbitcdCAgICBjb3B5X3RvX3NvY2twdHIob3B0bGVuLCBcdTAwMjZsZW4sIHNpemVvZihpbnQpKSkge1xuK1x0XHRwdXRfdW51c2VkX2ZkKHBpZGZkKTtcbitcdFx0ZnB1dChwaWRmZF9maWxlKTtcbitcbitcdFx0cmV0dXJuIC1FRkFVTFQ7XG4rXHR9XG4rXG4rXHRmZF9pbnN0YWxsKHBpZGZkLCBwaWRmZF9maWxlKTtcbitcdHJldHVybiAwO1xuK31cbitcbiBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG4gXHRcdCAgc29ja3B0cl90IG9wdHZhbCwgc29ja3B0cl90IG9wdGxlbilcbiB7XG5AQCAtMTg5Miw2ICsxOTUxLDEzIEBAIGludCBza19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSxcbiBcdFx0di52YWwgPSBzay1cdTAwM2Vza19zY21fcGlkZmQ7XG4gXHRcdGJyZWFrO1xuIFxuK1x0Y2FzZSBTT19QQVNTUElERkRfVEhSRUFEOlxuK1x0XHRpZiAoIXNrX2lzX3VuaXgoc2spKVxuK1x0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbitcbitcdFx0di52YWwgPSBzay1cdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkO1xuK1x0XHRicmVhaztcbitcbiBcdGNhc2UgU09fUEFTU1JJR0hUUzpcbiBcdFx0aWYgKCFza19pc191bml4KHNrKSlcbiBcdFx0XHRyZXR1cm4gLUVPUE5PVFNVUFA7XG5AQCAtMTkwNiw3ICsxOTcyLDggQEAgaW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuIFx0XHRcdGxlbiA9IHNpemVvZihwZWVyY3JlZCk7XG4gXG4gXHRcdHNwaW5fbG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuLVx0XHRjcmVkX3RvX3VjcmVkKHNrLVx1MDAzZXNrX3BlZXJfcGlkLCBzay1cdTAwM2Vza19wZWVyX2NyZWQsIFx1MDAyNnBlZXJjcmVkKTtcbitcdFx0Y3JlZF90b191Y3JlZChzay1cdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdLCBzay1cdTAwM2Vza19wZWVyX2NyZWQsXG4rXHRcdFx0ICAgICAgXHUwMDI2cGVlcmNyZWQpO1xuIFx0XHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuIFxuIFx0XHRpZiAoY29weV90b19zb2NrcHRyKG9wdHZhbCwgXHUwMDI2cGVlcmNyZWQsIGxlbikpXG5AQCAtMTkxNSw0NSArMTk4MiwxNCBAQCBpbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG4gXHR9XG4gXG4gXHRjYXNlIFNPX1BFRVJQSURGRDpcbi1cdHtcbi1cdFx0c3RydWN0IHBpZCAqcGVlcl9waWQ7XG4tXHRcdHN0cnVjdCBmaWxlICpwaWRmZF9maWxlID0gTlVMTDtcbi1cdFx0dW5zaWduZWQgaW50IGZsYWdzID0gMDtcbi1cdFx0aW50IHBpZGZkO1xuLVxuLVx0XHRpZiAobGVuIFx1MDAzZSBzaXplb2YocGlkZmQpKVxuLVx0XHRcdGxlbiA9IHNpemVvZihwaWRmZCk7XG4tXG4tXHRcdHNwaW5fbG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuLVx0XHRwZWVyX3BpZCA9IGdldF9waWQoc2stXHUwMDNlc2tfcGVlcl9waWQpO1xuLVx0XHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuK1x0XHRyZXR1cm4gc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc2ssIFBJRFRZUEVfVEdJRCwgb3B0dmFsLCBvcHRsZW4sIGxlbik7XG4gXG4tXHRcdGlmICghcGVlcl9waWQpXG4tXHRcdFx0cmV0dXJuIC1FTk9EQVRBO1xuLVxuLVx0XHQvKiBUaGUgdXNlIG9mIFBJREZEX1NUQUxFIHJlcXVpcmVzIHN0YXNoaW5nIG9mIHN0cnVjdCBwaWRcbi1cdFx0ICogb24gcGlkZnMgd2l0aCBwaWRmc19yZWdpc3Rlcl9waWQoKSBhbmQgb25seSBBRl9VTklYXG4tXHRcdCAqIHdlcmUgcHJlcGFyZWQgZm9yIHRoaXMuXG4tXHRcdCAqL1xuLVx0XHRpZiAoc2stXHUwMDNlc2tfZmFtaWx5ID09IEFGX1VOSVgpXG4tXHRcdFx0ZmxhZ3MgPSBQSURGRF9TVEFMRTtcbi1cbi1cdFx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBlZXJfcGlkLCBmbGFncywgXHUwMDI2cGlkZmRfZmlsZSk7XG4tXHRcdHB1dF9waWQocGVlcl9waWQpO1xuLVx0XHRpZiAocGlkZmQgXHUwMDNjIDApXG4tXHRcdFx0cmV0dXJuIHBpZGZkO1xuLVxuLVx0XHRpZiAoY29weV90b19zb2NrcHRyKG9wdHZhbCwgXHUwMDI2cGlkZmQsIGxlbikgfHxcbi1cdFx0ICAgIGNvcHlfdG9fc29ja3B0cihvcHRsZW4sIFx1MDAyNmxlbiwgc2l6ZW9mKGludCkpKSB7XG4tXHRcdFx0cHV0X3VudXNlZF9mZChwaWRmZCk7XG4tXHRcdFx0ZnB1dChwaWRmZF9maWxlKTtcbi1cbi1cdFx0XHRyZXR1cm4gLUVGQVVMVDtcbi1cdFx0fVxuK1x0Y2FzZSBTT19QRUVSUElERkRfVEhSRUFEOlxuK1x0XHQvKiBPbmx5IEFGX1VOSVggcmVjb3JkcyB0aGUgcGVlcidzIGNvbm5lY3RpbmcgdGhyZWFkLiAqL1xuK1x0XHRpZiAoIXNrX2lzX3VuaXgoc2spKVxuK1x0XHRcdHJldHVybiAtRU9QTk9UU1VQUDtcbiBcbi1cdFx0ZmRfaW5zdGFsbChwaWRmZCwgcGlkZmRfZmlsZSk7XG4tXHRcdHJldHVybiAwO1xuLVx0fVxuK1x0XHRyZXR1cm4gc2tfZ2V0c29ja29wdF9wZWVycGlkZmQoc2ssIFBJRFRZUEVfUElELCBvcHR2YWwsIG9wdGxlbiwgbGVuKTtcbiBcbiBcdGNhc2UgU09fUEVFUkdST1VQUzpcbiBcdHtcbkBAIC0yMzc5LDcgKzI0MTUsNyBAQCBzdGF0aWMgdm9pZCBfX3NrX2Rlc3RydWN0KHN0cnVjdCByY3VfaGVhZCAqaGVhZClcbiBcbiBcdC8qIFdlIGRvIG5vdCBuZWVkIHRvIGFjcXVpcmUgc2stXHUwMDNlc2tfcGVlcl9sb2NrLCB3ZSBhcmUgdGhlIGxhc3QgdXNlci4gKi9cbiBcdHB1dF9jcmVkKHNrLVx1MDAzZXNrX3BlZXJfY3JlZCk7XG4tXHRwdXRfcGlkKHNrLVx1MDAzZXNrX3BlZXJfcGlkKTtcbitcdHB1dF9waWRzKHNrLVx1MDAzZXNrX3BlZXJfcGlkKTtcbiBcbiBcdGlmIChsaWtlbHkoc2stXHUwMDNlc2tfbmV0X3JlZmNudCkpIHtcbiBcdFx0cHV0X25ldF90cmFjayhuZXQsIFx1MDAyNnNrLVx1MDAzZW5zX3RyYWNrZXIpO1xuQEAgLTM3NzUsNyArMzgxMSw3IEBAIHZvaWQgc29ja19pbml0X2RhdGFfdWlkKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrICpzaywga3VpZF90IHVpZClcbiBcdHNrLVx1MDAzZXNrX2ZyYWcub2Zmc2V0XHQ9XHQwO1xuIFx0c2stXHUwMDNlc2tfcGVla19vZmZcdFx0PVx0LTE7XG4gXG4tXHRzay1cdTAwM2Vza19wZWVyX3BpZCBcdD1cdE5VTEw7XG4rXHRtZW1zZXQoc2stXHUwMDNlc2tfcGVlcl9waWQsIDAsIHNpemVvZihzay1cdTAwM2Vza19wZWVyX3BpZCkpO1xuIFx0c2stXHUwMDNlc2tfcGVlcl9jcmVkXHQ9XHROVUxMO1xuIFx0c3Bpbl9sb2NrX2luaXQoXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbiBcbmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmMgYi9uZXQvdW5peC9hZl91bml4LmNcbmluZGV4IDEzZjk5MjZiZjIwNTcuLjU2M2Q5ODI3YzVjYzUgMTAwNjQ0XG4tLS0gYS9uZXQvdW5peC9hZl91bml4LmNcbisrKyBiL25ldC91bml4L2FmX3VuaXguY1xuQEAgLTczNyw1NyArNzM3LDUzIEBAIHN0YXRpYyB2b2lkIHVuaXhfcmVsZWFzZV9zb2NrKHN0cnVjdCBzb2NrICpzaywgaW50IGVtYnJpb24pXG4gfVxuIFxuIHN0cnVjdCB1bml4X3BlZXJjcmVkIHtcbi1cdHN0cnVjdCBwaWQgKnBlZXJfcGlkO1xuK1x0REVDTEFSRV9QSURTKHBlZXJfcGlkLCBQSURUWVBFX1RHSUQpO1xuIFx0Y29uc3Qgc3RydWN0IGNyZWQgKnBlZXJfY3JlZDtcbiB9O1xuIFxuIHN0YXRpYyBpbmxpbmUgaW50IHByZXBhcmVfcGVlcmNyZWQoc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxuIHtcbi1cdHN0cnVjdCBwaWQgKnBpZDtcbiBcdGludCBlcnI7XG4gXG4tXHRwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG4tXHRlcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQocGlkKTtcbi1cdGlmIChsaWtlbHkoIWVycikpIHtcbi1cdFx0cGVlcmNyZWQtXHUwMDNlcGVlcl9waWQgPSBnZXRfcGlkKHBpZCk7XG4tXHRcdHBlZXJjcmVkLVx1MDAzZXBlZXJfY3JlZCA9IGdldF9jdXJyZW50X2NyZWQoKTtcbitcdGdldF90YXNrX3BpZHMocGVlcmNyZWQtXHUwMDNlcGVlcl9waWQsIGN1cnJlbnQpO1xuK1x0ZXJyID0gcGlkZnNfcmVnaXN0ZXJfcGlkcyhwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCk7XG4rXHRpZiAodW5saWtlbHkoZXJyKSkge1xuK1x0XHRwdXRfcGlkcyhwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCk7XG4rXHRcdHJldHVybiBlcnI7XG4gXHR9XG4tXHRyZXR1cm4gZXJyO1xuK1xuK1x0cGVlcmNyZWQtXHUwMDNlcGVlcl9jcmVkID0gZ2V0X2N1cnJlbnRfY3JlZCgpO1xuK1x0cmV0dXJuIDA7XG4gfVxuIFxuIHN0YXRpYyB2b2lkIGRyb3BfcGVlcmNyZWQoc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBjcmVkICpjcmVkID0gTlVMTDtcbi1cdHN0cnVjdCBwaWQgKnBpZCA9IE5VTEw7XG4gXG4gXHRtaWdodF9zbGVlcCgpO1xuIFxuLVx0c3dhcChwZWVyY3JlZC1cdTAwM2VwZWVyX3BpZCwgcGlkKTtcbitcdHB1dF9waWRzKHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkKTtcbiBcdHN3YXAocGVlcmNyZWQtXHUwMDNlcGVlcl9jcmVkLCBjcmVkKTtcbi1cbi1cdHB1dF9waWQocGlkKTtcbiBcdHB1dF9jcmVkKGNyZWQpO1xuIH1cbiBcbiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9wZWVyY3JlZChzdHJ1Y3Qgc29jayAqc2ssXG4gXHRcdFx0XHQgY29uc3Qgc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxuIHtcbi1cdHNrLVx1MDAzZXNrX3BlZXJfcGlkID0gcGVlcmNyZWQtXHUwMDNlcGVlcl9waWQ7XG4rXHRtZW1jcHkoc2stXHUwMDNlc2tfcGVlcl9waWQsIHBlZXJjcmVkLVx1MDAzZXBlZXJfcGlkLCBzaXplb2Yoc2stXHUwMDNlc2tfcGVlcl9waWQpKTtcbiBcdHNrLVx1MDAzZXNrX3BlZXJfY3JlZCA9IHBlZXJjcmVkLVx1MDAzZXBlZXJfY3JlZDtcbiB9XG4gXG4gc3RhdGljIHZvaWQgdXBkYXRlX3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxuIHtcbiBcdGNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDtcbi1cdHN0cnVjdCBwaWQgKm9sZF9waWQ7XG4gXG4gXHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdG9sZF9waWQgPSBzay1cdTAwM2Vza19wZWVyX3BpZDtcbitcdHN3YXBfcGlkcyhzay1cdTAwM2Vza19wZWVyX3BpZCwgcGVlcmNyZWQtXHUwMDNlcGVlcl9waWQpO1xuIFx0b2xkX2NyZWQgPSBzay1cdTAwM2Vza19wZWVyX2NyZWQ7XG4tXHRpbml0X3BlZXJjcmVkKHNrLCBwZWVyY3JlZCk7XG4rXHRzay1cdTAwM2Vza19wZWVyX2NyZWQgPSBwZWVyY3JlZC1cdTAwM2VwZWVyX2NyZWQ7XG4gXHRzcGluX3VubG9jayhcdTAwMjZzay1cdTAwM2Vza19wZWVyX2xvY2spO1xuIFxuLVx0cGVlcmNyZWQtXHUwMDNlcGVlcl9waWQgPSBvbGRfcGlkO1xuIFx0cGVlcmNyZWQtXHUwMDNlcGVlcl9jcmVkID0gb2xkX2NyZWQ7XG4gfVxuIFxuQEAgLTc5NiwxNCArNzkyLDE0IEBAIHN0YXRpYyB2b2lkIGNvcHlfcGVlcmNyZWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29jayAqcGVlcnNrKVxuIFx0bG9ja2RlcF9hc3NlcnRfaGVsZChcdTAwMjZ1bml4X3NrKHBlZXJzayktXHUwMDNlbG9jayk7XG4gXG4gXHRzcGluX2xvY2soXHUwMDI2c2stXHUwMDNlc2tfcGVlcl9sb2NrKTtcbi1cdHNrLVx1MDAzZXNrX3BlZXJfcGlkID0gZ2V0X3BpZChwZWVyc2stXHUwMDNlc2tfcGVlcl9waWQpO1xuK1x0Z2V0X3BpZHMoc2stXHUwMDNlc2tfcGVlcl9waWQsIHBlZXJzay1cdTAwM2Vza19wZWVyX3BpZCk7XG4gXHRzay1cdTAwM2Vza19wZWVyX2NyZWQgPSBnZXRfY3JlZChwZWVyc2stXHUwMDNlc2tfcGVlcl9jcmVkKTtcbiBcdHNwaW5fdW5sb2NrKFx1MDAyNnNrLVx1MDAzZXNrX3BlZXJfbG9jayk7XG4gfVxuIFxuIHN0YXRpYyBib29sIHVuaXhfbWF5X3Bhc3NjcmVkKGNvbnN0IHN0cnVjdCBzb2NrICpzaylcbiB7XG4tXHRyZXR1cm4gc2stXHUwMDNlc2tfc2NtX2NyZWRlbnRpYWxzIHx8IHNrLVx1MDAzZXNrX3NjbV9waWRmZDtcbitcdHJldHVybiBzay1cdTAwM2Vza19zY21fY3JlZGVudGlhbHMgfHwgc2tfc2NtX3BpZGZkX3dhbnRlZChzayk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgdW5peF9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpXG5AQCAtMTA2MCw2ICsxMDU2LDcgQEAgc3RhdGljIGJvb2wgdW5peF9icGZfYnlwYXNzX2dldHNvY2tvcHQoaW50IGxldmVsLCBpbnQgb3B0bmFtZSlcbiBcdGlmIChsZXZlbCA9PSBTT0xfU09DS0VUKSB7XG4gXHRcdHN3aXRjaCAob3B0bmFtZSkge1xuIFx0XHRjYXNlIFNPX1BFRVJQSURGRDpcbitcdFx0Y2FzZSBTT19QRUVSUElERkRfVEhSRUFEOlxuIFx0XHRcdHJldHVybiB0cnVlO1xuIFx0XHRkZWZhdWx0OlxuIFx0XHRcdHJldHVybiBmYWxzZTtcbkBAIC0xOTczLDcgKzE5NzAsNyBAQCBzdGF0aWMgdm9pZCB1bml4X2Rlc3RydWN0X3NjbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIHtcbiBcdHN0cnVjdCBzY21fY29va2llIHNjbSA9IHt9O1xuIFxuLVx0c3dhcChzY20ucGlkLCBVTklYQ0Ioc2tiKS5waWQpO1xuK1x0c3dhcF9waWRzKHNjbS5waWQsIFVOSVhDQihza2IpLnBpZCk7XG4gXG4gXHRpZiAoVU5JWENCKHNrYikuZnApXG4gXHRcdHVuaXhfZGV0YWNoX2ZkcyhcdTAwMjZzY20sIHNrYik7XG5AQCAtMTk5MSw3ICsxOTg4LDcgQEAgc3RhdGljIGludCB1bml4X3NjbV90b19za2Ioc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBzZW5cbiB7XG4gXHRpbnQgZXJyID0gMDtcbiBcbi1cdFVOSVhDQihza2IpLnBpZCA9IGdldF9waWQoc2NtLVx1MDAzZXBpZCk7XG4rXHRnZXRfcGlkcyhVTklYQ0Ioc2tiKS5waWQsIHNjbS1cdTAwM2VwaWQpO1xuIFx0VU5JWENCKHNrYikudWlkID0gc2NtLVx1MDAzZWNyZWRzLnVpZDtcbiBcdFVOSVhDQihza2IpLmdpZCA9IHNjbS1cdTAwM2VjcmVkcy5naWQ7XG4gXHRVTklYQ0Ioc2tiKS5mcCA9IE5VTEw7XG5AQCAtMjAwNSw3ICsyMDAyLDEwIEBAIHN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuXG4gXG4gc3RhdGljIHZvaWQgdW5peF9za2JfdG9fc2NtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY21fY29va2llICpzY20pXG4ge1xuLVx0c2NtX3NldF9jcmVkKHNjbSwgVU5JWENCKHNrYikucGlkLCBVTklYQ0Ioc2tiKS51aWQsIFVOSVhDQihza2IpLmdpZCk7XG4rXHRnZXRfcGlkcyhzY20tXHUwMDNlcGlkLCBVTklYQ0Ioc2tiKS5waWQpO1xuK1x0c2NtLVx1MDAzZWNyZWRzLnBpZCA9IHBpZF92bnIoc2NtLVx1MDAzZXBpZFtQSURUWVBFX1RHSURdKTtcbitcdHNjbS1cdTAwM2VjcmVkcy51aWQgPSBVTklYQ0Ioc2tiKS51aWQ7XG4rXHRzY20tXHUwMDNlY3JlZHMuZ2lkID0gVU5JWENCKHNrYikuZ2lkO1xuIFx0dW5peF9zZXRfc2VjZGF0YShzY20sIHNrYik7XG4gfVxuIFxuQEAgLTIwMjUsMzAgKzIwMjUsMzUgQEAgc3RhdGljIHZvaWQgdW5peF9za2JfdG9fc2NtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY21fY29va2llICpzY20pXG4gc3RhdGljIGludCB1bml4X21heWJlX2FkZF9jcmVkcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXG4gXHRcdFx0XHRjb25zdCBzdHJ1Y3Qgc29jayAqb3RoZXIpXG4ge1xuLVx0aWYgKFVOSVhDQihza2IpLnBpZClcbitcdGlmIChVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9UR0lEXSlcbiBcdFx0cmV0dXJuIDA7XG4gXG4gXHRpZiAodW5peF9tYXlfcGFzc2NyZWQoc2spIHx8IHVuaXhfbWF5X3Bhc3NjcmVkKG90aGVyKSB8fFxuIFx0ICAgICFvdGhlci1cdTAwM2Vza19zb2NrZXQpIHtcbi1cdFx0c3RydWN0IHBpZCAqcGlkO1xuIFx0XHRpbnQgZXJyO1xuIFxuLVx0XHRwaWQgPSB0YXNrX3RnaWQoY3VycmVudCk7XG4tXHRcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZChwaWQpO1xuLVx0XHRpZiAodW5saWtlbHkoZXJyKSlcbitcdFx0Z2V0X3Rhc2tfcGlkcyhVTklYQ0Ioc2tiKS5waWQsIGN1cnJlbnQpO1xuK1x0XHRlcnIgPSBwaWRmc19yZWdpc3Rlcl9waWRzKFVOSVhDQihza2IpLnBpZCk7XG4rXHRcdGlmICh1bmxpa2VseShlcnIpKSB7XG4rXHRcdFx0cHV0X3BpZHMoVU5JWENCKHNrYikucGlkKTtcbiBcdFx0XHRyZXR1cm4gZXJyO1xuK1x0XHR9XG4gXG4tXHRcdFVOSVhDQihza2IpLnBpZCA9IGdldF9waWQocGlkKTtcbiBcdFx0Y3VycmVudF91aWRfZ2lkKFx1MDAyNlVOSVhDQihza2IpLnVpZCwgXHUwMDI2VU5JWENCKHNrYikuZ2lkKTtcbiBcdH1cbiBcbiBcdHJldHVybiAwO1xuIH1cbiBcbi1zdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoc3RydWN0IHNrX2J1ZmYgKnNrYixcbitzdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxuIFx0XHRcdCAgICBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxuIHtcbi1cdHJldHVybiBVTklYQ0Ioc2tiKS5waWQgPT0gc2NtLVx1MDAzZXBpZCBcdTAwMjZcdTAwMjZcbitcdC8qIE9ubHkgYSB0aHJlYWQgcGlkZmQgcmVjZWl2ZXIgY2FuIHRlbGwgdGhyZWFkcyBvZiBvbmUgcHJvY2VzcyBhcGFydC4gKi9cbitcdGlmIChzay1cdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkIFx1MDAyNlx1MDAyNlxuK1x0ICAgIFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1BJRF0gIT0gc2NtLVx1MDAzZXBpZFtQSURUWVBFX1BJRF0pXG4rXHRcdHJldHVybiBmYWxzZTtcbitcbitcdHJldHVybiBVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9UR0lEXSA9PSBzY20tXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgdWlkX2VxKFVOSVhDQihza2IpLnVpZCwgc2NtLVx1MDAzZWNyZWRzLnVpZCkgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgZ2lkX2VxKFVOSVhDQihza2IpLmdpZCwgc2NtLVx1MDAzZWNyZWRzLmdpZCkgXHUwMDI2XHUwMDI2XG4gXHQgICAgICAgdW5peF9zZWNkYXRhX2VxKHNjbSwgc2tiKTtcbkBAIC0zMDI2LDcgKzMwMzEsNyBAQCBzdGF0aWMgaW50IHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpYyhzdHJ1Y3QgdW5peF9zdHJlYW1fcmVhZF9zdGF0ZSAqc3RhdGUsXG4gXG4gXHRcdGlmIChjaGVja19jcmVkcykge1xuIFx0XHRcdC8qIE5ldmVyIGdsdWUgbWVzc2FnZXMgZnJvbSBkaWZmZXJlbnQgd3JpdGVycyAqL1xuLVx0XHRcdGlmICghdW5peF9za2Jfc2NtX2VxKHNrYiwgXHUwMDI2c2NtKSlcbitcdFx0XHRpZiAoIXVuaXhfc2tiX3NjbV9lcShzaywgc2tiLCBcdTAwMjZzY20pKVxuIFx0XHRcdFx0YnJlYWs7XG4gXHRcdH0gZWxzZSBpZiAodW5peF9tYXlfcGFzc2NyZWQoc2spKSB7XG4gXHRcdFx0LyogQ29weSBjcmVkZW50aWFscyAqL1xuZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguaCBiL25ldC91bml4L2FmX3VuaXguaFxuaW5kZXggODExOWRiZWVmM2EzYy4uNDAyNzQyODk1YWNjYSAxMDA2NDRcbi0tLSBhL25ldC91bml4L2FmX3VuaXguaFxuKysrIGIvbmV0L3VuaXgvYWZfdW5peC5oXG5AQCAtMiw2ICsyLDcgQEBcbiAjaWZuZGVmIF9fQUZfVU5JWF9IXG4gI2RlZmluZSBfX0FGX1VOSVhfSFxuIFxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3BpZF90eXBlcy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvdWlkZ2lkLmhcdTAwM2VcbiBcbiAjZGVmaW5lIFVOSVhfSEFTSF9NT0RcdCgyNTYgLSAxKVxuQEAgLTExLDcgKzEyLDcgQEBcbiBzdHJ1Y3Qgc29jayAqdW5peF9wZWVyX2dldChzdHJ1Y3Qgc29jayAqc2spO1xuIFxuIHN0cnVjdCB1bml4X3NrYl9wYXJtcyB7XG4tXHRzdHJ1Y3QgcGlkXHRcdCpwaWQ7XHRcdC8qIHNrYiBjcmVkZW50aWFsc1x0Ki9cbitcdERFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7XHQvKiBza2IgY3JlZGVudGlhbHMgYnkgcGlkIHR5cGUgKi9cbiBcdGt1aWRfdFx0XHRcdHVpZDtcbiBcdGtnaWRfdFx0XHRcdGdpZDtcbiBcdHN0cnVjdCBzY21fZnBfbGlzdFx0KmZwO1x0XHQvKiBQYXNzZWQgZmlsZXNcdFx0Ki9cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF9zb2NrZXRfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfc29ja2V0X3Rlc3QuY1xuaW5kZXggNDIyNzI4ZjYzMmNhNi4uZWM3M2JiNjkwYmJjYiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3NvY2tldF90ZXN0LmNcbkBAIC01OTIsNiArNTkyLDE4MSBAQCBURVNUX0YoY29yZWR1bXAsIHNvY2tldF9jb3JlZHVtcF9zaWduYWxfc2lnc2VndilcbiBcdHdhaXRfYW5kX2NoZWNrX2NvcmVkdW1wX3NlcnZlcihwaWRfY29yZWR1bXBfc2VydmVyLCBfbWV0YWRhdGEsIHNlbGYpO1xuIH1cbiBcbitzdGF0aWMgYm9vbCBjaGVja19jb3JlZHVtcF9pbmZvKGNvbnN0IHN0cnVjdCBwaWRmZF9pbmZvICppbmZvLCBjb25zdCBjaGFyICp3aGF0KVxuK3tcbitcdGlmICghKGluZm8tXHUwMDNlbWFzayBcdTAwMjYgUElERkRfSU5GT19DT1JFRFVNUCkpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiJXM6IFBJREZEX0lORk9fQ09SRURVTVAgbm90IHNldCBpbiBtYXNrXFxuXCIsIHdoYXQpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAoIShpbmZvLVx1MDAzZWNvcmVkdW1wX21hc2sgXHUwMDI2IFBJREZEX0NPUkVEVU1QRUQpKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBQSURGRF9DT1JFRFVNUEVEIG5vdCBzZXQgaW4gY29yZWR1bXBfbWFza1xcblwiLCB3aGF0KTtcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1x0fVxuK1xuK1x0aWYgKCEoaW5mby1cdTAwM2VtYXNrIFx1MDAyNiBQSURGRF9JTkZPX0NPUkVEVU1QX1NJR05BTCkgfHwgaW5mby1cdTAwM2Vjb3JlZHVtcF9zaWduYWwgIT0gU0lHU0VHVikge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogY29yZWR1bXBfc2lnbmFsPSVkLCBleHBlY3RlZCBTSUdTRUdWPSVkXFxuXCIsXG4rXHRcdFx0d2hhdCwgaW5mby1cdTAwM2Vjb3JlZHVtcF9zaWduYWwsIFNJR1NFR1YpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRpZiAoIShpbmZvLVx1MDAzZW1hc2sgXHUwMDI2IFBJREZEX0lORk9fQ09SRURVTVBfQ09ERSkgfHwgaW5mby1cdTAwM2Vjb3JlZHVtcF9jb2RlICE9IFNFR1ZfTUFQRVJSKSB7XG4rXHRcdGZwcmludGYoc3RkZXJyLCBcIiVzOiBjb3JlZHVtcF9jb2RlPSVkLCBleHBlY3RlZCBTRUdWX01BUEVSUj0lZFxcblwiLFxuK1x0XHRcdHdoYXQsIGluZm8tXHUwMDNlY29yZWR1bXBfY29kZSwgU0VHVl9NQVBFUlIpO1xuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHR9XG4rXG4rXHRyZXR1cm4gdHJ1ZTtcbit9XG4rXG4rLypcbisgKiBUZXN0OiBQSURGRF9JTkZPX0NPUkVEVU1QIG9uIHRoZSBkdW1waW5nIHRocmVhZCdzIHBpZGZkXG4rICpcbisgKiBDcmFzaCBmcm9tIGEgbm9uLWxlYWRlciB0aHJlYWQgYW5kIHZlcmlmeSB0aGF0IHRoZSBwaWRmZCBmcm9tXG4rICogU09fUEVFUlBJREZEX1RIUkVBRCByZWZlcnMgdG8gdGhhdCB0aHJlYWQgYW5kIHJlcG9ydHMgdGhlIGNvcmVkdW1wXG4rICogbGlrZSB0aGUgdGhyZWFkLWdyb3VwIGxlYWRlcidzIHBpZGZkIGZyb20gU09fUEVFUlBJREZEIGRvZXMuXG4rICovXG4rVEVTVF9GKGNvcmVkdW1wLCBzb2NrZXRfY29yZWR1bXBfdGhyZWFkKVxuK3tcbitcdGludCBwaWRmZCwgcmV0LCBzdGF0dXM7XG4rXHRwaWRfdCBwaWQsIHBpZF9jb3JlZHVtcF9zZXJ2ZXI7XG4rXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvID0ge307XG4rXHRpbnQgaXBjX3NvY2tldHNbMl07XG4rXHRjaGFyIGM7XG4rXG4rXHRBU1NFUlRfVFJVRShzZXRfY29yZV9wYXR0ZXJuKFwiQC90bXAvY29yZWR1bXAuc29ja2V0XCIpKTtcbitcbitcdHJldCA9IHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0gfCBTT0NLX0NMT0VYRUMsIDAsIGlwY19zb2NrZXRzKTtcbitcdEFTU0VSVF9FUShyZXQsIDApO1xuK1xuK1x0cGlkX2NvcmVkdW1wX3NlcnZlciA9IGZvcmsoKTtcbitcdEFTU0VSVF9HRShwaWRfY29yZWR1bXBfc2VydmVyLCAwKTtcbitcdGlmIChwaWRfY29yZWR1bXBfc2VydmVyID09IDApIHtcbitcdFx0aW50IGZkX3NlcnZlciA9IC0xLCBmZF9jb3JlZHVtcCA9IC0xLCBmZF9wZWVyX3BpZGZkID0gLTE7XG4rXHRcdGludCBmZF90aHJlYWRfcGlkZmQgPSAtMSwgZmRfY29yZV9maWxlID0gLTE7XG4rXHRcdHN0cnVjdCBwaWRmZF9pbmZvIHRocmVhZF9pbmZvID0ge307XG4rXHRcdGludCBleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7XG4rXG4rXHRcdGNsb3NlKGlwY19zb2NrZXRzWzBdKTtcbitcbitcdFx0ZmRfc2VydmVyID0gY3JlYXRlX2FuZF9saXN0ZW5fdW5peF9zb2NrZXQoXCIvdG1wL2NvcmVkdW1wLnNvY2tldFwiKTtcbitcdFx0aWYgKGZkX3NlcnZlciBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGxpc3RlbiBzb2NrZXQgZmFpbGVkOiAlbVxcblwiKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRpZiAod3JpdGVfbm9pbnRyKGlwY19zb2NrZXRzWzFdLCBcIjFcIiwgMSkgXHUwMDNjIDApIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBpcGMgd3JpdGUgZmFpbGVkOiAlbVxcblwiKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRjbG9zZShpcGNfc29ja2V0c1sxXSk7XG4rXG4rXHRcdGZkX2NvcmVkdW1wID0gYWNjZXB0NChmZF9zZXJ2ZXIsIE5VTEwsIE5VTEwsIFNPQ0tfQ0xPRVhFQyk7XG4rXHRcdGlmIChmZF9jb3JlZHVtcCBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGFjY2VwdDQgZmFpbGVkOiAlbVxcblwiKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRmZF9wZWVyX3BpZGZkID0gZ2V0X3BlZXJfcGlkZmQoZmRfY29yZWR1bXApO1xuK1x0XHRpZiAoZmRfcGVlcl9waWRmZCBcdTAwM2MgMCkge1xuK1x0XHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGdldF9wZWVyX3BpZGZkIGZhaWxlZFxcblwiKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRmZF90aHJlYWRfcGlkZmQgPSBnZXRfcGVlcl9waWRmZF90aHJlYWQoZmRfY29yZWR1bXApO1xuK1x0XHRpZiAoZmRfdGhyZWFkX3BpZGZkIFx1MDAzYyAwKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogZ2V0X3BlZXJfcGlkZmRfdGhyZWFkIGZhaWxlZFxcblwiKTtcbitcdFx0XHRnb3RvIG91dDtcbitcdFx0fVxuK1xuK1x0XHRpZiAoIWdldF9waWRmZF9pbmZvKGZkX3BlZXJfcGlkZmQsIFx1MDAyNmluZm8pIHx8XG4rXHRcdCAgICAhZ2V0X3BpZGZkX2luZm8oZmRfdGhyZWFkX3BpZGZkLCBcdTAwMjZ0aHJlYWRfaW5mbykpIHtcbitcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBnZXRfcGlkZmRfaW5mbyBmYWlsZWRcXG5cIik7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0LyogVGhlIHBlZXIgaXMgdGhlIHRocmVhZC1ncm91cCBsZWFkZXIsIHRoZSBkdW1waW5nIHRocmVhZCBpcyBub3QuICovXG4rXHRcdGlmIChpbmZvLnBpZCAhPSBpbmZvLnRnaWQgfHwgdGhyZWFkX2luZm8udGdpZCAhPSBpbmZvLnRnaWQgfHxcbitcdFx0ICAgIHRocmVhZF9pbmZvLnBpZCA9PSB0aHJlYWRfaW5mby50Z2lkKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogdW5leHBlY3RlZCBpZHMgJWQvJWQgYW5kICVkLyVkXFxuXCIsXG4rXHRcdFx0XHRpbmZvLnBpZCwgaW5mby50Z2lkLCB0aHJlYWRfaW5mby5waWQsIHRocmVhZF9pbmZvLnRnaWQpO1xuK1x0XHRcdGdvdG8gb3V0O1xuK1x0XHR9XG4rXG4rXHRcdGlmICghY2hlY2tfY29yZWR1bXBfaW5mbyhcdTAwMjZpbmZvLCBcIlNPX1BFRVJQSURGRFwiKSB8fFxuK1x0XHQgICAgIWNoZWNrX2NvcmVkdW1wX2luZm8oXHUwMDI2dGhyZWFkX2luZm8sIFwiU09fUEVFUlBJREZEX1RIUkVBRFwiKSlcbitcdFx0XHRnb3RvIG91dDtcbitcbitcdFx0ZmRfY29yZV9maWxlID0gb3Blbl9jb3JlZHVtcF90bXBmaWxlKHNlbGYtXHUwMDNlZmRfdG1wZnNfZGV0YWNoZWQpO1xuK1x0XHRpZiAoZmRfY29yZV9maWxlIFx1MDAzYyAwKSB7XG4rXHRcdFx0ZnByaW50ZihzdGRlcnIsIFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogY29yZSB0bXBmaWxlIGZhaWxlZDogJW1cXG5cIik7XG4rXHRcdFx0Z290byBvdXQ7XG4rXHRcdH1cbitcbitcdFx0Zm9yICg7Oykge1xuK1x0XHRcdGNoYXIgYnVmZmVyWzQwOTZdO1xuK1x0XHRcdHNzaXplX3QgYnl0ZXNfcmVhZCwgYnl0ZXNfd3JpdGU7XG4rXG4rXHRcdFx0Ynl0ZXNfcmVhZCA9IHJlYWQoZmRfY29yZWR1bXAsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpO1xuK1x0XHRcdGlmIChieXRlc19yZWFkIFx1MDAzYyAwKSB7XG4rXHRcdFx0XHRmcHJpbnRmKHN0ZGVyciwgXCJzb2NrZXRfY29yZWR1bXBfdGhyZWFkOiBjb3JlIHJlYWQgZmFpbGVkOiAlbVxcblwiKTtcbitcdFx0XHRcdGdvdG8gb3V0O1xuK1x0XHRcdH1cbitcbitcdFx0XHRpZiAoYnl0ZXNfcmVhZCA9PSAwKVxuK1x0XHRcdFx0YnJlYWs7XG4rXG4rXHRcdFx0Ynl0ZXNfd3JpdGUgPSB3cml0ZShmZF9jb3JlX2ZpbGUsIGJ1ZmZlciwgYnl0ZXNfcmVhZCk7XG4rXHRcdFx0aWYgKGJ5dGVzX3JlYWQgIT0gYnl0ZXNfd3JpdGUpIHtcbitcdFx0XHRcdGZwcmludGYoc3RkZXJyLCBcInNvY2tldF9jb3JlZHVtcF90aHJlYWQ6IGNvcmUgd3JpdGUgJXpkLyV6ZDogJW1cXG5cIixcbitcdFx0XHRcdFx0Ynl0ZXNfcmVhZCwgYnl0ZXNfd3JpdGUpO1xuK1x0XHRcdFx0Z290byBvdXQ7XG4rXHRcdFx0fVxuK1x0XHR9XG4rXG4rXHRcdGV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUztcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwic29ja2V0X2NvcmVkdW1wX3RocmVhZDogY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxcblwiKTtcbitvdXQ6XG4rXHRcdGlmIChmZF9jb3JlX2ZpbGUgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkX2NvcmVfZmlsZSk7XG4rXHRcdGlmIChmZF90aHJlYWRfcGlkZmQgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkX3RocmVhZF9waWRmZCk7XG4rXHRcdGlmIChmZF9wZWVyX3BpZGZkIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9wZWVyX3BpZGZkKTtcbitcdFx0aWYgKGZkX2NvcmVkdW1wIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZF9jb3JlZHVtcCk7XG4rXHRcdGlmIChmZF9zZXJ2ZXIgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkX3NlcnZlcik7XG4rXHRcdF9leGl0KGV4aXRfY29kZSk7XG4rXHR9XG4rXHRzZWxmLVx1MDAzZXBpZF9jb3JlZHVtcF9zZXJ2ZXIgPSBwaWRfY29yZWR1bXBfc2VydmVyO1xuK1xuK1x0RVhQRUNUX0VRKGNsb3NlKGlwY19zb2NrZXRzWzFdKSwgMCk7XG4rXHRBU1NFUlRfRVEocmVhZF9ub2ludHIoaXBjX3NvY2tldHNbMF0sIFx1MDAyNmMsIDEpLCAxKTtcbitcdEVYUEVDVF9FUShjbG9zZShpcGNfc29ja2V0c1swXSksIDApO1xuK1xuK1x0cGlkID0gZm9yaygpO1xuK1x0QVNTRVJUX0dFKHBpZCwgMCk7XG4rXHRpZiAocGlkID09IDApXG4rXHRcdGNyYXNoaW5nX2NoaWxkX3RocmVhZCgpO1xuK1xuK1x0cGlkZmQgPSBzeXNfcGlkZmRfb3BlbihwaWQsIDApO1xuK1x0QVNTRVJUX0dFKHBpZGZkLCAwKTtcbitcbitcdHdhaXRwaWQocGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuK1x0QVNTRVJUX1RSVUUoV0lGU0lHTkFMRUQoc3RhdHVzKSk7XG4rXHRBU1NFUlRfRVEoV1RFUk1TSUcoc3RhdHVzKSwgU0lHU0VHVik7XG4rXHRBU1NFUlRfVFJVRShXQ09SRURVTVAoc3RhdHVzKSk7XG4rXG4rXHRBU1NFUlRfVFJVRShnZXRfcGlkZmRfaW5mbyhwaWRmZCwgXHUwMDI2aW5mbykpO1xuK1x0QVNTRVJUX1RSVUUoISEoaW5mby5tYXNrIFx1MDAyNiBQSURGRF9JTkZPX0NPUkVEVU1QKSk7XG4rXHRBU1NFUlRfVFJVRSghIShpbmZvLmNvcmVkdW1wX21hc2sgXHUwMDI2IFBJREZEX0NPUkVEVU1QRUQpKTtcbitcdEFTU0VSVF9FUShpbmZvLmNvcmVkdW1wX3NpZ25hbCwgU0lHU0VHVik7XG4rXG4rXHR3YWl0X2FuZF9jaGVja19jb3JlZHVtcF9zZXJ2ZXIocGlkX2NvcmVkdW1wX3NlcnZlciwgX21ldGFkYXRhLCBzZWxmKTtcbit9XG4rXG4gLypcbiAgKiBUZXN0OiBQSURGRF9JTkZPX0NPUkVEVU1QX1NJR05BTCB2aWEgc2ltcGxlIHNvY2tldCBjb3JlZHVtcCB3aXRoIFNJR0FCUlRcbiAgKlxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxuaW5kZXggZWQ0N2YwMWZhNTNjNS4uNDIxMjY1NmUzMWYwMSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3QuaFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdC5oXG5AQCAtMjcsMTAgKzI3LDEyIEBAIEZJWFRVUkUoY29yZWR1bXApXG4gLyogU2hhcmVkIGhlbHBlciBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi9cbiB2b2lkICpkb19ub3RoaW5nKHZvaWQgKmFyZyk7XG4gdm9pZCBjcmFzaGluZ19jaGlsZCh2b2lkKTtcbit2b2lkIGNyYXNoaW5nX2NoaWxkX3RocmVhZCh2b2lkKTtcbiBpbnQgY3JlYXRlX2RldGFjaGVkX3RtcGZzKHZvaWQpO1xuIGludCBjcmVhdGVfYW5kX2xpc3Rlbl91bml4X3NvY2tldChjb25zdCBjaGFyICpwYXRoKTtcbiBib29sIHNldF9jb3JlX3BhdHRlcm4oY29uc3QgY2hhciAqcGF0dGVybik7XG4gaW50IGdldF9wZWVyX3BpZGZkKGludCBmZCk7XG4raW50IGdldF9wZWVyX3BpZGZkX3RocmVhZChpbnQgZmQpO1xuIGJvb2wgZ2V0X3BpZGZkX2luZm8oaW50IGZkX3BlZXJfcGlkZmQsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKTtcbiBcbiAvKiBJbmxpbmUgaGVscGVyIHRoYXQgdXNlcyBoYXJuZXNzIHR5cGVzICovXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY29yZWR1bXAvY29yZWR1bXBfdGVzdF9oZWxwZXJzLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuaW5kZXggMmEyMGZhZjljYjBhZC4uMzYzMDYwNjlmNjJlNSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NvcmVkdW1wL2NvcmVkdW1wX3Rlc3RfaGVscGVycy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jb3JlZHVtcC9jb3JlZHVtcF90ZXN0X2hlbHBlcnMuY1xuQEAgLTEzLDYgKzEzLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy9lcG9sbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL2lvY3RsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3NvY2tldC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3R5cGVzLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NzeXMvdW4uaFx1MDAzZVxuQEAgLTM4LDYgKzM5LDEwIEBAIHN0cnVjdCBfZml4dHVyZV9jb3JlZHVtcF9kYXRhIHtcbiBcbiAjZGVmaW5lIE5VTV9USFJFQURfU1BBV04gMTI4XG4gXG4rI2lmbmRlZiBTT19QRUVSUElERkRfVEhSRUFEXG4rI2RlZmluZSBTT19QRUVSUElERkRfVEhSRUFEIDg3XG4rI2VuZGlmXG4rXG4gdm9pZCAqZG9fbm90aGluZyh2b2lkICphcmcpXG4ge1xuIFx0KHZvaWQpYXJnO1xuQEAgLTU5LDYgKzY0LDM2IEBAIHZvaWQgY3Jhc2hpbmdfY2hpbGQodm9pZClcbiBcdGkgPSAqKHZvbGF0aWxlIGludCAqKU5VTEw7XG4gfVxuIFxuK3N0YXRpYyB2b2lkICpjcmFzaGluZ190aHJlYWQodm9pZCAqYXJnKVxuK3tcbitcdGludCAqcDtcbitcbitcdCh2b2lkKWFyZztcbitcbitcdC8qIGNyYXNoIG9uIHB1cnBvc2Ugd2l0aCBTRUdWX01BUEVSUiAqL1xuK1x0cCA9IG1tYXAoTlVMTCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLFxuK1x0XHQgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTllNT1VTLCAtMSwgMCk7XG4rXHRpZiAocCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdG11bm1hcChwLCBQQUdFX1NJWkUpO1xuK1x0KnAgPSAwO1xuK1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3ZvaWQgY3Jhc2hpbmdfY2hpbGRfdGhyZWFkKHZvaWQpXG4re1xuK1x0cHRocmVhZF90IHRocmVhZDtcbitcdGludCBpO1xuK1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgTlVNX1RIUkVBRF9TUEFXTjsgKytpKVxuK1x0XHRwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIGRvX25vdGhpbmcsIE5VTEwpO1xuK1xuK1x0LyogY3Jhc2ggZnJvbSBhIG5vbi1sZWFkZXIgdGhyZWFkICovXG4rXHRwdGhyZWFkX2NyZWF0ZShcdTAwMjZ0aHJlYWQsIE5VTEwsIGNyYXNoaW5nX3RocmVhZCwgTlVMTCk7XG4rXHRwYXVzZSgpO1xuK31cbitcbiBpbnQgY3JlYXRlX2RldGFjaGVkX3RtcGZzKHZvaWQpXG4ge1xuIFx0aW50IGZkX2NvbnRleHQsIGZkX3RtcGZzO1xuQEAgLTEzOCw2ICsxNzMsMjAgQEAgaW50IGdldF9wZWVyX3BpZGZkKGludCBmZClcbiBcdHJldHVybiBmZF9wZWVyX3BpZGZkO1xuIH1cbiBcbitpbnQgZ2V0X3BlZXJfcGlkZmRfdGhyZWFkKGludCBmZClcbit7XG4rXHRpbnQgZmRfcGVlcl9waWRmZDtcbitcdHNvY2tsZW5fdCBmZF9wZWVyX3BpZGZkX2xlbiA9IHNpemVvZihmZF9wZWVyX3BpZGZkKTtcbitcdGludCByZXQgPSBnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19QRUVSUElERkRfVEhSRUFELCBcdTAwMjZmZF9wZWVyX3BpZGZkLFxuK1x0XHRcdCAgICAgXHUwMDI2ZmRfcGVlcl9waWRmZF9sZW4pO1xuK1x0aWYgKHJldCBcdTAwM2MgMCkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCIlczogZ2V0c29ja29wdChTT19QRUVSUElERkRfVEhSRUFEKSBmYWlsZWQ6ICVtXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1x0ZnByaW50ZihzdGRlcnIsIFwiJXM6IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQgcGlkZmQgJWRcXG5cIiwgX19mdW5jX18sIGZkX3BlZXJfcGlkZmQpO1xuK1x0cmV0dXJuIGZkX3BlZXJfcGlkZmQ7XG4rfVxuK1xuIGJvb2wgZ2V0X3BpZGZkX2luZm8oaW50IGZkX3BlZXJfcGlkZmQsIHN0cnVjdCBwaWRmZF9pbmZvICppbmZvKVxuIHtcbiBcdGludCByZXQ7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9NYWtlZmlsZVxuaW5kZXggYTY2ZjEwZmIwYzIzMS4uNDViODQxNzU4ZjFiZiAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9NYWtlZmlsZVxuQEAgLTIzLDYgKzIzLDggQEAgVEVTVF9HRU5fRklMRVMgOj0gc2NtX3JpZ2h0c19kZW5pYWxfbHNtLmJwZi5vXG4gaW5jbHVkZSAuLi8uLi9saWIubWtcbiBpbmNsdWRlIC4uL2JwZi5ta1xuIFxuKyQoT1VUUFVUKS9zY21fcGlkZmQ6IENGTEFHUyArPSAtcHRocmVhZFxuK1xuICQoT1VUUFVUKS9zY21fcmlnaHRzX2RlbmlhbF9sc206ICQoQlBGT0JKKVxuICQoT1VUUFVUKS9zY21fcmlnaHRzX2RlbmlhbF9sc206IENGTEFHUyArPSAtSSQoU0NSQVRDSF9ESVIpL2luY2x1ZGVcbiAkKE9VVFBVVCkvc2NtX3JpZ2h0c19kZW5pYWxfbHNtOiBMRExJQlMgKz0gLWxlbGYgLWx6XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L2FmX3VuaXgvc2NtX3BpZGZkLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9zY21fcGlkZmQuY1xuaW5kZXggMmMxOGI5MmEyNjAzNS4uYmJiZDVlN2I0ZmE3OCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9hZl91bml4L3NjbV9waWRmZC5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvYWZfdW5peC9zY21fcGlkZmQuY1xuQEAgLTEwLDYgKzEwLDcgQEBcbiAjaW5jbHVkZSBcdTAwM2N1bmlzdGQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N0cmluZy5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjZXJybm8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3B0aHJlYWQuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY3N5cy91bi5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3NpZ25hbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjc3lzL3R5cGVzLmhcdTAwM2VcbkBAIC0yNyw2ICsyOCwxNCBAQFxuICNkZWZpbmUgU0NNX1BJREZEIDB4MDRcbiAjZW5kaWZcbiBcbisjaWZuZGVmIFNPX1BBU1NQSURGRF9USFJFQURcbisjZGVmaW5lIFNPX1BBU1NQSURGRF9USFJFQUQgODZcbisjZW5kaWZcbitcbisjaWZuZGVmIFNPX1BFRVJQSURGRF9USFJFQURcbisjZGVmaW5lIFNPX1BFRVJQSURGRF9USFJFQUQgODdcbisjZW5kaWZcbitcbiAjZGVmaW5lIENISUxEX0VYSVRfQ09ERV9PSyAxMjNcbiBcbiBzdGF0aWMgdm9pZCBjaGlsZF9kaWUoKVxuQEAgLTU1Myw0ICs1NjIsMzYxIEBAIFRFU1RfRihzY21fcGlkZmQsIHRlc3QpXG4gXHRjbG9zZShwZmQpO1xuIH1cbiBcbitzdHJ1Y3QgdGhyZWFkX2lkcyB7XG4rXHRwaWRfdCBwaWQ7XG4rXHRwaWRfdCB0aWQ7XG4rfTtcbitcbitzdGF0aWMgdm9pZCAqc2VuZF9pZHNfdGhyZWFkKHZvaWQgKmFyZylcbit7XG4rXHRpbnQgZmQgPSAqKGludCAqKWFyZztcbitcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcyA9IHtcbitcdFx0LnBpZCA9IGdldHBpZCgpLFxuK1x0XHQudGlkID0gZ2V0dGlkKCksXG4rXHR9O1xuK1x0Y2hhciBzeW5jO1xuK1xuK1x0aWYgKHNlbmQoZmQsIFx1MDAyNmlkcywgc2l6ZW9mKGlkcyksIDApICE9IHNpemVvZihpZHMpKVxuK1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuK1xuK1x0Lyogc3RheSBhbGl2ZSB1bnRpbCB0aGUgcmVjZWl2ZXIgaGFzIGxvb2tlZCBhdCBvdXIgcGlkZmQgKi9cbitcdGlmIChyZWFkKGZkLCBcdTAwMjZzeW5jLCAxKSAhPSAxKVxuK1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuK1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkICpzZW5kX2lkc19jcmVkc190aHJlYWQodm9pZCAqYXJnKVxuK3tcbitcdGludCBmZCA9ICooaW50ICopYXJnO1xuK1x0c3RydWN0IHRocmVhZF9pZHMgaWRzID0ge1xuK1x0XHQucGlkID0gZ2V0cGlkKCksXG4rXHRcdC50aWQgPSBnZXR0aWQoKSxcbitcdH07XG4rXHRzdHJ1Y3QgdWNyZWQgdWNyZWQgPSB7XG4rXHRcdC5waWQgPSBnZXRwaWQoKSxcbitcdFx0LnVpZCA9IGdldHVpZCgpLFxuK1x0XHQuZ2lkID0gZ2V0Z2lkKCksXG4rXHR9O1xuK1x0Y2hhciBjb250cm9sW0NNU0dfU1BBQ0Uoc2l6ZW9mKHVjcmVkKSldID0geyAwIH07XG4rXHRzdHJ1Y3QgaW92ZWMgaW92O1xuK1x0c3RydWN0IG1zZ2hkciBtc2cgPSB7IDAgfTtcbitcdHN0cnVjdCBjbXNnaGRyICpjbXNnO1xuK1x0Y2hhciBzeW5jO1xuK1xuK1x0aW92Lmlvdl9iYXNlID0gXHUwMDI2aWRzO1xuK1x0aW92Lmlvdl9sZW4gPSBzaXplb2YoaWRzKTtcbitcbitcdG1zZy5tc2dfaW92ID0gXHUwMDI2aW92O1xuK1x0bXNnLm1zZ19pb3ZsZW4gPSAxO1xuK1x0bXNnLm1zZ19jb250cm9sID0gY29udHJvbDtcbitcdG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjb250cm9sKTtcbitcbitcdGNtc2cgPSBDTVNHX0ZJUlNUSERSKFx1MDAyNm1zZyk7XG4rXHRjbXNnLVx1MDAzZWNtc2dfbGV2ZWwgPSBTT0xfU09DS0VUO1xuK1x0Y21zZy1cdTAwM2VjbXNnX3R5cGUgPSBTQ01fQ1JFREVOVElBTFM7XG4rXHRjbXNnLVx1MDAzZWNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHVjcmVkKSk7XG4rXHRtZW1jcHkoQ01TR19EQVRBKGNtc2cpLCBcdTAwMjZ1Y3JlZCwgc2l6ZW9mKHVjcmVkKSk7XG4rXG4rXHRpZiAoc2VuZG1zZyhmZCwgXHUwMDI2bXNnLCAwKSAhPSBzaXplb2YoaWRzKSlcbitcdFx0cmV0dXJuICh2b2lkICopMTtcbitcbitcdGlmIChyZWFkKGZkLCBcdTAwMjZzeW5jLCAxKSAhPSAxKVxuK1x0XHRyZXR1cm4gKHZvaWQgKikxO1xuK1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHRocmVhZF9jbGllbnQoaW50IGZkLCBpbnQgc3luY2ZkLCB2b2lkICooKnNlbmRlcikodm9pZCAqKSlcbit7XG4rXHRwdGhyZWFkX3QgdGhyZWFkO1xuK1x0dm9pZCAqcmV0O1xuK1x0Y2hhciBzeW5jO1xuK1xuK1x0Lyogd2FpdCB1bnRpbCB0aGUgcmVjZWl2ZXIgZW5hYmxlZCBTT19QQVNTUElERkQgKi9cbitcdGlmIChyZWFkKHN5bmNmZCwgXHUwMDI2c3luYywgMSkgIT0gMSlcbitcdFx0Y2hpbGRfZGllKCk7XG4rXG4rXHRpZiAocHRocmVhZF9jcmVhdGUoXHUwMDI2dGhyZWFkLCBOVUxMLCBzZW5kZXIsIFx1MDAyNmZkKSlcbitcdFx0Y2hpbGRfZGllKCk7XG4rXG4rXHRpZiAocHRocmVhZF9qb2luKHRocmVhZCwgXHUwMDI2cmV0KSB8fCByZXQpXG4rXHRcdGNoaWxkX2RpZSgpO1xuK1xuK1x0ZXhpdCgwKTtcbit9XG4rXG4rc3RhdGljIGludCByZWN2X3BpZGZkKGludCBmZCwgc3RydWN0IHRocmVhZF9pZHMgKmlkcylcbit7XG4rXHRjaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YoaW50KSldID0geyAwIH07XG4rXHRzdHJ1Y3QgaW92ZWMgaW92O1xuK1x0c3RydWN0IG1zZ2hkciBtc2cgPSB7IDAgfTtcbitcdHN0cnVjdCBjbXNnaGRyICpjbXNnO1xuK1x0aW50IHBpZGZkID0gLTE7XG4rXG4rXHRpb3YuaW92X2Jhc2UgPSBpZHM7XG4rXHRpb3YuaW92X2xlbiA9IHNpemVvZigqaWRzKTtcbitcbitcdG1zZy5tc2dfaW92ID0gXHUwMDI2aW92O1xuK1x0bXNnLm1zZ19pb3ZsZW4gPSAxO1xuK1x0bXNnLm1zZ19jb250cm9sID0gY29udHJvbDtcbitcdG1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjb250cm9sKTtcbitcbitcdGlmIChyZWN2bXNnKGZkLCBcdTAwMjZtc2csIDApICE9IHNpemVvZigqaWRzKSkge1xuK1x0XHRsb2dfZXJyKFwicmVjdm1zZ1wiKTtcbitcdFx0cmV0dXJuIC0xO1xuK1x0fVxuK1xuK1x0aWYgKG1zZy5tc2dfZmxhZ3MgXHUwMDI2IChNU0dfVFJVTkMgfCBNU0dfQ1RSVU5DKSkge1xuK1x0XHRsb2dfZXJyKFwicmVjdm1zZzogdHJ1bmNhdGVkXCIpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKFx1MDAyNm1zZyk7IGNtc2cgIT0gTlVMTDtcbitcdCAgICAgY21zZyA9IENNU0dfTlhUSERSKFx1MDAyNm1zZywgY21zZykpIHtcbitcdFx0aWYgKGNtc2ctXHUwMDNlY21zZ19sZXZlbCA9PSBTT0xfU09DS0VUIFx1MDAyNlx1MDAyNlxuK1x0XHQgICAgY21zZy1cdTAwM2VjbXNnX3R5cGUgPT0gU0NNX1BJREZEKVxuK1x0XHRcdG1lbWNweShcdTAwMjZwaWRmZCwgQ01TR19EQVRBKGNtc2cpLCBzaXplb2YocGlkZmQpKTtcbitcdH1cbitcbitcdHJldHVybiBwaWRmZDtcbit9XG4rXG4rc3RhdGljIGludCB0aHJlYWRfcGlkZmRfZmxvdyh2b2lkICooKnNlbmRlcikodm9pZCAqKSwgaW50IG9wdG5hbWUsXG4rXHRcdFx0ICAgICBzdHJ1Y3QgdGhyZWFkX2lkcyAqaWRzLCBzdHJ1Y3QgcGlkZmRfaW5mbyAqaW5mbylcbit7XG4rXHRpbnQgc2tbMl07XG4rXHRpbnQgc3luY3BpcGVbMl07XG4rXHRpbnQgcGlkZmQ7XG4rXHRpbnQgY2hpbGRfc3RhdHVzID0gMDtcbitcdHBpZF90IGNoaWxkO1xuK1xuK1x0aWYgKHNvY2tldHBhaXIoQUZfVU5JWCwgU09DS19TVFJFQU0sIDAsIHNrKSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0aWYgKHBpcGUoc3luY3BpcGUpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjaGlsZCA9IGZvcmsoKTtcbitcdGlmIChjaGlsZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0aWYgKGNoaWxkID09IDApIHtcbitcdFx0Y2xvc2Uoc2tbMF0pO1xuK1x0XHRjbG9zZShzeW5jcGlwZVsxXSk7XG4rXHRcdHRocmVhZF9jbGllbnQoc2tbMV0sIHN5bmNwaXBlWzBdLCBzZW5kZXIpO1xuK1x0fVxuK1x0Y2xvc2Uoc2tbMV0pO1xuK1x0Y2xvc2Uoc3luY3BpcGVbMF0pO1xuK1xuK1x0aW50IG9uID0gMTtcbitcbitcdGlmIChzZXRzb2Nrb3B0KHNrWzBdLCBTT0xfU09DS0VULCBvcHRuYW1lLCBcdTAwMjZvbiwgc2l6ZW9mKG9uKSkpIHtcbitcdFx0bG9nX2VycihcIkZhaWxlZCB0byBzZXQgcGlkZmQgcGFzc2luZyBvcHRpb25cIik7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdGlmICh3cml0ZShzeW5jcGlwZVsxXSwgXCIxXCIsIDEpICE9IDEpXG4rXHRcdHJldHVybiAtMTtcbitcdGNsb3NlKHN5bmNwaXBlWzFdKTtcbitcbitcdHBpZGZkID0gcmVjdl9waWRmZChza1swXSwgaWRzKTtcbitcdGlmIChwaWRmZCBcdTAwM2MgMClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0aW5mby1cdTAwM2VtYXNrID0gUElERkRfSU5GT19QSUQ7XG4rXHRpZiAoaW9jdGwocGlkZmQsIFBJREZEX0dFVF9JTkZPLCBpbmZvKSkge1xuK1x0XHRsb2dfZXJyKFwiaW9jdGwoUElERkRfR0VUX0lORk8pXCIpO1xuK1x0XHRjbG9zZShwaWRmZCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcdGNsb3NlKHBpZGZkKTtcbitcbitcdC8qIHJlbGVhc2UgdGhlIHNlbmRpbmcgdGhyZWFkICovXG4rXHRpZiAod3JpdGUoc2tbMF0sIFwieFwiLCAxKSAhPSAxKVxuK1x0XHRyZXR1cm4gLTE7XG4rXHRjbG9zZShza1swXSk7XG4rXG4rXHR3YWl0cGlkKGNoaWxkLCBcdTAwMjZjaGlsZF9zdGF0dXMsIDApO1xuK1x0aWYgKCFXSUZFWElURUQoY2hpbGRfc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhjaGlsZF9zdGF0dXMpKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGludCBzb2Nrb3B0X3NldChpbnQgZmQsIGludCBvcHRuYW1lLCBpbnQgdmFsKVxuK3tcbitcdHJldHVybiBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBvcHRuYW1lLCBcdTAwMjZ2YWwsIHNpemVvZih2YWwpKTtcbit9XG4rXG4rc3RhdGljIGludCBzb2Nrb3B0X2dldChpbnQgZmQsIGludCBvcHRuYW1lKVxuK3tcbitcdHNvY2tsZW5fdCBsZW4gPSBzaXplb2YoaW50KTtcbitcdGludCB2YWwgPSAtMTtcbitcbitcdGlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBvcHRuYW1lLCBcdTAwMjZ2YWwsIFx1MDAyNmxlbikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHJldHVybiB2YWw7XG4rfVxuK1xuK1RFU1Qoc2NtX3BpZGZkX3NldHNvY2tvcHRfdmFsdWVzKVxuK3tcbitcdGludCBza1syXTtcbitcbitcdEFTU0VSVF9FUSgwLCBzb2NrZXRwYWlyKEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBzaykpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFELCAxKSk7XG4rXHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEKSk7XG4rXG4rXHQvKiBUaGUgb3B0aW9uIHNldCBsYXN0IHdpbnMuICovXG4rXHRBU1NFUlRfRVEoMCwgc29ja29wdF9zZXQoc2tbMF0sIFNPX1BBU1NQSURGRCwgMSkpO1xuK1x0QVNTRVJUX0VRKDEsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkQpKTtcbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFELCAxKSk7XG4rXHRBU1NFUlRfRVEoMSwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRF9USFJFQUQpKTtcbitcdEFTU0VSVF9FUSgwLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEKSk7XG4rXG4rXHQvKiBEaXNhYmxpbmcgb25lIG9wdGlvbiBsZWF2ZXMgdGhlIG90aGVyIGFsb25lLiAqL1xuK1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkQsIDApKTtcbitcdEFTU0VSVF9FUSgxLCBzb2Nrb3B0X2dldChza1swXSwgU09fUEFTU1BJREZEX1RIUkVBRCkpO1xuK1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfc2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFELCAwKSk7XG4rXHRBU1NFUlRfRVEoMCwgc29ja29wdF9nZXQoc2tbMF0sIFNPX1BBU1NQSURGRCkpO1xuK1x0QVNTRVJUX0VRKDAsIHNvY2tvcHRfZ2V0KHNrWzBdLCBTT19QQVNTUElERkRfVEhSRUFEKSk7XG4rXG4rXHRjbG9zZShza1swXSk7XG4rXHRjbG9zZShza1sxXSk7XG4rfVxuK1xuK1RFU1Qoc2NtX3BpZGZkX3RocmVhZClcbit7XG4rXHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7XG4rXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHRocmVhZF9waWRmZF9mbG93KHNlbmRfaWRzX3RocmVhZCwgU09fUEFTU1BJREZEX1RIUkVBRCxcbitcdFx0XHRcdCAgICAgICBcdTAwMjZpZHMsIFx1MDAyNmluZm8pKTtcbitcdEFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTtcbitcdEVYUEVDVF9FUShpZHMudGlkLCBpbmZvLnBpZCk7XG4rXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTtcbit9XG4rXG4rVEVTVChzY21fcGlkZmRfdGhyZWFkX2dyb3VwKVxuK3tcbitcdHN0cnVjdCB0aHJlYWRfaWRzIGlkcztcbitcdHN0cnVjdCBwaWRmZF9pbmZvIGluZm87XG4rXG4rXHRBU1NFUlRfRVEoMCwgdGhyZWFkX3BpZGZkX2Zsb3coc2VuZF9pZHNfdGhyZWFkLCBTT19QQVNTUElERkQsXG4rXHRcdFx0XHQgICAgICAgXHUwMDI2aWRzLCBcdTAwMjZpbmZvKSk7XG4rXHRBU1NFUlRfTkUoaWRzLnBpZCwgaWRzLnRpZCk7XG4rXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby5waWQpO1xuK1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XG4rfVxuK1xuK1RFU1Qoc2NtX3BpZGZkX3RocmVhZF9jcmVkcylcbit7XG4rXHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7XG4rXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHRocmVhZF9waWRmZF9mbG93KHNlbmRfaWRzX2NyZWRzX3RocmVhZCwgU09fUEFTU1BJREZEX1RIUkVBRCxcbitcdFx0XHRcdCAgICAgICBcdTAwMjZpZHMsIFx1MDAyNmluZm8pKTtcbitcdEFTU0VSVF9ORShpZHMucGlkLCBpZHMudGlkKTtcbitcdEVYUEVDVF9FUShpZHMudGlkLCBpbmZvLnBpZCk7XG4rXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTtcbit9XG4rXG4rc3RhdGljIHZvaWQgKnBlZXJfY29ubmVjdF90aHJlYWQodm9pZCAqYXJnKVxuK3tcbitcdHN0cnVjdCBzb2NrX2FkZHIgKnNhID0gYXJnO1xuK1x0c3RydWN0IHRocmVhZF9pZHMgaWRzID0ge1xuK1x0XHQucGlkID0gZ2V0cGlkKCksXG4rXHRcdC50aWQgPSBnZXR0aWQoKSxcbitcdH07XG4rXHRpbnQgZmQ7XG4rXHRjaGFyIHN5bmM7XG4rXG4rXHRmZCA9IHNvY2tldChBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiAodm9pZCAqKTE7XG4rXG4rXHRpZiAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKVx1MDAyNnNhLVx1MDAzZWxpc3Rlbl9hZGRyLCBzYS1cdTAwM2VhZGRybGVuKSlcbitcdFx0cmV0dXJuICh2b2lkICopMTtcbitcbitcdGlmIChzZW5kKGZkLCBcdTAwMjZpZHMsIHNpemVvZihpZHMpLCAwKSAhPSBzaXplb2YoaWRzKSlcbitcdFx0cmV0dXJuICh2b2lkICopMTtcbitcbitcdC8qIHN0YXkgYWxpdmUgdW50aWwgdGhlIHNlcnZlciBoYXMgbG9va2VkIGF0IG91ciBwaWRmZCAqL1xuK1x0aWYgKHJlYWQoZmQsIFx1MDAyNnN5bmMsIDEpICE9IDEpXG4rXHRcdHJldHVybiAodm9pZCAqKTE7XG4rXG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGludCBwZWVyX3BpZGZkX2luZm8oaW50IGZkLCBpbnQgb3B0bmFtZSwgc3RydWN0IHBpZGZkX2luZm8gKmluZm8pXG4re1xuK1x0aW50IHBpZGZkO1xuK1x0c29ja2xlbl90IGxlbiA9IHNpemVvZihwaWRmZCk7XG4rXG4rXHRpZiAoZ2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0bmFtZSwgXHUwMDI2cGlkZmQsIFx1MDAyNmxlbikpIHtcbitcdFx0bG9nX2VycihcImdldHNvY2tvcHQoU09fUEVFUlBJREZEKilcIik7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdGluZm8tXHUwMDNlbWFzayA9IFBJREZEX0lORk9fUElEO1xuK1x0aWYgKGlvY3RsKHBpZGZkLCBQSURGRF9HRVRfSU5GTywgaW5mbykpIHtcbitcdFx0bG9nX2VycihcImlvY3RsKFBJREZEX0dFVF9JTkZPKVwiKTtcbitcdFx0Y2xvc2UocGlkZmQpO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRjbG9zZShwaWRmZCk7XG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rLyogU09fUEVFUlBJREZEX1RIUkVBRCByZXR1cm5zIGEgcGlkZmQgZm9yIHRoZSBwZWVyJ3MgY29ubmVjdGluZyB0aHJlYWQuICovXG4rVEVTVChzb19wZWVycGlkZmRfdGhyZWFkKVxuK3tcbitcdHN0cnVjdCBzb2NrX2FkZHIgc2E7XG4rXHRzdHJ1Y3QgdGhyZWFkX2lkcyBpZHM7XG4rXHRzdHJ1Y3QgcGlkZmRfaW5mbyBpbmZvO1xuK1x0cHRocmVhZF90IHRocmVhZDtcbitcdHZvaWQgKnRyZXQ7XG4rXHRpbnQgc2VydmVyLCBjZmQ7XG4rXG4rXHRzZXJ2ZXIgPSBzb2NrZXQoQUZfVU5JWCwgU09DS19TVFJFQU0sIDApO1xuK1x0QVNTRVJUX0xFKDAsIHNlcnZlcik7XG4rXG4rXHRmaWxsX3NvY2thZGRyKFx1MDAyNnNhLCB0cnVlKTtcbitcdEFTU0VSVF9FUSgwLCBiaW5kKHNlcnZlciwgKHN0cnVjdCBzb2NrYWRkciAqKVx1MDAyNnNhLmxpc3Rlbl9hZGRyLCBzYS5hZGRybGVuKSk7XG4rXHRBU1NFUlRfRVEoMCwgbGlzdGVuKHNlcnZlciwgMSkpO1xuK1xuK1x0QVNTRVJUX0VRKDAsIHB0aHJlYWRfY3JlYXRlKFx1MDAyNnRocmVhZCwgTlVMTCwgcGVlcl9jb25uZWN0X3RocmVhZCwgXHUwMDI2c2EpKTtcbitcbitcdGNmZCA9IGFjY2VwdChzZXJ2ZXIsIE5VTEwsIE5VTEwpO1xuK1x0QVNTRVJUX0xFKDAsIGNmZCk7XG4rXG4rXHRBU1NFUlRfRVEoc2l6ZW9mKGlkcyksIHJlY3YoY2ZkLCBcdTAwMjZpZHMsIHNpemVvZihpZHMpLCBNU0dfV0FJVEFMTCkpO1xuK1x0QVNTRVJUX05FKGlkcy5waWQsIGlkcy50aWQpO1xuK1xuK1x0LyogU09fUEVFUlBJREZEIHJlZmVycyB0byB0aGUgcGVlcidzIHRocmVhZC1ncm91cC4gKi9cbitcdEFTU0VSVF9FUSgwLCBwZWVyX3BpZGZkX2luZm8oY2ZkLCBTT19QRUVSUElERkQsIFx1MDAyNmluZm8pKTtcbitcdEVYUEVDVF9FUShpZHMucGlkLCBpbmZvLnBpZCk7XG4rXHRFWFBFQ1RfRVEoaWRzLnBpZCwgaW5mby50Z2lkKTtcbitcbitcdC8qIFNPX1BFRVJQSURGRF9USFJFQUQgcmVmZXJzIHRvIHRoZSBjb25uZWN0aW5nIHRocmVhZC4gKi9cbitcdEFTU0VSVF9FUSgwLCBwZWVyX3BpZGZkX2luZm8oY2ZkLCBTT19QRUVSUElERkRfVEhSRUFELCBcdTAwMjZpbmZvKSk7XG4rXHRFWFBFQ1RfRVEoaWRzLnRpZCwgaW5mby5waWQpO1xuK1x0RVhQRUNUX0VRKGlkcy5waWQsIGluZm8udGdpZCk7XG4rXG4rXHQvKiByZWxlYXNlIHRoZSBjb25uZWN0aW5nIHRocmVhZCAqL1xuK1x0QVNTRVJUX0VRKDEsIHdyaXRlKGNmZCwgXCJ4XCIsIDEpKTtcbitcdEFTU0VSVF9FUSgwLCBwdGhyZWFkX2pvaW4odGhyZWFkLCBcdTAwMjZ0cmV0KSk7XG4rXHRBU1NFUlRfRVEoTlVMTCwgdHJldCk7XG4rXG4rXHRjbG9zZShjZmQpO1xuK1x0Y2xvc2Uoc2VydmVyKTtcbit9XG4rXG4gVEVTVF9IQVJORVNTX01BSU5cbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM0OjQxLjI2OTA5MzUxNFoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTcyODMwODk3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSBSaXNrcyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIGFuZCBmaWd1cmUgb3V0IGlmIGl0IGludHJvZHVjZXMgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHZ1bG5lcmFiaWxpdGllcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIHJ1bm5pbmcgS01TQU4uIE15IGZpcnN0IHN0ZXAgaXMgdG8gdGhvcm91Z2hseSB1bmRlcnN0YW5kIGV4YWN0bHkgd2hhdCB0aGlzIHBhdGNoIGlzIGRvaW5nLlxuXG5BbHJpZ2h0LCBzbyBpdCdzIGFkZGluZyBgU09fUEFTU1BJREZEX1RIUkVBRGAgYW5kIGBTT19QRUVSUElERkRfVEhSRUFEYCBzb2NrZXQgb3B0aW9ucy4gVGhhdCBzZWVtcyBzdHJhaWdodGZvcndhcmQgZW5vdWdoLCBib3RoIGluIHRoZSB1YXBpIGhlYWRlcnMgYW5kIGFzbSBoZWFkZXJzLiBJdCdzIGFsc28gdXBkYXRpbmcgc2V2ZXJhbCBrZXkgc3RydWN0dXJlczogYGNvcmVkdW1wX3BhcmFtc2AsIGBzY21fY29va2llYCwgYHNvY2tgLCBgdW5peF9wZWVyY3JlZGAsIGFuZCBgdW5peF9za2JfcGFybXNgLiBJdCBhcHBlYXJzIHRoYXQgdGhlc2Ugc3RydWN0dXJlcyBhcmUgYmVpbmcgbW9kaWZpZWQgdG8gc3RvcmUgYXJyYXlzIG9mIGBzdHJ1Y3QgcGlkICpgLCBpbmRleGVkIGJ5IFBJRCB0eXBlLCB1c2luZyBgREVDTEFSRV9QSURTYCBtYWNybywgdXNpbmcgdGhlIG5ldyBgUElEVFlQRV9UR0lEYCB0eXBlLlxuXG5UaGVuIHRoZXJlIGFyZSBuZXcgaGVscGVyIGZ1bmN0aW9ucyBpbiBgaW5jbHVkZS9saW51eC9waWQuaGAgYW5kIGBpbmNsdWRlL2xpbnV4L3NjaGVkL3NpZ25hbC5oYC4gIFdlIGhhdmUgYERFQ0xBUkVfUElEU2AsIHdoaWNoIGV4cGFuZHMgdG8gYSBgc3RydWN0IHBpZCAqbmFtZVsuLi4gXWAgYXJyYXksIGFuZCBmdW5jdGlvbnMgbGlrZSBgX19nZXRfcGlkc2AsIGBfX3B1dF9waWRzYCwgYF9fc3dhcF9waWRzYCwgYF9fcGlkc19lcXVhbGAsIGBfX3Rhc2tfcGlkc2AsIGBfX2dldF90YXNrX3BpZHNgLCBhbmQgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AuICBJbnRlcmVzdGluZy4gTGV0J3Mgc2VlIGhvdyB0aGVzZSBhcmUgdXNlZC5cblxuTG9va2luZyBhdCB0aGUgc29ja2V0IG9wdGlvbiB1cGRhdGVzIGluIGBuZXQvY29yZS9zb2NrLmNgLCBgU09fUEFTU1BJREZEYCBhbmQgYFNPX1BBU1NQSURGRF9USFJFQURgIGFyZSBiZWluZyBhZGRlZCB0byBgc2tfc2V0c29ja29wdGAgYW5kIGBza19nZXRzb2Nrb3B0YC4gIGBTT19QRUVSUElERkRgIGFuZCBgU09fUEVFUlBJREZEX1RIUkVBRGAgYXJlIGluIGBza19nZXRzb2Nrb3B0YCB2aWEgaGVscGVyIGZ1bmN0aW9ucy4gIEFuZCBhIGBtZW1zZXRgIGlzIGhhcHBlbmluZyB0byBgc2stXHUwMDNlc2tfcGVlcl9waWRgIGluIGBzb2NrX2luaXRfZGF0YV91aWRgLlxuXG5GdXJ0aGVybW9yZSwgdGhlcmUgYXJlIHVwZGF0ZXMgZm9yIEFGX1VOSVgsIGZvY3VzaW5nIG9uIGBwcmVwYXJlX3BlZXJjcmVkYCwgYGluaXRfcGVlcmNyZWRgLCBgdXBkYXRlX3BlZXJjcmVkYCwgYGNvcHlfcGVlcmNyZWRgLCAgYW5kIGhlbHBlciBmdW5jdGlvbnMgYXJvdW5kIGBzY21gIHN0cnVjdHVyZXMuIEFGX0JMVUVUT09USCBhbHNvIHNlZXMgY2hhbmdlcywgcGFydGljdWxhcmx5IGluIGFsbG9jYXRpb24gYW5kIGNyZWRlbnRpYWwgY29weWluZzogYGJ0X3NvY2tfYWxsb2NgLCBgYnRfYWNjZXB0X2VucXVldWVgLCBgaGNpX3NvY2tfY29weV9jcmVkc2AsIGFuZCBgbDJjYXBfc29ja19nZXRfcGVlcl9waWRfY2JgLiBGaW5hbGx5LCB0aGVyZSBhcmUgY2hhbmdlcyByZWxhdGVkIHRvIGNvcmVkdW1wcyBhbmQgcGlkZnMsIHdpdGggbmV3IGZ1bmN0aW9ucyBsaWtlIGBjb3JlZHVtcF9wYXJzZWAsIGB1bWhfY29yZWR1bXBfc2V0dXBgLCBgY29yZWR1bXBfc29ja19jb25uZWN0YCwgYHBpZGZzX2NvcmVkdW1wYCwgYW5kIGBfX3BpZGZzX3JlZ2lzdGVyX3BpZHNgLlxuXG5Ob3csIHRoZSBjcml0aWNhbCBwYXJ0LiBXZSBuZWVkIHRvIG1ldGljdWxvdXNseSBzY3J1dGluaXplIGV2ZXJ5IGluc3RhbmNlIHdoZXJlIG1lbW9yeSBpcyBhbGxvY2F0ZWQsIHJlYWQsIGNvcGllZCB0byB1c2Vyc3BhY2UsIG9yIGludm9sdmVkIGluIGJyYW5jaGluZyBjb25kaXRpb25zLiAgVGhlIHByaW1hcnkgY29uY2VybiBpcyBlbnN1cmluZyB0aGF0IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIG5ldmVyIHJlYWQsIGVpdGhlciB3aXRoaW4gdGhlIGtlcm5lbCBvciwgbW9yZSBpbXBvcnRhbnRseSwgbGVha2VkIHRvIHVzZXJzcGFjZS5cblxuTGV0J3MgYmVnaW4gd2l0aCBgREVDTEFSRV9QSURTYDogYERFQ0xBUkVfUElEUyhuYW1lLCBsYXN0KWAgZXhwYW5kcyB0byBgc3RydWN0IHBpZCAqbmFtZVsobGFzdCkgKyAxICsgQlVJTERfQlVHX09OX1pFUk8oKGxhc3QpIFx1MDAzZT0gUElEVFlQRV9NQVgpXWAuIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoZSBhcnJheSBzaXplcy4gYGxhc3RgIGFwcGVhcnMgdG8gYmUgYFBJRFRZUEVfVEdJRGAuIExldCBtZSBwYXVzZSBhbmQgZG91YmxlLWNoZWNrIHRob3NlIGVudW0gdmFsdWVzIGluIGBwaWRfdHlwZXMuaGAsIGFuZCBgcGlkLmhgLiAgSSdsbCBncmVwIGFuZCByZWFkIHRoZSBoZWFkZXIgZmlsZXMgbm93IHRvIGJlIHN1cmUgb2YgdGhlIHZhbHVlcyB0byBhc3Nlc3MgcG90ZW50aWFsIG9mZi1ieS1vbmUgZXJyb3JzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMjg2MywiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjc3OSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM0OjUyLjk5NzQwNjE5MVoiLCJTZXEiOjQwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyMTUyNDI5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImVudW0gcGlkX3R5cGVcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL2xpbnV4L3BpZF90eXBlcy5oLTYtXFxuaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaDo3OmVudW0gcGlkX3R5cGUge1xcbmluY2x1ZGUvbGludXgvcGlkX3R5cGVzLmgtOC1cXHRQSURUWVBFX1BJRCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzQ6NTMuMTM5NTY1NjMxWiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQzNjkwMTg4NTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgdGhlIG9uZSB0aGlua2luZyBpdDpcblxuKipEaXZpbmcgaW50byBQSUQgSW50ZXJuYWxzKipcblxuT2theSwgdGltZSB0byBnZXQgaW50byB0aGUgbml0dHktZ3JpdHR5IG9mIHRoZSBrZXJuZWwncyBQSUQgbWFuYWdlbWVudC4gTGV0J3Mgc3RhcnQgYnkgY3JhY2tpbmcgb3BlbiBgaW5jbHVkZS9saW51eC9waWRfdHlwZXMuaGAuIFRoaXMgaXMgd2hlcmUgdGhlIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyByZWxhdGVkIHRvIHByb2Nlc3MgSURzIGFyZSBsaWtlbHkgaG91c2VkLiBVbmRlcnN0YW5kaW5nIHRoaXMgZmlsZSBpcyBmdW5kYW1lbnRhbC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZyBvZiBob3cgdGhlIGtlcm5lbCBhY3R1YWxseSAqcmVwcmVzZW50cyogYW5kICp1c2VzKiBQSURzIGludGVybmFsbHkuIEknbSBob3BpbmcgdG8gc2VlIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGBwaWRgIHR5cGUsIGFueSByZWxhdGVkIGZsYWdzLCBhbmQgdGhlIG92ZXJhbGwgYXBwcm9hY2ggdG8gUElEIGFsbG9jYXRpb24gYW5kIHVzYWdlLiBJIGV4cGVjdCB0byBzZWUgdGhlIGJhc2ljIGJ1aWxkaW5nIGJsb2NrcyB0aGF0IHN1cHBvcnQgdGhlIHJlc3Qgb2YgdGhlIFBJRC1yZWxhdGVkIGNvZGUuIFRoaXMgd2lsbCBiZSB0aGUgZm91bmRhdGlvbiBmb3IgZmlndXJpbmcgb3V0IGhvdyB0aGUga2VybmVsIHRyYWNrcyBwcm9jZXNzZXMgYW5kIHJlbGF0ZXMgdGhlbSB0byB1c2Vyc3BhY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NTEwLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzQ6NTcuNTA4NTg2ODQ3WiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYwNTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvcGlkX3R5cGVzLmhcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqL1xcbiAgIDI6XFx0I2lmbmRlZiBfTElOVVhfUElEX1RZUEVTX0hcXG4gICAzOlxcdCNkZWZpbmUgX0xJTlVYX1BJRF9UWVBFU19IXFxuICAgNDpcXHRcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9idWlsZF9idWcuaFxcdTAwM2VcXG4gICA2OlxcdFxcbiAgIDc6XFx0ZW51bSBwaWRfdHlwZSB7XFxuICAgODpcXHRcXHRQSURUWVBFX1BJRCxcXG4gICA5OlxcdFxcdFBJRFRZUEVfVEdJRCxcXG4gIDEwOlxcdFxcdFBJRFRZUEVfUEdJRCxcXG4gIDExOlxcdFxcdFBJRFRZUEVfU0lELFxcbiAgMTI6XFx0XFx0UElEVFlQRV9NQVgsXFxuICAxMzpcXHR9O1xcbiAgMTQ6XFx0XFxuICAxNTpcXHRzdHJ1Y3QgcGlkO1xcbiAgMTY6XFx0XFxuICAxNzpcXHQvKiBBbiBhcnJheSBvZiBzdHJ1Y3QgcGlkIGluZGV4ZWQgYnkgcGlkIHR5cGUsIFBJRFRZUEVfUElEIHVwIHRvIEBsYXN0LiAqL1xcbiAgMTg6XFx0I2RlZmluZSBERUNMQVJFX1BJRFMobmFtZSwgbGFzdClcXHRcXHRcXHRcXHRcXHRcXFxcXFxuICAxOTpcXHRcXHRzdHJ1Y3QgcGlkICpuYW1lWyhsYXN0KSArIDEgKyBCVUlMRF9CVUdfT05fWkVSTygobGFzdCkgXFx1MDAzZT0gUElEVFlQRV9NQVgpXVxcbiAgMjA6XFx0XFxuICAyMTpcXHRzdHJ1Y3QgcGlkX25hbWVzcGFjZTtcXG4gIDIyOlxcdGV4dGVybiBzdHJ1Y3QgcGlkX25hbWVzcGFjZSBpbml0X3BpZF9ucztcXG4gIDIzOlxcdFxcbiAgMjQ6XFx0I2VuZGlmIC8qIF9MSU5VWF9QSURfVFlQRVNfSCAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozNDo1Ny41MDg2NDk0NDdaIiwiU2VxIjo0MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTEyODgxNDkxNjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqRGl2aW5nIGludG8gc2NtX2Nvb2tpZSBJbml0aWFsaXphdGlvbiBhbmQgVXNhZ2UqKlxuXG5Pa2F5LCBsZXQncyB0YWtlIGEgbG9vayBhdCBob3cgYHN0cnVjdCBzY21fY29va2llYCBpcyBpbml0aWFsaXplZCBhbmQgdXNlZCB0aHJvdWdob3V0IHRoZSBjb2RlYmFzZS4gSSdtIGZvY3VzaW5nIG9uIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGUgUElEIGluZm9ybWF0aW9uIGlzIGhhbmRsZWQsIGVzcGVjaWFsbHkgY29uc2lkZXJpbmcgcG90ZW50aWFsIHJlZmVyZW5jZSBjb3VudGluZyBvciBsZWFrcy4gSSBqdXN0IGxvb2tlZCBhdCBgbmV0L2NvcmUvc2NtLmNgIGFuZCBzYXcgYHNjbV9yZXBsYWNlX3BpZGAuIEhtbSwgaW4gYHNjbV9yZXBsYWNlX3BpZGAsIGl0IGxvb2tzIGxpa2UgdGhlcmUncyBzb21lIGtpbmQgb2YgUElEIHJlZ2lzdHJhdGlvbiB1c2luZyBgcGlkZnNfcmVnaXN0ZXJfcGlkYC4gVGhlIGNvbW1lbnRzIHNheSBcImRyb3AgYWxsIHByZXZpb3VzIHJlZmVyZW5jZXMsXCIgd2hpY2ggbWFrZXMgbWUgd29uZGVyIGlmIHRoZXJlJ3MgYW4gZXhwbGljaXQgdW5yZWdpc3RyYXRpb24gb3IgcmVmY291bnQgZGVjcmVtZW50IGhhcHBlbmluZywgb3IgaWYgdGhlIHJlZ2lzdHJhdGlvbnMgdGhlbXNlbHZlcyBoYW5kbGUgcmVmZXJlbmNlIGNvdW50cy4gVGhhdCdzIGEgcG9pbnQgdG8gaW52ZXN0aWdhdGUgbW9yZSBjbG9zZWx5LCBiZWNhdXNlIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhpcyBpcyBkb25lIGNvcnJlY3RseSB0byBhdm9pZCBtZW1vcnkgY29ycnVwdGlvbi5cblxuVGhlbiBJIGp1bXBlZCB0byBgaW5jbHVkZS9uZXQvc2NtLmhgIHRvIGxvb2sgYXQgYHNjbV9zZXRfY3JlZGAuIFRoZSBjb2RlIGxvb2tzIHN0cmFpZ2h0Zm9yd2FyZCwgc2V0dGluZyB0aGUgVEdJRCwgUElELCBVSUQsIGFuZCBHSUQuIEJ1dCB3YWl0LCB3aGVyZSBpcyB0aGUgYFBJRFRZUEVfUElEYCBmaWVsZCBiZWluZyBzZXQgaW4gYHNjbV9zZXRfY3JlZGA/IEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoYXQuIEknbSBhIGJpdCBjb25jZXJuZWQgYmVjYXVzZSBpdCBzZWVtcyBsaWtlIHRoZSBgUElEVFlQRV9QSURgIGZpZWxkIGlzIGJlaW5nIHNldCBpbiBgc2NtX3JlcGxhY2VfcGlkYCBidXQgbm90IGhlcmUuIFRoYXQgc2VlbXMgbGlrZSBhbiBpbmNvbnNpc3RlbmN5IHRvIG1lLCBhbmQgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGV4YWN0IGluaXRpYWxpemF0aW9uIHBhdGguXG5cbkknbSB0aGlua2luZywgd2hlcmUgaXMgYHNjbV9zZXRfY3JlZGAgZXZlbiAqY2FsbGVkKj8gSG93IGlzIHRoZSBgc2NtX2Nvb2tpZWAgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBpbiB0aGUgZmlyc3QgcGxhY2U/IEkgbmVlZCB0byB0cmFjayBkb3duIGFsbCB0aGUgY2FsbHMgdG8gYHNjbV9zZXRfY3JlZGAgYW5kIGFsc28gYWxsIHRoZSBwbGFjZXMgd2hlcmUgYHN0cnVjdCBzY21fY29va2llYCBpcyBkZWNsYXJlZC4gQSBjb21wbGV0ZSBwaWN0dXJlIG9mIHRoZSBhbGxvY2F0aW9uLCBpbml0aWFsaXphdGlvbiwgYW5kIHVzYWdlIGlzIGVzc2VudGlhbCBoZXJlLCBzbyBJJ2xsIG5lZWQgdG8gZ28gdGhyb3VnaCBhbGwgaW5zdGFuY2VzIGFjcm9zcyB0aGUgY29kZWJhc2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1MDYyLCJPdXRwdXRUb2tlbnMiOjE5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDkxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzU6MDguNzk2ODAyNTQ4WiIsIlNlcSI6NDQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyNDMyMzQwODU1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInNjbV9zZXRfY3JlZFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJpbmNsdWRlL25ldC9zY20uaD02NT1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG4tLVxcbmluY2x1ZGUvbmV0L3NjbS5oLTY4LVxcbmluY2x1ZGUvbmV0L3NjbS5oOjY5OnN0YXRpYyBfX2lubGluZV9fIHZvaWQgc2NtX3NldF9jcmVkKHN0cnVjdCBzY21fY29va2llICpzY20sXFxuaW5jbHVkZS9uZXQvc2NtLmgtNzAtXFx0XFx0XFx0XFx0ICAgIHN0cnVjdCBwaWQgKnBpZCwga3VpZF90IHVpZCwga2dpZF90IGdpZClcXG4tLVxcbmluY2x1ZGUvbmV0L3NjbS5oPTkwPXN0YXRpYyBfX2lubGluZV9fIGludCBzY21fc2VuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuLS1cXG5pbmNsdWRlL25ldC9zY20uaC05Ni1cXHRpZiAoZm9yY2VjcmVkcylcXG5pbmNsdWRlL25ldC9zY20uaDo5NzpcXHRcXHRzY21fc2V0X2NyZWQoc2NtLCB0YXNrX3RnaWQoY3VycmVudCksIGN1cnJlbnRfdWlkKCksIGN1cnJlbnRfZ2lkKCkpO1xcbmluY2x1ZGUvbmV0L3NjbS5oLTk4LVxcdHVuaXhfZ2V0X3BlZXJzZWNfZGdyYW0oc29jaywgc2NtKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzU6MTEuMjI5MTUwOTMzWiIsIlNlcSI6NDUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwMDU1MjQwODgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkludmVzdGlnYXRpbmcgdGhlIGBzY21gIFN0cnVjdHVyZSdzIFVzYWdlKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBgc2NtYCBkYXRhIHN0cnVjdHVyZSBpcyBiZWluZyB1c2VkIHdpdGhpbiB0aGUga2VybmVsLCBzcGVjaWZpY2FsbHkgaW4gcmVsYXRpb24gdG8gYHNjbV9zZW5kYCBhbmQgYHNjbV9zZXRfY3JlZGAuIFRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIGhvdyB0aGVzZSBzeXN0ZW0gY2FsbCBtZWNoYW5pc21zIGFyZSBzdHJ1Y3R1cmVkLCBlc3BlY2lhbGx5IGxvb2tpbmcgZm9yIHBvdGVudGlhbCBwb2ludHMgd2hlcmUgdGhhdCBgc2NtX2Nvb2tpZWAgc3RydWN0dXJlIG1pZ2h0IGJlIHVzZWQuXG5cbk15IGltbWVkaWF0ZSBwbGFuIGlzIHRvIHNlYXJjaCB0aGUgY29kZWJhc2UgZm9yIHdoZXJlIHRoZSBgc2NtYCB2YXJpYWJsZSBpcyBkZWZpbmVkIHdpdGhpbiBhbnkgZnVuY3Rpb24gdGhhdCBoYXMgY2FsbHMgdG8gYHNjbV9zZW5kYCBvciBgc2NtX3NldF9jcmVkYCwgdGhpcyB3YXkgSSBjYW4gaWRlbnRpZnkgcmVsZXZhbnQgZGF0YSBmbG93cy4gQWZ0ZXIgdGhhdCBJIHRoaW5rIEkgd2lsbCBzZWFyY2ggdGhlIGVudGlyZSBrZXJuZWwgY29kZWJhc2UgZm9yIG9jY3VycmVuY2VzIG9mIGBzdHJ1Y3Qgc2NtX2Nvb2tpZWAsIHdpdGggdGhlIGlkZWEgb2YgcGlucG9pbnRpbmcgZXZlcnkgaW5zdGFuY2Ugd2hlcmUgdGhhdCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgb3IgcmVmZXJlbmNlZC4gVGhpcyBzaG91bGQgcGFpbnQgYSBtdWNoIGJyb2FkZXIgcGljdHVyZSBvZiBpdHMgcHVycG9zZSBhbmQgaW1wYWN0LiBJ4oCZbSBob3BpbmcgdG8gZ2xlYW4gbW9yZSBhYm91dCB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZXNlIHBhcnRpY3VsYXIgc3lzdGVtIGNhbGwgaW50ZXJhY3Rpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjIxNywiT3V0cHV0VG9rZW5zIjoyMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjQ0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM1OjMxLjI4NDM5NjM3NloiLCJTZXEiOjQ2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjgwMDk0MjExNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJzdHJ1Y3Qgc2NtX2Nvb2tpZSBcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiRG9jdW1lbnRhdGlvbi9zZWN1cml0eS9sc20ucnN0PTkxPW5ldHdvcmsgZGV2aWNlIHNlY3VyaXR5IGluZm9ybWF0aW9uLCBzZWN1cml0eSBmaWVsZHMgd2VyZSBhZGRlZCB0b1xcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvbHNtLnJzdC05Mi06Yzp0eXBlOmBzdHJ1Y3Qgc2tfYnVmZiBcXHUwMDNjc2tfYnVmZlxcdTAwM2VgIGFuZFxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvbHNtLnJzdDo5Mzo6Yzp0eXBlOmBzdHJ1Y3Qgc2NtX2Nvb2tpZSBcXHUwMDNjc2NtX2Nvb2tpZVxcdTAwM2VgLlxcbkRvY3VtZW50YXRpb24vc2VjdXJpdHkvbHNtLnJzdC05NC1Vbmxpa2UgdGhlIG90aGVyIHNlY3VyaXR5IG1vZHVsZSBkYXRhLCB0aGUgZGF0YSB1c2VkIGhlcmUgaXMgYVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvbHNtLnJzdD02OD1zdHJ1Y3Qgc2htaWRfa2VybmVs55qE5a6a5LmJ6KKr56e75Yqo5Yiw5aS05paH5Lu25Lit77yIIGBgaW5jbHVkZS9saW51eC9tc2cuaGBgIOWSjFxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vc2VjdXJpdHkvbHNtLnJzdC03MS3lr7nkuo7mlbDmja7ljIXlkoznvZHnu5zorr7lpIfnmoTlronlhajkv6Hmga/vvIzlronlhajln5/ooqvmt7vliqDliLAgOmM6dHlwZTpcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9sc20ucnN0OjcyOmBzdHJ1Y3Qgc2tfYnVmZiBcXHUwMDNjc2tfYnVmZlxcdTAwM2VgIOWSjCA6Yzp0eXBlOiBgc3RydWN0IHNjbV9jb29raWUgXFx1MDAzY3NjbV9jb29raWVcXHUwMDNlYCDkuK3jgIJcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9zZWN1cml0eS9sc20ucnN0LTczLeS4juWFtuS7luWuieWFqOaooeWdl+aVsOaNruS4jeWQjO+8jOi/memHjOS9v+eUqOeahOaVsOaNruaYr+S4gOS4qjMy5L2N5pW05pWw44CC5a6J5YWo5qih5Z2X6ZyA6KaB5bCG6L+Z5Lqb5YC8XFxuLS1cXG5pbmNsdWRlL25ldC9zY20uaD0zMD1zdHJ1Y3Qgc2NtX2ZwX2xpc3Qge1xcbi0tXFxuaW5jbHVkZS9uZXQvc2NtLmgtNDMtXFxuaW5jbHVkZS9uZXQvc2NtLmg6NDQ6c3RydWN0IHNjbV9jb29raWUge1xcbmluY2x1ZGUvbmV0L3NjbS5oLTQ1LVxcdERFQ0xBUkVfUElEUyhwaWQsIFBJRFRZUEVfVEdJRCk7XFx0LyogU2tiIGNyZWRlbnRpYWxzIGJ5IHBpZCB0eXBlICovXFxuLS1cXG5pbmNsdWRlL25ldC9zY20uaC01Mi1cXG5pbmNsdWRlL25ldC9zY20uaDo1Mzp2b2lkIHNjbV9kZXRhY2hfZmRzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBub3RydW5jKTtcXG5pbmNsdWRlL25ldC9zY20uaDo1NDp2b2lkIHNjbV9kZXRhY2hfZmRzX2NvbXBhdChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpzY20sIGJvb2wgbm90cnVuYyk7XFxuaW5jbHVkZS9uZXQvc2NtLmg6NTU6aW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKTtcXG5pbmNsdWRlL25ldC9zY20uaDo1Njp2b2lkIF9fc2NtX2Rlc3Ryb3koc3RydWN0IHNjbV9jb29raWUgKnNjbSk7XFxuaW5jbHVkZS9uZXQvc2NtLmgtNTctc3RydWN0IHNjbV9mcF9saXN0ICpzY21fZnBfZHVwKHN0cnVjdCBzY21fZnBfbGlzdCAqZnBsKTtcXG4tLVxcbmluY2x1ZGUvbmV0L3NjbS5oLTU5LSNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS1xcbmluY2x1ZGUvbmV0L3NjbS5oOjYwOnN0YXRpYyBfX2lubGluZV9fIHZvaWQgdW5peF9nZXRfcGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxcbmluY2x1ZGUvbmV0L3NjbS5oLTYxLXtcXG4tLVxcbmluY2x1ZGUvbmV0L3NjbS5oLTY0LSNlbHNlXFxuaW5jbHVkZS9uZXQvc2NtLmg6NjU6c3RhdGljIF9faW5saW5lX18gdm9pZCB1bml4X2dldF9wZWVyc2VjX2RncmFtKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzY21fY29va2llICpzY20pXFxuaW5jbHVkZS9uZXQvc2NtLmgtNjYteyB9XFxuLS1cXG5pbmNsdWRlL25ldC9zY20uaC02OC1cXG5pbmNsdWRlL25ldC9zY20uaDo2OTpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9zZXRfY3JlZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLFxcbmluY2x1ZGUvbmV0L3NjbS5oLTcwLVxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgcGlkICpwaWQsIGt1aWRfdCB1aWQsIGtnaWRfdCBnaWQpXFxuLS1cXG5pbmNsdWRlL25ldC9zY20uaC03Ny1cXG5pbmNsdWRlL25ldC9zY20uaDo3ODpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9kZXN0cm95X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG5pbmNsdWRlL25ldC9zY20uaC03OS17XFxuLS1cXG5pbmNsdWRlL25ldC9zY20uaC04Mi1cXG5pbmNsdWRlL25ldC9zY20uaDo4MzpzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9kZXN0cm95KHN0cnVjdCBzY21fY29va2llICpzY20pXFxuaW5jbHVkZS9uZXQvc2NtLmgtODQte1xcbi0tXFxuaW5jbHVkZS9uZXQvc2NtLmg9OTA9c3RhdGljIF9faW5saW5lX18gaW50IHNjbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG5pbmNsdWRlL25ldC9zY20uaDo5MTpcXHRcXHRcXHQgICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBmb3JjZWNyZWRzKVxcbmluY2x1ZGUvbmV0L3NjbS5oLTkyLXtcXG4tLVxcbmluY2x1ZGUvbmV0L3NjbS5oPTEwND12b2lkIHNjbV9yZWN2KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG5pbmNsdWRlL25ldC9zY20uaDoxMDU6XFx0ICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKTtcXG5pbmNsdWRlL25ldC9zY20uaC0xMDYtdm9pZCBzY21fcmVjdl91bml4KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG5pbmNsdWRlL25ldC9zY20uaDoxMDc6XFx0XFx0ICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKTtcXG5pbmNsdWRlL25ldC9zY20uaC0xMDgtXFxuLS1cXG5uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmM9MTU1Nj1zdGF0aWMgaW50IGhjaV9zb2NrX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbi0tXFxubmV0L2JsdWV0b290aC9oY2lfc29jay5jLTE1NTgte1xcbm5ldC9ibHVldG9vdGgvaGNpX3NvY2suYzoxNTU5OlxcdHN0cnVjdCBzY21fY29va2llIHNjbTtcXG5uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMtMTU2MC1cXHRzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLVxcdTAwM2VzaztcXG4tLVxcbm5ldC9jb21wYXQuYz0yODI9c3RhdGljIGludCBzY21fbWF4X2Zkc19jb21wYXQoc3RydWN0IG1zZ2hkciAqbXNnKVxcbi0tXFxubmV0L2NvbXBhdC5jLTI4OC1cXG5uZXQvY29tcGF0LmM6Mjg5OnZvaWQgc2NtX2RldGFjaF9mZHNfY29tcGF0KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBub3RydW5jKVxcbm5ldC9jb21wYXQuYy0yOTAte1xcbi0tXFxubmV0L2NvcmUvc2NtLmM9Njk9c3RhdGljIGludCBzY21fZnBfY29weShzdHJ1Y3QgY21zZ2hkciAqY21zZywgc3RydWN0IHNjbV9mcF9saXN0ICoqZnBscClcXG4tLVxcbm5ldC9jb3JlL3NjbS5jLTEzNC1cXG5uZXQvY29yZS9zY20uYzoxMzU6dm9pZCBfX3NjbV9kZXN0cm95KHN0cnVjdCBzY21fY29va2llICpzY20pXFxubmV0L2NvcmUvc2NtLmMtMTM2LXtcXG4tLVxcbm5ldC9jb3JlL3NjbS5jPTE0OD1FWFBPUlRfU1lNQk9MKF9fc2NtX2Rlc3Ryb3kpO1xcbm5ldC9jb3JlL3NjbS5jLTE0OS1cXG5uZXQvY29yZS9zY20uYzoxNTA6c3RhdGljIGlubGluZSBpbnQgc2NtX3JlcGxhY2VfcGlkKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBwaWQgKnBpZClcXG5uZXQvY29yZS9zY20uYy0xNTEte1xcbi0tXFxubmV0L2NvcmUvc2NtLmMtMTc3LVxcbm5ldC9jb3JlL3NjbS5jOjE3ODppbnQgX19zY21fc2VuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzY21fY29va2llICpwKVxcbm5ldC9jb3JlL3NjbS5jLTE3OS17XFxuLS1cXG5uZXQvY29yZS9zY20uYz0zNjc9aW50IHNjbV9yZWN2X29uZV9mZChzdHJ1Y3QgZmlsZSAqZiwgaW50IF9fdXNlciAqdWZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuLS1cXG5uZXQvY29yZS9zY20uYy0zOTAtXFxubmV0L2NvcmUvc2NtLmM6MzkxOnZvaWQgc2NtX2RldGFjaF9mZHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBib29sIG5vdHJ1bmMpXFxubmV0L2NvcmUvc2NtLmMtMzkyLXtcXG4tLVxcbm5ldC9jb3JlL3NjbS5jPTQ2Nz1FWFBPUlRfU1lNQk9MKHNjbV9mcF9kdXApO1xcbi0tXFxubmV0L2NvcmUvc2NtLmMtNDY5LSNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS1xcbm5ldC9jb3JlL3NjbS5jOjQ3MDpzdGF0aWMgdm9pZCBzY21fcGFzc2VjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxcbm5ldC9jb3JlL3NjbS5jLTQ3MS17XFxuLS1cXG5uZXQvY29yZS9zY20uYz00ODc9c3RhdGljIGJvb2wgc2NtX2hhc19zZWNkYXRhKHN0cnVjdCBzb2NrICpzaylcXG4tLVxcbm5ldC9jb3JlL3NjbS5jLTQ5MS0jZWxzZVxcbm5ldC9jb3JlL3NjbS5jOjQ5MjpzdGF0aWMgdm9pZCBzY21fcGFzc2VjKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxcbm5ldC9jb3JlL3NjbS5jLTQ5My17XFxuLS1cXG5uZXQvY29yZS9zY20uYz01MDI9c3RhdGljIHZvaWQgc2NtX3BpZGZkX3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxubmV0L2NvcmUvc2NtLmM6NTAzOlxcdFxcdFxcdCAgIHN0cnVjdCBzY21fY29va2llICpzY20pXFxubmV0L2NvcmUvc2NtLmMtNTA0LXtcXG4tLVxcbm5ldC9jb3JlL3NjbS5jPTU0NT1zdGF0aWMgYm9vbCBfX3NjbV9yZWN2X2NvbW1vbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG5uZXQvY29yZS9zY20uYzo1NDY6XFx0XFx0XFx0ICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKVxcbm5ldC9jb3JlL3NjbS5jLTU0Ny17XFxuLS1cXG5uZXQvY29yZS9zY20uYz01NzM9dm9pZCBzY21fcmVjdihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxubmV0L2NvcmUvc2NtLmM6NTc0OlxcdCAgICAgIHN0cnVjdCBzY21fY29va2llICpzY20sIGludCBmbGFncylcXG5uZXQvY29yZS9zY20uYy01NzUte1xcbi0tXFxubmV0L2NvcmUvc2NtLmM9NTgzPXZvaWQgc2NtX3JlY3ZfdW5peChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxubmV0L2NvcmUvc2NtLmM6NTg0OlxcdFxcdCAgIHN0cnVjdCBzY21fY29va2llICpzY20sIGludCBmbGFncylcXG5uZXQvY29yZS9zY20uYy01ODUte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTE4MTg9c3RhdGljIGludCBuZXRsaW5rX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE4MjYtXFx0aW50IGVycjtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTgyNzpcXHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE4MjgtXFx0dTMyIG5ldGxpbmtfc2tiX2ZsYWdzID0gMDtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xOTA3PXN0YXRpYyBpbnQgbmV0bGlua19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbixcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xOTA5LXtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTkxMDpcXHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE5MTEtXFx0c3RydWN0IHNvY2sgKnNrID0gc29jay1cXHUwMDNlc2s7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjQzPXN0YXRpYyB2b2lkIHVuaXhfdGFibGVfZG91YmxlX3VubG9jayhzdHJ1Y3QgbmV0ICpuZXQsXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjU1LSNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS1xcbm5ldC91bml4L2FmX3VuaXguYzoyNTY6c3RhdGljIHZvaWQgdW5peF9nZXRfc2VjZGF0YShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0yNTcte1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTI2MC1cXG5uZXQvdW5peC9hZl91bml4LmM6MjYxOnN0YXRpYyBpbmxpbmUgdm9pZCB1bml4X3NldF9zZWNkYXRhKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IpXFxubmV0L3VuaXgvYWZfdW5peC5jLTI2Mi17XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjY1LVxcbm5ldC91bml4L2FmX3VuaXguYzoyNjY6c3RhdGljIGlubGluZSBib29sIHVuaXhfc2VjZGF0YV9lcShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0yNjcte1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTI3MC0jZWxzZVxcbm5ldC91bml4L2FmX3VuaXguYzoyNzE6c3RhdGljIGlubGluZSB2b2lkIHVuaXhfZ2V0X3NlY2RhdGEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMjcyLXsgfVxcbm5ldC91bml4L2FmX3VuaXguYy0yNzMtXFxubmV0L3VuaXgvYWZfdW5peC5jOjI3NDpzdGF0aWMgaW5saW5lIHZvaWQgdW5peF9zZXRfc2VjZGF0YShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0yNzUteyB9XFxubmV0L3VuaXgvYWZfdW5peC5jLTI3Ni1cXG5uZXQvdW5peC9hZl91bml4LmM6Mjc3OnN0YXRpYyBpbmxpbmUgYm9vbCB1bml4X3NlY2RhdGFfZXEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMjc4LXtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0xOTMxPXN0YXRpYyBpbmxpbmUgYm9vbCB0b29fbWFueV91bml4X2ZkcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMTkzOS1cXG5uZXQvdW5peC9hZl91bml4LmM6MTk0MDpzdGF0aWMgaW50IHVuaXhfYXR0YWNoX2ZkcyhzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTQxLXtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTUzLVxcbm5ldC91bml4L2FmX3VuaXguYzoxOTU0OnN0YXRpYyB2b2lkIHVuaXhfZGV0YWNoX2ZkcyhzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTU1LXtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTYxLVxcbm5ldC91bml4L2FmX3VuaXguYzoxOTYyOnN0YXRpYyB2b2lkIHVuaXhfcGVla19mZHMoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMTk2My17XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MTk2OT1zdGF0aWMgdm9pZCB1bml4X2Rlc3RydWN0X3NjbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTcwLXtcXG5uZXQvdW5peC9hZl91bml4LmM6MTk3MTpcXHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY20gPSB7fTtcXG5uZXQvdW5peC9hZl91bml4LmMtMTk3Mi1cXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0xOTgxPXN0YXRpYyB2b2lkIHVuaXhfd2ZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTg2LVxcbm5ldC91bml4L2FmX3VuaXguYzoxOTg3OnN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuZF9mZHMpXFxubmV0L3VuaXgvYWZfdW5peC5jLTE5ODgte1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTIwMDItXFxubmV0L3VuaXgvYWZfdW5peC5jOjIwMDM6c3RhdGljIHZvaWQgdW5peF9za2JfdG9fc2NtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzY21fY29va2llICpzY20pXFxubmV0L3VuaXgvYWZfdW5peC5jLTIwMDQte1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTIwNDg9c3RhdGljIGJvb2wgdW5peF9za2Jfc2NtX2VxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcXG5uZXQvdW5peC9hZl91bml4LmM6MjA0OTpcXHRcXHRcXHQgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG5uZXQvdW5peC9hZl91bml4LmMtMjA1MC17XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjA5NT1zdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjA5OS1cXHRzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7XFxubmV0L3VuaXgvYWZfdW5peC5jOjIxMDA6XFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xcbm5ldC91bml4L2FmX3VuaXguYy0yMTAxLVxcdHN0cnVjdCBza19idWZmICpza2I7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjMyOT1zdGF0aWMgaW50IHF1ZXVlX29vYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKm90aGVyLFxcbm5ldC91bml4L2FmX3VuaXguYzoyMzMwOlxcdFxcdCAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBmZHNfc2VudClcXG5uZXQvdW5peC9hZl91bml4LmMtMjMzMS17XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjM4OT1zdGF0aWMgaW50IHVuaXhfc3RyZWFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTIzOTUtXFx0c3RydWN0IHVuaXhfc29jayAqb3RoZXJ1O1xcbm5ldC91bml4L2FmX3VuaXguYzoyMzk2OlxcdHN0cnVjdCBzY21fY29va2llIHNjbTtcXG5uZXQvdW5peC9hZl91bml4LmMtMjM5Ny1cXHRib29sIGZkc19zZW50ID0gZmFsc2U7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjU3ND1pbnQgX191bml4X2RncmFtX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLFxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTI1NzYte1xcbm5ldC91bml4L2FmX3VuaXguYzoyNTc3OlxcdHN0cnVjdCBzY21fY29va2llIHNjbTtcXG5uZXQvdW5peC9hZl91bml4LmMtMjU3OC1cXHRzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gc2stXFx1MDAzZXNrX3NvY2tldDtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yOTE5PXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljKHN0cnVjdCB1bml4X3N0cmVhbV9yZWFkX3N0YXRlICpzdGF0ZSxcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0yOTI4LVxcdGJvb2wgY2hlY2tfY3JlZHMgPSBmYWxzZTtcXG5uZXQvdW5peC9hZl91bml4LmM6MjkyOTpcXHRzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207XFxubmV0L3VuaXgvYWZfdW5peC5jLTI5MzAtXFx0c3RydWN0IHVuaXhfc29jayAqdTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6MzU6MzQuMDg1MzUwODczWiIsIlNlcSI6NDcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE0NjYyNTg5MDM0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYHN0cnVjdCBzY21fY29va2llYCBzaXR1YXRpb24uIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBpbml0aWFsaXphdGlvbiBhY3Jvc3MgdGhlIGNvZGViYXNlLiBNeSBpbW1lZGlhdGUgZ29hbCBpcyB0byBtYXAgb3V0IGV2ZXJ5IHNpbmdsZSBsb2NhdGlvbiB3aGVyZSB0aGF0IHN0cnVjdHVyZSBpcyBicm91Z2h0IGludG8gZXhpc3RlbmNlLiBUaGlzIGlzIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgaXRzIGxpZmVjeWNsZSBhbmQgcG90ZW50aWFsIHBpdGZhbGxzLiBJJ2xsIG5lZWQgdG8gbWV0aWN1bG91c2x5IHRyYWNlIGl0cyBpbml0aWFsIHN0YXRlIGZyb20gaXRzIGJpcnRoLCBJJ20gdGhpbmtpbmcgSSBuZWVkIHRvIGZpbmQgYWxsIHVzZXMgaW4gdGhpcyBmaWxlIGFuZCB1bmRlcnN0YW5kIHRoZSBpbml0aWFsaXphdGlvbiBwYXR0ZXJuLlxuXG5UaGVuLCBJIHNob3VsZCBzaGlmdCBteSBmb2N1cyB0byBgc2NtX3NlbmRgIGZvdW5kIGluIGBpbmNsdWRlL25ldC9zY20uaGAuIFRoYXQgZnVuY3Rpb24gaXMgcHJvYmFibHkgYSBrZXkgcGxheWVyIGluIGhvdyBgc2NtX2Nvb2tpZWAgaXMgdXNlZCBhbmQgaG93IHRob3NlIHN0cnVjdHVyZXMgcGxheSB0b2dldGhlci4gVW5kZXJzdGFuZGluZyBgc2NtX3NlbmRgIGlzIGFsbW9zdCBjZXJ0YWlubHkgZ29pbmcgdG8gcHJvdmlkZSB2YWx1YWJsZSBjb250ZXh0IGFyb3VuZCB3aGF0IEkgZm91bmQgaW4gdGhlIGxhc3Qgc3RlcC4gQnkgZ2V0dGluZyBhIGhhbmRsZSBvbiB0aG9zZSB0d28gcGllY2VzLCBJJ2xsIGJlIGluIGEgbXVjaCBzdHJvbmdlciBwb3NpdGlvbiB0byBkaWFnbm9zZSBhbnkgaXNzdWVzLCB1bmRlcnN0YW5kIGhvdyB0aGUgZGF0YSBmbG93cywgb3IgZXZlbiBvcHRpbWl6ZSB0aGUgY29kZSBsYXRlciBvbi4gU28sIGBzY21fY29va2llYCBpbml0aWFsaXphdGlvbiBmaXJzdCwgdGhlbiBgc2NtX3NlbmRgLiBUaGF0J3MgdGhlIHBsYW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMwNTU5LCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6Mzg6MDAuNzExMjQ1NDc3WiIsIlNlcSI6NDgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkwMzIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbmV0L3NjbS5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwLFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDYwOlxcdHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdW5peF9nZXRfcGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxcbiAgNjE6XFx0e1xcbiAgNjI6XFx0XFx0c2VjdXJpdHlfc29ja2V0X2dldHBlZXJzZWNfZGdyYW0oc29jaywgTlVMTCwgXFx1MDAyNnNjbS1cXHUwMDNlc2VjaWQpO1xcbiAgNjM6XFx0fVxcbiAgNjQ6XFx0I2Vsc2VcXG4gIDY1OlxcdHN0YXRpYyBfX2lubGluZV9fIHZvaWQgdW5peF9nZXRfcGVlcnNlY19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxcbiAgNjY6XFx0eyB9XFxuICA2NzpcXHQjZW5kaWYgLyogQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgKi9cXG4gIDY4OlxcdFxcbiAgNjk6XFx0c3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fc2V0X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSxcXG4gIDcwOlxcdFxcdFxcdFxcdFxcdCAgICBzdHJ1Y3QgcGlkICpwaWQsIGt1aWRfdCB1aWQsIGtnaWRfdCBnaWQpXFxuICA3MTpcXHR7XFxuICA3MjpcXHRcXHRzY20tXFx1MDAzZXBpZFtQSURUWVBFX1RHSURdID0gZ2V0X3BpZChwaWQpO1xcbiAgNzM6XFx0XFx0c2NtLVxcdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHBpZCk7XFxuICA3NDpcXHRcXHRzY20tXFx1MDAzZWNyZWRzLnVpZCA9IHVpZDtcXG4gIDc1OlxcdFxcdHNjbS1cXHUwMDNlY3JlZHMuZ2lkID0gZ2lkO1xcbiAgNzY6XFx0fVxcbiAgNzc6XFx0XFxuICA3ODpcXHRzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHNjbV9kZXN0cm95X2NyZWQoc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG4gIDc5OlxcdHtcXG4gIDgwOlxcdFxcdHB1dF9waWRzKHNjbS1cXHUwMDNlcGlkKTtcXG4gIDgxOlxcdH1cXG4gIDgyOlxcdFxcbiAgODM6XFx0c3RhdGljIF9faW5saW5lX18gdm9pZCBzY21fZGVzdHJveShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtKVxcbiAgODQ6XFx0e1xcbiAgODU6XFx0XFx0c2NtX2Rlc3Ryb3lfY3JlZChzY20pO1xcbiAgODY6XFx0XFx0aWYgKHNjbS1cXHUwMDNlZnApXFxuICA4NzpcXHRcXHRcXHRfX3NjbV9kZXN0cm95KHNjbSk7XFxuICA4ODpcXHR9XFxuICA4OTpcXHRcXG4gIDkwOlxcdHN0YXRpYyBfX2lubGluZV9fIGludCBzY21fc2VuZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuICA5MTpcXHRcXHRcXHRcXHQgICAgICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgYm9vbCBmb3JjZWNyZWRzKVxcbiAgOTI6XFx0e1xcbiAgOTM6XFx0XFx0bWVtc2V0KHNjbSwgMCwgc2l6ZW9mKCpzY20pKTtcXG4gIDk0OlxcdFxcdHNjbS1cXHUwMDNlY3JlZHMudWlkID0gSU5WQUxJRF9VSUQ7XFxuICA5NTpcXHRcXHRzY20tXFx1MDAzZWNyZWRzLmdpZCA9IElOVkFMSURfR0lEO1xcbiAgOTY6XFx0XFx0aWYgKGZvcmNlY3JlZHMpXFxuICA5NzpcXHRcXHRcXHRzY21fc2V0X2NyZWQoc2NtLCB0YXNrX3RnaWQoY3VycmVudCksIGN1cnJlbnRfdWlkKCksIGN1cnJlbnRfZ2lkKCkpO1xcbiAgOTg6XFx0XFx0dW5peF9nZXRfcGVlcnNlY19kZ3JhbShzb2NrLCBzY20pO1xcbiAgOTk6XFx0XFx0aWYgKG1zZy1cXHUwMDNlbXNnX2NvbnRyb2xsZW4gXFx1MDAzYz0gMClcXG4gMTAwOlxcdFxcdFxcdHJldHVybiAwO1xcbiAxMDE6XFx0XFx0cmV0dXJuIF9fc2NtX3NlbmQoc29jaywgbXNnLCBzY20pO1xcbiAxMDI6XFx0fVxcbiAxMDM6XFx0XFxuIDEwNDpcXHR2b2lkIHNjbV9yZWN2KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4gMTA1OlxcdFxcdCAgICAgIHN0cnVjdCBzY21fY29va2llICpzY20sIGludCBmbGFncyk7XFxuIDEwNjpcXHR2b2lkIHNjbV9yZWN2X3VuaXgoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLFxcbiAxMDc6XFx0XFx0XFx0ICAgc3RydWN0IHNjbV9jb29raWUgKnNjbSwgaW50IGZsYWdzKTtcXG4gMTA4OlxcdFxcbiAxMDk6XFx0aW50IHNjbV9yZWN2X29uZV9mZChzdHJ1Y3QgZmlsZSAqZiwgaW50IF9fdXNlciAqdWZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MsXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM4OjAwLjcxMTMzNzcxN1oiLCJTZXEiOjQ5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNjQ0MjM0MzQyNiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIFBvdGVudGlhbCBEYXRhIENvcnJ1cHRpb24qKlxuXG5Pa2F5LCBzbyBgc2NtX3NlbmRgIGlzIGRlZmluaXRlbHkgemVyb2luZyBvdXQgdGhlIGBzY21gIHN0cnVjdCB3aXRoIGBtZW1zZXRgLiBUaGF0J3MgZ29vZCBoeWdpZW5lLCBidXQgaXQncyBnb3QgbWUgdGhpbmtpbmc6IGFyZSB3ZSBjb25zaXN0ZW50bHkgaGFuZGxpbmcgdGhpcyBpbml0aWFsaXphdGlvbiBhY3Jvc3MgdGhlIGJvYXJkPyBJIG5lZWQgdG8gYmUgc3VyZS4gTXkgZXhwZXJ0IGludHVpdGlvbiBpcyB0ZWxsaW5nIG1lIHRvIGNoZWNrIHRoZSBvdGhlciBwbGFjZXMgd2hlcmUgYHNjbWAgaXMgdXNlZC4gU3BlY2lmaWNhbGx5LCBJJ20gY29uY2VybmVkIGFib3V0IHBvdGVudGlhbCBkYXRhIGxlYWtzIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3IgaWYgdGhlc2Ugb3RoZXIgZnVuY3Rpb25zIGFyZW4ndCBhbHNvIG1ldGljdWxvdXNseSBpbml0aWFsaXppbmcgdGhlIHN0cnVjdC5cblxuTGV0J3MgcXVpY2tseSBzY2FuIHRoZSBzb3VyY2UgZm9yIGBoY2lfc29ja19yZWN2bXNnYCwgYG5ldGxpbmtfc2VuZG1zZ2AsIGBuZXRsaW5rX3JlY3Ztc2dgLCBgdW5peF9kZ3JhbV9zZW5kbXNnYCwgYHVuaXhfc3RyZWFtX3NlbmRtc2dgLCBgX191bml4X2RncmFtX3JlY3Ztc2dgLCBhbmQgYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AuIEkgbmVlZCB0byByZWFkIHRocm91Z2ggZWFjaCBvZiB0aGVtIHRvIG1ha2Ugc3VyZSB0aGVyZSBhcmVuJ3QgYW55IGdvdGNoYXMuIEknbSBsb29raW5nIGZvciB3aGVyZSBgc2NtYCBpcyBhbGxvY2F0ZWQsIGhvdyBpdCdzIHVzZWQgYmVmb3JlIGJlaW5nIHNlbnQsIGFuZCB3aGV0aGVyIHplcm9pbmcgb3IgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gaXMgdGFraW5nIHBsYWNlLiBUaGlzIGlzIGp1c3QgYSBxdWljayBzYW5pdHkgY2hlY2sgYnV0IGEgdml0YWwgb25lLiBJdCBpcyBpbXBvcnRhbnQgdG8gZWxpbWluYXRlIGFueSBwb3NzaWJpbGl0eSBvZiBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMxNjYzLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTE3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6Mzg6MTcuMTUzNjg5MDUyWiIsIlNlcSI6NTAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIxNjg1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTU1NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTU1NTpcXHRcXG4xNTU2OlxcdHN0YXRpYyBpbnQgaGNpX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuMTU1NzpcXHRcXHRcXHRcXHQgICAgc2l6ZV90IGxlbiwgaW50IGZsYWdzKVxcbjE1NTg6XFx0e1xcbjE1NTk6XFx0XFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xcbjE1NjA6XFx0XFx0c3RydWN0IHNvY2sgKnNrID0gc29jay1cXHUwMDNlc2s7XFxuMTU2MTpcXHRcXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiO1xcbjE1NjI6XFx0XFx0aW50IGNvcGllZCwgZXJyO1xcbjE1NjM6XFx0XFx0dW5zaWduZWQgaW50IHNrYmxlbjtcXG4xNTY0OlxcdFxcbjE1NjU6XFx0XFx0QlRfREJHKFxcXCJzb2NrICVwLCBzayAlcFxcXCIsIHNvY2ssIHNrKTtcXG4xNTY2OlxcdFxcbjE1Njc6XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgTVNHX09PQilcXG4xNTY4OlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4xNTY5OlxcdFxcbjE1NzA6XFx0XFx0aWYgKGhjaV9waShzayktXFx1MDAzZWNoYW5uZWwgPT0gSENJX0NIQU5ORUxfTE9HR0lORylcXG4xNTcxOlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4xNTcyOlxcdFxcbjE1NzM6XFx0XFx0aWYgKHNrLVxcdTAwM2Vza19zdGF0ZSA9PSBCVF9DTE9TRUQpXFxuMTU3NDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4xNTc1OlxcdFxcbjE1NzY6XFx0XFx0c2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBcXHUwMDI2ZXJyKTtcXG4xNTc3OlxcdFxcdGlmICghc2tiKVxcbjE1Nzg6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4xNTc5OlxcdFxcbjE1ODA6XFx0XFx0c2tibGVuID0gc2tiLVxcdTAwM2VsZW47XFxuMTU4MTpcXHRcXHRjb3BpZWQgPSBza2ItXFx1MDAzZWxlbjtcXG4xNTgyOlxcdFxcdGlmIChsZW4gXFx1MDAzYyBjb3BpZWQpIHtcXG4xNTgzOlxcdFxcdFxcdG1zZy1cXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19UUlVOQztcXG4xNTg0OlxcdFxcdFxcdGNvcGllZCA9IGxlbjtcXG4xNTg1OlxcdFxcdH1cXG4xNTg2OlxcdFxcbjE1ODc6XFx0XFx0c2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTtcXG4xNTg4OlxcdFxcdGVyciA9IHNrYl9jb3B5X2RhdGFncmFtX21zZyhza2IsIDAsIG1zZywgY29waWVkKTtcXG4xNTg5OlxcdFxcbjE1OTA6XFx0XFx0c3dpdGNoIChoY2lfcGkoc2spLVxcdTAwM2VjaGFubmVsKSB7XFxuMTU5MTpcXHRcXHRjYXNlIEhDSV9DSEFOTkVMX1JBVzpcXG4xNTkyOlxcdFxcdFxcdGhjaV9zb2NrX2Ntc2coc2ssIG1zZywgc2tiKTtcXG4xNTkzOlxcdFxcdFxcdGJyZWFrO1xcbjE1OTQ6XFx0XFx0Y2FzZSBIQ0lfQ0hBTk5FTF9VU0VSOlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozODoxNy4xNTM5MDk1OTJaIiwiU2VxIjo1MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTEzMTU0MzQxMTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyByZXF1ZXN0ZWQ6XG5cbioqRGl2aW5nIGludG8gYGhjaV9zb2NrX3JlY3Ztc2dgIGFuZCBpdHMgYHNjbWAgVXNhZ2UqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGBzY21gIChwcmVzdW1hYmx5IHJlZmVycmluZyB0byBzb2NrZXQgY29udHJvbCBtZXNzYWdlcykgaXMgdXNlZCB3aXRoaW4gdGhlIGBoY2lfc29ja19yZWN2bXNnYCBmdW5jdGlvbi4gVGhpcyBpcyBsaWtlbHkgcmVsYXRlZCB0byBoYW5kbGluZyBhbmNpbGxhcnkgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBCbHVldG9vdGggSENJIHNvY2tldCDigJMgdGhpbmdzIGxpa2UgY3JlZGVudGlhbHMgb3Igb3RoZXIgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gTXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBtZW50YWxseSB0cmFjZSB0aGUgZXhlY3V0aW9uIGZsb3cgb2YgYGhjaV9zb2NrX3JlY3Ztc2dgLiBJIHdpbGwgZXNzZW50aWFsbHkgXCJzdGVwXCIgdGhyb3VnaCB0aGUgZnVuY3Rpb24gaW4gbXkgbWluZC4gV2hlcmUgZG9lcyBgc2NtYCBjb21lIGludG8gcGxheT8gSXMgaXQgYmVpbmcgKnJlY2VpdmVkKiB3aXRoIHRoZSBtZXNzYWdlPyBPciBwZXJoYXBzIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBtZXNzYWdlPyBJcyBpdCBkaXJlY3RseSBtYW5pcHVsYXRlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uLCBvciBqdXN0IHBhc3NlZCBhbG9uZz8gSSB3YW50IHRvIHBpbnBvaW50IHRoZSAqc3BlY2lmaWMqIHBvaW50cyB3aGVyZSB0aGUgYHNjbWAgdmFyaWFibGUsIG9yIHNvbWV0aGluZyByZWxhdGVkIHRvIHNvY2tldCBjb250cm9sIG1lc3NhZ2VzLCBpcyBhY2Nlc3NlZCwgbW9kaWZpZWQsIG9yIHV0aWxpemVkLiBUaGlzIHdpbGwgZ2l2ZSBtZSB0aGUgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcm9sZSBvZiBgc2NtYCBpbiB0aGlzIHNwZWNpZmljIGZ1bmN0aW9uLCBhbmQgdGhlIGRhdGFmbG93IGFyb3VuZCB0aGF0IHZhcmlhYmxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjozMjY0MCwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6Mzg6MjguNDY5MzQ3NDQ4WiIsIlNlcSI6NTIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE5NTkwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTU5NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTU5NTpcXHRcXHRjYXNlIEhDSV9DSEFOTkVMX01PTklUT1I6XFxuMTU5NjpcXHRcXHRcXHRzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7XFxuMTU5NzpcXHRcXHRcXHRicmVhaztcXG4xNTk4OlxcdFxcdGRlZmF1bHQ6XFxuMTU5OTpcXHRcXHRcXHRpZiAoaGNpX21nbXRfY2hhbl9maW5kKGhjaV9waShzayktXFx1MDAzZWNoYW5uZWwpKVxcbjE2MDA6XFx0XFx0XFx0XFx0c29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpO1xcbjE2MDE6XFx0XFx0XFx0YnJlYWs7XFxuMTYwMjpcXHRcXHR9XFxuMTYwMzpcXHRcXG4xNjA0OlxcdFxcdG1lbXNldChcXHUwMDI2c2NtLCAwLCBzaXplb2Yoc2NtKSk7XFxuMTYwNTpcXHRcXHRzY20uY3JlZHMgPSBidF9jYihza2IpLVxcdTAwM2VjcmVkcztcXG4xNjA2OlxcdFxcbjE2MDc6XFx0XFx0c2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7XFxuMTYwODpcXHRcXG4xNjA5OlxcdFxcdGlmIChmbGFncyBcXHUwMDI2IE1TR19UUlVOQylcXG4xNjEwOlxcdFxcdFxcdGNvcGllZCA9IHNrYmxlbjtcXG4xNjExOlxcdFxcbjE2MTI6XFx0XFx0c2NtX3JlY3Yoc29jaywgbXNnLCBcXHUwMDI2c2NtLCBmbGFncyk7XFxuMTYxMzpcXHRcXG4xNjE0OlxcdFxcdHJldHVybiBlcnIgPyA6IGNvcGllZDtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6Mzg6MjguNDY5NTQ2OTc4WiIsIlNlcSI6NTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM1MzM2MjIxOTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0J3MgaW50ZXJuYWwgbW9ub2xvZ3VlOlxuXG4qKkludmVzdGlnYXRpbmcgU29ja2V0IE1lc3NhZ2UgSGFuZGxpbmcgaW4gSENJKipcblxuQWxyaWdodCwgbGV0J3Mgc2VlLi4uIGZpcnN0LCBpbiBgaGNpX3NvY2tfcmVjdm1zZ2AsIHdlJ3JlIGNsZWFyaW5nIG91dCB0aGUgY29udHJvbCBtZXNzYWdlIHN0cnVjdHVyZSAoYHNjbWApIHdpdGggYG1lbXNldGAuIE1ha2VzIHNlbnNlLCBnb29kIHByYWN0aWNlIHRvIGluaXRpYWxpemUgaXQgYmVmb3JlIHdlIHN0YXJ0IHN0dWZmaW5nIGRhdGEgaW50byBpdC4gUHJldmVudHMgYW55IG5hc3R5IHN1cnByaXNlcyBmcm9tIHJlc2lkdWFsIHZhbHVlcy5cblxuTm93LCBteSBtaW5kIG5hdHVyYWxseSBqdW1wcyB0byB0aGUgYnJvYWRlciBwaWN0dXJlLiBIb3cgZG9lcyB0aGlzIGZpdCBpbnRvIHRoZSBiaWdnZXIgTmV0bGluayBtZXNzYWdpbmcgc2NoZW1lPyBMZXQncyBxdWlja2x5IHJldmlldyB0aGUgYG5ldGxpbmtfc2VuZG1zZ2AgYW5kIGBuZXRsaW5rX3JlY3Ztc2dgIGltcGxlbWVudGF0aW9ucy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoaXMgSENJLXNwZWNpZmljIGZ1bmN0aW9uIGFuZCB0aGUgbW9yZSBnZW5lcmljIE5ldGxpbmsgbGF5ZXIuIElzIHRoaXMgaW5pdGlhbGl6YXRpb24gY29uc2lzdGVudCBhY3Jvc3MgdGhlIE5ldGxpbmsgc3RhY2s/IEFyZSB0aGVyZSBhbnkgcG90ZW50aWFsIGdvdGNoYXMgSSBzaG91bGQgYmUgYXdhcmUgb2YgcmVnYXJkaW5nIG1lbW9yeSBtYW5hZ2VtZW50IG9yIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMgYXQgdGhlIE5ldGxpbmsgbGV2ZWwgdGhhdCBpbnRlcmFjdCB3aXRoIHRoaXMgYG1lbXNldGAgY2FsbD8gR29vZCB0byBrZWVwIHRoYXQgY29udGV4dCBzaGFycC4gSSBuZWVkIHRvIGVuc3VyZSBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzeXN0ZW0ncyBhcmNoaXRlY3R1cmUgaXMgdGhvcm91Z2ggdG8gZ2V0IHRoZSBmdWxsIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzMjA5LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozODozMi4wMDMxNzUwNzlaIiwiU2VxIjo1NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk4ODYwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxODI1LFxuICBcIkxpbmVDb3VudFwiOiAyMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxODI1OlxcdFxcdHN0cnVjdCBza19idWZmICpza2I7XFxuMTgyNjpcXHRcXHRpbnQgZXJyO1xcbjE4Mjc6XFx0XFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xcbjE4Mjg6XFx0XFx0dTMyIG5ldGxpbmtfc2tiX2ZsYWdzID0gMDtcXG4xODI5OlxcdFxcbjE4MzA6XFx0XFx0aWYgKG1zZy1cXHUwMDNlbXNnX2ZsYWdzIFxcdTAwMjYgTVNHX09PQilcXG4xODMxOlxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4xODMyOlxcdFxcbjE4MzM6XFx0XFx0aWYgKGxlbiA9PSAwKSB7XFxuMTgzNDpcXHRcXHRcXHRwcl93YXJuX29uY2UoXFxcIlplcm8gbGVuZ3RoIG1lc3NhZ2UgbGVhZHMgdG8gYW4gZW1wdHkgc2tiXFxcXG5cXFwiKTtcXG4xODM1OlxcdFxcdFxcdHJldHVybiAtRU5PREFUQTtcXG4xODM2OlxcdFxcdH1cXG4xODM3OlxcdFxcbjE4Mzg6XFx0XFx0ZXJyID0gc2NtX3NlbmQoc29jaywgbXNnLCBcXHUwMDI2c2NtLCB0cnVlKTtcXG4xODM5OlxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbjE4NDA6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4xODQxOlxcdFxcbjE4NDI6XFx0XFx0aWYgKG1zZy1cXHUwMDNlbXNnX25hbWVsZW4pIHtcXG4xODQzOlxcdFxcdFxcdGVyciA9IC1FSU5WQUw7XFxuMTg0NDpcXHRcXHRcXHRpZiAobXNnLVxcdTAwM2Vtc2dfbmFtZWxlbiBcXHUwMDNjIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmwpKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozODozMi4wMDM1ODAwMTlaIiwiU2VxIjo1NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTMwNDA1NDg1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gTmV0bGluayBNZXNzYWdlIEhhbmRsaW5nKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byB0aGUgTmV0bGluayBtZXNzYWdlIGZsb3cgYW5kIEknbSBzZWVpbmcgYG5ldGxpbmtfc2VuZG1zZ2AgY2FsbGluZyBgc2NtX3NlbmRgLiBOb3csIHRoYXQncyBpbnRlcmVzdGluZy4gVGhlIGNvZGUgdXNlcyBgbWVtc2V0YCBvbiBgc2NtYCB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gSSdtIHdvbmRlcmluZyB3aGF0IGlzIGJlaW5nIHNldCBhbmQgd2h5LiBUbyBnZXQgYSBiZXR0ZXIgZ3Jhc3Agb24gdGhlIHNlbmQgcGF0aCwgSSBzaG91bGQgcHJvYmFibHkgdW5kZXJzdGFuZCB0aGUgcmVjZWl2ZSBwYXRoIGFzIHdlbGwuIExldCdzIHNoaWZ0IG91ciBmb2N1cyBhbmQgc3RhcnQgd2l0aCBgbmV0bGlua19yZWN2bXNnYCB0byB1bmRlcnN0YW5kIGhvdyB0aGUgbWVzc2FnZXMgYXJlIHJlY2VpdmVkIGFuZCB3aGF0IGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gcGxheS4gSXQncyB0aW1lIHRvIGJ1aWxkIGEgY29tcGxldGUgcGljdHVyZSBvZiB0aGUgbWVzc2FnZSBsaWZlY3ljbGUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjMzODE3LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozODozNy4zMDc2Mzg4NzNaIiwiU2VxIjo1NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTgwMzkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxOTA1LFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxOTA1OlxcdH1cXG4xOTA2OlxcdFxcbjE5MDc6XFx0c3RhdGljIGludCBuZXRsaW5rX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLFxcbjE5MDg6XFx0XFx0XFx0XFx0ICAgaW50IGZsYWdzKVxcbjE5MDk6XFx0e1xcbjE5MTA6XFx0XFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xcbjE5MTE6XFx0XFx0c3RydWN0IHNvY2sgKnNrID0gc29jay1cXHUwMDNlc2s7XFxuMTkxMjpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xcbjE5MTM6XFx0XFx0c2l6ZV90IGNvcGllZCwgbWF4X3JlY3Ztc2dfbGVuO1xcbjE5MTQ6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKnNrYiwgKmRhdGFfc2tiO1xcbjE5MTU6XFx0XFx0aW50IGVyciwgcmV0O1xcbjE5MTY6XFx0XFxuMTkxNzpcXHRcXHRpZiAoZmxhZ3MgXFx1MDAyNiBNU0dfT09CKVxcbjE5MTg6XFx0XFx0XFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xcbjE5MTk6XFx0XFxuMTkyMDpcXHRcXHRjb3BpZWQgPSAwO1xcbjE5MjE6XFx0XFxuMTkyMjpcXHRcXHRza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsIFxcdTAwMjZlcnIpO1xcbjE5MjM6XFx0XFx0aWYgKHNrYiA9PSBOVUxMKVxcbjE5MjQ6XFx0XFx0XFx0Z290byBvdXQ7XFxuMTkyNTpcXHRcXG4xOTI2OlxcdFxcdGRhdGFfc2tiID0gc2tiO1xcbjE5Mjc6XFx0XFxuMTkyODpcXHQjaWZkZWYgQ09ORklHX0NPTVBBVF9ORVRMSU5LX01FU1NBR0VTXFxuMTkyOTpcXHRcXHRpZiAodW5saWtlbHkoc2tiX3NoaW5mbyhza2IpLVxcdTAwM2VmcmFnX2xpc3QpKSB7XFxuMTkzMDpcXHRcXHRcXHQvKlxcbjE5MzE6XFx0XFx0XFx0ICogSWYgdGhpcyBza2IgaGFzIGEgZnJhZ19saXN0LCB0aGVuIGhlcmUgdGhhdCBtZWFucyB0aGF0IHdlXFxuMTkzMjpcXHRcXHRcXHQgKiB3aWxsIGhhdmUgdG8gdXNlIHRoZSBmcmFnX2xpc3Qgc2tiJ3MgZGF0YSBmb3IgY29tcGF0IHRhc2tzXFxuMTkzMzpcXHRcXHRcXHQgKiBhbmQgdGhlIHJlZ3VsYXIgc2tiJ3MgZGF0YSBmb3Igbm9ybWFsIChub24tY29tcGF0KSB0YXNrcy5cXG4xOTM0OlxcdFxcdFxcdCAqXFxuMTkzNTpcXHRcXHRcXHQgKiBJZiB3ZSBuZWVkIHRvIHNlbmQgdGhlIGNvbXBhdCBza2IsIGFzc2lnbiBpdCB0byB0aGVcXG4xOTM2OlxcdFxcdFxcdCAqICdkYXRhX3NrYicgdmFyaWFibGUgc28gdGhhdCBpdCB3aWxsIGJlIHVzZWQgYmVsb3cgZm9yIGRhdGFcXG4xOTM3OlxcdFxcdFxcdCAqIGNvcHlpbmcuIFdlIGtlZXAgJ3NrYicgZm9yIGV2ZXJ5dGhpbmcgZWxzZSwgaW5jbHVkaW5nXFxuMTkzODpcXHRcXHRcXHQgKiBmcmVlaW5nIGJvdGggbGF0ZXIuXFxuMTkzOTpcXHRcXHRcXHQgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6Mzg6MzcuMzA3ODIxNDEzWiIsIlNlcSI6NTcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMzMjA4MzUxMzcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZCwgaW4gdGhlIGZpcnN0IHBlcnNvbiBhbmQgdGFyZ2V0ZWQgdG93YXJkcyBhbiBleHBlcnQ6XG5cbioqRGl2aW5nIERlZXBlciBpbnRvIGBuZXRsaW5rX3JlY3Ztc2dgKipcblxuQWxyaWdodCwgc28gd2UncmUgbG9va2luZyBhdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBgbmV0bGlua19yZWN2bXNnYCBmdW5jdGlvbiwgaHVoPyBMZXQncyBnZXQgZG93biB0byBicmFzcyB0YWNrcy4gSSd2ZSBnb3QgYSBwcmV0dHkgZ29vZCBncmFzcCBvZiB0aGUgTmV0bGluayBhcmNoaXRlY3R1cmUsIGFuZCBJJ20gaW50ZXJlc3RlZCBpbiBob3cgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNvbXBsZXhpdGllcyBvZiByZWNlaXZpbmcgbWVzc2FnZXMuIEknbSBrZWVuIHRvIHNlZSBob3cgdGhleSdyZSBtYW5hZ2luZyB0aGluZ3MgbGlrZSBzb2NrZXQgYWRkcmVzcyBzdHJ1Y3R1cmVzLCBidWZmZXIgbWFuYWdlbWVudCwgZXJyb3IgaGFuZGxpbmcsIGFuZCBvZiBjb3Vyc2UsIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSB1bmRlcmx5aW5nIG5ldHdvcmsgaW50ZXJmYWNlLiBNeSBpbnR1aXRpb24gdGVsbHMgbWUgd2UnbGwgYmUgZGVhbGluZyB3aXRoIHNvbWUgZGVsaWNhdGUgdGhyZWFkaW5nIGlzc3VlcyBwb3RlbnRpYWxseSwgcGFydGljdWxhcmx5IGlmIHRoZXkgYXJlIGhhbmRsaW5nIG11bHRpcGxlIHNvY2tldHMgb3IgY29ubmVjdGlvbnMuIEnigJltIHRoaW5raW5nIHRoZXJlIHdpbGwgYmUgbnVhbmNlcyBpbiBob3cgdGhleSBtYW5hZ2UgdGhlIHNvY2tldCdzIHJlY2VpdmUgYnVmZmVyLCBhbmQgd2hhdCB0aGUgZmxvdyBjb250cm9sIGxvb2tzIGxpa2UuIEknbSBhbHNvIGJldHRpbmcgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIE5ldGxpbmsgZmFtaWx5LXNwZWNpZmljIGhhbmRsZXJzIGlzIGdvaW5nIHRvIGJlIHBpdm90YWwgaGVyZS4gU28gbGV0J3MgY3JhY2sgdGhpcyBjb2RlLCBhbmQgc2VlIGV4YWN0bHkgd2hhdCBnZW1zIGFyZSBoaWRkZW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM0NTkzLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozODo0MC42Mjg2NTk2OFoiLCJTZXEiOjU4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzkwNzAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvYWZfbmV0bGluay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5NDAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5NDA6XFx0XFx0XFx0aWYgKGZsYWdzIFxcdTAwMjYgTVNHX0NNU0dfQ09NUEFUKVxcbjE5NDE6XFx0XFx0XFx0XFx0ZGF0YV9za2IgPSBza2Jfc2hpbmZvKHNrYiktXFx1MDAzZWZyYWdfbGlzdDtcXG4xOTQyOlxcdFxcdH1cXG4xOTQzOlxcdCNlbmRpZlxcbjE5NDQ6XFx0XFxuMTk0NTpcXHRcXHQvKiBSZWNvcmQgdGhlIG1heCBsZW5ndGggb2YgcmVjdm1zZygpIGNhbGxzIGZvciBmdXR1cmUgYWxsb2NhdGlvbnMgKi9cXG4xOTQ2OlxcdFxcdG1heF9yZWN2bXNnX2xlbiA9IG1heChSRUFEX09OQ0UobmxrLVxcdTAwM2VtYXhfcmVjdm1zZ19sZW4pLCBsZW4pO1xcbjE5NDc6XFx0XFx0bWF4X3JlY3Ztc2dfbGVuID0gbWluX3Qoc2l6ZV90LCBtYXhfcmVjdm1zZ19sZW4sXFxuMTk0ODpcXHRcXHRcXHRcXHRcXHRTS0JfV0lUSF9PVkVSSEVBRCgzMjc2OCkpO1xcbjE5NDk6XFx0XFx0V1JJVEVfT05DRShubGstXFx1MDAzZW1heF9yZWN2bXNnX2xlbiwgbWF4X3JlY3Ztc2dfbGVuKTtcXG4xOTUwOlxcdFxcbjE5NTE6XFx0XFx0Y29waWVkID0gZGF0YV9za2ItXFx1MDAzZWxlbjtcXG4xOTUyOlxcdFxcdGlmIChsZW4gXFx1MDAzYyBjb3BpZWQpIHtcXG4xOTUzOlxcdFxcdFxcdG1zZy1cXHUwMDNlbXNnX2ZsYWdzIHw9IE1TR19UUlVOQztcXG4xOTU0OlxcdFxcdFxcdGNvcGllZCA9IGxlbjtcXG4xOTU1OlxcdFxcdH1cXG4xOTU2OlxcdFxcbjE5NTc6XFx0XFx0ZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1fbXNnKGRhdGFfc2tiLCAwLCBtc2csIGNvcGllZCk7XFxuMTk1ODpcXHRcXG4xOTU5OlxcdFxcdGlmIChtc2ctXFx1MDAzZW1zZ19uYW1lKSB7XFxuMTk2MDpcXHRcXHRcXHRERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9ubCAqLCBhZGRyLCBtc2ctXFx1MDAzZW1zZ19uYW1lKTtcXG4xOTYxOlxcdFxcdFxcdGFkZHItXFx1MDAzZW5sX2ZhbWlseSA9IEFGX05FVExJTks7XFxuMTk2MjpcXHRcXHRcXHRhZGRyLVxcdTAwM2VubF9wYWQgICAgPSAwO1xcbjE5NjM6XFx0XFx0XFx0YWRkci1cXHUwMDNlbmxfcGlkXFx0PSBORVRMSU5LX0NCKHNrYikucG9ydGlkO1xcbjE5NjQ6XFx0XFx0XFx0YWRkci1cXHUwMDNlbmxfZ3JvdXBzXFx0PSBuZXRsaW5rX2dyb3VwX21hc2soTkVUTElOS19DQihza2IpLmRzdF9ncm91cCk7XFxuMTk2NTpcXHRcXHRcXHRtc2ctXFx1MDAzZW1zZ19uYW1lbGVuID0gc2l6ZW9mKCphZGRyKTtcXG4xOTY2OlxcdFxcdH1cXG4xOTY3OlxcdFxcbjE5Njg6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChSRUNWX1BLVElORk8sIHNrKSlcXG4xOTY5OlxcdFxcdFxcdG5ldGxpbmtfY21zZ19yZWN2X3BrdGluZm8obXNnLCBza2IpO1xcbjE5NzA6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChMSVNURU5fQUxMX05TSUQsIHNrKSlcXG4xOTcxOlxcdFxcdFxcdG5ldGxpbmtfY21zZ19saXN0ZW5fYWxsX25zaWQoc2ssIG1zZywgc2tiKTtcXG4xOTcyOlxcdFxcbjE5NzM6XFx0XFx0bWVtc2V0KFxcdTAwMjZzY20sIDAsIHNpemVvZihzY20pKTtcXG4xOTc0OlxcdFxcdHNjbS5jcmVkcyA9ICpORVRMSU5LX0NSRURTKHNrYik7XFxuMTk3NTpcXHRcXHRpZiAoZmxhZ3MgXFx1MDAyNiBNU0dfVFJVTkMpXFxuMTk3NjpcXHRcXHRcXHRjb3BpZWQgPSBkYXRhX3NrYi1cXHUwMDNlbGVuO1xcbjE5Nzc6XFx0XFxuMTk3ODpcXHRcXHRza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTtcXG4xOTc5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozODo0MC42Mjg4MDA0OFoiLCJTZXEiOjU5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo2NTg1Nzc1Mjg3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgYW5hbHl6aW5nIHRoYXQgY29kZTpcblxuKipBbmFseXppbmcgdGhlIEFGX1VOSVggU29ja2V0IENvZGUqKlxuXG5Pa2F5LCBzbyBJJ3ZlIHNwb3R0ZWQgYSBgbWVtc2V0YCBvbiBhIGBzY21gIHN0cnVjdHVyZSBhdCBsaW5lIDE5NzMuIEl0J3MgaW5pdGlhbGl6aW5nIHRoZSBzdHJ1Y3R1cmUgdG8gemVybywgd2hpY2ggaXMgcHJldHR5IHN0YW5kYXJkIHByYWN0aWNlIGZvciBzZWN1cml0eSBhbmQgY29uc2lzdGVuY3kgd2hlbiBkZWFsaW5nIHdpdGggc29ja2V0IGNvbnRyb2wgbWVzc2FnZXMuIE5vdyBJJ20gZ29pbmcgdG8gZGlnIGludG8gdGhlIGBuZXQvdW5peC9hZl91bml4LmNgIGZpbGUgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBgc2NtYCBpcyB1c2VkLlxuXG5JIG5lZWQgdG8gcXVpY2tseSBncmFzcCB0aGUgcmVsZXZhbnQgc2VuZCBhbmQgcmVjZWl2ZSBmdW5jdGlvbnMuIEknbGwgZm9jdXMgb24gYHVuaXhfZGdyYW1fc2VuZG1zZ2AsIGFuZCBgdW5peF9zdHJlYW1fc2VuZG1zZ2AgZm9yIHNlbmRpbmcsIGFuZCB0aGVuIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AsIGFuZCBgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljYCBmb3IgcmVjZWl2aW5nLiBJJ2xsIHNjcnV0aW5pemUgdGhvc2UgZnVuY3Rpb25zIHRvIHNlZSBob3cgYHNjbWAgaXMgYmVpbmcgdXNlZCBhbmQgd2h5IHRoYXQgemVybyBpbml0aWFsaXphdGlvbiBpcyBjcnVjaWFsIGluIHRoZSBjb250ZXh0IG9mIEFGX1VOSVggc29ja2V0IGNvbnRyb2wgbWVzc2FnZXMgYW5kIGRhdGEgdHJhbnNmZXIuIEdvdHRhIG1ha2Ugc3VyZSBub3RoaW5nIHVuZXhwZWN0ZWQgaGFwcGVucyB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBHb3R0YSBrZWVwIHRoZSBkYXRhIGluIG9yZGVyIGFuZCBzZWN1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM1NTkzLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NzgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozODo0Ny4yMTQ1NzgyMzdaIiwiU2VxIjo2MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTYwMDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMDk1LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMDk1OlxcdHN0YXRpYyBpbnQgdW5peF9kZ3JhbV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4yMDk2OlxcdFxcdFxcdFxcdCAgICAgIHNpemVfdCBsZW4pXFxuMjA5NzpcXHR7XFxuMjA5ODpcXHRcXHRzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLVxcdTAwM2VzaywgKm90aGVyID0gTlVMTDtcXG4yMDk5OlxcdFxcdHN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTtcXG4yMTAwOlxcdFxcdHN0cnVjdCBzY21fY29va2llIHNjbTtcXG4yMTAxOlxcdFxcdHN0cnVjdCBza19idWZmICpza2I7XFxuMjEwMjpcXHRcXHRpbnQgZGF0YV9sZW4gPSAwO1xcbjIxMDM6XFx0XFx0aW50IHNrX2xvY2tlZDtcXG4yMTA0OlxcdFxcdGxvbmcgdGltZW87XFxuMjEwNTpcXHRcXHRpbnQgZXJyO1xcbjIxMDY6XFx0XFxuMjEwNzpcXHRcXHRlcnIgPSBzY21fc2VuZChzb2NrLCBtc2csIFxcdTAwMjZzY20sIGZhbHNlKTtcXG4yMTA4OlxcdFxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbjIxMDk6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4yMTEwOlxcdFxcbjIxMTE6XFx0XFx0aWYgKG1zZy1cXHUwMDNlbXNnX2ZsYWdzIFxcdTAwMjYgTVNHX09PQikge1xcbjIxMTI6XFx0XFx0XFx0ZXJyID0gLUVPUE5PVFNVUFA7XFxuMjExMzpcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTE0OlxcdFxcdH1cXG4yMTE1OlxcdFxcbjIxMTY6XFx0XFx0aWYgKG1zZy1cXHUwMDNlbXNnX25hbWVsZW4pIHtcXG4yMTE3OlxcdFxcdFxcdGVyciA9IHVuaXhfdmFsaWRhdGVfYWRkcihtc2ctXFx1MDAzZW1zZ19uYW1lLCBtc2ctXFx1MDAzZW1zZ19uYW1lbGVuKTtcXG4yMTE4OlxcdFxcdFxcdGlmIChlcnIpXFxuMjExOTpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTIwOlxcdFxcbjIxMjE6XFx0XFx0XFx0ZXJyID0gQlBGX0NHUk9VUF9SVU5fUFJPR19VTklYX1NFTkRNU0dfTE9DSyhzayxcXG4yMTIyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBtc2ctXFx1MDAzZW1zZ19uYW1lLFxcbjIxMjM6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIFxcdTAwMjZtc2ctXFx1MDAzZW1zZ19uYW1lbGVuLFxcbjIxMjQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE5VTEwpO1xcbjIxMjU6XFx0XFx0XFx0aWYgKGVycilcXG4yMTI2OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjIxMjc6XFx0XFx0fVxcbjIxMjg6XFx0XFxuMjEyOTpcXHRcXHRpZiAodW5peF9tYXlfcGFzc2NyZWQoc2spIFxcdTAwMjZcXHUwMDI2ICFSRUFEX09OQ0UodS1cXHUwMDNlYWRkcikpIHtcXG4yMTMwOlxcdFxcdFxcdGVyciA9IHVuaXhfYXV0b2JpbmQoc2spO1xcbjIxMzE6XFx0XFx0XFx0aWYgKGVycilcXG4yMTMyOlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjIxMzM6XFx0XFx0fVxcbjIxMzQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM4OjQ3LjIxNDczOTkxN1oiLCJTZXEiOjYxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MzMwMzA0NTcyMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRob3NlIHRob3VnaHRzLCBwcmVzZW50ZWQgYXMgYSBmaXJzdC1wZXJzb24gZXhwZXJ0IHN1bW1hcnk6XG5cbioqRGlnZ2luZyBpbnRvIFNvY2tldCBTZW5kIE9wZXJhdGlvbnMqKlxuXG5BbHJpZ2h0LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGxvdy1sZXZlbCBzb2NrZXQgb3BlcmF0aW9ucywgc3BlY2lmaWNhbGx5IHRoZSBgc2VuZG1zZ2AgZmFtaWx5LiBJJ20gZm9jdXNpbmcgb24gdGhlIFVuaXggZG9tYWluIHNvY2tldHMsIG5hdHVyYWxseS4gSSBrbm93IGB1bml4X2RncmFtX3NlbmRtc2dgIGNhbGxzIGBzY21fc2VuZGAgdG8gaGFuZGxlIHRoZSBhbmNpbGxhcnkgZGF0YS4gQW5kIEkgcmVjYWxsIHRoYXQgYHNjbV9zZW5kYCBzdGFydHMgYnkgdXNpbmcgYG1lbXNldGAgb24gdGhlIGBzY21gIHN0cnVjdHVyZS4gVGhhdCdzIGdvb2QsIHByZWRpY3RhYmxlIGJlaGF2aW9yIOKAkyBlbnN1cmluZyBhIGNsZWFuIHNsYXRlIGJlZm9yZSBwb3B1bGF0aW5nIHRoZSBjb250cm9sIG1lc3NhZ2UuIE15IGJyYWluJ3Mgbm93IGFza2luZzogd2hhdCBhYm91dCB0aGUgc3RyZWFtIHNvY2tldHM/IEkgd29uZGVyIGlmIGB1bml4X3N0cmVhbV9zZW5kbXNnYCBoYXMgc2ltaWxhciBiZWhhdmlvciBpbiB0aGF0IGl0IHVzZXMgYHNjbV9zZW5kYCwgb3IgaWYgaXQgaGFuZGxlcyB0aGUgYW5jaWxsYXJ5IGRhdGEgZGlmZmVyZW50bHkgZHVlIHRvIHRoZSBjb25uZWN0aW9uLW9yaWVudGVkIG5hdHVyZSBvZiB0aGUgc3RyZWFtIHNvY2tldHMuIFRoZXJlIG1pZ2h0IGJlIHNvbWUgc3VidGxlIGRpZmZlcmVuY2VzIHRvIGtlZXAgaW4gbWluZCwgYW5kIEkgc2hvdWxkIHJlYWxseSBtYWtlIGEgbm90ZSB0byBjaGVjayB0aGF0IGNvZGUgcGF0aCB0b28uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM2NTA4LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozOTozMC41MTc3ODgwNDhaIiwiU2VxIjo2MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzM2NDIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMzg5LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMzg5OlxcdHN0YXRpYyBpbnQgdW5peF9zdHJlYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuMjM5MDpcXHRcXHRcXHRcXHQgICAgICAgc2l6ZV90IGxlbilcXG4yMzkxOlxcdHtcXG4yMzkyOlxcdFxcdHN0cnVjdCBzb2NrICpzayA9IHNvY2stXFx1MDAzZXNrO1xcbjIzOTM6XFx0XFx0c3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7XFxuMjM5NDpcXHRcXHRzdHJ1Y3Qgc29jayAqb3RoZXIgPSBOVUxMO1xcbjIzOTU6XFx0XFx0c3RydWN0IHVuaXhfc29jayAqb3RoZXJ1O1xcbjIzOTY6XFx0XFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xcbjIzOTc6XFx0XFx0Ym9vbCBmZHNfc2VudCA9IGZhbHNlO1xcbjIzOTg6XFx0XFx0aW50IGVyciwgc2VudCA9IDA7XFxuMjM5OTpcXHRcXG4yNDAwOlxcdFxcdGVyciA9IHNjbV9zZW5kKHNvY2ssIG1zZywgXFx1MDAyNnNjbSwgZmFsc2UpO1xcbjI0MDE6XFx0XFx0aWYgKGVyciBcXHUwMDNjIDApXFxuMjQwMjpcXHRcXHRcXHRyZXR1cm4gZXJyO1xcbjI0MDM6XFx0XFxuMjQwNDpcXHRcXHRpZiAobXNnLVxcdTAwM2Vtc2dfZmxhZ3MgXFx1MDAyNiBNU0dfT09CKSB7XFxuMjQwNTpcXHRcXHRcXHRlcnIgPSAtRU9QTk9UU1VQUDtcXG4yNDA2OlxcdCNpZiBJU19FTkFCTEVEKENPTkZJR19BRl9VTklYX09PQilcXG4yNDA3OlxcdFxcdFxcdGlmIChsZW4pXFxuMjQwODpcXHRcXHRcXHRcXHRsZW4tLTtcXG4yNDA5OlxcdFxcdFxcdGVsc2VcXG4yNDEwOlxcdCNlbmRpZlxcbjI0MTE6XFx0XFx0XFx0XFx0Z290byBvdXRfZXJyO1xcbjI0MTI6XFx0XFx0fVxcbjI0MTM6XFx0XFxuMjQxNDpcXHRcXHRpZiAobXNnLVxcdTAwM2Vtc2dfbmFtZWxlbikge1xcbjI0MTU6XFx0XFx0XFx0ZXJyID0gUkVBRF9PTkNFKHNrLVxcdTAwM2Vza19zdGF0ZSkgPT0gVENQX0VTVEFCTElTSEVEID8gLUVJU0NPTk4gOiAtRU9QTk9UU1VQUDtcXG4yNDE2OlxcdFxcdFxcdGdvdG8gb3V0X2VycjtcXG4yNDE3OlxcdFxcdH1cXG4yNDE4OlxcdFxcbjI0MTk6XFx0XFx0b3RoZXIgPSB1bml4X3BlZXIoc2spO1xcbjI0MjA6XFx0XFx0aWYgKCFvdGhlcikge1xcbjI0MjE6XFx0XFx0XFx0ZXJyID0gLUVOT1RDT05OO1xcbjI0MjI6XFx0XFx0XFx0Z290byBvdXRfZXJyO1xcbjI0MjM6XFx0XFx0fVxcbjI0MjQ6XFx0XFxuMjQyNTpcXHRcXHRvdGhlcnUgPSB1bml4X3NrKG90aGVyKTtcXG4yNDI2OlxcdFxcbjI0Mjc6XFx0XFx0aWYgKFJFQURfT05DRShzay1cXHUwMDNlc2tfc2h1dGRvd24pIFxcdTAwMjYgU0VORF9TSFVURE9XTilcXG4yNDI4OlxcdFxcdFxcdGdvdG8gb3V0X3BpcGU7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM5OjMwLjUxODEyNjg0OFoiLCJTZXEiOjYzLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo4NDI4NjkzNjY1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHByZXNlbnRlZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZTpcblxuKipEaXZpbmcgaW50byB0aGUgVW5peCBTb2NrZXQgSW1wbGVtZW50YXRpb24qKlxuXG5SaWdodCwgYHVuaXhfc3RyZWFtX3NlbmRtc2dgIGhhcyBtZSBpbnRlcmVzdGVkLiBJdCBsb29rcyBsaWtlIGl0IHV0aWxpemVzIGBzY21fc2VuZGAsIGFuZCB0aGF0IGZ1bmN0aW9uJ3MgbWVtc2V0dGluZyBvZiBgc2NtYCBpcyBzb21ldGhpbmcgSSBuZWVkIHRvIGtlZXAgaW4gbWluZC4gSSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyBtb3JlIGRlZXBseS4gTm93IEknbSBnb2luZyB0byBsb29rIGF0IHRoZSBjb3JyZXNwb25kaW5nIHJlY2VpdmUgcGF0aC4gSSdsbCBuZWVkIHRvIGNoZWNrIGhvdyB0aGUgZGF0YWdyYW0gY2FzZSBpcyBoYW5kbGVkLCBzcGVjaWZpY2FsbHkgYF9fdW5peF9kZ3JhbV9yZWN2bXNnYC4gVGhlbiwgdG8gcm91bmQgdGhpbmdzIG91dCwgSSdsbCBuZWVkIHRvIGZvbGxvdyBob3cgdGhlIHN0cmVhbSBkYXRhIGlzIHJlYWQgaW4gZ2VuZXJhbCwgc28gbGV0J3MgY2hlY2sgYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AuIFRoYXQgc2hvdWxkIGdpdmUgbWUgYSBnb29kIGhhbmRsZSBvbiB0aGUgY29tcGxldGUgZGF0YSBmbG93LiBUaGlzIHdpbGwgbGlrZWx5IGV4cG9zZSB0aGUgaW50ZXJhY3Rpb24gYW5kIHN5bmNocm9uaXphdGlvbiBhcm91bmQgdGhvc2UgU0NNIHN0cnVjdHVyZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM3MzU1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDYsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozOTozOC45NDY4MjQ1MDNaIiwiU2VxIjo2NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mjg0NjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNTc0LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNTc0OlxcdGludCBfX3VuaXhfZGdyYW1fcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsXFxuMjU3NTpcXHRcXHRcXHRcXHQgaW50IGZsYWdzKVxcbjI1NzY6XFx0e1xcbjI1Nzc6XFx0XFx0c3RydWN0IHNjbV9jb29raWUgc2NtO1xcbjI1Nzg6XFx0XFx0c3RydWN0IHNvY2tldCAqc29jayA9IHNrLVxcdTAwM2Vza19zb2NrZXQ7XFxuMjU3OTpcXHRcXHRzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7XFxuMjU4MDpcXHRcXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbGFzdDtcXG4yNTgxOlxcdFxcdGxvbmcgdGltZW87XFxuMjU4MjpcXHRcXHRpbnQgc2tpcDtcXG4yNTgzOlxcdFxcdGludCBlcnI7XFxuMjU4NDpcXHRcXG4yNTg1OlxcdFxcdGVyciA9IC1FT1BOT1RTVVBQO1xcbjI1ODY6XFx0XFx0aWYgKGZsYWdzXFx1MDAyNk1TR19PT0IpXFxuMjU4NzpcXHRcXHRcXHRnb3RvIG91dDtcXG4yNTg4OlxcdFxcbjI1ODk6XFx0XFx0dGltZW8gPSBzb2NrX3JjdnRpbWVvKHNrLCBmbGFncyBcXHUwMDI2IE1TR19ET05UV0FJVCk7XFxuMjU5MDpcXHRcXG4yNTkxOlxcdFxcdGRvIHtcXG4yNTkyOlxcdFxcdFxcdG11dGV4X2xvY2soXFx1MDAyNnUtXFx1MDAzZWlvbG9jayk7XFxuMjU5MzpcXHRcXG4yNTk0OlxcdFxcdFxcdHNraXAgPSBza19wZWVrX29mZnNldChzaywgZmxhZ3MpO1xcbjI1OTU6XFx0XFx0XFx0c2tiID0gX19za2JfdHJ5X3JlY3ZfZGF0YWdyYW0oc2ssIFxcdTAwMjZzay1cXHUwMDNlc2tfcmVjZWl2ZV9xdWV1ZSwgZmxhZ3MsXFxuMjU5NjpcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBcXHUwMDI2c2tpcCwgXFx1MDAyNmVyciwgXFx1MDAyNmxhc3QpO1xcbjI1OTc6XFx0XFx0XFx0aWYgKHNrYikge1xcbjI1OTg6XFx0XFx0XFx0XFx0aWYgKCEoZmxhZ3MgXFx1MDAyNiBNU0dfUEVFSykpXFxuMjU5OTpcXHRcXHRcXHRcXHRcXHRzY21fc3RhdF9kZWwoc2ssIHNrYik7XFxuMjYwMDpcXHRcXHRcXHRcXHRicmVhaztcXG4yNjAxOlxcdFxcdFxcdH1cXG4yNjAyOlxcdFxcbjI2MDM6XFx0XFx0XFx0bXV0ZXhfdW5sb2NrKFxcdTAwMjZ1LVxcdTAwM2Vpb2xvY2spO1xcbjI2MDQ6XFx0XFxuMjYwNTpcXHRcXHRcXHRpZiAoZXJyICE9IC1FQUdBSU4pXFxuMjYwNjpcXHRcXHRcXHRcXHRicmVhaztcXG4yNjA3OlxcdFxcdH0gd2hpbGUgKHRpbWVvIFxcdTAwMjZcXHUwMDI2XFxuMjYwODpcXHRcXHRcXHQgIV9fc2tiX3dhaXRfZm9yX21vcmVfcGFja2V0cyhzaywgXFx1MDAyNnNrLVxcdTAwM2Vza19yZWNlaXZlX3F1ZXVlLFxcbjI2MDk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgXFx1MDAyNmVyciwgXFx1MDAyNnRpbWVvLCBsYXN0KSk7XFxuMjYxMDpcXHRcXG4yNjExOlxcdFxcdGlmICghc2tiKSB7IC8qIGltcGxpZXMgaW9sb2NrIHVubG9ja2VkICovXFxuMjYxMjpcXHRcXHRcXHQvKiBTaWduYWwgRU9GIG9uIGRpc2Nvbm5lY3RlZCBub24tYmxvY2tpbmcgU0VRUEFDS0VUIHNvY2tldC4gKi9cXG4yNjEzOlxcdFxcdFxcdGlmIChzay1cXHUwMDNlc2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCBcXHUwMDI2XFx1MDAyNiBlcnIgPT0gLUVBR0FJTiBcXHUwMDI2XFx1MDAyNlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozOTozOC45NDcxMTE4NTNaIiwiU2VxIjo2NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTgzMjU4ODQyOTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgYW5hbHl6aW5nIHRoYXQgY29kZSBzbmlwcGV0OlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBgX191bml4X2RncmFtX3JlY3Ztc2dgKipcblxuT2theSwgc28gd2UncmUgbG9va2luZyBhdCB0aGUgcmVtYWluZGVyIG9mIHRoZSBgX191bml4X2RncmFtX3JlY3Ztc2dgIGZ1bmN0aW9uLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgY29tcGxldGUgb3BlcmF0aW9uYWwgZmxvdyB0byB0cnVseSBncmFzcCBpdHMgaW1wbGljYXRpb25zIGZvciB0aGUgb3ZlcmFsbCBzeXN0ZW0gYmVoYXZpb3IuIFdoYXQgYXJlIHRoZSBzcGVjaWZpYyBjb25kaXRpb25zIHRoYXQgdHJpZ2dlciBwYXJ0aWN1bGFyIHBhdGhzIHdpdGhpbiB0aGlzIHJvdXRpbmU/IEhvdyBkb2VzIGl0IGhhbmRsZSBwb3RlbnRpYWwgZXJyb3JzLCBhbmQgd2hhdCBhcmUgdGhlIGltcGxpY2F0aW9ucyBvZiB0aG9zZSBlcnJvciBjb25kaXRpb25zPyBBcmUgdGhlcmUgYW55IHN1YnRsZSByYWNlIGNvbmRpdGlvbnMgb3IgY29uY3VycmVuY3kgaXNzdWVzIHRoYXQgbWlnaHQgZW1lcmdlIHdpdGhpbiB0aGlzIGZ1bmN0aW9uPyBJJ2xsIG5lZWQgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgaG93IGRhdGEgaXMgdmFsaWRhdGVkIGFuZCBjb3BpZWQsIGFzIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9ucyBhcmUgb2Z0ZW4gYSBzb3VyY2Ugb2YgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gTm93LCBsZXQncyBzdGFydCBkaXNzZWN0aW5nIGl0IGxpbmUgYnkgbGluZSwgcGF5aW5nIGNsb3NlIGF0dGVudGlvbiB0byBkYXRhIHN0cnVjdHVyZSBpbnRlcmFjdGlvbnMuIFRoZSBjcml0aWNhbCBwYXRoIHdvdWxkIGJlIHdoZXJlIHRoZSBkYXRhIGdldHMgbWFyc2hhbGVkLCBhbmQgaWYgYW55IGxvY2tzIGFyZSBuZWVkZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM4MjQ1LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjozOTo1Ny4yNzI5OTk1MzlaIiwiU2VxIjo2NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjUxMDkwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNjUwLFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNjUwOlxcdFxcdFxcdFxcdHVuaXhfZGV0YWNoX2ZkcyhcXHUwMDI2c2NtLCBza2IpO1xcbjI2NTE6XFx0XFxuMjY1MjpcXHRcXHRcXHRza19wZWVrX29mZnNldF9id2Qoc2ssIHNrYi1cXHUwMDNlbGVuKTtcXG4yNjUzOlxcdFxcdH0gZWxzZSB7XFxuMjY1NDpcXHRcXHRcXHQvKiBJdCBpcyBxdWVzdGlvbmFibGU6IG9uIFBFRUsgd2UgY291bGQ6XFxuMjY1NTpcXHRcXHRcXHQgICAtIGRvIG5vdCByZXR1cm4gZmRzIC0gZ29vZCwgYnV0IHRvbyBzaW1wbGUgOClcXG4yNjU2OlxcdFxcdFxcdCAgIC0gcmV0dXJuIGZkcywgYW5kIGRvIG5vdCByZXR1cm4gdGhlbSBvbiByZWFkIChvbGQgc3RyYXRlZ3ksXFxuMjY1NzpcXHRcXHRcXHQgICAgIGFwcGFyZW50bHkgd3JvbmcpXFxuMjY1ODpcXHRcXHRcXHQgICAtIGNsb25lIGZkcyAoSSBjaG9zZSBpdCBmb3Igbm93LCBpdCBpcyB0aGUgbW9zdCB1bml2ZXJzYWxcXG4yNjU5OlxcdFxcdFxcdCAgICAgc29sdXRpb24pXFxuMjY2MDpcXHRcXG4yNjYxOlxcdFxcdFxcdCAgIFBPU0lYIDEwMDMuMWcgZG9lcyBub3QgYWN0dWFsbHkgZGVmaW5lIHRoaXMgY2xlYXJseVxcbjI2NjI6XFx0XFx0XFx0ICAgYXQgYWxsLiBQT1NJWCAxMDAzLjFnIGRvZXNuJ3QgZGVmaW5lIGEgbG90IG9mIHRoaW5nc1xcbjI2NjM6XFx0XFx0XFx0ICAgY2xlYXJseSBob3dldmVyIVxcbjI2NjQ6XFx0XFxuMjY2NTpcXHRcXHRcXHQqL1xcbjI2NjY6XFx0XFxuMjY2NzpcXHRcXHRcXHRza19wZWVrX29mZnNldF9md2Qoc2ssIHNpemUpO1xcbjI2Njg6XFx0XFxuMjY2OTpcXHRcXHRcXHRpZiAoVU5JWENCKHNrYikuZnApXFxuMjY3MDpcXHRcXHRcXHRcXHR1bml4X3BlZWtfZmRzKFxcdTAwMjZzY20sIHNrYik7XFxuMjY3MTpcXHRcXHR9XFxuMjY3MjpcXHRcXHRlcnIgPSAoZmxhZ3MgXFx1MDAyNiBNU0dfVFJVTkMpID8gc2tiLVxcdTAwM2VsZW4gLSBza2lwIDogc2l6ZTtcXG4yNjczOlxcdFxcbjI2NzQ6XFx0XFx0c2NtX3JlY3ZfdW5peChzb2NrLCBtc2csIFxcdTAwMjZzY20sIGZsYWdzKTtcXG4yNjc1OlxcdFxcbjI2NzY6XFx0b3V0X2ZyZWU6XFxuMjY3NzpcXHRcXHRza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTtcXG4yNjc4OlxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2dS1cXHUwMDNlaW9sb2NrKTtcXG4yNjc5OlxcdG91dDpcXG4yNjgwOlxcdFxcdHJldHVybiBlcnI7XFxuMjY4MTpcXHR9XFxuMjY4MjpcXHRcXG4yNjgzOlxcdHN0YXRpYyBpbnQgdW5peF9kZ3JhbV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsXFxuMjY4NDpcXHRcXHRcXHRcXHQgICAgICBpbnQgZmxhZ3MpXFxuMjY4NTpcXHR7XFxuMjY4NjpcXHRcXHRzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLVxcdTAwM2VzaztcXG4yNjg3OlxcdFxcbjI2ODg6XFx0I2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxcbjI2ODk6XFx0XFx0Y29uc3Qgc3RydWN0IHByb3RvICpwcm90ID0gUkVBRF9PTkNFKHNrLVxcdTAwM2Vza19wcm90KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6Mzk6NTcuMjczMjUzNjA5WiIsIlNlcSI6NjcsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIwNzgyMDQyMTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgX191bml4X2RncmFtX3JlY3Ztc2dgIEluaXRpYWxpemF0aW9uKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBzY21gIGlzIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgYF9fdW5peF9kZ3JhbV9yZWN2bXNnYCBmdW5jdGlvbi4gTGV0J3MgZ2V0IHJpZ2h0IHRvIGl0LiBJJ20gZ29pbmcgdG8gc3RhcnQgYnkgZXhhbWluaW5nIGxpbmVzIDI2MTUtMjY1MCBvZiB0aGF0IGZ1bmN0aW9uLiBUaGF0J3MgdXN1YWxseSBhIGdvb2QgcGxhY2UgdG8gc3RhcnQgZm9yIHRoaXMga2luZCBvZiB0aGluZy4gTGV0J3Mgc2VlIHdoYXQgdGhlIGNvZGUgaXMgdGVsbGluZyB1cy4gSSdsbCBuZWVkIHRvIGxvb2sgY2xvc2VseSBhdCBob3cgdGhlIGNvbnRyb2wgbWVzc2FnZSBkYXRhIGlzIGhhbmRsZWQgYW5kIGFsbG9jYXRlZCwgcGFydGljdWxhcmx5IGZvY3VzaW5nIG9uIGFueSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zIG9yIHJlc291cmNlIGxpbWl0YXRpb25zLiBUaGlzIGlzIGxpa2VseSB3aGVyZSB0aGUgY29yZSBvZiB0aGUgcHJvYmxlbSBsaWVzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozOTEwMSwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUxLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6Mzk6NTkuMzUxNDYzNDNaIiwiU2VxIjo2OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjY5MDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNjI1LFxuICBcIkxpbmVDb3VudFwiOiAzMFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyNjI1OlxcdFxcdFxcdHVuaXhfY29weV9hZGRyKG1zZywgc2tiLVxcdTAwM2Vzayk7XFxuMjYyNjpcXHRcXG4yNjI3OlxcdFxcdFxcdEJQRl9DR1JPVVBfUlVOX1BST0dfVU5JWF9SRUNWTVNHX0xPQ0soc2ssXFxuMjYyODpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgICBtc2ctXFx1MDAzZW1zZ19uYW1lLFxcbjI2Mjk6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgXFx1MDAyNm1zZy1cXHUwMDNlbXNnX25hbWVsZW4pO1xcbjI2MzA6XFx0XFx0fVxcbjI2MzE6XFx0XFxuMjYzMjpcXHRcXHRpZiAoc2l6ZSBcXHUwMDNlIHNrYi1cXHUwMDNlbGVuIC0gc2tpcClcXG4yNjMzOlxcdFxcdFxcdHNpemUgPSBza2ItXFx1MDAzZWxlbiAtIHNraXA7XFxuMjYzNDpcXHRcXHRlbHNlIGlmIChzaXplIFxcdTAwM2Mgc2tiLVxcdTAwM2VsZW4gLSBza2lwKVxcbjI2MzU6XFx0XFx0XFx0bXNnLVxcdTAwM2Vtc2dfZmxhZ3MgfD0gTVNHX1RSVU5DO1xcbjI2MzY6XFx0XFxuMjYzNzpcXHRcXHRlcnIgPSBza2JfY29weV9kYXRhZ3JhbV9tc2coc2tiLCBza2lwLCBtc2csIHNpemUpO1xcbjI2Mzg6XFx0XFx0aWYgKGVycilcXG4yNjM5OlxcdFxcdFxcdGdvdG8gb3V0X2ZyZWU7XFxuMjY0MDpcXHRcXG4yNjQxOlxcdFxcdGlmIChzb2NrX2ZsYWcoc2ssIFNPQ0tfUkNWVFNUQU1QKSlcXG4yNjQyOlxcdFxcdFxcdF9fc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpO1xcbjI2NDM6XFx0XFxuMjY0NDpcXHRcXHRtZW1zZXQoXFx1MDAyNnNjbSwgMCwgc2l6ZW9mKHNjbSkpO1xcbjI2NDU6XFx0XFxuMjY0NjpcXHRcXHR1bml4X3NrYl90b19zY20oc2tiLCBcXHUwMDI2c2NtKTtcXG4yNjQ3OlxcdFxcbjI2NDg6XFx0XFx0aWYgKCEoZmxhZ3MgXFx1MDAyNiBNU0dfUEVFSykpIHtcXG4yNjQ5OlxcdFxcdFxcdGlmIChVTklYQ0Ioc2tiKS5mcClcXG4yNjUwOlxcdFxcdFxcdFxcdHVuaXhfZGV0YWNoX2ZkcyhcXHUwMDI2c2NtLCBza2IpO1xcbjI2NTE6XFx0XFxuMjY1MjpcXHRcXHRcXHRza19wZWVrX29mZnNldF9id2Qoc2ssIHNrYi1cXHUwMDNlbGVuKTtcXG4yNjUzOlxcdFxcdH0gZWxzZSB7XFxuMjY1NDpcXHRcXHRcXHQvKiBJdCBpcyBxdWVzdGlvbmFibGU6IG9uIFBFRUsgd2UgY291bGQ6XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjM5OjU5LjM1MTczNjgzWiIsIlNlcSI6NjksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjEwMDE1ODcwODEyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljYCBhZnRlciBTQ00gSW5pdGlhbGl6YXRpb24qKlxuXG5Pa2F5LCBzbyBJJ3ZlIGp1c3QgemVyb2VkIG91dCB0aGUgYHNjbWAgc3RydWN0IHdpdGggYG1lbXNldGAgYW5kIHRoZW4gcG9wdWxhdGVkIGl0IHdpdGggYHVuaXhfc2tiX3RvX3NjbWAgdXNpbmcgdGhlIGN1cnJlbnQgYHNrYmAuIFRoYXQncyBzdGFuZGFyZCBpbml0aWFsaXphdGlvbiwgZW5zdXJpbmcgYSBjbGVhbiBzbGF0ZSBiZWZvcmUgcG90ZW50aWFsbHkgcmVhZGluZyBjb250cm9sIGRhdGEuIE5vdywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCdzIGhhcHBlbmluZyB3aXRoaW4gYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AuIEknbSBnb2luZyB0byBjYXJlZnVsbHkgdHJhY2UgaXRzIGxvZ2ljIGFuZCBob3cgaXQgaW50ZXJhY3RzIHdpdGggdGhlIGluaXRpYWxpemVkIGBzY21gLiBJIGV4cGVjdCBpdCdsbCB1c2UgdGhpcyBgc2NtYCBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgaG93IHRoZSByZWFkIG9wZXJhdGlvbiBwcm9jZWVkcywgcGFydGljdWxhcmx5IHdpdGggcmVzcGVjdCB0byBhbnkgYXR0YWNoZWQgYW5jaWxsYXJ5IGRhdGEgb3IgY29udHJvbCBtZXNzYWdlcy4gVGltZSB0byBkaXZlIGluIGFuZCBzZWUgaG93IHRoZSBkYXRhIGZsb3cgaXMgaGFuZGxlZCBmcm9tIGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM5ODEyLCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTMsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MDowOS4zNjc2MTA2NzJaIiwiU2VxIjo3MCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjQxNzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC91bml4L2FmX3VuaXguY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyOTI1LFxuICBcIkxpbmVDb3VudFwiOiA0NVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyOTI1OlxcdFxcdHN0cnVjdCBzb2NrICpzayA9IHNvY2stXFx1MDAzZXNrO1xcbjI5MjY6XFx0XFx0c2l6ZV90IHNpemUgPSBzdGF0ZS1cXHUwMDNlc2l6ZTtcXG4yOTI3OlxcdFxcdGludCBmbGFncyA9IHN0YXRlLVxcdTAwM2VmbGFncztcXG4yOTI4OlxcdFxcdGJvb2wgY2hlY2tfY3JlZHMgPSBmYWxzZTtcXG4yOTI5OlxcdFxcdHN0cnVjdCBzY21fY29va2llIHNjbTtcXG4yOTMwOlxcdFxcdHN0cnVjdCB1bml4X3NvY2sgKnU7XFxuMjkzMTpcXHRcXHRpbnQgY29waWVkID0gMDtcXG4yOTMyOlxcdFxcdGludCBlcnIgPSAwO1xcbjI5MzM6XFx0XFx0bG9uZyB0aW1lbztcXG4yOTM0OlxcdFxcdGludCB0YXJnZXQ7XFxuMjkzNTpcXHRcXHRpbnQgc2tpcDtcXG4yOTM2OlxcdFxcbjI5Mzc6XFx0XFx0aWYgKHVubGlrZWx5KFJFQURfT05DRShzay1cXHUwMDNlc2tfc3RhdGUpICE9IFRDUF9FU1RBQkxJU0hFRCkpIHtcXG4yOTM4OlxcdFxcdFxcdGVyciA9IC1FSU5WQUw7XFxuMjkzOTpcXHRcXHRcXHRnb3RvIG91dDtcXG4yOTQwOlxcdFxcdH1cXG4yOTQxOlxcdFxcbjI5NDI6XFx0XFx0aWYgKHVubGlrZWx5KGZsYWdzIFxcdTAwMjYgTVNHX09PQikpIHtcXG4yOTQzOlxcdFxcdFxcdGVyciA9IC1FT1BOT1RTVVBQO1xcbjI5NDQ6XFx0I2lmIElTX0VOQUJMRUQoQ09ORklHX0FGX1VOSVhfT09CKVxcbjI5NDU6XFx0XFx0XFx0ZXJyID0gdW5peF9zdHJlYW1fcmVjdl91cmcoc3RhdGUpO1xcbjI5NDY6XFx0I2VuZGlmXFxuMjk0NzpcXHRcXHRcXHRnb3RvIG91dDtcXG4yOTQ4OlxcdFxcdH1cXG4yOTQ5OlxcdFxcbjI5NTA6XFx0XFx0dGFyZ2V0ID0gc29ja19yY3Zsb3dhdChzaywgZmxhZ3MgXFx1MDAyNiBNU0dfV0FJVEFMTCwgc2l6ZSk7XFxuMjk1MTpcXHRcXHR0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIG5vYmxvY2spO1xcbjI5NTI6XFx0XFxuMjk1MzpcXHRcXHRtZW1zZXQoXFx1MDAyNnNjbSwgMCwgc2l6ZW9mKHNjbSkpO1xcbjI5NTQ6XFx0XFxuMjk1NTpcXHRcXHR1ID0gdW5peF9zayhzayk7XFxuMjk1NjpcXHRcXG4yOTU3OlxcdHJlZG86XFxuMjk1ODpcXHRcXHQvKiBMb2NrIHRoZSBzb2NrZXQgdG8gcHJldmVudCBxdWV1ZSBkaXNvcmRlcmluZ1xcbjI5NTk6XFx0XFx0ICogd2hpbGUgc2xlZXBzIGluIG1lbWNweV90b21zZ1xcbjI5NjA6XFx0XFx0ICovXFxuMjk2MTpcXHRcXHRtdXRleF9sb2NrKFxcdTAwMjZ1LVxcdTAwM2Vpb2xvY2spO1xcbjI5NjI6XFx0XFxuMjk2MzpcXHRcXHRza2lwID0gbWF4KHNrX3BlZWtfb2Zmc2V0KHNrLCBmbGFncyksIDApO1xcbjI5NjQ6XFx0XFxuMjk2NTpcXHRcXHRkbyB7XFxuMjk2NjpcXHRcXHRcXHRzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbGFzdDtcXG4yOTY3OlxcdFxcdFxcdGludCBjaHVuaztcXG4yOTY4OlxcdFxcbjI5Njk6XFx0XFx0XFx0dW5peF9zdGF0ZV9sb2NrKHNrKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6NDA6MDkuMzY3ODU3MjYyWiIsIlNlcSI6NzEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQ5OTI3MjUzMTc3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBhbiBleHBlcnQgaW4gdGhlIGZpZWxkOlxuXG4qKkRlYnVnZ2luZyBhIFBvdGVudGlhbCBTb2NrZXQgQ29udHJvbCBNZXNzYWdlIChTQ00pIElzc3VlKipcblxuT2theSwgc28gYHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpY2AgaXMgemVyb2luZyBvdXQgdGhlIGBzY21gIHN0cnVjdHVyZSB3aXRoIGBtZW1zZXRgIG9uIGxpbmUgMjk1My4gVGhhdCdzIGdvb2QgcHJhY3RpY2UsIGVuc3VyaW5nIGEgY2xlYW4gc2xhdGUgYmVmb3JlIHBvdGVudGlhbGx5IHJlY2VpdmluZyBjb250cm9sIG1lc3NhZ2VzLiBOb3csIGEgY3JpdGljYWwgcXVlc3Rpb24gYXJpc2VzOiBpcyB0aGUgYFVOSVhDQihza2IpYCBkYXRhIHN0cnVjdHVyZSBwcm9wZXJseSBpbml0aWFsaXplZCBvciByZXNldCAqYmVmb3JlKiB0aGF0IHBvaW50PyBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGF0IGEgc3RhbGUgb3IgdW5pbml0aWFsaXplZCBgVU5JWENCKHNrYilgIGNvdWxkIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBvciBtZW1vcnkgY29ycnVwdGlvbiwgZXNwZWNpYWxseSByZWxhdGVkIHRvIHRoZSBoYW5kbGluZyBvZiBzb2NrZXQgY29udHJvbCBtZXNzYWdlcy4gSSBuZWVkIHRvIHRyYWNlIHRoZSBsaWZlY3ljbGUgb2YgYFVOSVhDQihza2IpYC4gTGV0J3MgdXNlIGBncmVwYCB3aXRoaW4gdGhlIGBuZXQvdW5peC9gIGRpcmVjdG9yeSB0byBodW50IGRvd24gZXZlcnkgaW5zdGFuY2Ugb2YgYFVOSVhDQmAuIFRoYXQgd2lsbCBzaG93IG1lIGl0cyBpbml0aWFsaXphdGlvbiBwb2ludHMuIEkgd2FudCB0byBzZWUgaG93IGFuZCB3aGVyZSBpdCdzIHNldCBhbmQgcmVzZXQgdG8gY29uZmlybSBpdCBpcyBoYW5kbGVkIGNvcnJlY3RseS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDA2NzUsIk91dHB1dFRva2VucyI6MjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo3OSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjQwOjU5LjI5NTExNDk0OVoiLCJTZXEiOjcyLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQwOTc2NDk5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIlVOSVhDQlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvdW5peFwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvdW5peC9hZl91bml4LmM9MjU2PXN0YXRpYyB2b2lkIHVuaXhfZ2V0X3NlY2RhdGEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMjU3LXtcXG5uZXQvdW5peC9hZl91bml4LmM6MjU4OlxcdFVOSVhDQihza2IpLnNlY2lkID0gc2NtLVxcdTAwM2VzZWNpZDtcXG5uZXQvdW5peC9hZl91bml4LmMtMjU5LX1cXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yNjE9c3RhdGljIGlubGluZSB2b2lkIHVuaXhfc2V0X3NlY2RhdGEoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMjYyLXtcXG5uZXQvdW5peC9hZl91bml4LmM6MjYzOlxcdHNjbS1cXHUwMDNlc2VjaWQgPSBVTklYQ0Ioc2tiKS5zZWNpZDtcXG5uZXQvdW5peC9hZl91bml4LmMtMjY0LX1cXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yNjY9c3RhdGljIGlubGluZSBib29sIHVuaXhfc2VjZGF0YV9lcShzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0yNjcte1xcbm5ldC91bml4L2FmX3VuaXguYzoyNjg6XFx0cmV0dXJuIChzY20tXFx1MDAzZXNlY2lkID09IFVOSVhDQihza2IpLnNlY2lkKTtcXG5uZXQvdW5peC9hZl91bml4LmMtMjY5LX1cXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz02NjA9c3RhdGljIHVuc2lnbmVkIGludCB1bml4X3NrYl9sZW4oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtNjYxLXtcXG5uZXQvdW5peC9hZl91bml4LmM6NjYyOlxcdHJldHVybiBza2ItXFx1MDAzZWxlbiAtIFVOSVhDQihza2IpLmNvbnN1bWVkO1xcbm5ldC91bml4L2FmX3VuaXguYy02NjMtfVxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTE5NDA9c3RhdGljIGludCB1bml4X2F0dGFjaF9mZHMoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTQ0LVxcbm5ldC91bml4L2FmX3VuaXguYzoxOTQ1OlxcdFVOSVhDQihza2IpLmZwID0gc2NtLVxcdTAwM2VmcDtcXG5uZXQvdW5peC9hZl91bml4LmMtMTk0Ni1cXHRzY20tXFx1MDAzZWZwID0gTlVMTDtcXG5uZXQvdW5peC9hZl91bml4LmMtMTk0Ny1cXG5uZXQvdW5peC9hZl91bml4LmM6MTk0ODpcXHRpZiAodW5peF9wcmVwYXJlX2ZwbChVTklYQ0Ioc2tiKS5mcCkpXFxubmV0L3VuaXgvYWZfdW5peC5jLTE5NDktXFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MTk1ND1zdGF0aWMgdm9pZCB1bml4X2RldGFjaF9mZHMoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMTk1NS17XFxubmV0L3VuaXgvYWZfdW5peC5jOjE5NTY6XFx0c2NtLVxcdTAwM2VmcCA9IFVOSVhDQihza2IpLmZwO1xcbm5ldC91bml4L2FmX3VuaXguYzoxOTU3OlxcdFVOSVhDQihza2IpLmZwID0gTlVMTDtcXG5uZXQvdW5peC9hZl91bml4LmMtMTk1OC1cXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0xOTYyPXN0YXRpYyB2b2lkIHVuaXhfcGVla19mZHMoc3RydWN0IHNjbV9jb29raWUgKnNjbSwgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMTk2My17XFxubmV0L3VuaXgvYWZfdW5peC5jOjE5NjQ6XFx0c2NtLVxcdTAwM2VmcCA9IHNjbV9mcF9kdXAoVU5JWENCKHNrYikuZnApO1xcbm5ldC91bml4L2FmX3VuaXguYy0xOTY1LVxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTE5Njk9c3RhdGljIHZvaWQgdW5peF9kZXN0cnVjdF9zY20oc3RydWN0IHNrX2J1ZmYgKnNrYilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0xOTcyLVxcbm5ldC91bml4L2FmX3VuaXguYzoxOTczOlxcdHN3YXBfcGlkcyhzY20ucGlkLCBVTklYQ0Ioc2tiKS5waWQpO1xcbm5ldC91bml4L2FmX3VuaXguYy0xOTc0LVxcbm5ldC91bml4L2FmX3VuaXguYzoxOTc1OlxcdGlmIChVTklYQ0Ioc2tiKS5mcClcXG5uZXQvdW5peC9hZl91bml4LmMtMTk3Ni1cXHRcXHR1bml4X2RldGFjaF9mZHMoXFx1MDAyNnNjbSwgc2tiKTtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0xOTg3PXN0YXRpYyBpbnQgdW5peF9zY21fdG9fc2tiKHN0cnVjdCBzY21fY29va2llICpzY20sIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc2VuZF9mZHMpXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMTk5MC1cXG5uZXQvdW5peC9hZl91bml4LmM6MTk5MTpcXHRnZXRfcGlkcyhVTklYQ0Ioc2tiKS5waWQsIHNjbS1cXHUwMDNlcGlkKTtcXG5uZXQvdW5peC9hZl91bml4LmM6MTk5MjpcXHRVTklYQ0Ioc2tiKS51aWQgPSBzY20tXFx1MDAzZWNyZWRzLnVpZDtcXG5uZXQvdW5peC9hZl91bml4LmM6MTk5MzpcXHRVTklYQ0Ioc2tiKS5naWQgPSBzY20tXFx1MDAzZWNyZWRzLmdpZDtcXG5uZXQvdW5peC9hZl91bml4LmM6MTk5NDpcXHRVTklYQ0Ioc2tiKS5mcCA9IE5VTEw7XFxubmV0L3VuaXgvYWZfdW5peC5jLTE5OTUtXFx0dW5peF9nZXRfc2VjZGF0YShzY20sIHNrYik7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjAwMz1zdGF0aWMgdm9pZCB1bml4X3NrYl90b19zY20oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNjbV9jb29raWUgKnNjbSlcXG5uZXQvdW5peC9hZl91bml4LmMtMjAwNC17XFxubmV0L3VuaXgvYWZfdW5peC5jOjIwMDU6XFx0Z2V0X3BpZHMoc2NtLVxcdTAwM2VwaWQsIFVOSVhDQihza2IpLnBpZCk7XFxubmV0L3VuaXgvYWZfdW5peC5jLTIwMDYtXFx0c2NtLVxcdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHNjbS1cXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0pO1xcbm5ldC91bml4L2FmX3VuaXguYzoyMDA3OlxcdHNjbS1cXHUwMDNlY3JlZHMudWlkID0gVU5JWENCKHNrYikudWlkO1xcbm5ldC91bml4L2FmX3VuaXguYzoyMDA4OlxcdHNjbS1cXHUwMDNlY3JlZHMuZ2lkID0gVU5JWENCKHNrYikuZ2lkO1xcbm5ldC91bml4L2FmX3VuaXguYy0yMDA5LVxcdHVuaXhfc2V0X3NlY2RhdGEoc2NtLCBza2IpO1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTIwMjU9c3RhdGljIGludCB1bml4X21heWJlX2FkZF9jcmVkcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjAyNy17XFxubmV0L3VuaXgvYWZfdW5peC5jOjIwMjg6XFx0aWYgKFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1RHSURdKVxcbm5ldC91bml4L2FmX3VuaXguYy0yMDI5LVxcdFxcdHJldHVybiAwO1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTIwMzQtXFxubmV0L3VuaXgvYWZfdW5peC5jOjIwMzU6XFx0XFx0Z2V0X3Rhc2tfcGlkcyhVTklYQ0Ioc2tiKS5waWQsIGN1cnJlbnQpO1xcbm5ldC91bml4L2FmX3VuaXguYzoyMDM2OlxcdFxcdGVyciA9IHBpZGZzX3JlZ2lzdGVyX3BpZHMoVU5JWENCKHNrYikucGlkKTtcXG5uZXQvdW5peC9hZl91bml4LmMtMjAzNy1cXHRcXHRpZiAodW5saWtlbHkoZXJyKSkge1xcbm5ldC91bml4L2FmX3VuaXguYzoyMDM4OlxcdFxcdFxcdHB1dF9waWRzKFVOSVhDQihza2IpLnBpZCk7XFxubmV0L3VuaXgvYWZfdW5peC5jLTIwMzktXFx0XFx0XFx0cmV0dXJuIGVycjtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0yMDQxLVxcbm5ldC91bml4L2FmX3VuaXguYzoyMDQyOlxcdFxcdGN1cnJlbnRfdWlkX2dpZChcXHUwMDI2VU5JWENCKHNrYikudWlkLCBcXHUwMDI2VU5JWENCKHNrYikuZ2lkKTtcXG5uZXQvdW5peC9hZl91bml4LmMtMjA0My1cXHR9XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjA0OD1zdGF0aWMgYm9vbCB1bml4X3NrYl9zY21fZXEoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLFxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTIwNTItXFx0aWYgKHNrLVxcdTAwM2Vza19zY21fcGlkZmRfdGhyZWFkIFxcdTAwMjZcXHUwMDI2XFxubmV0L3VuaXgvYWZfdW5peC5jOjIwNTM6XFx0ICAgIFVOSVhDQihza2IpLnBpZFtQSURUWVBFX1BJRF0gIT0gc2NtLVxcdTAwM2VwaWRbUElEVFlQRV9QSURdKVxcbm5ldC91bml4L2FmX3VuaXguYy0yMDU0LVxcdFxcdHJldHVybiBmYWxzZTtcXG5uZXQvdW5peC9hZl91bml4LmMtMjA1NS1cXG5uZXQvdW5peC9hZl91bml4LmM6MjA1NjpcXHRyZXR1cm4gVU5JWENCKHNrYikucGlkW1BJRFRZUEVfVEdJRF0gPT0gc2NtLVxcdTAwM2VwaWRbUElEVFlQRV9UR0lEXSBcXHUwMDI2XFx1MDAyNlxcbm5ldC91bml4L2FmX3VuaXguYzoyMDU3OlxcdCAgICAgICB1aWRfZXEoVU5JWENCKHNrYikudWlkLCBzY20tXFx1MDAzZWNyZWRzLnVpZCkgXFx1MDAyNlxcdTAwMjZcXG5uZXQvdW5peC9hZl91bml4LmM6MjA1ODpcXHQgICAgICAgZ2lkX2VxKFVOSVhDQihza2IpLmdpZCwgc2NtLVxcdTAwM2VjcmVkcy5naWQpIFxcdTAwMjZcXHUwMDI2XFxubmV0L3VuaXgvYWZfdW5peC5jLTIwNTktXFx0ICAgICAgIHVuaXhfc2VjZGF0YV9lcShzY20sIHNrYik7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjA2Mj1zdGF0aWMgdm9pZCBzY21fc3RhdF9hZGQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbm5ldC91bml4L2FmX3VuaXguYy0yMDYzLXtcXG5uZXQvdW5peC9hZl91bml4LmM6MjA2NDpcXHRzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKmZwID0gVU5JWENCKHNrYikuZnA7XFxubmV0L3VuaXgvYWZfdW5peC5jLTIwNjUtXFx0c3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spO1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTIwNzM9c3RhdGljIHZvaWQgc2NtX3N0YXRfZGVsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMjA3NC17XFxubmV0L3VuaXgvYWZfdW5peC5jOjIwNzU6XFx0c3RydWN0IHNjbV9mcF9saXN0ICpmcCA9IFVOSVhDQihza2IpLmZwO1xcbm5ldC91bml4L2FmX3VuaXguYy0yMDc2LVxcdHN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yMDk1PXN0YXRpYyBpbnQgdW5peF9kZ3JhbV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0yMjQ5LVxcbm5ldC91bml4L2FmX3VuaXguYzoyMjUwOlxcdGlmIChVTklYQ0Ioc2tiKS5mcCBcXHUwMDI2XFx1MDAyNiAhb3RoZXItXFx1MDAzZXNrX3NjbV9yaWdodHMpIHtcXG5uZXQvdW5peC9hZl91bml4LmMtMjI1MS1cXHRcXHRlcnIgPSAtRVBFUk07XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MjMyOT1zdGF0aWMgaW50IHF1ZXVlX29vYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKm90aGVyLFxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTIzNjItXFxubmV0L3VuaXgvYWZfdW5peC5jOjIzNjM6XFx0aWYgKFVOSVhDQihza2IpLmZwIFxcdTAwMjZcXHUwMDI2ICFvdGhlci1cXHUwMDNlc2tfc2NtX3JpZ2h0cykge1xcbm5ldC91bml4L2FmX3VuaXguYy0yMzY0LVxcdFxcdGVyciA9IC1FUEVSTTtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yMzg5PXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMjQ4OS1cXG5uZXQvdW5peC9hZl91bml4LmM6MjQ5MDpcXHRcXHRpZiAoVU5JWENCKHNrYikuZnAgXFx1MDAyNlxcdTAwMjYgIW90aGVyLVxcdTAwM2Vza19zY21fcmlnaHRzKSB7XFxubmV0L3VuaXgvYWZfdW5peC5jLTI0OTEtXFx0XFx0XFx0dW5peF9zdGF0ZV91bmxvY2sob3RoZXIpO1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTI1NzQ9aW50IF9fdW5peF9kZ3JhbV9yZWN2bXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSxcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0yNjQ4LVxcdGlmICghKGZsYWdzIFxcdTAwMjYgTVNHX1BFRUspKSB7XFxubmV0L3VuaXgvYWZfdW5peC5jOjI2NDk6XFx0XFx0aWYgKFVOSVhDQihza2IpLmZwKVxcbm5ldC91bml4L2FmX3VuaXguYy0yNjUwLVxcdFxcdFxcdHVuaXhfZGV0YWNoX2ZkcyhcXHUwMDI2c2NtLCBza2IpO1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTI2NjgtXFxubmV0L3VuaXgvYWZfdW5peC5jOjI2Njk6XFx0XFx0aWYgKFVOSVhDQihza2IpLmZwKVxcbm5ldC91bml4L2FmX3VuaXguYy0yNjcwLVxcdFxcdFxcdHVuaXhfcGVla19mZHMoXFx1MDAyNnNjbSwgc2tiKTtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0yNzY5PXN0YXRpYyBpbnQgdW5peF9zdHJlYW1fcmVjdl91cmcoc3RydWN0IHVuaXhfc3RyZWFtX3JlYWRfc3RhdGUgKnN0YXRlKVxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTI4MDYtXFx0aWYgKCEoc3RhdGUtXFx1MDAzZWZsYWdzIFxcdTAwMjYgTVNHX1BFRUspKVxcbm5ldC91bml4L2FmX3VuaXguYzoyODA3OlxcdFxcdFVOSVhDQihvb2Jfc2tiKS5jb25zdW1lZCArPSAxO1xcbm5ldC91bml4L2FmX3VuaXguYy0yODA4LVxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTI5MTk9c3RhdGljIGludCB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWMoc3RydWN0IHVuaXhfc3RyZWFtX3JlYWRfc3RhdGUgKnN0YXRlLFxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTMwNjQtXFx0XFx0aWYgKCEoZmxhZ3MgXFx1MDAyNiBNU0dfUEVFSykpIHtcXG5uZXQvdW5peC9hZl91bml4LmM6MzA2NTpcXHRcXHRcXHRVTklYQ0Ioc2tiKS5jb25zdW1lZCArPSBjaHVuaztcXG5uZXQvdW5peC9hZl91bml4LmMtMzA2Ni1cXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0zMDY4LVxcbm5ldC91bml4L2FmX3VuaXguYzozMDY5OlxcdFxcdFxcdGlmIChVTklYQ0Ioc2tiKS5mcCkge1xcbm5ldC91bml4L2FmX3VuaXguYy0zMDcwLVxcdFxcdFxcdFxcdHNjbV9zdGF0X2RlbChzaywgc2tiKTtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0zMDg5LVxcdFxcdFxcdCAqL1xcbm5ldC91bml4L2FmX3VuaXguYzozMDkwOlxcdFxcdFxcdGlmIChVTklYQ0Ioc2tiKS5mcClcXG5uZXQvdW5peC9hZl91bml4LmMtMzA5MS1cXHRcXHRcXHRcXHR1bml4X3BlZWtfZmRzKFxcdTAwMjZzY20sIHNrYik7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtMzA5NC1cXG5uZXQvdW5peC9hZl91bml4LmM6MzA5NTpcXHRcXHRcXHRpZiAoVU5JWENCKHNrYikuZnApXFxubmV0L3VuaXgvYWZfdW5peC5jLTMwOTYtXFx0XFx0XFx0XFx0YnJlYWs7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MzEyOD1zdGF0aWMgaW50IHVuaXhfc3RyZWFtX3JlYWRfYWN0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0zMTMzLVxcbm5ldC91bml4L2FmX3VuaXguYzozMTM0OlxcdHJldCA9IHNrYl9jb3B5X2RhdGFncmFtX21zZyhza2IsIFVOSVhDQihza2IpLmNvbnN1bWVkICsgc2tpcCxcXG5uZXQvdW5peC9hZl91bml4LmMtMzEzNS1cXHRcXHRcXHRcXHQgICAgc3RhdGUtXFx1MDAzZW1zZywgY2h1bmspO1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTMxNzQ9c3RhdGljIGludCB1bml4X3N0cmVhbV9zcGxpY2VfYWN0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYixcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy0zMTc4LVxcdHJldHVybiBza2Jfc3BsaWNlX2JpdHMoc2tiLCBzdGF0ZS1cXHUwMDNlc29ja2V0LVxcdTAwM2VzayxcXG5uZXQvdW5peC9hZl91bml4LmM6MzE3OTpcXHRcXHRcXHQgICAgICAgVU5JWENCKHNrYikuY29uc3VtZWQgKyBza2lwLFxcbm5ldC91bml4L2FmX3VuaXguYy0zMTgwLVxcdFxcdFxcdCAgICAgICBzdGF0ZS1cXHUwMDNlcGlwZSwgY2h1bmssIHN0YXRlLVxcdTAwM2VzcGxpY2VfZmxhZ3MpO1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5oPTE0PXN0cnVjdCB1bml4X3NrYl9wYXJtcyB7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmgtMjQtXFxubmV0L3VuaXgvYWZfdW5peC5oOjI1OiNkZWZpbmUgVU5JWENCKHNrYilcXHQoKihzdHJ1Y3QgdW5peF9za2JfcGFybXMgKilcXHUwMDI2KChza2IpLVxcdTAwM2VjYikpXFxubmV0L3VuaXgvYWZfdW5peC5oLTI2LVxcbi0tXFxubmV0L3VuaXgvZ2FyYmFnZS5jPTYwNj1zdGF0aWMgdm9pZCB1bml4X2djKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaylcXG4tLVxcbm5ldC91bml4L2dhcmJhZ2UuYy02MjktXFx0c2tiX3F1ZXVlX3dhbGsoXFx1MDAyNmhpdGxpc3QsIHNrYikge1xcbm5ldC91bml4L2dhcmJhZ2UuYzo2MzA6XFx0XFx0aWYgKFVOSVhDQihza2IpLmZwKVxcbm5ldC91bml4L2dhcmJhZ2UuYzo2MzE6XFx0XFx0XFx0VU5JWENCKHNrYikuZnAtXFx1MDAzZWRlYWQgPSB0cnVlO1xcbm5ldC91bml4L2dhcmJhZ2UuYy02MzItXFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MDo1OS44MzYwOTg5MzhaIiwiU2VxIjo3MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTM4ODc3NzU1MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBteSBvd24gbWVudGFsIHByb2Nlc3MsIGdpdmVuIG15IGV4cGVydGlzZTpcblxuKipFeGFtaW5pbmcgdGhlIFVuaXggU29ja2V0IENvbnRyb2wgQmxvY2sgUGFyYW1ldGVycyoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRvIHRoZSBjb3JlIG9mIHRoaXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBgc3RydWN0IHVuaXhfc2tiX3Bhcm1zYCBpcyBsYWlkIG91dCwgZXNwZWNpYWxseSBpbiByZWxhdGlvbiB0byB0aGUgYHNrYi1cdTAwM2VjYmAgZmllbGQuIEkga25vdyB0aGF0J3Mgd2hlcmUgYSBsb3Qgb2YgdGhlIGNydWNpYWwgcGVyLXNvY2tldCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIExpbnV4IG5ldHdvcmtpbmcgc3RhY2ssIHNvIGZpZ3VyaW5nIG91dCBpdHMgc3RydWN0dXJlIGlzIGtleSB0byB1bmRlcnN0YW5kaW5nIHRoZSBVbml4IHNvY2tldCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiBMZXQncyBkZWx2ZSBpbnRvIHRoYXQgYGFmX3VuaXguaGAgZmlsZSBhbmQgZ2V0IGEgZ29vZCBncmFzcCBvZiB3aGF0IGRhdGEgbWVtYmVycyBjb25zdGl0dXRlIHRoYXQgc3RydWN0dXJlLCB0aGVpciB0eXBlcywgYW5kIGNydWNpYWxseSwgd2hhdCB0aGUgb3ZlcmFsbCBtZW1vcnkgZm9vdHByaW50IG9mIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgIHdpbGwgYmUsIHNvIEkgY2FuIGFjY291bnQgZm9yIGl0IGluIGFueSBjYWxjdWxhdGlvbnMgcmVsYXRlZCB0byBzb2NrZXQgYnVmZmVyIG1hbmFnZW1lbnQuIFRoYXQgaGVhZGVyIGZpbGUgc2hvdWxkIGhhdmUgYWxsIHRoZSBhbnN3ZXJzLiBMZXQncyBnZXQgdG8gaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ0ODQ5LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6NDE6MDUuMjI0ODgwMjg5WiIsIlNlcSI6NzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzNjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC91bml4L2FmX3VuaXguaFwiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiAzNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovXFxuICAgMjpcXHQjaWZuZGVmIF9fQUZfVU5JWF9IXFxuICAgMzpcXHQjZGVmaW5lIF9fQUZfVU5JWF9IXFxuICAgNDpcXHRcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9waWRfdHlwZXMuaFxcdTAwM2VcXG4gICA2OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC91aWRnaWQuaFxcdTAwM2VcXG4gICA3OlxcdFxcbiAgIDg6XFx0I2RlZmluZSBVTklYX0hBU0hfTU9EXFx0KDI1NiAtIDEpXFxuICAgOTpcXHQjZGVmaW5lIFVOSVhfSEFTSF9TSVpFXFx0KDI1NiAqIDIpXFxuICAxMDpcXHQjZGVmaW5lIFVOSVhfSEFTSF9CSVRTXFx0OFxcbiAgMTE6XFx0XFxuICAxMjpcXHRzdHJ1Y3Qgc29jayAqdW5peF9wZWVyX2dldChzdHJ1Y3Qgc29jayAqc2spO1xcbiAgMTM6XFx0XFxuICAxNDpcXHRzdHJ1Y3QgdW5peF9za2JfcGFybXMge1xcbiAgMTU6XFx0XFx0REVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTtcXHQvKiBza2IgY3JlZGVudGlhbHMgYnkgcGlkIHR5cGUgKi9cXG4gIDE2OlxcdFxcdGt1aWRfdFxcdFxcdFxcdHVpZDtcXG4gIDE3OlxcdFxcdGtnaWRfdFxcdFxcdFxcdGdpZDtcXG4gIDE4OlxcdFxcdHN0cnVjdCBzY21fZnBfbGlzdFxcdCpmcDtcXHRcXHQvKiBQYXNzZWQgZmlsZXNcXHRcXHQqL1xcbiAgMTk6XFx0I2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLXFxuICAyMDpcXHRcXHR1MzJcXHRcXHRcXHRzZWNpZDtcXHRcXHQvKiBTZWN1cml0eSBJRFxcdFxcdCovXFxuICAyMTpcXHQjZW5kaWZcXG4gIDIyOlxcdFxcdHUzMlxcdFxcdFxcdGNvbnN1bWVkO1xcbiAgMjM6XFx0fSBfX3JhbmRvbWl6ZV9sYXlvdXQ7XFxuICAyNDpcXHRcXG4gIDI1OlxcdCNkZWZpbmUgVU5JWENCKHNrYilcXHQoKihzdHJ1Y3QgdW5peF9za2JfcGFybXMgKilcXHUwMDI2KChza2IpLVxcdTAwM2VjYikpXFxuICAyNjpcXHRcXG4gIDI3OlxcdC8qIEdDIGZvciBTQ01fUklHSFRTICovXFxuICAyODpcXHR2b2lkIHVuaXhfYWRkX2VkZ2VzKHN0cnVjdCBzY21fZnBfbGlzdCAqZnBsLCBzdHJ1Y3QgdW5peF9zb2NrICpyZWNlaXZlcik7XFxuICAyOTpcXHR2b2lkIHVuaXhfZGVsX2VkZ2VzKHN0cnVjdCBzY21fZnBfbGlzdCAqZnBsKTtcXG4gIDMwOlxcdHZvaWQgdW5peF91cGRhdGVfZWRnZXMoc3RydWN0IHVuaXhfc29jayAqcmVjZWl2ZXIpO1xcbiAgMzE6XFx0aW50IHVuaXhfcHJlcGFyZV9mcGwoc3RydWN0IHNjbV9mcF9saXN0ICpmcGwpO1xcbiAgMzI6XFx0dm9pZCB1bml4X2Rlc3Ryb3lfZnBsKHN0cnVjdCBzY21fZnBfbGlzdCAqZnBsKTtcXG4gIDMzOlxcdHZvaWQgdW5peF9wZWVrX2ZwbChzdHJ1Y3Qgc2NtX2ZwX2xpc3QgKmZwbCk7XFxuICAzNDpcXHR2b2lkIHVuaXhfc2NoZWR1bGVfZ2Moc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyKTtcXG4gIDM1OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MTowNS4yMjQ5NzYxODlaIiwiU2VxIjo3NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDE3ODM4MDE4NTAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIFVOSVggRG9tYWluIFNvY2tldCBDcmVkZW50aWFscyBpbiBTS0JzKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBGaXJzdCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIHNpemUgb2YgdGhlIGB1bml4X3NrYl9wYXJtc2Agc3RydWN0dXJlIHdpdGhpbiB0aGUgYHNrX2J1ZmZgJ3MgY29udHJvbCBidWZmZXIgKGBza2ItXHUwMDNlY2JgKS4gIEl0IGxvb2tzIGxpa2UgdGhlIGBwaWRgIGZpZWxkICh0d28gcG9pbnRlcnMpIHRha2VzIDE2IGJ5dGVzLCB0aGUgYHVpZGAgYW5kIGBnaWRgIHRha2UgOCBieXRlcywgdGhlIGBmcGAgcG9pbnRlciBhbm90aGVyIDgsIGFuZCBgc2VjaWRgIGFuZCBgY29uc3VtZWRgIGFuIGFkZGl0aW9uYWwgOCwgc3VtbWluZyB0byBhIHRvdGFsIG9mIDQwIGJ5dGVzLiAgU2luY2UgdGhlIGBza2ItXHUwMDNlY2JgIGlzIDQ4IGJ5dGVzIG9uIGEgNjQtYml0IHN5c3RlbSwgdGhhdCBzZWVtcyBsaWtlIGEgZ29vZCBmaXQuIEJ1dCB3YWl0LCB3aGVuZXZlciBhbiBza2IgaXMgYWxsb2NhdGVkIChlLmcuIGBzb2NrX2FsbG9jX3NlbmRfcHNrYmApLCBgc2tiLVx1MDAzZWNiYCBpcyBpbml0aWFsaXplZCB0byB6ZXJvIHVzaW5nIGBtZW1zZXRgLlxuXG5Ob3cgSSBuZWVkIHRvIHNlZSBob3cgdGhlIGRhdGEgd2l0aGluIGB1bml4X3NrYl9wYXJtc2AgaXMgcG9wdWxhdGVkLiBgdW5peF9zY21fdG9fc2tiYCBhcHBlYXJzIHRvIGJlIHRoZSBrZXkgZnVuY3Rpb24uIEl0J3MgY2FsbGluZyBgZ2V0X3BpZHNgIHRvIGNvcHkgdGhlIFBJRHMsIGFuZCB0aGVuIGl0IHNldHMgYHVpZGAsIGBnaWRgLCBhbmQgYGZwYC4gIEknbGwgbmVlZCB0byBjaGVjayB0aGUgZXhhY3QgYGdldF9waWRzYCBpbXBsZW1lbnRhdGlvbi4gSSdsbCBuZWVkIHRvIGxvb2sgYXQgYHVuaXhfbWF5YmVfYWRkX2NyZWRzYCBmdW5jdGlvbi5cblxuQWxyaWdodCwgYHVuaXhfbWF5YmVfYWRkX2NyZWRzYCBpcyBpbnRlcmVzdGluZy4gSWYgdGhlIGBVTklYQ0Ioc2tiKS5waWRbUElEVFlQRV9UR0lEXWAgaXMgbm90IHNldCBhbmQgdGhlIGNvbmRpdGlvbnMgZm9yIHBhc3NpbmcgY3JlZGVudGlhbHMgYXJlIG5vdCBtZXQsIHRoZSBjb2RlICpkb2Vzbid0KiBwb3B1bGF0ZSBgVU5JWENCKHNrYikucGlkYC4gIFRoaXMgbWVhbnMgYFVOSVhDQihza2IpLnBpZGAgcmVtYWlucyB1bmluaXRpYWxpemVkLiBDcml0aWNhbGx5LCBpZiBgcGlkZnNfcmVnaXN0ZXJfcGlkc2AgZmFpbHMsIHRoZW4gYHB1dF9waWRzYCBpcyBjYWxsZWQuIExldCdzIGxvb2sgYXQgYF9fcHV0X3BpZHNgLCBpdCB3aWxsIHNldCBhbGwgYHBpZHNbdHlwZV1gIHRvIGBOVUxMYC5cblxuVGhlIG5leHQgZnVuY3Rpb24gdG8gY2hlY2sgaXMgYHVuaXhfc2tiX3RvX3NjbWAsIHdoaWNoIGNvcGllcyB0aGUgY3JlZGVudGlhbHMgYmFjayBvdXQuIGBnZXRfcGlkc2Agd2lsbCBoYW5kbGUgTlVMTCBwb2ludGVycy4gT2theSwgaWYgdGhlIGBwaWRgIGlzIE5VTEwgaW4gdGhlIGBVTklYQ0Ioc2tiKWAsIHRoZSBgZ2V0X3BpZHNgIHdpbGwgYmUgY2FsbGVkIHdpdGggTlVMTCwgYW5kIHJldHVybnMgTlVMTCwgc28gbm8gcmVmY291bnQgaXNzdWUuIEFuZCBgcGlkX3ZucihOVUxMKWAgaXMgMC5cblxuTm93IEkgcmVtZW1iZXIgYSBwb3RlbnRpYWwgYHNjbV9yZXBsYWNlX3BpZGAgZnVuY3Rpb24uIEkgaGF2ZSB0byBsb29rIGF0IGhvdyBgc2NtX3JlcGxhY2VfcGlkYCBmdW5jdGlvbnMuIEl0IHVzZXMgYHBpZGZzX3JlZ2lzdGVyX3BpZGAgYW5kIGBnZXRfcGlkYC4gTGV0J3MgZm9jdXMgb24gdGhlIGNvbW1lbnQgdGhhdCBzYXlzIGAvKiBkcm9wIGFsbCBwcmV2aW91cyByZWZlcmVuY2VzICovYC4gSSBzdXNwZWN0IHRoZXJlIG1pZ2h0IGJlIGEgcG90ZW50aWFsIGlzc3VlIHJlbGF0ZWQgdG8gdGhlIHJlZmVyZW5jZSBjb3VudGluZyBvZiB0aGUgYHBpZGAgc3RydWN0dXJlcy4gTGV0J3MgcmV2aWV3IHRoZSBjb2RlJ3MgaGlzdG9yeSB1c2luZyBnaXQsIHNvIEkgY2FuIHNlZSB3aGF0IGNoYW5nZWQuIFRoZSBnaXQgZGlmZiBiZWZvcmUgdGhlIHBhdGNoIHNob3dzIHRoYXQgYmVmb3JlIHRoZSBwYXRjaCwgdGhlIGNvZGUgZGlkbid0IGFjdHVhbGx5IGRyb3AgYWxsIHByZXZpb3VzIHJlZmVyZW5jZXMsIGl0IGp1c3Qgb3Zlcndyb3RlIHRoZSBvbGQgcG9pbnRlciwgc28gdGhlcmUgd2FzIGEgbGVhayFcblxuSSB3aWxsIGNoZWNrIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgbGluZXMgMTQ1LTIzMC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDU3MDYsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTc3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6NDE6NDcuMDA4NzgyMTM5WiIsIlNlcSI6NzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjMwMDYxMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvY29yZS9zY20uY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNDUsXG4gIFwiTGluZUNvdW50XCI6IDg1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAxNDU6XFx0XFx0XFx0a2ZyZWUoZnBsKTtcXG4gMTQ2OlxcdFxcdH1cXG4gMTQ3OlxcdH1cXG4gMTQ4OlxcdEVYUE9SVF9TWU1CT0woX19zY21fZGVzdHJveSk7XFxuIDE0OTpcXHRcXG4gMTUwOlxcdHN0YXRpYyBpbmxpbmUgaW50IHNjbV9yZXBsYWNlX3BpZChzdHJ1Y3Qgc2NtX2Nvb2tpZSAqc2NtLCBzdHJ1Y3QgcGlkICpwaWQpXFxuIDE1MTpcXHR7XFxuIDE1MjpcXHRcXHRzdHJ1Y3QgcGlkICp0aHJlYWRfcGlkO1xcbiAxNTM6XFx0XFx0aW50IGVycjtcXG4gMTU0OlxcdFxcbiAxNTU6XFx0XFx0LyogZHJvcCBhbGwgcHJldmlvdXMgcmVmZXJlbmNlcyAqL1xcbiAxNTY6XFx0XFx0c2NtX2Rlc3Ryb3lfY3JlZChzY20pO1xcbiAxNTc6XFx0XFxuIDE1ODpcXHRcXHRlcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQocGlkKTtcXG4gMTU5OlxcdFxcdGlmICh1bmxpa2VseShlcnIpKVxcbiAxNjA6XFx0XFx0XFx0cmV0dXJuIGVycjtcXG4gMTYxOlxcdFxcbiAxNjI6XFx0XFx0LyogQSBzZW5kZXIgbmFtaW5nIGl0cyBvd24gdGhyZWFkLWdyb3VwIHNlbmRzIGZyb20gdGhlIGN1cnJlbnQgdGhyZWFkLiAqL1xcbiAxNjM6XFx0XFx0aWYgKHBpZCA9PSB0YXNrX3RnaWQoY3VycmVudCkpXFxuIDE2NDpcXHRcXHRcXHR0aHJlYWRfcGlkID0gdGFza19waWQoY3VycmVudCk7XFxuIDE2NTpcXHRcXHRlbHNlXFxuIDE2NjpcXHRcXHRcXHR0aHJlYWRfcGlkID0gcGlkO1xcbiAxNjc6XFx0XFxuIDE2ODpcXHRcXHRlcnIgPSBwaWRmc19yZWdpc3Rlcl9waWQodGhyZWFkX3BpZCk7XFxuIDE2OTpcXHRcXHRpZiAodW5saWtlbHkoZXJyKSlcXG4gMTcwOlxcdFxcdFxcdHJldHVybiBlcnI7XFxuIDE3MTpcXHRcXG4gMTcyOlxcdFxcdHNjbS1cXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gPSBwaWQ7XFxuIDE3MzpcXHRcXHRzY20tXFx1MDAzZXBpZFtQSURUWVBFX1BJRF0gPSBnZXRfcGlkKHRocmVhZF9waWQpO1xcbiAxNzQ6XFx0XFx0c2NtLVxcdTAwM2VjcmVkcy5waWQgPSBwaWRfdm5yKHBpZCk7XFxuIDE3NTpcXHRcXHRyZXR1cm4gMDtcXG4gMTc2OlxcdH1cXG4gMTc3OlxcdFxcbiAxNzg6XFx0aW50IF9fc2NtX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2NtX2Nvb2tpZSAqcClcXG4gMTc5OlxcdHtcXG4gMTgwOlxcdFxcdGNvbnN0IHN0cnVjdCBwcm90b19vcHMgKm9wcyA9IFJFQURfT05DRShzb2NrLVxcdTAwM2VvcHMpO1xcbiAxODE6XFx0XFx0c3RydWN0IGNtc2doZHIgKmNtc2c7XFxuIDE4MjpcXHRcXHRpbnQgZXJyO1xcbiAxODM6XFx0XFxuIDE4NDpcXHRcXHRmb3JfZWFjaF9jbXNnaGRyKGNtc2csIG1zZykge1xcbiAxODU6XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gMTg2OlxcdFxcbiAxODc6XFx0XFx0XFx0LyogVmVyaWZ5IHRoYXQgY21zZ19sZW4gaXMgYXQgbGVhc3Qgc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSAqL1xcbiAxODg6XFx0XFx0XFx0LyogVGhlIGZpcnN0IGNoZWNrIHdhcyBvbWl0dGVkIGluIFxcdTAwM2M9IDIuMi41LiBUaGUgcmVhc29uaW5nIHdhc1xcbiAxODk6XFx0XFx0XFx0ICAgdGhhdCBwYXJzZXIgY2hlY2tzIGNtc2dfbGVuIGluIGFueSBjYXNlLCBzbyB0aGF0XFxuIDE5MDpcXHRcXHRcXHQgICBhZGRpdGlvbmFsIGNoZWNrIHdvdWxkIGJlIHdvcmsgZHVwbGljYXRpb24uXFxuIDE5MTpcXHRcXHRcXHQgICBCdXQgaWYgY21zZ19sZXZlbCBpcyBub3QgU09MX1NPQ0tFVCwgd2UgZG8gbm90IGNoZWNrXFxuIDE5MjpcXHRcXHRcXHQgICBmb3IgdG9vIHNob3J0IGFuY2lsbGFyeSBkYXRhIG9iamVjdCBhdCBhbGwhIE9vcHMuXFxuIDE5MzpcXHRcXHRcXHQgICBPSywgbGV0J3MgYWRkIGl0Li4uXFxuIDE5NDpcXHRcXHRcXHQgKi9cXG4gMTk1OlxcdFxcdFxcdGlmICghQ01TR19PSyhtc2csIGNtc2cpKVxcbiAxOTY6XFx0XFx0XFx0XFx0Z290byBlcnJvcjtcXG4gMTk3OlxcdFxcbiAxOTg6XFx0XFx0XFx0aWYgKGNtc2ctXFx1MDAzZWNtc2dfbGV2ZWwgIT0gU09MX1NPQ0tFVClcXG4gMTk5OlxcdFxcdFxcdFxcdGNvbnRpbnVlO1xcbiAyMDA6XFx0XFxuIDIwMTpcXHRcXHRcXHRzd2l0Y2ggKGNtc2ctXFx1MDAzZWNtc2dfdHlwZSlcXG4gMjAyOlxcdFxcdFxcdHtcXG4gMjAzOlxcdFxcdFxcdGNhc2UgU0NNX1JJR0hUUzpcXG4gMjA0OlxcdFxcdFxcdFxcdGlmICghb3BzIHx8IG9wcy1cXHUwMDNlZmFtaWx5ICE9IFBGX1VOSVgpXFxuIDIwNTpcXHRcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbiAyMDY6XFx0XFx0XFx0XFx0ZXJyPXNjbV9mcF9jb3B5KGNtc2csIFxcdTAwMjZwLVxcdTAwM2VmcCk7XFxuIDIwNzpcXHRcXHRcXHRcXHRpZiAoZXJyXFx1MDAzYzApXFxuIDIwODpcXHRcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbiAyMDk6XFx0XFx0XFx0XFx0YnJlYWs7XFxuIDIxMDpcXHRcXHRcXHRjYXNlIFNDTV9DUkVERU5USUFMUzpcXG4gMjExOlxcdFxcdFxcdHtcXG4gMjEyOlxcdFxcdFxcdFxcdHN0cnVjdCB1Y3JlZCBjcmVkcztcXG4gMjEzOlxcdFxcdFxcdFxcdGt1aWRfdCB1aWQ7XFxuIDIxNDpcXHRcXHRcXHRcXHRrZ2lkX3QgZ2lkO1xcbiAyMTU6XFx0XFx0XFx0XFx0aWYgKGNtc2ctXFx1MDAzZWNtc2dfbGVuICE9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgdWNyZWQpKSlcXG4gMjE2OlxcdFxcdFxcdFxcdFxcdGdvdG8gZXJyb3I7XFxuIDIxNzpcXHRcXHRcXHRcXHRtZW1jcHkoXFx1MDAyNmNyZWRzLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZihzdHJ1Y3QgdWNyZWQpKTtcXG4gMjE4OlxcdFxcdFxcdFxcdGVyciA9IHNjbV9jaGVja19jcmVkcyhcXHUwMDI2Y3JlZHMpO1xcbiAyMTk6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMjIwOlxcdFxcdFxcdFxcdFxcdGdvdG8gZXJyb3I7XFxuIDIyMTpcXHRcXG4gMjIyOlxcdFxcdFxcdFxcdGlmICghcC1cXHUwMDNlcGlkW1BJRFRZUEVfVEdJRF0gfHxcXG4gMjIzOlxcdFxcdFxcdFxcdCAgICBwaWRfdm5yKHAtXFx1MDAzZXBpZFtQSURUWVBFX1RHSURdKSAhPSBjcmVkcy5waWQpIHtcXG4gMjI0OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBwaWQgKnBpZDtcXG4gMjI1OlxcdFxcdFxcdFxcdFxcdGVyciA9IC1FU1JDSDtcXG4gMjI2OlxcdFxcdFxcdFxcdFxcdHBpZCA9IGZpbmRfZ2V0X3BpZChjcmVkcy5waWQpO1xcbiAyMjc6XFx0XFx0XFx0XFx0XFx0aWYgKCFwaWQpXFxuIDIyODpcXHRcXHRcXHRcXHRcXHRcXHRnb3RvIGVycm9yO1xcbiAyMjk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjQxOjQ3LjAwOTA4NzE0OVoiLCJTZXEiOjc3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMTQ2NDUzMzk3NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBvdGVudGlhbCBJc3N1ZSB3aXRoIHNjbV9waWRmZF9yZWN2KipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgYHNjbV9kZXN0cm95X2NyZWQoc2NtKWAgd2hpY2gsIGFzIGV4cGVjdGVkLCBjYWxscyBgcHV0X3BpZHMoc2NtLVx1MDAzZXBpZClgLiBNYWtlcyBzZW5zZS4gTm93LCBsZXQncyBkaXZlIGludG8gYHNjbV9waWRmZF9yZWN2YCBzaW5jZSB0aGF0J3Mgd2hlcmUgdGhpbmdzIGdldCBpbnRlcmVzdGluZy4gTGluZSAxNTYgb2YgdGhlIGNvZGUsIGNhbGxzIGBzY21fZGVzdHJveV9jcmVkKHNjbSlgLlxuXG5JbiBgc2NtX3BpZGZkX3JlY3ZgLCBJIHNlZSBgcGlkZmRgIGlzIGEgbG9jYWwgaW50ZWdlciBpbml0aWFsaXplZCB2aWEgYHBpZGZkID0gcGlkZmRfcHJlcGFyZSguLi4pYC4gVGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGFuIGVhcmx5IHJldHVybiBpZiB0aGUgYHBpZGAgaXMgYE5VTExgLCB3aGljaCBpcyBub3JtYWwuIFRoZSBjb3JlIHF1ZXN0aW9uIGlzIGFyb3VuZCBgcGlkZmRfcHJlcGFyZWAuIFRoZSBjb2RlIHN1Z2dlc3RzIGBwaWRmZGAgY291bGQgYmUgbmVnYXRpdmUgaWYgYHBpZGZkX3ByZXBhcmVgIGZhaWxzIChvciBldmVuIHRocm91Z2ggYHB1dF9jbXNnYCkuIEkgY2FuIHNlZSB0aGF0IGBwdXRfY21zZ2AgbWlnaHQgcmV0dXJuIGFuIGVycm9yIHdoZW4gdXNpbmcgYFx1MDAyNnBpZGZkYC4gQnV0IGhhbmcgb24uLi4gd2hhdCBpZiBgcGlkZmRfcHJlcGFyZWAgcmV0dXJucyBhICpuZWdhdGl2ZSBlcnJvciBjb2RlKiBpdHNlbGY/IEkgbmVlZCB0byBjaGVjayB0aGUgZGVmaW5pdGlvbiBvZiBgcGlkZmRfcHJlcGFyZWAgdG8gY29uZmlybSB0aGUgcG9zc2libGUgZXJyb3IgaGFuZGxpbmcuIEkgbmVlZCB0byBrbm93IHdoYXQgdGhvc2UgZXJyb3IgY29kZXMgYXJlLCBhbmQgd2hhdCBoYXBwZW5zIHdoZW4gdGhleSBnZXQgcGFzc2VkIGFyb3VuZCBpbiB0aGUgb3RoZXIgZnVuY3Rpb24gY2FsbHMuIElzIHRoZSBuZWdhdGl2ZSBgcGlkZmRgIHZhbHVlIGJlaW5nIGNoZWNrZWQgcHJvcGVybHkgdGhyb3VnaG91dCB0aGUgcHJvY2Vzcz8gSSdtIGdvaW5nIHRvIGZvbGxvdyB0aGUgbG9naWMgb2YgYHBpZGZkX3ByZXBhcmVgIGFuZCB0aGVuIGBwdXRfY21zZ2AgY2FsbHMgdG8gY29uZmlybS5cblxuXG4iLCJJbnB1dFRva2VucyI6NDkyMjgsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1MTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MTo1OC40NzM2MjUxODZaIiwiU2VxIjo3OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1OTYwODYzMzQsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicGlkZmRfcHJlcGFyZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJmcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jPTgzNj1zdGF0aWMgc3NpemVfdCBjb3B5X2V2ZW50X3RvX3VzZXIoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCxcXG4tLVxcbmZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeV91c2VyLmMtOTE0LVxcdFxcdGlmIChtZXRhZGF0YS5waWQpXFxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYzo5MTU6XFx0XFx0XFx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKGV2ZW50LVxcdTAwM2VwaWQsIHBpZGZkX2ZsYWdzLCBcXHUwMDI2cGlkZmRfZmlsZSk7XFxuZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYy05MTYtXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3BpZC5oPTg2PXN0cnVjdCB0YXNrX3N0cnVjdCAqcGlkZmRfZ2V0X3Rhc2soaW50IHBpZGZkLCB1bnNpZ25lZCBpbnQgKmZsYWdzKTtcXG5pbmNsdWRlL2xpbnV4L3BpZC5oOjg3OmludCBwaWRmZF9wcmVwYXJlKHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqKnJldF9maWxlKTtcXG5pbmNsdWRlL2xpbnV4L3BpZC5oLTg4LXZvaWQgZG9fbm90aWZ5X3BpZGZkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7XFxuLS1cXG5rZXJuZWwvZm9yay5jPTE4NjI9c3RhdGljIGlubGluZSB2b2lkIHJjdV9jb3B5X3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKVxcbi0tXFxua2VybmVsL2ZvcmsuYy0xODgxLS8qKlxcbmtlcm5lbC9mb3JrLmM6MTg4MjogKiBwaWRmZF9wcmVwYXJlIC0gYWxsb2NhdGUgYSBuZXcgcGlkZmRfZmlsZSBhbmQgcmVzZXJ2ZSBhIHBpZGZkXFxua2VybmVsL2ZvcmsuYy0xODgzLSAqIEBwaWQ6ICAgdGhlIHN0cnVjdCBwaWQgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIHBpZGZkXFxuLS1cXG5rZXJuZWwvZm9yay5jLTE5MDctICovXFxua2VybmVsL2ZvcmsuYzoxOTA4OmludCBwaWRmZF9wcmVwYXJlKHN0cnVjdCBwaWQgKnBpZCwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqKnJldF9maWxlKVxcbmtlcm5lbC9mb3JrLmMtMTkwOS17XFxuLS1cXG5rZXJuZWwvZm9yay5jPTIwMTI9X19sYXRlbnRfZW50cm9weSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvcHlfcHJvY2VzcyhcXG4tLVxcbmtlcm5lbC9mb3JrLmMtMjM0Ny1cXHRcXHQgKi9cXG5rZXJuZWwvZm9yay5jOjIzNDg6XFx0XFx0cmV0dmFsID0gcGlkZmRfcHJlcGFyZShwaWQsIGZsYWdzLCBcXHUwMDI2cGlkZmlsZSk7XFxua2VybmVsL2ZvcmsuYy0yMzQ5LVxcdFxcdGlmIChyZXR2YWwgXFx1MDAzYyAwKVxcbi0tXFxua2VybmVsL3BpZC5jPTY3MT1zdGF0aWMgaW50IHBpZGZkX2NyZWF0ZShzdHJ1Y3QgcGlkICpwaWQsIHVuc2lnbmVkIGludCBmbGFncylcXG4tLVxcbmtlcm5lbC9waWQuYy02NzUtXFxua2VybmVsL3BpZC5jOjY3NjpcXHRwaWRmZCA9IHBpZGZkX3ByZXBhcmUocGlkLCBmbGFncywgXFx1MDAyNnBpZGZkX2ZpbGUpO1xcbmtlcm5lbC9waWQuYy02NzctXFx0aWYgKHBpZGZkIFxcdTAwM2MgMClcXG4tLVxcbm5ldC9jb3JlL3NjbS5jPTUwMj1zdGF0aWMgdm9pZCBzY21fcGlkZmRfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZyxcXG4tLVxcbm5ldC9jb3JlL3NjbS5jLTUyOS1cXG5uZXQvY29yZS9zY20uYzo1MzA6XFx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBpZCwgZmxhZ3MsIFxcdTAwMjZwaWRmZF9maWxlKTtcXG5uZXQvY29yZS9zY20uYy01MzEtXFxuLS1cXG5uZXQvY29yZS9zb2NrLmM9MTc0Nz1zdGF0aWMgaW50IHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKHN0cnVjdCBzb2NrICpzaywgZW51bSBwaWRfdHlwZSB0eXBlLFxcbi0tXFxubmV0L2NvcmUvc29jay5jLTE3NzItXFxubmV0L2NvcmUvc29jay5jOjE3NzM6XFx0cGlkZmQgPSBwaWRmZF9wcmVwYXJlKHBlZXJfcGlkLCBmbGFncywgXFx1MDAyNnBpZGZkX2ZpbGUpO1xcbm5ldC9jb3JlL3NvY2suYy0xNzc0LVxcdHB1dF9waWQocGVlcl9waWQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MjowMS4wNjk3NDAzNVoiLCJTZXEiOjc5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjAyNjEwMzQ0MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkYCBhbmQgYFNPX1BBU1NQSURGRF9USFJFQURgIGZvciBQSURGRCBIYW5kbGluZyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gSSdtIGxvb2tpbmcgYXQgaG93IHdlIHJldHJpZXZlIFBJREZEcyByZWxhdGVkIHRvIHNvY2tldCBwZWVycywgc3BlY2lmaWNhbGx5IHRocm91Z2ggYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkYC4gVGhlIG1haW4gdGhpbmcgSSdtIGZvY3VzZWQgb24gaXMgdGhlIGRhdGEgdHJhbnNmZXIgYW5kIGVycm9yIGhhbmRsaW5nLlxuXG5GaXJzdCwgd2l0aGluIGBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZGAsIGBsZW5gIGlzIGNyaXRpY2FsOyBpdCdzIGJlaW5nIGJvdW5kZWQgYnkgYHNpemVvZihwaWRmZClgIGVuc3VyaW5nIHRoYXQgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGJ1ZmZlci4gYHBpZGZkYCBpdHNlbGYgaXMgYW4gYGludGAsIGFuZCBpbml0aWFsaXplZCBieSBgcGlkZmRfcHJlcGFyZWAuIFRoZSBjb2RlIHNlZW1zIGNhcmVmdWwsIGNoZWNraW5nIHRoZSByZXR1cm4gdmFsdWVzIG9mIGBjb3B5X3RvX3NvY2twdHJgLCBhbmQgY2xlYW5pbmcgdXAgd2l0aCBgcHV0X3VudXNlZF9mZGAgYW5kIGBmcHV0YCBpZiBhbiBlcnJvciBvY2N1cnMuIEkgc2VlIHdlIGhhdmUgdHdvIGNvcHkgb3BlcmF0aW9uczogdGhlIGZpcnN0LCBgY29weV90b19zb2NrcHRyKG9wdHZhbCwgXHUwMDI2cGlkZmQsIGxlbilgLCBjb3BpZXMgdXAgdG8gNCBieXRlcyBmcm9tIHRoZSBpbml0aWFsaXplZCBgcGlkZmRgLCBhbmQgdGhlIHNlY29uZCBvbmUsIGBjb3B5X3RvX3NvY2twdHIob3B0bGVuLCBcdTAwMjZsZW4sIHNpemVvZihpbnQpKWAsIGNvcGllcyA0IGJ5dGVzIGZyb20gdGhlIGluaXRpYWxpemVkIGBsZW5gIHRvIHRoZSBjYWxsZXIuIFNvIGZhciwgdGhlIGRpcmVjdCBQSURGRCByZXRyaWV2YWwgYW5kIHRyYW5zZmVyIGxvb2sgcHJldHR5IHNvdW5kLCB3aXRoIGRlZmVuc2l2ZSBwcm9ncmFtbWluZyBhcm91bmQgcG90ZW50aWFsIGNvcHkgZmFpbHVyZXMuXG5cblRoZW4sIEknbSBjaGVja2luZyBob3cgdGhlIGBTT19QQVNTUElERkRfVEhSRUFEYCBvcHRpb24gaXMgaGFuZGxlZCB3aXRoaW4gYHNrX2dldHNvY2tvcHRgLiBJZiB0aGUgc29ja2V0IGlzIG5vdCBBRl9VTklYLCBgRU9QTk9UU1VQUGAgaXMgcmV0dXJuZWQuIEluIHRoZSBgU09fUEFTU1BJREZEX1RIUkVBRGAgY2FzZSwgdGhlIHZhbHVlIGB2LnZhbGAgaXMgc2V0IHdpdGggYHNrLVx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWRgLiBJIG5lZWQgdG8gdHJhY2sgZG93biBob3cgYHYudmFsYCBpcyB1bHRpbWF0ZWx5IHVzZWQgYnkgYHNrX2dldHNvY2tvcHRgLlxuXG5JbiBnZW5lcmFsLCB0aGUgY29kZSBzZWVtcyB3ZWxsLXN0cnVjdHVyZWQsIGJ1dCBJIG5lZWQgdG8gc2VlIHRoZSBjb21wbGV0ZSBwaWN0dXJlIG9mIGhvdyB0aGUgZGF0YSBmbG93cyBmcm9tIHRoZSBzb2NrZXQgaW50ZXJuYWxzIHRvIHRoZSB1c2VyIHNwYWNlIHRvIGJlIGNvbmZpZGVudCwgZXNwZWNpYWxseSBpbiByZWdhcmQgdG8gdGhlIFBJREZEIGhhbmRsaW5nLiBJJ2xsIG5lZWQgdG8gZHJpbGwgZG93biBkZWVwZXIgaW50byB0aGUgYG5ldC9jb3JlL3NvY2suY2AgYW5kIHBvdGVudGlhbGx5IGhvdyB0aG9zZSB2YWx1ZXMgYXJlIGNvbnN1bWVkIGJ5IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1MDg3NSwiT3V0cHV0VG9rZW5zIjozNSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjcxOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MjoyMy4wOTU4NDkwN1oiLCJTZXEiOjgwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTM0NDk3ODY5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNhc2UgU09fUEFTU1BJREZEOlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvY29yZS9zb2NrLmNcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L2NvcmUvc29jay5jPTExOTQ9aW50IHNrX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxcbi0tXFxubmV0L2NvcmUvc29jay5jLTE1NzItXFxubmV0L2NvcmUvc29jay5jOjE1NzM6XFx0Y2FzZSBTT19QQVNTUElERkQ6XFxubmV0L2NvcmUvc29jay5jLTE1NzQtXFx0XFx0aWYgKHNrX2lzX3VuaXgoc2spKSB7XFxuLS1cXG5uZXQvY29yZS9zb2NrLmM9MTc5MD1pbnQgc2tfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxuLS1cXG5uZXQvY29yZS9zb2NrLmMtMTk0Ni1cXG5uZXQvY29yZS9zb2NrLmM6MTk0NzpcXHRjYXNlIFNPX1BBU1NQSURGRDpcXG5uZXQvY29yZS9zb2NrLmMtMTk0OC1cXHRcXHRpZiAoIXNrX2lzX3VuaXgoc2spKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MjoyMy42MzAzNTMzMjlaIiwiU2VxIjo4MSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6ODY3Nzc4ODEwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDpcblxuKipEaXZpbmcgaW50byBgbmV0L2NvcmUvc29jay5jYCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZGlnIGluLiBUaGUgcHJvYmxlbSBhdCBoYW5kIG5lY2Vzc2l0YXRlcyBhIGxvb2sgYXQgdGhlIGNvcmUgc29ja2V0IGNvZGUuIEknbSBnb2luZyB0byBzdGFydCBieSByZXZpZXdpbmcgbGluZXMgMTk0NS0xOTYwIHdpdGhpbiBgbmV0L2NvcmUvc29jay5jYC4gVGhlc2UgbGluZXMgbGlrZWx5IGludm9sdmUgdGhlIGNydWNpYWwgcGFydCBvZiBzb2NrZXQgZnVuY3Rpb25hbGl0eSB0aGF0J3MgY2F1c2luZyB0aGlzIGlzc3VlLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIGFueSBoaW50cyBvbiB3aGVyZSB0aGUgcHJvYmxlbSBtaWdodCBleGlzdCBieSByZXZpZXdpbmcgdGhlIHN1cnJvdW5kaW5nIGNvbnRleHQgYW5kIGZ1bmN0aW9ucyB0aGlzIGFyZWEgb2YgdGhlIGNvZGUgaW50ZXJhY3RzIHdpdGguIExldCdzIHNlZSB3aGF0IHdlIGNhbiBmaW5kLiBJIGV4cGVjdCB0aGlzIHNlY3Rpb24gZGVhbHMgd2l0aCBbaW5zZXJ0IGV4cGVjdGF0aW9uIGJhc2VkIG9uIGV4cGVydGlzZSBhbmQgYXNzdW1lZCBwcm9ibGVtIGRvbWFpbiAtIGUuZy4sIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCwgZGF0YSB0cmFuc21pc3Npb24sIGVycm9yIGhhbmRsaW5nLCBldGMuXS5cblxuXG4iLCJJbnB1dFRva2VucyI6NTIzMDgsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MjozMi4zMDgxNTM0WiIsIlNlcSI6ODIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ0MTk1MjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L2NvcmUvc29jay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE5NDUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjE5NDU6XFx0XFx0XFx0YnJlYWs7XFxuMTk0NjpcXHRcXG4xOTQ3OlxcdFxcdGNhc2UgU09fUEFTU1BJREZEOlxcbjE5NDg6XFx0XFx0XFx0aWYgKCFza19pc191bml4KHNrKSlcXG4xOTQ5OlxcdFxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4xOTUwOlxcdFxcbjE5NTE6XFx0XFx0XFx0di52YWwgPSBzay1cXHUwMDNlc2tfc2NtX3BpZGZkO1xcbjE5NTI6XFx0XFx0XFx0YnJlYWs7XFxuMTk1MzpcXHRcXG4xOTU0OlxcdFxcdGNhc2UgU09fUEFTU1BJREZEX1RIUkVBRDpcXG4xOTU1OlxcdFxcdFxcdGlmICghc2tfaXNfdW5peChzaykpXFxuMTk1NjpcXHRcXHRcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuMTk1NzpcXHRcXG4xOTU4OlxcdFxcdFxcdHYudmFsID0gc2stXFx1MDAzZXNrX3NjbV9waWRmZF90aHJlYWQ7XFxuMTk1OTpcXHRcXHRcXHRicmVhaztcXG4xOTYwOlxcdFxcbjE5NjE6XFx0XFx0Y2FzZSBTT19QQVNTUklHSFRTOlxcbjE5NjI6XFx0XFx0XFx0aWYgKCFza19pc191bml4KHNrKSlcXG4xOTYzOlxcdFxcdFxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4xOTY0OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MjozMi4zMTI1OTczNjlaIiwiU2VxIjo4MywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjI1MDUxMjEwNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgQ29yZSBEdW1wIFBhcmFtZXRlciBJbml0aWFsaXphdGlvbioqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gdGhpcy4gYHYudmFsYCBiZWluZyB0aGUgc3RhbmRhcmQgZm9yIGludGVnZXIgcmV0dXJuIHZhbHVlcyBpbiBgc2tfZ2V0c29ja29wdGAgaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50IHRvIGtlZXAgaW4gbWluZC4gTm93LCBsZXQncyBkaXZlIGludG8gdGhlIGNvcmUgZHVtcCBtZWNoYW5pc20sIHNwZWNpZmljYWxseSBmb2N1c2luZyBvbiBob3cgdGhlIHBhcmFtZXRlcnMgYXJlIGJlaW5nIGhhbmRsZWQuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBleGFtaW5lIGBjb3JlZHVtcC5jYCB0byB1bmRlcnN0YW5kIHRoZSBmbG93IG9mIGV4ZWN1dGlvbi5cblxuTGV0J3MgYmVnaW4gYnkgY2hlY2tpbmcgZm9yIGNoYW5nZXMgd2l0aGluIGBmcy9jb3JlZHVtcC5jYCwgaG9wZWZ1bGx5IHdlIGZpbmQgdGhlIHNvdXJjZSBvZiB0aGlzIHByb2JsZW0gdGhlcmUuIFdpdGhpbiB0aGUgZmlsZSwgSSBuZWVkIHRvIGZvY3VzIG9uIHRoZSBgY29yZWR1bXBfcGFyc2VgIGZ1bmN0aW9uOyB0aGF0IHNvdW5kcyBsaWtlIGEgcmVsZXZhbnQgc3RhcnRpbmcgcG9pbnQuIEkgc2VlIGB0YXNrX3BpZHMoY3BybS1cdTAwM2VwaWQsIGN1cnJlbnQpO2AgYmVpbmcgY2FsbGVkIGluIGBjb3JlZHVtcF9wYXJzZWAuIE9rYXksIGFuZCB3aXRoaW4gYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgLCBJIHNlZSBgREVDTEFSRV9QSURTKHBpZCwgUElEVFlQRV9UR0lEKTtgLlxuXG5Ob3csIHRoZSBjcnVjaWFsIHF1ZXN0aW9uIGlzIGhvdyB0aGlzIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCBpcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbGlmZWN5Y2xlIG9mIHRoaXMgc3RydWN0dXJlIHRvIHVuZGVyc3RhbmQgaG93IGl0IGNhbiBnbyB3cm9uZy4gU28sIEkgbmVlZCB0byBsb29rIGZvciB3aGVyZSBpdCBpcyBhbGxvY2F0ZWQgb3IgY3JlYXRlZC4gTGV0J3MgZ28gYWhlYWQgYW5kIHNlYXJjaCBmb3IgaW5zdGFuY2VzIG9mIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCB3aXRoaW4gYGZzL2NvcmVkdW1wLmNgIHRvIGdldCBhIGJldHRlciBoYW5kbGUgb24gaXRzIGNyZWF0aW9uLiBUaGF0IHNob3VsZCBnaXZlIG1lIHRoZSBjb250ZXh0IEkgbmVlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NTI4MDIsIk91dHB1dFRva2VucyI6MzAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MjozOC41NjMxMTM2ODRaIiwiU2VxIjo4NCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyMTkyMTA1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImNvcmVkdW1wX3BhcmFtc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJmcy9jb3JlZHVtcC5jXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImZzL2NvcmVkdW1wLmMtNjgtXFxuZnMvY29yZWR1bXAuYzo2OTpzdGF0aWMgYm9vbCBkdW1wX3ZtYV9zbmFwc2hvdChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKTtcXG5mcy9jb3JlZHVtcC5jOjcwOnN0YXRpYyB2b2lkIGZyZWVfdm1hX3NuYXBzaG90KHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pO1xcbmZzL2NvcmVkdW1wLmMtNzEtXFxuLS1cXG5mcy9jb3JlZHVtcC5jPTE5OD1zdGF0aWMgaW50IGNuX3ByaW50X2V4ZV9maWxlKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBib29sIG5hbWVfb25seSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMjM4LSAqL1xcbmZzL2NvcmVkdW1wLmM6MjM5OnN0YXRpYyBib29sIGNvcmVkdW1wX3BhcnNlKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxcbmZzL2NvcmVkdW1wLmMtMjQwLVxcdFxcdFxcdCAgIHNpemVfdCAqKmFyZ3YsIGludCAqYXJnYylcXG4tLVxcbmZzL2NvcmVkdW1wLmM9NjIzPXN0YXRpYyBpbnQgdW1oX2NvcmVkdW1wX3NldHVwKHN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm8sIHN0cnVjdCBjcmVkICpuZXcpXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTYyNS1cXHRzdHJ1Y3QgZmlsZSAqZmlsZXNbMl07XFxuZnMvY29yZWR1bXAuYzo2MjY6XFx0c3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3AgPSAoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqKWluZm8tXFx1MDAzZWRhdGE7XFxuZnMvY29yZWR1bXAuYy02MjctXFx0aW50IGVycjtcXG4tLVxcbmZzL2NvcmVkdW1wLmMtNjcxLSNpZmRlZiBDT05GSUdfVU5JWFxcbmZzL2NvcmVkdW1wLmM6NjcyOnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfY29ubmVjdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG5mcy9jb3JlZHVtcC5jLTY3My17XFxuLS1cXG5mcy9jb3JlZHVtcC5jPTc4Nz1zdGF0aWMgaW5saW5lIHZvaWQgY29yZWR1bXBfc29ja19zaHV0ZG93bihzdHJ1Y3QgZmlsZSAqZmlsZSlcXG4tLVxcbmZzL2NvcmVkdW1wLmMtNzk4LVxcbmZzL2NvcmVkdW1wLmM6Nzk5OnN0YXRpYyBib29sIGNvcmVkdW1wX3NvY2tfcmVxdWVzdChzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG5mcy9jb3JlZHVtcC5jLTgwMC17XFxuLS1cXG5mcy9jb3JlZHVtcC5jLTg2MS1cXG5mcy9jb3JlZHVtcC5jOjg2MjpzdGF0aWMgYm9vbCBjb3JlZHVtcF9zb2NrZXQoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXFxuZnMvY29yZWR1bXAuYy04NjMte1xcbi0tXFxuZnMvY29yZWR1bXAuYz04NzE9c3RhdGljIGlubGluZSB2b2lkIGNvcmVkdW1wX3NvY2tfc2h1dGRvd24oc3RydWN0IGZpbGUgKmZpbGUpIHsgfVxcbmZzL2NvcmVkdW1wLmM6ODcyOnN0YXRpYyBpbmxpbmUgYm9vbCBjb3JlZHVtcF9zb2NrZXQoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pIHsgcmV0dXJuIGZhbHNlOyB9XFxuZnMvY29yZWR1bXAuYy04NzMtI2VuZGlmXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTg3NS0vKiBjcHJtLVxcdTAwM2VkdW1wYWJsZSBpcyB0aGUgc25hcHNob3Qgb2YgdGFzayBkdW1wYWJpbGl0eSBhdCBkdW1wIHN0YXJ0LiAqL1xcbmZzL2NvcmVkdW1wLmM6ODc2OnN0YXRpYyBpbmxpbmUgYm9vbCBjb3JlZHVtcF9mb3JjZV9zdWlkX3NhZmUoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG5mcy9jb3JlZHVtcC5jLTg3Ny17XFxuLS1cXG5mcy9jb3JlZHVtcC5jLTg4MS1cXG5mcy9jb3JlZHVtcC5jOjg4MjpzdGF0aWMgYm9vbCBjb3JlZHVtcF9maWxlKHN0cnVjdCBjb3JlX25hbWUgKmNuLCBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLFxcbmZzL2NvcmVkdW1wLmMtODgzLVxcdFxcdFxcdCAgY29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10KVxcbi0tXFxuZnMvY29yZWR1bXAuYy05NzItXFxuZnMvY29yZWR1bXAuYzo5NzM6c3RhdGljIGJvb2wgY29yZWR1bXBfcGlwZShzdHJ1Y3QgY29yZV9uYW1lICpjbiwgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG5mcy9jb3JlZHVtcC5jLTk3NC1cXHRcXHRcXHQgIHNpemVfdCAqYXJndiwgaW50IGFyZ2MpXFxuLS1cXG5mcy9jb3JlZHVtcC5jPTEwMzk9c3RhdGljIGJvb2wgY29yZWR1bXBfd3JpdGUoc3RydWN0IGNvcmVfbmFtZSAqY24sXFxuZnMvY29yZWR1bXAuYzoxMDQwOlxcdFxcdFxcdCAgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG5mcy9jb3JlZHVtcC5jLTEwNDEtXFx0XFx0XFx0ICBjb25zdCBzdHJ1Y3QgbGludXhfYmluZm10ICpiaW5mbXQpXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTEwNjYtXFxuZnMvY29yZWR1bXAuYzoxMDY3OnN0YXRpYyB2b2lkIGNvcmVkdW1wX2NsZWFudXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0pXFxuZnMvY29yZWR1bXAuYy0xMDY4LXtcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTA3OC1cXG5mcy9jb3JlZHVtcC5jOjEwNzk6c3RhdGljIGlubGluZSBib29sIGNvcmVkdW1wX3NraXAoY29uc3Qgc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSxcXG5mcy9jb3JlZHVtcC5jLTEwODAtXFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCBsaW51eF9iaW5mbXQgKmJpbmZtdClcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTA5MC1cXG5mcy9jb3JlZHVtcC5jOjEwOTE6c3RhdGljIHZvaWQgZG9fY29yZWR1bXAoc3RydWN0IGNvcmVfbmFtZSAqY24sIHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sXFxuZnMvY29yZWR1bXAuYy0xMDkyLVxcdFxcdFxcdHNpemVfdCAqKmFyZ3YsIGludCAqYXJnYywgY29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10KVxcbi0tXFxuZnMvY29yZWR1bXAuYz0xMTYwPXZvaWQgdmZzX2NvcmVkdW1wKGNvbnN0IGtlcm5lbF9zaWdpbmZvX3QgKnNpZ2luZm8pXFxuLS1cXG5mcy9jb3JlZHVtcC5jLTExNjctXFx0aW50IGFyZ2MgPSAwO1xcbmZzL2NvcmVkdW1wLmM6MTE2ODpcXHRzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zIGNwcm0gPSB7XFxuZnMvY29yZWR1bXAuYy0xMTY5LVxcdFxcdC5zaWdpbmZvID0gc2lnaW5mbyxcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTIwOC0gKi9cXG5mcy9jb3JlZHVtcC5jOjEyMDk6c3RhdGljIGludCBfX2R1bXBfZW1pdChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCBjb25zdCB2b2lkICphZGRyLCBpbnQgbnIpXFxuZnMvY29yZWR1bXAuYy0xMjEwLXtcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTIyOC1cXG5mcy9jb3JlZHVtcC5jOjEyMjk6c3RhdGljIGludCBfX2R1bXBfc2tpcChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCBzaXplX3QgbnIpXFxuZnMvY29yZWR1bXAuYy0xMjMwLXtcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTI0OS1cXG5mcy9jb3JlZHVtcC5jOjEyNTA6aW50IGR1bXBfZW1pdChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCBjb25zdCB2b2lkICphZGRyLCBpbnQgbnIpXFxuZnMvY29yZWR1bXAuYy0xMjUxLXtcXG4tLVxcbmZzL2NvcmVkdW1wLmM9MTI1OT1FWFBPUlRfU1lNQk9MKGR1bXBfZW1pdCk7XFxuZnMvY29yZWR1bXAuYy0xMjYwLVxcbmZzL2NvcmVkdW1wLmM6MTI2MTp2b2lkIGR1bXBfc2tpcF90byhzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtLCB1bnNpZ25lZCBsb25nIHBvcylcXG5mcy9jb3JlZHVtcC5jLTEyNjIte1xcbi0tXFxuZnMvY29yZWR1bXAuYz0xMjY1PUVYUE9SVF9TWU1CT0woZHVtcF9za2lwX3RvKTtcXG5mcy9jb3JlZHVtcC5jLTEyNjYtXFxuZnMvY29yZWR1bXAuYzoxMjY3OnZvaWQgZHVtcF9za2lwKHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sIHNpemVfdCBucilcXG5mcy9jb3JlZHVtcC5jLTEyNjgte1xcbi0tXFxuZnMvY29yZWR1bXAuYz0xMjcxPUVYUE9SVF9TWU1CT0woZHVtcF9za2lwKTtcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTI3My0jaWZkZWYgQ09ORklHX0VMRl9DT1JFXFxuZnMvY29yZWR1bXAuYzoxMjc0OnN0YXRpYyBpbnQgZHVtcF9lbWl0X3BhZ2Uoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgc3RydWN0IHBhZ2UgKnBhZ2UpXFxuZnMvY29yZWR1bXAuYy0xMjc1LXtcXG4tLVxcbmZzL2NvcmVkdW1wLmM9MTMzMD1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpkdW1wX3BhZ2VfY29weShzdHJ1Y3QgcGFnZSAqc3JjLCBzdHJ1Y3QgcGFnZSAqZHN0KVxcbi0tXFxuZnMvY29yZWR1bXAuYy0xMzM1LVxcbmZzL2NvcmVkdW1wLmM6MTMzNjppbnQgZHVtcF91c2VyX3JhbmdlKHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgKmNwcm0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsXFxuZnMvY29yZWR1bXAuYy0xMzM3LVxcdFxcdCAgICB1bnNpZ25lZCBsb25nIGxlbilcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTM5OS1cXG5mcy9jb3JlZHVtcC5jOjE0MDA6aW50IGR1bXBfYWxpZ24oc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSwgaW50IGFsaWduKVxcbmZzL2NvcmVkdW1wLmMtMTQwMS17XFxuLS1cXG5mcy9jb3JlZHVtcC5jPTE2NzY9c3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqY29yZWR1bXBfbmV4dF92bWEoc3RydWN0IHZtYV9pdGVyYXRvciAqdm1pLFxcbi0tXFxuZnMvY29yZWR1bXAuYy0xNjg4LVxcbmZzL2NvcmVkdW1wLmM6MTY4OTpzdGF0aWMgdm9pZCBmcmVlX3ZtYV9zbmFwc2hvdChzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zICpjcHJtKVxcbmZzL2NvcmVkdW1wLmMtMTY5MC17XFxuLS1cXG5mcy9jb3JlZHVtcC5jPTE3MDM9c3RhdGljIGludCBjbXBfdm1hX3NpemUoY29uc3Qgdm9pZCAqdm1hX21ldGFfbGhzX3B0ciwgY29uc3Qgdm9pZCAqdm1hX21ldGFfcmhzX3B0cilcXG4tLVxcbmZzL2NvcmVkdW1wLmMtMTcxOC0gKi9cXG5mcy9jb3JlZHVtcC5jOjE3MTk6c3RhdGljIGJvb2wgZHVtcF92bWFfc25hcHNob3Qoc3RydWN0IGNvcmVkdW1wX3BhcmFtcyAqY3BybSlcXG5mcy9jb3JlZHVtcC5jLTE3MjAte1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0MjozOC42MzUzMTIwOTlaIiwiU2VxIjo4NSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6ODA1MjUwMDQzODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOlxuXG4qKkFuYWx5emluZyBgdmZzX2NvcmVkdW1wYCBhbmQgYGNwcm1gKipcblxuT2theSwgc28gSSdtIGRpZ2dpbmcgaW50byBgdmZzX2NvcmVkdW1wYCBhbmQgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgaXRzIHJvbGUuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIHNlZSBob3cgYGNwcm1gIGlzIGRlY2xhcmVkIGFuZCB1dGlsaXplZCB3aXRoaW4gdGhhdCBjb250ZXh0LiBUaGUgZ29hbCBoZXJlIGlzIHRvIGdldCBhIGhhbmRsZSBvbiB0aGUgaW50ZXJhY3Rpb24gYW5kIGFueSBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzIG9yIGNvbnN0cmFpbnRzLiBJJ20gYXNzdW1pbmcgdGhlcmUncyBzb21lIGludGVyZXN0aW5nIGxvZ2ljIG9yIGRhdGEgZmxvdyB0aGF0IEkgbmVlZCB0byBkaXNzZWN0LiBMZXQncyBzZWUgd2hhdCB0aGUgY29kZSByZXZlYWxzLiBUaW1lIHRvIHB1dCBvbiB0aGUgZGV0ZWN0aXZlIGhhdCFcblxuXG4iLCJJbnB1dFRva2VucyI6NTUzNzAsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0Mzo1OS4xNjAzMjAxMzhaIiwiU2VxIjo4NiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTM2NTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImZzL2NvcmVkdW1wLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTE2NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTE2NTpcXHRcXHRjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtXFx1MDAzZW1tO1xcbjExNjY6XFx0XFx0Y29uc3Qgc3RydWN0IGxpbnV4X2JpbmZtdCAqYmluZm10ID0gbW0tXFx1MDAzZWJpbmZtdDtcXG4xMTY3OlxcdFxcdGludCBhcmdjID0gMDtcXG4xMTY4OlxcdFxcdHN0cnVjdCBjb3JlZHVtcF9wYXJhbXMgY3BybSA9IHtcXG4xMTY5OlxcdFxcdFxcdC5zaWdpbmZvID0gc2lnaW5mbyxcXG4xMTcwOlxcdFxcdFxcdC5saW1pdCA9IHJsaW1pdChSTElNSVRfQ09SRSksXFxuMTE3MTpcXHRcXHRcXHQvKiBTbmFwc2hvdCBNTUZfRFVNUF9GSUxURVJfKiAodW5sb2NrZWQpIGFuZCBkdW1wYWJsZSBmb3IgdGhlIGR1bXAuICovXFxuMTE3MjpcXHRcXHRcXHQubW1fZmxhZ3MgPSBfX21tX2ZsYWdzX2dldF93b3JkKG1tKSxcXG4xMTczOlxcdFxcdFxcdC5kdW1wYWJsZSA9IHRhc2tfZXhlY19zdGF0ZV9nZXRfZHVtcGFibGUoY3VycmVudCksXFxuMTE3NDpcXHRcXHRcXHQudm1hX21ldGEgPSBOVUxMLFxcbjExNzU6XFx0XFx0XFx0LmNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCksXFxuMTE3NjpcXHRcXHR9O1xcbjExNzc6XFx0XFxuMTE3ODpcXHRcXHRhdWRpdF9jb3JlX2R1bXBzKHNpZ2luZm8tXFx1MDAzZXNpX3NpZ25vKTtcXG4xMTc5OlxcdFxcbjExODA6XFx0XFx0aWYgKGNvcmVkdW1wX3NraXAoXFx1MDAyNmNwcm0sIGJpbmZtdCkpXFxuMTE4MTpcXHRcXHRcXHRyZXR1cm47XFxuMTE4MjpcXHRcXG4xMTgzOlxcdFxcdENMQVNTKHByZXBhcmVfY3JlZHMsIGNyZWQpKCk7XFxuMTE4NDpcXHRcXHRpZiAoIWNyZWQpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjQzOjU5LjE2MDQ1OTAxOFoiLCJTZXEiOjg3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNDk1MzIyNDUyOSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgUG90ZW50aWFsIE5VTEwgUG9pbnRlciBEZXJlZmVyZW5jZXMgd2l0aCBQSUQgSGFuZGxpbmcqKlxuXG5Pa2F5LCBzbyBJJ20gZGlnZ2luZyBpbnRvIHRoaXMgYGNvcmVkdW1wX3BhcmFtc2Agc3RydWN0LCBzcGVjaWZpY2FsbHkgdGhlIGBjcHJtLnBpZGAgYXJyYXksIHdoaWNoLCBhcyBJIHNlZSBpdCwgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyB0aGFua3MgdG8gdGhlIHN0cnVjdCdzIGluaXRpYWxpemF0aW9uLiBJJ20gZm9jdXNpbmcgb24gcG90ZW50aWFsIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZXMgd2hlbiB3b3JraW5nIHdpdGggUElEcy4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZvbGxvdyB0aGUgY29kZSBwYXRocyB3aGVyZSB0aGUgYHBpZGAgYXJyYXkgaXMgdXRpbGl6ZWQuXG5cbkZpcnN0LCBJIGV4YW1pbmVkIGBwaWRmcy5jYCBhbmQgZm91bmQgYF9fcGlkZnNfcmVnaXN0ZXJfcGlkc2AsIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggYHBpZHNgIHVwIHRvIGEgYGxhc3RgIHBpZCB0eXBlLiAgSSB0aGVuIGxvb2tlZCBpbnRvIGBwaWRmc19jb3JlZHVtcGAsIHdoZXJlIHRoZSBsb29wIGBmb3IgKGVudW0gcGlkX3R5cGUgdHlwZSA9IFBJRFRZUEVfUElEOyB0eXBlIFx1MDAzYz0gcGlkc19sYXN0KGNwcm0tXHUwMDNlcGlkKTsgdHlwZSsrKWAgaXMgdXRpbGl6ZWQsIHdoaWNoIGluIHR1cm4gY2FsbHMgYHBpZGZzX2NvcmVkdW1wX3BpZGAuIFRoYXQncyB3aGVyZSB0aGluZ3MgZ2V0IGludGVyZXN0aW5nLlxuXG5JIHRvb2sgYSBsb29rIGF0IGBwaWRzX2xhc3RgIGFuZCBmaWd1cmVkIG91dCBob3cgdGhlIGxvb3AgYm91bmQgaXMgY2FsY3VsYXRlZCB3aGVuIGBERUNMQVJFX1BJRFMocGlkLCBQSURUWVBFX1RHSUQpO2AgaXMgdXNlZC4gIEVzc2VudGlhbGx5LCB0aGUgbG9vcCBpdGVyYXRlcyBvdmVyIHRoZSBgUElEVFlQRV9QSURgIGFuZCBgUElEVFlQRV9UR0lEYCB0eXBlcy4gVGhlbiBJIHdlbnQgdG8gYHBpZGZzX2NvcmVkdW1wX3BpZGAsIGFuZCBzYXcgdGhhdCB0aGVyZSdzIGEgZGVyZWZlcmVuY2UgYGF0dHIgPSBSRUFEX09OQ0UocGlkLVx1MDAzZWF0dHIpO2AgYW5kIEkgdGhvdWdodCwgXCJXYWl0LCB3aGF0IGlmIGBwaWRgIGlzIE5VTEw/XCIgVGhhdCdkIGJlIGEgY3Jhc2gsIHdoaWNoIGlzIHdoYXQgSSdtIGxvb2tpbmcgZm9yIVxuXG5JIHdlbnQgYmFjayB0byB0cmFjZSB3aGVyZSBgY3BybS1cdTAwM2VwaWRbdHlwZV1gIGdldHMgcG9wdWxhdGVkLiBJbiBgY29yZWR1bXBfcGFyc2VgIGFuZCBgY29yZWR1bXBfc29ja19jb25uZWN0YCwgSSBzYXcgYHRhc2tfcGlkcyhjcHJtLVx1MDAzZXBpZCwgY3VycmVudCk7YCwgc28gSSBmb2xsb3dlZCB0aGF0LiAgYHRhc2tfcGlkc2AgY2FsbHMgYF9fdGFza19waWRzYCwgd2hpY2ggdXNlcyBhIGxvb3AgdGhhdCwgZm9yIGBjdXJyZW50YCwgc2hvdWxkICpuZXZlciogcmV0dXJuIE5VTEwgYHBpZGAgdmFsdWVzIGZvciBgUElEVFlQRV9QSURgIG9yIGBQSURUWVBFX1RHSURgLiBUaGF0IHNlZW1zIHNhZmUuXG5cbkkgbW92ZWQgb24gdG8gbG9vayB0aHJvdWdoIHRoZSBgaW5jbHVkZS9saW51eC9waWQuaGAgZmlsZSwgYW5kIGZvdW5kIG90aGVyIGZ1bmN0aW9ucywgc3VjaCBhcyBgX19nZXRfcGlkc2AsIGBfX3B1dF9waWRzYCwgYF9fc3dhcF9waWRzYCwgYF9fcGlkc19lcXVhbGAsIGBfX3Rhc2tfcGlkc2AsIGFuZCBgX19nZXRfdGFza19waWRzYC4gIFRoZXNlIGFsbCBsb29rIHJlYXNvbmFibGUgaW4gdGVybXMgb2YgbnVsbC1jaGVja2luZyBiZWNhdXNlIHRoZXkgZ2VuZXJhbGx5IGl0ZXJhdGUgb3ZlciBhIGtub3duIHZhbGlkIHJhbmdlIG9mIHBpZCB0eXBlcywgb3IsIGluIHRoZSBjYXNlIG9mIGB0YXNrX3BpZHNgIGZ1bmN0aW9ucywgcmVjZWl2ZSBhIGB0YXNrYCB3aGljaCBndWFyYW50ZWVzIGEgUElELlxuXG5JIHRoZW4gc3RhcnRlZCB0byBjaGVjayB0aGUgYmx1ZXRvb3RoIGNoYW5nZXMuIEluIGBuZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jYCwgSSBub3RpY2VkIHRoYXQgYHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfVEdJRF1gIGNhbiBwb3RlbnRpYWxseSBnZXQgaW5pdGlhbGl6ZWQgdmlhIGBnZXRfcGlkKHRhc2tfdGdpZChjdXJyZW50KSlgLiBUaGUgc3RydWN0IGBzb2NrYCB1c2VzIGBERUNMQVJFX1BJRFMoc2tfcGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7YCwgd2hpY2ggbWVhbnMgYHNrLVx1MDAzZXNrX3BlZXJfcGlkW1BJRFRZUEVfUElEXWAgd2lsbCBiZSAwIChOVUxMKS4gVGhpcyBsb29rcyBwcm9taXNpbmchXG5cbkkgY29udGludWVkIHRvIGNoZWNrIHRoZSBmdW5jdGlvbnM6IGBidF9hY2NlcHRfZW5xdWV1ZWAsIGBuZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmNgLCBgbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmNgLCBhbmQgYF9fc2tfZGVzdHJ1Y3RgLCBhbmQgcmVhbGl6ZWQgdGhlIFBJRCBjYW4gYmUgTlVMTCBpbiB0aG9zZSBmdW5jdGlvbnMuXG5cbkZpbmFsbHksIEkgY2hlY2tlZCBgbmV0L3VuaXgvYWZfdW5peC5jYCB0byBzZWUgaG93IGB1bml4X3BlZXJjcmVkYCBpcyB1c2VkIHNpbmNlIGl0IHVzZXMgdGhlIHNhbWUgYERFQ0xBUkVfUElEU2AgbWFjcm8uXG5cblNvLCBpbiBzdW1tYXJ5LCBJJ20gZmluZGluZyBwbGFjZXMgd2hlcmUgUElEcyBhcmUgcG90ZW50aWFsbHkgTlVMTCBhbmQgdGhlbiBiZWluZyBkZXJlZmVyZW5jZWQsIHdoaWNoIGlzIHdoYXQgSSB3YXMgbG9va2luZyBmb3IuIE5vdyBJIG5lZWQgdG8gZGVjaWRlIGlmIHRoZXNlIHBvdGVudGlhbCBOVUxMcyByZXByZXNlbnQgYWN0dWFsIHZ1bG5lcmFiaWxpdGllcyBvciBhcmUgaGFuZGxlZCBzYWZlbHkgZWxzZXdoZXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NTg4MSwiT3V0cHV0VG9rZW5zIjoyNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjIxMTQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0NDozNC4xMTM2ODc4NjdaIiwiU2VxIjo4OCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3MDE4MDAxMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ1bml4X3BlZXJjcmVkXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC91bml4XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC91bml4L2FmX3VuaXguYz02NjU9c3RhdGljIHZvaWQgdW5peF9yZWxlYXNlX3NvY2soc3RydWN0IHNvY2sgKnNrLCBpbnQgZW1icmlvbilcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYy03MzgtXFxubmV0L3VuaXgvYWZfdW5peC5jOjczOTpzdHJ1Y3QgdW5peF9wZWVyY3JlZCB7XFxubmV0L3VuaXgvYWZfdW5peC5jLTc0MC1cXHRERUNMQVJFX1BJRFMocGVlcl9waWQsIFBJRFRZUEVfVEdJRCk7XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtNzQzLVxcbm5ldC91bml4L2FmX3VuaXguYzo3NDQ6c3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9wZWVyY3JlZChzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpXFxubmV0L3VuaXgvYWZfdW5peC5jLTc0NS17XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtNzU4LVxcbm5ldC91bml4L2FmX3VuaXguYzo3NTk6c3RhdGljIHZvaWQgZHJvcF9wZWVyY3JlZChzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpXFxubmV0L3VuaXgvYWZfdW5peC5jLTc2MC17XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9NzcwPXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzayxcXG5uZXQvdW5peC9hZl91bml4LmM6NzcxOlxcdFxcdFxcdFxcdCBjb25zdCBzdHJ1Y3QgdW5peF9wZWVyY3JlZCAqcGVlcmNyZWQpXFxubmV0L3VuaXgvYWZfdW5peC5jLTc3Mi17XFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmMtNzc2LVxcbm5ldC91bml4L2FmX3VuaXguYzo3Nzc6c3RhdGljIHZvaWQgdXBkYXRlX3BlZXJjcmVkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHVuaXhfcGVlcmNyZWQgKnBlZXJjcmVkKVxcbm5ldC91bml4L2FmX3VuaXguYy03Nzgte1xcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jPTgwNT1zdGF0aWMgaW50IHVuaXhfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKVxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTgwOS1cXHRzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7XFxubmV0L3VuaXgvYWZfdW5peC5jOjgxMDpcXHRzdHJ1Y3QgdW5peF9wZWVyY3JlZCBwZWVyY3JlZCA9IHt9O1xcbm5ldC91bml4L2FmX3VuaXguYy04MTEtXFxuLS1cXG5uZXQvdW5peC9hZl91bml4LmM9MTYzMT1zdGF0aWMgaW50IHVuaXhfc3RyZWFtX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKnVhZGRyLFxcbi0tXFxubmV0L3VuaXgvYWZfdW5peC5jLTE2MzYtXFx0c3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spLCAqbmV3dSwgKm90aGVydTtcXG5uZXQvdW5peC9hZl91bml4LmM6MTYzNzpcXHRzdHJ1Y3QgdW5peF9wZWVyY3JlZCBwZWVyY3JlZCA9IHt9O1xcbm5ldC91bml4L2FmX3VuaXguYy0xNjM4LVxcdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTtcXG4tLVxcbm5ldC91bml4L2FmX3VuaXguYz0xODExPXN0YXRpYyBpbnQgdW5peF9zb2NrZXRwYWlyKHN0cnVjdCBzb2NrZXQgKnNvY2thLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrYilcXG5uZXQvdW5peC9hZl91bml4LmMtMTgxMi17XFxubmV0L3VuaXgvYWZfdW5peC5jOjE4MTM6XFx0c3RydWN0IHVuaXhfcGVlcmNyZWQgc2thX3BlZXJjcmVkID0ge30sIHNrYl9wZWVyY3JlZCA9IHt9O1xcbm5ldC91bml4L2FmX3VuaXguYy0xODE0LVxcdHN0cnVjdCBzb2NrICpza2EgPSBzb2NrYS1cXHUwMDNlc2ssICpza2IgPSBzb2NrYi1cXHUwMDNlc2s7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjQ0OjM0LjQ4Mzg3OTkyOVoiLCJTZXEiOjg5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxNTU1NzUxMjczNCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBbmFseXNpcyBvZiBVbml4IFNvY2tldCBQZWVyIENyZWRlbnRpYWxzKipcblxuT2theSwgc28gSSdtIGxvb2tpbmcgYXQgaG93IHBlZXIgY3JlZGVudGlhbHMgYXJlIGhhbmRsZWQgaW4gdGhlc2UgVW5peCBzb2NrZXQgZnVuY3Rpb25zIOKAkyBgdW5peF9saXN0ZW5gLCBgdW5peF9zdHJlYW1fY29ubmVjdGAsIGFuZCBgdW5peF9zb2NrZXRwYWlyYC4gSSBzZWUgdGhhdCBpbiBhbGwgdGhyZWUsIHRoZSBgc3RydWN0IHVuaXhfcGVlcmNyZWRgIGlzIGluaXRpYWxpemVkIHVzaW5nIGB7fWAuIFRoYXQncyB0aGUgYmFzZWxpbmUuIE5vdywgdGhlIGtleSBzZWVtcyB0byBiZSBpbiBgcHJlcGFyZV9wZWVyY3JlZGAuXG5cbkluIGBwcmVwYXJlX3BlZXJjcmVkYCwgZmlyc3QgSSBzZWUgdGhhdCB0aGUgcHJvY2VzcyBJRHMgYXJlIG9idGFpbmVkIHVzaW5nIGBnZXRfdGFza19waWRzYC4gVGhlbiwgdGhlc2UgSURzIGFyZSByZWdpc3RlcmVkIHVzaW5nIGBwaWRmc19yZWdpc3Rlcl9waWRzYC4gSWYgdGhlcmUncyBhbiBlcnJvciBkdXJpbmcgUElEIHJlZ2lzdHJhdGlvbiwgYHB1dF9waWRzYCBpcyBjYWxsZWQgZm9yIGNsZWFudXAsIGFuZCBJIGFzc3VtZSB0aGUgc3RydWN0dXJlIGVsZW1lbnRzIGJlY29tZSBpbnZhbGlkIG9yIE5VTEwuIElmIHRoYXQgZmFpbHMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGFuZCBzZXRzIHRoZSBzdHJ1Y3QgZWxlbWVudHMgdG8gTlVMTC4gVGhpcyBpcyBpbXBvcnRhbnQgdG8gbm90ZSAtIGZhaWx1cmUgdG8gcmVnaXN0ZXIgUElEcyByZXF1aXJlcyB0aGF0IHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cC5cblxuSWYgYHByZXBhcmVfcGVlcmNyZWRgICpzdWNjZWVkcyosIGhvd2V2ZXIsIHRoZW4gYHBlZXJfcGlkYCBhbmQgYHBlZXJfY3JlZGAgYXJlIGZ1bGx5IGluaXRpYWxpemVkLiBJdCBsb29rcyBsaWtlIGBwZWVyX2NyZWRgIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBjdXJyZW50IGNyZWRlbnRpYWwgdXNpbmcgYGdldF9jdXJyZW50X2NyZWQoKWAuIFNvLCB0aGUgZW50aXJlIHN0cnVjdCBpcyB3ZWxsIGRlZmluZWQgd2l0aCBhbGwgbmVlZGVkIGNyZWRlbnRpYWxzLlxuXG5Ob3csIG15IG5leHQgbW92ZSBpcyB0byB1bmRlcnN0YW5kIGhvdyB0aGlzIGBzdHJ1Y3QgdW5peF9wZWVyY3JlZGAgaXMgdWx0aW1hdGVseSB1c2VkLiBJIG5lZWQgdG8gaW52ZXN0aWdhdGUgYGNyZWRfdG9fdWNyZWRgLiBMZXQgbWUgY2hlY2sgYG5ldC9jb3JlL3NvY2suY2Agb3Igd2hlcmV2ZXIgZWxzZSBpdCBpcyBjYWxsZWQuIEEgc2VhcmNoIGZvciBgY3JlZF90b191Y3JlZGAgc2hvdWxkIHJldmVhbCB3aGVyZSB0aGlzIGNyZWRlbnRpYWwgaW5mb3JtYXRpb24gaXMgYWN0dWFsbHkgdHJhbnNsYXRlZCBvciB1c2VkIGluIHRoZSBvdmVyYWxsIG5ldHdvcmsgc3RhY2suXG5cblxuIiwiSW5wdXRUb2tlbnMiOjU5NTc4LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUzLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjQ0OjUwLjA0MTM5NTA0M1oiLCJTZXEiOjkwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTU5MTMzNTkzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjcmVkX3RvX3VjcmVkXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9jb3JlL3NvY2suYz0xNzA3PXN0YXRpYyBjb25zdCBzdHJ1Y3QgY3JlZCAqc2tfZ2V0X3BlZXJfY3JlZChzdHJ1Y3Qgc29jayAqc2spXFxuLS1cXG5uZXQvY29yZS9zb2NrLmMtMTcxNy1cXG5uZXQvY29yZS9zb2NrLmM6MTcxODpzdGF0aWMgdm9pZCBjcmVkX3RvX3VjcmVkKHN0cnVjdCBwaWQgKnBpZCwgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsXFxubmV0L2NvcmUvc29jay5jLTE3MTktXFx0XFx0XFx0ICBzdHJ1Y3QgdWNyZWQgKnVjcmVkKVxcbi0tXFxubmV0L2NvcmUvc29jay5jPTE3OTA9aW50IHNrX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxcbi0tXFxubmV0L2NvcmUvc29jay5jLTE5NzQtXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZzay1cXHUwMDNlc2tfcGVlcl9sb2NrKTtcXG5uZXQvY29yZS9zb2NrLmM6MTk3NTpcXHRcXHRjcmVkX3RvX3VjcmVkKHNrLVxcdTAwM2Vza19wZWVyX3BpZFtQSURUWVBFX1RHSURdLCBzay1cXHUwMDNlc2tfcGVlcl9jcmVkLFxcbm5ldC9jb3JlL3NvY2suYy0xOTc2LVxcdFxcdFxcdCAgICAgIFxcdTAwMjZwZWVyY3JlZCk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTMxVDEyOjQ0OjUxLjYzMjczODAyM1oiLCJTZXEiOjkxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1Njc2MTgwNTcxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBgY3JlZF90b191Y3JlZGAqKlxuXG5Pa2F5LCB0aW1lIHRvIGdldCB0byB0aGUgaGVhcnQgb2YgdGhlIG1hdHRlci4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGNyZWRlbnRpYWxzIGFyZSBiZWluZyBoYW5kbGVkIGF0IHRoZSBzb2NrZXQgbGF5ZXIuIE15IGluc3RpbmN0IHRlbGxzIG1lIHRoZSBwbGFjZSB0byBzdGFydCBpcyBgY3JlZF90b191Y3JlZGAgd2l0aGluIGBuZXQvY29yZS9zb2NrLmNgLiBUaGF0J3Mgd2hlcmUgSSBhbnRpY2lwYXRlIHRoZSBjb3JlIG1hcHBpbmcgYmV0d2VlbiB0aGUga2VybmVsJ3MgY3JlZGVudGlhbCBzdHJ1Y3R1cmVzIGFuZCB0aGUgdXNlciBzcGFjZSBjcmVkZW50aWFscyAodWNyZWQpIHdpbGwgcmVzaWRlLiBJdCdzIGEgY3JpdGljYWwgZnVuY3Rpb24gZm9yIHNlY3VyaXR5IGNvbnRleHQgcHJvcGFnYXRpb24sIHNvIEkgbmVlZCB0byBzZWUgaG93IGl0J3MgaW1wbGVtZW50ZWQgYW5kIGlkZW50aWZ5IGFueSBwb3RlbnRpYWwgZ290Y2hhcyBvciBlZGdlIGNhc2VzLiBJJ2xsIGJlIGxvb2tpbmcgZm9yIHRoaW5ncyBsaWtlIGhvdyBpdCBoYW5kbGVzIGRpZmZlcmVudCB0eXBlcyBvZiBzb2NrZXRzLCBhbnkgaW1wbGljaXQgYXNzdW1wdGlvbnMgYWJvdXQgY3JlZGVudGlhbCBzb3VyY2VzLCBhbmQgaG93IGl0IGRlYWxzIHdpdGggc2l0dWF0aW9ucyB3aGVyZSBjcmVkZW50aWFsIGluZm9ybWF0aW9uIG1pZ2h0IGJlIGluY29tcGxldGUgb3Igc3RhbGUuIFRoaXMgZnVuY3Rpb24ncyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgZ2l2ZSBtZSBhIHNvbGlkIGZvdW5kYXRpb24gdG8gdW5kZXJzdGFuZCB0aGUgYmVoYXZpb3Igb2YgdGhlIHNvY2tldCBsYXllci5cblxuXG4iLCJJbnB1dFRva2VucyI6NjA0NDMsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMiwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0zMVQxMjo0NDo1Ny4zMDg5MjEzMjRaIiwiU2VxIjo5MiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTcxMzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9jb3JlL3NvY2suY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxNzE1LFxuICBcIkxpbmVDb3VudFwiOiAyNVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIxNzE1OlxcdFxcdHJldHVybiBjcmVkO1xcbjE3MTY6XFx0fVxcbjE3MTc6XFx0XFxuMTcxODpcXHRzdGF0aWMgdm9pZCBjcmVkX3RvX3VjcmVkKHN0cnVjdCBwaWQgKnBpZCwgY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsXFxuMTcxOTpcXHRcXHRcXHRcXHQgIHN0cnVjdCB1Y3JlZCAqdWNyZWQpXFxuMTcyMDpcXHR7XFxuMTcyMTpcXHRcXHR1Y3JlZC1cXHUwMDNlcGlkID0gcGlkX3ZucihwaWQpO1xcbjE3MjI6XFx0XFx0dWNyZWQtXFx1MDAzZXVpZCA9IHVjcmVkLVxcdTAwM2VnaWQgPSAtMTtcXG4xNzIzOlxcdFxcdGlmIChjcmVkKSB7XFxuMTcyNDpcXHRcXHRcXHRzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmN1cnJlbnRfbnMgPSBjdXJyZW50X3VzZXJfbnMoKTtcXG4xNzI1OlxcdFxcbjE3MjY6XFx0XFx0XFx0dWNyZWQtXFx1MDAzZXVpZCA9IGZyb21fa3VpZF9tdW5nZWQoY3VycmVudF9ucywgY3JlZC1cXHUwMDNlZXVpZCk7XFxuMTcyNzpcXHRcXHRcXHR1Y3JlZC1cXHUwMDNlZ2lkID0gZnJvbV9rZ2lkX211bmdlZChjdXJyZW50X25zLCBjcmVkLVxcdTAwM2VlZ2lkKTtcXG4xNzI4OlxcdFxcdH1cXG4xNzI5OlxcdH1cXG4xNzMwOlxcdFxcbjE3MzE6XFx0c3RhdGljIGludCBncm91cHNfdG9fdXNlcihzb2NrcHRyX3QgZHN0LCBjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqc3JjKVxcbjE3MzI6XFx0e1xcbjE3MzM6XFx0XFx0c3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zID0gY3VycmVudF91c2VyX25zKCk7XFxuMTczNDpcXHRcXHRpbnQgaTtcXG4xNzM1OlxcdFxcbjE3MzY6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIHNyYy1cXHUwMDNlbmdyb3VwczsgaSsrKSB7XFxuMTczNzpcXHRcXHRcXHRnaWRfdCBnaWQgPSBmcm9tX2tnaWRfbXVuZ2VkKHVzZXJfbnMsIHNyYy1cXHUwMDNlZ2lkW2ldKTtcXG4xNzM4OlxcdFxcbjE3Mzk6XFx0XFx0XFx0aWYgKGNvcHlfdG9fc29ja3B0cl9vZmZzZXQoZHN0LCBpICogc2l6ZW9mKGdpZCksIFxcdTAwMjZnaWQsIHNpemVvZihnaWQpKSlcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6NDQ6NTcuMzA5MDk0NTg0WiIsIlNlcSI6OTMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjE5OTg3OTU2OTMwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IE5vIExlYWtzIG9yIFVuaW5pdGlhbGl6ZWQgTWVtb3J5IERldGVjdGVkKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBhbmFseXNpcyBmb2N1c2VzIG9uIHBvdGVudGlhbCBpbmZvcm1hdGlvbiBsZWFrcyBhbmQgdGhlIHByZXNlbmNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIHRoZSByZWxldmFudCBzb2NrZXQgY29kZSwgc3BlY2lmaWNhbGx5IGNvbmNlcm5pbmcgdGhlIGBTT19QRUVSQ1JFRGAgYW5kIGBTT19QRUVSUElERkRgIHNvY2tldCBvcHRpb25zIGFuZCB0aGVpciBhc3NvY2lhdGVkIGRhdGEgc3RydWN0dXJlcy5cblxuRmlyc3QsIEkgZXhhbWluZWQgYHNrX2dldHNvY2tvcHRgLiAgV2l0aGluIGBjYXNlIFNPX1BFRVJDUkVEYCwgdGhlIGNvZGUgcmV0cmlldmVzIHBlZXIgY3JlZGVudGlhbHMgaW50byBhIGBzdHJ1Y3QgdWNyZWRgLiBJIHNlZSB0aGF0IGBjcmVkX3RvX3VjcmVkYCBwb3B1bGF0ZXMgYWxsIHRoZSBmaWVsZHMgKFBJRCwgVUlELCBHSUQpIG9mIGBwZWVyY3JlZGAgYmVmb3JlIGNvcHlpbmcgaXQgdG8gdXNlciBzcGFjZS4gIEFsc28sIGBzdHJ1Y3QgdWNyZWRgIGlzIHRpZ2h0bHkgcGFja2VkOyB0aGVyZSdzIG5vIHBhZGRpbmcgb24gZWl0aGVyIDMyLWJpdCBvciA2NC1iaXQgYXJjaGl0ZWN0dXJlcywgc28gdGhlcmUgYXJlIG5vIGNvbmNlcm5zIGFib3V0IGFjY2lkZW50YWxseSBsZWFraW5nIHVuaW5pdGlhbGl6ZWQgZGF0YSB3aXRoaW4gdGhlIHN0cnVjdC5cblxuTmV4dCwgSSBsb29rZWQgYXQgYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkYC4gSGVyZSwgdGhlIGNvZGUgcHJlcGFyZXMgYW5kIHJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3IgKGBwaWRmZGApIHJlcHJlc2VudGluZyB0aGUgcGVlcidzIHByb2Nlc3MuIFRoZSBgcGlkZmRgIGlzIGNyZWF0ZWQgYnkgYHBpZGZkX3ByZXBhcmVgIGFuZCB0aGVuIGNvcGllZCB0byB1c2VyIHNwYWNlLiBUaGUgY29kZSBwcm9wZXJseSBoYW5kbGVzIHRoZSBsZW5ndGggYW5kIHRoZXJlIGlzIG5vIGV2aWRlbmNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGxlYWtlZC5cblxuVGhlIGBzY21fcGlkZmRfcmVjdmAgZnVuY3Rpb24gd2FzIG5leHQuIFRoaXMgZnVuY3Rpb24gYWxzbyB3cml0ZXMgYSBgcGlkZmRgIHRvIHVzZXIgc3BhY2Ugd2l0aGluIGFuIFNDTSBtZXNzYWdlLiBJdCBjYWxscyBgcGlkZmRfcHJlcGFyZWAgd2hpY2ggYXNzaWducyBhIHZhbHVlIHRvIGBwaWRmZGAgYmVmb3JlIHNlbmRpbmcgaXQuXG5cblRoZW4sIEkgd2VudCB0aHJvdWdoIGEgY2hlY2tsaXN0IHRvIGxvb2sgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlLiBJIGNvbmZpcm1lZCB0aGF0OlxuXG4xLiAgYHNjbV9jb29raWVgIGluc3RhbmNlcyBhcmUgemVyb2VkIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbjIuICBgc2stXHUwMDNlc2tfcGVlcl9waWRgIGlzIGV4cGxpY2l0bHkgemVyb2VkIGR1cmluZyBzb2NrZXQgaW5pdGlhbGl6YXRpb24sIHByZXZlbnRpbmcgYW55IHBvdGVudGlhbCBsZWFrcyBmcm9tIHVuaW5pdGlhbGl6ZWQgUElEcy5cbjMuICBUaGUgYGNwcm0ucGlkYCBmaWVsZCB3aXRoaW4gYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgIGlzIHplcm8taW5pdGlhbGl6ZWQuXG40LiAgYHVuaXhfcGVlcmNyZWRgIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkIGFuZCBmdWxseSBwb3B1bGF0ZWQuXG41LiAgYHNrYi1cdTAwM2VjYmAgKHdoZXJlIGBVTklYQ0Ioc2tiKWAgaXMgbG9jYXRlZCkgaXMgemVyb2VkIHVwb24gU0tCIGFsbG9jYXRpb24uXG42LiAgQml0ZmllbGRzIHdpdGhpbiBgc3RydWN0IHNvY2tgIGFyZSBhbGwgY29ycmVjdGx5IGluaXRpYWxpemVkIChyZWxldmFudCB0byBgc2tfc2NtX3BpZGZkX3RocmVhZGAgYW5kIHJlbGF0ZWQgZmxhZ3MpIGR1cmluZyBhbGxvY2F0aW9uLCBzcGVjaWZpY2FsbHkgYnkgYGt6YWxsb2NgIG9yIGBza19hbGxvY2AsIGJvdGggb2Ygd2hpY2ggemVybyBtZW1vcnkuXG43LiAgSSBmb3VuZCBubyBpbnN0YW5jZXMgd2hlcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgcmVhZCBvciBsZWFrZWQgYWNyb3NzIHRoZSB1c2VyL2tlcm5lbCBib3VuZGFyeS5cbjguICBJIGNvbnNpZGVyZWQgdGhlIHBvc3NpYmlsaXR5IG9mIG1lbW9yeSBjb3JydXB0aW9uLCB1c2UtYWZ0ZXItZnJlZSwgcmVmZXJlbmNlIGNvdW50aW5nIGVycm9ycywgTlVMTCBkZXJlZmVyZW5jZXMsIG9yIGxvY2tpbmcgYnVncywgYnV0IHRoaXMgd291bGQgYmUgY2F1Z2h0IGJ5IEtBU0FOIG9yIHN0YW5kYXJkIGRlYnVnZ2VycywgbGlrZSBMT0NLREVQIG9yIFBST1ZFXFxfTE9DS0lORy5cblxuSSB0aGVuIGRpZCBhIGZpbmFsIHJldmlldyBhZ2FpbnN0IEtNU0FOLXNwZWNpZmljIGNyaXRlcmlhOlxuXG4qICAgSSBzYXcgbm8gY2FzZXMgb2Yga2VybmVsIHN0cnVjdHVyZXMgYmVpbmcgc2VudCB0byB1c2VyIHNwYWNlIHdoZXJlIGZpZWxkcyBvciBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC5cbiogICBJIGZvdW5kIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IHJlbGllcyBvbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy5cbiogICBJIG9ic2VydmVkIG5vIGFsbG9jYXRpb25zIG9yIGluaXRpYWxpemF0aW9ucyBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgZmllbGRzIHRoYXQgY291bGQgbGVhZCB0byBpc3N1ZXMuXG4qICAgVGhlcmUgYXJlIG5vIGNhc2VzIG9mIGJvdW5kcyBjaGVja3Mgb3IgbGVuZ3RoIGNoZWNrcyBhbGxvd2luZyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBieXRlcy5cblxuQmFzZWQgb24gdGhpcyBjb21wcmVoZW5zaXZlIGFuYWx5c2lzLCBJJ20gY29uZmlkZW50IHRoYXQgdGhlcmUgYXJlIG5vIEtNU0FOLXJlbGV2YW50IGlzc3Vlcy4gVGhlIGNvZGUgYXBwZWFycyB0byBiZSBjbGVhbiB3aXRoIG5vIHBvdGVudGlhbCBmb3IgaW5mb3JtYXRpb24gbGVha3MgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeS4gVGhlcmVmb3JlLCBOZWVkc0tNU0FOIHNob3VsZCBiZSBmYWxzZSwgYW5kIEknbGwgY2FsbCBzZXQtcmVzdWx0cyB3aXRoIHRoaXMgY29uY2x1c2lvbiBhbmQgbXkgZGV0YWlsZWQgcmVhc29uaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2MTEyNCwiT3V0cHV0VG9rZW5zIjo1MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMzk4LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMzFUMTI6NDU6MTcuMjk3MDU1ODE0WiIsIlNlcSI6OTQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjM5NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBzdXBwb3J0IGZvciB0aHJlYWQgcGlkZmRzIGluIFVOSVggZG9tYWluIHNvY2tldHMgYW5kIGNvcmVkdW1wIG1lY2hhbmlzbXMgKFNPX1BBU1NQSURGRF9USFJFQUQsIFNPX1BFRVJQSURGRF9USFJFQUQpLlxcblxcbktleSBhcmVhcyBhbmFseXplZCBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XFxuMS4gYERFQ0xBUkVfUElEU2AgYXJyYXlzIGluIGBzdHJ1Y3Qgc2NtX2Nvb2tpZWAsIGBzdHJ1Y3Qgc29ja2AsIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCwgYHN0cnVjdCB1bml4X3BlZXJjcmVkYCwgYW5kIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgOlxcbiAgIC0gYHN0cnVjdCBzb2NrYCBpbnN0YW5jZXMgYXJlIGFsbG9jYXRlZCB3aXRoIGBza19hbGxvYygpYCAoemVyb2VkKSBhbmQgZXhwbGljaXRseSByZXNldCBpbiBgc29ja19pbml0X2RhdGFfdWlkKClgIHdpdGggYG1lbXNldChzay1cXHUwMDNlc2tfcGVlcl9waWQsIDAsIC4uLilgLlxcbiAgIC0gYHN0cnVjdCBzY21fY29va2llYCBvYmplY3RzIGFyZSBjb25zaXN0ZW50bHkgemVyby1pbml0aWFsaXplZCAoZWl0aGVyIHZpYSBkZXNpZ25hdGVkIHplcm8gaW5pdGlhbGl6ZXJzIGA9IHt9YCBvciBgbWVtc2V0KC4uLiwgMCwgc2l6ZW9mKC4uLikpYCkgYWNyb3NzIGFsbCBjYWxsZXJzIChgc2NtX3NlbmRgLCBgdW5peF9kZXN0cnVjdF9zY21gLCBgX191bml4X2RncmFtX3JlY3Ztc2dgLCBgdW5peF9zdHJlYW1fcmVhZF9nZW5lcmljYCwgYGhjaV9zb2NrX3JlY3Ztc2dgLCBgbmV0bGlua19yZWN2bXNnYCkuXFxuICAgLSBgc3RydWN0IHVuaXhfcGVlcmNyZWRgIGluc3RhbmNlcyBhcmUgemVyby1pbml0aWFsaXplZCAoYD0ge31gKSBpbiBgdW5peF9saXN0ZW5gLCBgdW5peF9zdHJlYW1fY29ubmVjdGAsIGFuZCBgdW5peF9zb2NrZXRwYWlyYCBiZWZvcmUgYHByZXBhcmVfcGVlcmNyZWQoKWAuXFxuICAgLSBgc2tiLVxcdTAwM2VjYmAgY29udGFpbmluZyBgc3RydWN0IHVuaXhfc2tiX3Bhcm1zYCBpcyB6ZXJvZWQgZHVyaW5nIGBfX2FsbG9jX3NrYigpYC5cXG4gICAtIGBzdHJ1Y3QgY29yZWR1bXBfcGFyYW1zYCBpcyB6ZXJvLWluaXRpYWxpemVkIHZpYSBkZXNpZ25hdGVkIGluaXRpYWxpemVycyBpbiBgdmZzX2NvcmVkdW1wKClgLlxcbjIuIFNvY2tldCBvcHRpb24gaGFuZGxlcnMgYW5kIGNtc2cgaGVscGVyczpcXG4gICAtIGBza19nZXRzb2Nrb3B0X3BlZXJwaWRmZCgpYCBjb3BpZXMgYW4gaW5pdGlhbGl6ZWQgYGludCBwaWRmZGAgYW5kIGBpbnQgbGVuYCB0byB1c2VyIHNwYWNlLlxcbiAgIC0gYHNjbV9waWRmZF9yZWN2KClgIGluaXRpYWxpemVzIGBwaWRmZGAgZnJvbSBgcGlkZmRfcHJlcGFyZSgpYCBiZWZvcmUgd3JpdGluZyB2aWEgYHB1dF9jbXNnKClgLlxcbiAgIC0gTm8gc3RydWN0dXJlIHBhZGRpbmcgb3IgdW5pbml0aWFsaXplZCBmaWVsZHMgYXJlIGV4cG9zZWQgdG8gdXNlcnNwYWNlIG9yIHJlYWQgaW4gY29uZGl0aW9uYWwgbG9naWMuXFxuMy4gUG90ZW50aWFsIGlzc3VlcyBpbiB0aGlzIHBhdGNoIHNlcmllcyAoZS5nLiBwaWQgcmVmZXJlbmNlIG1hbmFnZW1lbnQsIHVzZS1hZnRlci1mcmVlLCBsb2NraW5nIGFyb3VuZCBgc2tfcGVlcl9sb2NrYCwgTlVMTCBkZXJlZmVyZW5jZSkgYXJlIGRldGVjdGFibGUgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIGZhY2lsaXRpZXMuXFxuXFxuVGh1cywgdGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzIHdhcnJhbnRpbmcgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIHN1cHBvcnQgZm9yIHRocmVhZCBwaWRmZHMgaW4gVU5JWCBkb21haW4gc29ja2V0cyBhbmQgY29yZWR1bXAgbWVjaGFuaXNtcyAoU09fUEFTU1BJREZEX1RIUkVBRCwgU09fUEVFUlBJREZEX1RIUkVBRCkuXFxuXFxuS2V5IGFyZWFzIGFuYWx5emVkIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcXG4xLiBgREVDTEFSRV9QSURTYCBhcnJheXMgaW4gYHN0cnVjdCBzY21fY29va2llYCwgYHN0cnVjdCBzb2NrYCwgYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgLCBgc3RydWN0IHVuaXhfcGVlcmNyZWRgLCBhbmQgYHN0cnVjdCB1bml4X3NrYl9wYXJtc2A6XFxuICAgLSBgc3RydWN0IHNvY2tgIGluc3RhbmNlcyBhcmUgYWxsb2NhdGVkIHdpdGggYHNrX2FsbG9jKClgICh6ZXJvZWQpIGFuZCBleHBsaWNpdGx5IHJlc2V0IGluIGBzb2NrX2luaXRfZGF0YV91aWQoKWAgd2l0aCBgbWVtc2V0KHNrLVxcdTAwM2Vza19wZWVyX3BpZCwgMCwgLi4uKWAuXFxuICAgLSBgc3RydWN0IHNjbV9jb29raWVgIG9iamVjdHMgYXJlIGNvbnNpc3RlbnRseSB6ZXJvLWluaXRpYWxpemVkIChlaXRoZXIgdmlhIGRlc2lnbmF0ZWQgemVybyBpbml0aWFsaXplcnMgYD0ge31gIG9yIGBtZW1zZXQoLi4uLCAwLCBzaXplb2YoLi4uKSlgKSBhY3Jvc3MgYWxsIGNhbGxlcnMgKGBzY21fc2VuZGAsIGB1bml4X2Rlc3RydWN0X3NjbWAsIGBfX3VuaXhfZGdyYW1fcmVjdm1zZ2AsIGB1bml4X3N0cmVhbV9yZWFkX2dlbmVyaWNgLCBgaGNpX3NvY2tfcmVjdm1zZ2AsIGBuZXRsaW5rX3JlY3Ztc2dgKS5cXG4gICAtIGBzdHJ1Y3QgdW5peF9wZWVyY3JlZGAgaW5zdGFuY2VzIGFyZSB6ZXJvLWluaXRpYWxpemVkIChgPSB7fWApIGluIGB1bml4X2xpc3RlbmAsIGB1bml4X3N0cmVhbV9jb25uZWN0YCwgYW5kIGB1bml4X3NvY2tldHBhaXJgIGJlZm9yZSBgcHJlcGFyZV9wZWVyY3JlZCgpYC5cXG4gICAtIGBza2ItXFx1MDAzZWNiYCBjb250YWluaW5nIGBzdHJ1Y3QgdW5peF9za2JfcGFybXNgIGlzIHplcm9lZCBkdXJpbmcgYF9fYWxsb2Nfc2tiKClgLlxcbiAgIC0gYHN0cnVjdCBjb3JlZHVtcF9wYXJhbXNgIGlzIHplcm8taW5pdGlhbGl6ZWQgdmlhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzIGluIGB2ZnNfY29yZWR1bXAoKWAuXFxuMi4gU29ja2V0IG9wdGlvbiBoYW5kbGVycyBhbmQgY21zZyBoZWxwZXJzOlxcbiAgIC0gYHNrX2dldHNvY2tvcHRfcGVlcnBpZGZkKClgIGNvcGllcyBhbiBpbml0aWFsaXplZCBgaW50IHBpZGZkYCBhbmQgYGludCBsZW5gIHRvIHVzZXIgc3BhY2UuXFxuICAgLSBgc2NtX3BpZGZkX3JlY3YoKWAgaW5pdGlhbGl6ZXMgYHBpZGZkYCBmcm9tIGBwaWRmZF9wcmVwYXJlKClgIGJlZm9yZSB3cml0aW5nIHZpYSBgcHV0X2Ntc2coKWAuXFxuICAgLSBObyBzdHJ1Y3R1cmUgcGFkZGluZyBvciB1bmluaXRpYWxpemVkIGZpZWxkcyBhcmUgZXhwb3NlZCB0byB1c2Vyc3BhY2Ugb3IgcmVhZCBpbiBjb25kaXRpb25hbCBsb2dpYy5cXG4zLiBQb3RlbnRpYWwgaXNzdWVzIGluIHRoaXMgcGF0Y2ggc2VyaWVzIChlLmcuIHBpZCByZWZlcmVuY2UgbWFuYWdlbWVudCwgdXNlLWFmdGVyLWZyZWUsIGxvY2tpbmcgYXJvdW5kIGBza19wZWVyX2xvY2tgLCBOVUxMIGRlcmVmZXJlbmNlKSBhcmUgZGV0ZWN0YWJsZSBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcy5cXG5cXG5UaHVzLCB0aGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3Mgd2FycmFudGluZyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:nil,}