Name: series-workflowpxw8l Phase: Running StartedAt: 2026-08-25 14:38:47 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowpxw8l[0] Phase: Running StartedAt: 2026-08-25 14:38:47 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowpxw8l[0].run-triage Phase: Running StartedAt: 2026-08-25 14:38:47 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowpxw8l[0].run-triage(0) Phase: Running StartedAt: 2026-08-25 14:38:47 +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": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "5e289c5a4a526e870efac0ca658635c47138593a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEYS", "BPF_SYSCALL" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "5e289c5a4a526e870efac0ca658635c47138593a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KEYS", "BPF_SYSCALL" ], "series_id": "12b9d3d4-1d82-4d56-83b9-e0d99d8f8b6b" }, "track": "KASAN", "fuzz": { "focus": [ "bpf" ], "focus_symbols": [ "bpf_lookup_keyring", "bpf_keyring_enforced" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU1PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MThtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtLRVlTJiMzNDssCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX2xvb2t1cF9rZXlyaW5nJiMzNDssCiAgICAmIzM0O2JwZl9rZXlyaW5nX2VuZm9yY2VkJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggc2VyaWVzIGludHJvZHVjZXMgYSBuZXcgQlBGIGtleXJpbmcgKGAuYnBmYCkgZm9yIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIGFsb25nIHdpdGggYSBrZXJuZWwgcGFyYW1ldGVyIGBicGYua2V5cmluZ191bnNlYWxlZGAgdG8gbWFuYWdlIGl0cyBzdGF0ZS4gVGhlIGNoYW5nZXMgcHJpbWFyaWx5IGludm9sdmUgYWRkaW5nIGEgbmV3IGtleXJpbmcgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24sIGFkZGluZyBhIGxvb2t1cCBmdW5jdGlvbiBgYnBmX2xvb2t1cF9rZXlyaW5nYCB3aGljaCBhbGxvY2F0ZXMgYSBgc3RydWN0IGJwZl9rZXlgIGFuZCBpbml0aWFsaXplcyBpdHMgZmllbGRzLCBhbmQgbW9kaWZ5aW5nIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCB0byBoYW5kbGUgdGhlIG5ldyBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2AgSUQuXG5cbk5vbmUgb2YgdGhlc2UgY2hhbmdlcyBpbnRyb2R1Y2UgbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBpbnRyb2R1Y2UgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcy4gVGhlIG9ubHkgbmV3IGtlcm5lbCBhbGxvY2F0aW9uIGlzIGZvciBgc3RydWN0IGJwZl9rZXlgIHZpYSBga21hbGxvY19vYmpgLCBhbmQgYWxsIGl0cyBmaWVsZHMgKGBrZXlgIGFuZCBgaGFzX3JlZmApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpb24uIFRoZSBzaWduYXR1cmUgYW5kIGRhdGEgYnVmZmVycyB1c2VkIGR1cmluZyB2ZXJpZmljYXRpb24gYXJlIGFsbG9jYXRlZCB3aXRoIGBrdm1lbWR1cF9icGZwdHJgICh3aGljaCBjb3BpZXMgZnJvbSB1c2VyIHNwYWNlKSBhbmQgYGt2bWFsbG9jKC4uLiwgX19HRlBfWkVSTylgICh3aGljaCB6ZXJvLWluaXRpYWxpemVzKSwgcmVzcGVjdGl2ZWx5LlxuXG5BbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzLCBzdWNoIGFzIG1lbW9yeSBsZWFrcywgb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgb3IgdXNlLWFmdGVyLWZyZWUgaXNzdWVzLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGAuYnBmYCBrZXlyaW5nIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFuZCBhIGBicGYua2V5cmluZ191bnNlYWxlZGAgYm9vdCBwYXJhbWV0ZXIuIEl0IG1vZGlmaWVzIHRoZSBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCB2ZXJpZmljYXRpb24gcGF0aHMgaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIHRvIGhhbmRsZSB0aGUgbmV3IGtleXJpbmcgYW5kIGVuZm9yY2UgaXRzIHVzZSB3aGVuIGNvbmZpZ3VyZWQuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IHRoZSBgYnBmKClgIHN5c2NhbGwgcGF0aCBhbmQgaW50cm9kdWNlIG5ldyByZWFjaGFibGUgc3RhdGUgYW5kIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNDo1NTwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+cmVhZC1wYXRjaC1kaWZmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7UGF0Y2hEaWZmJiMzNDs6ICYjMzQ7Y29tbWl0IDRiMjMyZjg5MGNlNmYxNWJjNzhiNTY3NTFmYjY5YzQwNGIxNzlkYjBcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgVHVlIEF1ZyAyNSAxNDo1NTowNyAyMDI2ICYjNDM7MDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0XG5pbmRleCBlNDY0MzYzNGE5YjFiLi5lNzBmYjE1NzU3ZDQwIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHRcbiYjNDM7JiM0MzsmIzQzOyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0XG5AQCAtNjY3LDYgJiM0Mzs2NjcsMjIgQEAgS2VybmVsIHBhcmFtZXRlcnNcbiBcbiBcdFx0XHRTZWUgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9ib290Y29uZmlnLnJzdFxuIFxuJiM0MztcdGJwZi5rZXlyaW5nX3Vuc2VhbGVkPVxuJiM0MztcdFx0XHRbQlBGXSBXaGVuIHNldCB0byAxLCBsZWF2ZSB0aGUgYnBmIGtleXJpbmcgdW5zZWFsZWRcbiYjNDM7XHRcdFx0YWZ0ZXIgaW5pdGlhbGl6YXRpb24gc28gdGhhdCB1c2Vyc3BhY2UgY2FuIHByb3Zpc2lvblxuJiM0MztcdFx0XHRrZXlzLiBPbmNlIHRoZSBrZXlyaW5nIGlzIHJlc3RyaWN0ZWQgaXQgYmVjb21lcyBhY3RpdmVcbiYjNDM7XHRcdFx0YW5kIGNhbiBiZSB1c2VkIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLlxuJiM0MztcbiYjNDM7XHRcdFx0U2V0dGluZyB0aGlzIGFsc28gbWVhbnMgdGhhdCB0aGUgYnBmIGtleXJpbmcgaXMgdGhlXG4mIzQzO1x0XHRcdG9ubHkgbm9uLXN5c3RlbSBrZXlyaW5nIGEgbG9hZGVyIG1heSBzZWxlY3QgZm9yIHRoZVxuJiM0MztcdFx0XHRyZXN0IG9mIHRoZSBib290OiBjYWxsZXItc3VwcGxpZWQgdXNlci9zZXNzaW9uXG4mIzQzO1x0XHRcdGtleXJpbmdzIGFyZSByZWZ1c2VkIHdpdGggLUVQRVJNLCB3aGV0aGVyIG9yIG5vdFxuJiM0MztcdFx0XHRwcm92aXNpb25pbmcgYWN0dWFsbHkgY29tcGxldGVkLiBUaGUgc3lzdGVtIGtleXJpbmdzXG4mIzQzO1x0XHRcdHN0YXkgc2VsZWN0YWJsZS4gTGVhdmluZyBpdCB1bnNldCBrZWVwcyB0aGUgcHJpb3JcbiYjNDM7XHRcdFx0YmVoYXZpb3VyLCB3aGVyZSBhIGNhbGxlci1zdXBwbGllZCBrZXlyaW5nIGlzIGFsbG93ZWQuXG4mIzQzO1xuJiM0MztcdFx0XHRTZWUgRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3RcbiYjNDM7XG4gXHRidHR2LmNhcmQ9XHRbSFcsVjRMXSBidHR2IChidDg0OCAmIzQzOyBidDg3OCBiYXNlZCBncmFiYmVyIGNhcmRzKVxuIFx0YnR0di5yYWRpbz1cdE1vc3QgaW1wb3J0YW50IGluc21vZCBvcHRpb25zIGFyZSBhdmFpbGFibGUgYXNcbiBcdFx0XHRrZXJuZWwgYXJncyB0b28uXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuaW5kZXggZTczZWFhZWJkOGIxNS4uNmMwM2ZiNThiMTQ2NCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XG4mIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuQEAgLTI1NCwyMSAmIzQzOzI1NCwyNSBAQCByZXR1cm5lZC4gT25seSBhZnRlciB0aGUgcHJvZ3JhbSBoYXMgZnVsbHkgbG9hZGVkLCBhdCB0aGUgbmV4dCBob29rXG4gKGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgKSwgZG9lcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBjYXJyeSBpdHMgZnVsbCBtZWFuaW5nOlxuIHZhbGlkbHkgc2lnbmVkICphbmQqIGZ1bGx5IHZlcmlmaWVkLlxuIFxuLUEgbW9yZSByZWFsaXN0aWMgYWRtaXNzaW9uIHBvbGljeSB0aGFuIFwmIzM0O2lzIGl0IHNpZ25lZCBhdCBhbGxcJiMzNDs6IGFjY2VwdCBwcm9ncmFtc1xuLXNpZ25lZCBieSBhIHN5c3RlbSBrZXlyaW5nLCBhY2NlcHQgYSB1c2VyLWtleXJpbmcgc2lnbmF0dXJlIG9ubHkgaWYgdGhlXG4ta2V5L2tleXJpbmcgaXQgd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhXG4tdGFtcGVyLWV2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlXG4tYXVkaXRhYmxlLiAoSWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbiYjNDM7QSBtb3JlIHJlYWxpc3RpYyBhZG1pc3Npb24gcG9saWN5IHRoYW4gXCYjMzQ7aXMgaXQgc2lnbmVkIGF0IGFsbFwmIzM0OzogYmFzZSB0cnVzdCBpblxuJiM0Mzt0aGUgYnBmIGtleXJpbmcsIGFjY2VwdCBhIHN0YWdpbmcgc2lnbmF0dXJlIG9ubHkgd2hpbGUgdGhlIGtleS9rZXlyaW5nIHRoZVxuJiM0Mztwcm9ncmFtIHdhcyB2ZXJpZmllZCBhZ2FpbnN0IGlzIG9uIGFuIGV4cGxpY2l0IGFsbG93bGlzdCwgYW5kIGVtaXQgYSB0YW1wZXItXG4mIzQzO2V2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlIGF1ZGl0YWJsZS5cbiYjNDM7KGlsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4gXG4gLi4gY29kZS1ibG9jazo6IGNcbiBcbi0gICAgLyogU2VyaWFscyBvZiB1c2VyIGtleXMva2V5cmluZ3Mgd2UgYWRkaXRpb25hbGx5IHRydXN0LiAqL1xuJiM0MzsgICAgLypcbiYjNDM7ICAgICAqIFNlcmlhbHMgb2YgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIHdlIGFyZSB3aWxsaW5nIHRvIHN0YWdlLiBFbXB0eVxuJiM0MzsgICAgICogb24gYSBzeXN0ZW0gdGhhdCBoYXMgY29tbWl0dGVkIHRvIHRoZSBicGYga2V5cmluZywgd2hlcmUgdGhlIGtlcm5lbFxuJiM0MzsgICAgICogcmVmdXNlcyB0aGVtIGFueXdheS5cbiYjNDM7ICAgICAqL1xuICAgICBzdHJ1Y3Qge1xuICAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4gICAgICAgICAgICAgX190eXBlKGtleSwgX19zMzIpOyAgICAgICAgICAgICAvKiBrZXlyaW5nX3NlcmlhbCAqL1xuICAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgX191OCk7XG4gICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4tICAgIH0gdHJ1c3RlZF91c2VyX2tleXMgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7ICAgIH0gc3RhZ2luZ19rZXlzIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4gXG4gICAgIC8qIEF1ZGl0IHN0cmVhbSBjb25zdW1lZCBieSBhIHVzZXJzcGFjZSBsb2dnZXIuICovXG4gICAgIHN0cnVjdCB7XG5AQCAtMjkxLDExICYjNDM7Mjk1LDE5IEBAIGF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4gICAgICAgICAgICAgaWYgKGtlcm5lbClcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1c3QgaW4ta2VybmVsIGxvYWRzICovXG4gXG4tICAgICAgICAgICAgaWYgKHZlcmRpY3QgIT0gQlBGX1NJR19WRVJJRklFRClcbiYjNDM7ICAgICAgICAgICAgaWYgKHZlcmRpY3QgIT0gQlBGX1NJR19WRVJJRklFRCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHZhbGlkbHkgc2lnbmVkICovXG4tICAgICAgICAgICAgZWxzZSBpZiAoa3R5cGUgPT0gQlBGX1NJR19LRVlSSU5HX1VTRVIgXHUwMDI2XHUwMDI2XG4tICAgICAgICAgICAgICAgICAgICAgIWJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2dHJ1c3RlZF91c2VyX2tleXMsIFx1MDAyNnNlcmlhbCkpXG4tICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIGtleS9rZXlyaW5nIG5vdCBhbGxvd2xpc3RlZCAqL1xuJiM0MzsgICAgICAgICAgICB9IGVsc2Ugc3dpdGNoIChrdHlwZSkge1xuJiM0MzsgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19CVUlMVElOOlxuJiM0MzsgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19CUEY6XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4mIzQzOyAgICAgICAgICAgIGNhc2UgQlBGX1NJR19LRVlSSU5HX1VTRVI6XG4mIzQzOyAgICAgICAgICAgICAgICAgICAgaWYgKCFicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNnN0YWdpbmdfa2V5cywgXHUwMDI2c2VyaWFsKSlcbiYjNDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTtcbiYjNDM7ICAgICAgICAgICAgICAgICAgICBicmVhaztcbiYjNDM7ICAgICAgICAgICAgZGVmYXVsdDpcbiYjNDM7ICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIGtleXJpbmcgbm90IGluIHBvbGljeSAqL1xuJiM0MzsgICAgICAgICAgICB9XG4gXG4gICAgICAgICAgICAgZCA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2YXVkaXQsIHNpemVvZigqZCksIDApO1xuICAgICAgICAgICAgIGlmIChkKSB7XG5AQCAtMzA5LDYgJiM0MzszMjEsMTEgQEAgYXVkaXRhYmxlLiAoSWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbiAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICB9XG4gXG4mIzQzO1N1Y2ggYSBwb2xpY3kgaXMgd2hhdCBtYWtlcyBhIGNhbGxlci1zdXBwbGllZCBrZXlyaW5nIHVzYWJsZSBhdCBhbGwgb24gYSBzeXN0ZW1cbiYjNDM7dGhhdCBkb2VzIG5vdCBib290IHdpdGggYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGA6IHRoZSBhbGxvd2xpc3QgYm91bmRzIHdoaWNoXG4mIzQzO3N0YWdlZCBrZXlzIGNvdW50LCBhbmQgdGhlIExTTSBpdHNlbGYgaGFzIHRvIHByb3RlY3QgdGhlbSBmcm9tIGJlaW5nIHRhbXBlcmVkXG4mIzQzO3dpdGguXG4mIzQzO1xuIE9ic2VydmluZyBhIHZlcmlmaWVkIGxvYWQ6IGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiBcbkBAIC0zODEsOCAmIzQzOzM5OCw5IEBAIHRoYXQgdmVyZGljdCBjb3ZlcmVkIGFsbCBvZiBpdHMgZXhjbHVzaXZlIG1hcHMsIHJlamVjdGluZyBhbnkgdGhhdCBkaWQgbm90IC0gc29cbiBhIGRlbnktYnktZGVmYXVsdCBhZG1pc3Npb24gcG9saWN5IG5lZWRzIG5vIHNlY29uZCBlbmZvcmNlbWVudCBwb2ludC4gVXNlXG4gYGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZVxuIHRoZXkgY2FycnkgYW4gaWQuIFRoZSBgYHZlcmRpY3RgYCwgYGBrZXlyaW5nX3R5cGVgYCBhbmQgYGBrZXlyaW5nX3NlcmlhbGBgIGZpZWxkc1xuLWxldCBhIHBvbGljeSBkaXN0aW5ndWlzaCwgZm9yIGV4YW1wbGUsIFwmIzM0O3ZlcmlmaWVkIGFuZCBzaWduZWQgYnkgYSBidWlsdGluIGtleVwmIzM0O1xuLWZyb20gXCYjMzQ7dmVyaWZpZWQgYnkgYSB1c2VyIGtleVwmIzM0Oy4gQSBwb2xpY3kgTFNNIHN1Y2ggYXMgSVBFIGNvdWxkIGNvbnN1bWUgdGhlIHNhbWVcbiYjNDM7bGV0IGEgcG9saWN5IGRpc3Rpbmd1aXNoIFwmIzM0O3ZlcmlmaWVkIGFnYWluc3QgdGhlIG9wZXJhdG9yJiMzOTtzIGJwZiBrZXlyaW5nXCYjMzQ7IGZyb21cbiYjNDM7XCYjMzQ7dmVyaWZpZWQgYWdhaW5zdCBhIGtleXJpbmcgdGhlIGxvYWRlciBzdXBwbGllZCBpdHNlbGZcJiMzNDssIHdoaWNoIGlzIHRoZVxuJiM0MztkaXN0aW5jdGlvbiB0aGF0IG1hdHRlcnMgbW9zdC4gQSBwb2xpY3kgTFNNIHN1Y2ggYXMgSVBFIGNvdWxkIGNvbnN1bWUgdGhlIHNhbWVcbiBob29rcyB0byBlbmZvcmNlIHN5c3RlbSBwb2xpY3kgd2l0aG91dCB3cml0aW5nIGFueSBCUEYsIHRob3VnaCBub25lIGltcGxlbWVudHNcbiB0aGlzIHRvZGF5LlxuIFxuQEAgLTM5MCwzMyAmIzQzOzQwOCwxNTQgQEAgS2V5cmluZ3NcbiA9PT09PT09PVxuIFxuIGBga2V5cmluZ19pZGBgIHNlbGVjdHMgdGhlIHRydXN0ZWQga2V5cmluZyB0aGUgUEtDUyM3IHNpZ25hdHVyZSBpcyB2ZXJpZmllZFxuLWFnYWluc3QuIFRoZSB3ZWxsLWtub3duIGlkcyBgYDBgYCAoYnVpbHRpbiksIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgXG4tYW5kIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGAgc2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIHN5c3RlbSBrZXlyaW5ncztcbi1hbnkgb3RoZXIgdmFsdWUgaXMgdHJlYXRlZCBhcyB0aGUgc2VyaWFsIG9mIGEgdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nLlxuLVRoZSBrZXlyaW5nIGlzIGxvb2tlZCB1cCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhXG4tc2lnbmF0dXJlIG5hbWluZyBhIG5vbi1leGlzdGVudCBrZXlyaW5nIGlzIHJlamVjdGVkIHVwIGZyb250LCBhbmQgYSBmYWlsZWRcbi12ZXJpZmljYXRpb24gYWJvcnRzIHRoZSBsb2FkIC0gc28gYSBwcm9ncmFtIHRoYXQgbG9hZHMgc3VjY2Vzc2Z1bGx5IHdpdGggYVxuLXNpZ25hdHVyZSBhbHdheXMgaGFzIGNvbnNpc3RlbnQga2V5cmluZyBmaWVsZHMgcmVjb3JkZWQuXG4mIzQzO2FnYWluc3QuIEZvdXIgdmFsdWVzIGFyZSB3ZWxsLWtub3duOyBhbnl0aGluZyBlbHNlIGlzIHRha2VuIGFzIHRoZSBzZXJpYWwgb2YgYVxuJiM0MztjYWxsZXItc3VwcGxpZWQgdXNlciBvciBzZXNzaW9uIGtleSBvciBrZXlyaW5nOlxuJiM0MztcbiYjNDM7Li4gbGlzdC10YWJsZTo6XG4mIzQzOyAgIDpoZWFkZXItcm93czogMVxuJiM0MztcbiYjNDM7ICAgKiAtIGBga2V5cmluZ19pZGBgXG4mIzQzOyAgICAgLSBLZXlyaW5nXG4mIzQzOyAgICogLSBgYDBgYFxuJiM0MzsgICAgIC0gYnVpbHRpbiB0cnVzdGVkIGtleXJpbmdcbiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgIChgYDFgYClcbiYjNDM7ICAgICAtIHNlY29uZGFyeSB0cnVzdGVkIGtleXJpbmdcbiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGAgKGBgMmBgKVxuJiM0MzsgICAgIC0gcGxhdGZvcm0ga2V5cmluZ1xuJiM0MzsgICAqIC0gYGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYGAgKGBgM2BgKVxuJiM0MzsgICAgIC0gdGhlIGJwZiBrZXlyaW5nXG4mIzQzOyAgICogLSBhbnl0aGluZyBlbHNlXG4mIzQzOyAgICAgLSBzZXJpYWwgb2YgYSBjYWxsZXItc3VwcGxpZWQgdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nXG4mIzQzO1xuJiM0MztUaGUga2V5cmluZyBpcyByZXNvbHZlZCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhXG4mIzQzO3NpZ25hdHVyZSBuYW1pbmcgYSBrZXlyaW5nIHRoYXQgY2Fubm90IGJlIHVzZWQgaXMgcmVqZWN0ZWQgdXAgZnJvbnQsIGFuZCBhXG4mIzQzO2ZhaWxlZCB2ZXJpZmljYXRpb24gYWJvcnRzIHRoZSBsb2FkIC0gYSBwcm9ncmFtIHRoYXQgbG9hZHMgc3VjY2Vzc2Z1bGx5IHdpdGhcbiYjNDM7YSBzaWduYXR1cmUgdGhlcmVmb3JlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC5cbiYjNDM7XG4mIzQzO1RoZSBicGYga2V5cmluZ1xuJiM0MzstLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO0Egc3lzdGVtIGtleXJpbmcgbmVlZHMgYSBrZXJuZWwgcmVidWlsZCBvciBhIHZvdWNoZWQtZm9yIGVucm9sbG1lbnQgdG8gcm90YXRlIGFcbiYjNDM7a2V5LCBhbmQgZ3JhbnRzIEJQRi1zaWduaW5nIHRydXN0IHRvIGtleXMgdHJ1c3RlZCBmb3IgZXZlcnl0aGluZyBlbHNlIGluIHRoZVxuJiM0MztrZXJuZWwgdG9vLiBBIGNhbGxlci1zdXBwbGllZCBrZXlyaW5nLCBhdCB0aGUgb3RoZXIgZXh0cmVtZSwgaXMgZmlsbGVkIGJ5IHRoZVxuJiM0Mzt2ZXJ5IHByb2Nlc3MgdGhhdCBsb2FkcyB0aGUgcHJvZ3JhbSBhbmQgc28gY2FycmllcyBubyB0cnVzdCBvZiBpdHMgb3duLlxuJiM0MztcbiYjNDM7VGhlIGJwZiBrZXlyaW5nIGZpbGxzIHRoYXQgZ2FwIGFuZCBpcyB0aGUgdHJ1c3QgYW5jaG9yIHdoaWNoIGEgc2lnbmVkIEJQRlxuJiM0MztkZXBsb3ltZW50IHNob3VsZCBiZSBidWlsdCBvbiB0b3Agb2Y6IGEga2V5cmluZyBuYW1lZCBgYC5icGZgYCwgc2VsZWN0ZWQgd2l0aFxuJiM0MztgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCwgdGhhdCBhbiBvcGVyYXRvciBwcm92aXNpb25zIGF0IGJvb3Qgd2l0aCBhIGtleVxuJiM0MztzY29wZWQgdG8gQlBGIHByb2dyYW0gbG9hZGluZyBhbmQgbm90aGluZyBlbHNlIGluIHRoZSBrZXJuZWwmIzM5O3MgdHJ1c3QgaGllcmFyY2h5LlxuJiM0MztJdCBpcyBvd25lZCBieSB0aGUgb3BlcmF0b3IgcmF0aGVyIHRoYW4gYnkgdGhlIGxvYWRlciwgYW5kIHJvdGF0YWJsZSBhY3Jvc3MgYVxuJiM0MztyZWJvb3Qgd2l0aG91dCB0b3VjaGluZyB0aGUga2VybmVsIGltYWdlLiBJdCBpcyBtb2RlbGxlZCBhZnRlciB0aGUgZG0tdmVyaXR5XG4mIzQzO2tleXJpbmcgKHNlZSBgYGRtX3Zlcml0eS5rZXlyaW5nX3Vuc2VhbGVkPWBgKSBhbmQgcHJvdmlzaW9uZWQgdGhlIHNhbWUgd2F5OiBhblxuJiM0Mztpbml0cmQgcnVucyB0aGUgYGBrZXljdGxgYCBzdGVwcyBiZWxvdyBiZWZvcmUgaGFuZGluZyBvZmYgdG8gdGhlIHJvb3Rmcy5cbiYjNDM7XG4mIzQzO1Byb3Zpc2lvbmluZ1xuJiM0Mzt+fn5+fn5+fn5+fn5cbiYjNDM7XG4mIzQzO1RoZSBrZXlyaW5nIGlzIGNyZWF0ZWQgZHVyaW5nIGBgbGF0ZV9pbml0Y2FsbGBgIGFuZCBpcyAqKnNlYWxlZCBlbXB0eSoqIGJ5XG4mIzQzO2RlZmF1bHQ6IGl0IGNhcnJpZXMgYSByZWplY3QtYWxsIHJlc3RyaWN0aW9uLCBzbyBubyBrZXkgY2FuIGV2ZXIgYmUgYWRkZWQgYW5kXG4mIzQzO2BgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgIGZhaWxzIHdpdGggYGAtRU5PS0VZYGAgZm9yIHRoZSB3aG9sZSBib290LlxuJiM0MztcbiYjNDM7YGBicGYua2V5cmluZ191bnNlYWxlZD0xYGAgbGVhdmVzIGl0IHVucmVzdHJpY3RlZCBhdCBpbml0IHNvIHRoZSBpbml0cmQgY2FuXG4mIzQzO3Byb3Zpc2lvbiBpdC4gVGhlIGtleXJpbmcgaXMgbm90IGxpbmtlZCBpbnRvIGFueSBwcm9jZXNzIGtleXJpbmcsIHNvIGl0IGlzXG4mIzQzO2FkZHJlc3NlZCBieSB0aGUgc2VyaWFsIGBgL3Byb2Mva2V5c2BgIHJlcG9ydHMuIFN0ZXBzIHdvdWxkIGJlIGFzIGZvbGxvd3M6OlxuJiM0MztcbiYjNDM7ICAgIHNlcmlhbD0weCQoYXdrICYjMzk7JDggPT0gXCYjMzQ7a2V5cmluZ1wmIzM0OyBcdTAwMjZcdTAwMjYgJDkgPT0gXCYjMzQ7LmJwZjpcJiMzNDsgeyBwcmludCAkMSB9JiMzOTsgL3Byb2Mva2V5cylcbiYjNDM7XG4mIzQzOyAgICBrZXljdGwgcGFkZCBhc3ltbWV0cmljIFwmIzM0O1wmIzM0OyAkc2VyaWFsIFx1MDAzYyBzaWduaW5nX2tleS5kZXJcbiYjNDM7ICAgIGtleWN0bCByZXN0cmljdF9rZXlyaW5nICRzZXJpYWxcbiYjNDM7XG4mIzQzO0JvdGggc3RlcHMgYXJlIHJlcXVpcmVkOiB0aGUga2V5cmluZyBpcyBjb25zdWx0ZWQgb25seSBvbmNlIGl0IGlzICoqbm9uLWVtcHR5XG4mIzQzO2FuZCByZXN0cmljdGVkKiouIEFuIHVucmVzdHJpY3RlZCBrZXlyaW5nIGlzIGlnbm9yZWQgZXZlbiB3aGVuIGl0IGhvbGRzIGtleXMsXG4mIzQzO3NvIGEgaGFsZi1wcm92aXNpb25lZCBrZXlyaW5nIGlzIGluZXJ0IHJhdGhlciB0aGFuIGEgd2Vha2VyIHRydXN0IGFuY2hvciwgYW5kIGFcbiYjNDM7bG9hZCBuYW1pbmcgaXQgZmFpbHMgd2l0aCBgYC1FTk9LRVlgYCBhbmQgYSB2ZXJpZmllciBsb2cuIFJlc3RyaWN0aW5nIGNhbm5vdFxuJiM0MztiZSB1bmRvbmUuXG4mIzQzO1xuJiM0MztNb3JlIHRoYW4gb25lIGtleSBpcyBlbnJvbGxlZCBieSByZXBlYXRpbmcgdGhlIGBga2V5Y3RsIHBhZGRgYCBzdGVwOyB0aGVcbiYjNDM7cmVzdHJpY3Rpb24gaXMgYXBwbGllZCBvbmNlLCBhZnRlciB0aGUgbGFzdCBvZiB0aGVtOjpcbiYjNDM7XG4mIzQzOyAgICBmb3Iga2V5IGluIC9ldGMvYnBmL2tleXMvKi5kZXI7IGRvXG4mIzQzOyAgICAgICAga2V5Y3RsIHBhZGQgYXN5bW1ldHJpYyBcJiMzNDtcJiMzNDsgJHNlcmlhbCBcdTAwM2MgJGtleVxuJiM0MzsgICAgZG9uZVxuJiM0MztcbiYjNDM7ICAgIGtleWN0bCByZXN0cmljdF9rZXlyaW5nICRzZXJpYWxcbiYjNDM7ICAgIGtleWN0bCBzaG93ICRzZXJpYWxcbiYjNDM7XG4mIzQzO1RoZSByZXN0cmljdGlvbiBib3VuZHMgd2hhdCBjYW4gYmUgYWRkZWQsIG5ldmVyIHdoYXQgY2FuIGJlIHRha2VuIGF3YXkuIEEga2V5XG4mIzQzO3RoYXQgaXMgYWxyZWFkeSBlbnJvbGxlZCBjYW4gc3RpbGwgYmUgdW5saW5rZWQsIGFuZCB0aGUga2V5cmluZyBjbGVhcmVkIG9yXG4mIzQzO3Jldm9rZWQsIGJ5IGFueXRoaW5nIHJ1bm5pbmcgYXMgcm9vdC4gVGhhdCBkb2VzIG5vdCB3ZWFrZW4gdGhlIGFuY2hvciwgc2luY2VcbiYjNDM7YSBrZXlyaW5nIGxlZnQgZW1wdHkgaXMgbm8gbG9uZ2VyIGNvbnN1bHRlZCBhbmQgYSBsb2FkIG5hbWluZyBpdCBmYWlscyB3aXRoXG4mIzQzO2BgLUVOT0tFWWBgLCBidXQgaXQgZG9lcyB0YWtlIHNpZ25lZCBsb2FkaW5nIG91dCB1bnRpbCB0aGUgbmV4dCBib290LiBEcm9wcGluZ1xuJiM0Mzt0aGUgdXNlciBwZXJtaXNzaW9ucyB0aGUga2V5cmluZyBubyBsb25nZXIgbmVlZHMgd291bGQgY2xvc2UgdGhhdDsgYXMgYSB0aGlyZFxuJiM0MztzdGVwIGluIHRoZSBpbml0cmQ6OlxuJiM0MztcbiYjNDM7ICAgIGtleWN0bCBzZXRwZXJtICRzZXJpYWwgMHgwODAzMDAwMFxuJiM0MztcbiYjNDM7V2hhdCByZW1haW5zIGlzIGBgS0VZX1BPU19TRUFSQ0hgYCBmb3IgdGhlIGluLWtlcm5lbCBzZWFyY2ggZHVyaW5nIHZlcmlmaWNhdGlvbixcbiYjNDM7cGx1cyBgYEtFWV9VU1JfVklFV2BgIGFuZCBgYEtFWV9VU1JfUkVBRGBgIHNvIHRoZSBrZXlyaW5nIHN0YXlzIHZpc2libGUgaW5cbiYjNDM7YGAvcHJvYy9rZXlzYGAgYW5kIGBga2V5Y3RsIHNob3dgYC5cbiYjNDM7XG4mIzQzO1Byb3Zpc2lvbmluZyBoYXMgdG8gY29tcGxldGUgYmVmb3JlIGNvbnRyb2wgcGFzc2VzIHRvIHRoZSByb290ZnMuIFRoZSBrZXlyaW5nXG4mIzQzO3Rha2VzIGFueSBudW1iZXIgb2Yga2V5cyBmb3IgYXMgbG9uZyBhcyBpdCBpcyB1bnJlc3RyaWN0ZWQsIHNvIGl0IGlzIHRoZVxuJiM0MztyZXN0cmljdGlvbiB0aGF0IGJvdW5kcyB0aGUgZW5yb2xsZWQgc2V0LCBub3QgdGhlIGZpcnN0IGVucm9sbG1lbnQuIEJlZm9yZVxuJiM0Mzt0aGUgaW5pdHJkIGhhbmRzIG9mZiBjb250cm9sLCBpdCBtdXN0IHRoZXJlZm9yZSByZXN0cmljdCB0aGUga2V5cmluZyBhZnRlclxuJiM0Mzt0aGUgbGFzdCBlbnJvbGxtZW50LlxuJiM0MztcbiYjNDM7RW5mb3JjZW1lbnRcbiYjNDM7fn5+fn5+fn5+fn5cbiYjNDM7XG4mIzQzO2BgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgIHN0YXRlcyB0aGF0IHRoZSBicGYga2V5cmluZyBpcyAqdGhlKiB0cnVzdCBhbmNob3IgZm9yXG4mIzQzO3RoaXMgYm9vdCwgc28gaXQgZG9lcyBtb3JlIHRoYW4gdW5zZWFsLiBGcm9tIHRoZSBmaXJzdCBwcm9ncmFtIGxvYWQgb253YXJkcyBhXG4mIzQzO2NhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5cmluZyBpcyByZWZ1c2VkIHdpdGggYGAtRVBFUk1gYCBhbmQgYSB2ZXJpZmllclxuJiM0Mztsb2cgbWVzc2FnZSwgd2hldGhlciBvciBub3QgcHJvdmlzaW9uaW5nIGV2ZXIgY29tcGxldGVkLiBUaGUgc3lzdGVtIGtleXJpbmdzXG4mIzQzO3N0YXkgc2VsZWN0YWJsZS5cbiYjNDM7XG4mIzQzO0VuZm9yY2VtZW50IGlzIHJlYWRhYmxlIGF0IGBgL3N5cy9tb2R1bGUvYnBmL3BhcmFtZXRlcnMva2V5cmluZ191bnNlYWxlZGBgLCBhbmRcbiYjNDM7cmVhZC1vbmx5IHRoZXJlOiB0aGUgZmxhZyBpcyBgYF9fcm9fYWZ0ZXJfaW5pdGBgIGJlaGluZCBhIDA0NDQgcGFyYW1ldGVyLiBJdCBpc1xuJiM0MzthbHNvIGRlcml2ZWQgZnJvbSB0aGUgYm9vdCBmbGFnIHJhdGhlciB0aGFuIGZyb20gdGhlIGtleXJpbmcmIzM5O3MgcnVudGltZSBzdGF0ZSxcbiYjNDM7c28gdGhlcmUgaXMgbm8gd2luZG93IGVhcmx5IGluIGJvb3QgZHVyaW5nIHdoaWNoIGEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgaXNcbiYjNDM7c3RpbGwgYWNjZXB0ZWQuXG4mIzQzO1xuJiM0MztDYWxsZXItc3VwcGxpZWQga2V5cmluZ3MgYXJlIGZvciBzdGFnaW5nXG4mIzQzOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO0EgYGBrZXlyaW5nX2lkYGAgbmFtaW5nIGEgdXNlciBvciBzZXNzaW9uIGtleSBvciBrZXlyaW5nIGlzIGEgKnN0YWdpbmcqXG4mIzQzO21lY2hhbmlzbSwgbm90IGEgdHJ1c3QgYW5jaG9yOiBpdCBpcyBmaWxsZWQgYnkgdGhlIHNhbWUgdXNlcnNwYWNlIHRoYXQgbG9hZHMgdGhlXG4mIzQzO3Byb2dyYW0sIHNvIHZlcmlmeWluZyBhZ2FpbnN0IGl0IGVzdGFibGlzaGVzIG9ubHkgdGhhdCB0aGUgbG9hZGVyIHNpZ25lZCB3aGF0IGl0XG4mIzQzO2xvYWRlZC4gSXRzIHB1cnBvc2UgaXMgdG8gbGV0IHNvZnR3YXJlIGluc3RhbGxlZCBvbnRvIGEgcnVubmluZyBzeXN0ZW0gLSB3aG9zZVxuJiM0MztzaWduaW5nIGtleSBpcyBub3QgZW5yb2xsZWQgYW55d2hlcmUgeWV0IC0gcnVuIHNpZ25lZCB1bnRpbCB0aGF0IGtleSByZWFjaGVzIHRoZVxuJiM0MzticGYga2V5cmluZyBvbiB0aGUgbmV4dCBib290LlxuJiM0MztcbiYjNDM7QSBzeXN0ZW0gdGhhdCBoYXMgY29tbWl0dGVkIHRvIHRoZSBicGYga2V5cmluZyByZWZ1c2VzIHRoaXMgcGF0aCBvdXRyaWdodCAoc2VlXG4mIzQzO2BFbmZvcmNlbWVudGBfKS4gQSBzeXN0ZW0gdGhhdCBoYXMgbm90IGNhbiBzdGlsbCBhbGxvdyBpdCwgYnV0IGEgcG9saWN5IG11c3RcbiYjNDM7bmV2ZXIgdHJlYXQgYGBCUEZfU0lHX0tFWVJJTkdfVVNFUmBgIGFzIGVxdWl2YWxlbnQgdG8gdGhlIGJwZiBvciBzeXN0ZW1cbiYjNDM7a2V5cmluZ3M7IGl0IHNob3VsZCBhbGxvd2xpc3QgdGhlIHNwZWNpZmljIHNlcmlhbHMgaXQgaXMgd2lsbGluZyB0byBzdGFnZSBhbmRcbiYjNDM7cGFpciB0aGF0IHdpdGggYSBCUEYgTFNNIHBvbGljeSBwcm90ZWN0aW5nIHRob3NlIGtleXMgZnJvbSB0YW1wZXJpbmcsIGFzIGluXG4mIzQzO2BFbmZvcmNlbWVudCB2aWEgTFNNc2BfLlxuJiM0MztcbiYjNDM7UmVjb3JkZWQgZmllbGRzXG4mIzQzOy0tLS0tLS0tLS0tLS0tLVxuIFxuIFR3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OlxuIFxuIGBga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYClcbiAgICAgQ2xhc3NpZmllZCBwdXJlbHkgZnJvbSBgYGtleXJpbmdfaWRgYCB3aGVuZXZlciB0aGUgcHJvZ3JhbSBpcyBzaWduZWQ6XG4gICAgIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYCwgYGBfU0VDT05EQVJZYGAsIGBgX1BMQVRGT1JNYGAgZm9yIHRoZSBzeXN0ZW1cbi0gICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXNcbi0gICAgYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgIGZvciBhbiB1bnNpZ25lZCBwcm9ncmFtLlxuJiM0MzsgICAga2V5cmluZ3MsIGBgX0JQRmBgIGZvciB0aGUgYnBmIGtleXJpbmcsIG9yIGBgX1VTRVJgYCBmb3IgYSBjYWxsZXItc3VwcGxpZWRcbiYjNDM7ICAgIHVzZXIvc2Vzc2lvbiBrZXlyaW5nLiBJdCBpcyBgYEJQRl9TSUdfS0VZUklOR19OT05FYGAgZm9yIGFuIHVuc2lnbmVkXG4mIzQzOyAgICBwcm9ncmFtLlxuIFxuIGBga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYClcbiAgICAgU2V0ICoqb25seSoqIG9uIGEgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb24sIHRvIHRoZSBzZXJpYWwgb2YgdGhlXG4tICAgICoqdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nKiogdGhhdCBgYGtleXJpbmdfaWRgYCByZXNvbHZlZCB0byAtIHRoZVxuJiM0MzsgICAgKipjYWxsZXItc3VwcGxpZWQga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlXG4gICAgIG9iamVjdCB0aGUgc2lnbmF0dXJlIHdhcyB2ZXJpZmllZCBhZ2FpbnN0LCBub3QgdGhlIGluZGl2aWR1YWwgYXN5bW1ldHJpY1xuICAgICBrZXkgaW5zaWRlIGl0IHRoYXQgbWF0Y2hlZCB0aGUgc2lnbmVyLiBQYXNzaW5nXG4gICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcmIzM5O3Ncbi0gICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFyZSB0cnVzdGVkIGFzIGEgd2hvbGUgYW5kIGV4cG9zZSBubyBzZXJpYWxcbi0gICAgaGVyZSwgc28gdGhlIHNlcmlhbCBpcyBgYDBgYCBmb3IgYnVpbHRpbiwgc2Vjb25kYXJ5IGFuZCBwbGF0Zm9ybVxuLSAgICBzaWduYXR1cmVzLCBhbmQgYGAwYGAgZm9yIHVuc2lnbmVkIHByb2dyYW1zLiBJbiBvdGhlciB3b3JkcywgYSBub24temVyb1xuLSAgICBgYGtleXJpbmdfc2VyaWFsYGAgaXMgZXhhY3RseSBcJiMzNDt2ZXJpZmllZCBhZ2FpbnN0IHRoZSB1c2VyIGtleS9rZXlyaW5nIHdpdGhcbi0gICAgdGhpcyBzZXJpYWxcJiMzNDsuXG4mIzQzOyAgICBzZXJpYWwuIFRoZSBzeXN0ZW0ga2V5cmluZ3MgYW5kIHRoZSBicGYga2V5cmluZyBhcmUgdHJ1c3RlZCBhcyBhIHdob2xlIGFuZFxuJiM0MzsgICAgZXhwb3NlIG5vIHNlcmlhbCBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciB0aGVtLCBhbmQgYGAwYGAgZm9yXG4mIzQzOyAgICB1bnNpZ25lZCBwcm9ncmFtcy4gQSBub24temVybyBgYGtleXJpbmdfc2VyaWFsYGAgaXMgdGhlcmVmb3JlIGV4YWN0bHlcbiYjNDM7ICAgIFwmIzM0O3ZlcmlmaWVkIGFnYWluc3QgdGhlIGNhbGxlci1zdXBwbGllZCBrZXkva2V5cmluZyB3aXRoIHRoaXMgc2VyaWFsXCYjMzQ7LCB3aGljaFxuJiM0MzsgICAgaXMgZXhhY3RseSB0aGUgY2FzZSBhIHBvbGljeSBoYXMgdG8gc2NydXRpbmlzZS5cbiBcbiAuLiBsaXN0LXRhYmxlOjpcbiAgICA6aGVhZGVyLXJvd3M6IDFcbkBAIC00MzYsMTYgJiM0Mzs1NzUsNDkgQEAgVHdvIGZpZWxkcyBhcmUgcmVjb3JkZWQgaW4gYGBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWdgYCBmb3IgYW4gTFNNIHRvIGluc3BlY3Q6XG4gICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGBcbiAgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk1gYFxuICAgICAgLSBgYDBgYFxuLSAgICogLSBvdGhlciAoYSB1c2VyL3Nlc3Npb24ga2V5IHNlcmlhbClcbiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgXG4mIzQzOyAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19CUEZgYFxuJiM0MzsgICAgIC0gYGAwYGBcbiYjNDM7ICAgKiAtIG90aGVyIChhIGNhbGxlci1zdXBwbGllZCBrZXkgc2VyaWFsKVxuICAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19VU0VSYGBcbiAgICAgIC0gc2VyaWFsIG9mIHRoZSByZXNvbHZlZCBrZXkva2V5cmluZ1xuIFxuLVByb2R1Y2luZyBhIHNpZ25lZCBvYmplY3Rcbi09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJiM0MztQcm9kdWNpbmcgYW5kIGxvYWRpbmcgYSBzaWduZWQgb2JqZWN0XG4mIzQzOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiYjNDM7XG4mIzQzO0dlbmVyYXRpbmcgYSBzaWduaW5nIGtleVxuJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiYjNDM7XG4mIzQzO1NpZ25pbmcgaXMgYWxnb3JpdGhtIGFnbm9zdGljOiB0aGUgYWxnb3JpdGhtIGNvbWVzIGZyb20gdGhlIFguNTA5IGNlcnRpZmljYXRlXG4mIzQzO2FuZCB0aGUgUEtDUyM3IGBgU2lnbmVySW5mb2BgLiBBbnl0aGluZyB0aGUgWC41MDkgYW5kIFBLQ1MjNyBwYXJzZXJzIHVuZGVyc3RhbmRcbiYjNDM7d29ya3Mgd2l0aCBubyBCUEYtc2lkZSBjaGFuZ2UuIEJvdGggZXhhbXBsZXMgYmVsb3cgcmVhZCB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdFxuJiM0Mztjb25maWcgZnJvbSBgYHg1MDkuZ2Vua2V5YGAsIGZvciB3aGljaCBgYGNlcnRzL3g1MDkuZ2Vua2V5YGAgc2VydmVzIGFzIGFcbiYjNDM7dGVtcGxhdGUgKHNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21vZHVsZS1zaWduaW5nLnJzdCkuIFJTQTo6XG4mIzQzO1xuJiM0MzsgICAgb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLXNoYTI1NiAtZGF5cyAzNjUwMCAtYmF0Y2ggLXg1MDkgXFxcbiYjNDM7ICAgICAgICAgICAgLWNvbmZpZyB4NTA5LmdlbmtleSAtb3V0Zm9ybSBQRU0gXFxcbiYjNDM7ICAgICAgICAgICAgLW91dCBzaWduaW5nX2tleS5wZW0gLWtleW91dCBzaWduaW5nX2tleS5wZW1cbiYjNDM7ICAgIG9wZW5zc2wgeDUwOSAtaW4gc2lnbmluZ19rZXkucGVtIC1vdXRmb3JtIGRlciAtb3V0IHNpZ25pbmdfa2V5LmRlclxuJiM0MztcbiYjNDM7TUwtRFNBLTg3IChGSVBTLTIwNCksIHdoaWNoIG5lZWRzIG9wZW5zc2wgMy41IG9yIGxhdGVyIGFuZCBgYENPTkZJR19DUllQVE9fTUxEU0FgYFxuJiM0MztpbiB0aGUga2VybmVsLiBOb3RlIHRoZSBhYnNlbmNlIG9mIGEgZGlnZXN0IG9wdGlvbjogTUwtRFNBIGhhc2hlcyB0aGUgbWVzc2FnZVxuJiM0MztpdHNlbGYgYW5kIG9wZW5zc2wgcmVqZWN0cyBhbiBleHBsaWNpdCBkaWdlc3QgZm9yIGl0OjpcbiYjNDM7XG4mIzQzOyAgICBvcGVuc3NsIHJlcSAtbmV3IC1ub2RlcyAtdXRmOCAtZGF5cyAzNjUwMCAtYmF0Y2ggLXg1MDkgXFxcbiYjNDM7ICAgICAgICAgICAgLW5ld2tleSBNTC1EU0EtODcgLWNvbmZpZyB4NTA5LmdlbmtleSAtb3V0Zm9ybSBQRU0gXFxcbiYjNDM7ICAgICAgICAgICAgLW91dCBzaWduaW5nX2tleS5wZW0gLWtleW91dCBzaWduaW5nX2tleS5wZW1cbiYjNDM7ICAgIG9wZW5zc2wgeDUwOSAtaW4gc2lnbmluZ19rZXkucGVtIC1vdXRmb3JtIGRlciAtb3V0IHNpZ25pbmdfa2V5LmRlclxuJiM0MztcbiYjNDM7YGBicGZ0b29sYGAgaGFuZGxlcyB0aGUgZm9sbG93aW5nIGludGVybmFsbHk6IG9wZW5zc2wgYmVmb3JlIDQuMCBjYW5ub3QgY29tYmluZVxuJiM0MztNTC1EU0Egd2l0aCBgYENNU19OT0FUVFJgYCwgc28gaXQgZmFsbHMgYmFjayB0byBzaWduZWRBdHRycywgd2hlcmUgb25seSBTSEEtNTEyXG4mIzQzO2lzIHBlcm1pdHRlZC4gVGhpcyBtaXJyb3JzIHdoYXQgbW9kdWxlIHNpZ25pbmcgZG9lcyBhcyB3ZWxsLlxuJiM0MztcbiYjNDM7U2lnbmluZ1xuJiM0MzstLS0tLS0tXG4gXG4gYGBicGZ0b29sYGAgZ2VuZXJhdGVzIGFuZCBzaWducyBhIGxpZ2h0IHNrZWxldG9uIGluIG9uZSBzdGVwOjpcbiBcbi0gICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgXHUwMDNjcHJpdmF0ZV9rZXkucGVtXHUwMDNlIC1pIFx1MDAzY2NlcnRpZmljYXRlLng1MDlcdTAwM2UgXFxcbiYjNDM7ICAgIGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MIC1TIC1rIHNpZ25pbmdfa2V5LnBlbSAtaSBzaWduaW5nX2tleS5kZXIgXFxcbiAgICAgICAgICAgICBvYmouYnBmLm8gXHUwMDNlIG9iai5sc2tlbC5oXG4gXG4gYGAtTGBgIHNlbGVjdHMgdGhlIGxpZ2h0LXNrZWxldG9uIChgYGdlbl9sb2FkZXJgYCkgYmFja2VuZCBhbmQgYGAtU2BgIGVuYWJsZXNcbkBAIC00NTQsMTIgJiM0Mzs2MjYsMzYgQEAgc2lnbmluZzsgYGAta2BgIGFuZCBgYC1pYGAgc3VwcGx5IHRoZSBzaWduaW5nIGtleSBhbmQgaXRzIFguNTA5IGNlcnRpZmljYXRlLlxuIHJlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXJcbiBpbnN0cnVjdGlvbnMgc28gdGhlIG1ldGFkYXRhIG1hcCBjYW4gYmUgYm91bmQgdG8gdGhlIGxvYWRlci4gVGhlIHNpZ25hdHVyZSBhbmRcbiBoYXNoIGFyZSBlbWJlZGRlZCBpbiB0aGUgZ2VuZXJhdGVkIGhlYWRlcjsgdGhlIGNlcnRpZmljYXRlIGlzIHVzZWQgb25seSBmb3Jcbi1zaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIExvYWRpbmcgdGhlIHNrZWxldG9uIHBlcmZvcm1zIHRoZVxuLWNyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUuXG4mIzQzO3NpZ25pbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC5cbiYjNDM7XG4mIzQzO0xvYWRpbmdcbiYjNDM7LS0tLS0tLVxuJiM0MztcbiYjNDM7VGhlIGdlbmVyYXRlZCBza2VsZXRvbiBleHBvc2VzIGBga2V5cmluZ19pZGBgLCB3aGljaCBzZWxlY3RzIHRoZSBrZXlyaW5nIHRoZVxuJiM0MztrZXJuZWwgdmVyaWZpZXMgYWdhaW5zdC4gU2V0IGl0IGJldHdlZW4gb3BlbiBhbmQgbG9hZDsgbG9hZGluZyB0aGVuIHBlcmZvcm1zXG4mIzQzO3RoZSBjcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlOjpcbiBcbi1BdCBydW50aW1lIHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBjaG9zZW4ga2V5cmluZyAoZm9yXG4tZXhhbXBsZSBhZGRlZCB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nLCBvciBidWlsdCBpbnRvIHRoZSBrZXJuZWwmIzM5O3MgYnVpbHRpbiB0cnVzdGVkXG4ta2V5cmluZykgZm9yIHZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLlxuJiM0MzsgICAgc3RydWN0IG9iaiAqc2tlbCA9IG9ial9fb3BlbigpO1xuJiM0MztcbiYjNDM7ICAgIHNrZWwtXHUwMDNla2V5cmluZ19pZCA9IDM7ICAgICAgICAgICAvKiBWRVJJRllfVVNFX0JQRl9LRVlSSU5HICovXG4mIzQzOyAgICBlcnIgPSBvYmpfX2xvYWQoc2tlbCk7XG4mIzQzO1xuJiM0MztGb3IgdGhlIHN0YWdpbmcgY2FzZSB0aGUgc2FtZSBvYmplY3QgaXMgbG9hZGVkIGFnYWluc3QgYSBrZXlyaW5nIHRoZSBjYWxsZXJcbiYjNDM7cG9wdWxhdGVkIGl0c2VsZiwgd2hpY2ggb25seSB3b3JrcyBvbiBhIHN5c3RlbSB0aGF0IGhhcyBub3Qgc2V0XG4mIzQzO2BgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgOjpcbiYjNDM7XG4mIzQzOyAgICAvKlxuJiM0MzsgICAgICogU3RhZ2luZyBvbmx5OiB0aGlzIGtleXJpbmcgaXMgdW5kZXIgdGhlIGxvYWRlciYjMzk7cyBvd24gY29udHJvbCBhbmRcbiYjNDM7ICAgICAqIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi4gU2VlIFwmIzM0O0NhbGxlci1zdXBwbGllZCBrZXlyaW5ncyBhcmUgZm9yXG4mIzQzOyAgICAgKiBzdGFnaW5nXCYjMzQ7LlxuJiM0MzsgICAgICovXG4mIzQzOyAgICBrZXlfaWQgPSBhZGRfa2V5KFwmIzM0O2FzeW1tZXRyaWNcJiMzNDssIFwmIzM0O1wmIzM0OywgZGVyLCBkZXJfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzOyAgICBza2VsLVx1MDAzZWtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4mIzQzOyAgICBlcnIgPSBvYmpfX2xvYWQoc2tlbCk7XG4mIzQzO1xuJiM0MztFaXRoZXIgd2F5IHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBhbHJlYWR5IGJlIGluIHRoZSBjaG9zZW4ga2V5cmluZyBmb3JcbiYjNDM7dmVyaWZpY2F0aW9uIHRvIHN1Y2NlZWQuIEZvciB0aGUgYnBmIGtleXJpbmcgdGhhdCBlbnJvbGxtZW50IGhhcHBlbnMgb25jZSBhdFxuJiM0Mztib290LCBzZWUgYFByb3Zpc2lvbmluZ2BfLlxuIFxuIFVBUEkgcmVmZXJlbmNlXG4gPT09PT09PT09PT09PT1cbkBAIC00ODcsNiAmIzQzOzY4MywxMyBAQCBVQVBJIHJlZmVyZW5jZVxuICAgICBUaGUgbWFwIGNvbnRlbnQgaXMgbm90IGhhc2hlZCBzZXBhcmF0ZWx5IGF0IGFsbCAtIGl0IGlzIGNvdmVyZWQsIGFzIGJ5dGVzLFxuICAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuXG4gXG4mIzQzO0tlcm5lbCBjb21tYW5kIGxpbmU6XG4mIzQzO1xuJiM0MztgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPWBgXG4mIzQzOyAgICBTZXQgdG8gYGAxYGAgdG8gbGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkIGZvciBwcm92aXNpb25pbmcsIGFuZCB0byBtYWtlXG4mIzQzOyAgICBpdCB0aGUgb25seSBub24tc3lzdGVtIGtleXJpbmcgYSBsb2FkZXIgbWF5IHNlbGVjdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGJvb3RcbiYjNDM7ICAgIChzZWUgYFRoZSBicGYga2V5cmluZ2BfKS5cbiYjNDM7XG4gTm90ZXMgYW5kIGxpbWl0YXRpb25zXG4gPT09PT09PT09PT09PT09PT09PT09PVxuIFxuQEAgLTQ5NSwzICYjNDM7Njk4LDUgQEAgTm90ZXMgYW5kIGxpbWl0YXRpb25zXG4gICBleGNlZWQgaXQuXG4gLSBUaGUgbWV0YWRhdGEgY29udGFpbmVyIGlzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkgbWFwLCBhY2Nlc3NlZCB0aHJvdWdoXG4gICBgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmBgLlxuJiM0MzstIFRoZSBicGYga2V5cmluZyBuZWVkcyBgYENPTkZJR19LRVlTYGA7IHdpdGhvdXQgaXQgdGhlcmUgaXMgbm8gYnBmIGtleXJpbmdcbiYjNDM7ICBhbmQgYGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYGAgbmV2ZXIgcmVzb2x2ZXMuXG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmhcbmluZGV4IGIzY2QyOGQ5ZTNiNTUuLjU3MWY3NzkyYTVjNDEgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L2JwZi5oXG4mIzQzOyYjNDM7JiM0MzsgYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5AQCAtMTczNSw2ICYjNDM7MTczNSw3IEBAIGVudW0gYnBmX3NpZ19rZXlyaW5nIHtcbiBcdEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlksXG4gXHRCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk0sXG4gXHRCUEZfU0lHX0tFWVJJTkdfVVNFUixcbiYjNDM7XHRCUEZfU0lHX0tFWVJJTkdfQlBGLFxuIH07XG4gXG4gc3RydWN0IGJwZl9wcm9nX2F1eCB7XG5AQCAtMzgxOSw2ICYjNDM7MzgyMCw4IEBAIHN0cnVjdCBicGZfa2V5IHtcbiAjaWYgZGVmaW5lZChDT05GSUdfS0VZUykgXHUwMDI2XHUwMDI2IGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKVxuIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3VzZXJfa2V5KHMzMiBzZXJpYWwsIHU2NCBmbGFncyk7XG4gc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfc3lzdGVtX2tleSh1NjQgaWQpO1xuJiM0MztzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpO1xuJiM0Mztib29sIGJwZl9rZXlyaW5nX2VuZm9yY2VkKHZvaWQpO1xuIHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpO1xuIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxuIFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXG5AQCAtMzgzOSw2ICYjNDM7Mzg0MiwxNiBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKVxuIFx0cmV0dXJuIE5VTEw7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBOVUxMO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW5saW5lIGJvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZClcbiYjNDM7e1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuJiM0MztcbiBzdGF0aWMgaW5saW5lIHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpXG4ge1xuIH1cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZlcmlmaWNhdGlvbi5oIGIvaW5jbHVkZS9saW51eC92ZXJpZmljYXRpb24uaFxuaW5kZXggZGVjN2YyYmVhYmZkNC4uMWNiNTlkZGRhMjUwOSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmhcbiYjNDM7JiM0MzsmIzQzOyBiL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmhcbkBAIC0xOCw2ICYjNDM7MTgsMTYgQEBcbiAjZGVmaW5lIFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkcgKChzdHJ1Y3Qga2V5ICopMVVMKVxuICNkZWZpbmUgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HICAoKHN0cnVjdCBrZXkgKikyVUwpXG4gXG4mIzQzOy8qXG4mIzQzOyAqIFRoZSBpZCBvZiBCUEYmIzM5O3MgXCYjMzQ7LmJwZlwmIzM0OyBrZXlyaW5nLCByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNwYWNlLiBJdCBpc1xuJiM0MzsgKiBleHBsaWNpdGx5IG5vdCBhIHNlbnRpbmVsIGxpa2UgdGhlIHR3byBhYm92ZSBhcyBCUEYgcmVzb2x2ZXMgaXQgdG9cbiYjNDM7ICogdGhlIGtleXJpbmcgaXRzZWxmIGFuZCBwYXNzZXMgdGhhdCwgc28gdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIG5ldmVyXG4mIzQzOyAqIHNlZXMgdGhpcyB2YWx1ZSwgYW5kIHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKCkgbXVzdCBrZWVwIHJlamVjdGluZyBpdC5cbiYjNDM7ICogTGVmdCBhcyBhIHBsYWluIGludGVnZXIgc28gdGhhdCBoYW5kaW5nIGl0IG92ZXIgYXMgQHRydXN0ZWRfa2V5cyBkb2VzXG4mIzQzOyAqIG5vdCBjb21waWxlLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HXHQzXG4mIzQzO1xuIHN0YXRpYyBpbmxpbmUgaW50IHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKHU2NCBpZClcbiB7XG4gXHRpZiAoaWQgXHUwMDNlICh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORylcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL01ha2VmaWxlIGIva2VybmVsL2JwZi9NYWtlZmlsZVxuaW5kZXggOTAyNTVkODBlNWJlNi4uOWE5MmMzNDhiYmRhNiAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvTWFrZWZpbGVcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvTWFrZWZpbGVcbkBAIC0yNyw2ICYjNDM7MjcsOSBAQCBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBvZmZsb2FkLm9cbiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBuZXRfbmFtZXNwYWNlLm9cbiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSB0Y3gub1xuIGVuZGlmXG4mIzQzO2lmZXEgKCQoQ09ORklHX0tFWVMpLHkpXG4mIzQzO29iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGtleXMub1xuJiM0MztlbmRpZlxuIGlmZXEgKCQoQ09ORklHX1BFUkZfRVZFTlRTKSx5KVxuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IHN0YWNrbWFwLm9cbiBlbmRpZlxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYva2V5cy5jIGIva2VybmVsL2JwZi9rZXlzLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MGNiODUyOTVjODlhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL2tleXMuY1xuQEAgLTAsMCAmIzQzOzEsNzIgQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuJiM0MzsvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9jcmVkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L2tleS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZXBhcmFtLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWFxuJiM0MzsjZGVmaW5lIE1PRFVMRV9QQVJBTV9QUkVGSVggXCYjMzQ7YnBmLlwmIzM0O1xuJiM0MztcbiYjNDM7c3RhdGljIHN0cnVjdCBrZXkgKmJwZl9rZXlyaW5nO1xuJiM0MztcbiYjNDM7c3RhdGljIGJvb2wgYnBmX2tleXJpbmdfdW5zZWFsZWQgX19yb19hZnRlcl9pbml0O1xuJiM0Mzttb2R1bGVfcGFyYW1fbmFtZWQoa2V5cmluZ191bnNlYWxlZCwgYnBmX2tleXJpbmdfdW5zZWFsZWQsIGJvb2wsIDA0NDQpO1xuJiM0MztNT0RVTEVfUEFSTV9ERVNDKGtleXJpbmdfdW5zZWFsZWQsIFwmIzM0O0xlYXZlIHRoZSBicGYga2V5cmluZyB1bnNlYWxlZFwmIzM0Oyk7XG4mIzQzO1xuJiM0Mztib29sIGJwZl9rZXlyaW5nX2VuZm9yY2VkKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gYnBmX2tleXJpbmdfdW5zZWFsZWQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBicGZfa2V5ICpia2V5O1xuJiM0MztcbiYjNDM7XHRpZiAoIWJwZl9rZXlyaW5nKVxuJiM0MztcdFx0cmV0dXJuIE5VTEw7XG4mIzQzO1x0aWYgKCFSRUFEX09OQ0UoYnBmX2tleXJpbmctXHUwMDNla2V5cy5ucl9sZWF2ZXNfb25fdHJlZSkgfHxcbiYjNDM7XHQgICAgIVJFQURfT05DRShicGZfa2V5cmluZy1cdTAwM2VyZXN0cmljdF9saW5rKSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRia2V5ID0ga21hbGxvY19vYmooKmJrZXkpO1xuJiM0MztcdGlmICghYmtleSlcbiYjNDM7XHRcdHJldHVybiBOVUxMO1xuJiM0MztcbiYjNDM7XHRia2V5LVx1MDAzZWtleSA9IGJwZl9rZXlyaW5nO1xuJiM0MztcdGJrZXktXHUwMDNlaGFzX3JlZiA9IGZhbHNlO1xuJiM0MztcdHJldHVybiBia2V5O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IF9faW5pdCBicGZfa2V5cmluZ19pbml0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qga2V5ICprZXlyaW5nO1xuJiM0MztcbiYjNDM7XHRrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhcJiMzNDsuYnBmXCYjMzQ7LFxuJiM0MztcdFx0XHRcdEdMT0JBTF9ST09UX1VJRCwgR0xPQkFMX1JPT1RfR0lELFxuJiM0MztcdFx0XHRcdGN1cnJlbnRfY3JlZCgpLCBLRVlfUE9TX1NFQVJDSCB8XG4mIzQzO1x0XHRcdFx0S0VZX1VTUl9WSUVXIHwgS0VZX1VTUl9SRUFEIHxcbiYjNDM7XHRcdFx0XHRLRVlfVVNSX1dSSVRFIHwgS0VZX1VTUl9TRUFSQ0ggfFxuJiM0MztcdFx0XHRcdEtFWV9VU1JfU0VUQVRUUiwgS0VZX0FMTE9DX05PVF9JTl9RVU9UQSxcbiYjNDM7XHRcdFx0XHROVUxMLCBOVUxMKTtcbiYjNDM7XHRpZiAoSVNfRVJSKGtleXJpbmcpKSB7XG4mIzQzO1x0XHRwcl9lcnIoXCYjMzQ7YnBmOiBjYW5ub3QgYWxsb2NhdGUgYnBmIGtleXJpbmc6ICVsZFxcblwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBQVFJfRVJSKGtleXJpbmcpKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIWJwZl9rZXlyaW5nX3Vuc2VhbGVkIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICBrZXlyaW5nX3Jlc3RyaWN0KG1ha2Vfa2V5X3JlZihrZXlyaW5nLCB0cnVlKSwgTlVMTCwgTlVMTCkpIHtcbiYjNDM7XHRcdHByX2VycihcJiMzNDticGY6IGNhbm5vdCBzZWFsIGJwZiBrZXlyaW5nXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdGtleV9yZXZva2Uoa2V5cmluZyk7XG4mIzQzO1x0XHRrZXlfcHV0KGtleXJpbmcpO1xuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRicGZfa2V5cmluZyA9IGtleXJpbmc7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7bGF0ZV9pbml0Y2FsbChicGZfa2V5cmluZ19pbml0KTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IGUwMzZhZTIwYmY2YjkuLjU1OGU1MThhZDMxMDkgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTIwOTcyLDYgJiM0MzsyMDk3MiwxNCBAQCBpbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLFxuIFx0cmV0dXJuIDA7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBVcHBlciBib3VuZCBvbiB0aGUgUEtDUyM3IHNpZ25hdHVyZSBibG9iIHBhc3NlZCB3aXRoIGEgcHJvZ3JhbS4gQ29tZm9ydGFibHlcbiYjNDM7ICogYWJvdmUgdGhlIGxhcmdlc3Qgc2lnbmF0dXJlIHRoZSBrZXJuZWwgY2FuIHZlcmlmeSwgYW5kIGZhciBiZWxvdyBhbnl0aGluZ1xuJiM0MzsgKiB0aGF0IHdvdWxkIG1ha2UgcmVqZWN0aW5nIGEgbG9hZCBleHBlbnNpdmUuIERlbGliZXJhdGVseSBhIGZpeGVkIG51bWJlciBzb1xuJiM0MzsgKiB0aGF0IHdoYXQgdGhlIHN5c2NhbGwgYWNjZXB0cyBkb2VzIG5vdCBkZXBlbmQgb24gUEFHRV9TSVpFLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkVcdCg2NCAqIDEwMjQpXG4mIzQzO1xuIHN0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZClcbiB7XG4gXHRzd2l0Y2ggKGtleXJpbmdfaWQpIHtcbkBAIC0yMDk4MSw2ICYjNDM7MjA5ODksOCBAQCBzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXG4gXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZO1xuIFx0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzpcbiBcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTtcbiYjNDM7XHRjYXNlIFZFUklGWV9VU0VfQlBGX0tFWVJJTkc6XG4mIzQzO1x0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX0JQRjtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcbiBcdH1cbkBAIC0yMTAwOSwyMSAmIzQzOzIxMDE5LDMyIEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuIFx0dTY0IGRhdGFfc3o7XG4gXHRpbnQgZXJyID0gMDtcbiBcbi1cdC8qXG4tXHQgKiBEb24mIzM5O3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxuLVx0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXG4tXHQgKi9cbiBcdGlmICghYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSB8fFxuLVx0ICAgIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4mIzQzO1x0ICAgIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEJQRl9QUk9HX01BWF9TSUdOQVRVUkVfU0laRSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4tXHRpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci1cdTAwM2VrZXlyaW5nX2lkKSA9PSAwKVxuJiM0MztcbiYjNDM7XHRpZiAoIXN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXHUwMDNla2V5cmluZ19pZCkpIHtcbiBcdFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4tXHRlbHNlXG4tXHRcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkLCAwKTtcbiYjNDM7XHR9IGVsc2Uge1xuJiM0MztcdFx0aWYgKGF0dHItXHUwMDNla2V5cmluZ19pZCAhPSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XG4mIzQzO1x0XHRcdGlmIChicGZfa2V5cmluZ19lbmZvcmNlZCgpKSB7XG4mIzQzO1x0XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2NhbGxlci1zdXBwbGllZCBrZXlyaW5nIHJlZnVzZWQsIHVzZSBicGYga2V5cmluZ1xcblwmIzM0Oyk7XG4mIzQzO1x0XHRcdFx0cmV0dXJuIC1FUEVSTTtcbiYjNDM7XHRcdFx0fVxuJiM0MztcdFx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHRrZXkgPSBicGZfbG9va3VwX2tleXJpbmcoKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4gXHRpZiAoIWtleSkge1xuLVx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7Y2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcblwmIzM0Oyxcbi1cdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRcdGlmIChhdHRyLVx1MDAzZWtleXJpbmdfaWQgPT0gVkVSSUZZX1VTRV9CUEZfS0VZUklORykge1xuJiM0MztcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7dGhlIGJwZiBrZXlyaW5nIGlzIGVtcHR5IG9yIGhhcyBub3QgYmVlbiByZXN0cmljdGVkXFxuXCYjMzQ7KTtcbiYjNDM7XHRcdFx0cmV0dXJuIC1FTk9LRVk7XG4mIzQzO1x0XHR9IGVsc2Uge1xuJiM0MztcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7Y2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcblwmIzM0OyxcbiYjNDM7XHRcdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuJiM0MztcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiYjNDM7XHRcdH1cbiBcdH1cbiBcbiBcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLjkzMTVhMWRiMWY3YzIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTU3LDcgJiM0Mzs1Nyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqdTY0X3RvX3B0cihfX3U2NCBwdHIpXG4gXHR9KVxuIFxuICNkZWZpbmUgRVJSX01BWF9MRU5cdDEwMjRcbi0jZGVmaW5lIE1BWF9TSUdfU0laRVx0NDA5NlxuJiM0MzsjZGVmaW5lIE1BWF9TSUdfU0laRVx0MTYzODRcbiBcbiAjZGVmaW5lIEJQRl9UQUdfRk1UXHRcJiMzNDslMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHhcJiMzNDtcbiBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9zaWduLmMgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbmluZGV4IDg4NzI2YTZkYjZkMGUuLjFiNTUwMmY0OGFkZDAgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuQEAgLTEzMCw2ICYjNDM7MTMwLDkgQEAgX191MzIgcmVnaXN0ZXJfc2Vzc2lvbl9rZXkoY29uc3QgY2hhciAqa2V5X2Rlcl9wYXRoKVxuIFxuIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBpbnQgc2lnbmVyX2ZsYWdzID0gQ01TX05PQ0VSVFMgfCBDTVNfQklOQVJZIHwgQ01TX05PU01JTUVDQVAgfFxuJiM0MztcdFx0XHRcdCAgICBDTVNfVVNFX0tFWUlEIHwgQ01TX05PQVRUUjtcbiYjNDM7XHRjb25zdCBFVlBfTUQgKmNtc19kaWdlc3QgPSBFVlBfc2hhMjU2KCk7XG4gXHRCSU8gKmJkX2luID0gTlVMTCwgKmJkX291dCA9IE5VTEw7XG4gXHRFVlBfUEtFWSAqcHJpdmF0ZV9rZXkgPSBOVUxMO1xuIFx0Q01TX0NvbnRlbnRJbmZvICpjbXMgPSBOVUxMO1xuQEAgLTE2Nyw2ICYjNDM7MTcwLDIxIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0XHRnb3RvIGNsZWFudXA7XG4gXHR9XG4gXG4mIzQzOyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIFx1MDAzZT0gMHgzMDAwMDAwMEwgXHUwMDI2XHUwMDI2IE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgXHUwMDNjIDB4NDAwMDAwMDBMXG4mIzQzO1x0aWYgKEVWUF9QS0VZX2lzX2EocHJpdmF0ZV9rZXksIFwmIzM0O01MLURTQS00NFwmIzM0OykgfHxcbiYjNDM7XHQgICAgRVZQX1BLRVlfaXNfYShwcml2YXRlX2tleSwgXCYjMzQ7TUwtRFNBLTY1XCYjMzQ7KSB8fFxuJiM0MztcdCAgICBFVlBfUEtFWV9pc19hKHByaXZhdGVfa2V5LCBcJiMzNDtNTC1EU0EtODdcJiMzNDspKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogTUwtRFNBICYjNDM7IENNU19OT0FUVFIgaXMgbm90IHN1cHBvcnRlZCBiZWZvcmUgb3BlbnNzbC00LjAsIHNvXG4mIzQzO1x0XHQgKiBmYWxsIGJhY2sgdG8gc2lnbmVkQXR0cnMuIE1MLURTQSBkb2VzIGl0cyBvd24gaGFzaGluZyBhbmRcbiYjNDM7XHRcdCAqIGlnbm9yZXMgdGhlIENNUyBkaWdlc3QsIGV4Y2VwdCB3aGVuIHNpZ25lZEF0dHJzIGFyZSB1c2VkLFxuJiM0MztcdFx0ICogd2hlcmUgb25seSBTSEEtNTEyIGlzIHBlcm1pdHRlZC5cbiYjNDM7XHRcdCAqL1xuJiM0MztcdFx0c2lnbmVyX2ZsYWdzIFx1MDAyNj0gfkNNU19OT0FUVFI7XG4mIzQzO1x0XHRjbXNfZGlnZXN0ID0gRVZQX3NoYTUxMigpO1xuJiM0MztcdH1cbiYjNDM7I2VuZGlmXG4mIzQzO1xuIFx0Y21zID0gQ01TX3NpZ24oTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCxcbiBcdFx0ICAgICAgIENNU19OT0NFUlRTIHwgQ01TX1BBUlRJQUwgfCBDTVNfQklOQVJZIHwgQ01TX0RFVEFDSEVEIHxcbiBcdFx0XHQgICAgICAgQ01TX1NUUkVBTSk7XG5AQCAtMTc1LDkgJiM0MzsxOTMsNyBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcbiBcdFx0Z290byBjbGVhbnVwO1xuIFx0fVxuIFxuLVx0aWYgKCFDTVNfYWRkMV9zaWduZXIoY21zLCB4NTA5LCBwcml2YXRlX2tleSwgRVZQX3NoYTI1NigpLFxuLVx0XHRcdCAgICAgQ01TX05PQ0VSVFMgfCBDTVNfQklOQVJZIHwgQ01TX05PU01JTUVDQVAgfFxuLVx0XHRcdCAgICAgQ01TX1VTRV9LRVlJRCB8IENNU19OT0FUVFIpKSB7XG4mIzQzO1x0aWYgKCFDTVNfYWRkMV9zaWduZXIoY21zLCB4NTA5LCBwcml2YXRlX2tleSwgY21zX2RpZ2VzdCwgc2lnbmVyX2ZsYWdzKSkge1xuIFx0XHRlcnIgPSAtRUlOVkFMO1xuIFx0XHRnb3RvIGNsZWFudXA7XG4gXHR9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG5pbmRleCA1ZjFhM2JmYzA1NjlmLi4wNWIzZWU2NDI5MGZhIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcbkBAIC02NjMsNyAmIzQzOzY2Myw3IEBAICQoVFJVTk5FUl9CUEZfTFNLRUxTKTogJS5sc2tlbC5oOiAlLmJwZi5vICQoQlBGVE9PTCkgfCAkKFRSVU5ORVJfT1VUUFVUKVxuIFx0fSkgXHUwMDI2XHUwMDI2IFxcXG4gXHRybSAtZiAkJChcdTAwM2M6Lm89LmxsaW5rZWQxLm8pICQkKFx1MDAzYzoubz0ubGxpbmtlZDIubykgJCQoXHUwMDNjOi5vPS5sbGlua2VkMy5vKVxuIFxuLSQoVFJVTk5FUl9CUEZfTFNLRUxTX1NJR05FRCk6ICUubHNrZWwuaDogJS5icGYubyAkKEJQRlRPT0wpIHwgJChUUlVOTkVSX09VVFBVVClcbiYjNDM7JChUUlVOTkVSX0JQRl9MU0tFTFNfU0lHTkVEKTogJS5sc2tlbC5oOiAlLmJwZi5vICQoQlBGVE9PTCkgJChWRVJJRklDQVRJT05fQ0VSVCkgfCAkKFRSVU5ORVJfT1VUUFVUKVxuIFx0JChRKSQoaWYgJChQRVJNSVNTSVZFKSxpZiBbICEgLWYgJCRcdTAwM2MgXTsgdGhlblx0XHRcdFxcXG4gXHRcdCQkKFJNKSAkJEA7XHRcdFx0XHRcdFx0XFxcbiBcdFx0cHJpbnRmICYjMzk7ICAlLTEycyAlc1xcbiYjMzk7ICYjMzk7U0tJUC1TS0VMJiMzOTsgJiMzOTskJChub3RkaXIgJCRAKSYjMzk7IDFcdTAwM2VcdTAwMjYyOyBcXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5pbmRleCBlYTcwNDRmMzBhZGMzLi4yZWMxNTExN2FiYjUwIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuQEAgLTUxLDYgJiM0Mzs1MSw4IEBAIENPTkZJR19JUFY2X1NFRzZfTFdUVU5ORUw9eVxuIENPTkZJR19JUFY2X1NJVD15XG4gQ09ORklHX0lQVjZfVFVOTkVMPXlcbiBDT05GSUdfS0VZUz15XG4mIzQzO0NPTkZJR19DUllQVE9fTUxEU0E9eVxuJiM0MztDT05GSUdfQ1JZUFRPX1NIQTUxMj15XG4gQ09ORklHX0xJUkM9eVxuIENPTkZJR19MSVZFUEFUQ0g9eVxuIENPTkZJR19MV1RVTk5FTD15XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXG5pbmRleCA3NzM4MWQzNDU0MzVjLi42MjBhNmQyMmE3NTljIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcbkBAIC0zMiwxMSAmIzQzOzMyLDIwIEBAIGVudW0ge1xuIFx0QlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWSxcbiBcdEJQRl9TSUdfS0VZUklOR19QTEFURk9STSxcbiBcdEJQRl9TSUdfS0VZUklOR19VU0VSLFxuJiM0MztcdEJQRl9TSUdfS0VZUklOR19CUEYsXG4gfTtcbiBcbi1zdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbi1cdFx0ICAgICAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkLFxuLVx0XHQgICAgICAgX191MzIgZmRfYXJyYXlfY250KVxuJiM0MzsjZGVmaW5lIEJQRl9LRVlSSU5HX0JQRlx0XHQzXG4mIzQzO1xuJiM0MzsvKiB2ZXJpZnlfc2lnX3NldHVwLnNoIGV4aXRzIHdpdGggdGhpcyB3aGVuIG9wZW5zc2wgY2Fubm90IGRvIE1MLURTQS4gKi9cbiYjNDM7I2RlZmluZSBTRVRVUF9TS0lQXHRcdCgtNzcpXG4mIzQzO1xuJiM0MzsvKiBGSVBTLTIwNCBNTC1EU0EtODcgc2lnbmF0dXJlIHNpemUsIHNlZSBpbmNsdWRlL2NyeXB0by9tbGRzYS5oLiAqL1xuJiM0MzsjZGVmaW5lIE1MRFNBODdfU0lHTkFUVVJFX1NJWkVcdDQ2MjdcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgbG9hZF9sb2FkZXJfbG9nKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbiYjNDM7XHRcdFx0ICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsXG4mIzQzO1x0XHRcdCAgIF9fdTMyIGZkX2FycmF5X2NudCwgY2hhciAqbG9nX2J1ZiwgX191MzIgbG9nX3N6KVxuIHtcbiBcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4gXHRpbnQgZmQ7XG5AQCAtNDgsMTggJiM0Mzs1NywzMSBAQCBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbiBcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCYjMzQ7RHVhbCBCU0QvR1BMXCYjMzQ7KTtcbiBcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbiBcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KFx1MDAyNm1hcF9mZCk7XG4mIzQzO1x0YXR0ci5mZF9hcnJheV9jbnQgPSBmZF9hcnJheV9jbnQ7XG4gXHRpZiAoc2lnKSB7XG4gXHRcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuIFx0XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuIFx0XHRhdHRyLmtleXJpbmdfaWQgPSBrZXlyaW5nX2lkO1xuIFx0fVxuLVx0YXR0ci5mZF9hcnJheV9jbnQgPSBmZF9hcnJheV9jbnQ7XG4mIzQzO1x0aWYgKGxvZ19idWYpIHtcbiYjNDM7XHRcdGF0dHIubG9nX2xldmVsID0gMTtcbiYjNDM7XHRcdGF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7XG4mIzQzO1x0XHRhdHRyLmxvZ19zaXplID0gbG9nX3N6O1xuJiM0MztcdH1cbiBcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0Oywgc2l6ZW9mKFwmIzM0O19fbG9hZGVyLnByb2dcJiMzNDspKTtcbiBcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiBcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuIFx0cmV0dXJuIGZkIFx1MDAzYyAwID8gLWVycm5vIDogZmQ7XG4gfVxuIFxuJiM0MztzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbiYjNDM7XHRcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCxcbiYjNDM7XHRcdCAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gbG9hZF9sb2FkZXJfbG9nKGluc25zLCBpbnNuc19zeiwgbWFwX2ZkLCBzaWcsIHNpZ19zeiwga2V5cmluZ19pZCxcbiYjNDM7XHRcdFx0ICAgICAgIGZkX2FycmF5X2NudCwgTlVMTCwgMCk7XG4mIzQzO31cbiYjNDM7XG4gc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXG4gXHRcdFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeixcbkBAIC0xNTYsMTIgJiM0MzsxNzgsMzAgQEAgc3RhdGljIGludCBydW5fc2V0dXAoY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICpkaXIpXG4gXHR9XG4gXHRpZiAod2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCkgXHUwMDNjIDApXG4gXHRcdHJldHVybiAtZXJybm87XG4tXHRyZXR1cm4gKFdJRkVYSVRFRChzdGF0dXMpIFx1MDAyNlx1MDAyNlxuLVx0XHRXRVhJVFNUQVRVUyhzdGF0dXMpID09IDApID8gMCA6IC1FSU5WQUw7XG4mIzQzO1x0aWYgKCFXSUZFWElURUQoc3RhdHVzKSlcbiYjNDM7XHRcdHJldHVybiAtRUlOVkFMO1xuJiM0MztcdHJldHVybiAtV0VYSVRTVEFUVVMoc3RhdHVzKTtcbiB9XG4gXG4tc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuLVx0XHQgICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6KVxuJiM0MztzdGF0aWMgdm9pZCBnZW5rZXlfZGlyX2ZpbmkoY29uc3QgY2hhciAqZGlyKVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmaWxlc1tdID0ge1xuJiM0MztcdFx0XCYjMzQ7c2lnbmluZ19rZXkuZGVyXCYjMzQ7LCBcJiMzNDtzaWduaW5nX2tleS5wZW1cJiMzNDssIFwmIzM0O3g1MDkuZ2Vua2V5XCYjMzQ7LFxuJiM0MztcdH07XG4mIzQzO1x0Y2hhciBwYXRoW1BBVEhfTUFYXTtcbiYjNDM7XHRzaXplX3QgaTtcbiYjNDM7XG4mIzQzO1x0aWYgKCFkaXIpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmaWxlcyk7IGkmIzQzOyYjNDM7KSB7XG4mIzQzO1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwmIzM0OyVzLyVzXCYjMzQ7LCBkaXIsIGZpbGVzW2ldKTtcbiYjNDM7XHRcdHVubGluayhwYXRoKTtcbiYjNDM7XHR9XG4mIzQzO1x0cm1kaXIoZGlyKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzaWduX2J1Zl9kaWdlc3QoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcbiYjNDM7XHRcdFx0ICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6LCBjb25zdCBjaGFyICpkaWdlc3QpXG4ge1xuIFx0Y2hhciBkYXRhX3RtcGxbUEFUSF9NQVhdLCBrZXlbUEFUSF9NQVhdO1xuIFx0Y2hhciBzaWdwYXRoW1BBVEhfTUFYICYjNDM7IHNpemVvZihcJiMzNDsucDdzXCYjMzQ7KV07XG5AQCAtMTc2LDYgJiM0MzsyMTYsNyBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4gXHRmZCA9IG1rc3RlbXAoZGF0YV90bXBsKTtcbiBcdGlmIChmZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC1lcnJubztcbiYjNDM7XHRzbnByaW50ZihzaWdwYXRoLCBzaXplb2Yoc2lncGF0aCksIFwmIzM0OyVzLnA3c1wmIzM0OywgZGF0YV90bXBsKTtcbiBcdGlmICh3cml0ZShmZCwgYnVmLCBsZW4pICE9IChzc2l6ZV90KWxlbikge1xuIFx0XHRjbG9zZShmZCk7XG4gXHRcdHJldCA9IC1FSU87XG5AQCAtMTkwLDcgJiM0MzsyMzEsNyBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4gXHR9XG4gXHRpZiAocGlkID09IDApIHtcbiBcdFx0c25wcmludGYoa2V5LCBzaXplb2Yoa2V5KSwgXCYjMzQ7JXMvc2lnbmluZ19rZXkucGVtXCYjMzQ7LCBkaXIpO1xuLVx0XHRleGVjbHAoXCYjMzQ7Li9zaWduLWZpbGVcJiMzNDssIFwmIzM0Oy4vc2lnbi1maWxlXCYjMzQ7LCBcJiMzNDstZFwmIzM0OywgXCYjMzQ7c2hhMjU2XCYjMzQ7LFxuJiM0MztcdFx0ZXhlY2xwKFwmIzM0Oy4vc2lnbi1maWxlXCYjMzQ7LCBcJiMzNDsuL3NpZ24tZmlsZVwmIzM0OywgXCYjMzQ7LWRcJiMzNDssIGRpZ2VzdCxcbiBcdFx0ICAgICAgIGtleSwga2V5LCBkYXRhX3RtcGwsIE5VTEwpO1xuIFx0XHRleGl0KDEpO1xuIFx0fVxuQEAgLTIwMCwzNCAmIzQzOzI0MSwzOCBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFxuLVx0c25wcmludGYoc2lncGF0aCwgc2l6ZW9mKHNpZ3BhdGgpLCBcJiMzNDslcy5wN3NcJiMzNDssIGRhdGFfdG1wbCk7XG4gXHRpZiAoc3RhdChzaWdwYXRoLCBcdTAwMjZzdCkgXHUwMDNjIDApIHtcbiBcdFx0cmV0ID0gLWVycm5vO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcdGlmIChzdC5zdF9zaXplIFx1MDAzZSAob2ZmX3QpKnNpZ19zeikge1xuIFx0XHRyZXQgPSAtRTJCSUc7XG4tXHRcdGdvdG8gb3V0X3NpZztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0ZmQgPSBvcGVuKHNpZ3BhdGgsIE9fUkRPTkxZKTtcbiBcdGlmIChmZCBcdTAwM2MgMCkge1xuIFx0XHRyZXQgPSAtZXJybm87XG4tXHRcdGdvdG8gb3V0X3NpZztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0aWYgKHJlYWQoZmQsIHNpZywgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSkge1xuIFx0XHRjbG9zZShmZCk7XG4gXHRcdHJldCA9IC1FSU87XG4tXHRcdGdvdG8gb3V0X3NpZztcbiYjNDM7XHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0Y2xvc2UoZmQpO1xuIFx0KnNpZ19zeiA9IHN0LnN0X3NpemU7XG4tb3V0X3NpZzpcbi1cdHVubGluayhzaWdwYXRoKTtcbiBvdXQ6XG4mIzQzO1x0dW5saW5rKHNpZ3BhdGgpO1xuIFx0dW5saW5rKGRhdGFfdG1wbCk7XG4gXHRyZXR1cm4gcmV0O1xuIH1cbiBcbiYjNDM7c3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuJiM0MztcdFx0ICAgIHZvaWQgKnNpZywgX191MzIgKnNpZ19zeilcbiYjNDM7e1xuJiM0MztcdHJldHVybiBzaWduX2J1Zl9kaWdlc3QoZGlyLCBidWYsIGxlbiwgc2lnLCBzaWdfc3osIFwmIzM0O3NoYTI1NlwmIzM0Oyk7XG4mIzQzO31cbiYjNDM7XG4gc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7XG4gXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfb3B0cyBnb3B0cztcbkBAIC00NTcsNyAmIzQzOzUwMiw3IEBAIHN0YXRpYyB2b2lkIHNpZ25lZF9idGZfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4gXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXAtcnNhXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG5AQCAtNTI5LDcgJiM0Mzs1NzQsNiBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfZmFpbHVyZV9sb2dzKHZvaWQpXG4gXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHsgMHgzMCwgMHg0MiwgMHgxMywgMHgzNywgfTtcbiBcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuLVx0dW5pb24gYnBmX2F0dHIgYXR0cjtcbiBcdGludCBmZDtcbiBcbiBcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKSB7XG5AQCAtNTM4LDIyICYjNDM7NTgyLDkgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyh2b2lkKVxuIFx0XHQgKiBmYWlsdXJlIGlzIHJlcG9ydGVkIHRocm91Z2ggdGhlIHZlcmlmaWVyIGxvZy4gQSBwcmVzZW50LWJ1dC1cbiBcdFx0ICogaW52YWxpZCBzaWduYXR1cmUgaXMgcmVqZWN0ZWQgYW5kIHRoZSBsb2cgc2F5cyB3aHkuXG4gXHRcdCAqL1xuLVx0XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbi1cdFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4tXHRcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGYuZ29wdHMuaW5zbnMpO1xuLVx0XHRhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuLVx0XHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwmIzM0O0R1YWwgQlNEL0dQTFwmIzM0Oyk7XG4tXHRcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbi1cdFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KGp1bmspO1xuLVx0XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2l6ZW9mKGp1bmspO1xuLVx0XHRhdHRyLmtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4tXHRcdGF0dHIubG9nX2xldmVsID0gMTtcbi1cdFx0YXR0ci5sb2dfYnVmID0gcHRyX3RvX3U2NChsb2dfYnVmKTtcbi1cdFx0YXR0ci5sb2dfc2l6ZSA9IHNpemVvZihsb2dfYnVmKTtcbi1cdFx0bWVtY3B5KGF0dHIucHJvZ19uYW1lLCBcJiMzNDtfX2xvYWRlci5wcm9nXCYjMzQ7LCBzaXplb2YoXCYjMzQ7X19sb2FkZXIucHJvZ1wmIzM0OykpO1xuLVxuLVx0XHRmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4tXHRcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuJiM0MztcdFx0ZmQgPSBsb2FkX2xvYWRlcl9sb2coZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4mIzQzO1x0XHRcdFx0ICAgICBzaXplb2YoanVuayksIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCxcbiYjNDM7XHRcdFx0XHQgICAgIGxvZ19idWYsIHNpemVvZihsb2dfYnVmKSk7XG4gXHRcdEFTU0VSVF9MVChmZCwgMCwgXCYjMzQ7aW52YWxpZCBzaWduYXR1cmUgcmVqZWN0ZWQgYXQgbG9hZFwmIzM0Oyk7XG4gXHRcdGlmIChmZCBcdTAwM2U9IDApXG4gXHRcdFx0Y2xvc2UoZmQpO1xuQEAgLTU3MSw4ICYjNDM7NjAyLDkgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX3Rvb19sYXJnZSh2b2lkKVxuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogc2lnbmF0dXJlX3NpemUgYmV5b25kIHRoZSBrZXJuZWwmIzM5O3MgYm91bmQgKEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4tXHRcdCAqIGlzIHJlamVjdGVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzIHJlYWQuXG4mIzQzO1x0XHQgKiBzaWduYXR1cmVfc2l6ZSBiZXlvbmQgdGhlIGtlcm5lbCYjMzk7cyBib3VuZFxuJiM0MztcdFx0ICogKEJQRl9QUk9HX01BWF9TSUdOQVRVUkVfU0laRSkgaXMgcmVqZWN0ZWQgYmVmb3JlIHRoZSBidWZmZXJcbiYjNDM7XHRcdCAqIGlzIHJlYWQuXG4gXHRcdCAqL1xuIFx0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuIFx0XHRcdFx0IDY0IFx1MDAzY1x1MDAzYyAyMCwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwKTtcbkBAIC02MjYsNiAmIzQzOzY1OCwyNjggQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2JhZF9rZXlyaW5nKHZvaWQpXG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyBib29sIGtleXJpbmdfdW5zZWFsZWRfYm9vdCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciB2YWwgPSAwO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKFwmIzM0Oy9zeXMvbW9kdWxlL2JwZi9wYXJhbWV0ZXJzL2tleXJpbmdfdW5zZWFsZWRcJiMzNDssIE9fUkRPTkxZKTtcbiYjNDM7XHRpZiAoZmQgXHUwMDNjIDApXG4mIzQzO1x0XHRyZXR1cm4gZmFsc2U7XG4mIzQzO1x0aWYgKHJlYWQoZmQsIFx1MDAyNnZhbCwgMSkgIT0gMSlcbiYjNDM7XHRcdHZhbCA9IDA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcdHJldHVybiB2YWwgPT0gJiMzOTtZJiMzOTsgfHwgdmFsID09ICYjMzk7MSYjMzk7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGJwZl9rZXlyaW5nX2xvb2t1cChpbnQgKm5yX2tleXMpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGxpbmVbNTEyXSwgdHlwZVszMl0sIGRlc2NbNjRdO1xuJiM0MztcdGludCBzZXJpYWwgPSAtRU5PRU5UO1xuJiM0MztcdEZJTEUgKmY7XG4mIzQzO1xuJiM0MztcdGYgPSBmb3BlbihcJiMzNDsvcHJvYy9rZXlzXCYjMzQ7LCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWYpXG4mIzQzO1x0XHRyZXR1cm4gLWVycm5vO1xuJiM0MztcbiYjNDM7XHR3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkge1xuJiM0MztcdFx0dW5zaWduZWQgaW50IGhleDtcbiYjNDM7XHRcdGNoYXIgKnN1bTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAoc3NjYW5mKGxpbmUsIFwmIzM0OyV4ICUqcyAlKnMgJSpzICUqcyAlKnMgJSpzICUzMXMgJTYzc1wmIzM0OyxcbiYjNDM7XHRcdFx0ICAgXHUwMDI2aGV4LCB0eXBlLCBkZXNjKSAhPSAzKVxuJiM0MztcdFx0XHRjb250aW51ZTtcbiYjNDM7XHRcdGlmIChzdHJjbXAodHlwZSwgXCYjMzQ7a2V5cmluZ1wmIzM0OykgfHwgc3RyY21wKGRlc2MsIFwmIzM0Oy5icGY6XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Y29udGludWU7XG4mIzQzO1xuJiM0MztcdFx0c2VyaWFsID0gKGludCloZXg7XG4mIzQzO1x0XHRpZiAobnJfa2V5cykge1xuJiM0MztcdFx0XHRzdW0gPSBzdHJzdHIobGluZSwgXCYjMzQ7LmJwZjogXCYjMzQ7KTtcbiYjNDM7XHRcdFx0Km5yX2tleXMgPSAhc3VtIHx8ICFzdHJuY21wKHN1bSAmIzQzOyA2LCBcJiMzNDtlbXB0eVwmIzM0OywgNSkgP1xuJiM0MztcdFx0XHRcdCAgIDAgOiBhdG9pKHN1bSAmIzQzOyA2KTtcbiYjNDM7XHRcdH1cbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XHRmY2xvc2UoZik7XG4mIzQzO1x0cmV0dXJuIHNlcmlhbDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGxvbmcga2V5Y3RsX3JldChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMylcbiYjNDM7e1xuJiM0MztcdGxvbmcgcmV0ID0gc3lzY2FsbChfX05SX2tleWN0bCwgY21kLCBhcmcyLCBhcmczKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIHJldCBcdTAwM2MgMCA/IC1lcnJubyA6IHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogV2hhdCB0aGUgYnBmIGtleXJpbmcgc3RpbGwgbmVlZHMgb25jZSBpdCBnb3QgcHJvdmlzaW9uZWQ6IEtFWV9QT1NfU0VBUkNIXG4mIzQzOyAqIGZvciB0aGUgaW4ta2VybmVsIHNlYXJjaCBkdXJpbmcgdmVyaWZpY2F0aW9uLCBhbmQgdGhlIHVzZXIgdmlldy9yZWFkIGJpdHNcbiYjNDM7ICogc28gaXQgc3RheXMgdmlzaWJsZSBpbiAvcHJvYy9rZXlzLCByZXN0IGlzIGRyb3BwZWQgc28gdGhlIGVucm9sbGVkIGlzXG4mIzQzOyAqIHRoZXJlZm9yZSBmaW5hbC5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgQlBGX0tFWVJJTkdfUEVSTV9MT0NLRURcdFx0MHgwODAzMDAwMFxuJiM0MzsvKiBXaGF0IGJwZl9rZXlyaW5nX2luaXQoKSBncmFudHMgYXQgYm9vdC4gKi9cbiYjNDM7I2RlZmluZSBCUEZfS0VZUklOR19QRVJNX0lOSVRJQUxcdDB4MDgyZjAwMDBcbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIGJwZl9rZXlyaW5nX3NlYWxlZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7fTtcbiYjNDM7XHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG4mIzQzO1x0aW50IHNlcmlhbCwga2V5LCBmZDtcbiYjNDM7XG4mIzQzO1x0aWYgKGtleXJpbmdfdW5zZWFsZWRfYm9vdCgpKSB7XG4mIzQzO1x0XHRwcmludGYoXCYjMzQ7JXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgd2FzIHVuc2VhbGVkIGF0IGJvb3RcXG5cJiMzNDssIF9fZnVuY19fKTtcbiYjNDM7XHRcdHRlc3RfX3NraXAoKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1x0c2VyaWFsID0gYnBmX2tleXJpbmdfbG9va3VwKE5VTEwpO1xuJiM0MztcdGlmIChzZXJpYWwgXHUwMDNlPSAwKSB7XG4mIzQzO1x0XHRrZXkgPSBzeXNjYWxsKF9fTlJfYWRkX2tleSwgXCYjMzQ7dXNlclwmIzM0OywgXCYjMzQ7c2VhbHByb2JlXCYjMzQ7LCBcJiMzNDt4XCYjMzQ7LCAxLCBzZXJpYWwpO1xuJiM0MztcdFx0aWYgKGtleSBcdTAwM2U9IDApXG4mIzQzO1x0XHRcdHN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9VTkxJTkssIGtleSwgc2VyaWFsKTtcbiYjNDM7XHRcdEFTU0VSVF9FUShrZXkgXHUwMDNjIDAgPyAtZXJybm8gOiAwLCAtRVBFUk0sXG4mIzQzO1x0XHRcdCAgXCYjMzQ7bm90aGluZyBsaW5rcyBpbnRvIGEgc2VhbGVkIGtleXJpbmdcJiMzNDspO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuJiM0MztcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbiYjNDM7XHRcdFx0XHQgc2l6ZW9mKGp1bmspLCBCUEZfS0VZUklOR19CUEYsIDApO1xuJiM0MztcdFx0QVNTRVJUX0VRKGZkLCAtRU5PS0VZLCBcJiMzNDtzZWFsZWQgYnBmIGtleXJpbmcgcmVqZWN0ZWRcJiMzNDspO1xuJiM0MztcdFx0aWYgKGZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdFx0Y2xvc2UoZmQpO1xuJiM0MztcdH1cbiYjNDM7XHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB0cnlfbG9hZChjb25zdCBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmLCBjb25zdCB2b2lkICpzaWcsXG4mIzQzO1x0XHQgICAgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkLCBjaGFyICpsb2dfYnVmLCBfX3UzMiBsb2dfc3opXG4mIzQzO3tcbiYjNDM7XHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xuJiM0MztcbiYjNDM7XHRtYXBfZmQgPSBzZXR1cF9tZXRhX21hcChmKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsIFwmIzM0O21ldGFfbWFwXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybiBtYXBfZmQ7XG4mIzQzO1x0cHJvZ19mZCA9IGxvYWRfbG9hZGVyX2xvZyhmLVx1MDAzZWdvcHRzLmluc25zLCBmLVx1MDAzZWdvcHRzLmluc25zX3N6LCBtYXBfZmQsXG4mIzQzO1x0XHRcdFx0ICBzaWcsIHNpZ19zeiwga2V5cmluZ19pZCwgMSwgbG9nX2J1ZiwgbG9nX3N6KTtcbiYjNDM7XHRjbG9zZShtYXBfZmQpO1xuJiM0MztcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKHByb2dfZmQpO1xuJiM0MztcdHJldHVybiBwcm9nX2ZkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGlzIG5lZWRzIGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTEgb24gdGhlIGd1ZXN0IGtlcm5lbCBjb21tYW5kIGxpbmUsIHdoaWNoXG4mIzQzOyAqIHZtdGVzdC5zaCBjYW4gcGFzcyB2aWEgS0VSTkVMX0NNRExJTkVfRVhUUkEuIFRoZXJlIGlzIG5vIHdheSB0byB1bnNlYWwgdGhlXG4mIzQzOyAqIGtleXJpbmcgZnJvbSBoZXJlLCBzbyB3aXRob3V0IGl0IHRoZSB0ZXN0IHNraXBzLiBJdCBhbHNvIG9ubHkgd29ya3Mgb25jZVxuJiM0MzsgKiBwZXIgYm9vdCwgYXMgcmVzdHJpY3RpbmcgYSBrZXlyaW5nIGNhbm5vdCBiZSB1bmRvbmUuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgdm9pZCBicGZfa2V5cmluZ19wcm92aXNpb25lZCh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBkaXJfdG1wbFtdID0gXCYjMzQ7L3RtcC9icGZrZXlyaW5nWFhYWFhYXCYjMzQ7O1xuJiM0MztcdGNoYXIgYmFkX3RtcGxbXSA9IFwmIzM0Oy90bXAvYnBma2V5cmluZ2JhZFhYWFhYWFwmIzM0OztcbiYjNDM7XHRfX3U4ICpzaWcgPSBOVUxMLCAqYmFkID0gTlVMTCwgKmJ1ZiA9IE5VTEw7XG4mIzQzO1x0aW50IHNlcmlhbCwgZXJyO1xuJiM0MztcdGludCBucl9rZXlzID0gMCwgZGVyX2ZkID0gLTE7XG4mIzQzO1x0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuJiM0MztcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIGJhZF9zejtcbiYjNDM7XHRib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlO1xuJiM0MztcdGNoYXIgKmRpciwgKmJhZF9kaXIgPSBOVUxMO1xuJiM0MztcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xuJiM0MztcdGNoYXIgcGF0aFtQQVRIX01BWF07XG4mIzQzO1x0X191OCBkZXJbNDA5Nl07XG4mIzQzO1x0c3NpemVfdCBkZXJfc3o7XG4mIzQzO1xuJiM0MztcdHNlcmlhbCA9IGJwZl9rZXlyaW5nX2xvb2t1cChcdTAwMjZucl9rZXlzKTtcbiYjNDM7XHRpZiAoc2VyaWFsIFx1MDAzYyAwKSB7XG4mIzQzO1x0XHRwcmludGYoXCYjMzQ7JXM6U0tJUDpubyBicGYga2V5cmluZyAobmVlZHMgQ09ORklHX0tFWVMpXFxuXCYjMzQ7LCBfX2Z1bmNfXyk7XG4mIzQzO1x0XHR0ZXN0X19za2lwKCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcdGlmIChucl9rZXlzICE9IDApIHtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDslczpTS0lQOnRoZSBicGYga2V5cmluZyBoYXMgYWxyZWFkeSBiZWVuIHByb3Zpc2lvbmVkXFxuXCYjMzQ7LFxuJiM0MztcdFx0ICAgICAgIF9fZnVuY19fKTtcbiYjNDM7XHRcdHRlc3RfX3NraXAoKTtcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtnZW5rZXlcJiMzNDssIGRpciksIFwmIzM0O3ZlcmlmeV9zaWdfc2V0dXAgZ2Vua2V5XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gcm1kaXI7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgXCYjMzQ7JXMvc2lnbmluZ19rZXkuZGVyXCYjMzQ7LCBkaXIpO1xuJiM0MztcdGRlcl9mZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpO1xuJiM0MztcdGlmICghQVNTRVJUX09LX0ZEKGRlcl9mZCwgXCYjMzQ7b3BlbiBzaWduaW5nX2tleS5kZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBybWRpcjtcbiYjNDM7XHRkZXJfc3ogPSByZWFkKGRlcl9mZCwgZGVyLCBzaXplb2YoZGVyKSk7XG4mIzQzO1x0Y2xvc2UoZGVyX2ZkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChkZXJfc3osIDAsIFwmIzM0O3JlYWQgc2lnbmluZ19rZXkuZGVyXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gcm1kaXI7XG4mIzQzO1xuJiM0MztcdGVyciA9IHN5c2NhbGwoX19OUl9hZGRfa2V5LCBcJiMzNDthc3ltbWV0cmljXCYjMzQ7LCBcJiMzNDtcJiMzNDssIGRlciwgKHNpemVfdClkZXJfc3osXG4mIzQzO1x0XHQgICAgICBzZXJpYWwpO1xuJiM0MztcdGlmIChlcnIgXHUwMDNjIDAgXHUwMDI2XHUwMDI2IGVycm5vID09IEVQRVJNKSB7XG4mIzQzO1x0XHRwcmludGYoXCYjMzQ7JXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgaXMgc2VhbGVkLCBuZWVkIGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFcXG5cJiMzNDssXG4mIzQzO1x0XHQgICAgICAgX19mdW5jX18pO1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1xuJiM0MztcdFx0Z290byBybWRpcjtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZXJyLCAwLCBcJiMzNDthZGQgdGhlIHNpZ25pbmcga2V5IHRvIHRoZSBicGYga2V5cmluZ1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIHJtZGlyO1xuJiM0MztcbiYjNDM7XHRzaWcgPSBtYWxsb2Moc2lnX3N6KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2lnLCBcJiMzNDtzaWcgYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGhhdmVfZml4dHVyZSA9IHRydWU7XG4mIzQzO1x0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpICE9IDApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihidWYsIFwmIzM0O3NpZ25idWZcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0bWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7XG4mIzQzO1x0bWVtY3B5KGJ1ZiAmIzQzOyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6LCBzaWcsXG4mIzQzO1x0XHRcdFx0XHUwMDI2c2lnX3N6KSwgXCYjMzQ7c2lnbiBpbnNuc3x8bWV0YWRhdGFcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKSwgLUVOT0tFWSxcbiYjNDM7XHRcdCAgXCYjMzQ7dW5yZXN0cmljdGVkIGtleXJpbmcgc3RpbGwgbm90IGNvbnN1bHRlZFwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBOVUxMLCAwKSxcbiYjNDM7XHRcdCAgLUVQRVJNLCBcJiMzNDtjYWxsZXItc3VwcGxpZWQga2V5cmluZyByZWZ1c2VkIGJlZm9yZSBwcm92aXNpb25pbmdcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfUkVTVFJJQ1RfS0VZUklORywgc2VyaWFsLFxuJiM0MztcdFx0XHQgICAgICAgTlVMTCwgTlVMTCksIFwmIzM0O3Jlc3RyaWN0IGJwZiBrZXlyaW5nXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19GRCh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKSxcbiYjNDM7XHRcdFx0ICBcJiMzNDtsb2FkIHNpZ25lZCBieSBhIGtleSBpbiB0aGUgLmJwZiBrZXlyaW5nXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRiYWRfZGlyID0gbWtkdGVtcChiYWRfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJhZF9kaXIsIFwmIzM0O21rZHRlbXAgdW5lbnJvbGxlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7Z2Vua2V5XCYjMzQ7LCBiYWRfZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCBnZW5rZXkgdW5lbnJvbGxlZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRiYWRfc3ogPSA4MTkyO1xuJiM0MztcdGJhZCA9IG1hbGxvYyhiYWRfc3opO1xuJiM0MztcdGlmICghQVNTRVJUX09LX1BUUihiYWQsIFwmIzM0O2JhZCBzaWcgYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGJhZF9kaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3osIGJhZCxcbiYjNDM7XHRcdFx0XHRcdTAwMjZiYWRfc3opLCBcJiMzNDtzaWduIHdpdGggYW4gdW5lbnJvbGxlZCBrZXlcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9FUSh0cnlfbG9hZChcdTAwMjZmLCBiYWQsIGJhZF9zeiwgQlBGX0tFWVJJTkdfQlBGLCBsb2dfYnVmLFxuJiM0MztcdFx0XHQgICBzaXplb2YobG9nX2J1ZikpLCAtRU5PS0VZLFxuJiM0MztcdFx0ICBcJiMzNDtrZXkgb3V0c2lkZSB0aGUgYnBmIGtleXJpbmcgcmVmdXNlZFwmIzM0Oyk7XG4mIzQzO1x0QVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgXCYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWRcJiMzNDssXG4mIzQzO1x0XHRcdCAgXCYjMzQ7dGhlIGJwZiBrZXlyaW5nIHdhcyBjb25zdWx0ZWRcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRmLmJsb2JbMF0gXj0gMHhmZjtcbiYjNDM7XHRlcnIgPSB0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKTtcbiYjNDM7XHRmLmJsb2JbMF0gXj0gMHhmZjtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUtFWVJFSkVDVEVELCBcJiMzNDt0YW1wZXJlZCBtZXRhZGF0YSByZWZ1c2VkXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKHRyeV9sb2FkKFx1MDAyNmYsIHNpZywgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIE5VTEwsIDApLFxuJiM0MztcdFx0ICAtRVBFUk0sIFwmIzM0O2NhbGxlci1zdXBwbGllZCBrZXlyaW5nIHJlZnVzZWQgb25jZSAuYnBmIGlzIGluIHVzZVwmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1VOTElOSywgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBzZXJpYWwpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FTk9FTlQsIFwmIzM0O2tleXJpbmcgd3JpdGFibGUgd2hpbGUgdGhlIHVzZXIgYml0cyBhcmUgdGhlcmVcJiMzNDspO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRQRVJNLCBzZXJpYWwsIEJQRl9LRVlSSU5HX1BFUk1fTE9DS0VEKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O2Ryb3AgdGhlIHVzZXIgYml0cyBvbiB0aGUgYnBmIGtleXJpbmdcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdEFTU0VSVF9PS19GRCh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKSxcbiYjNDM7XHRcdCAgICAgXCYjMzQ7bG9hZCBzdGlsbCB2ZXJpZmllZCBhZ2FpbnN0IHRoZSBsb2NrZWQga2V5cmluZ1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1VOTElOSywgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBzZXJpYWwpO1xuJiM0MztcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFwmIzM0O3VubGluayByZWZ1c2VkXCYjMzQ7KTtcbiYjNDM7XHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9DTEVBUiwgc2VyaWFsLCAwKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcJiMzNDtjbGVhciByZWZ1c2VkXCYjMzQ7KTtcbiYjNDM7XHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9SRVZPS0UsIHNlcmlhbCwgMCk7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCYjMzQ7cmV2b2tlIHJlZnVzZWRcJiMzNDspO1xuJiM0MztcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX0lOVkFMSURBVEUsIHNlcmlhbCwgMCk7XG4mIzQzO1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCYjMzQ7aW52YWxpZGF0ZSByZWZ1c2VkXCYjMzQ7KTtcbiYjNDM7XHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRfVElNRU9VVCwgc2VyaWFsLCAxKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcJiMzNDt0aW1lb3V0IHJlZnVzZWRcJiMzNDspO1xuJiM0MztcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1NFVFBFUk0sIHNlcmlhbCwgQlBGX0tFWVJJTkdfUEVSTV9JTklUSUFMKTtcbiYjNDM7XHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcJiMzNDt0aGUgYml0cyBjYW5ub3QgYmUgZ3JhbnRlZCBiYWNrXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0QVNTRVJUX0VRKGJwZl9rZXlyaW5nX2xvb2t1cChcdTAwMjZucl9rZXlzKSwgc2VyaWFsLCBcJiMzNDtrZXlyaW5nIHN0aWxsIHRoZXJlXCYjMzQ7KTtcbiYjNDM7XHRBU1NFUlRfRVEobnJfa2V5cywgMSwgXCYjMzQ7dGhlIGVucm9sbGVkIGtleSBzdXJ2aXZlZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAoaGF2ZV9maXh0dXJlKVxuJiM0MztcdFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4mIzQzO1x0Z2Vua2V5X2Rpcl9maW5pKGJhZF9kaXIpO1xuJiM0MztcdGZyZWUoYnVmKTtcbiYjNDM7XHRmcmVlKGJhZCk7XG4mIzQzO1x0ZnJlZShzaWcpO1xuJiM0MztybWRpcjpcbiYjNDM7XHRnZW5rZXlfZGlyX2ZpbmkoZGlyKTtcbiYjNDM7fVxuJiM0MztcbiAvKlxuICAqIEEgc2lnbmVkIGxvYWRlciBtdXN0IGlnbm9yZSBjdHgtc3VwcGxpZWQgbWFwIGRpbWVuc2lvbnM6IHRoZSBob3N0IGNhbm5vdFxuICAqIHJlc2l6ZSBhIHNpZ25lZCBwcm9ncmFtJiMzOTtzIG1hcHMgdmlhIHRoZSBsb2FkZXIgY3R4LiBEcml2ZSBhIG9uZS1tYXAgcHJvZ3JhbVxuQEAgLTgzMSw3ICYjNDM7MTEyNSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuIFx0XHRyZXR1cm47XG4tXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXBcJiMzNDssIGRpciksIFwmIzM0O3ZlcmlmeV9zaWdfc2V0dXBcJiMzNDspKSB7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwLXJzYVwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiBcdFx0cm1kaXIoZGlyKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuQEAgLTkzMSw3ICYjNDM7MTIyNSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX21ldGFkYXRhKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwmIzM0O21rZHRlbXBcJiMzNDspKVxuIFx0XHRyZXR1cm47XG4tXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXBcJiMzNDssIGRpciksIFwmIzM0O3ZlcmlmeV9zaWdfc2V0dXBcJiMzNDspKSB7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwLXJzYVwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiBcdFx0cm1kaXIoZGlyKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuQEAgLTEyNjcsNyAmIzQzOzE1NjEsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4gXHRcdGdvdG8gb3V0O1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cC1yc2FcJiMzNDssIGRpciksIFwmIzM0O3ZlcmlmeV9zaWdfc2V0dXBcJiMzNDspKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdGRpciA9IE5VTEw7XG4gXHRcdGdvdG8gb3V0O1xuQEAgLTE0NTAsNyAmIzQzOzE3NDQsNyBAQCBzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcJiMzNDtta2R0ZW1wXCYjMzQ7KSlcbiBcdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwmIzM0O3NldHVwXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cC1yc2FcJiMzNDssIGRpciksIFwmIzM0O3ZlcmlmeV9zaWdfc2V0dXBcJiMzNDspKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xNTI0LDYgJiM0MzsxODE4LDg5IEBAIHN0YXRpYyB2b2lkIGxvYWR0aW1lX3dpdGhfbWFwKHZvaWQpXG4gXHR0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19kZXN0cm95KHNrZWwpO1xuIH1cbiBcbiYjNDM7LypcbiYjNDM7ICogRW5kLXRvLWVuZCBzaWduZWQgbG9hZCB3aXRoIGEgcG9zdC1xdWFudHVtIGtleS4gTUwtRFNBIChGSVBTLTIwNCkgaXMgd2lyZWRcbiYjNDM7ICogdGhyb3VnaCB0aGUgWC41MDkgYW5kIFBLQ1MjNyBwYXJzZXJzLCBhbmQgQlBGIHJlYWNoZXMgdGhlbSB2aWFcbiYjNDM7ICogdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZSgpIHdpdGhvdXQga25vd2luZyB0aGUgYWxnb3JpdGhtLCBzbyBhbiBNTC1EU0Ega2V5IGluXG4mIzQzOyAqIHRoZSBrZXlyaW5nIHNob3VsZCB2ZXJpZnkgYW4gTUwtRFNBIHNpZ25lZCBwcm9ncmFtIHdpdGggbm8gQlBGLXNpZGUgd29yay5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIG1sZHNhX3NpZ25lZF9sb2FkKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRjaGFyIGRpcl90bXBsW10gPSBcJiMzNDsvdG1wL2JwZm1sZHNhWFhYWFhYXCYjMzQ7O1xuJiM0MztcdGludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xLCBlcnI7XG4mIzQzO1x0X191OCAqc2lnID0gTlVMTCwgKmJ1ZiA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuJiM0MztcdGJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7XG4mIzQzO1x0X191MzIgc2lnX3N6ID0gMTYzODQ7XG4mIzQzO1x0Y2hhciAqZGlyO1xuJiM0MztcbiYjNDM7XHRzeXNjYWxsKF9fTlJfcmVxdWVzdF9rZXksIFwmIzM0O2tleXJpbmdcJiMzNDssIFwmIzM0O191aWQuMFwmIzM0OywgTlVMTCxcbiYjNDM7XHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4mIzQzO1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1xuJiM0MztcdGVyciA9IHJ1bl9zZXR1cChcJiMzNDtzZXR1cC1tbGRzYVwmIzM0OywgZGlyKTtcbiYjNDM7XHRpZiAoZXJyID09IFNFVFVQX1NLSVApIHtcbiYjNDM7XHRcdHByaW50ZihcJiMzNDslczpTS0lQOm9wZW5zc2wgaGFzIG5vIE1MLURTQSBzdXBwb3J0IChuZWVkcyAzLjUmIzQzOylcXG5cJiMzNDssXG4mIzQzO1x0XHQgICAgICAgX19mdW5jX18pO1xuJiM0MztcdFx0dGVzdF9fc2tpcCgpO1xuJiM0MztcdFx0Z2Vua2V5X2Rpcl9maW5pKGRpcik7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCBzZXR1cC1tbGRzYVwmIzM0OykpIHtcbiYjNDM7XHRcdGdlbmtleV9kaXJfZmluaShkaXIpO1xuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0c2lnID0gbWFsbG9jKHNpZ19zeik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNpZywgXCYjMzQ7c2lnIGJ1ZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRoYXZlX2ZpeHR1cmUgPSB0cnVlO1xuJiM0MztcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSAhPSAwKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcJiMzNDtzaWduYnVmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xuJiM0MztcdG1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UgaXRzZWxmLCBidXQgb3BlbnNzbCBiZWZvcmUgNC4wIGNhbm5vdFxuJiM0MztcdCAqIHByb2R1Y2UgYSBDTVMgbWVzc2FnZSB3aXRob3V0IHNpZ25lZEF0dHJzIGZvciBpdCwgYW5kIHdpdGggdGhvc2UgaW5cbiYjNDM7XHQgKiBwbGF5IG9ubHkgU0hBLTUxMiBpcyBwZXJtaXR0ZWQgZm9yIHRoZSBtZXNzYWdlRGlnZXN0IGF0dHJpYnV0ZS5cbiYjNDM7XHQgKi9cbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1Zl9kaWdlc3QoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogJiM0MzsgZi5kYXRhX3N6LFxuJiM0MztcdFx0XHRcdCAgICAgICBzaWcsIFx1MDAyNnNpZ19zeiwgXCYjMzQ7c2hhNTEyXCYjMzQ7KSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtzaWduIGluc25zfHxtZXRhZGF0YSB3aXRoIE1MLURTQVwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBHdWFyZCBhZ2FpbnN0IHRoZSBzZXR1cCBzaWxlbnRseSBoYW5kaW5nIGJhY2sgc29tZSBvdGhlciBrZXkgdHlwZTpcbiYjNDM7XHQgKiBhbiBSU0Egb3IgRUNEU0Egc2lnbmF0dXJlIGlzIGEgZmV3IGh1bmRyZWQgYnl0ZXMsIHdoZXJlIGFuIE1MLURTQS04N1xuJiM0MztcdCAqIG9uZSBjYW5ub3QgYmUgc21hbGxlciB0aGFuIHRoZSByYXcgc2lnbmF0dXJlIGl0IGNhcnJpZXMuXG4mIzQzO1x0ICovXG4mIzQzO1x0QVNTRVJUX0dUKHNpZ19zeiwgTUxEU0E4N19TSUdOQVRVUkVfU0laRSwgXCYjMzQ7TUwtRFNBLTg3IHNpZ25hdHVyZSBzaXplXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0bWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoXHUwMDI2Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcJiMzNDttZXRhX21hcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsXG4mIzQzO1x0XHRcdCAgICAgIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAxKTtcbiYjNDM7XHRBU1NFUlRfT0tfRkQocHJvZ19mZCwgXCYjMzQ7TUwtRFNBIHNpZ25lZCBsb2FkZXIgbG9hZFwmIzM0Oyk7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4mIzQzO1x0XHRjbG9zZShwcm9nX2ZkKTtcbiYjNDM7XHRpZiAobWFwX2ZkIFx1MDAzZT0gMClcbiYjNDM7XHRcdGNsb3NlKG1hcF9mZCk7XG4mIzQzO1x0aWYgKGhhdmVfZml4dHVyZSlcbiYjNDM7XHRcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuJiM0MztcdGZyZWUoYnVmKTtcbiYjNDM7XHRmcmVlKHNpZyk7XG4mIzQzO1x0cnVuX3NldHVwKFwmIzM0O2NsZWFudXBcJiMzNDssIGRpcik7XG4mIzQzO31cbiYjNDM7XG4gLypcbiAgKiBBIHNpZ25lZCBwcm9ncmFtIG5lZWQgbm90IGJpbmQgYW55IG1hcC4gQSBwbGFpbiBCUEZfUFJPR19UWVBFX1NZU0NBTExcbiAgKiBwcm9ncmFtIHdpdGggbm8gZmRfYXJyYXkgaXMgc2lnbmVkIG92ZXIgaXRzIGluc3RydWN0aW9ucyBhbG9uZTogdGhlIGtlcm5lbFxuQEAgLTE1NDgsNyAmIzQzOzE5MjUsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbm9fZmRfYXJyYXkodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4gXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXAtcnNhXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG5AQCAtMTYxOSw3ICYjNDM7MTk5Niw3IEBAIHN0YXRpYyB2b2lkIHNpZ25lZF9tYXBfYnlfZmRfcmVqZWN0ZWQodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4gXHRcdGdvdG8gb3V0X21hcDtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXAtcnNhXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRnb3RvIG91dF9tYXA7XG4gXHR9XG5AQCAtMTY4MSw3ICYjNDM7MjA1OCw3IEBAIHN0YXRpYyB2b2lkIHNpZ25lZF9zcGFyc2VfZmRfYXJyYXlfcmVqZWN0ZWQodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4gXHRcdGdvdG8gb3V0X21hcDtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXAtcnNhXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRnb3RvIG91dF9tYXA7XG4gXHR9XG5AQCAtMTczNSw3ICYjNDM7MjExMiw3IEBAIHN0YXRpYyB2b2lkIHNpZ25lZF9tb2R1bGVfa2Z1bmNfcmVqZWN0ZWQodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCYjMzQ7bWtkdGVtcFwmIzM0OykpXG4gXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcJiMzNDtzZXR1cFwmIzM0OywgZGlyKSwgXCYjMzQ7dmVyaWZ5X3NpZ19zZXR1cFwmIzM0OykpIHtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCYjMzQ7c2V0dXAtcnNhXCYjMzQ7LCBkaXIpLCBcJiMzNDt2ZXJpZnlfc2lnX3NldHVwXCYjMzQ7KSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG5AQCAtMTc3OSw2ICYjNDM7MjE1NiwxMSBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKHZvaWQpXG4gXG4gdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZClcbiB7XG4mIzQzO1x0aWYgKGtleXJpbmdfdW5zZWFsZWRfYm9vdCgpKSB7XG4mIzQzO1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDticGZfa2V5cmluZ19wcm92aXNpb25lZFwmIzM0OykpXG4mIzQzO1x0XHRcdGJwZl9rZXlyaW5nX3Byb3Zpc2lvbmVkKCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bG9hZHRpbWVfbm9fbWFwXCYjMzQ7KSlcbiBcdFx0bG9hZHRpbWVfbm9fbWFwKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtsb2FkdGltZV93aXRoX21hcFwmIzM0OykpXG5AQCAtMTgwNSw2ICYjNDM7MjE4NywxMCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIFx0XHRzaWduYXR1cmVfemVyb19zaXplKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDtzaWduYXR1cmVfYmFkX2tleXJpbmdcJiMzNDspKVxuIFx0XHRzaWduYXR1cmVfYmFkX2tleXJpbmcoKTtcbiYjNDM7XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcJiMzNDticGZfa2V5cmluZ19zZWFsZWRcJiMzNDspKVxuJiM0MztcdFx0YnBmX2tleXJpbmdfc2VhbGVkKCk7XG4mIzQzO1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCYjMzQ7bWxkc2Ffc2lnbmVkX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0bWxkc2Ffc2lnbmVkX2xvYWQoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX2N0eF9tYXhfZW50cmllc19pZ25vcmVkXCYjMzQ7KSlcbiBcdFx0bWV0YWRhdGFfY3R4X21heF9lbnRyaWVzX2lnbm9yZWQoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwmIzM0O21ldGFkYXRhX2N0eF9pbml0aWFsX3ZhbHVlX2lnbm9yZWRcJiMzNDspKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuY1xuaW5kZXggZjMyN2ZlYjhlMzhjMy4uMTJiMTQ2ZDIwNWQ3NSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuY1xuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jXG5AQCAtMjU3LDcgJiM0MzsyNTcsNyBAQCBzdGF0aWMgdm9pZCB0ZXN0X3ZlcmlmeV9wa2NzN19zaWdfZnJvbV9tYXAodm9pZClcbiBcdGlmICghQVNTRVJUX09LX1BUUih0bXBfZGlyLCBcJiMzNDtta2R0ZW1wXCYjMzQ7KSlcbiBcdFx0cmV0dXJuO1xuIFxuLVx0cmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsIFwmIzM0O3NldHVwXCYjMzQ7KTtcbiYjNDM7XHRyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgXCYjMzQ7c2V0dXAtcnNhXCYjMzQ7KTtcbiBcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7X3J1bl9zZXR1cF9wcm9jZXNzXCYjMzQ7KSlcbiBcdFx0Z290byBjbG9zZV9wcm9nO1xuIFxuQEAgLTQ1OCw3ICYjNDM7NDU4LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9wa2NzN19zaWdfZnN2ZXJpdHkodm9pZClcbiBcdHNucHJpbnRmKGRhdGFfcGF0aCwgUEFUSF9NQVgsIFwmIzM0OyVzL2RhdGEtZmlsZVwmIzM0OywgdG1wX2Rpcik7XG4gXHRzbnByaW50ZihzaWdfcGF0aCwgUEFUSF9NQVgsIFwmIzM0OyVzL3NpZy1maWxlXCYjMzQ7LCB0bXBfZGlyKTtcbiBcbi1cdHJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCBcJiMzNDtzZXR1cFwmIzM0Oyk7XG4mIzQzO1x0cmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsIFwmIzM0O3NldHVwLXJzYVwmIzM0Oyk7XG4gXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O19ydW5fc2V0dXBfcHJvY2Vzc1wmIzM0OykpXG4gXHRcdGdvdG8gb3V0O1xuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92ZXJpZnlfc2lnX3NldHVwLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZlcmlmeV9zaWdfc2V0dXAuc2hcbmluZGV4IDA5MTc5ZmI1NTFmMDkuLjI3MzdjMWEyYmNmZDYgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZlcmlmeV9zaWdfc2V0dXAuc2hcbkBAIC0yOCw3ICYjNDM7MjgsNyBAQCBhdXRob3JpdHlLZXlJZGVudGlmaWVyPWtleWlkXG4gXG4gdXNhZ2UoKVxuIHtcbi1cdGVjaG8gXCYjMzQ7VXNhZ2U6ICQwIFx1MDAzY3NldHVwfGNsZWFudXAgXHUwMDNjZXhpc3RpbmdfdG1wX2Rpclx1MDAzZVwmIzM0O1xuJiM0MztcdGVjaG8gXCYjMzQ7VXNhZ2U6ICQwIFx1MDAzY3NldHVwLXJzYXxzZXR1cC1tbGRzYXxjbGVhbnVwIFx1MDAzY2V4aXN0aW5nX3RtcF9kaXJcdTAwM2VcJiMzNDtcbiBcdGV4aXQgMVxuIH1cbiBcbkBAIC00Nyw3ICYjNDM7NDcsNyBAQCBnZW5rZXkoKVxuIFx0XHQke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAtb3V0Zm9ybSBkZXJcbiB9XG4gXG4tc2V0dXAoKVxuJiM0MztzZXR1cF9yc2EoKVxuIHtcbiBcdGxvY2FsIHRtcF9kaXI9XCYjMzQ7JDFcJiMzNDtcbiBcbkBAIC01Nyw2ICYjNDM7NTcsNTcgQEAgc2V0dXAoKVxuIFx0a2V5Y3RsIGxpbmsgJGtleV9pZCAka2V5cmluZ19pZFxuIH1cbiBcbiYjNDM7bWxkc2Ffc3VwcG9ydGVkKClcbiYjNDM7e1xuJiM0MztcdGxvY2FsIHRtcF9kaXI9XCYjMzQ7JDFcJiMzNDtcbiYjNDM7XG4mIzQzO1x0Z2Vua2V5X21sZHNhIFwmIzM0OyR7dG1wX2Rpcn1cJiMzNDsgfHwgcmV0dXJuIDFcbiYjNDM7XHQ6IFx1MDAzZSAke3RtcF9kaXJ9L3Byb2JlXG4mIzQzO1x0IyBTYW1lIGRpZ2VzdCBhcyB0aGUgY2FsbGVyIHNpZ25zIHdpdGgsIHNlZSBzaWduX2J1Zl9kaWdlc3QoKS5cbiYjNDM7XHQuL3NpZ24tZmlsZSAtZCBzaGE1MTIgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gXFxcbiYjNDM7XHRcdCR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtICR7dG1wX2Rpcn0vcHJvYmUgfHwgcmV0dXJuIDFcbiYjNDM7XHRybSAtZiAke3RtcF9kaXJ9L3Byb2JlICR7dG1wX2Rpcn0vcHJvYmUucDdzXG4mIzQzO31cbiYjNDM7XG4mIzQzO2dlbmtleV9tbGRzYSgpXG4mIzQzO3tcbiYjNDM7XHRsb2NhbCB0bXBfZGlyPVwmIzM0OyQxXCYjMzQ7XG4mIzQzO1xuJiM0MztcdGVjaG8gXCYjMzQ7JHt4NTA5X2dlbmtleV9jb250ZW50fVwmIzM0OyBcdTAwM2UgJHt0bXBfZGlyfS94NTA5LmdlbmtleVxuJiM0MztcbiYjNDM7XHQjIE5vIC1cdTAwM2NkaWdlc3RcdTAwM2UgaGVyZTogTUwtRFNBIGhhc2hlcyB0aGUgbWVzc2FnZSBpdHNlbGYsIGFuZCBvcGVuc3NsXG4mIzQzO1x0IyByZWplY3RzIGFuIGV4cGxpY2l0IGRpZ2VzdCBmb3IgaXQuXG4mIzQzO1x0b3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLWRheXMgMzY1MDAgXFxcbiYjNDM7XHRcdFx0LWJhdGNoIC14NTA5IC1uZXdrZXkgTUwtRFNBLTg3IFxcXG4mIzQzO1x0XHRcdC1jb25maWcgJHt0bXBfZGlyfS94NTA5LmdlbmtleSBcXFxuJiM0MztcdFx0XHQtb3V0Zm9ybSBQRU0gLW91dCAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcXFxuJiM0MztcdFx0XHQta2V5b3V0ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIDJcdTAwM2VcdTAwMjYxXG4mIzQzO1xuJiM0MztcdG9wZW5zc2wgeDUwOSAtaW4gJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gLW91dCBcXFxuJiM0MztcdFx0JHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgLW91dGZvcm0gZGVyXG4mIzQzO31cbiYjNDM7XG4mIzQzO21sZHNhX3NraXAoKVxuJiM0Mzt7XG4mIzQzO1x0bG9jYWwgdG1wX2Rpcj1cJiMzNDskMVwmIzM0O1xuJiM0MztcbiYjNDM7XHRybSAtZiAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIFxcXG4mIzQzO1x0XHQke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAke3RtcF9kaXJ9L3Byb2JlIFxcXG4mIzQzO1x0XHQke3RtcF9kaXJ9L3Byb2JlLnA3c1xuJiM0MztcdGV4aXQgNzdcbiYjNDM7fVxuJiM0MztcbiYjNDM7c2V0dXBfbWxkc2EoKVxuJiM0Mzt7XG4mIzQzO1x0bG9jYWwgdG1wX2Rpcj1cJiMzNDskMVwmIzM0O1xuJiM0MztcbiYjNDM7XHRtbGRzYV9zdXBwb3J0ZWQgXCYjMzQ7JHt0bXBfZGlyfVwmIzM0OyB8fCBtbGRzYV9za2lwIFwmIzM0OyR7dG1wX2Rpcn1cJiMzNDtcbiYjNDM7XHRrZXlfaWQ9JChjYXQgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgfFxuJiM0MztcdFx0IGtleWN0bCBwYWRkIGFzeW1tZXRyaWMgZWJwZl90ZXN0aW5nX2tleSBAcylcbiYjNDM7XHRrZXlyaW5nX2lkPSQoa2V5Y3RsIG5ld3JpbmcgZWJwZl90ZXN0aW5nX2tleXJpbmcgQHMpXG4mIzQzO1x0a2V5Y3RsIGxpbmsgJGtleV9pZCAka2V5cmluZ19pZFxuJiM0Mzt9XG4mIzQzO1xuIGNsZWFudXAoKSB7XG4gXHRsb2NhbCB0bXBfZGlyPVwmIzM0OyQxXCYjMzQ7XG4gXG5AQCAtOTEsNyAmIzQzOzE0Miw3IEBAIGNhdGNoKClcbiBcdGxvY2FsIGV4aXRfY29kZT1cJiMzNDskMVwmIzM0O1xuIFx0bG9jYWwgbG9nX2ZpbGU9XCYjMzQ7JDJcJiMzNDtcbiBcbi1cdGlmIFtbIFwmIzM0OyR7ZXhpdF9jb2RlfVwmIzM0OyAtbmUgMCBdXTsgdGhlblxuJiM0MztcdGlmIFtbIFwmIzM0OyR7ZXhpdF9jb2RlfVwmIzM0OyAtbmUgMCBcdTAwMjZcdTAwMjYgXCYjMzQ7JHtleGl0X2NvZGV9XCYjMzQ7IC1uZSA3NyBdXTsgdGhlblxuIFx0XHRjYXQgXCYjMzQ7JHtsb2dfZmlsZX1cJiMzNDsgXHUwMDNlXHUwMDI2M1xuIFx0ZmlcbiBcbkBAIC0xMDgsOCAmIzQzOzE1OSwxMCBAQCBtYWluKClcbiBcbiBcdFtbICEgLWQgXCYjMzQ7JHt0bXBfZGlyfVwmIzM0OyBdXSBcdTAwMjZcdTAwMjYgZWNobyBcJiMzNDtEaXJlY3RvcnkgJHt0bXBfZGlyfSBkb2VzbiYjMzk7dCBleGlzdFwmIzM0OyBcdTAwMjZcdTAwMjYgZXhpdCAxXG4gXG4tXHRpZiBbWyBcJiMzNDske2FjdGlvbn1cJiMzNDsgPT0gXCYjMzQ7c2V0dXBcJiMzNDsgXV07IHRoZW5cbi1cdFx0c2V0dXAgXCYjMzQ7JHt0bXBfZGlyfVwmIzM0O1xuJiM0MztcdGlmIFtbIFwmIzM0OyR7YWN0aW9ufVwmIzM0OyA9PSBcJiMzNDtzZXR1cC1yc2FcJiMzNDsgXV07IHRoZW5cbiYjNDM7XHRcdHNldHVwX3JzYSBcJiMzNDske3RtcF9kaXJ9XCYjMzQ7XG4mIzQzO1x0ZWxpZiBbWyBcJiMzNDske2FjdGlvbn1cJiMzNDsgPT0gXCYjMzQ7c2V0dXAtbWxkc2FcJiMzNDsgXV07IHRoZW5cbiYjNDM7XHRcdHNldHVwX21sZHNhIFwmIzM0OyR7dG1wX2Rpcn1cJiMzNDtcbiBcdGVsaWYgW1sgXCYjMzQ7JHthY3Rpb259XCYjMzQ7ID09IFwmIzM0O2dlbmtleVwmIzM0OyBdXTsgdGhlblxuIFx0XHRnZW5rZXkgXCYjMzQ7JHt0bXBfZGlyfVwmIzM0O1xuIFx0ZWxpZiBbWyBcJiMzNDske2FjdGlvbn1cJiMzNDsgPT0gXCYjMzQ7Y2xlYW51cFwmIzM0OyBdXTsgdGhlblxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdm10ZXN0LnNoXG5pbmRleCA2YTNkMDI2ZDc2YmQ2Li5lN2UwYjQxOWEwYjg3IDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaFxuQEAgLTEwNyw2ICYjNDM7MTA3LDE0IEBAIE9wdGlvbnM6XG4gXHQtcylcdFx0SW5zdGVhZCBvZiBwb3dlcmluZyBvZmYgdGhlIFZNLCBzdGFydCBhbiBpbnRlcmFjdGl2ZVxuIFx0XHRcdHNoZWxsLiBJZiBcdTAwM2Njb21tYW5kXHUwMDNlIGlzIHNwZWNpZmllZCwgdGhlIHNoZWxsIHJ1bnMgYWZ0ZXJcbiBcdFx0XHR0aGUgY29tbWFuZCBmaW5pc2hlcyBleGVjdXRpbmdcbiYjNDM7XG4mIzQzO0Vudmlyb25tZW50IHZhcmlhYmxlczpcbiYjNDM7XG4mIzQzO1x0S0VSTkVMX0NNRExJTkVfRVhUUkFcbiYjNDM7XHRcdFx0RXh0cmEgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aGUgZ3Vlc3Qga2VybmVsIGNvbW1hbmRcbiYjNDM7XHRcdFx0bGluZSwgZm9yIHRlc3RzIHRoYXQgbmVlZCBhIGJvb3QtdGltZSBzZXR0aW5nLiBlLmc6XG4mIzQzO1xuJiM0MztcdCAgS0VSTkVMX0NNRExJTkVfRVhUUkE9XCYjMzQ7YnBmLmtleXJpbmdfdW5zZWFsZWQ9MVwmIzM0OyAkMCAtLSAuL3Rlc3RfcHJvZ3MgLXQgc2lnbmVkX2xvYWRlclxuIEVPRlxuIH1cbiBcbkBAIC0yODYsNiAmIzQzOzI5NCwxMiBAQCBFT0ZcbiBcdFx0UUVNVV9GTEFHUz0oXCYjMzQ7JHtIT1NUX0ZMQUdTW0BdfVwmIzM0OylcbiBcdGZpXG4gXG4mIzQzO1x0bG9jYWwga2VybmVsX2NtZGxpbmU9XCYjMzQ7cm9vdD0vZGV2L3ZkYSBydyBjb25zb2xlPSR7UUVNVV9DT05TT0xFfVwmIzM0O1xuJiM0MztcbiYjNDM7XHRpZiBbWyAtbiBcJiMzNDske0tFUk5FTF9DTURMSU5FX0VYVFJBOi19XCYjMzQ7IF1dOyB0aGVuXG4mIzQzO1x0XHRrZXJuZWxfY21kbGluZSYjNDM7PVwmIzM0OyAke0tFUk5FTF9DTURMSU5FX0VYVFJBfVwmIzM0O1xuJiM0MztcdGZpXG4mIzQzO1xuIFx0JHtRRU1VX0JJTkFSWX0gXFxcbiBcdFx0LW5vZGVmYXVsdHMgXFxcbiBcdFx0LWRpc3BsYXkgbm9uZSBcXFxuQEAgLTI5NCw3ICYjNDM7MzA4LDcgQEAgRU9GXG4gXHRcdC1tIDRHIFxcXG4gXHRcdC1kcml2ZSBmaWxlPVwmIzM0OyR7cm9vdGZzX2ltZ31cJiMzNDssZm9ybWF0PXJhdyxpbmRleD0xLG1lZGlhPWRpc2ssaWY9dmlydGlvLGNhY2hlPW5vbmUgXFxcbiBcdFx0LWtlcm5lbCBcJiMzNDske2tlcm5lbF9iemltYWdlfVwmIzM0OyBcXFxuLVx0XHQtYXBwZW5kIFwmIzM0O3Jvb3Q9L2Rldi92ZGEgcncgY29uc29sZT0ke1FFTVVfQ09OU09MRX1cJiMzNDtcbiYjNDM7XHRcdC1hcHBlbmQgXCYjMzQ7JHtrZXJuZWxfY21kbGluZX1cJiMzNDtcbiB9XG4gXG4gY29weV9sb2dzKClcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNDo1NTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S0VZUyYjMzQ7LAogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9sb29rdXBfa2V5cmluZyYjMzQ7LAogICAgJiMzNDticGZfa2V5cmluZ19lbmZvcmNlZCYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGAuYnBmYCBrZXlyaW5nIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFuZCBhIGBicGYua2V5cmluZ191bnNlYWxlZGAgYm9vdCBwYXJhbWV0ZXIuIEl0IG1vZGlmaWVzIHRoZSBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCB2ZXJpZmljYXRpb24gcGF0aHMgaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIHRvIGhhbmRsZSB0aGUgbmV3IGtleXJpbmcgYW5kIGVuZm9yY2UgaXRzIHVzZSB3aGVuIGNvbmZpZ3VyZWQuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IHRoZSBgYnBmKClgIHN5c2NhbGwgcGF0aCBhbmQgaW50cm9kdWNlIG5ldyByZWFjaGFibGUgc3RhdGUgYW5kIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lCmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHkKdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gZXhhbWluZSB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlIGFuZCBjb25maXJtIGFueSBhc3N1bXB0aW9ucy4KClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6Ci0gTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgS2NvbmZpZyBmaWxlcywgb3IgY29kZSBjb21tZW50cy4KLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy4KLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuCi0gQ29kZSBwYXRocyB0aGF0IGFyZSBpbXBvc3NpYmxlIHRvIHJlYWNoIGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyBsaWtlIEdDRSBvciBRRU1VLAogIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS4KLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICBpb25pYywgYW1kZ3B1KSB0aGF0IHJlcXVpcmUgcGh5c2ljYWwgUENJZSBoYXJkd2FyZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKQogIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy4KCklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2gKdG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuCgpXaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzoKMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy4KICAgQXZvaWQgbGlzdGluZyBnZW5lcmljIGhvdC1wYXRoIGZ1bmN0aW9ucyB0byBwcmV2ZW50IHNrZXdlZCB0ZXN0IGRpc3RyaWJ1dGlvbnMuCiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucwogICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS4KMi4gSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSB0ZXN0IHRoaXMgbmV3L21vZGlmaWVkIGZlYXR1cmUuCiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KICAgQWxzbyBjaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MKICAgbmVlZGVkIGZvciBLYnVpbGQgdG8gY29tcGlsZSB0aGUgY29kZSBzdGF0aWNhbGx5IGludG8gdm1saW51eC4gTGlzdCB0aGVtIGluIHRoZSBFbmFibGVDb25maWdzCiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDRiMjMyZjg5MGNlNmYxNWJjNzhiNTY3NTFmYjY5YzQwNGIxNzlkYjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAyNSAxNDo1NTowNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggZTQ2NDM2MzRhOWIxYi4uZTcwZmIxNTc1N2Q0MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHQKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTY2Nyw2ICYjNDM7NjY3LDIyIEBAIEtlcm5lbCBwYXJhbWV0ZXJzCiAKIAkJCVNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Jvb3Rjb25maWcucnN0CiAKJiM0MzsJYnBmLmtleXJpbmdfdW5zZWFsZWQ9CiYjNDM7CQkJW0JQRl0gV2hlbiBzZXQgdG8gMSwgbGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkCiYjNDM7CQkJYWZ0ZXIgaW5pdGlhbGl6YXRpb24gc28gdGhhdCB1c2Vyc3BhY2UgY2FuIHByb3Zpc2lvbgomIzQzOwkJCWtleXMuIE9uY2UgdGhlIGtleXJpbmcgaXMgcmVzdHJpY3RlZCBpdCBiZWNvbWVzIGFjdGl2ZQomIzQzOwkJCWFuZCBjYW4gYmUgdXNlZCBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4KJiM0MzsKJiM0MzsJCQlTZXR0aW5nIHRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZSBicGYga2V5cmluZyBpcyB0aGUKJiM0MzsJCQlvbmx5IG5vbi1zeXN0ZW0ga2V5cmluZyBhIGxvYWRlciBtYXkgc2VsZWN0IGZvciB0aGUKJiM0MzsJCQlyZXN0IG9mIHRoZSBib290OiBjYWxsZXItc3VwcGxpZWQgdXNlci9zZXNzaW9uCiYjNDM7CQkJa2V5cmluZ3MgYXJlIHJlZnVzZWQgd2l0aCAtRVBFUk0sIHdoZXRoZXIgb3Igbm90CiYjNDM7CQkJcHJvdmlzaW9uaW5nIGFjdHVhbGx5IGNvbXBsZXRlZC4gVGhlIHN5c3RlbSBrZXlyaW5ncwomIzQzOwkJCXN0YXkgc2VsZWN0YWJsZS4gTGVhdmluZyBpdCB1bnNldCBrZWVwcyB0aGUgcHJpb3IKJiM0MzsJCQliZWhhdmlvdXIsIHdoZXJlIGEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgaXMgYWxsb3dlZC4KJiM0MzsKJiM0MzsJCQlTZWUgRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QKJiM0MzsKIAlidHR2LmNhcmQ9CVtIVyxWNExdIGJ0dHYgKGJ0ODQ4ICYjNDM7IGJ0ODc4IGJhc2VkIGdyYWJiZXIgY2FyZHMpCiAJYnR0di5yYWRpbz0JTW9zdCBpbXBvcnRhbnQgaW5zbW9kIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBhcwogCQkJa2VybmVsIGFyZ3MgdG9vLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdAppbmRleCBlNzNlYWFlYmQ4YjE1Li42YzAzZmI1OGIxNDY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdApAQCAtMjU0LDIxICYjNDM7MjU0LDI1IEBAIHJldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2sKIChgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCksIGRvZXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgY2FycnkgaXRzIGZ1bGwgbWVhbmluZzoKIHZhbGlkbHkgc2lnbmVkICphbmQqIGZ1bGx5IHZlcmlmaWVkLgogCi1BIG1vcmUgcmVhbGlzdGljIGFkbWlzc2lvbiBwb2xpY3kgdGhhbiAmIzM0O2lzIGl0IHNpZ25lZCBhdCBhbGwmIzM0OzogYWNjZXB0IHByb2dyYW1zCi1zaWduZWQgYnkgYSBzeXN0ZW0ga2V5cmluZywgYWNjZXB0IGEgdXNlci1rZXlyaW5nIHNpZ25hdHVyZSBvbmx5IGlmIHRoZQota2V5L2tleXJpbmcgaXQgd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhCi10YW1wZXItZXZpZGVudCByZWNvcmQgb2YgZXZlcnkgZGVjaXNpb24gc28gdGhhdCBldmVuIGRlbmllZCBhdHRlbXB0cyBhcmUKLWF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiYjNDM7QSBtb3JlIHJlYWxpc3RpYyBhZG1pc3Npb24gcG9saWN5IHRoYW4gJiMzNDtpcyBpdCBzaWduZWQgYXQgYWxsJiMzNDs6IGJhc2UgdHJ1c3QgaW4KJiM0Mzt0aGUgYnBmIGtleXJpbmcsIGFjY2VwdCBhIHN0YWdpbmcgc2lnbmF0dXJlIG9ubHkgd2hpbGUgdGhlIGtleS9rZXlyaW5nIHRoZQomIzQzO3Byb2dyYW0gd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhIHRhbXBlci0KJiM0MztldmlkZW50IHJlY29yZCBvZiBldmVyeSBkZWNpc2lvbiBzbyB0aGF0IGV2ZW4gZGVuaWVkIGF0dGVtcHRzIGFyZSBhdWRpdGFibGUuCiYjNDM7KGlsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiAKIC4uIGNvZGUtYmxvY2s6OiBjCiAKLSAgICAvKiBTZXJpYWxzIG9mIHVzZXIga2V5cy9rZXlyaW5ncyB3ZSBhZGRpdGlvbmFsbHkgdHJ1c3QuICovCiYjNDM7ICAgIC8qCiYjNDM7ICAgICAqIFNlcmlhbHMgb2YgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIHdlIGFyZSB3aWxsaW5nIHRvIHN0YWdlLiBFbXB0eQomIzQzOyAgICAgKiBvbiBhIHN5c3RlbSB0aGF0IGhhcyBjb21taXR0ZWQgdG8gdGhlIGJwZiBrZXlyaW5nLCB3aGVyZSB0aGUga2VybmVsCiYjNDM7ICAgICAqIHJlZnVzZXMgdGhlbSBhbnl3YXkuCiYjNDM7ICAgICAqLwogICAgIHN0cnVjdCB7CiAgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpOwogICAgICAgICAgICAgX190eXBlKGtleSwgX19zMzIpOyAgICAgICAgICAgICAvKiBrZXlyaW5nX3NlcmlhbCAqLwogICAgICAgICAgICAgX190eXBlKHZhbHVlLCBfX3U4KTsKICAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNjQpOwotICAgIH0gdHJ1c3RlZF91c2VyX2tleXMgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7ICAgIH0gc3RhZ2luZ19rZXlzIFNFQygmIzM0Oy5tYXBzJiMzNDspOwogCiAgICAgLyogQXVkaXQgc3RyZWFtIGNvbnN1bWVkIGJ5IGEgdXNlcnNwYWNlIGxvZ2dlci4gKi8KICAgICBzdHJ1Y3QgewpAQCAtMjkxLDExICYjNDM7Mjk1LDE5IEBAIGF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiAgICAgICAgICAgICBpZiAoa2VybmVsKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydXN0IGluLWtlcm5lbCBsb2FkcyAqLwogCi0gICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKQomIzQzOyAgICAgICAgICAgIGlmICh2ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHZhbGlkbHkgc2lnbmVkICovCi0gICAgICAgICAgICBlbHNlIGlmIChrdHlwZSA9PSBCUEZfU0lHX0tFWVJJTkdfVVNFUiAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAhYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3RydXN0ZWRfdXNlcl9rZXlzLCAmYW1wO3NlcmlhbCkpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5L2tleXJpbmcgbm90IGFsbG93bGlzdGVkICovCiYjNDM7ICAgICAgICAgICAgfSBlbHNlIHN3aXRjaCAoa3R5cGUpIHsKJiM0MzsgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19CVUlMVElOOgomIzQzOyAgICAgICAgICAgIGNhc2UgQlBGX1NJR19LRVlSSU5HX0JQRjoKJiM0MzsgICAgICAgICAgICAgICAgICAgIGJyZWFrOwomIzQzOyAgICAgICAgICAgIGNhc2UgQlBGX1NJR19LRVlSSU5HX1VTRVI6CiYjNDM7ICAgICAgICAgICAgICAgICAgICBpZiAoIWJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDtzdGFnaW5nX2tleXMsICZhbXA7c2VyaWFsKSkKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOwomIzQzOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiYjNDM7ICAgICAgICAgICAgZGVmYXVsdDoKJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5cmluZyBub3QgaW4gcG9saWN5ICovCiYjNDM7ICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkID0gYnBmX3JpbmdidWZfcmVzZXJ2ZSgmYW1wO2F1ZGl0LCBzaXplb2YoKmQpLCAwKTsKICAgICAgICAgICAgIGlmIChkKSB7CkBAIC0zMDksNiAmIzQzOzMyMSwxMSBAQCBhdWRpdGFibGUuIChJbGx1c3RyYXRpdmUgLSBlcnJvciBjaGVja2luZyBlbGlkZWQuKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKJiM0MztTdWNoIGEgcG9saWN5IGlzIHdoYXQgbWFrZXMgYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyB1c2FibGUgYXQgYWxsIG9uIGEgc3lzdGVtCiYjNDM7dGhhdCBkb2VzIG5vdCBib290IHdpdGggYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGA6IHRoZSBhbGxvd2xpc3QgYm91bmRzIHdoaWNoCiYjNDM7c3RhZ2VkIGtleXMgY291bnQsIGFuZCB0aGUgTFNNIGl0c2VsZiBoYXMgdG8gcHJvdGVjdCB0aGVtIGZyb20gYmVpbmcgdGFtcGVyZWQKJiM0Mzt3aXRoLgomIzQzOwogT2JzZXJ2aW5nIGEgdmVyaWZpZWQgbG9hZDogYGBzZWN1cml0eV9icGZfcHJvZygpYGAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM4MSw4ICYjNDM7Mzk4LDkgQEAgdGhhdCB2ZXJkaWN0IGNvdmVyZWQgYWxsIG9mIGl0cyBleGNsdXNpdmUgbWFwcywgcmVqZWN0aW5nIGFueSB0aGF0IGRpZCBub3QgLSBzbwogYSBkZW55LWJ5LWRlZmF1bHQgYWRtaXNzaW9uIHBvbGljeSBuZWVkcyBubyBzZWNvbmQgZW5mb3JjZW1lbnQgcG9pbnQuIFVzZQogYGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZQogdGhleSBjYXJyeSBhbiBpZC4gVGhlIGBgdmVyZGljdGBgLCBgYGtleXJpbmdfdHlwZWBgIGFuZCBgYGtleXJpbmdfc2VyaWFsYGAgZmllbGRzCi1sZXQgYSBwb2xpY3kgZGlzdGluZ3Vpc2gsIGZvciBleGFtcGxlLCAmIzM0O3ZlcmlmaWVkIGFuZCBzaWduZWQgYnkgYSBidWlsdGluIGtleSYjMzQ7Ci1mcm9tICYjMzQ7dmVyaWZpZWQgYnkgYSB1c2VyIGtleSYjMzQ7LiBBIHBvbGljeSBMU00gc3VjaCBhcyBJUEUgY291bGQgY29uc3VtZSB0aGUgc2FtZQomIzQzO2xldCBhIHBvbGljeSBkaXN0aW5ndWlzaCAmIzM0O3ZlcmlmaWVkIGFnYWluc3QgdGhlIG9wZXJhdG9yJiMzOTtzIGJwZiBrZXlyaW5nJiMzNDsgZnJvbQomIzQzOyYjMzQ7dmVyaWZpZWQgYWdhaW5zdCBhIGtleXJpbmcgdGhlIGxvYWRlciBzdXBwbGllZCBpdHNlbGYmIzM0Oywgd2hpY2ggaXMgdGhlCiYjNDM7ZGlzdGluY3Rpb24gdGhhdCBtYXR0ZXJzIG1vc3QuIEEgcG9saWN5IExTTSBzdWNoIGFzIElQRSBjb3VsZCBjb25zdW1lIHRoZSBzYW1lCiBob29rcyB0byBlbmZvcmNlIHN5c3RlbSBwb2xpY3kgd2l0aG91dCB3cml0aW5nIGFueSBCUEYsIHRob3VnaCBub25lIGltcGxlbWVudHMKIHRoaXMgdG9kYXkuCiAKQEAgLTM5MCwzMyAmIzQzOzQwOCwxNTQgQEAgS2V5cmluZ3MKID09PT09PT09CiAKIGBga2V5cmluZ19pZGBgIHNlbGVjdHMgdGhlIHRydXN0ZWQga2V5cmluZyB0aGUgUEtDUyM3IHNpZ25hdHVyZSBpcyB2ZXJpZmllZAotYWdhaW5zdC4gVGhlIHdlbGwta25vd24gaWRzIGBgMGBgIChidWlsdGluKSwgYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGAKLWFuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7Ci1hbnkgb3RoZXIgdmFsdWUgaXMgdHJlYXRlZCBhcyB0aGUgc2VyaWFsIG9mIGEgdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nLgotVGhlIGtleXJpbmcgaXMgbG9va2VkIHVwIGZpcnN0LCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBieXRlcyBhcmUgZXhhbWluZWQsIHNvIGEKLXNpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkCi12ZXJpZmljYXRpb24gYWJvcnRzIHRoZSBsb2FkIC0gc28gYSBwcm9ncmFtIHRoYXQgbG9hZHMgc3VjY2Vzc2Z1bGx5IHdpdGggYQotc2lnbmF0dXJlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC4KJiM0MzthZ2FpbnN0LiBGb3VyIHZhbHVlcyBhcmUgd2VsbC1rbm93bjsgYW55dGhpbmcgZWxzZSBpcyB0YWtlbiBhcyB0aGUgc2VyaWFsIG9mIGEKJiM0MztjYWxsZXItc3VwcGxpZWQgdXNlciBvciBzZXNzaW9uIGtleSBvciBrZXlyaW5nOgomIzQzOwomIzQzOy4uIGxpc3QtdGFibGU6OgomIzQzOyAgIDpoZWFkZXItcm93czogMQomIzQzOwomIzQzOyAgICogLSBgYGtleXJpbmdfaWRgYAomIzQzOyAgICAgLSBLZXlyaW5nCiYjNDM7ICAgKiAtIGBgMGBgCiYjNDM7ICAgICAtIGJ1aWx0aW4gdHJ1c3RlZCBrZXlyaW5nCiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgIChgYDFgYCkKJiM0MzsgICAgIC0gc2Vjb25kYXJ5IHRydXN0ZWQga2V5cmluZwomIzQzOyAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIChgYDJgYCkKJiM0MzsgICAgIC0gcGxhdGZvcm0ga2V5cmluZwomIzQzOyAgICogLSBgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCAoYGAzYGApCiYjNDM7ICAgICAtIHRoZSBicGYga2V5cmluZwomIzQzOyAgICogLSBhbnl0aGluZyBlbHNlCiYjNDM7ICAgICAtIHNlcmlhbCBvZiBhIGNhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcKJiM0MzsKJiM0MztUaGUga2V5cmluZyBpcyByZXNvbHZlZCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhCiYjNDM7c2lnbmF0dXJlIG5hbWluZyBhIGtleXJpbmcgdGhhdCBjYW5ub3QgYmUgdXNlZCBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEKJiM0MztmYWlsZWQgdmVyaWZpY2F0aW9uIGFib3J0cyB0aGUgbG9hZCAtIGEgcHJvZ3JhbSB0aGF0IGxvYWRzIHN1Y2Nlc3NmdWxseSB3aXRoCiYjNDM7YSBzaWduYXR1cmUgdGhlcmVmb3JlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC4KJiM0MzsKJiM0MztUaGUgYnBmIGtleXJpbmcKJiM0MzstLS0tLS0tLS0tLS0tLS0KJiM0MzsKJiM0MztBIHN5c3RlbSBrZXlyaW5nIG5lZWRzIGEga2VybmVsIHJlYnVpbGQgb3IgYSB2b3VjaGVkLWZvciBlbnJvbGxtZW50IHRvIHJvdGF0ZSBhCiYjNDM7a2V5LCBhbmQgZ3JhbnRzIEJQRi1zaWduaW5nIHRydXN0IHRvIGtleXMgdHJ1c3RlZCBmb3IgZXZlcnl0aGluZyBlbHNlIGluIHRoZQomIzQzO2tlcm5lbCB0b28uIEEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcsIGF0IHRoZSBvdGhlciBleHRyZW1lLCBpcyBmaWxsZWQgYnkgdGhlCiYjNDM7dmVyeSBwcm9jZXNzIHRoYXQgbG9hZHMgdGhlIHByb2dyYW0gYW5kIHNvIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi4KJiM0MzsKJiM0MztUaGUgYnBmIGtleXJpbmcgZmlsbHMgdGhhdCBnYXAgYW5kIGlzIHRoZSB0cnVzdCBhbmNob3Igd2hpY2ggYSBzaWduZWQgQlBGCiYjNDM7ZGVwbG95bWVudCBzaG91bGQgYmUgYnVpbHQgb24gdG9wIG9mOiBhIGtleXJpbmcgbmFtZWQgYGAuYnBmYGAsIHNlbGVjdGVkIHdpdGgKJiM0MztgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCwgdGhhdCBhbiBvcGVyYXRvciBwcm92aXNpb25zIGF0IGJvb3Qgd2l0aCBhIGtleQomIzQzO3Njb3BlZCB0byBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCBub3RoaW5nIGVsc2UgaW4gdGhlIGtlcm5lbCYjMzk7cyB0cnVzdCBoaWVyYXJjaHkuCiYjNDM7SXQgaXMgb3duZWQgYnkgdGhlIG9wZXJhdG9yIHJhdGhlciB0aGFuIGJ5IHRoZSBsb2FkZXIsIGFuZCByb3RhdGFibGUgYWNyb3NzIGEKJiM0MztyZWJvb3Qgd2l0aG91dCB0b3VjaGluZyB0aGUga2VybmVsIGltYWdlLiBJdCBpcyBtb2RlbGxlZCBhZnRlciB0aGUgZG0tdmVyaXR5CiYjNDM7a2V5cmluZyAoc2VlIGBgZG1fdmVyaXR5LmtleXJpbmdfdW5zZWFsZWQ9YGApIGFuZCBwcm92aXNpb25lZCB0aGUgc2FtZSB3YXk6IGFuCiYjNDM7aW5pdHJkIHJ1bnMgdGhlIGBga2V5Y3RsYGAgc3RlcHMgYmVsb3cgYmVmb3JlIGhhbmRpbmcgb2ZmIHRvIHRoZSByb290ZnMuCiYjNDM7CiYjNDM7UHJvdmlzaW9uaW5nCiYjNDM7fn5+fn5+fn5+fn5+CiYjNDM7CiYjNDM7VGhlIGtleXJpbmcgaXMgY3JlYXRlZCBkdXJpbmcgYGBsYXRlX2luaXRjYWxsYGAgYW5kIGlzICoqc2VhbGVkIGVtcHR5KiogYnkKJiM0MztkZWZhdWx0OiBpdCBjYXJyaWVzIGEgcmVqZWN0LWFsbCByZXN0cmljdGlvbiwgc28gbm8ga2V5IGNhbiBldmVyIGJlIGFkZGVkIGFuZAomIzQzO2BgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgIGZhaWxzIHdpdGggYGAtRU5PS0VZYGAgZm9yIHRoZSB3aG9sZSBib290LgomIzQzOwomIzQzO2BgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgIGxlYXZlcyBpdCB1bnJlc3RyaWN0ZWQgYXQgaW5pdCBzbyB0aGUgaW5pdHJkIGNhbgomIzQzO3Byb3Zpc2lvbiBpdC4gVGhlIGtleXJpbmcgaXMgbm90IGxpbmtlZCBpbnRvIGFueSBwcm9jZXNzIGtleXJpbmcsIHNvIGl0IGlzCiYjNDM7YWRkcmVzc2VkIGJ5IHRoZSBzZXJpYWwgYGAvcHJvYy9rZXlzYGAgcmVwb3J0cy4gU3RlcHMgd291bGQgYmUgYXMgZm9sbG93czo6CiYjNDM7CiYjNDM7ICAgIHNlcmlhbD0weCQoYXdrICYjMzk7JDggPT0gJiMzNDtrZXlyaW5nJiMzNDsgJmFtcDsmYW1wOyAkOSA9PSAmIzM0Oy5icGY6JiMzNDsgeyBwcmludCAkMSB9JiMzOTsgL3Byb2Mva2V5cykKJiM0MzsKJiM0MzsgICAga2V5Y3RsIHBhZGQgYXN5bW1ldHJpYyAmIzM0OyYjMzQ7ICRzZXJpYWwgJmx0OyBzaWduaW5nX2tleS5kZXIKJiM0MzsgICAga2V5Y3RsIHJlc3RyaWN0X2tleXJpbmcgJHNlcmlhbAomIzQzOwomIzQzO0JvdGggc3RlcHMgYXJlIHJlcXVpcmVkOiB0aGUga2V5cmluZyBpcyBjb25zdWx0ZWQgb25seSBvbmNlIGl0IGlzICoqbm9uLWVtcHR5CiYjNDM7YW5kIHJlc3RyaWN0ZWQqKi4gQW4gdW5yZXN0cmljdGVkIGtleXJpbmcgaXMgaWdub3JlZCBldmVuIHdoZW4gaXQgaG9sZHMga2V5cywKJiM0MztzbyBhIGhhbGYtcHJvdmlzaW9uZWQga2V5cmluZyBpcyBpbmVydCByYXRoZXIgdGhhbiBhIHdlYWtlciB0cnVzdCBhbmNob3IsIGFuZCBhCiYjNDM7bG9hZCBuYW1pbmcgaXQgZmFpbHMgd2l0aCBgYC1FTk9LRVlgYCBhbmQgYSB2ZXJpZmllciBsb2cuIFJlc3RyaWN0aW5nIGNhbm5vdAomIzQzO2JlIHVuZG9uZS4KJiM0MzsKJiM0MztNb3JlIHRoYW4gb25lIGtleSBpcyBlbnJvbGxlZCBieSByZXBlYXRpbmcgdGhlIGBga2V5Y3RsIHBhZGRgYCBzdGVwOyB0aGUKJiM0MztyZXN0cmljdGlvbiBpcyBhcHBsaWVkIG9uY2UsIGFmdGVyIHRoZSBsYXN0IG9mIHRoZW06OgomIzQzOwomIzQzOyAgICBmb3Iga2V5IGluIC9ldGMvYnBmL2tleXMvKi5kZXI7IGRvCiYjNDM7ICAgICAgICBrZXljdGwgcGFkZCBhc3ltbWV0cmljICYjMzQ7JiMzNDsgJHNlcmlhbCAmbHQ7ICRrZXkKJiM0MzsgICAgZG9uZQomIzQzOwomIzQzOyAgICBrZXljdGwgcmVzdHJpY3Rfa2V5cmluZyAkc2VyaWFsCiYjNDM7ICAgIGtleWN0bCBzaG93ICRzZXJpYWwKJiM0MzsKJiM0MztUaGUgcmVzdHJpY3Rpb24gYm91bmRzIHdoYXQgY2FuIGJlIGFkZGVkLCBuZXZlciB3aGF0IGNhbiBiZSB0YWtlbiBhd2F5LiBBIGtleQomIzQzO3RoYXQgaXMgYWxyZWFkeSBlbnJvbGxlZCBjYW4gc3RpbGwgYmUgdW5saW5rZWQsIGFuZCB0aGUga2V5cmluZyBjbGVhcmVkIG9yCiYjNDM7cmV2b2tlZCwgYnkgYW55dGhpbmcgcnVubmluZyBhcyByb290LiBUaGF0IGRvZXMgbm90IHdlYWtlbiB0aGUgYW5jaG9yLCBzaW5jZQomIzQzO2Ega2V5cmluZyBsZWZ0IGVtcHR5IGlzIG5vIGxvbmdlciBjb25zdWx0ZWQgYW5kIGEgbG9hZCBuYW1pbmcgaXQgZmFpbHMgd2l0aAomIzQzO2BgLUVOT0tFWWBgLCBidXQgaXQgZG9lcyB0YWtlIHNpZ25lZCBsb2FkaW5nIG91dCB1bnRpbCB0aGUgbmV4dCBib290LiBEcm9wcGluZwomIzQzO3RoZSB1c2VyIHBlcm1pc3Npb25zIHRoZSBrZXlyaW5nIG5vIGxvbmdlciBuZWVkcyB3b3VsZCBjbG9zZSB0aGF0OyBhcyBhIHRoaXJkCiYjNDM7c3RlcCBpbiB0aGUgaW5pdHJkOjoKJiM0MzsKJiM0MzsgICAga2V5Y3RsIHNldHBlcm0gJHNlcmlhbCAweDA4MDMwMDAwCiYjNDM7CiYjNDM7V2hhdCByZW1haW5zIGlzIGBgS0VZX1BPU19TRUFSQ0hgYCBmb3IgdGhlIGluLWtlcm5lbCBzZWFyY2ggZHVyaW5nIHZlcmlmaWNhdGlvbiwKJiM0MztwbHVzIGBgS0VZX1VTUl9WSUVXYGAgYW5kIGBgS0VZX1VTUl9SRUFEYGAgc28gdGhlIGtleXJpbmcgc3RheXMgdmlzaWJsZSBpbgomIzQzO2BgL3Byb2Mva2V5c2BgIGFuZCBgYGtleWN0bCBzaG93YGAuCiYjNDM7CiYjNDM7UHJvdmlzaW9uaW5nIGhhcyB0byBjb21wbGV0ZSBiZWZvcmUgY29udHJvbCBwYXNzZXMgdG8gdGhlIHJvb3Rmcy4gVGhlIGtleXJpbmcKJiM0Mzt0YWtlcyBhbnkgbnVtYmVyIG9mIGtleXMgZm9yIGFzIGxvbmcgYXMgaXQgaXMgdW5yZXN0cmljdGVkLCBzbyBpdCBpcyB0aGUKJiM0MztyZXN0cmljdGlvbiB0aGF0IGJvdW5kcyB0aGUgZW5yb2xsZWQgc2V0LCBub3QgdGhlIGZpcnN0IGVucm9sbG1lbnQuIEJlZm9yZQomIzQzO3RoZSBpbml0cmQgaGFuZHMgb2ZmIGNvbnRyb2wsIGl0IG11c3QgdGhlcmVmb3JlIHJlc3RyaWN0IHRoZSBrZXlyaW5nIGFmdGVyCiYjNDM7dGhlIGxhc3QgZW5yb2xsbWVudC4KJiM0MzsKJiM0MztFbmZvcmNlbWVudAomIzQzO35+fn5+fn5+fn5+CiYjNDM7CiYjNDM7YGBicGYua2V5cmluZ191bnNlYWxlZD0xYGAgc3RhdGVzIHRoYXQgdGhlIGJwZiBrZXlyaW5nIGlzICp0aGUqIHRydXN0IGFuY2hvciBmb3IKJiM0Mzt0aGlzIGJvb3QsIHNvIGl0IGRvZXMgbW9yZSB0aGFuIHVuc2VhbC4gRnJvbSB0aGUgZmlyc3QgcHJvZ3JhbSBsb2FkIG9ud2FyZHMgYQomIzQzO2NhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5cmluZyBpcyByZWZ1c2VkIHdpdGggYGAtRVBFUk1gYCBhbmQgYSB2ZXJpZmllcgomIzQzO2xvZyBtZXNzYWdlLCB3aGV0aGVyIG9yIG5vdCBwcm92aXNpb25pbmcgZXZlciBjb21wbGV0ZWQuIFRoZSBzeXN0ZW0ga2V5cmluZ3MKJiM0MztzdGF5IHNlbGVjdGFibGUuCiYjNDM7CiYjNDM7RW5mb3JjZW1lbnQgaXMgcmVhZGFibGUgYXQgYGAvc3lzL21vZHVsZS9icGYvcGFyYW1ldGVycy9rZXlyaW5nX3Vuc2VhbGVkYGAsIGFuZAomIzQzO3JlYWQtb25seSB0aGVyZTogdGhlIGZsYWcgaXMgYGBfX3JvX2FmdGVyX2luaXRgYCBiZWhpbmQgYSAwNDQ0IHBhcmFtZXRlci4gSXQgaXMKJiM0MzthbHNvIGRlcml2ZWQgZnJvbSB0aGUgYm9vdCBmbGFnIHJhdGhlciB0aGFuIGZyb20gdGhlIGtleXJpbmcmIzM5O3MgcnVudGltZSBzdGF0ZSwKJiM0MztzbyB0aGVyZSBpcyBubyB3aW5kb3cgZWFybHkgaW4gYm9vdCBkdXJpbmcgd2hpY2ggYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyBpcwomIzQzO3N0aWxsIGFjY2VwdGVkLgomIzQzOwomIzQzO0NhbGxlci1zdXBwbGllZCBrZXlyaW5ncyBhcmUgZm9yIHN0YWdpbmcKJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiYjNDM7CiYjNDM7QSBgYGtleXJpbmdfaWRgYCBuYW1pbmcgYSB1c2VyIG9yIHNlc3Npb24ga2V5IG9yIGtleXJpbmcgaXMgYSAqc3RhZ2luZyoKJiM0MzttZWNoYW5pc20sIG5vdCBhIHRydXN0IGFuY2hvcjogaXQgaXMgZmlsbGVkIGJ5IHRoZSBzYW1lIHVzZXJzcGFjZSB0aGF0IGxvYWRzIHRoZQomIzQzO3Byb2dyYW0sIHNvIHZlcmlmeWluZyBhZ2FpbnN0IGl0IGVzdGFibGlzaGVzIG9ubHkgdGhhdCB0aGUgbG9hZGVyIHNpZ25lZCB3aGF0IGl0CiYjNDM7bG9hZGVkLiBJdHMgcHVycG9zZSBpcyB0byBsZXQgc29mdHdhcmUgaW5zdGFsbGVkIG9udG8gYSBydW5uaW5nIHN5c3RlbSAtIHdob3NlCiYjNDM7c2lnbmluZyBrZXkgaXMgbm90IGVucm9sbGVkIGFueXdoZXJlIHlldCAtIHJ1biBzaWduZWQgdW50aWwgdGhhdCBrZXkgcmVhY2hlcyB0aGUKJiM0MzticGYga2V5cmluZyBvbiB0aGUgbmV4dCBib290LgomIzQzOwomIzQzO0Egc3lzdGVtIHRoYXQgaGFzIGNvbW1pdHRlZCB0byB0aGUgYnBmIGtleXJpbmcgcmVmdXNlcyB0aGlzIHBhdGggb3V0cmlnaHQgKHNlZQomIzQzO2BFbmZvcmNlbWVudGBfKS4gQSBzeXN0ZW0gdGhhdCBoYXMgbm90IGNhbiBzdGlsbCBhbGxvdyBpdCwgYnV0IGEgcG9saWN5IG11c3QKJiM0MztuZXZlciB0cmVhdCBgYEJQRl9TSUdfS0VZUklOR19VU0VSYGAgYXMgZXF1aXZhbGVudCB0byB0aGUgYnBmIG9yIHN5c3RlbQomIzQzO2tleXJpbmdzOyBpdCBzaG91bGQgYWxsb3dsaXN0IHRoZSBzcGVjaWZpYyBzZXJpYWxzIGl0IGlzIHdpbGxpbmcgdG8gc3RhZ2UgYW5kCiYjNDM7cGFpciB0aGF0IHdpdGggYSBCUEYgTFNNIHBvbGljeSBwcm90ZWN0aW5nIHRob3NlIGtleXMgZnJvbSB0YW1wZXJpbmcsIGFzIGluCiYjNDM7YEVuZm9yY2VtZW50IHZpYSBMU01zYF8uCiYjNDM7CiYjNDM7UmVjb3JkZWQgZmllbGRzCiYjNDM7LS0tLS0tLS0tLS0tLS0tCiAKIFR3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy0mZ3Q7YXV4LSZndDtzaWdgYCBmb3IgYW4gTFNNIHRvIGluc3BlY3Q6CiAKIGBga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYCkKICAgICBDbGFzc2lmaWVkIHB1cmVseSBmcm9tIGBga2V5cmluZ19pZGBgIHdoZW5ldmVyIHRoZSBwcm9ncmFtIGlzIHNpZ25lZDoKICAgICBgYEJQRl9TSUdfS0VZUklOR19CVUlMVElOYGAsIGBgX1NFQ09OREFSWWBgLCBgYF9QTEFURk9STWBgIGZvciB0aGUgc3lzdGVtCi0gICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXMKLSAgICBgYEJQRl9TSUdfS0VZUklOR19OT05FYGAgZm9yIGFuIHVuc2lnbmVkIHByb2dyYW0uCiYjNDM7ICAgIGtleXJpbmdzLCBgYF9CUEZgYCBmb3IgdGhlIGJwZiBrZXlyaW5nLCBvciBgYF9VU0VSYGAgZm9yIGEgY2FsbGVyLXN1cHBsaWVkCiYjNDM7ICAgIHVzZXIvc2Vzc2lvbiBrZXlyaW5nLiBJdCBpcyBgYEJQRl9TSUdfS0VZUklOR19OT05FYGAgZm9yIGFuIHVuc2lnbmVkCiYjNDM7ICAgIHByb2dyYW0uCiAKIGBga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYCkKICAgICBTZXQgKipvbmx5Kiogb24gYSBzdWNjZXNzZnVsIHZlcmlmaWNhdGlvbiwgdG8gdGhlIHNlcmlhbCBvZiB0aGUKLSAgICAqKnVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZyoqIHRoYXQgYGBrZXlyaW5nX2lkYGAgcmVzb2x2ZWQgdG8gLSB0aGUKJiM0MzsgICAgKipjYWxsZXItc3VwcGxpZWQga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlCiAgICAgb2JqZWN0IHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkIGFnYWluc3QsIG5vdCB0aGUgaW5kaXZpZHVhbCBhc3ltbWV0cmljCiAgICAga2V5IGluc2lkZSBpdCB0aGF0IG1hdGNoZWQgdGhlIHNpZ25lci4gUGFzc2luZwogICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcmIzM5O3MKLSAgICBzZXJpYWwuIFRoZSBzeXN0ZW0ga2V5cmluZ3MgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmQgZXhwb3NlIG5vIHNlcmlhbAotICAgIGhlcmUsIHNvIHRoZSBzZXJpYWwgaXMgYGAwYGAgZm9yIGJ1aWx0aW4sIHNlY29uZGFyeSBhbmQgcGxhdGZvcm0KLSAgICBzaWduYXR1cmVzLCBhbmQgYGAwYGAgZm9yIHVuc2lnbmVkIHByb2dyYW1zLiBJbiBvdGhlciB3b3JkcywgYSBub24temVybwotICAgIGBga2V5cmluZ19zZXJpYWxgYCBpcyBleGFjdGx5ICYjMzQ7dmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoCi0gICAgdGhpcyBzZXJpYWwmIzM0Oy4KJiM0MzsgICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFuZCB0aGUgYnBmIGtleXJpbmcgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmQKJiM0MzsgICAgZXhwb3NlIG5vIHNlcmlhbCBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciB0aGVtLCBhbmQgYGAwYGAgZm9yCiYjNDM7ICAgIHVuc2lnbmVkIHByb2dyYW1zLiBBIG5vbi16ZXJvIGBga2V5cmluZ19zZXJpYWxgYCBpcyB0aGVyZWZvcmUgZXhhY3RseQomIzQzOyAgICAmIzM0O3ZlcmlmaWVkIGFnYWluc3QgdGhlIGNhbGxlci1zdXBwbGllZCBrZXkva2V5cmluZyB3aXRoIHRoaXMgc2VyaWFsJiMzNDssIHdoaWNoCiYjNDM7ICAgIGlzIGV4YWN0bHkgdGhlIGNhc2UgYSBwb2xpY3kgaGFzIHRvIHNjcnV0aW5pc2UuCiAKIC4uIGxpc3QtdGFibGU6OgogICAgOmhlYWRlci1yb3dzOiAxCkBAIC00MzYsMTYgJiM0Mzs1NzUsNDkgQEAgVHdvIGZpZWxkcyBhcmUgcmVjb3JkZWQgaW4gYGBwcm9nLSZndDthdXgtJmd0O3NpZ2BgIGZvciBhbiBMU00gdG8gaW5zcGVjdDoKICAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgCiAgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk1gYAogICAgICAtIGBgMGBgCi0gICAqIC0gb3RoZXIgKGEgdXNlci9zZXNzaW9uIGtleSBzZXJpYWwpCiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgCiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JQRmBgCiYjNDM7ICAgICAtIGBgMGBgCiYjNDM7ICAgKiAtIG90aGVyIChhIGNhbGxlci1zdXBwbGllZCBrZXkgc2VyaWFsKQogICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYAogICAgICAtIHNlcmlhbCBvZiB0aGUgcmVzb2x2ZWQga2V5L2tleXJpbmcKIAotUHJvZHVjaW5nIGEgc2lnbmVkIG9iamVjdAotPT09PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MztQcm9kdWNpbmcgYW5kIGxvYWRpbmcgYSBzaWduZWQgb2JqZWN0CiYjNDM7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQomIzQzOwomIzQzO0dlbmVyYXRpbmcgYSBzaWduaW5nIGtleQomIzQzOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQomIzQzOwomIzQzO1NpZ25pbmcgaXMgYWxnb3JpdGhtIGFnbm9zdGljOiB0aGUgYWxnb3JpdGhtIGNvbWVzIGZyb20gdGhlIFguNTA5IGNlcnRpZmljYXRlCiYjNDM7YW5kIHRoZSBQS0NTIzcgYGBTaWduZXJJbmZvYGAuIEFueXRoaW5nIHRoZSBYLjUwOSBhbmQgUEtDUyM3IHBhcnNlcnMgdW5kZXJzdGFuZAomIzQzO3dvcmtzIHdpdGggbm8gQlBGLXNpZGUgY2hhbmdlLiBCb3RoIGV4YW1wbGVzIGJlbG93IHJlYWQgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QKJiM0Mztjb25maWcgZnJvbSBgYHg1MDkuZ2Vua2V5YGAsIGZvciB3aGljaCBgYGNlcnRzL3g1MDkuZ2Vua2V5YGAgc2VydmVzIGFzIGEKJiM0Mzt0ZW1wbGF0ZSAoc2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW9kdWxlLXNpZ25pbmcucnN0KS4gUlNBOjoKJiM0MzsKJiM0MzsgICAgb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLXNoYTI1NiAtZGF5cyAzNjUwMCAtYmF0Y2ggLXg1MDkgXAomIzQzOyAgICAgICAgICAgIC1jb25maWcgeDUwOS5nZW5rZXkgLW91dGZvcm0gUEVNIFwKJiM0MzsgICAgICAgICAgICAtb3V0IHNpZ25pbmdfa2V5LnBlbSAta2V5b3V0IHNpZ25pbmdfa2V5LnBlbQomIzQzOyAgICBvcGVuc3NsIHg1MDkgLWluIHNpZ25pbmdfa2V5LnBlbSAtb3V0Zm9ybSBkZXIgLW91dCBzaWduaW5nX2tleS5kZXIKJiM0MzsKJiM0MztNTC1EU0EtODcgKEZJUFMtMjA0KSwgd2hpY2ggbmVlZHMgb3BlbnNzbCAzLjUgb3IgbGF0ZXIgYW5kIGBgQ09ORklHX0NSWVBUT19NTERTQWBgCiYjNDM7aW4gdGhlIGtlcm5lbC4gTm90ZSB0aGUgYWJzZW5jZSBvZiBhIGRpZ2VzdCBvcHRpb246IE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UKJiM0MztpdHNlbGYgYW5kIG9wZW5zc2wgcmVqZWN0cyBhbiBleHBsaWNpdCBkaWdlc3QgZm9yIGl0OjoKJiM0MzsKJiM0MzsgICAgb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLWRheXMgMzY1MDAgLWJhdGNoIC14NTA5IFwKJiM0MzsgICAgICAgICAgICAtbmV3a2V5IE1MLURTQS04NyAtY29uZmlnIHg1MDkuZ2Vua2V5IC1vdXRmb3JtIFBFTSBcCiYjNDM7ICAgICAgICAgICAgLW91dCBzaWduaW5nX2tleS5wZW0gLWtleW91dCBzaWduaW5nX2tleS5wZW0KJiM0MzsgICAgb3BlbnNzbCB4NTA5IC1pbiBzaWduaW5nX2tleS5wZW0gLW91dGZvcm0gZGVyIC1vdXQgc2lnbmluZ19rZXkuZGVyCiYjNDM7CiYjNDM7YGBicGZ0b29sYGAgaGFuZGxlcyB0aGUgZm9sbG93aW5nIGludGVybmFsbHk6IG9wZW5zc2wgYmVmb3JlIDQuMCBjYW5ub3QgY29tYmluZQomIzQzO01MLURTQSB3aXRoIGBgQ01TX05PQVRUUmBgLCBzbyBpdCBmYWxscyBiYWNrIHRvIHNpZ25lZEF0dHJzLCB3aGVyZSBvbmx5IFNIQS01MTIKJiM0MztpcyBwZXJtaXR0ZWQuIFRoaXMgbWlycm9ycyB3aGF0IG1vZHVsZSBzaWduaW5nIGRvZXMgYXMgd2VsbC4KJiM0MzsKJiM0MztTaWduaW5nCiYjNDM7LS0tLS0tLQogCiBgYGJwZnRvb2xgYCBnZW5lcmF0ZXMgYW5kIHNpZ25zIGEgbGlnaHQgc2tlbGV0b24gaW4gb25lIHN0ZXA6OgogCi0gICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgJmx0O3ByaXZhdGVfa2V5LnBlbSZndDsgLWkgJmx0O2NlcnRpZmljYXRlLng1MDkmZ3Q7IFwKJiM0MzsgICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgc2lnbmluZ19rZXkucGVtIC1pIHNpZ25pbmdfa2V5LmRlciBcCiAgICAgICAgICAgICBvYmouYnBmLm8gJmd0OyBvYmoubHNrZWwuaAogCiBgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlcwpAQCAtNDU0LDEyICYjNDM7NjI2LDM2IEBAIHNpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS4KIHJlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXIKIGluc3RydWN0aW9ucyBzbyB0aGUgbWV0YWRhdGEgbWFwIGNhbiBiZSBib3VuZCB0byB0aGUgbG9hZGVyLiBUaGUgc2lnbmF0dXJlIGFuZAogaGFzaCBhcmUgZW1iZWRkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXI7IHRoZSBjZXJ0aWZpY2F0ZSBpcyB1c2VkIG9ubHkgZm9yCi1zaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIExvYWRpbmcgdGhlIHNrZWxldG9uIHBlcmZvcm1zIHRoZQotY3JlYXRlL3BvcHVsYXRlL2ZyZWV6ZS9sb2FkIHNlcXVlbmNlIGRlc2NyaWJlZCBhYm92ZS4KJiM0MztzaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuCiYjNDM7CiYjNDM7TG9hZGluZwomIzQzOy0tLS0tLS0KJiM0MzsKJiM0MztUaGUgZ2VuZXJhdGVkIHNrZWxldG9uIGV4cG9zZXMgYGBrZXlyaW5nX2lkYGAsIHdoaWNoIHNlbGVjdHMgdGhlIGtleXJpbmcgdGhlCiYjNDM7a2VybmVsIHZlcmlmaWVzIGFnYWluc3QuIFNldCBpdCBiZXR3ZWVuIG9wZW4gYW5kIGxvYWQ7IGxvYWRpbmcgdGhlbiBwZXJmb3JtcwomIzQzO3RoZSBjcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlOjoKIAotQXQgcnVudGltZSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2hvc2VuIGtleXJpbmcgKGZvcgotZXhhbXBsZSBhZGRlZCB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nLCBvciBidWlsdCBpbnRvIHRoZSBrZXJuZWwmIzM5O3MgYnVpbHRpbiB0cnVzdGVkCi1rZXlyaW5nKSBmb3IgdmVyaWZpY2F0aW9uIHRvIHN1Y2NlZWQuCiYjNDM7ICAgIHN0cnVjdCBvYmogKnNrZWwgPSBvYmpfX29wZW4oKTsKJiM0MzsKJiM0MzsgICAgc2tlbC0mZ3Q7a2V5cmluZ19pZCA9IDM7ICAgICAgICAgICAvKiBWRVJJRllfVVNFX0JQRl9LRVlSSU5HICovCiYjNDM7ICAgIGVyciA9IG9ial9fbG9hZChza2VsKTsKJiM0MzsKJiM0MztGb3IgdGhlIHN0YWdpbmcgY2FzZSB0aGUgc2FtZSBvYmplY3QgaXMgbG9hZGVkIGFnYWluc3QgYSBrZXlyaW5nIHRoZSBjYWxsZXIKJiM0Mztwb3B1bGF0ZWQgaXRzZWxmLCB3aGljaCBvbmx5IHdvcmtzIG9uIGEgc3lzdGVtIHRoYXQgaGFzIG5vdCBzZXQKJiM0MztgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFgYDo6CiYjNDM7CiYjNDM7ICAgIC8qCiYjNDM7ICAgICAqIFN0YWdpbmcgb25seTogdGhpcyBrZXlyaW5nIGlzIHVuZGVyIHRoZSBsb2FkZXImIzM5O3Mgb3duIGNvbnRyb2wgYW5kCiYjNDM7ICAgICAqIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi4gU2VlICYjMzQ7Q2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIGFyZSBmb3IKJiM0MzsgICAgICogc3RhZ2luZyYjMzQ7LgomIzQzOyAgICAgKi8KJiM0MzsgICAga2V5X2lkID0gYWRkX2tleSgmIzM0O2FzeW1tZXRyaWMmIzM0OywgJiMzNDsmIzM0OywgZGVyLCBkZXJfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7ICAgIHNrZWwtJmd0O2tleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7CiYjNDM7ICAgIGVyciA9IG9ial9fbG9hZChza2VsKTsKJiM0MzsKJiM0MztFaXRoZXIgd2F5IHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBhbHJlYWR5IGJlIGluIHRoZSBjaG9zZW4ga2V5cmluZyBmb3IKJiM0Mzt2ZXJpZmljYXRpb24gdG8gc3VjY2VlZC4gRm9yIHRoZSBicGYga2V5cmluZyB0aGF0IGVucm9sbG1lbnQgaGFwcGVucyBvbmNlIGF0CiYjNDM7Ym9vdCwgc2VlIGBQcm92aXNpb25pbmdgXy4KIAogVUFQSSByZWZlcmVuY2UKID09PT09PT09PT09PT09CkBAIC00ODcsNiAmIzQzOzY4MywxMyBAQCBVQVBJIHJlZmVyZW5jZQogICAgIFRoZSBtYXAgY29udGVudCBpcyBub3QgaGFzaGVkIHNlcGFyYXRlbHkgYXQgYWxsIC0gaXQgaXMgY292ZXJlZCwgYXMgYnl0ZXMsCiAgICAgYnkgdGhlIHByb2dyYW0gc2lnbmF0dXJlLgogCiYjNDM7S2VybmVsIGNvbW1hbmQgbGluZToKJiM0MzsKJiM0MztgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPWBgCiYjNDM7ICAgIFNldCB0byBgYDFgYCB0byBsZWF2ZSB0aGUgYnBmIGtleXJpbmcgdW5zZWFsZWQgZm9yIHByb3Zpc2lvbmluZywgYW5kIHRvIG1ha2UKJiM0MzsgICAgaXQgdGhlIG9ubHkgbm9uLXN5c3RlbSBrZXlyaW5nIGEgbG9hZGVyIG1heSBzZWxlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBib290CiYjNDM7ICAgIChzZWUgYFRoZSBicGYga2V5cmluZ2BfKS4KJiM0MzsKIE5vdGVzIGFuZCBsaW1pdGF0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PQogCkBAIC00OTUsMyAmIzQzOzY5OCw1IEBAIE5vdGVzIGFuZCBsaW1pdGF0aW9ucwogICBleGNlZWQgaXQuCiAtIFRoZSBtZXRhZGF0YSBjb250YWluZXIgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheSBtYXAsIGFjY2Vzc2VkIHRocm91Z2gKICAgYGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHJgYC4KJiM0MzstIFRoZSBicGYga2V5cmluZyBuZWVkcyBgYENPTkZJR19LRVlTYGA7IHdpdGhvdXQgaXQgdGhlcmUgaXMgbm8gYnBmIGtleXJpbmcKJiM0MzsgIGFuZCBgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCBuZXZlciByZXNvbHZlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmLmggYi9pbmNsdWRlL2xpbnV4L2JwZi5oCmluZGV4IGIzY2QyOGQ5ZTNiNTUuLjU3MWY3NzkyYTVjNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9icGYuaApAQCAtMTczNSw2ICYjNDM7MTczNSw3IEBAIGVudW0gYnBmX3NpZ19rZXlyaW5nIHsKIAlCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZLAogCUJQRl9TSUdfS0VZUklOR19QTEFURk9STSwKIAlCUEZfU0lHX0tFWVJJTkdfVVNFUiwKJiM0MzsJQlBGX1NJR19LRVlSSU5HX0JQRiwKIH07CiAKIHN0cnVjdCBicGZfcHJvZ19hdXggewpAQCAtMzgxOSw2ICYjNDM7MzgyMCw4IEBAIHN0cnVjdCBicGZfa2V5IHsKICNpZiBkZWZpbmVkKENPTkZJR19LRVlTKSAmYW1wOyZhbXA7IGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKQogc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfdXNlcl9rZXkoczMyIHNlcmlhbCwgdTY0IGZsYWdzKTsKIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKTsKJiM0MztzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpOwomIzQzO2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZCk7CiB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KTsKIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCwKQEAgLTM4MzksNiAmIzQzOzM4NDIsMTYgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZCkKIAlyZXR1cm4gTlVMTDsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfa2V5cmluZyh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBicGZfa2V5cmluZ19lbmZvcmNlZCh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSkKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmggYi9pbmNsdWRlL2xpbnV4L3ZlcmlmaWNhdGlvbi5oCmluZGV4IGRlYzdmMmJlYWJmZDQuLjFjYjU5ZGRkYTI1MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC92ZXJpZmljYXRpb24uaApAQCAtMTgsNiAmIzQzOzE4LDE2IEBACiAjZGVmaW5lIFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkcgKChzdHJ1Y3Qga2V5ICopMVVMKQogI2RlZmluZSBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkcgICgoc3RydWN0IGtleSAqKTJVTCkKIAomIzQzOy8qCiYjNDM7ICogVGhlIGlkIG9mIEJQRiYjMzk7cyAmIzM0Oy5icGYmIzM0OyBrZXlyaW5nLCByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNwYWNlLiBJdCBpcwomIzQzOyAqIGV4cGxpY2l0bHkgbm90IGEgc2VudGluZWwgbGlrZSB0aGUgdHdvIGFib3ZlIGFzIEJQRiByZXNvbHZlcyBpdCB0bwomIzQzOyAqIHRoZSBrZXlyaW5nIGl0c2VsZiBhbmQgcGFzc2VzIHRoYXQsIHNvIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSBuZXZlcgomIzQzOyAqIHNlZXMgdGhpcyB2YWx1ZSwgYW5kIHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKCkgbXVzdCBrZWVwIHJlamVjdGluZyBpdC4KJiM0MzsgKiBMZWZ0IGFzIGEgcGxhaW4gaW50ZWdlciBzbyB0aGF0IGhhbmRpbmcgaXQgb3ZlciBhcyBAdHJ1c3RlZF9rZXlzIGRvZXMKJiM0MzsgKiBub3QgY29tcGlsZS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFZFUklGWV9VU0VfQlBGX0tFWVJJTkcJMwomIzQzOwogc3RhdGljIGlubGluZSBpbnQgc3lzdGVtX2tleXJpbmdfaWRfY2hlY2sodTY0IGlkKQogewogCWlmIChpZCAmZ3Q7ICh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORykKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvTWFrZWZpbGUgYi9rZXJuZWwvYnBmL01ha2VmaWxlCmluZGV4IDkwMjU1ZDgwZTViZTYuLjlhOTJjMzQ4YmJkYTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9NYWtlZmlsZQpAQCAtMjcsNiAmIzQzOzI3LDkgQEAgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gb2ZmbG9hZC5vCiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBuZXRfbmFtZXNwYWNlLm8KIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IHRjeC5vCiBlbmRpZgomIzQzO2lmZXEgKCQoQ09ORklHX0tFWVMpLHkpCiYjNDM7b2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0ga2V5cy5vCiYjNDM7ZW5kaWYKIGlmZXEgKCQoQ09ORklHX1BFUkZfRVZFTlRTKSx5KQogb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gc3RhY2ttYXAubwogZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYva2V5cy5jIGIva2VybmVsL2JwZi9rZXlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjBjYjg1Mjk1Yzg5YQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYva2V5cy5jCkBAIC0wLDAgJiM0MzsxLDcyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NyZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZXJyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2V5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZXBhcmFtLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsKJiM0MzsjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAomIzQzOyNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCAmIzM0O2JwZi4mIzM0OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3Qga2V5ICpicGZfa2V5cmluZzsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBicGZfa2V5cmluZ191bnNlYWxlZCBfX3JvX2FmdGVyX2luaXQ7CiYjNDM7bW9kdWxlX3BhcmFtX25hbWVkKGtleXJpbmdfdW5zZWFsZWQsIGJwZl9rZXlyaW5nX3Vuc2VhbGVkLCBib29sLCAwNDQ0KTsKJiM0MztNT0RVTEVfUEFSTV9ERVNDKGtleXJpbmdfdW5zZWFsZWQsICYjMzQ7TGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkJiMzNDspOwomIzQzOwomIzQzO2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBicGZfa2V5cmluZ191bnNlYWxlZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfa2V5cmluZyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rZXkgKmJrZXk7CiYjNDM7CiYjNDM7CWlmICghYnBmX2tleXJpbmcpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKCFSRUFEX09OQ0UoYnBmX2tleXJpbmctJmd0O2tleXMubnJfbGVhdmVzX29uX3RyZWUpIHx8CiYjNDM7CSAgICAhUkVBRF9PTkNFKGJwZl9rZXlyaW5nLSZndDtyZXN0cmljdF9saW5rKSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlia2V5ID0ga21hbGxvY19vYmooKmJrZXkpOwomIzQzOwlpZiAoIWJrZXkpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJYmtleS0mZ3Q7a2V5ID0gYnBmX2tleXJpbmc7CiYjNDM7CWJrZXktJmd0O2hhc19yZWYgPSBmYWxzZTsKJiM0MzsJcmV0dXJuIGJrZXk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9rZXlyaW5nX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrZXkgKmtleXJpbmc7CiYjNDM7CiYjNDM7CWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKCYjMzQ7LmJwZiYjMzQ7LAomIzQzOwkJCQlHTE9CQUxfUk9PVF9VSUQsIEdMT0JBTF9ST09UX0dJRCwKJiM0MzsJCQkJY3VycmVudF9jcmVkKCksIEtFWV9QT1NfU0VBUkNIIHwKJiM0MzsJCQkJS0VZX1VTUl9WSUVXIHwgS0VZX1VTUl9SRUFEIHwKJiM0MzsJCQkJS0VZX1VTUl9XUklURSB8IEtFWV9VU1JfU0VBUkNIIHwKJiM0MzsJCQkJS0VZX1VTUl9TRVRBVFRSLCBLRVlfQUxMT0NfTk9UX0lOX1FVT1RBLAomIzQzOwkJCQlOVUxMLCBOVUxMKTsKJiM0MzsJaWYgKElTX0VSUihrZXlyaW5nKSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7YnBmOiBjYW5ub3QgYWxsb2NhdGUgYnBmIGtleXJpbmc6ICVsZFxuJiMzNDssCiYjNDM7CQkgICAgICAgUFRSX0VSUihrZXlyaW5nKSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwlpZiAoIWJwZl9rZXlyaW5nX3Vuc2VhbGVkICZhbXA7JmFtcDsKJiM0MzsJICAgIGtleXJpbmdfcmVzdHJpY3QobWFrZV9rZXlfcmVmKGtleXJpbmcsIHRydWUpLCBOVUxMLCBOVUxMKSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7YnBmOiBjYW5ub3Qgc2VhbCBicGYga2V5cmluZ1xuJiMzNDspOwomIzQzOwkJa2V5X3Jldm9rZShrZXlyaW5nKTsKJiM0MzsJCWtleV9wdXQoa2V5cmluZyk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlicGZfa2V5cmluZyA9IGtleXJpbmc7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztsYXRlX2luaXRjYWxsKGJwZl9rZXlyaW5nX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jCmluZGV4IGUwMzZhZTIwYmY2YjkuLjU1OGU1MThhZDMxMDkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTIwOTcyLDYgJiM0MzsyMDk3MiwxNCBAQCBpbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLAogCXJldHVybiAwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBVcHBlciBib3VuZCBvbiB0aGUgUEtDUyM3IHNpZ25hdHVyZSBibG9iIHBhc3NlZCB3aXRoIGEgcHJvZ3JhbS4gQ29tZm9ydGFibHkKJiM0MzsgKiBhYm92ZSB0aGUgbGFyZ2VzdCBzaWduYXR1cmUgdGhlIGtlcm5lbCBjYW4gdmVyaWZ5LCBhbmQgZmFyIGJlbG93IGFueXRoaW5nCiYjNDM7ICogdGhhdCB3b3VsZCBtYWtlIHJlamVjdGluZyBhIGxvYWQgZXhwZW5zaXZlLiBEZWxpYmVyYXRlbHkgYSBmaXhlZCBudW1iZXIgc28KJiM0MzsgKiB0aGF0IHdoYXQgdGhlIHN5c2NhbGwgYWNjZXB0cyBkb2VzIG5vdCBkZXBlbmQgb24gUEFHRV9TSVpFLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFCSg2NCAqIDEwMjQpCiYjNDM7CiBzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpCiB7CiAJc3dpdGNoIChrZXlyaW5nX2lkKSB7CkBAIC0yMDk4MSw2ICYjNDM7MjA5ODksOCBAQCBzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpCiAJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZOwogCWNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6CiAJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07CiYjNDM7CWNhc2UgVkVSSUZZX1VTRV9CUEZfS0VZUklORzoKJiM0MzsJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlBGOwogCWRlZmF1bHQ6CiAJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjsKIAl9CkBAIC0yMTAwOSwyMSAmIzQzOzIxMDE5LDMyIEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCXU2NCBkYXRhX3N6OwogCWludCBlcnIgPSAwOwogCi0JLyoKLQkgKiBEb24mIzM5O3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLgotCSAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LgotCSAqLwogCWlmICghYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUgfHwKLQkgICAgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUgJmd0OyBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKQomIzQzOwkgICAgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUgJmd0OyBCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkUpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLSZndDtrZXlyaW5nX2lkKSA9PSAwKQomIzQzOwomIzQzOwlpZiAoIXN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItJmd0O2tleXJpbmdfaWQpKSB7CiAJCWtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQllbHNlCi0JCWtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci0mZ3Q7a2V5cmluZ19pZCwgMCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAoYXR0ci0mZ3Q7a2V5cmluZ19pZCAhPSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7CiYjNDM7CQkJaWYgKGJwZl9rZXlyaW5nX2VuZm9yY2VkKCkpIHsKJiM0MzsJCQkJdmVyYm9zZShlbnYsICYjMzQ7Y2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCwgdXNlIGJwZiBrZXlyaW5nXG4mIzM0Oyk7CiYjNDM7CQkJCXJldHVybiAtRVBFUk07CiYjNDM7CQkJfQomIzQzOwkJCWtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci0mZ3Q7a2V5cmluZ19pZCwgMCk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWtleSA9IGJwZl9sb29rdXBfa2V5cmluZygpOwomIzQzOwkJfQomIzQzOwl9CiAJaWYgKCFrZXkpIHsKLQkJdmVyYm9zZShlbnYsICYjMzQ7Y2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxuJiMzNDssCi0JCQlhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlpZiAoYXR0ci0mZ3Q7a2V5cmluZ19pZCA9PSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7CiYjNDM7CQkJdmVyYm9zZShlbnYsICYjMzQ7dGhlIGJwZiBrZXlyaW5nIGlzIGVtcHR5IG9yIGhhcyBub3QgYmVlbiByZXN0cmljdGVkXG4mIzM0Oyk7CiYjNDM7CQkJcmV0dXJuIC1FTk9LRVk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCXZlcmJvc2UoZW52LCAmIzM0O2Nhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcbiYjMzQ7LAomIzQzOwkJCQlhdHRyLSZndDtrZXlyaW5nX2lkKTsKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCX0KIAl9CiAKIAlzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCmluZGV4IDc4YjZlMGViYjg1ZDguLjkzMTVhMWRiMWY3YzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKQEAgLTU3LDcgJiM0Mzs1Nyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqdTY0X3RvX3B0cihfX3U2NCBwdHIpCiAJfSkKIAogI2RlZmluZSBFUlJfTUFYX0xFTgkxMDI0Ci0jZGVmaW5lIE1BWF9TSUdfU0laRQk0MDk2CiYjNDM7I2RlZmluZSBNQVhfU0lHX1NJWkUJMTYzODQKIAogI2RlZmluZSBCUEZfVEFHX0ZNVAkmIzM0OyUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCYjMzQ7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYwppbmRleCA4ODcyNmE2ZGI2ZDBlLi4xYjU1MDJmNDhhZGQwIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jCkBAIC0xMzAsNiAmIzQzOzEzMCw5IEBAIF9fdTMyIHJlZ2lzdGVyX3Nlc3Npb25fa2V5KGNvbnN0IGNoYXIgKmtleV9kZXJfcGF0aCkKIAogaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpCiB7CiYjNDM7CXVuc2lnbmVkIGludCBzaWduZXJfZmxhZ3MgPSBDTVNfTk9DRVJUUyB8IENNU19CSU5BUlkgfCBDTVNfTk9TTUlNRUNBUCB8CiYjNDM7CQkJCSAgICBDTVNfVVNFX0tFWUlEIHwgQ01TX05PQVRUUjsKJiM0MzsJY29uc3QgRVZQX01EICpjbXNfZGlnZXN0ID0gRVZQX3NoYTI1NigpOwogCUJJTyAqYmRfaW4gPSBOVUxMLCAqYmRfb3V0ID0gTlVMTDsKIAlFVlBfUEtFWSAqcHJpdmF0ZV9rZXkgPSBOVUxMOwogCUNNU19Db250ZW50SW5mbyAqY21zID0gTlVMTDsKQEAgLTE2Nyw2ICYjNDM7MTcwLDIxIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogCQlnb3RvIGNsZWFudXA7CiAJfQogCiYjNDM7I2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgJmd0Oz0gMHgzMDAwMDAwMEwgJmFtcDsmYW1wOyBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSICZsdDsgMHg0MDAwMDAwMEwKJiM0MzsJaWYgKEVWUF9QS0VZX2lzX2EocHJpdmF0ZV9rZXksICYjMzQ7TUwtRFNBLTQ0JiMzNDspIHx8CiYjNDM7CSAgICBFVlBfUEtFWV9pc19hKHByaXZhdGVfa2V5LCAmIzM0O01MLURTQS02NSYjMzQ7KSB8fAomIzQzOwkgICAgRVZQX1BLRVlfaXNfYShwcml2YXRlX2tleSwgJiMzNDtNTC1EU0EtODcmIzM0OykpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBNTC1EU0EgJiM0MzsgQ01TX05PQVRUUiBpcyBub3Qgc3VwcG9ydGVkIGJlZm9yZSBvcGVuc3NsLTQuMCwgc28KJiM0MzsJCSAqIGZhbGwgYmFjayB0byBzaWduZWRBdHRycy4gTUwtRFNBIGRvZXMgaXRzIG93biBoYXNoaW5nIGFuZAomIzQzOwkJICogaWdub3JlcyB0aGUgQ01TIGRpZ2VzdCwgZXhjZXB0IHdoZW4gc2lnbmVkQXR0cnMgYXJlIHVzZWQsCiYjNDM7CQkgKiB3aGVyZSBvbmx5IFNIQS01MTIgaXMgcGVybWl0dGVkLgomIzQzOwkJICovCiYjNDM7CQlzaWduZXJfZmxhZ3MgJmFtcDs9IH5DTVNfTk9BVFRSOwomIzQzOwkJY21zX2RpZ2VzdCA9IEVWUF9zaGE1MTIoKTsKJiM0MzsJfQomIzQzOyNlbmRpZgomIzQzOwogCWNtcyA9IENNU19zaWduKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCSAgICAgICBDTVNfTk9DRVJUUyB8IENNU19QQVJUSUFMIHwgQ01TX0JJTkFSWSB8IENNU19ERVRBQ0hFRCB8CiAJCQkgICAgICAgQ01TX1NUUkVBTSk7CkBAIC0xNzUsOSAmIzQzOzE5Myw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JaWYgKCFDTVNfYWRkMV9zaWduZXIoY21zLCB4NTA5LCBwcml2YXRlX2tleSwgRVZQX3NoYTI1NigpLAotCQkJICAgICBDTVNfTk9DRVJUUyB8IENNU19CSU5BUlkgfCBDTVNfTk9TTUlNRUNBUCB8Ci0JCQkgICAgIENNU19VU0VfS0VZSUQgfCBDTVNfTk9BVFRSKSkgewomIzQzOwlpZiAoIUNNU19hZGQxX3NpZ25lcihjbXMsIHg1MDksIHByaXZhdGVfa2V5LCBjbXNfZGlnZXN0LCBzaWduZXJfZmxhZ3MpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gY2xlYW51cDsKIAl9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUKaW5kZXggNWYxYTNiZmMwNTY5Zi4uMDViM2VlNjQyOTBmYSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZQpAQCAtNjYzLDcgJiM0Mzs2NjMsNyBAQCAkKFRSVU5ORVJfQlBGX0xTS0VMUyk6ICUubHNrZWwuaDogJS5icGYubyAkKEJQRlRPT0wpIHwgJChUUlVOTkVSX09VVFBVVCkKIAl9KSAmYW1wOyZhbXA7IFwKIAlybSAtZiAkJCgmbHQ7Oi5vPS5sbGlua2VkMS5vKSAkJCgmbHQ7Oi5vPS5sbGlua2VkMi5vKSAkJCgmbHQ7Oi5vPS5sbGlua2VkMy5vKQogCi0kKFRSVU5ORVJfQlBGX0xTS0VMU19TSUdORUQpOiAlLmxza2VsLmg6ICUuYnBmLm8gJChCUEZUT09MKSB8ICQoVFJVTk5FUl9PVVRQVVQpCiYjNDM7JChUUlVOTkVSX0JQRl9MU0tFTFNfU0lHTkVEKTogJS5sc2tlbC5oOiAlLmJwZi5vICQoQlBGVE9PTCkgJChWRVJJRklDQVRJT05fQ0VSVCkgfCAkKFRSVU5ORVJfT1VUUFVUKQogCSQoUSkkKGlmICQoUEVSTUlTU0lWRSksaWYgWyAhIC1mICQkJmx0OyBdOyB0aGVuCQkJXAogCQkkJChSTSkgJCRAOwkJCQkJCVwKIAkJcHJpbnRmICYjMzk7ICAlLTEycyAlc1xuJiMzOTsgJiMzOTtTS0lQLVNLRUwmIzM5OyAmIzM5OyQkKG5vdGRpciAkJEApJiMzOTsgMSZndDsmYW1wOzI7IFwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjJlYzE1MTE3YWJiNTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtNTEsNiAmIzQzOzUxLDggQEAgQ09ORklHX0lQVjZfU0VHNl9MV1RVTk5FTD15CiBDT05GSUdfSVBWNl9TSVQ9eQogQ09ORklHX0lQVjZfVFVOTkVMPXkKIENPTkZJR19LRVlTPXkKJiM0MztDT05GSUdfQ1JZUFRPX01MRFNBPXkKJiM0MztDT05GSUdfQ1JZUFRPX1NIQTUxMj15CiBDT05GSUdfTElSQz15CiBDT05GSUdfTElWRVBBVENIPXkKIENPTkZJR19MV1RVTk5FTD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMKaW5kZXggNzczODFkMzQ1NDM1Yy4uNjIwYTZkMjJhNzU5YyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYwpAQCAtMzIsMTEgJiM0MzszMiwyMCBAQCBlbnVtIHsKIAlCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZLAogCUJQRl9TSUdfS0VZUklOR19QTEFURk9STSwKIAlCUEZfU0lHX0tFWVJJTkdfVVNFUiwKJiM0MzsJQlBGX1NJR19LRVlSSU5HX0JQRiwKIH07CiAKLXN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLAotCQkgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsCi0JCSAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpCiYjNDM7I2RlZmluZSBCUEZfS0VZUklOR19CUEYJCTMKJiM0MzsKJiM0MzsvKiB2ZXJpZnlfc2lnX3NldHVwLnNoIGV4aXRzIHdpdGggdGhpcyB3aGVuIG9wZW5zc2wgY2Fubm90IGRvIE1MLURTQS4gKi8KJiM0MzsjZGVmaW5lIFNFVFVQX1NLSVAJCSgtNzcpCiYjNDM7CiYjNDM7LyogRklQUy0yMDQgTUwtRFNBLTg3IHNpZ25hdHVyZSBzaXplLCBzZWUgaW5jbHVkZS9jcnlwdG8vbWxkc2EuaC4gKi8KJiM0MzsjZGVmaW5lIE1MRFNBODdfU0lHTkFUVVJFX1NJWkUJNDYyNwomIzQzOwomIzQzO3N0YXRpYyBpbnQgbG9hZF9sb2FkZXJfbG9nKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCwKJiM0MzsJCQkgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCwKJiM0MzsJCQkgICBfX3UzMiBmZF9hcnJheV9jbnQsIGNoYXIgKmxvZ19idWYsIF9fdTMyIGxvZ19zeikKIHsKIAl1bmlvbiBicGZfYXR0ciBhdHRyOwogCWludCBmZDsKQEAgLTQ4LDE4ICYjNDM7NTcsMzEgQEAgc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsCiAJYXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NCgmIzM0O0R1YWwgQlNEL0dQTCYjMzQ7KTsKIAlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7CiAJYXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoJmFtcDttYXBfZmQpOwomIzQzOwlhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDsKIAlpZiAoc2lnKSB7CiAJCWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpOwogCQlhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6OwogCQlhdHRyLmtleXJpbmdfaWQgPSBrZXlyaW5nX2lkOwogCX0KLQlhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDsKJiM0MzsJaWYgKGxvZ19idWYpIHsKJiM0MzsJCWF0dHIubG9nX2xldmVsID0gMTsKJiM0MzsJCWF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7CiYjNDM7CQlhdHRyLmxvZ19zaXplID0gbG9nX3N6OwomIzQzOwl9CiAJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O19fbG9hZGVyLnByb2cmIzM0Oywgc2l6ZW9mKCYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7KSk7CiAJZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiAJCSAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKIAlyZXR1cm4gZmQgJmx0OyAwID8gLWVycm5vIDogZmQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCwKJiM0MzsJCSAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCwKJiM0MzsJCSAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbG9hZF9sb2FkZXJfbG9nKGluc25zLCBpbnNuc19zeiwgbWFwX2ZkLCBzaWcsIHNpZ19zeiwga2V5cmluZ19pZCwKJiM0MzsJCQkgICAgICAgZmRfYXJyYXlfY250LCBOVUxMLCAwKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwKIAkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgZGF0YV9zeiwKIAkJCSAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeiwKQEAgLTE1NiwxMiAmIzQzOzE3OCwzMCBAQCBzdGF0aWMgaW50IHJ1bl9zZXR1cChjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmRpcikKIAl9CiAJaWYgKHdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCkgJmx0OyAwKQogCQlyZXR1cm4gLWVycm5vOwotCXJldHVybiAoV0lGRVhJVEVEKHN0YXR1cykgJmFtcDsmYW1wOwotCQlXRVhJVFNUQVRVUyhzdGF0dXMpID09IDApID8gMCA6IC1FSU5WQUw7CiYjNDM7CWlmICghV0lGRVhJVEVEKHN0YXR1cykpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuIC1XRVhJVFNUQVRVUyhzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCi0JCSAgICB2b2lkICpzaWcsIF9fdTMyICpzaWdfc3opCiYjNDM7c3RhdGljIHZvaWQgZ2Vua2V5X2Rpcl9maW5pKGNvbnN0IGNoYXIgKmRpcikKJiM0Mzt7CiYjNDM7CXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IHsKJiM0MzsJCSYjMzQ7c2lnbmluZ19rZXkuZGVyJiMzNDssICYjMzQ7c2lnbmluZ19rZXkucGVtJiMzNDssICYjMzQ7eDUwOS5nZW5rZXkmIzM0OywKJiM0MzsJfTsKJiM0MzsJY2hhciBwYXRoW1BBVEhfTUFYXTsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CiYjNDM7CWlmICghZGlyKQomIzQzOwkJcmV0dXJuOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmaWxlcyk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvJXMmIzM0OywgZGlyLCBmaWxlc1tpXSk7CiYjNDM7CQl1bmxpbmsocGF0aCk7CiYjNDM7CX0KJiM0MzsJcm1kaXIoZGlyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzaWduX2J1Zl9kaWdlc3QoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbiwKJiM0MzsJCQkgICB2b2lkICpzaWcsIF9fdTMyICpzaWdfc3osIGNvbnN0IGNoYXIgKmRpZ2VzdCkKIHsKIAljaGFyIGRhdGFfdG1wbFtQQVRIX01BWF0sIGtleVtQQVRIX01BWF07CiAJY2hhciBzaWdwYXRoW1BBVEhfTUFYICYjNDM7IHNpemVvZigmIzM0Oy5wN3MmIzM0OyldOwpAQCAtMTc2LDYgJiM0MzsyMTYsNyBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCiAJZmQgPSBta3N0ZW1wKGRhdGFfdG1wbCk7CiAJaWYgKGZkICZsdDsgMCkKIAkJcmV0dXJuIC1lcnJubzsKJiM0MzsJc25wcmludGYoc2lncGF0aCwgc2l6ZW9mKHNpZ3BhdGgpLCAmIzM0OyVzLnA3cyYjMzQ7LCBkYXRhX3RtcGwpOwogCWlmICh3cml0ZShmZCwgYnVmLCBsZW4pICE9IChzc2l6ZV90KWxlbikgewogCQljbG9zZShmZCk7CiAJCXJldCA9IC1FSU87CkBAIC0xOTAsNyAmIzQzOzIzMSw3IEBAIHN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbiwKIAl9CiAJaWYgKHBpZCA9PSAwKSB7CiAJCXNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICYjMzQ7JXMvc2lnbmluZ19rZXkucGVtJiMzNDssIGRpcik7Ci0JCWV4ZWNscCgmIzM0Oy4vc2lnbi1maWxlJiMzNDssICYjMzQ7Li9zaWduLWZpbGUmIzM0OywgJiMzNDstZCYjMzQ7LCAmIzM0O3NoYTI1NiYjMzQ7LAomIzQzOwkJZXhlY2xwKCYjMzQ7Li9zaWduLWZpbGUmIzM0OywgJiMzNDsuL3NpZ24tZmlsZSYjMzQ7LCAmIzM0Oy1kJiMzNDssIGRpZ2VzdCwKIAkJICAgICAgIGtleSwga2V5LCBkYXRhX3RtcGwsIE5VTEwpOwogCQlleGl0KDEpOwogCX0KQEAgLTIwMCwzNCAmIzQzOzI0MSwzOCBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCiAJCWdvdG8gb3V0OwogCX0KIAotCXNucHJpbnRmKHNpZ3BhdGgsIHNpemVvZihzaWdwYXRoKSwgJiMzNDslcy5wN3MmIzM0OywgZGF0YV90bXBsKTsKIAlpZiAoc3RhdChzaWdwYXRoLCAmYW1wO3N0KSAmbHQ7IDApIHsKIAkJcmV0ID0gLWVycm5vOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKHN0LnN0X3NpemUgJmd0OyAob2ZmX3QpKnNpZ19zeikgewogCQlyZXQgPSAtRTJCSUc7Ci0JCWdvdG8gb3V0X3NpZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAlmZCA9IG9wZW4oc2lncGF0aCwgT19SRE9OTFkpOwogCWlmIChmZCAmbHQ7IDApIHsKIAkJcmV0ID0gLWVycm5vOwotCQlnb3RvIG91dF9zaWc7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAJaWYgKHJlYWQoZmQsIHNpZywgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSkgewogCQljbG9zZShmZCk7CiAJCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0X3NpZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAljbG9zZShmZCk7CiAJKnNpZ19zeiA9IHN0LnN0X3NpemU7Ci1vdXRfc2lnOgotCXVubGluayhzaWdwYXRoKTsKIG91dDoKJiM0MzsJdW5saW5rKHNpZ3BhdGgpOwogCXVubGluayhkYXRhX3RtcGwpOwogCXJldHVybiByZXQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCiYjNDM7CQkgICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6KQomIzQzO3sKJiM0MzsJcmV0dXJuIHNpZ25fYnVmX2RpZ2VzdChkaXIsIGJ1ZiwgbGVuLCBzaWcsIHNpZ19zeiwgJiMzNDtzaGEyNTYmIzM0Oyk7CiYjNDM7fQomIzQzOwogc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7CiAJc3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlciAqc2tlbDsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzIGdvcHRzOwpAQCAtNDU3LDcgJiM0Mzs1MDIsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlyZXR1cm47Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTUyOSw3ICYjNDM7NTc0LDYgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyh2b2lkKQogCXN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9OwogCWNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9OwogCXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKLQl1bmlvbiBicGZfYXR0ciBhdHRyOwogCWludCBmZDsKIAogCWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpID09IDApIHsKQEAgLTUzOCwyMiAmIzQzOzU4Miw5IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZCkKIAkJICogZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSB2ZXJpZmllciBsb2cuIEEgcHJlc2VudC1idXQtCiAJCSAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LgogCQkgKi8KLQkJbWVtc2V0KCZhbXA7YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKLQkJYXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7Ci0JCWF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGYuZ29wdHMuaW5zbnMpOwotCQlhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwotCQlhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwotCQlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7Ci0JCWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChqdW5rKTsKLQkJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpemVvZihqdW5rKTsKLQkJYXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HOwotCQlhdHRyLmxvZ19sZXZlbCA9IDE7Ci0JCWF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7Ci0JCWF0dHIubG9nX3NpemUgPSBzaXplb2YobG9nX2J1Zik7Ci0JCW1lbWNweShhdHRyLnByb2dfbmFtZSwgJiMzNDtfX2xvYWRlci5wcm9nJiMzNDssIHNpemVvZigmIzM0O19fbG9hZGVyLnByb2cmIzM0OykpOwotCi0JCWZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAotCQkJICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwomIzQzOwkJZmQgPSBsb2FkX2xvYWRlcl9sb2coZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssCiYjNDM7CQkJCSAgICAgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDAsCiYjNDM7CQkJCSAgICAgbG9nX2J1Ziwgc2l6ZW9mKGxvZ19idWYpKTsKIAkJQVNTRVJUX0xUKGZkLCAwLCAmIzM0O2ludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWQmIzM0Oyk7CiAJCWlmIChmZCAmZ3Q7PSAwKQogCQkJY2xvc2UoZmQpOwpAQCAtNTcxLDggJiM0Mzs2MDIsOSBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfdG9vX2xhcmdlKHZvaWQpCiAKIAlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSA9PSAwKSB7CiAJCS8qCi0JCSAqIHNpZ25hdHVyZV9zaXplIGJleW9uZCB0aGUga2VybmVsJiMzOTtzIGJvdW5kIChLTUFMTE9DX01BWF9DQUNIRV9TSVpFKQotCQkgKiBpcyByZWplY3RlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyByZWFkLgomIzQzOwkJICogc2lnbmF0dXJlX3NpemUgYmV5b25kIHRoZSBrZXJuZWwmIzM5O3MgYm91bmQKJiM0MzsJCSAqIChCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkUpIGlzIHJlamVjdGVkIGJlZm9yZSB0aGUgYnVmZmVyCiYjNDM7CQkgKiBpcyByZWFkLgogCQkgKi8KIAkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuaywKIAkJCQkgNjQgJmx0OyZsdDsgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7CkBAIC02MjYsNiAmIzQzOzY1OCwyNjggQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2JhZF9rZXlyaW5nKHZvaWQpCiAJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKIH0KIAomIzQzO3N0YXRpYyBib29sIGtleXJpbmdfdW5zZWFsZWRfYm9vdCh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciB2YWwgPSAwOwomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWZkID0gb3BlbigmIzM0Oy9zeXMvbW9kdWxlL2JwZi9wYXJhbWV0ZXJzL2tleXJpbmdfdW5zZWFsZWQmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDt2YWwsIDEpICE9IDEpCiYjNDM7CQl2YWwgPSAwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiB2YWwgPT0gJiMzOTtZJiMzOTsgfHwgdmFsID09ICYjMzk7MSYjMzk7OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9rZXlyaW5nX2xvb2t1cChpbnQgKm5yX2tleXMpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbNTEyXSwgdHlwZVszMl0sIGRlc2NbNjRdOwomIzQzOwlpbnQgc2VyaWFsID0gLUVOT0VOVDsKJiM0MzsJRklMRSAqZjsKJiM0MzsKJiM0MzsJZiA9IGZvcGVuKCYjMzQ7L3Byb2Mva2V5cyYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWlmICghZikKJiM0MzsJCXJldHVybiAtZXJybm87CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7CiYjNDM7CQl1bnNpZ25lZCBpbnQgaGV4OwomIzQzOwkJY2hhciAqc3VtOwomIzQzOwomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyV4ICUqcyAlKnMgJSpzICUqcyAlKnMgJSpzICUzMXMgJTYzcyYjMzQ7LAomIzQzOwkJCSAgICZhbXA7aGV4LCB0eXBlLCBkZXNjKSAhPSAzKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKHN0cmNtcCh0eXBlLCAmIzM0O2tleXJpbmcmIzM0OykgfHwgc3RyY21wKGRlc2MsICYjMzQ7LmJwZjomIzM0OykpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlzZXJpYWwgPSAoaW50KWhleDsKJiM0MzsJCWlmIChucl9rZXlzKSB7CiYjNDM7CQkJc3VtID0gc3Ryc3RyKGxpbmUsICYjMzQ7LmJwZjogJiMzNDspOwomIzQzOwkJCSpucl9rZXlzID0gIXN1bSB8fCAhc3RybmNtcChzdW0gJiM0MzsgNiwgJiMzNDtlbXB0eSYjMzQ7LCA1KSA/CiYjNDM7CQkJCSAgIDAgOiBhdG9pKHN1bSAmIzQzOyA2KTsKJiM0MzsJCX0KJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CWZjbG9zZShmKTsKJiM0MzsJcmV0dXJuIHNlcmlhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvbmcga2V5Y3RsX3JldChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gc3lzY2FsbChfX05SX2tleWN0bCwgY21kLCBhcmcyLCBhcmczKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldCAmbHQ7IDAgPyAtZXJybm8gOiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2hhdCB0aGUgYnBmIGtleXJpbmcgc3RpbGwgbmVlZHMgb25jZSBpdCBnb3QgcHJvdmlzaW9uZWQ6IEtFWV9QT1NfU0VBUkNICiYjNDM7ICogZm9yIHRoZSBpbi1rZXJuZWwgc2VhcmNoIGR1cmluZyB2ZXJpZmljYXRpb24sIGFuZCB0aGUgdXNlciB2aWV3L3JlYWQgYml0cwomIzQzOyAqIHNvIGl0IHN0YXlzIHZpc2libGUgaW4gL3Byb2Mva2V5cywgcmVzdCBpcyBkcm9wcGVkIHNvIHRoZSBlbnJvbGxlZCBpcwomIzQzOyAqIHRoZXJlZm9yZSBmaW5hbC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEJQRl9LRVlSSU5HX1BFUk1fTE9DS0VECQkweDA4MDMwMDAwCiYjNDM7LyogV2hhdCBicGZfa2V5cmluZ19pbml0KCkgZ3JhbnRzIGF0IGJvb3QuICovCiYjNDM7I2RlZmluZSBCUEZfS0VZUklOR19QRVJNX0lOSVRJQUwJMHgwODJmMDAwMAomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGJwZl9rZXlyaW5nX3NlYWxlZCh2b2lkKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7fTsKJiM0MzsJc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwomIzQzOwlpbnQgc2VyaWFsLCBrZXksIGZkOwomIzQzOwomIzQzOwlpZiAoa2V5cmluZ191bnNlYWxlZF9ib290KCkpIHsKJiM0MzsJCXByaW50ZigmIzM0OyVzOlNLSVA6dGhlIGJwZiBrZXlyaW5nIHdhcyB1bnNlYWxlZCBhdCBib290XG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CXNlcmlhbCA9IGJwZl9rZXlyaW5nX2xvb2t1cChOVUxMKTsKJiM0MzsJaWYgKHNlcmlhbCAmZ3Q7PSAwKSB7CiYjNDM7CQlrZXkgPSBzeXNjYWxsKF9fTlJfYWRkX2tleSwgJiMzNDt1c2VyJiMzNDssICYjMzQ7c2VhbHByb2JlJiMzNDssICYjMzQ7eCYjMzQ7LCAxLCBzZXJpYWwpOwomIzQzOwkJaWYgKGtleSAmZ3Q7PSAwKQomIzQzOwkJCXN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9VTkxJTkssIGtleSwgc2VyaWFsKTsKJiM0MzsJCUFTU0VSVF9FUShrZXkgJmx0OyAwID8gLWVycm5vIDogMCwgLUVQRVJNLAomIzQzOwkJCSAgJiMzNDtub3RoaW5nIGxpbmtzIGludG8gYSBzZWFsZWQga2V5cmluZyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSA9PSAwKSB7CiYjNDM7CQlmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLAomIzQzOwkJCQkgc2l6ZW9mKGp1bmspLCBCUEZfS0VZUklOR19CUEYsIDApOwomIzQzOwkJQVNTRVJUX0VRKGZkLCAtRU5PS0VZLCAmIzM0O3NlYWxlZCBicGYga2V5cmluZyByZWplY3RlZCYjMzQ7KTsKJiM0MzsJCWlmIChmZCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkKTsKJiM0MzsJfQomIzQzOwlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRyeV9sb2FkKGNvbnN0IHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYsIGNvbnN0IHZvaWQgKnNpZywKJiM0MzsJCSAgICBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsIGNoYXIgKmxvZ19idWYsIF9fdTMyIGxvZ19zeikKJiM0Mzt7CiYjNDM7CWludCBtYXBfZmQsIHByb2dfZmQ7CiYjNDM7CiYjNDM7CW1hcF9mZCA9IHNldHVwX21ldGFfbWFwKGYpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bWV0YV9tYXAmIzM0OykpCiYjNDM7CQlyZXR1cm4gbWFwX2ZkOwomIzQzOwlwcm9nX2ZkID0gbG9hZF9sb2FkZXJfbG9nKGYtJmd0O2dvcHRzLmluc25zLCBmLSZndDtnb3B0cy5pbnNuc19zeiwgbWFwX2ZkLAomIzQzOwkJCQkgIHNpZywgc2lnX3N6LCBrZXlyaW5nX2lkLCAxLCBsb2dfYnVmLCBsb2dfc3opOwomIzQzOwljbG9zZShtYXBfZmQpOwomIzQzOwlpZiAocHJvZ19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UocHJvZ19mZCk7CiYjNDM7CXJldHVybiBwcm9nX2ZkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoaXMgbmVlZHMgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MSBvbiB0aGUgZ3Vlc3Qga2VybmVsIGNvbW1hbmQgbGluZSwgd2hpY2gKJiM0MzsgKiB2bXRlc3Quc2ggY2FuIHBhc3MgdmlhIEtFUk5FTF9DTURMSU5FX0VYVFJBLiBUaGVyZSBpcyBubyB3YXkgdG8gdW5zZWFsIHRoZQomIzQzOyAqIGtleXJpbmcgZnJvbSBoZXJlLCBzbyB3aXRob3V0IGl0IHRoZSB0ZXN0IHNraXBzLiBJdCBhbHNvIG9ubHkgd29ya3Mgb25jZQomIzQzOyAqIHBlciBib290LCBhcyByZXN0cmljdGluZyBhIGtleXJpbmcgY2Fubm90IGJlIHVuZG9uZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBicGZfa2V5cmluZ19wcm92aXNpb25lZCh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBkaXJfdG1wbFtdID0gJiMzNDsvdG1wL2JwZmtleXJpbmdYWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBiYWRfdG1wbFtdID0gJiMzNDsvdG1wL2JwZmtleXJpbmdiYWRYWFhYWFgmIzM0OzsKJiM0MzsJX191OCAqc2lnID0gTlVMTCwgKmJhZCA9IE5VTEwsICpidWYgPSBOVUxMOwomIzQzOwlpbnQgc2VyaWFsLCBlcnI7CiYjNDM7CWludCBucl9rZXlzID0gMCwgZGVyX2ZkID0gLTE7CiYjNDM7CXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKJiM0MzsJX191MzIgc2lnX3N6ID0gODE5MiwgYmFkX3N6OwomIzQzOwlib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlOwomIzQzOwljaGFyICpkaXIsICpiYWRfZGlyID0gTlVMTDsKJiM0MzsJY2hhciBsb2dfYnVmWzEwMjRdID0ge307CiYjNDM7CWNoYXIgcGF0aFtQQVRIX01BWF07CiYjNDM7CV9fdTggZGVyWzQwOTZdOwomIzQzOwlzc2l6ZV90IGRlcl9zejsKJiM0MzsKJiM0MzsJc2VyaWFsID0gYnBmX2tleXJpbmdfbG9va3VwKCZhbXA7bnJfa2V5cyk7CiYjNDM7CWlmIChzZXJpYWwgJmx0OyAwKSB7CiYjNDM7CQlwcmludGYoJiMzNDslczpTS0lQOm5vIGJwZiBrZXlyaW5nIChuZWVkcyBDT05GSUdfS0VZUylcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQl0ZXN0X19za2lwKCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKG5yX2tleXMgIT0gMCkgewomIzQzOwkJcHJpbnRmKCYjMzQ7JXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgaGFzIGFscmVhZHkgYmVlbiBwcm92aXNpb25lZFxuJiMzNDssCiYjNDM7CQkgICAgICAgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCAmIzM0O21rZHRlbXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O2dlbmtleSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAgZ2Vua2V5JiMzNDspKQomIzQzOwkJZ290byBybWRpcjsKJiM0MzsKJiM0MzsJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0OyVzL3NpZ25pbmdfa2V5LmRlciYjMzQ7LCBkaXIpOwomIzQzOwlkZXJfZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZGVyX2ZkLCAmIzM0O29wZW4gc2lnbmluZ19rZXkuZGVyJiMzNDspKQomIzQzOwkJZ290byBybWRpcjsKJiM0MzsJZGVyX3N6ID0gcmVhZChkZXJfZmQsIGRlciwgc2l6ZW9mKGRlcikpOwomIzQzOwljbG9zZShkZXJfZmQpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChkZXJfc3osIDAsICYjMzQ7cmVhZCBzaWduaW5nX2tleS5kZXImIzM0OykpCiYjNDM7CQlnb3RvIHJtZGlyOwomIzQzOwomIzQzOwllcnIgPSBzeXNjYWxsKF9fTlJfYWRkX2tleSwgJiMzNDthc3ltbWV0cmljJiMzNDssICYjMzQ7JiMzNDssIGRlciwgKHNpemVfdClkZXJfc3osCiYjNDM7CQkgICAgICBzZXJpYWwpOwomIzQzOwlpZiAoZXJyICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vID09IEVQRVJNKSB7CiYjNDM7CQlwcmludGYoJiMzNDslczpTS0lQOnRoZSBicGYga2V5cmluZyBpcyBzZWFsZWQsIG5lZWQgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MVxuJiMzNDssCiYjNDM7CQkgICAgICAgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJZ290byBybWRpcjsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9HRShlcnIsIDAsICYjMzQ7YWRkIHRoZSBzaWduaW5nIGtleSB0byB0aGUgYnBmIGtleXJpbmcmIzM0OykpCiYjNDM7CQlnb3RvIHJtZGlyOwomIzQzOwomIzQzOwlzaWcgPSBtYWxsb2Moc2lnX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNpZywgJiMzNDtzaWcgYnVmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWhhdmVfZml4dHVyZSA9IHRydWU7CiYjNDM7CWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpICE9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCAmIzM0O3NpZ25idWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7CiYjNDM7CW1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3osIHNpZywKJiM0MzsJCQkJJmFtcDtzaWdfc3opLCAmIzM0O3NpZ24gaW5zbnN8fG1ldGFkYXRhJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLCAtRU5PS0VZLAomIzQzOwkJICAmIzM0O3VucmVzdHJpY3RlZCBrZXlyaW5nIHN0aWxsIG5vdCBjb25zdWx0ZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIE5VTEwsIDApLAomIzQzOwkJICAtRVBFUk0sICYjMzQ7Y2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCBiZWZvcmUgcHJvdmlzaW9uaW5nJiMzNDspOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfUkVTVFJJQ1RfS0VZUklORywgc2VyaWFsLAomIzQzOwkJCSAgICAgICBOVUxMLCBOVUxMKSwgJiMzNDtyZXN0cmljdCBicGYga2V5cmluZyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRCh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLAomIzQzOwkJCSAgJiMzNDtsb2FkIHNpZ25lZCBieSBhIGtleSBpbiB0aGUgLmJwZiBrZXlyaW5nJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWJhZF9kaXIgPSBta2R0ZW1wKGJhZF90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJhZF9kaXIsICYjMzQ7bWtkdGVtcCB1bmVucm9sbGVkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O2dlbmtleSYjMzQ7LCBiYWRfZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwIGdlbmtleSB1bmVucm9sbGVkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWJhZF9zeiA9IDgxOTI7CiYjNDM7CWJhZCA9IG1hbGxvYyhiYWRfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYmFkLCAmIzM0O2JhZCBzaWcgYnVmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGJhZF9kaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3osIGJhZCwKJiM0MzsJCQkJJmFtcDtiYWRfc3opLCAmIzM0O3NpZ24gd2l0aCBhbiB1bmVucm9sbGVkIGtleSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEodHJ5X2xvYWQoJmFtcDtmLCBiYWQsIGJhZF9zeiwgQlBGX0tFWVJJTkdfQlBGLCBsb2dfYnVmLAomIzQzOwkJCSAgIHNpemVvZihsb2dfYnVmKSksIC1FTk9LRVksCiYjNDM7CQkgICYjMzQ7a2V5IG91dHNpZGUgdGhlIGJwZiBrZXlyaW5nIHJlZnVzZWQmIzM0Oyk7CiYjNDM7CUFTU0VSVF9IQVNfU1VCU1RSKGxvZ19idWYsICYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQmIzM0OywKJiM0MzsJCQkgICYjMzQ7dGhlIGJwZiBrZXlyaW5nIHdhcyBjb25zdWx0ZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CWYuYmxvYlswXSBePSAweGZmOwomIzQzOwllcnIgPSB0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApOwomIzQzOwlmLmJsb2JbMF0gXj0gMHhmZjsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgJiMzNDt0YW1wZXJlZCBtZXRhZGF0YSByZWZ1c2VkJiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfRVEodHJ5X2xvYWQoJmFtcDtmLCBzaWcsIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBOVUxMLCAwKSwKJiM0MzsJCSAgLUVQRVJNLCAmIzM0O2NhbGxlci1zdXBwbGllZCBrZXlyaW5nIHJlZnVzZWQgb25jZSAuYnBmIGlzIGluIHVzZSYjMzQ7KTsKJiM0MzsKJiM0MzsJZXJyID0ga2V5Y3RsX3JldChLRVlDVExfVU5MSU5LLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIHNlcmlhbCk7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FTk9FTlQsICYjMzQ7a2V5cmluZyB3cml0YWJsZSB3aGlsZSB0aGUgdXNlciBiaXRzIGFyZSB0aGVyZSYjMzQ7KTsKJiM0MzsKJiM0MzsJZXJyID0ga2V5Y3RsX3JldChLRVlDVExfU0VUUEVSTSwgc2VyaWFsLCBCUEZfS0VZUklOR19QRVJNX0xPQ0tFRCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtkcm9wIHRoZSB1c2VyIGJpdHMgb24gdGhlIGJwZiBrZXlyaW5nJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9PS19GRCh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLAomIzQzOwkJICAgICAmIzM0O2xvYWQgc3RpbGwgdmVyaWZpZWQgYWdhaW5zdCB0aGUgbG9ja2VkIGtleXJpbmcmIzM0Oyk7CiYjNDM7CiYjNDM7CWVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1VOTElOSywgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBzZXJpYWwpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCAmIzM0O3VubGluayByZWZ1c2VkJiMzNDspOwomIzQzOwllcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9DTEVBUiwgc2VyaWFsLCAwKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgJiMzNDtjbGVhciByZWZ1c2VkJiMzNDspOwomIzQzOwllcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9SRVZPS0UsIHNlcmlhbCwgMCk7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FQUNDRVMsICYjMzQ7cmV2b2tlIHJlZnVzZWQmIzM0Oyk7CiYjNDM7CWVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX0lOVkFMSURBVEUsIHNlcmlhbCwgMCk7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FQUNDRVMsICYjMzQ7aW52YWxpZGF0ZSByZWZ1c2VkJiMzNDspOwomIzQzOwllcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRfVElNRU9VVCwgc2VyaWFsLCAxKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgJiMzNDt0aW1lb3V0IHJlZnVzZWQmIzM0Oyk7CiYjNDM7CWVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1NFVFBFUk0sIHNlcmlhbCwgQlBGX0tFWVJJTkdfUEVSTV9JTklUSUFMKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgJiMzNDt0aGUgYml0cyBjYW5ub3QgYmUgZ3JhbnRlZCBiYWNrJiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoYnBmX2tleXJpbmdfbG9va3VwKCZhbXA7bnJfa2V5cyksIHNlcmlhbCwgJiMzNDtrZXlyaW5nIHN0aWxsIHRoZXJlJiMzNDspOwomIzQzOwlBU1NFUlRfRVEobnJfa2V5cywgMSwgJiMzNDt0aGUgZW5yb2xsZWQga2V5IHN1cnZpdmVkJiMzNDspOwomIzQzO291dDoKJiM0MzsJaWYgKGhhdmVfZml4dHVyZSkKJiM0MzsJCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiYjNDM7CWdlbmtleV9kaXJfZmluaShiYWRfZGlyKTsKJiM0MzsJZnJlZShidWYpOwomIzQzOwlmcmVlKGJhZCk7CiYjNDM7CWZyZWUoc2lnKTsKJiM0MztybWRpcjoKJiM0MzsJZ2Vua2V5X2Rpcl9maW5pKGRpcik7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgc2lnbmVkIGxvYWRlciBtdXN0IGlnbm9yZSBjdHgtc3VwcGxpZWQgbWFwIGRpbWVuc2lvbnM6IHRoZSBob3N0IGNhbm5vdAogICogcmVzaXplIGEgc2lnbmVkIHByb2dyYW0mIzM5O3MgbWFwcyB2aWEgdGhlIGxvYWRlciBjdHguIERyaXZlIGEgb25lLW1hcCBwcm9ncmFtCkBAIC04MzEsNyAmIzQzOzExMjUsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNucyh2b2lkKQogCWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwogCWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKIAkJcmV0dXJuOwotCWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cC1yc2EmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiAJCXJtZGlyKGRpcik7CiAJCXJldHVybjsKIAl9CkBAIC05MzEsNyAmIzQzOzEyMjUsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19tZXRhZGF0YSh2b2lkKQogCWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwogCWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKIAkJcmV0dXJuOwotCWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cC1yc2EmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiAJCXJtZGlyKGRpcik7CiAJCXJldHVybjsKIAl9CkBAIC0xMjY3LDcgJiM0MzsxNTYxLDcgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlnb3RvIG91dDsKLQlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAtcnNhJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewogCQlybWRpcihkaXIpOwogCQlkaXIgPSBOVUxMOwogCQlnb3RvIG91dDsKQEAgLTE0NTAsNyAmIzQzOzE3NDQsNyBAQCBzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKQogCWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwogCWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKIAkJcmV0dXJuOwotCWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cC1yc2EmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiAJCXJtZGlyKGRpcik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTI0LDYgJiM0MzsxODE4LDg5IEBAIHN0YXRpYyB2b2lkIGxvYWR0aW1lX3dpdGhfbWFwKHZvaWQpCiAJdGVzdF9zaWduZWRfbG9hZGVyX21hcF9fZGVzdHJveShza2VsKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogRW5kLXRvLWVuZCBzaWduZWQgbG9hZCB3aXRoIGEgcG9zdC1xdWFudHVtIGtleS4gTUwtRFNBIChGSVBTLTIwNCkgaXMgd2lyZWQKJiM0MzsgKiB0aHJvdWdoIHRoZSBYLjUwOSBhbmQgUEtDUyM3IHBhcnNlcnMsIGFuZCBCUEYgcmVhY2hlcyB0aGVtIHZpYQomIzQzOyAqIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSB3aXRob3V0IGtub3dpbmcgdGhlIGFsZ29yaXRobSwgc28gYW4gTUwtRFNBIGtleSBpbgomIzQzOyAqIHRoZSBrZXlyaW5nIHNob3VsZCB2ZXJpZnkgYW4gTUwtRFNBIHNpZ25lZCBwcm9ncmFtIHdpdGggbm8gQlBGLXNpZGUgd29yay4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBtbGRzYV9zaWduZWRfbG9hZCh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBkaXJfdG1wbFtdID0gJiMzNDsvdG1wL2JwZm1sZHNhWFhYWFhYJiMzNDs7CiYjNDM7CWludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xLCBlcnI7CiYjNDM7CV9fdTggKnNpZyA9IE5VTEwsICpidWYgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7CiYjNDM7CWJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7CiYjNDM7CV9fdTMyIHNpZ19zeiA9IDE2Mzg0OwomIzQzOwljaGFyICpkaXI7CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBydW5fc2V0dXAoJiMzNDtzZXR1cC1tbGRzYSYjMzQ7LCBkaXIpOwomIzQzOwlpZiAoZXJyID09IFNFVFVQX1NLSVApIHsKJiM0MzsJCXByaW50ZigmIzM0OyVzOlNLSVA6b3BlbnNzbCBoYXMgbm8gTUwtRFNBIHN1cHBvcnQgKG5lZWRzIDMuNSYjNDM7KVxuJiMzNDssCiYjNDM7CQkgICAgICAgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJZ2Vua2V5X2Rpcl9maW5pKGRpcik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAgc2V0dXAtbWxkc2EmIzM0OykpIHsKJiM0MzsJCWdlbmtleV9kaXJfZmluaShkaXIpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNpZyA9IG1hbGxvYyhzaWdfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2lnLCAmIzM0O3NpZyBidWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaGF2ZV9maXh0dXJlID0gdHJ1ZTsKJiM0MzsJaWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KCZhbXA7ZikgIT0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWYgPSBtYWxsb2MoKHNpemVfdClmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeik7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidWYsICYjMzQ7c2lnbmJ1ZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwltZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTsKJiM0MzsJbWVtY3B5KGJ1ZiAmIzQzOyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UgaXRzZWxmLCBidXQgb3BlbnNzbCBiZWZvcmUgNC4wIGNhbm5vdAomIzQzOwkgKiBwcm9kdWNlIGEgQ01TIG1lc3NhZ2Ugd2l0aG91dCBzaWduZWRBdHRycyBmb3IgaXQsIGFuZCB3aXRoIHRob3NlIGluCiYjNDM7CSAqIHBsYXkgb25seSBTSEEtNTEyIGlzIHBlcm1pdHRlZCBmb3IgdGhlIG1lc3NhZ2VEaWdlc3QgYXR0cmlidXRlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWZfZGlnZXN0KGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeiwKJiM0MzsJCQkJICAgICAgIHNpZywgJmFtcDtzaWdfc3osICYjMzQ7c2hhNTEyJiMzNDspLAomIzQzOwkJICAgICAgICYjMzQ7c2lnbiBpbnNuc3x8bWV0YWRhdGEgd2l0aCBNTC1EU0EmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogR3VhcmQgYWdhaW5zdCB0aGUgc2V0dXAgc2lsZW50bHkgaGFuZGluZyBiYWNrIHNvbWUgb3RoZXIga2V5IHR5cGU6CiYjNDM7CSAqIGFuIFJTQSBvciBFQ0RTQSBzaWduYXR1cmUgaXMgYSBmZXcgaHVuZHJlZCBieXRlcywgd2hlcmUgYW4gTUwtRFNBLTg3CiYjNDM7CSAqIG9uZSBjYW5ub3QgYmUgc21hbGxlciB0aGFuIHRoZSByYXcgc2lnbmF0dXJlIGl0IGNhcnJpZXMuCiYjNDM7CSAqLwomIzQzOwlBU1NFUlRfR1Qoc2lnX3N6LCBNTERTQTg3X1NJR05BVFVSRV9TSVpFLCAmIzM0O01MLURTQS04NyBzaWduYXR1cmUgc2l6ZSYjMzQ7KTsKJiM0MzsKJiM0MzsJbWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoJmFtcDtmKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCAmIzM0O21ldGFfbWFwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CXByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZywKJiM0MzsJCQkgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7CiYjNDM7CUFTU0VSVF9PS19GRChwcm9nX2ZkLCAmIzM0O01MLURTQSBzaWduZWQgbG9hZGVyIGxvYWQmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlpZiAocHJvZ19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UocHJvZ19mZCk7CiYjNDM7CWlmIChtYXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG1hcF9mZCk7CiYjNDM7CWlmIChoYXZlX2ZpeHR1cmUpCiYjNDM7CQlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwomIzQzOwlmcmVlKGJ1Zik7CiYjNDM7CWZyZWUoc2lnKTsKJiM0MzsJcnVuX3NldHVwKCYjMzQ7Y2xlYW51cCYjMzQ7LCBkaXIpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBBIHNpZ25lZCBwcm9ncmFtIG5lZWQgbm90IGJpbmQgYW55IG1hcC4gQSBwbGFpbiBCUEZfUFJPR19UWVBFX1NZU0NBTEwKICAqIHByb2dyYW0gd2l0aCBubyBmZF9hcnJheSBpcyBzaWduZWQgb3ZlciBpdHMgaW5zdHJ1Y3Rpb25zIGFsb25lOiB0aGUga2VybmVsCkBAIC0xNTQ4LDcgJiM0MzsxOTI1LDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX25vX2ZkX2FycmF5KHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlyZXR1cm47Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2MTksNyAmIzQzOzE5OTYsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbWFwX2J5X2ZkX3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlnb3RvIG91dF9tYXA7Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJZ290byBvdXRfbWFwOwogCX0KQEAgLTE2ODEsNyAmIzQzOzIwNTgsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlnb3RvIG91dF9tYXA7Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJZ290byBvdXRfbWFwOwogCX0KQEAgLTE3MzUsNyAmIzQzOzIxMTIsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlyZXR1cm47Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE3NzksNiAmIzQzOzIxNTYsMTEgQEAgc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKQogCiB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKQogewomIzQzOwlpZiAoa2V5cmluZ191bnNlYWxlZF9ib290KCkpIHsKJiM0MzsJCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YnBmX2tleXJpbmdfcHJvdmlzaW9uZWQmIzM0OykpCiYjNDM7CQkJYnBmX2tleXJpbmdfcHJvdmlzaW9uZWQoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQogCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bG9hZHRpbWVfbm9fbWFwJiMzNDspKQogCQlsb2FkdGltZV9ub19tYXAoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xvYWR0aW1lX3dpdGhfbWFwJiMzNDspKQpAQCAtMTgwNSw2ICYjNDM7MjE4NywxMCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKQogCQlzaWduYXR1cmVfemVyb19zaXplKCk7CiAJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduYXR1cmVfYmFkX2tleXJpbmcmIzM0OykpCiAJCXNpZ25hdHVyZV9iYWRfa2V5cmluZygpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2JwZl9rZXlyaW5nX3NlYWxlZCYjMzQ7KSkKJiM0MzsJCWJwZl9rZXlyaW5nX3NlYWxlZCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21sZHNhX3NpZ25lZF9sb2FkJiMzNDspKQomIzQzOwkJbWxkc2Ffc2lnbmVkX2xvYWQoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21ldGFkYXRhX2N0eF9tYXhfZW50cmllc19pZ25vcmVkJiMzNDspKQogCQltZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCgpOwogCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWV0YWRhdGFfY3R4X2luaXRpYWxfdmFsdWVfaWdub3JlZCYjMzQ7KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYwppbmRleCBmMzI3ZmViOGUzOGMzLi4xMmIxNDZkMjA1ZDc1IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jCkBAIC0yNTcsNyAmIzQzOzI1Nyw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfdmVyaWZ5X3BrY3M3X3NpZ19mcm9tX21hcCh2b2lkKQogCWlmICghQVNTRVJUX09LX1BUUih0bXBfZGlyLCAmIzM0O21rZHRlbXAmIzM0OykpCiAJCXJldHVybjsKIAotCXJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCAmIzM0O3NldHVwJiMzNDspOwomIzQzOwlyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgJiMzNDtzZXR1cC1yc2EmIzM0Oyk7CiAJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O19ydW5fc2V0dXBfcHJvY2VzcyYjMzQ7KSkKIAkJZ290byBjbG9zZV9wcm9nOwogCkBAIC00NTgsNyAmIzQzOzQ1OCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfcGtjczdfc2lnX2ZzdmVyaXR5KHZvaWQpCiAJc25wcmludGYoZGF0YV9wYXRoLCBQQVRIX01BWCwgJiMzNDslcy9kYXRhLWZpbGUmIzM0OywgdG1wX2Rpcik7CiAJc25wcmludGYoc2lnX3BhdGgsIFBBVEhfTUFYLCAmIzM0OyVzL3NpZy1maWxlJiMzNDssIHRtcF9kaXIpOwogCi0JcmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsICYjMzQ7c2V0dXAmIzM0Oyk7CiYjNDM7CXJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCAmIzM0O3NldHVwLXJzYSYjMzQ7KTsKIAlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7X3J1bl9zZXR1cF9wcm9jZXNzJiMzNDspKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZlcmlmeV9zaWdfc2V0dXAuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaAppbmRleCAwOTE3OWZiNTUxZjA5Li4yNzM3YzFhMmJjZmQ2IDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaApAQCAtMjgsNyAmIzQzOzI4LDcgQEAgYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZAogCiB1c2FnZSgpCiB7Ci0JZWNobyAmIzM0O1VzYWdlOiAkMCAmbHQ7c2V0dXB8Y2xlYW51cCAmbHQ7ZXhpc3RpbmdfdG1wX2RpciZndDsmIzM0OwomIzQzOwllY2hvICYjMzQ7VXNhZ2U6ICQwICZsdDtzZXR1cC1yc2F8c2V0dXAtbWxkc2F8Y2xlYW51cCAmbHQ7ZXhpc3RpbmdfdG1wX2RpciZndDsmIzM0OwogCWV4aXQgMQogfQogCkBAIC00Nyw3ICYjNDM7NDcsNyBAQCBnZW5rZXkoKQogCQkke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAtb3V0Zm9ybSBkZXIKIH0KIAotc2V0dXAoKQomIzQzO3NldHVwX3JzYSgpCiB7CiAJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKIApAQCAtNTcsNiAmIzQzOzU3LDU3IEBAIHNldHVwKCkKIAlrZXljdGwgbGluayAka2V5X2lkICRrZXlyaW5nX2lkCiB9CiAKJiM0MzttbGRzYV9zdXBwb3J0ZWQoKQomIzQzO3sKJiM0MzsJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKJiM0MzsKJiM0MzsJZ2Vua2V5X21sZHNhICYjMzQ7JHt0bXBfZGlyfSYjMzQ7IHx8IHJldHVybiAxCiYjNDM7CTogJmd0OyAke3RtcF9kaXJ9L3Byb2JlCiYjNDM7CSMgU2FtZSBkaWdlc3QgYXMgdGhlIGNhbGxlciBzaWducyB3aXRoLCBzZWUgc2lnbl9idWZfZGlnZXN0KCkuCiYjNDM7CS4vc2lnbi1maWxlIC1kIHNoYTUxMiAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcCiYjNDM7CQkke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSAke3RtcF9kaXJ9L3Byb2JlIHx8IHJldHVybiAxCiYjNDM7CXJtIC1mICR7dG1wX2Rpcn0vcHJvYmUgJHt0bXBfZGlyfS9wcm9iZS5wN3MKJiM0Mzt9CiYjNDM7CiYjNDM7Z2Vua2V5X21sZHNhKCkKJiM0Mzt7CiYjNDM7CWxvY2FsIHRtcF9kaXI9JiMzNDskMSYjMzQ7CiYjNDM7CiYjNDM7CWVjaG8gJiMzNDske3g1MDlfZ2Vua2V5X2NvbnRlbnR9JiMzNDsgJmd0OyAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5CiYjNDM7CiYjNDM7CSMgTm8gLSZsdDtkaWdlc3QmZ3Q7IGhlcmU6IE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UgaXRzZWxmLCBhbmQgb3BlbnNzbAomIzQzOwkjIHJlamVjdHMgYW4gZXhwbGljaXQgZGlnZXN0IGZvciBpdC4KJiM0MzsJb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLWRheXMgMzY1MDAgXAomIzQzOwkJCS1iYXRjaCAteDUwOSAtbmV3a2V5IE1MLURTQS04NyBcCiYjNDM7CQkJLWNvbmZpZyAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5IFwKJiM0MzsJCQktb3V0Zm9ybSBQRU0gLW91dCAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcCiYjNDM7CQkJLWtleW91dCAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSAyJmd0OyZhbXA7MQomIzQzOwomIzQzOwlvcGVuc3NsIHg1MDkgLWluICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIC1vdXQgXAomIzQzOwkJJHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgLW91dGZvcm0gZGVyCiYjNDM7fQomIzQzOwomIzQzO21sZHNhX3NraXAoKQomIzQzO3sKJiM0MzsJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKJiM0MzsKJiM0MzsJcm0gLWYgJHt0bXBfZGlyfS94NTA5LmdlbmtleSAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcCiYjNDM7CQkke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAke3RtcF9kaXJ9L3Byb2JlIFwKJiM0MzsJCSR7dG1wX2Rpcn0vcHJvYmUucDdzCiYjNDM7CWV4aXQgNzcKJiM0Mzt9CiYjNDM7CiYjNDM7c2V0dXBfbWxkc2EoKQomIzQzO3sKJiM0MzsJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKJiM0MzsKJiM0MzsJbWxkc2Ffc3VwcG9ydGVkICYjMzQ7JHt0bXBfZGlyfSYjMzQ7IHx8IG1sZHNhX3NraXAgJiMzNDske3RtcF9kaXJ9JiMzNDsKJiM0MzsJa2V5X2lkPSQoY2F0ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkuZGVyIHwKJiM0MzsJCSBrZXljdGwgcGFkZCBhc3ltbWV0cmljIGVicGZfdGVzdGluZ19rZXkgQHMpCiYjNDM7CWtleXJpbmdfaWQ9JChrZXljdGwgbmV3cmluZyBlYnBmX3Rlc3Rpbmdfa2V5cmluZyBAcykKJiM0MzsJa2V5Y3RsIGxpbmsgJGtleV9pZCAka2V5cmluZ19pZAomIzQzO30KJiM0MzsKIGNsZWFudXAoKSB7CiAJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKIApAQCAtOTEsNyAmIzQzOzE0Miw3IEBAIGNhdGNoKCkKIAlsb2NhbCBleGl0X2NvZGU9JiMzNDskMSYjMzQ7CiAJbG9jYWwgbG9nX2ZpbGU9JiMzNDskMiYjMzQ7CiAKLQlpZiBbWyAmIzM0OyR7ZXhpdF9jb2RlfSYjMzQ7IC1uZSAwIF1dOyB0aGVuCiYjNDM7CWlmIFtbICYjMzQ7JHtleGl0X2NvZGV9JiMzNDsgLW5lIDAgJmFtcDsmYW1wOyAmIzM0OyR7ZXhpdF9jb2RlfSYjMzQ7IC1uZSA3NyBdXTsgdGhlbgogCQljYXQgJiMzNDske2xvZ19maWxlfSYjMzQ7ICZndDsmYW1wOzMKIAlmaQogCkBAIC0xMDgsOCAmIzQzOzE1OSwxMCBAQCBtYWluKCkKIAogCVtbICEgLWQgJiMzNDske3RtcF9kaXJ9JiMzNDsgXV0gJmFtcDsmYW1wOyBlY2hvICYjMzQ7RGlyZWN0b3J5ICR7dG1wX2Rpcn0gZG9lc24mIzM5O3QgZXhpc3QmIzM0OyAmYW1wOyZhbXA7IGV4aXQgMQogCi0JaWYgW1sgJiMzNDske2FjdGlvbn0mIzM0OyA9PSAmIzM0O3NldHVwJiMzNDsgXV07IHRoZW4KLQkJc2V0dXAgJiMzNDske3RtcF9kaXJ9JiMzNDsKJiM0MzsJaWYgW1sgJiMzNDske2FjdGlvbn0mIzM0OyA9PSAmIzM0O3NldHVwLXJzYSYjMzQ7IF1dOyB0aGVuCiYjNDM7CQlzZXR1cF9yc2EgJiMzNDske3RtcF9kaXJ9JiMzNDsKJiM0MzsJZWxpZiBbWyAmIzM0OyR7YWN0aW9ufSYjMzQ7ID09ICYjMzQ7c2V0dXAtbWxkc2EmIzM0OyBdXTsgdGhlbgomIzQzOwkJc2V0dXBfbWxkc2EgJiMzNDske3RtcF9kaXJ9JiMzNDsKIAllbGlmIFtbICYjMzQ7JHthY3Rpb259JiMzNDsgPT0gJiMzNDtnZW5rZXkmIzM0OyBdXTsgdGhlbgogCQlnZW5rZXkgJiMzNDske3RtcF9kaXJ9JiMzNDsKIAllbGlmIFtbICYjMzQ7JHthY3Rpb259JiMzNDsgPT0gJiMzNDtjbGVhbnVwJiMzNDsgXV07IHRoZW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdm10ZXN0LnNoCmluZGV4IDZhM2QwMjZkNzZiZDYuLmU3ZTBiNDE5YTBiODcgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2gKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaApAQCAtMTA3LDYgJiM0MzsxMDcsMTQgQEAgT3B0aW9uczoKIAktcykJCUluc3RlYWQgb2YgcG93ZXJpbmcgb2ZmIHRoZSBWTSwgc3RhcnQgYW4gaW50ZXJhY3RpdmUKIAkJCXNoZWxsLiBJZiAmbHQ7Y29tbWFuZCZndDsgaXMgc3BlY2lmaWVkLCB0aGUgc2hlbGwgcnVucyBhZnRlcgogCQkJdGhlIGNvbW1hbmQgZmluaXNoZXMgZXhlY3V0aW5nCiYjNDM7CiYjNDM7RW52aXJvbm1lbnQgdmFyaWFibGVzOgomIzQzOwomIzQzOwlLRVJORUxfQ01ETElORV9FWFRSQQomIzQzOwkJCUV4dHJhIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhlIGd1ZXN0IGtlcm5lbCBjb21tYW5kCiYjNDM7CQkJbGluZSwgZm9yIHRlc3RzIHRoYXQgbmVlZCBhIGJvb3QtdGltZSBzZXR0aW5nLiBlLmc6CiYjNDM7CiYjNDM7CSAgS0VSTkVMX0NNRExJTkVfRVhUUkE9JiMzNDticGYua2V5cmluZ191bnNlYWxlZD0xJiMzNDsgJDAgLS0gLi90ZXN0X3Byb2dzIC10IHNpZ25lZF9sb2FkZXIKIEVPRgogfQogCkBAIC0yODYsNiAmIzQzOzI5NCwxMiBAQCBFT0YKIAkJUUVNVV9GTEFHUz0oJiMzNDske0hPU1RfRkxBR1NbQF19JiMzNDspCiAJZmkKIAomIzQzOwlsb2NhbCBrZXJuZWxfY21kbGluZT0mIzM0O3Jvb3Q9L2Rldi92ZGEgcncgY29uc29sZT0ke1FFTVVfQ09OU09MRX0mIzM0OwomIzQzOwomIzQzOwlpZiBbWyAtbiAmIzM0OyR7S0VSTkVMX0NNRExJTkVfRVhUUkE6LX0mIzM0OyBdXTsgdGhlbgomIzQzOwkJa2VybmVsX2NtZGxpbmUmIzQzOz0mIzM0OyAke0tFUk5FTF9DTURMSU5FX0VYVFJBfSYjMzQ7CiYjNDM7CWZpCiYjNDM7CiAJJHtRRU1VX0JJTkFSWX0gXAogCQktbm9kZWZhdWx0cyBcCiAJCS1kaXNwbGF5IG5vbmUgXApAQCAtMjk0LDcgJiM0MzszMDgsNyBAQCBFT0YKIAkJLW0gNEcgXAogCQktZHJpdmUgZmlsZT0mIzM0OyR7cm9vdGZzX2ltZ30mIzM0Oyxmb3JtYXQ9cmF3LGluZGV4PTEsbWVkaWE9ZGlzayxpZj12aXJ0aW8sY2FjaGU9bm9uZSBcCiAJCS1rZXJuZWwgJiMzNDske2tlcm5lbF9iemltYWdlfSYjMzQ7IFwKLQkJLWFwcGVuZCAmIzM0O3Jvb3Q9L2Rldi92ZGEgcncgY29uc29sZT0ke1FFTVVfQ09OU09MRX0mIzM0OwomIzQzOwkJLWFwcGVuZCAmIzM0OyR7a2VybmVsX2NtZGxpbmV9JiMzNDsKIH0KIAogY29weV9sb2dzKCkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjUgMTQ6NTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjI3NDkKCQkJCQkJCW91dHB1dDogMjIKCQkJCQkJCXRob3VnaHRzOiAxOTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBCUEYgS2V5cmluZyBJbXBsZW1lbnRhdGlvbioqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBwYXRjaCBzZXJpZXMsIGFuZCBpdCYjMzk7cyBpbnRyb2R1Y2luZyBhIG5ldyBgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWAgYm9vdCBwYXJhbWV0ZXIsIHdoaWNoIGlzIGludHJpZ3VpbmcuIEFuZCwgaXQgc2VlbXMgdG8gYmUgc2V0dGluZyB1cCBhIG5ldyBgLmJwZmAga2V5cmluZyBzcGVjaWZpY2FsbHkgZm9yIHZlcmlmeWluZyBCUEYgcHJvZ3JhbSBzaWduYXR1cmVzLiBTbWFydCBtb3ZlLCB0aGF0IGtpbmQgb2YgZGVkaWNhdGVkIGluZnJhc3RydWN0dXJlIGtlZXBzIHRoaW5ncyBjbGVhbiBhbmQgbWFuYWdlYWJsZS4gVGhlIHBhdGNoIHRvdWNoZXMgYGtlcm5lbC9icGYva2V5cy5jYCBhbmQgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AsIHNvIHRob3NlIGFyZSB0aGUgYXJlYXMgSSBuZWVkIHRvIGZvY3VzIG9uLgoKTGV0IG1lIGJyZWFrIGRvd24gdGhlIGNvcmUgY2hhbmdlczogYSBmZXcgbmV3IGZ1bmN0aW9ucyBhcmUgYmVpbmcgaW50cm9kdWNlZCwgYGJwZl9rZXlyaW5nX2VuZm9yY2VkKClgLCBgYnBmX2xvb2t1cF9rZXlyaW5nKClgLCBhbmQgYGJwZl9rZXlyaW5nX2luaXQoKWAsIHdoaWNoIGdpdmUgbWUgdGhlIGluaXRpYWwgc2Vuc2UgdGhhdCBhIGtleXJpbmcgaXMgaW5kZWVkIGJlaW5nIGNyZWF0ZWQgYW5kIG1hbmFnZWQuIEludGVyZXN0aW5nIGFzIHdlbGwgaXMgdGhhdCB0aGUgYWxyZWFkeSBkZWZpbmVkIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKClgIGZ1bmN0aW9uIGlzIGJlaW5nIG1vZGlmaWVkIHRvIGhhbmRsZSBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2Agd2hpY2ggbWFrZXMgcGVyZmVjdCBzZW5zZSBpbiB0ZXJtcyBvZiBsZXZlcmFnaW5nIGV4aXN0aW5nIGNvZGUgZm9yIG5ldyBmdW5jdGlvbmFsaXR5LgoKVGltZSB0byBkaWcgaW50byB0aGUgZGV0YWlscy4gSSYjMzk7bGwgZmlyZSB1cCBgZ3JlcHBlcmAgYW5kIHNlZSB3aGF0IHRoZSBjb2RlIHJlYWxseSBsb29rcyBsaWtlIGFuZCBleGFtaW5lIHRoZSBjb250ZXh0cyBpbiB3aGljaCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgYW5kIGBicGZfa2V5cmluZ19pbml0YCBhcmUgYmVpbmcgY2FsbGVkLCBhbmQgaG93IHRob3NlIG5ldyBmdW5jdGlvbnMgZml0IGludG8gdGhlIGV4aXN0aW5nIEJQRiB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gTmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93IGhlcmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjUgMTQ6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZSYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjA5ODM9c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMTAwNy0gKi9cbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyMTAwODpzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMTAwOS1cdFx0XHRcdCAgICAgdW5pb24gYnBmX2F0dHIgKmF0dHIsIGJvb2wgaXNfa2VybmVsKVxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yMTEzNj1pbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cixcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjExODctXHRpZiAoZW52LVx1MDAzZXNpZ25hdHVyZSkge1xua2VybmVsL2JwZi92ZXJpZmllci5jOjIxMTg4Olx0XHRyZXQgPSBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKGVudiwgYXR0ciwgdWF0dHIuaXNfa2VybmVsKTtcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMTE4OS1cdFx0aWYgKHJldClcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmM9NjM5PXN0YXRpYyB2b2lkIHNpZ25hdHVyZV9iYWRfa2V5cmluZyh2b2lkKVxuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYy02NDctXHRcdCAqIEEgcHJlc2VudCBzaWduYXR1cmUgd2l0aCBhIGtleXJpbmdfaWQgdGhhdCByZXNvbHZlcyB0byBubyBrZXkgaXNcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYzo2NDg6XHRcdCAqIHJlamVjdGVkIHVwIGZyb250OiBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKCkgZmFpbHMgdGhlIGtleXJpbmdcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYy02NDktXHRcdCAqIGxvb2t1cCAoLUVJTlZBTCkgYmVmb3JlIGl0IGV2ZXIgbG9va3MgYXQgdGhlIHNpZ25hdHVyZSBieXRlcy4gQVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNzE5CgkJCQkJCQlvdXRwdXQ6IDIxCgkJCQkJCQl0aG91Z2h0czogMTkwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgRGVwZW5kZW5jaWVzIG9mIFRoaXMgQlBGIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXNuJiMzOTt0IGludHJvZHVjaW5nIGEgKm5ldyogY29uZmlnIG9wdGlvbiwgd2hpY2ggaXMgZ29vZC4gSW5zdGVhZCwgaXQmIzM5O3MgbGV2ZXJhZ2luZyBleGlzdGluZyBvbmVzOiBgQ09ORklHX0tFWVNgIGFuZCBgQ09ORklHX0JQRl9TWVNDQUxMYC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGludGVycGxheSBoZXJlLiBMZXQmIzM5O3Mgc2VlLi4uIGxvb2tpbmcgYXQgYGtlcm5lbC9icGYvTWFrZWZpbGVgLi4uIEFoYSEgVGhlIGRlcGVuZGVuY3kgaXMgZXhwbGljaXQ6CgpgYGBtYWtlZmlsZQppZmVxICgkKENPTkZJR19LRVlTKSx5KQpvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBrZXlzLm8KZW5kaWYKYGBgCgpTbywgYENPTkZJR19LRVlTYCAqbXVzdCogYmUgZW5hYmxlZCBmb3IgYGtleXMub2AgdG8gZXZlbiBiZSBjb25zaWRlcmVkIGZvciBpbmNsdXNpb24uIEFuZCB0aGVuLCBvbmx5IGlmIGBDT05GSUdfQlBGX1NZU0NBTExgIGlzIGFsc28gZW5hYmxlZCwgd2lsbCB0aGUgb2JqZWN0IGZpbGUgYmUgYnVpbHQuIEdvdCBpdC4gU28gYm90aCBhcmUgcmVxdWlyZWQuCgpOb3csIGxldCBtZSBjaGVjayB0aGUgc2VsZnRlc3RzIGNvbmZpZywganVzdCB0byBzZWUgd2hhdCBlbHNlIG1pZ2h0IGJlIGJyb3VnaHQgYWxvbmcgZm9yIHRoZSByaWRlLiBMb29raW5nIGF0IGB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnYDoKCmBgYApDT05GSUdfS0VZUz15CkNPTkZJR19DUllQVE9fTUxEU0E9eQpDT05GSUdfQ1JZUFRPX1NIQTUxMj15CmBgYAoKQWxyaWdodCwgYEtFWVNgIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGB5YCB0aGVyZS4gIEFuZCwgaW50ZXJlc3RpbmdseSwgdGhlIHNlbGZ0ZXN0cyBhbHNvIHB1bGwgaW4gYENSWVBUT19NTERTQWAgYW5kIGBDUllQVE9fU0hBNTEyYC4gIFRob3NlIGNyeXB0byBvcHRpb25zICptaWdodCogYmUgcmVsZXZhbnQsIG9yIHRoZXkgbWF5IHNpbXBseSBiZSBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIGZyb20gc29tZXdoZXJlIGVsc2UgaW4gdGhlIHN0YWNrLiBJIHNob3VsZCBrZWVwIGFuIGV5ZSBvbiB0aG9zZS4KCk5vdyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IGBrZXlzLmNgIGRvZXMuLi4gTGV0JiMzOTtzIHNlZSB3aGF0IHdlIGNhbiBmaW5kIGluIHRoZSBjb2RlIGl0c2VsZiwgYGtlcm5lbC9icGYva2V5cy5jYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNDo1NTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDticGZfa2V5cmluZ19pbml0JiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYva2V5cy5jPTI2PXN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcbi0tXG5rZXJuZWwvYnBmL2tleXMuYy00NC1cbmtlcm5lbC9icGYva2V5cy5jOjQ1OnN0YXRpYyBpbnQgX19pbml0IGJwZl9rZXlyaW5nX2luaXQodm9pZClcbmtlcm5lbC9icGYva2V5cy5jLTQ2LXtcbi0tXG5rZXJuZWwvYnBmL2tleXMuYy03MS19XG5rZXJuZWwvYnBmL2tleXMuYzo3MjpsYXRlX2luaXRjYWxsKGJwZl9rZXlyaW5nX2luaXQpO1xuLS1cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYz03MDc9c3RhdGljIGxvbmcga2V5Y3RsX3JldChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMylcbi0tXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMtNzIwLSNkZWZpbmUgQlBGX0tFWVJJTkdfUEVSTV9MT0NLRURcdFx0MHgwODAzMDAwMFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jOjcyMTovKiBXaGF0IGJwZl9rZXlyaW5nX2luaXQoKSBncmFudHMgYXQgYm9vdC4gKi9cbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYy03MjItI2RlZmluZSBCUEZfS0VZUklOR19QRVJNX0lOSVRJQUxcdDB4MDgyZjAwMDBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNDo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNDYyNAoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDg4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIEkgdW5kZXJzdGFuZCBpdDoKCioqRXhhbWluaW5nIEJQRiBLZXlyaW5nIEZ1bmN0aW9uYWxpdHkgYW5kIFZlcmlmaWNhdGlvbiBDaGFuZ2VzKioKCk9rYXksIHNvIEkgc2VlIHNvbWUgbmV3IEJQRiBrZXlyaW5nIGZ1bmN0aW9ucyBoYXZlIGJlZW4gYWRkZWQuIFNwZWNpZmljYWxseSwgYGJwZl9rZXlyaW5nX2VuZm9yY2VkYCwgYGJwZl9sb29rdXBfa2V5cmluZ2AsIGFuZCBgYnBmX2tleXJpbmdfaW5pdGAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O0ludGVyZXN0aW5nLi4uIHdoYXQmIzM5O3MgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhlc2U/JiMzNDsgVGhpcyBsaWtlbHkgaW5kaWNhdGVzIGFuIGVmZm9ydCB0byBleHRlbmQgQlBGJiMzOTtzIGNhcGFiaWxpdGllcyB3aXRoaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBrZXkgbWFuYWdlbWVudC4gVGhlIG5hbWluZyBjb252ZW50aW9uIGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIEkgY2FuIGluZmVyIHRoYXQgYGVuZm9yY2VkYCBtaWdodCBiZSByZWxhdGVkIHRvIGFjY2VzcyBjb250cm9scywgYGxvb2t1cGAgZm9yIHJldHJpZXZpbmcga2V5cywgYW5kIGBpbml0YCBmb3IgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGtleXJpbmcuCgpOb3csIHRoZSBtZW50aW9uIG9mIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBiZWluZyBtb2RpZmllZCBpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYCByZWFsbHkgZ3JhYnMgbXkgYXR0ZW50aW9uLiBUaGF0IHN1Z2dlc3RzIHRoYXQgdGhlc2UgbmV3IGtleXJpbmcgZnVuY3Rpb25zIGhhdmUgbmVjZXNzaXRhdGVkIGNoYW5nZXMgdG8gdGhlIEJQRiBwcm9ncmFtIHZlcmlmaWNhdGlvbiBwcm9jZXNzLiBNeSBuZXh0IHN0ZXAgaXMgY2xlYXJseSB0byBkaXZlIGludG8gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGluIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCAqaG93KiB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaGFzIGJlZW4gYWx0ZXJlZCB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3IGtleXJpbmcgZmVhdHVyZXMuIEkmIzM5O20ga2VlbiB0byBzZWUgaWYgdGhpcyBhZmZlY3RzIHRoZSBzZWN1cml0eSBtb2RlbCBpbiBhbnkgbm90YWJsZSB3YXlzLiBVbmRlcnN0YW5kaW5nIHRoZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGlzIGNydWNpYWwgaW4gYXNzZXNzaW5nIHRoZSBpbnRlZ3JpdHkgYW5kIHNhZmV0eSBvZiBCUEYgcHJvZ3JhbXMsIGVzcGVjaWFsbHkgbm93IHRoYXQga2V5cmluZ3MgYXJlIGludm9sdmVkLiBJJiMzOTtsbCBmb2N1cyBvbiBob3cgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGhhbmRsZXMgdGhlc2UgYWRkaXRpb25zLCB0byBlbnN1cmUgdGhhdCB0aGUgc2VjdXJpdHkgcHJvcGVydGllcyByZW1haW4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjUgMTQ6NTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL3ZlcmlmaWVyLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMTAwMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjEwMDA6XHQgKiBWZXJpZnkgdGhlIFBLQ1MjNyBzaWduYXR1cmUgb2YgYSBsb2FkZWQgcHJvZ3JhbS4gQ2FsbGVkIGZyb20gYnBmX2NoZWNrKClcbjIxMDAxOlx0ICogb25jZSB0aGUgcHJvZ3JhbSYjMzk7cyBtZXRhZGF0YSBtYXBzIGhhdmUgYmVlbiByZXNvbHZlZCBpbnRvIHVzZWRfbWFwcywgc29cbjIxMDAyOlx0ICogdGhlIGV4YWN0IG1hcHMgZm9sZGVkIGludG8gdGhlIHNpZ25hdHVyZSBhcmUgdGhlIG9uZXMgdGhlIHByb2dyYW0gYmluZHMuXG4yMTAwMzpcdCAqXG4yMTAwNDpcdCAqIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMgZm9sbG93ZWQgYnkgdGhlIGZyb3plbiBjb250ZW50cyBvZlxuMjEwMDU6XHQgKiBlYWNoIG1hcCwgaW4gQG1hcHMgb3JkZXI6IGluc25zIHx8IG1hcF8wIHx8IG1hcF8xIHx8IFsuLi5dLiBPbiBzdWNjZXNzIHRoZVxuMjEwMDY6XHQgKiB2ZXJkaWN0IGFuZCBrZXlyaW5nIGluZm8gYXJlIHJlY29yZGVkIG9uIHByb2ctXHUwMDNlYXV4LlxuMjEwMDc6XHQgKi9cbjIxMDA4Olx0c3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4yMTAwOTpcdFx0XHRcdFx0ICAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYm9vbCBpc19rZXJuZWwpXG4yMTAxMDpcdHtcbjIxMDExOlx0XHRicGZwdHJfdCB1c2lnID0gbWFrZV9icGZwdHIoYXR0ci1cdTAwM2VzaWduYXR1cmUsIGlzX2tlcm5lbCk7XG4yMTAxMjpcdFx0c3RydWN0IGJwZl9keW5wdHJfa2VybiBzaWdfcHRyLCBkYXRhX3B0cjtcbjIxMDEzOlx0XHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBlbnYtXHUwMDNlcHJvZztcbjIxMDE0Olx0XHRzdHJ1Y3QgYnBmX21hcCAqKm1hcHMgPSBlbnYtXHUwMDNldXNlZF9tYXBzO1xuMjEwMTU6XHRcdHN0cnVjdCBicGZfa2V5ICprZXkgPSBOVUxMO1xuMjEwMTY6XHRcdHZvaWQgKnNpZywgKmRhdGEgPSBOVUxMO1xuMjEwMTc6XHRcdHUzMiBtYXBfY250ID0gZW52LVx1MDAzZXVzZWRfbWFwX2NudDtcbjIxMDE4Olx0XHR1MzIgaSwgb2ZmLCBpbnNuc19zejtcbjIxMDE5Olx0XHR1NjQgZGF0YV9zejtcbjIxMDIwOlx0XHRpbnQgZXJyID0gMDtcbjIxMDIxOlx0XG4yMTAyMjpcdFx0aWYgKCFhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplIHx8XG4yMTAyMzpcdFx0ICAgIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEJQRl9QUk9HX01BWF9TSUdOQVRVUkVfU0laRSlcbjIxMDI0Olx0XHRcdHJldHVybiAtRUlOVkFMO1xuMjEwMjU6XHRcbjIxMDI2Olx0XHRpZiAoIXN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXHUwMDNla2V5cmluZ19pZCkpIHtcbjIxMDI3Olx0XHRcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuMjEwMjg6XHRcdH0gZWxzZSB7XG4yMTAyOTpcdFx0XHRpZiAoYXR0ci1cdTAwM2VrZXlyaW5nX2lkICE9IFZFUklGWV9VU0VfQlBGX0tFWVJJTkcpIHtcbjIxMDMwOlx0XHRcdFx0aWYgKGJwZl9rZXlyaW5nX2VuZm9yY2VkKCkpIHtcbjIxMDMxOlx0XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7Y2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCwgdXNlIGJwZiBrZXlyaW5nXFxuXCYjMzQ7KTtcbjIxMDMyOlx0XHRcdFx0XHRyZXR1cm4gLUVQRVJNO1xuMjEwMzM6XHRcdFx0XHR9XG4yMTAzNDpcdFx0XHRcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkLCAwKTtcbjIxMDM1Olx0XHRcdH0gZWxzZSB7XG4yMTAzNjpcdFx0XHRcdGtleSA9IGJwZl9sb29rdXBfa2V5cmluZygpO1xuMjEwMzc6XHRcdFx0fVxuMjEwMzg6XHRcdH1cbjIxMDM5Olx0XHRpZiAoIWtleSkge1xuMjEwNDA6XHRcdFx0aWYgKGF0dHItXHUwMDNla2V5cmluZ19pZCA9PSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XG4yMTA0MTpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDt0aGUgYnBmIGtleXJpbmcgaXMgZW1wdHkgb3IgaGFzIG5vdCBiZWVuIHJlc3RyaWN0ZWRcXG5cJiMzNDspO1xuMjEwNDI6XHRcdFx0XHRyZXR1cm4gLUVOT0tFWTtcbjIxMDQzOlx0XHRcdH0gZWxzZSB7XG4yMTA0NDpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxuXCYjMzQ7LFxuMjEwNDU6XHRcdFx0XHRcdGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4yMTA0NjpcdFx0XHRcdHJldHVybiAtRUlOVkFMO1xuMjEwNDc6XHRcdFx0fVxuMjEwNDg6XHRcdH1cbjIxMDQ5Olx0XG4yMTA1MDpcdFx0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xuMjEwNTE6XHRcdGlmIChJU19FUlIoc2lnKSkge1xuMjEwNTI6XHRcdFx0YnBmX2tleV9wdXQoa2V5KTtcbjIxMDUzOlx0XHRcdHJldHVybiBQVFJfRVJSKHNpZyk7XG4yMTA1NDpcdFx0fVxuMjEwNTU6XHRcbjIxMDU2Olx0XHRpbnNuc19zeiA9IHByb2ctXHUwMDNlbGVuICogc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XG4yMTA1NzpcdFx0ZGF0YV9zeiA9IGluc25zX3N6O1xuMjEwNTg6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1hcF9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4yMTA1OTpcdFx0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcbjIxMDYwOlx0XG4yMTA2MTpcdFx0XHRpZiAobWFwLVx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxuMjEwNjI6XHRcdFx0ICAgICFtYXAtXHUwMDNlb3BzLVx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcikge1xuMjEwNjM6XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGFuIGFycmF5XFxuXCYjMzQ7LFxuMjEwNjQ6XHRcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbjIxMDY1Olx0XHRcdFx0ZXJyID0gLUVJTlZBTDtcbjIxMDY2Olx0XHRcdFx0Z290byBvdXQ7XG4yMTA2NzpcdFx0XHR9XG4yMTA2ODpcdFx0XHRpZiAoIVJFQURfT05DRShtYXAtXHUwMDNlZnJvemVuKSkge1xuMjEwNjk6XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGZyb3plblxcblwmIzM0OyxcbjIxMDcwOlx0XHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4yMTA3MTpcdFx0XHRcdGVyciA9IC1FUEVSTTtcbjIxMDcyOlx0XHRcdFx0Z290byBvdXQ7XG4yMTA3MzpcdFx0XHR9XG4yMTA3NDpcdFx0XHRpZiAoYnBmX21hcF93cml0ZV9hY3RpdmUobWFwKSkge1xuMjEwNzU6XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBoYXMgYWN0aXZlIHdyaXRlcnNcXG5cJiMzNDssXG4yMTA3NjpcdFx0XHRcdFx0bWFwLVx1MDAzZW5hbWUpO1xuMjEwNzc6XHRcdFx0XHRlcnIgPSAtRUJVU1k7XG4yMTA3ODpcdFx0XHRcdGdvdG8gb3V0O1xuMjEwNzk6XHRcdFx0fVxuMjEwODA6XHRcdFx0aWYgKCFtYXAtXHUwMDNlZXhjbF9wcm9nX3NoYSkge1xuMjEwODE6XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OyBtdXN0IGJlIGV4Y2x1c2l2ZVxcblwmIzM0OyxcbjIxMDgyOlx0XHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4yMTA4MzpcdFx0XHRcdGVyciA9IC1FUEVSTTtcbjIxMDg0Olx0XHRcdFx0Z290byBvdXQ7XG4yMTA4NTpcdFx0XHR9XG4yMTA4NjpcdFx0XHRkYXRhX3N6ICYjNDM7PSBtYXAtXHUwMDNldmFsdWVfc2l6ZTtcbjIxMDg3Olx0XHR9XG4yMTA4ODpcdFx0aWYgKGJwZl9keW5wdHJfY2hlY2tfc2l6ZShkYXRhX3N6KSkge1xuMjEwODk6XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O3NpZ25lZCBwYXlsb2FkIHRvbyBsYXJnZTogJWxsdSBieXRlc1xcblwmIzM0OywgZGF0YV9zeik7XG4yMTA5MDpcdFx0XHRlcnIgPSAtRTJCSUc7XG4yMTA5MTpcdFx0XHRnb3RvIG91dDtcbjIxMDkyOlx0XHR9XG4yMTA5MzpcdFx0ZGF0YSA9IGt2bWFsbG9jKGRhdGFfc3osIEdGUF9LRVJORUxfQUNDT1VOVCB8IF9fR0ZQX1pFUk8pO1xuMjEwOTQ6XHRcdGlmICghZGF0YSkge1xuMjEwOTU6XHRcdFx0ZXJyID0gLUVOT01FTTtcbjIxMDk2Olx0XHRcdGdvdG8gb3V0O1xuMjEwOTc6XHRcdH1cbjIxMDk4Olx0XHRtZW1jcHkoZGF0YSwgcHJvZy1cdTAwM2VpbnNuc2ksIGluc25zX3N6KTtcbjIxMDk5Olx0XHRvZmYgPSBpbnNuc19zejtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD45LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNDo1NTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNjgxMgoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDE1MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgS2V5cmluZyBQYXRjaCoqCgpPa2F5LCBzbyB0aGlzIHBhdGNoIGlzIGludHJvZHVjaW5nIHNvbWV0aGluZyBwcmV0dHkgc2lnbmlmaWNhbnQ6IGEgZGVkaWNhdGVkIGtleXJpbmcgc3BlY2lmaWNhbGx5IGZvciB2ZXJpZnlpbmcgdGhlIHNpZ25hdHVyZXMgb2YgQlBGIHByb2dyYW1zLiBUaGF0JiMzOTtzIGEgc29saWQgbW92ZSwgaXQgaXNvbGF0ZXMgdGhhdCBjb25jZXJuLiBJIHNlZSB0aGUgbmV3IGZ1bmN0aW9ucyBhcmUgYGJwZl9sb29rdXBfa2V5cmluZ2AsIGBicGZfa2V5cmluZ19lbmZvcmNlZGAsIGFuZCBgYnBmX2tleXJpbmdfaW5pdGAuIFRob3NlIG5hbWVzIGFyZSBzdHJhaWdodGZvcndhcmQ7IGV4YWN0bHkgd2hhdCB5b3UmIzM5O2QgZXhwZWN0LiBUaGUgY29yZSBvZiBpdCBhbGwgc2VlbXMgdG8gYmUgaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCB3aGljaCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLgoKTm93LCB0aGUgcXVlc3Rpb24gaXMgKndoZXJlKiB0aGlzIGlzIGJlaW5nIGNhbGxlZCBmcm9tLiBBaGEsIGl0JiMzOTtzIHJlYWNoYWJsZSB0aHJvdWdoIGBicGZfY2hlY2tgLCBzcGVjaWZpY2FsbHkgZHVyaW5nIHRoZSBCUEYgcHJvZ3JhbSBsb2FkIHByb2Nlc3Mgd2hlbiBhIHNpZ25hdHVyZSBpcyBwcmVzZW50LiBUaGF0IG1ha2VzIHNlbnNlLiBMZXQmIzM5O3Mgc2VlLi4uIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBjYWxsZWQgaWYgYGVudi0mZ3Q7c2lnbmF0dXJlYCBpcyBzZXQuIFJpZ2h0LCByaWdodC4uLiBhbmQgYGVudi0mZ3Q7c2lnbmF0dXJlYCBnZXRzIHNldCBpZiBgYXR0ci0mZ3Q7c2lnbmF0dXJlYCBpcyBwcm92aWRlZCwgd2hpY2ggaXMgaG93IHRoZSBwcm9ncmFtIGxvYWRlciBwYXNzZXMgdGhlIHNpZ25hdHVyZS4gT2theSwgdGhhdCYjMzk7cyBjbGVhbi4gTGV0IG1lIGNvbmZpcm0gdGhpcyBjb25uZWN0aW9uIGJ5IHRha2luZyBhIHF1aWNrIGxvb2sgYXQgYGJwZl9jaGVja2AgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AuIEp1c3Qgd2FudCB0byBiZSBzdXJlIEkmIzM5O20gbm90IG1pc3NpbmcgYW55dGhpbmcuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi92ZXJpZmllci5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjExODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjExODA6XHRcdFx0XHRnb3RvIGVycl9wcmVwO1xuMjExODE6XHRcdH1cbjIxMTgyOlx0XG4yMTE4MzpcdFx0cmV0ID0gcHJvY2Vzc19mZF9hcnJheShlbnYsIGF0dHIsIHVhdHRyKTtcbjIxMTg0Olx0XHRpZiAocmV0KVxuMjExODU6XHRcdFx0Z290byBlcnJfcHJlcDtcbjIxMTg2Olx0XG4yMTE4NzpcdFx0aWYgKGVudi1cdTAwM2VzaWduYXR1cmUpIHtcbjIxMTg4Olx0XHRcdHJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpO1xuMjExODk6XHRcdFx0aWYgKHJldClcbjIxMTkwOlx0XHRcdFx0Z290byBlcnJfcHJlcDtcbjIxMTkxOlx0XHR9XG4yMTE5MjpcdFxuMjExOTM6XHRcdHJldCA9IHNlY3VyaXR5X2JwZl9wcm9nX2xvYWQoZW52LVx1MDAzZXByb2csIGF0dHIsIGVudi1cdTAwM2Vwcm9nLVx1MDAzZWF1eC1cdTAwM2V0b2tlbixcbjIxMTk0Olx0XHRcdFx0XHQgICAgIHVhdHRyLmlzX2tlcm5lbCk7XG4yMTE5NTpcdFx0aWYgKHJldClcbjIxMTk2Olx0XHRcdGdvdG8gZXJyX3ByZXA7XG4yMTE5NzpcdFxuMjExOTg6XHRcdGJwZl9nZXRfYnRmX3ZtbGludXgoKTtcbjIxMTk5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDI3NTc0CgkJCQkJCQlvdXRwdXQ6IDM0CgkJCQkJCQl0aG91Z2h0czogNDY1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFuYWx5c2lzIG9mIEJQRiBTaWduYXR1cmUgVmVyaWZpY2F0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gdGhpbmtpbmcsIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBzZWVtcyBsaWtlIGEgc29saWQgc3ltYm9sIHRvIHN0YXJ0IHdpdGgsIGFsb25nIHdpdGggYGJwZl9sb29rdXBfa2V5cmluZ2AgYW5kIGBicGZfa2V5cmluZ19lbmZvcmNlZGAuIEkgbmVlZCB0byByZW1lbWJlciB0aGF0IGBicGZfa2V5cmluZ19pbml0YCBpcyBjYWxsZWQgZHVyaW5nIGJvb3QgYXMgaXQgaXMgYW4gaW5pdGNhbGwuIFRoaXMgcmVxdWlyZXMgYEtFWVNgIGFuZCBgQlBGX1NZU0NBTExgIGNvbmZpZ3VyYXRpb25zLiBXYWl0LCBoYW5nIG9uLCBJIHNlZSBgQ09ORklHX0NSWVBUT19NTERTQWAgYW5kIGBDT05GSUdfQ1JZUFRPX1NIQTUxMmAgYXJlIGluIHRoZSBzZWxmdGVzdHMgY29uZmlnLCBidXQgdGhvc2UgYXJlbiYjMzk7dCAqc3RyaWN0bHkqIG5lZWRlZCBmb3IgdGhlIGNvcmUgZmVhdHVyZSwgdGhleSBhcmUganVzdCB0aGVyZSBmb3Igc2VsZnRlc3RzIHRvIHVzZSBNTC1EU0Egc2lnbmF0dXJlcy4gVGhlIGZlYXR1cmUgaXRzZWxmIGp1c3QgdXNlcyB3aGF0ZXZlciBjcnlwdG8gdGhlIGtlcm5lbCYjMzk7cyBQS0NTIzcgcGFyc2VyIHN1cHBvcnRzLgoKT2theSwgYmFjayB0byB0aGUgY29uZmlncy4uLmBDT05GSUdfS0VZU2AgaXMgZGVmaW5pdGVseSByZXF1aXJlZCBmb3IgYGJwZl9sb29rdXBfa2V5cmluZ2AgYW5kIGBicGZfa2V5cmluZ19lbmZvcmNlZGAgYmVjYXVzZSB0aG9zZSBmdW5jdGlvbnMgbGl2ZSBpbiBga2VybmVsL2JwZi9rZXlzLmNgLCB3aGljaCBvbmx5IGdldHMgY29tcGlsZWQgaWYgYENPTkZJR19LRVlTPXlgLiBMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBga2VybmVsL2JwZi9NYWtlZmlsZWAgdG8gY29uZmlybToKCmBgYG1ha2VmaWxlCmlmZXEgKCQoQ09ORklHX0tFWVMpLHkpCm9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IGtleXMubwplbmRpZgpgYGAKClllcCwgY29uZmlybWVkLCBgQ09ORklHX0tFWVNgIGlzIGEgaGFyZCByZXF1aXJlbWVudC4KCk5vdywgYWJvdXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBJIHNob3VsZCBwcm9iYWJseSBjaGVjayBpZiBpdCYjMzk7cyBzdGF0aWMuIFllcywgaXQgaXMuIFRoZSBpbnN0cnVjdGlvbnMgc2F5IHRvIHByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludHMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVycywgYmVjYXVzZSBzdGF0aWMgaGVscGVycyBnZXQgaW5saW5lZCBhbmQgZG9uJiMzOTt0IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3Nlcy4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGlzIHN0YXRpYy4gSXMgaXQgaW5saW5lZD8gSXQmIzM5O3MgcHJldHR5IGxhcmdlLCBzbyBpdCYjMzk7cyBwcm9iYWJseSAqbm90KiBpbmxpbmVkLCBidXQgYGJwZl9jaGVja2AgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQsIGFuZCB0aGF0IHNlZW1zIHByb2JsZW1hdGljLgoKV2FpdCwgYGJwZl9jaGVja2AgaXMgdGhlIG1haW4gdmVyaWZpZXIgZW50cnkgcG9pbnQuIEZ1enppbmcgdGhhdCBpcyBwcm9iYWJseSB0b28gZ2VuZXJpYywgc28gbGV0JiMzOTtzIHNlZSwgYXJlIHRoZXJlIGFueSBub24tc3RhdGljIGZ1bmN0aW9ucyBhdmFpbGFibGU/IGBicGZfbG9va3VwX2tleXJpbmdgIGFuZCBgYnBmX2tleXJpbmdfZW5mb3JjZWRgIGFyZSBub24tc3RhdGljLiBMZXQmIzM5O3MgZGlnIGludG8gYGtlcm5lbC9icGYva2V5cy5jYCBhIGJpdCBmdXJ0aGVyLi4uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU2PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9rZXlzLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAgIDE6XHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0LyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuICAgMzpcdFxuICAgNDpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gICA1Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4gICA2Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbiAgIDc6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbiAgIDg6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXkuaFx1MDAzZVxuICAgOTpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZXBhcmFtLmhcdTAwM2VcbiAgMTA6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbiAgMTE6XHRcbiAgMTI6XHQjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWFxuICAxMzpcdCNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCBcJiMzNDticGYuXCYjMzQ7XG4gIDE0Olx0XG4gIDE1Olx0c3RhdGljIHN0cnVjdCBrZXkgKmJwZl9rZXlyaW5nO1xuICAxNjpcdFxuICAxNzpcdHN0YXRpYyBib29sIGJwZl9rZXlyaW5nX3Vuc2VhbGVkIF9fcm9fYWZ0ZXJfaW5pdDtcbiAgMTg6XHRtb2R1bGVfcGFyYW1fbmFtZWQoa2V5cmluZ191bnNlYWxlZCwgYnBmX2tleXJpbmdfdW5zZWFsZWQsIGJvb2wsIDA0NDQpO1xuICAxOTpcdE1PRFVMRV9QQVJNX0RFU0Moa2V5cmluZ191bnNlYWxlZCwgXCYjMzQ7TGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkXCYjMzQ7KTtcbiAgMjA6XHRcbiAgMjE6XHRib29sIGJwZl9rZXlyaW5nX2VuZm9yY2VkKHZvaWQpXG4gIDIyOlx0e1xuICAyMzpcdFx0cmV0dXJuIGJwZl9rZXlyaW5nX3Vuc2VhbGVkO1xuICAyNDpcdH1cbiAgMjU6XHRcbiAgMjY6XHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpXG4gIDI3Olx0e1xuICAyODpcdFx0c3RydWN0IGJwZl9rZXkgKmJrZXk7XG4gIDI5Olx0XG4gIDMwOlx0XHRpZiAoIWJwZl9rZXlyaW5nKVxuICAzMTpcdFx0XHRyZXR1cm4gTlVMTDtcbiAgMzI6XHRcdGlmICghUkVBRF9PTkNFKGJwZl9rZXlyaW5nLVx1MDAzZWtleXMubnJfbGVhdmVzX29uX3RyZWUpIHx8XG4gIDMzOlx0XHQgICAgIVJFQURfT05DRShicGZfa2V5cmluZy1cdTAwM2VyZXN0cmljdF9saW5rKSlcbiAgMzQ6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDM1Olx0XG4gIDM2Olx0XHRia2V5ID0ga21hbGxvY19vYmooKmJrZXkpO1xuICAzNzpcdFx0aWYgKCFia2V5KVxuICAzODpcdFx0XHRyZXR1cm4gTlVMTDtcbiAgMzk6XHRcbiAgNDA6XHRcdGJrZXktXHUwMDNla2V5ID0gYnBmX2tleXJpbmc7XG4gIDQxOlx0XHRia2V5LVx1MDAzZWhhc19yZWYgPSBmYWxzZTtcbiAgNDI6XHRcdHJldHVybiBia2V5O1xuICA0MzpcdH1cbiAgNDQ6XHRcbiAgNDU6XHRzdGF0aWMgaW50IF9faW5pdCBicGZfa2V5cmluZ19pbml0KHZvaWQpXG4gIDQ2Olx0e1xuICA0NzpcdFx0c3RydWN0IGtleSAqa2V5cmluZztcbiAgNDg6XHRcbiAgNDk6XHRcdGtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKFwmIzM0Oy5icGZcJiMzNDssXG4gIDUwOlx0XHRcdFx0XHRHTE9CQUxfUk9PVF9VSUQsIEdMT0JBTF9ST09UX0dJRCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjUgMTQ6NTY8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjEtcHJvLXByZXZpZXc8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkyNzQKCQkJCQkJCW91dHB1dDogMTUxCgkJCQkJCQl0aG91Z2h0czogMTE4MQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFBsYW46IEJQRiBLZXlyaW5nIFNpZ25hdHVyZSBWZXJpZmljYXRpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGZpZ3VyaW5nIG91dCBob3cgdG8gYXBwcm9hY2ggZnV6emluZyBpdC4gSSBzZWUgdGhhdCBgYnBmX2xvb2t1cF9rZXlyaW5nYCBhbmQgYGJwZl9rZXlyaW5nX2VuZm9yY2VkYCBhcmUgbm9uLXN0YXRpYyBmdW5jdGlvbnMsIGFuZCB0aGV5IHNlZW0gY2VudHJhbCB0byB0aGlzIG5ldyBCUEYga2V5cmluZyBmdW5jdGlvbmFsaXR5LCBzbyB0aG9zZSBhcmUgZGVmaW5pdGVseSBwcmltZSBjYW5kaWRhdGVzIGZvciBmdXp6aW5nIHN5bWJvbHMuIEFsdGhvdWdoIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBzdGF0aWMgYW5kIHBvdGVudGlhbGx5IGxhcmdlLCBpdCBhbHJlYWR5IGV4aXN0cywgYW5kIHRoaXMgcGF0Y2gganVzdCAqbW9kaWZpZXMqIGl0IHRvIHVzZSB0aGUgbmV3IGtleXJpbmcsIHdoaWNoIG1lYW5zIGl0cyBtYWluIGxvZ2ljIGlzIGNyaXRpY2FsIGFuZCBzaG91bGQgYWxzbyBiZSBjb25zaWRlcmVkLiBTaW5jZSB0aGUgcGF0Y2ggaGVhdmlseSBjaGFuZ2VzIHRoaXMgZnVuY3Rpb24sIGluY2x1ZGluZyBpdCBtYWtlcyBzZW5zZS4KCkVzc2VudGlhbGx5LCB0aGlzIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtleXJpbmcgZm9yIHZlcmlmeWluZyBCUEYgcHJvZ3JhbSBzaWduYXR1cmVzLCBhbmQgaXQgZW5mb3JjZXMgaXRzIHVzZSB3aGVuIHVuc2VhbGVkLiBUaGlzIGltcGFjdHMgdGhlIEJQRiBwcm9ncmFtIGxvYWRpbmcgYW5kIHZlcmlmaWNhdGlvbiBwYXRocywgYWNjZXNzZWQgZnJvbSB1c2VyLXNwYWNlIHRocm91Z2ggdGhlIGBicGYoKWAgc3lzY2FsbC4gVGhpcyBtb2RpZmllZCBwYXRoIGlzIHJpcGUgZm9yIGZ1enppbmcuCgpNeSBwcmltYXJ5IGZvY3VzIHdpbGwgYmUgb24gdGhlIGFkZGVkL21vZGlmaWVkIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0byB0aGUga2V5cmluZy4gSSYjMzk7bGwgZmxhZyBgYnBmX2xvb2t1cF9rZXlyaW5nYCBhbmQgYGJwZl9rZXlyaW5nX2VuZm9yY2VkYCBhcyAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7LiBJJiMzOTtsbCBhbHNvIGluY2x1ZGUgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBhcyBpdHMgcm9sZSBpcyBlc3NlbnRpYWwgYW5kIGl0JiMzOTtzIG5vdCBpbmxpbmVkLgoKQXMgZm9yIGNvbmZpZ3VyYXRpb25zLCBpdCYjMzk7cyBwcmV0dHkgY2xlYXIgdGhhdCBgQ09ORklHX0tFWVNgIGFuZCBgQlBGX1NZU0NBTExgIGFyZSByZWxldmFudC4gSSBuZWVkIHRoZSBrZXlyaW5nIHN1cHBvcnQgKEtFWVMpIGFuZCB0aGUgQlBGIHN5c3RlbSBjYWxsIChCUEZfU1lTQ0FMTCksIGFzIHRoZSBCUEYgc3lzY2FsbCBpcyBob3cgdGhlIEJQRiBsb2dpYyBpcyByZWFjaGVkLgoKSSByZXZpZXdlZCB0aGUgY2hhbmdlczogYmVzaWRlcyB0aGUgQlBGIGNvZGUgaW4gYGtlcm5lbC9icGYva2V5cy5jYCBhbmQgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AsIG1hbnkgc2VsZnRlc3RzIGFuZCB0b29scyBhcmUgdXBkYXRlZCB0byBzdXBwb3J0IHRoZSBjaGFuZ2VzLiBUaGUgZnVuY3Rpb25hbCBjaGFuZ2VzIGFyZSBpbmRlZWQgd2l0aGluIHRoZSBrZXJuZWwgbW9kdWxlcy4gVGhpcyBpcyB3b3J0aCBmdXp6aW5nLgoKU28sIHRoZSBwbGFuIGlzOiBmdXp6IHRoZSBCUEYgc3lzdGVtIGNhbGwsIHdpdGggdGhlIEtFWSBjb25maWcgZW5hYmxlZCwgYW5kIHRhcmdldCB0aGUgdmVyaWZpY2F0aW9uIGxvZ2ljIHRoYXQgbm93IGluY29ycG9yYXRlcyBrZXlyaW5nIGNoZWNrcy4KCkkmIzM5O20gcmVhZHkgdG8gYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjUgMTQ6NTY8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWVMmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfbG9va3VwX2tleXJpbmcmIzM0OywKICAgICYjMzQ7YnBmX2tleXJpbmdfZW5mb3JjZWQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgLmJwZmAga2V5cmluZyBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBhbmQgYSBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIGJvb3QgcGFyYW1ldGVyLiBJdCBtb2RpZmllcyB0aGUgQlBGIHByb2dyYW0gbG9hZGluZyBhbmQgdmVyaWZpY2F0aW9uIHBhdGhzIGluIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCB0byBoYW5kbGUgdGhlIG5ldyBrZXlyaW5nIGFuZCBlbmZvcmNlIGl0cyB1c2Ugd2hlbiBjb25maWd1cmVkLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCB0aGUgYGJwZigpYCBzeXNjYWxsIHBhdGggYW5kIGludHJvZHVjZSBuZXcgcmVhY2hhYmxlIHN0YXRlIGFuZCBsb2dpYyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tFWVMmIzM0OywKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfbG9va3VwX2tleXJpbmcmIzM0OywKICAgICYjMzQ7YnBmX2tleXJpbmdfZW5mb3JjZWQmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgLmJwZmAga2V5cmluZyBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBhbmQgYSBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIGJvb3QgcGFyYW1ldGVyLiBJdCBtb2RpZmllcyB0aGUgQlBGIHByb2dyYW0gbG9hZGluZyBhbmQgdmVyaWZpY2F0aW9uIHBhdGhzIGluIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCB0byBoYW5kbGUgdGhlIG5ldyBrZXlyaW5nIGFuZCBlbmZvcmNlIGl0cyB1c2Ugd2hlbiBjb25maWd1cmVkLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCB0aGUgYGJwZigpYCBzeXNjYWxsIHBhdGggYW5kIGludHJvZHVjZSBuZXcgcmVhY2hhYmxlIHN0YXRlIGFuZCBsb2dpYyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU2PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjE3bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU2PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjE3bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5iZXN0LWV4cGVuc2l2ZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBhIG5ldyBCUEYga2V5cmluZyAoYC5icGZgKSBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgYWxvbmcgd2l0aCBhIGtlcm5lbCBwYXJhbWV0ZXIgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkYCB0byBtYW5hZ2UgaXRzIHN0YXRlLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBhZGRpbmcgYSBuZXcga2V5cmluZyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgYWRkaW5nIGEgbG9va3VwIGZ1bmN0aW9uIGBicGZfbG9va3VwX2tleXJpbmdgIHdoaWNoIGFsbG9jYXRlcyBhIGBzdHJ1Y3QgYnBmX2tleWAgYW5kIGluaXRpYWxpemVzIGl0cyBmaWVsZHMsIGFuZCBtb2RpZnlpbmcgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIHRvIGhhbmRsZSB0aGUgbmV3IGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYCBJRC5cblxuTm9uZSBvZiB0aGVzZSBjaGFuZ2VzIGludHJvZHVjZSBuZXcga2VybmVsIHN0cnVjdHVyZXMgdGhhdCBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2UsIG5vciBkbyB0aGV5IGludHJvZHVjZSBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aXRoIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgZmllbGRzLiBUaGUgb25seSBuZXcga2VybmVsIGFsbG9jYXRpb24gaXMgZm9yIGBzdHJ1Y3QgYnBmX2tleWAgdmlhIGBrbWFsbG9jX29iamAsIGFuZCBhbGwgaXRzIGZpZWxkcyAoYGtleWAgYW5kIGBoYXNfcmVmYCkgYXJlIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYWxsb2NhdGlvbi4gVGhlIHNpZ25hdHVyZSBhbmQgZGF0YSBidWZmZXJzIHVzZWQgZHVyaW5nIHZlcmlmaWNhdGlvbiBhcmUgYWxsb2NhdGVkIHdpdGggYGt2bWVtZHVwX2JwZnB0cmAgKHdoaWNoIGNvcGllcyBmcm9tIHVzZXIgc3BhY2UpIGFuZCBga3ZtYWxsb2MoLi4uLCBfX0dGUF9aRVJPKWAgKHdoaWNoIHplcm8taW5pdGlhbGl6ZXMpLCByZXNwZWN0aXZlbHkuXG5cbkFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMsIHN1Y2ggYXMgbWVtb3J5IGxlYWtzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciB1c2UtYWZ0ZXItZnJlZSBpc3N1ZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDRiMjMyZjg5MGNlNmYxNWJjNzhiNTY3NTFmYjY5YzQwNGIxNzlkYjAKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVHVlIEF1ZyAyNSAxNDo1NTowNyAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggZTQ2NDM2MzRhOWIxYi4uZTcwZmIxNTc1N2Q0MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHQKJiM0MzsmIzQzOyYjNDM7IGIvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTY2Nyw2ICYjNDM7NjY3LDIyIEBAIEtlcm5lbCBwYXJhbWV0ZXJzCiAKIAkJCVNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Jvb3Rjb25maWcucnN0CiAKJiM0MzsJYnBmLmtleXJpbmdfdW5zZWFsZWQ9CiYjNDM7CQkJW0JQRl0gV2hlbiBzZXQgdG8gMSwgbGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkCiYjNDM7CQkJYWZ0ZXIgaW5pdGlhbGl6YXRpb24gc28gdGhhdCB1c2Vyc3BhY2UgY2FuIHByb3Zpc2lvbgomIzQzOwkJCWtleXMuIE9uY2UgdGhlIGtleXJpbmcgaXMgcmVzdHJpY3RlZCBpdCBiZWNvbWVzIGFjdGl2ZQomIzQzOwkJCWFuZCBjYW4gYmUgdXNlZCBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4KJiM0MzsKJiM0MzsJCQlTZXR0aW5nIHRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZSBicGYga2V5cmluZyBpcyB0aGUKJiM0MzsJCQlvbmx5IG5vbi1zeXN0ZW0ga2V5cmluZyBhIGxvYWRlciBtYXkgc2VsZWN0IGZvciB0aGUKJiM0MzsJCQlyZXN0IG9mIHRoZSBib290OiBjYWxsZXItc3VwcGxpZWQgdXNlci9zZXNzaW9uCiYjNDM7CQkJa2V5cmluZ3MgYXJlIHJlZnVzZWQgd2l0aCAtRVBFUk0sIHdoZXRoZXIgb3Igbm90CiYjNDM7CQkJcHJvdmlzaW9uaW5nIGFjdHVhbGx5IGNvbXBsZXRlZC4gVGhlIHN5c3RlbSBrZXlyaW5ncwomIzQzOwkJCXN0YXkgc2VsZWN0YWJsZS4gTGVhdmluZyBpdCB1bnNldCBrZWVwcyB0aGUgcHJpb3IKJiM0MzsJCQliZWhhdmlvdXIsIHdoZXJlIGEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgaXMgYWxsb3dlZC4KJiM0MzsKJiM0MzsJCQlTZWUgRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QKJiM0MzsKIAlidHR2LmNhcmQ9CVtIVyxWNExdIGJ0dHYgKGJ0ODQ4ICYjNDM7IGJ0ODc4IGJhc2VkIGdyYWJiZXIgY2FyZHMpCiAJYnR0di5yYWRpbz0JTW9zdCBpbXBvcnRhbnQgaW5zbW9kIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBhcwogCQkJa2VybmVsIGFyZ3MgdG9vLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdAppbmRleCBlNzNlYWFlYmQ4YjE1Li42YzAzZmI1OGIxNDY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdAomIzQzOyYjNDM7JiM0MzsgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdApAQCAtMjU0LDIxICYjNDM7MjU0LDI1IEBAIHJldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2sKIChgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCksIGRvZXMgYGBCUEZfU0lHX1ZFUklGSUVEYGAgY2FycnkgaXRzIGZ1bGwgbWVhbmluZzoKIHZhbGlkbHkgc2lnbmVkICphbmQqIGZ1bGx5IHZlcmlmaWVkLgogCi1BIG1vcmUgcmVhbGlzdGljIGFkbWlzc2lvbiBwb2xpY3kgdGhhbiAmIzM0O2lzIGl0IHNpZ25lZCBhdCBhbGwmIzM0OzogYWNjZXB0IHByb2dyYW1zCi1zaWduZWQgYnkgYSBzeXN0ZW0ga2V5cmluZywgYWNjZXB0IGEgdXNlci1rZXlyaW5nIHNpZ25hdHVyZSBvbmx5IGlmIHRoZQota2V5L2tleXJpbmcgaXQgd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhCi10YW1wZXItZXZpZGVudCByZWNvcmQgb2YgZXZlcnkgZGVjaXNpb24gc28gdGhhdCBldmVuIGRlbmllZCBhdHRlbXB0cyBhcmUKLWF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiYjNDM7QSBtb3JlIHJlYWxpc3RpYyBhZG1pc3Npb24gcG9saWN5IHRoYW4gJiMzNDtpcyBpdCBzaWduZWQgYXQgYWxsJiMzNDs6IGJhc2UgdHJ1c3QgaW4KJiM0Mzt0aGUgYnBmIGtleXJpbmcsIGFjY2VwdCBhIHN0YWdpbmcgc2lnbmF0dXJlIG9ubHkgd2hpbGUgdGhlIGtleS9rZXlyaW5nIHRoZQomIzQzO3Byb2dyYW0gd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhIHRhbXBlci0KJiM0MztldmlkZW50IHJlY29yZCBvZiBldmVyeSBkZWNpc2lvbiBzbyB0aGF0IGV2ZW4gZGVuaWVkIGF0dGVtcHRzIGFyZSBhdWRpdGFibGUuCiYjNDM7KGlsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiAKIC4uIGNvZGUtYmxvY2s6OiBjCiAKLSAgICAvKiBTZXJpYWxzIG9mIHVzZXIga2V5cy9rZXlyaW5ncyB3ZSBhZGRpdGlvbmFsbHkgdHJ1c3QuICovCiYjNDM7ICAgIC8qCiYjNDM7ICAgICAqIFNlcmlhbHMgb2YgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIHdlIGFyZSB3aWxsaW5nIHRvIHN0YWdlLiBFbXB0eQomIzQzOyAgICAgKiBvbiBhIHN5c3RlbSB0aGF0IGhhcyBjb21taXR0ZWQgdG8gdGhlIGJwZiBrZXlyaW5nLCB3aGVyZSB0aGUga2VybmVsCiYjNDM7ICAgICAqIHJlZnVzZXMgdGhlbSBhbnl3YXkuCiYjNDM7ICAgICAqLwogICAgIHN0cnVjdCB7CiAgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpOwogICAgICAgICAgICAgX190eXBlKGtleSwgX19zMzIpOyAgICAgICAgICAgICAvKiBrZXlyaW5nX3NlcmlhbCAqLwogICAgICAgICAgICAgX190eXBlKHZhbHVlLCBfX3U4KTsKICAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNjQpOwotICAgIH0gdHJ1c3RlZF91c2VyX2tleXMgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7ICAgIH0gc3RhZ2luZ19rZXlzIFNFQygmIzM0Oy5tYXBzJiMzNDspOwogCiAgICAgLyogQXVkaXQgc3RyZWFtIGNvbnN1bWVkIGJ5IGEgdXNlcnNwYWNlIGxvZ2dlci4gKi8KICAgICBzdHJ1Y3QgewpAQCAtMjkxLDExICYjNDM7Mjk1LDE5IEBAIGF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pCiAgICAgICAgICAgICBpZiAoa2VybmVsKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydXN0IGluLWtlcm5lbCBsb2FkcyAqLwogCi0gICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKQomIzQzOyAgICAgICAgICAgIGlmICh2ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHZhbGlkbHkgc2lnbmVkICovCi0gICAgICAgICAgICBlbHNlIGlmIChrdHlwZSA9PSBCUEZfU0lHX0tFWVJJTkdfVVNFUiAmYW1wOyZhbXA7Ci0gICAgICAgICAgICAgICAgICAgICAhYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3RydXN0ZWRfdXNlcl9rZXlzLCAmYW1wO3NlcmlhbCkpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5L2tleXJpbmcgbm90IGFsbG93bGlzdGVkICovCiYjNDM7ICAgICAgICAgICAgfSBlbHNlIHN3aXRjaCAoa3R5cGUpIHsKJiM0MzsgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19CVUlMVElOOgomIzQzOyAgICAgICAgICAgIGNhc2UgQlBGX1NJR19LRVlSSU5HX0JQRjoKJiM0MzsgICAgICAgICAgICAgICAgICAgIGJyZWFrOwomIzQzOyAgICAgICAgICAgIGNhc2UgQlBGX1NJR19LRVlSSU5HX1VTRVI6CiYjNDM7ICAgICAgICAgICAgICAgICAgICBpZiAoIWJwZl9tYXBfbG9va3VwX2VsZW0oJmFtcDtzdGFnaW5nX2tleXMsICZhbXA7c2VyaWFsKSkKJiM0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOwomIzQzOyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiYjNDM7ICAgICAgICAgICAgZGVmYXVsdDoKJiM0MzsgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5cmluZyBub3QgaW4gcG9saWN5ICovCiYjNDM7ICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkID0gYnBmX3JpbmdidWZfcmVzZXJ2ZSgmYW1wO2F1ZGl0LCBzaXplb2YoKmQpLCAwKTsKICAgICAgICAgICAgIGlmIChkKSB7CkBAIC0zMDksNiAmIzQzOzMyMSwxMSBAQCBhdWRpdGFibGUuIChJbGx1c3RyYXRpdmUgLSBlcnJvciBjaGVja2luZyBlbGlkZWQuKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKJiM0MztTdWNoIGEgcG9saWN5IGlzIHdoYXQgbWFrZXMgYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyB1c2FibGUgYXQgYWxsIG9uIGEgc3lzdGVtCiYjNDM7dGhhdCBkb2VzIG5vdCBib290IHdpdGggYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGA6IHRoZSBhbGxvd2xpc3QgYm91bmRzIHdoaWNoCiYjNDM7c3RhZ2VkIGtleXMgY291bnQsIGFuZCB0aGUgTFNNIGl0c2VsZiBoYXMgdG8gcHJvdGVjdCB0aGVtIGZyb20gYmVpbmcgdGFtcGVyZWQKJiM0Mzt3aXRoLgomIzQzOwogT2JzZXJ2aW5nIGEgdmVyaWZpZWQgbG9hZDogYGBzZWN1cml0eV9icGZfcHJvZygpYGAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM4MSw4ICYjNDM7Mzk4LDkgQEAgdGhhdCB2ZXJkaWN0IGNvdmVyZWQgYWxsIG9mIGl0cyBleGNsdXNpdmUgbWFwcywgcmVqZWN0aW5nIGFueSB0aGF0IGRpZCBub3QgLSBzbwogYSBkZW55LWJ5LWRlZmF1bHQgYWRtaXNzaW9uIHBvbGljeSBuZWVkcyBubyBzZWNvbmQgZW5mb3JjZW1lbnQgcG9pbnQuIFVzZQogYGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZQogdGhleSBjYXJyeSBhbiBpZC4gVGhlIGBgdmVyZGljdGBgLCBgYGtleXJpbmdfdHlwZWBgIGFuZCBgYGtleXJpbmdfc2VyaWFsYGAgZmllbGRzCi1sZXQgYSBwb2xpY3kgZGlzdGluZ3Vpc2gsIGZvciBleGFtcGxlLCAmIzM0O3ZlcmlmaWVkIGFuZCBzaWduZWQgYnkgYSBidWlsdGluIGtleSYjMzQ7Ci1mcm9tICYjMzQ7dmVyaWZpZWQgYnkgYSB1c2VyIGtleSYjMzQ7LiBBIHBvbGljeSBMU00gc3VjaCBhcyBJUEUgY291bGQgY29uc3VtZSB0aGUgc2FtZQomIzQzO2xldCBhIHBvbGljeSBkaXN0aW5ndWlzaCAmIzM0O3ZlcmlmaWVkIGFnYWluc3QgdGhlIG9wZXJhdG9yJiMzOTtzIGJwZiBrZXlyaW5nJiMzNDsgZnJvbQomIzQzOyYjMzQ7dmVyaWZpZWQgYWdhaW5zdCBhIGtleXJpbmcgdGhlIGxvYWRlciBzdXBwbGllZCBpdHNlbGYmIzM0Oywgd2hpY2ggaXMgdGhlCiYjNDM7ZGlzdGluY3Rpb24gdGhhdCBtYXR0ZXJzIG1vc3QuIEEgcG9saWN5IExTTSBzdWNoIGFzIElQRSBjb3VsZCBjb25zdW1lIHRoZSBzYW1lCiBob29rcyB0byBlbmZvcmNlIHN5c3RlbSBwb2xpY3kgd2l0aG91dCB3cml0aW5nIGFueSBCUEYsIHRob3VnaCBub25lIGltcGxlbWVudHMKIHRoaXMgdG9kYXkuCiAKQEAgLTM5MCwzMyAmIzQzOzQwOCwxNTQgQEAgS2V5cmluZ3MKID09PT09PT09CiAKIGBga2V5cmluZ19pZGBgIHNlbGVjdHMgdGhlIHRydXN0ZWQga2V5cmluZyB0aGUgUEtDUyM3IHNpZ25hdHVyZSBpcyB2ZXJpZmllZAotYWdhaW5zdC4gVGhlIHdlbGwta25vd24gaWRzIGBgMGBgIChidWlsdGluKSwgYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGAKLWFuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7Ci1hbnkgb3RoZXIgdmFsdWUgaXMgdHJlYXRlZCBhcyB0aGUgc2VyaWFsIG9mIGEgdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nLgotVGhlIGtleXJpbmcgaXMgbG9va2VkIHVwIGZpcnN0LCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBieXRlcyBhcmUgZXhhbWluZWQsIHNvIGEKLXNpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkCi12ZXJpZmljYXRpb24gYWJvcnRzIHRoZSBsb2FkIC0gc28gYSBwcm9ncmFtIHRoYXQgbG9hZHMgc3VjY2Vzc2Z1bGx5IHdpdGggYQotc2lnbmF0dXJlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC4KJiM0MzthZ2FpbnN0LiBGb3VyIHZhbHVlcyBhcmUgd2VsbC1rbm93bjsgYW55dGhpbmcgZWxzZSBpcyB0YWtlbiBhcyB0aGUgc2VyaWFsIG9mIGEKJiM0MztjYWxsZXItc3VwcGxpZWQgdXNlciBvciBzZXNzaW9uIGtleSBvciBrZXlyaW5nOgomIzQzOwomIzQzOy4uIGxpc3QtdGFibGU6OgomIzQzOyAgIDpoZWFkZXItcm93czogMQomIzQzOwomIzQzOyAgICogLSBgYGtleXJpbmdfaWRgYAomIzQzOyAgICAgLSBLZXlyaW5nCiYjNDM7ICAgKiAtIGBgMGBgCiYjNDM7ICAgICAtIGJ1aWx0aW4gdHJ1c3RlZCBrZXlyaW5nCiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgIChgYDFgYCkKJiM0MzsgICAgIC0gc2Vjb25kYXJ5IHRydXN0ZWQga2V5cmluZwomIzQzOyAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIChgYDJgYCkKJiM0MzsgICAgIC0gcGxhdGZvcm0ga2V5cmluZwomIzQzOyAgICogLSBgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCAoYGAzYGApCiYjNDM7ICAgICAtIHRoZSBicGYga2V5cmluZwomIzQzOyAgICogLSBhbnl0aGluZyBlbHNlCiYjNDM7ICAgICAtIHNlcmlhbCBvZiBhIGNhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcKJiM0MzsKJiM0MztUaGUga2V5cmluZyBpcyByZXNvbHZlZCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhCiYjNDM7c2lnbmF0dXJlIG5hbWluZyBhIGtleXJpbmcgdGhhdCBjYW5ub3QgYmUgdXNlZCBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEKJiM0MztmYWlsZWQgdmVyaWZpY2F0aW9uIGFib3J0cyB0aGUgbG9hZCAtIGEgcHJvZ3JhbSB0aGF0IGxvYWRzIHN1Y2Nlc3NmdWxseSB3aXRoCiYjNDM7YSBzaWduYXR1cmUgdGhlcmVmb3JlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC4KJiM0MzsKJiM0MztUaGUgYnBmIGtleXJpbmcKJiM0MzstLS0tLS0tLS0tLS0tLS0KJiM0MzsKJiM0MztBIHN5c3RlbSBrZXlyaW5nIG5lZWRzIGEga2VybmVsIHJlYnVpbGQgb3IgYSB2b3VjaGVkLWZvciBlbnJvbGxtZW50IHRvIHJvdGF0ZSBhCiYjNDM7a2V5LCBhbmQgZ3JhbnRzIEJQRi1zaWduaW5nIHRydXN0IHRvIGtleXMgdHJ1c3RlZCBmb3IgZXZlcnl0aGluZyBlbHNlIGluIHRoZQomIzQzO2tlcm5lbCB0b28uIEEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcsIGF0IHRoZSBvdGhlciBleHRyZW1lLCBpcyBmaWxsZWQgYnkgdGhlCiYjNDM7dmVyeSBwcm9jZXNzIHRoYXQgbG9hZHMgdGhlIHByb2dyYW0gYW5kIHNvIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi4KJiM0MzsKJiM0MztUaGUgYnBmIGtleXJpbmcgZmlsbHMgdGhhdCBnYXAgYW5kIGlzIHRoZSB0cnVzdCBhbmNob3Igd2hpY2ggYSBzaWduZWQgQlBGCiYjNDM7ZGVwbG95bWVudCBzaG91bGQgYmUgYnVpbHQgb24gdG9wIG9mOiBhIGtleXJpbmcgbmFtZWQgYGAuYnBmYGAsIHNlbGVjdGVkIHdpdGgKJiM0MztgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCwgdGhhdCBhbiBvcGVyYXRvciBwcm92aXNpb25zIGF0IGJvb3Qgd2l0aCBhIGtleQomIzQzO3Njb3BlZCB0byBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCBub3RoaW5nIGVsc2UgaW4gdGhlIGtlcm5lbCYjMzk7cyB0cnVzdCBoaWVyYXJjaHkuCiYjNDM7SXQgaXMgb3duZWQgYnkgdGhlIG9wZXJhdG9yIHJhdGhlciB0aGFuIGJ5IHRoZSBsb2FkZXIsIGFuZCByb3RhdGFibGUgYWNyb3NzIGEKJiM0MztyZWJvb3Qgd2l0aG91dCB0b3VjaGluZyB0aGUga2VybmVsIGltYWdlLiBJdCBpcyBtb2RlbGxlZCBhZnRlciB0aGUgZG0tdmVyaXR5CiYjNDM7a2V5cmluZyAoc2VlIGBgZG1fdmVyaXR5LmtleXJpbmdfdW5zZWFsZWQ9YGApIGFuZCBwcm92aXNpb25lZCB0aGUgc2FtZSB3YXk6IGFuCiYjNDM7aW5pdHJkIHJ1bnMgdGhlIGBga2V5Y3RsYGAgc3RlcHMgYmVsb3cgYmVmb3JlIGhhbmRpbmcgb2ZmIHRvIHRoZSByb290ZnMuCiYjNDM7CiYjNDM7UHJvdmlzaW9uaW5nCiYjNDM7fn5+fn5+fn5+fn5+CiYjNDM7CiYjNDM7VGhlIGtleXJpbmcgaXMgY3JlYXRlZCBkdXJpbmcgYGBsYXRlX2luaXRjYWxsYGAgYW5kIGlzICoqc2VhbGVkIGVtcHR5KiogYnkKJiM0MztkZWZhdWx0OiBpdCBjYXJyaWVzIGEgcmVqZWN0LWFsbCByZXN0cmljdGlvbiwgc28gbm8ga2V5IGNhbiBldmVyIGJlIGFkZGVkIGFuZAomIzQzO2BgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgIGZhaWxzIHdpdGggYGAtRU5PS0VZYGAgZm9yIHRoZSB3aG9sZSBib290LgomIzQzOwomIzQzO2BgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgIGxlYXZlcyBpdCB1bnJlc3RyaWN0ZWQgYXQgaW5pdCBzbyB0aGUgaW5pdHJkIGNhbgomIzQzO3Byb3Zpc2lvbiBpdC4gVGhlIGtleXJpbmcgaXMgbm90IGxpbmtlZCBpbnRvIGFueSBwcm9jZXNzIGtleXJpbmcsIHNvIGl0IGlzCiYjNDM7YWRkcmVzc2VkIGJ5IHRoZSBzZXJpYWwgYGAvcHJvYy9rZXlzYGAgcmVwb3J0cy4gU3RlcHMgd291bGQgYmUgYXMgZm9sbG93czo6CiYjNDM7CiYjNDM7ICAgIHNlcmlhbD0weCQoYXdrICYjMzk7JDggPT0gJiMzNDtrZXlyaW5nJiMzNDsgJmFtcDsmYW1wOyAkOSA9PSAmIzM0Oy5icGY6JiMzNDsgeyBwcmludCAkMSB9JiMzOTsgL3Byb2Mva2V5cykKJiM0MzsKJiM0MzsgICAga2V5Y3RsIHBhZGQgYXN5bW1ldHJpYyAmIzM0OyYjMzQ7ICRzZXJpYWwgJmx0OyBzaWduaW5nX2tleS5kZXIKJiM0MzsgICAga2V5Y3RsIHJlc3RyaWN0X2tleXJpbmcgJHNlcmlhbAomIzQzOwomIzQzO0JvdGggc3RlcHMgYXJlIHJlcXVpcmVkOiB0aGUga2V5cmluZyBpcyBjb25zdWx0ZWQgb25seSBvbmNlIGl0IGlzICoqbm9uLWVtcHR5CiYjNDM7YW5kIHJlc3RyaWN0ZWQqKi4gQW4gdW5yZXN0cmljdGVkIGtleXJpbmcgaXMgaWdub3JlZCBldmVuIHdoZW4gaXQgaG9sZHMga2V5cywKJiM0MztzbyBhIGhhbGYtcHJvdmlzaW9uZWQga2V5cmluZyBpcyBpbmVydCByYXRoZXIgdGhhbiBhIHdlYWtlciB0cnVzdCBhbmNob3IsIGFuZCBhCiYjNDM7bG9hZCBuYW1pbmcgaXQgZmFpbHMgd2l0aCBgYC1FTk9LRVlgYCBhbmQgYSB2ZXJpZmllciBsb2cuIFJlc3RyaWN0aW5nIGNhbm5vdAomIzQzO2JlIHVuZG9uZS4KJiM0MzsKJiM0MztNb3JlIHRoYW4gb25lIGtleSBpcyBlbnJvbGxlZCBieSByZXBlYXRpbmcgdGhlIGBga2V5Y3RsIHBhZGRgYCBzdGVwOyB0aGUKJiM0MztyZXN0cmljdGlvbiBpcyBhcHBsaWVkIG9uY2UsIGFmdGVyIHRoZSBsYXN0IG9mIHRoZW06OgomIzQzOwomIzQzOyAgICBmb3Iga2V5IGluIC9ldGMvYnBmL2tleXMvKi5kZXI7IGRvCiYjNDM7ICAgICAgICBrZXljdGwgcGFkZCBhc3ltbWV0cmljICYjMzQ7JiMzNDsgJHNlcmlhbCAmbHQ7ICRrZXkKJiM0MzsgICAgZG9uZQomIzQzOwomIzQzOyAgICBrZXljdGwgcmVzdHJpY3Rfa2V5cmluZyAkc2VyaWFsCiYjNDM7ICAgIGtleWN0bCBzaG93ICRzZXJpYWwKJiM0MzsKJiM0MztUaGUgcmVzdHJpY3Rpb24gYm91bmRzIHdoYXQgY2FuIGJlIGFkZGVkLCBuZXZlciB3aGF0IGNhbiBiZSB0YWtlbiBhd2F5LiBBIGtleQomIzQzO3RoYXQgaXMgYWxyZWFkeSBlbnJvbGxlZCBjYW4gc3RpbGwgYmUgdW5saW5rZWQsIGFuZCB0aGUga2V5cmluZyBjbGVhcmVkIG9yCiYjNDM7cmV2b2tlZCwgYnkgYW55dGhpbmcgcnVubmluZyBhcyByb290LiBUaGF0IGRvZXMgbm90IHdlYWtlbiB0aGUgYW5jaG9yLCBzaW5jZQomIzQzO2Ega2V5cmluZyBsZWZ0IGVtcHR5IGlzIG5vIGxvbmdlciBjb25zdWx0ZWQgYW5kIGEgbG9hZCBuYW1pbmcgaXQgZmFpbHMgd2l0aAomIzQzO2BgLUVOT0tFWWBgLCBidXQgaXQgZG9lcyB0YWtlIHNpZ25lZCBsb2FkaW5nIG91dCB1bnRpbCB0aGUgbmV4dCBib290LiBEcm9wcGluZwomIzQzO3RoZSB1c2VyIHBlcm1pc3Npb25zIHRoZSBrZXlyaW5nIG5vIGxvbmdlciBuZWVkcyB3b3VsZCBjbG9zZSB0aGF0OyBhcyBhIHRoaXJkCiYjNDM7c3RlcCBpbiB0aGUgaW5pdHJkOjoKJiM0MzsKJiM0MzsgICAga2V5Y3RsIHNldHBlcm0gJHNlcmlhbCAweDA4MDMwMDAwCiYjNDM7CiYjNDM7V2hhdCByZW1haW5zIGlzIGBgS0VZX1BPU19TRUFSQ0hgYCBmb3IgdGhlIGluLWtlcm5lbCBzZWFyY2ggZHVyaW5nIHZlcmlmaWNhdGlvbiwKJiM0MztwbHVzIGBgS0VZX1VTUl9WSUVXYGAgYW5kIGBgS0VZX1VTUl9SRUFEYGAgc28gdGhlIGtleXJpbmcgc3RheXMgdmlzaWJsZSBpbgomIzQzO2BgL3Byb2Mva2V5c2BgIGFuZCBgYGtleWN0bCBzaG93YGAuCiYjNDM7CiYjNDM7UHJvdmlzaW9uaW5nIGhhcyB0byBjb21wbGV0ZSBiZWZvcmUgY29udHJvbCBwYXNzZXMgdG8gdGhlIHJvb3Rmcy4gVGhlIGtleXJpbmcKJiM0Mzt0YWtlcyBhbnkgbnVtYmVyIG9mIGtleXMgZm9yIGFzIGxvbmcgYXMgaXQgaXMgdW5yZXN0cmljdGVkLCBzbyBpdCBpcyB0aGUKJiM0MztyZXN0cmljdGlvbiB0aGF0IGJvdW5kcyB0aGUgZW5yb2xsZWQgc2V0LCBub3QgdGhlIGZpcnN0IGVucm9sbG1lbnQuIEJlZm9yZQomIzQzO3RoZSBpbml0cmQgaGFuZHMgb2ZmIGNvbnRyb2wsIGl0IG11c3QgdGhlcmVmb3JlIHJlc3RyaWN0IHRoZSBrZXlyaW5nIGFmdGVyCiYjNDM7dGhlIGxhc3QgZW5yb2xsbWVudC4KJiM0MzsKJiM0MztFbmZvcmNlbWVudAomIzQzO35+fn5+fn5+fn5+CiYjNDM7CiYjNDM7YGBicGYua2V5cmluZ191bnNlYWxlZD0xYGAgc3RhdGVzIHRoYXQgdGhlIGJwZiBrZXlyaW5nIGlzICp0aGUqIHRydXN0IGFuY2hvciBmb3IKJiM0Mzt0aGlzIGJvb3QsIHNvIGl0IGRvZXMgbW9yZSB0aGFuIHVuc2VhbC4gRnJvbSB0aGUgZmlyc3QgcHJvZ3JhbSBsb2FkIG9ud2FyZHMgYQomIzQzO2NhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5cmluZyBpcyByZWZ1c2VkIHdpdGggYGAtRVBFUk1gYCBhbmQgYSB2ZXJpZmllcgomIzQzO2xvZyBtZXNzYWdlLCB3aGV0aGVyIG9yIG5vdCBwcm92aXNpb25pbmcgZXZlciBjb21wbGV0ZWQuIFRoZSBzeXN0ZW0ga2V5cmluZ3MKJiM0MztzdGF5IHNlbGVjdGFibGUuCiYjNDM7CiYjNDM7RW5mb3JjZW1lbnQgaXMgcmVhZGFibGUgYXQgYGAvc3lzL21vZHVsZS9icGYvcGFyYW1ldGVycy9rZXlyaW5nX3Vuc2VhbGVkYGAsIGFuZAomIzQzO3JlYWQtb25seSB0aGVyZTogdGhlIGZsYWcgaXMgYGBfX3JvX2FmdGVyX2luaXRgYCBiZWhpbmQgYSAwNDQ0IHBhcmFtZXRlci4gSXQgaXMKJiM0MzthbHNvIGRlcml2ZWQgZnJvbSB0aGUgYm9vdCBmbGFnIHJhdGhlciB0aGFuIGZyb20gdGhlIGtleXJpbmcmIzM5O3MgcnVudGltZSBzdGF0ZSwKJiM0MztzbyB0aGVyZSBpcyBubyB3aW5kb3cgZWFybHkgaW4gYm9vdCBkdXJpbmcgd2hpY2ggYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyBpcwomIzQzO3N0aWxsIGFjY2VwdGVkLgomIzQzOwomIzQzO0NhbGxlci1zdXBwbGllZCBrZXlyaW5ncyBhcmUgZm9yIHN0YWdpbmcKJiM0MzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiYjNDM7CiYjNDM7QSBgYGtleXJpbmdfaWRgYCBuYW1pbmcgYSB1c2VyIG9yIHNlc3Npb24ga2V5IG9yIGtleXJpbmcgaXMgYSAqc3RhZ2luZyoKJiM0MzttZWNoYW5pc20sIG5vdCBhIHRydXN0IGFuY2hvcjogaXQgaXMgZmlsbGVkIGJ5IHRoZSBzYW1lIHVzZXJzcGFjZSB0aGF0IGxvYWRzIHRoZQomIzQzO3Byb2dyYW0sIHNvIHZlcmlmeWluZyBhZ2FpbnN0IGl0IGVzdGFibGlzaGVzIG9ubHkgdGhhdCB0aGUgbG9hZGVyIHNpZ25lZCB3aGF0IGl0CiYjNDM7bG9hZGVkLiBJdHMgcHVycG9zZSBpcyB0byBsZXQgc29mdHdhcmUgaW5zdGFsbGVkIG9udG8gYSBydW5uaW5nIHN5c3RlbSAtIHdob3NlCiYjNDM7c2lnbmluZyBrZXkgaXMgbm90IGVucm9sbGVkIGFueXdoZXJlIHlldCAtIHJ1biBzaWduZWQgdW50aWwgdGhhdCBrZXkgcmVhY2hlcyB0aGUKJiM0MzticGYga2V5cmluZyBvbiB0aGUgbmV4dCBib290LgomIzQzOwomIzQzO0Egc3lzdGVtIHRoYXQgaGFzIGNvbW1pdHRlZCB0byB0aGUgYnBmIGtleXJpbmcgcmVmdXNlcyB0aGlzIHBhdGggb3V0cmlnaHQgKHNlZQomIzQzO2BFbmZvcmNlbWVudGBfKS4gQSBzeXN0ZW0gdGhhdCBoYXMgbm90IGNhbiBzdGlsbCBhbGxvdyBpdCwgYnV0IGEgcG9saWN5IG11c3QKJiM0MztuZXZlciB0cmVhdCBgYEJQRl9TSUdfS0VZUklOR19VU0VSYGAgYXMgZXF1aXZhbGVudCB0byB0aGUgYnBmIG9yIHN5c3RlbQomIzQzO2tleXJpbmdzOyBpdCBzaG91bGQgYWxsb3dsaXN0IHRoZSBzcGVjaWZpYyBzZXJpYWxzIGl0IGlzIHdpbGxpbmcgdG8gc3RhZ2UgYW5kCiYjNDM7cGFpciB0aGF0IHdpdGggYSBCUEYgTFNNIHBvbGljeSBwcm90ZWN0aW5nIHRob3NlIGtleXMgZnJvbSB0YW1wZXJpbmcsIGFzIGluCiYjNDM7YEVuZm9yY2VtZW50IHZpYSBMU01zYF8uCiYjNDM7CiYjNDM7UmVjb3JkZWQgZmllbGRzCiYjNDM7LS0tLS0tLS0tLS0tLS0tCiAKIFR3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy0mZ3Q7YXV4LSZndDtzaWdgYCBmb3IgYW4gTFNNIHRvIGluc3BlY3Q6CiAKIGBga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYCkKICAgICBDbGFzc2lmaWVkIHB1cmVseSBmcm9tIGBga2V5cmluZ19pZGBgIHdoZW5ldmVyIHRoZSBwcm9ncmFtIGlzIHNpZ25lZDoKICAgICBgYEJQRl9TSUdfS0VZUklOR19CVUlMVElOYGAsIGBgX1NFQ09OREFSWWBgLCBgYF9QTEFURk9STWBgIGZvciB0aGUgc3lzdGVtCi0gICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXMKLSAgICBgYEJQRl9TSUdfS0VZUklOR19OT05FYGAgZm9yIGFuIHVuc2lnbmVkIHByb2dyYW0uCiYjNDM7ICAgIGtleXJpbmdzLCBgYF9CUEZgYCBmb3IgdGhlIGJwZiBrZXlyaW5nLCBvciBgYF9VU0VSYGAgZm9yIGEgY2FsbGVyLXN1cHBsaWVkCiYjNDM7ICAgIHVzZXIvc2Vzc2lvbiBrZXlyaW5nLiBJdCBpcyBgYEJQRl9TSUdfS0VZUklOR19OT05FYGAgZm9yIGFuIHVuc2lnbmVkCiYjNDM7ICAgIHByb2dyYW0uCiAKIGBga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYCkKICAgICBTZXQgKipvbmx5Kiogb24gYSBzdWNjZXNzZnVsIHZlcmlmaWNhdGlvbiwgdG8gdGhlIHNlcmlhbCBvZiB0aGUKLSAgICAqKnVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZyoqIHRoYXQgYGBrZXlyaW5nX2lkYGAgcmVzb2x2ZWQgdG8gLSB0aGUKJiM0MzsgICAgKipjYWxsZXItc3VwcGxpZWQga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlCiAgICAgb2JqZWN0IHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkIGFnYWluc3QsIG5vdCB0aGUgaW5kaXZpZHVhbCBhc3ltbWV0cmljCiAgICAga2V5IGluc2lkZSBpdCB0aGF0IG1hdGNoZWQgdGhlIHNpZ25lci4gUGFzc2luZwogICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcmIzM5O3MKLSAgICBzZXJpYWwuIFRoZSBzeXN0ZW0ga2V5cmluZ3MgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmQgZXhwb3NlIG5vIHNlcmlhbAotICAgIGhlcmUsIHNvIHRoZSBzZXJpYWwgaXMgYGAwYGAgZm9yIGJ1aWx0aW4sIHNlY29uZGFyeSBhbmQgcGxhdGZvcm0KLSAgICBzaWduYXR1cmVzLCBhbmQgYGAwYGAgZm9yIHVuc2lnbmVkIHByb2dyYW1zLiBJbiBvdGhlciB3b3JkcywgYSBub24temVybwotICAgIGBga2V5cmluZ19zZXJpYWxgYCBpcyBleGFjdGx5ICYjMzQ7dmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoCi0gICAgdGhpcyBzZXJpYWwmIzM0Oy4KJiM0MzsgICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFuZCB0aGUgYnBmIGtleXJpbmcgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmQKJiM0MzsgICAgZXhwb3NlIG5vIHNlcmlhbCBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciB0aGVtLCBhbmQgYGAwYGAgZm9yCiYjNDM7ICAgIHVuc2lnbmVkIHByb2dyYW1zLiBBIG5vbi16ZXJvIGBga2V5cmluZ19zZXJpYWxgYCBpcyB0aGVyZWZvcmUgZXhhY3RseQomIzQzOyAgICAmIzM0O3ZlcmlmaWVkIGFnYWluc3QgdGhlIGNhbGxlci1zdXBwbGllZCBrZXkva2V5cmluZyB3aXRoIHRoaXMgc2VyaWFsJiMzNDssIHdoaWNoCiYjNDM7ICAgIGlzIGV4YWN0bHkgdGhlIGNhc2UgYSBwb2xpY3kgaGFzIHRvIHNjcnV0aW5pc2UuCiAKIC4uIGxpc3QtdGFibGU6OgogICAgOmhlYWRlci1yb3dzOiAxCkBAIC00MzYsMTYgJiM0Mzs1NzUsNDkgQEAgVHdvIGZpZWxkcyBhcmUgcmVjb3JkZWQgaW4gYGBwcm9nLSZndDthdXgtJmd0O3NpZ2BgIGZvciBhbiBMU00gdG8gaW5zcGVjdDoKICAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgCiAgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk1gYAogICAgICAtIGBgMGBgCi0gICAqIC0gb3RoZXIgKGEgdXNlci9zZXNzaW9uIGtleSBzZXJpYWwpCiYjNDM7ICAgKiAtIGBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgCiYjNDM7ICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JQRmBgCiYjNDM7ICAgICAtIGBgMGBgCiYjNDM7ICAgKiAtIG90aGVyIChhIGNhbGxlci1zdXBwbGllZCBrZXkgc2VyaWFsKQogICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYAogICAgICAtIHNlcmlhbCBvZiB0aGUgcmVzb2x2ZWQga2V5L2tleXJpbmcKIAotUHJvZHVjaW5nIGEgc2lnbmVkIG9iamVjdAotPT09PT09PT09PT09PT09PT09PT09PT09PT0KJiM0MztQcm9kdWNpbmcgYW5kIGxvYWRpbmcgYSBzaWduZWQgb2JqZWN0CiYjNDM7PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQomIzQzOwomIzQzO0dlbmVyYXRpbmcgYSBzaWduaW5nIGtleQomIzQzOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQomIzQzOwomIzQzO1NpZ25pbmcgaXMgYWxnb3JpdGhtIGFnbm9zdGljOiB0aGUgYWxnb3JpdGhtIGNvbWVzIGZyb20gdGhlIFguNTA5IGNlcnRpZmljYXRlCiYjNDM7YW5kIHRoZSBQS0NTIzcgYGBTaWduZXJJbmZvYGAuIEFueXRoaW5nIHRoZSBYLjUwOSBhbmQgUEtDUyM3IHBhcnNlcnMgdW5kZXJzdGFuZAomIzQzO3dvcmtzIHdpdGggbm8gQlBGLXNpZGUgY2hhbmdlLiBCb3RoIGV4YW1wbGVzIGJlbG93IHJlYWQgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3QKJiM0Mztjb25maWcgZnJvbSBgYHg1MDkuZ2Vua2V5YGAsIGZvciB3aGljaCBgYGNlcnRzL3g1MDkuZ2Vua2V5YGAgc2VydmVzIGFzIGEKJiM0Mzt0ZW1wbGF0ZSAoc2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvbW9kdWxlLXNpZ25pbmcucnN0KS4gUlNBOjoKJiM0MzsKJiM0MzsgICAgb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLXNoYTI1NiAtZGF5cyAzNjUwMCAtYmF0Y2ggLXg1MDkgXAomIzQzOyAgICAgICAgICAgIC1jb25maWcgeDUwOS5nZW5rZXkgLW91dGZvcm0gUEVNIFwKJiM0MzsgICAgICAgICAgICAtb3V0IHNpZ25pbmdfa2V5LnBlbSAta2V5b3V0IHNpZ25pbmdfa2V5LnBlbQomIzQzOyAgICBvcGVuc3NsIHg1MDkgLWluIHNpZ25pbmdfa2V5LnBlbSAtb3V0Zm9ybSBkZXIgLW91dCBzaWduaW5nX2tleS5kZXIKJiM0MzsKJiM0MztNTC1EU0EtODcgKEZJUFMtMjA0KSwgd2hpY2ggbmVlZHMgb3BlbnNzbCAzLjUgb3IgbGF0ZXIgYW5kIGBgQ09ORklHX0NSWVBUT19NTERTQWBgCiYjNDM7aW4gdGhlIGtlcm5lbC4gTm90ZSB0aGUgYWJzZW5jZSBvZiBhIGRpZ2VzdCBvcHRpb246IE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UKJiM0MztpdHNlbGYgYW5kIG9wZW5zc2wgcmVqZWN0cyBhbiBleHBsaWNpdCBkaWdlc3QgZm9yIGl0OjoKJiM0MzsKJiM0MzsgICAgb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLWRheXMgMzY1MDAgLWJhdGNoIC14NTA5IFwKJiM0MzsgICAgICAgICAgICAtbmV3a2V5IE1MLURTQS04NyAtY29uZmlnIHg1MDkuZ2Vua2V5IC1vdXRmb3JtIFBFTSBcCiYjNDM7ICAgICAgICAgICAgLW91dCBzaWduaW5nX2tleS5wZW0gLWtleW91dCBzaWduaW5nX2tleS5wZW0KJiM0MzsgICAgb3BlbnNzbCB4NTA5IC1pbiBzaWduaW5nX2tleS5wZW0gLW91dGZvcm0gZGVyIC1vdXQgc2lnbmluZ19rZXkuZGVyCiYjNDM7CiYjNDM7YGBicGZ0b29sYGAgaGFuZGxlcyB0aGUgZm9sbG93aW5nIGludGVybmFsbHk6IG9wZW5zc2wgYmVmb3JlIDQuMCBjYW5ub3QgY29tYmluZQomIzQzO01MLURTQSB3aXRoIGBgQ01TX05PQVRUUmBgLCBzbyBpdCBmYWxscyBiYWNrIHRvIHNpZ25lZEF0dHJzLCB3aGVyZSBvbmx5IFNIQS01MTIKJiM0MztpcyBwZXJtaXR0ZWQuIFRoaXMgbWlycm9ycyB3aGF0IG1vZHVsZSBzaWduaW5nIGRvZXMgYXMgd2VsbC4KJiM0MzsKJiM0MztTaWduaW5nCiYjNDM7LS0tLS0tLQogCiBgYGJwZnRvb2xgYCBnZW5lcmF0ZXMgYW5kIHNpZ25zIGEgbGlnaHQgc2tlbGV0b24gaW4gb25lIHN0ZXA6OgogCi0gICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgJmx0O3ByaXZhdGVfa2V5LnBlbSZndDsgLWkgJmx0O2NlcnRpZmljYXRlLng1MDkmZ3Q7IFwKJiM0MzsgICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgc2lnbmluZ19rZXkucGVtIC1pIHNpZ25pbmdfa2V5LmRlciBcCiAgICAgICAgICAgICBvYmouYnBmLm8gJmd0OyBvYmoubHNrZWwuaAogCiBgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlcwpAQCAtNDU0LDEyICYjNDM7NjI2LDM2IEBAIHNpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS4KIHJlY29uc3RydWN0cyAtIGFuZCBhbHNvIGNvbXB1dGVzIGBgZXhjbF9wcm9nX2hhc2hgYCBhcyB0aGUgZGlnZXN0IG9mIHRoZSBsb2FkZXIKIGluc3RydWN0aW9ucyBzbyB0aGUgbWV0YWRhdGEgbWFwIGNhbiBiZSBib3VuZCB0byB0aGUgbG9hZGVyLiBUaGUgc2lnbmF0dXJlIGFuZAogaGFzaCBhcmUgZW1iZWRkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXI7IHRoZSBjZXJ0aWZpY2F0ZSBpcyB1c2VkIG9ubHkgZm9yCi1zaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuIExvYWRpbmcgdGhlIHNrZWxldG9uIHBlcmZvcm1zIHRoZQotY3JlYXRlL3BvcHVsYXRlL2ZyZWV6ZS9sb2FkIHNlcXVlbmNlIGRlc2NyaWJlZCBhYm92ZS4KJiM0MztzaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuCiYjNDM7CiYjNDM7TG9hZGluZwomIzQzOy0tLS0tLS0KJiM0MzsKJiM0MztUaGUgZ2VuZXJhdGVkIHNrZWxldG9uIGV4cG9zZXMgYGBrZXlyaW5nX2lkYGAsIHdoaWNoIHNlbGVjdHMgdGhlIGtleXJpbmcgdGhlCiYjNDM7a2VybmVsIHZlcmlmaWVzIGFnYWluc3QuIFNldCBpdCBiZXR3ZWVuIG9wZW4gYW5kIGxvYWQ7IGxvYWRpbmcgdGhlbiBwZXJmb3JtcwomIzQzO3RoZSBjcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlOjoKIAotQXQgcnVudGltZSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgY2hvc2VuIGtleXJpbmcgKGZvcgotZXhhbXBsZSBhZGRlZCB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nLCBvciBidWlsdCBpbnRvIHRoZSBrZXJuZWwmIzM5O3MgYnVpbHRpbiB0cnVzdGVkCi1rZXlyaW5nKSBmb3IgdmVyaWZpY2F0aW9uIHRvIHN1Y2NlZWQuCiYjNDM7ICAgIHN0cnVjdCBvYmogKnNrZWwgPSBvYmpfX29wZW4oKTsKJiM0MzsKJiM0MzsgICAgc2tlbC0mZ3Q7a2V5cmluZ19pZCA9IDM7ICAgICAgICAgICAvKiBWRVJJRllfVVNFX0JQRl9LRVlSSU5HICovCiYjNDM7ICAgIGVyciA9IG9ial9fbG9hZChza2VsKTsKJiM0MzsKJiM0MztGb3IgdGhlIHN0YWdpbmcgY2FzZSB0aGUgc2FtZSBvYmplY3QgaXMgbG9hZGVkIGFnYWluc3QgYSBrZXlyaW5nIHRoZSBjYWxsZXIKJiM0Mztwb3B1bGF0ZWQgaXRzZWxmLCB3aGljaCBvbmx5IHdvcmtzIG9uIGEgc3lzdGVtIHRoYXQgaGFzIG5vdCBzZXQKJiM0MztgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFgYDo6CiYjNDM7CiYjNDM7ICAgIC8qCiYjNDM7ICAgICAqIFN0YWdpbmcgb25seTogdGhpcyBrZXlyaW5nIGlzIHVuZGVyIHRoZSBsb2FkZXImIzM5O3Mgb3duIGNvbnRyb2wgYW5kCiYjNDM7ICAgICAqIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi4gU2VlICYjMzQ7Q2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIGFyZSBmb3IKJiM0MzsgICAgICogc3RhZ2luZyYjMzQ7LgomIzQzOyAgICAgKi8KJiM0MzsgICAga2V5X2lkID0gYWRkX2tleSgmIzM0O2FzeW1tZXRyaWMmIzM0OywgJiMzNDsmIzM0OywgZGVyLCBkZXJfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7CiYjNDM7ICAgIHNrZWwtJmd0O2tleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7CiYjNDM7ICAgIGVyciA9IG9ial9fbG9hZChza2VsKTsKJiM0MzsKJiM0MztFaXRoZXIgd2F5IHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBhbHJlYWR5IGJlIGluIHRoZSBjaG9zZW4ga2V5cmluZyBmb3IKJiM0Mzt2ZXJpZmljYXRpb24gdG8gc3VjY2VlZC4gRm9yIHRoZSBicGYga2V5cmluZyB0aGF0IGVucm9sbG1lbnQgaGFwcGVucyBvbmNlIGF0CiYjNDM7Ym9vdCwgc2VlIGBQcm92aXNpb25pbmdgXy4KIAogVUFQSSByZWZlcmVuY2UKID09PT09PT09PT09PT09CkBAIC00ODcsNiAmIzQzOzY4MywxMyBAQCBVQVBJIHJlZmVyZW5jZQogICAgIFRoZSBtYXAgY29udGVudCBpcyBub3QgaGFzaGVkIHNlcGFyYXRlbHkgYXQgYWxsIC0gaXQgaXMgY292ZXJlZCwgYXMgYnl0ZXMsCiAgICAgYnkgdGhlIHByb2dyYW0gc2lnbmF0dXJlLgogCiYjNDM7S2VybmVsIGNvbW1hbmQgbGluZToKJiM0MzsKJiM0MztgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPWBgCiYjNDM7ICAgIFNldCB0byBgYDFgYCB0byBsZWF2ZSB0aGUgYnBmIGtleXJpbmcgdW5zZWFsZWQgZm9yIHByb3Zpc2lvbmluZywgYW5kIHRvIG1ha2UKJiM0MzsgICAgaXQgdGhlIG9ubHkgbm9uLXN5c3RlbSBrZXlyaW5nIGEgbG9hZGVyIG1heSBzZWxlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBib290CiYjNDM7ICAgIChzZWUgYFRoZSBicGYga2V5cmluZ2BfKS4KJiM0MzsKIE5vdGVzIGFuZCBsaW1pdGF0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PQogCkBAIC00OTUsMyAmIzQzOzY5OCw1IEBAIE5vdGVzIGFuZCBsaW1pdGF0aW9ucwogICBleGNlZWQgaXQuCiAtIFRoZSBtZXRhZGF0YSBjb250YWluZXIgaXMgYSBzaW5nbGUtZWxlbWVudCBhcnJheSBtYXAsIGFjY2Vzc2VkIHRocm91Z2gKICAgYGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHJgYC4KJiM0MzstIFRoZSBicGYga2V5cmluZyBuZWVkcyBgYENPTkZJR19LRVlTYGA7IHdpdGhvdXQgaXQgdGhlcmUgaXMgbm8gYnBmIGtleXJpbmcKJiM0MzsgIGFuZCBgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCBuZXZlciByZXNvbHZlcy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmLmggYi9pbmNsdWRlL2xpbnV4L2JwZi5oCmluZGV4IGIzY2QyOGQ5ZTNiNTUuLjU3MWY3NzkyYTVjNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC9icGYuaApAQCAtMTczNSw2ICYjNDM7MTczNSw3IEBAIGVudW0gYnBmX3NpZ19rZXlyaW5nIHsKIAlCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZLAogCUJQRl9TSUdfS0VZUklOR19QTEFURk9STSwKIAlCUEZfU0lHX0tFWVJJTkdfVVNFUiwKJiM0MzsJQlBGX1NJR19LRVlSSU5HX0JQRiwKIH07CiAKIHN0cnVjdCBicGZfcHJvZ19hdXggewpAQCAtMzgxOSw2ICYjNDM7MzgyMCw4IEBAIHN0cnVjdCBicGZfa2V5IHsKICNpZiBkZWZpbmVkKENPTkZJR19LRVlTKSAmYW1wOyZhbXA7IGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKQogc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfdXNlcl9rZXkoczMyIHNlcmlhbCwgdTY0IGZsYWdzKTsKIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKTsKJiM0MztzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpOwomIzQzO2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZCk7CiB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KTsKIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCwKQEAgLTM4MzksNiAmIzQzOzM4NDIsMTYgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZCkKIAlyZXR1cm4gTlVMTDsKIH0KIAomIzQzO3N0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfa2V5cmluZyh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIE5VTEw7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbmxpbmUgYm9vbCBicGZfa2V5cmluZ19lbmZvcmNlZCh2b2lkKQomIzQzO3sKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KJiM0MzsKIHN0YXRpYyBpbmxpbmUgdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSkKIHsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmggYi9pbmNsdWRlL2xpbnV4L3ZlcmlmaWNhdGlvbi5oCmluZGV4IGRlYzdmMmJlYWJmZDQuLjFjYjU5ZGRkYTI1MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmgKJiM0MzsmIzQzOyYjNDM7IGIvaW5jbHVkZS9saW51eC92ZXJpZmljYXRpb24uaApAQCAtMTgsNiAmIzQzOzE4LDE2IEBACiAjZGVmaW5lIFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkcgKChzdHJ1Y3Qga2V5ICopMVVMKQogI2RlZmluZSBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkcgICgoc3RydWN0IGtleSAqKTJVTCkKIAomIzQzOy8qCiYjNDM7ICogVGhlIGlkIG9mIEJQRiYjMzk7cyAmIzM0Oy5icGYmIzM0OyBrZXlyaW5nLCByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNwYWNlLiBJdCBpcwomIzQzOyAqIGV4cGxpY2l0bHkgbm90IGEgc2VudGluZWwgbGlrZSB0aGUgdHdvIGFib3ZlIGFzIEJQRiByZXNvbHZlcyBpdCB0bwomIzQzOyAqIHRoZSBrZXlyaW5nIGl0c2VsZiBhbmQgcGFzc2VzIHRoYXQsIHNvIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSBuZXZlcgomIzQzOyAqIHNlZXMgdGhpcyB2YWx1ZSwgYW5kIHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKCkgbXVzdCBrZWVwIHJlamVjdGluZyBpdC4KJiM0MzsgKiBMZWZ0IGFzIGEgcGxhaW4gaW50ZWdlciBzbyB0aGF0IGhhbmRpbmcgaXQgb3ZlciBhcyBAdHJ1c3RlZF9rZXlzIGRvZXMKJiM0MzsgKiBub3QgY29tcGlsZS4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFZFUklGWV9VU0VfQlBGX0tFWVJJTkcJMwomIzQzOwogc3RhdGljIGlubGluZSBpbnQgc3lzdGVtX2tleXJpbmdfaWRfY2hlY2sodTY0IGlkKQogewogCWlmIChpZCAmZ3Q7ICh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORykKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvTWFrZWZpbGUgYi9rZXJuZWwvYnBmL01ha2VmaWxlCmluZGV4IDkwMjU1ZDgwZTViZTYuLjlhOTJjMzQ4YmJkYTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvTWFrZWZpbGUKJiM0MzsmIzQzOyYjNDM7IGIva2VybmVsL2JwZi9NYWtlZmlsZQpAQCAtMjcsNiAmIzQzOzI3LDkgQEAgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gb2ZmbG9hZC5vCiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICYjNDM7PSBuZXRfbmFtZXNwYWNlLm8KIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgJiM0Mzs9IHRjeC5vCiBlbmRpZgomIzQzO2lmZXEgKCQoQ09ORklHX0tFWVMpLHkpCiYjNDM7b2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0ga2V5cy5vCiYjNDM7ZW5kaWYKIGlmZXEgKCQoQ09ORklHX1BFUkZfRVZFTlRTKSx5KQogb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSAmIzQzOz0gc3RhY2ttYXAubwogZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYva2V5cy5jIGIva2VybmVsL2JwZi9rZXlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uNjBjYjg1Mjk1Yzg5YQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL2tlcm5lbC9icGYva2V5cy5jCkBAIC0wLDAgJiM0MzsxLDcyIEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQomIzQzOy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2NyZWQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgvZXJyLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L2luaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGludXgva2V5LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21vZHVsZXBhcmFtLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3NsYWIuaCZndDsKJiM0MzsKJiM0MzsjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAomIzQzOyNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCAmIzM0O2JwZi4mIzM0OwomIzQzOwomIzQzO3N0YXRpYyBzdHJ1Y3Qga2V5ICpicGZfa2V5cmluZzsKJiM0MzsKJiM0MztzdGF0aWMgYm9vbCBicGZfa2V5cmluZ191bnNlYWxlZCBfX3JvX2FmdGVyX2luaXQ7CiYjNDM7bW9kdWxlX3BhcmFtX25hbWVkKGtleXJpbmdfdW5zZWFsZWQsIGJwZl9rZXlyaW5nX3Vuc2VhbGVkLCBib29sLCAwNDQ0KTsKJiM0MztNT0RVTEVfUEFSTV9ERVNDKGtleXJpbmdfdW5zZWFsZWQsICYjMzQ7TGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkJiMzNDspOwomIzQzOwomIzQzO2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZCkKJiM0Mzt7CiYjNDM7CXJldHVybiBicGZfa2V5cmluZ191bnNlYWxlZDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfa2V5cmluZyh2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IGJwZl9rZXkgKmJrZXk7CiYjNDM7CiYjNDM7CWlmICghYnBmX2tleXJpbmcpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsJaWYgKCFSRUFEX09OQ0UoYnBmX2tleXJpbmctJmd0O2tleXMubnJfbGVhdmVzX29uX3RyZWUpIHx8CiYjNDM7CSAgICAhUkVBRF9PTkNFKGJwZl9rZXlyaW5nLSZndDtyZXN0cmljdF9saW5rKSkKJiM0MzsJCXJldHVybiBOVUxMOwomIzQzOwomIzQzOwlia2V5ID0ga21hbGxvY19vYmooKmJrZXkpOwomIzQzOwlpZiAoIWJrZXkpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJYmtleS0mZ3Q7a2V5ID0gYnBmX2tleXJpbmc7CiYjNDM7CWJrZXktJmd0O2hhc19yZWYgPSBmYWxzZTsKJiM0MzsJcmV0dXJuIGJrZXk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgX19pbml0IGJwZl9rZXlyaW5nX2luaXQodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBrZXkgKmtleXJpbmc7CiYjNDM7CiYjNDM7CWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKCYjMzQ7LmJwZiYjMzQ7LAomIzQzOwkJCQlHTE9CQUxfUk9PVF9VSUQsIEdMT0JBTF9ST09UX0dJRCwKJiM0MzsJCQkJY3VycmVudF9jcmVkKCksIEtFWV9QT1NfU0VBUkNIIHwKJiM0MzsJCQkJS0VZX1VTUl9WSUVXIHwgS0VZX1VTUl9SRUFEIHwKJiM0MzsJCQkJS0VZX1VTUl9XUklURSB8IEtFWV9VU1JfU0VBUkNIIHwKJiM0MzsJCQkJS0VZX1VTUl9TRVRBVFRSLCBLRVlfQUxMT0NfTk9UX0lOX1FVT1RBLAomIzQzOwkJCQlOVUxMLCBOVUxMKTsKJiM0MzsJaWYgKElTX0VSUihrZXlyaW5nKSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7YnBmOiBjYW5ub3QgYWxsb2NhdGUgYnBmIGtleXJpbmc6ICVsZFxuJiMzNDssCiYjNDM7CQkgICAgICAgUFRSX0VSUihrZXlyaW5nKSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwlpZiAoIWJwZl9rZXlyaW5nX3Vuc2VhbGVkICZhbXA7JmFtcDsKJiM0MzsJICAgIGtleXJpbmdfcmVzdHJpY3QobWFrZV9rZXlfcmVmKGtleXJpbmcsIHRydWUpLCBOVUxMLCBOVUxMKSkgewomIzQzOwkJcHJfZXJyKCYjMzQ7YnBmOiBjYW5ub3Qgc2VhbCBicGYga2V5cmluZ1xuJiMzNDspOwomIzQzOwkJa2V5X3Jldm9rZShrZXlyaW5nKTsKJiM0MzsJCWtleV9wdXQoa2V5cmluZyk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlicGZfa2V5cmluZyA9IGtleXJpbmc7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MztsYXRlX2luaXRjYWxsKGJwZl9rZXlyaW5nX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jCmluZGV4IGUwMzZhZTIwYmY2YjkuLjU1OGU1MThhZDMxMDkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYwomIzQzOyYjNDM7JiM0MzsgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKQEAgLTIwOTcyLDYgJiM0MzsyMDk3MiwxNCBAQCBpbnQgYnBmX2ZpeHVwX2tmdW5jX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuLAogCXJldHVybiAwOwogfQogCiYjNDM7LyoKJiM0MzsgKiBVcHBlciBib3VuZCBvbiB0aGUgUEtDUyM3IHNpZ25hdHVyZSBibG9iIHBhc3NlZCB3aXRoIGEgcHJvZ3JhbS4gQ29tZm9ydGFibHkKJiM0MzsgKiBhYm92ZSB0aGUgbGFyZ2VzdCBzaWduYXR1cmUgdGhlIGtlcm5lbCBjYW4gdmVyaWZ5LCBhbmQgZmFyIGJlbG93IGFueXRoaW5nCiYjNDM7ICogdGhhdCB3b3VsZCBtYWtlIHJlamVjdGluZyBhIGxvYWQgZXhwZW5zaXZlLiBEZWxpYmVyYXRlbHkgYSBmaXhlZCBudW1iZXIgc28KJiM0MzsgKiB0aGF0IHdoYXQgdGhlIHN5c2NhbGwgYWNjZXB0cyBkb2VzIG5vdCBkZXBlbmQgb24gUEFHRV9TSVpFLgomIzQzOyAqLwomIzQzOyNkZWZpbmUgQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFCSg2NCAqIDEwMjQpCiYjNDM7CiBzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpCiB7CiAJc3dpdGNoIChrZXlyaW5nX2lkKSB7CkBAIC0yMDk4MSw2ICYjNDM7MjA5ODksOCBAQCBzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpCiAJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZOwogCWNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6CiAJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07CiYjNDM7CWNhc2UgVkVSSUZZX1VTRV9CUEZfS0VZUklORzoKJiM0MzsJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlBGOwogCWRlZmF1bHQ6CiAJCXJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjsKIAl9CkBAIC0yMTAwOSwyMSAmIzQzOzIxMDE5LDMyIEBAIHN0YXRpYyBpbnQgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCXU2NCBkYXRhX3N6OwogCWludCBlcnIgPSAwOwogCi0JLyoKLQkgKiBEb24mIzM5O3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLgotCSAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LgotCSAqLwogCWlmICghYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUgfHwKLQkgICAgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUgJmd0OyBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKQomIzQzOwkgICAgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUgJmd0OyBCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkUpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLSZndDtrZXlyaW5nX2lkKSA9PSAwKQomIzQzOwomIzQzOwlpZiAoIXN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItJmd0O2tleXJpbmdfaWQpKSB7CiAJCWtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQllbHNlCi0JCWtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci0mZ3Q7a2V5cmluZ19pZCwgMCk7CiYjNDM7CX0gZWxzZSB7CiYjNDM7CQlpZiAoYXR0ci0mZ3Q7a2V5cmluZ19pZCAhPSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7CiYjNDM7CQkJaWYgKGJwZl9rZXlyaW5nX2VuZm9yY2VkKCkpIHsKJiM0MzsJCQkJdmVyYm9zZShlbnYsICYjMzQ7Y2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCwgdXNlIGJwZiBrZXlyaW5nXG4mIzM0Oyk7CiYjNDM7CQkJCXJldHVybiAtRVBFUk07CiYjNDM7CQkJfQomIzQzOwkJCWtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci0mZ3Q7a2V5cmluZ19pZCwgMCk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCWtleSA9IGJwZl9sb29rdXBfa2V5cmluZygpOwomIzQzOwkJfQomIzQzOwl9CiAJaWYgKCFrZXkpIHsKLQkJdmVyYm9zZShlbnYsICYjMzQ7Y2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxuJiMzNDssCi0JCQlhdHRyLSZndDtrZXlyaW5nX2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7CiYjNDM7CQlpZiAoYXR0ci0mZ3Q7a2V5cmluZ19pZCA9PSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7CiYjNDM7CQkJdmVyYm9zZShlbnYsICYjMzQ7dGhlIGJwZiBrZXlyaW5nIGlzIGVtcHR5IG9yIGhhcyBub3QgYmVlbiByZXN0cmljdGVkXG4mIzM0Oyk7CiYjNDM7CQkJcmV0dXJuIC1FTk9LRVk7CiYjNDM7CQl9IGVsc2UgewomIzQzOwkJCXZlcmJvc2UoZW52LCAmIzM0O2Nhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcbiYjMzQ7LAomIzQzOwkJCQlhdHRyLSZndDtrZXlyaW5nX2lkKTsKJiM0MzsJCQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJCX0KIAl9CiAKIAlzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemUpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oCmluZGV4IDc4YjZlMGViYjg1ZDguLjkzMTVhMWRiMWY3YzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmgKQEAgLTU3LDcgJiM0Mzs1Nyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqdTY0X3RvX3B0cihfX3U2NCBwdHIpCiAJfSkKIAogI2RlZmluZSBFUlJfTUFYX0xFTgkxMDI0Ci0jZGVmaW5lIE1BWF9TSUdfU0laRQk0MDk2CiYjNDM7I2RlZmluZSBNQVhfU0lHX1NJWkUJMTYzODQKIAogI2RlZmluZSBCUEZfVEFHX0ZNVAkmIzM0OyUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCYjMzQ7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYwppbmRleCA4ODcyNmE2ZGI2ZDBlLi4xYjU1MDJmNDhhZGQwIDEwMDY0NAotLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jCkBAIC0xMzAsNiAmIzQzOzEzMCw5IEBAIF9fdTMyIHJlZ2lzdGVyX3Nlc3Npb25fa2V5KGNvbnN0IGNoYXIgKmtleV9kZXJfcGF0aCkKIAogaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpCiB7CiYjNDM7CXVuc2lnbmVkIGludCBzaWduZXJfZmxhZ3MgPSBDTVNfTk9DRVJUUyB8IENNU19CSU5BUlkgfCBDTVNfTk9TTUlNRUNBUCB8CiYjNDM7CQkJCSAgICBDTVNfVVNFX0tFWUlEIHwgQ01TX05PQVRUUjsKJiM0MzsJY29uc3QgRVZQX01EICpjbXNfZGlnZXN0ID0gRVZQX3NoYTI1NigpOwogCUJJTyAqYmRfaW4gPSBOVUxMLCAqYmRfb3V0ID0gTlVMTDsKIAlFVlBfUEtFWSAqcHJpdmF0ZV9rZXkgPSBOVUxMOwogCUNNU19Db250ZW50SW5mbyAqY21zID0gTlVMTDsKQEAgLTE2Nyw2ICYjNDM7MTcwLDIxIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogCQlnb3RvIGNsZWFudXA7CiAJfQogCiYjNDM7I2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgJmd0Oz0gMHgzMDAwMDAwMEwgJmFtcDsmYW1wOyBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSICZsdDsgMHg0MDAwMDAwMEwKJiM0MzsJaWYgKEVWUF9QS0VZX2lzX2EocHJpdmF0ZV9rZXksICYjMzQ7TUwtRFNBLTQ0JiMzNDspIHx8CiYjNDM7CSAgICBFVlBfUEtFWV9pc19hKHByaXZhdGVfa2V5LCAmIzM0O01MLURTQS02NSYjMzQ7KSB8fAomIzQzOwkgICAgRVZQX1BLRVlfaXNfYShwcml2YXRlX2tleSwgJiMzNDtNTC1EU0EtODcmIzM0OykpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBNTC1EU0EgJiM0MzsgQ01TX05PQVRUUiBpcyBub3Qgc3VwcG9ydGVkIGJlZm9yZSBvcGVuc3NsLTQuMCwgc28KJiM0MzsJCSAqIGZhbGwgYmFjayB0byBzaWduZWRBdHRycy4gTUwtRFNBIGRvZXMgaXRzIG93biBoYXNoaW5nIGFuZAomIzQzOwkJICogaWdub3JlcyB0aGUgQ01TIGRpZ2VzdCwgZXhjZXB0IHdoZW4gc2lnbmVkQXR0cnMgYXJlIHVzZWQsCiYjNDM7CQkgKiB3aGVyZSBvbmx5IFNIQS01MTIgaXMgcGVybWl0dGVkLgomIzQzOwkJICovCiYjNDM7CQlzaWduZXJfZmxhZ3MgJmFtcDs9IH5DTVNfTk9BVFRSOwomIzQzOwkJY21zX2RpZ2VzdCA9IEVWUF9zaGE1MTIoKTsKJiM0MzsJfQomIzQzOyNlbmRpZgomIzQzOwogCWNtcyA9IENNU19zaWduKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAJCSAgICAgICBDTVNfTk9DRVJUUyB8IENNU19QQVJUSUFMIHwgQ01TX0JJTkFSWSB8IENNU19ERVRBQ0hFRCB8CiAJCQkgICAgICAgQ01TX1NUUkVBTSk7CkBAIC0xNzUsOSAmIzQzOzE5Myw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKQogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JaWYgKCFDTVNfYWRkMV9zaWduZXIoY21zLCB4NTA5LCBwcml2YXRlX2tleSwgRVZQX3NoYTI1NigpLAotCQkJICAgICBDTVNfTk9DRVJUUyB8IENNU19CSU5BUlkgfCBDTVNfTk9TTUlNRUNBUCB8Ci0JCQkgICAgIENNU19VU0VfS0VZSUQgfCBDTVNfTk9BVFRSKSkgewomIzQzOwlpZiAoIUNNU19hZGQxX3NpZ25lcihjbXMsIHg1MDksIHByaXZhdGVfa2V5LCBjbXNfZGlnZXN0LCBzaWduZXJfZmxhZ3MpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gY2xlYW51cDsKIAl9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGUKaW5kZXggNWYxYTNiZmMwNTY5Zi4uMDViM2VlNjQyOTBmYSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZQpAQCAtNjYzLDcgJiM0Mzs2NjMsNyBAQCAkKFRSVU5ORVJfQlBGX0xTS0VMUyk6ICUubHNrZWwuaDogJS5icGYubyAkKEJQRlRPT0wpIHwgJChUUlVOTkVSX09VVFBVVCkKIAl9KSAmYW1wOyZhbXA7IFwKIAlybSAtZiAkJCgmbHQ7Oi5vPS5sbGlua2VkMS5vKSAkJCgmbHQ7Oi5vPS5sbGlua2VkMi5vKSAkJCgmbHQ7Oi5vPS5sbGlua2VkMy5vKQogCi0kKFRSVU5ORVJfQlBGX0xTS0VMU19TSUdORUQpOiAlLmxza2VsLmg6ICUuYnBmLm8gJChCUEZUT09MKSB8ICQoVFJVTk5FUl9PVVRQVVQpCiYjNDM7JChUUlVOTkVSX0JQRl9MU0tFTFNfU0lHTkVEKTogJS5sc2tlbC5oOiAlLmJwZi5vICQoQlBGVE9PTCkgJChWRVJJRklDQVRJT05fQ0VSVCkgfCAkKFRSVU5ORVJfT1VUUFVUKQogCSQoUSkkKGlmICQoUEVSTUlTU0lWRSksaWYgWyAhIC1mICQkJmx0OyBdOyB0aGVuCQkJXAogCQkkJChSTSkgJCRAOwkJCQkJCVwKIAkJcHJpbnRmICYjMzk7ICAlLTEycyAlc1xuJiMzOTsgJiMzOTtTS0lQLVNLRUwmIzM5OyAmIzM5OyQkKG5vdGRpciAkJEApJiMzOTsgMSZndDsmYW1wOzI7IFwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnCmluZGV4IGVhNzA0NGYzMGFkYzMuLjJlYzE1MTE3YWJiNTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWcKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZwpAQCAtNTEsNiAmIzQzOzUxLDggQEAgQ09ORklHX0lQVjZfU0VHNl9MV1RVTk5FTD15CiBDT05GSUdfSVBWNl9TSVQ9eQogQ09ORklHX0lQVjZfVFVOTkVMPXkKIENPTkZJR19LRVlTPXkKJiM0MztDT05GSUdfQ1JZUFRPX01MRFNBPXkKJiM0MztDT05GSUdfQ1JZUFRPX1NIQTUxMj15CiBDT05GSUdfTElSQz15CiBDT05GSUdfTElWRVBBVENIPXkKIENPTkZJR19MV1RVTk5FTD15CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMKaW5kZXggNzczODFkMzQ1NDM1Yy4uNjIwYTZkMjJhNzU5YyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYwpAQCAtMzIsMTEgJiM0MzszMiwyMCBAQCBlbnVtIHsKIAlCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZLAogCUJQRl9TSUdfS0VZUklOR19QTEFURk9STSwKIAlCUEZfU0lHX0tFWVJJTkdfVVNFUiwKJiM0MzsJQlBGX1NJR19LRVlSSU5HX0JQRiwKIH07CiAKLXN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLAotCQkgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsCi0JCSAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpCiYjNDM7I2RlZmluZSBCUEZfS0VZUklOR19CUEYJCTMKJiM0MzsKJiM0MzsvKiB2ZXJpZnlfc2lnX3NldHVwLnNoIGV4aXRzIHdpdGggdGhpcyB3aGVuIG9wZW5zc2wgY2Fubm90IGRvIE1MLURTQS4gKi8KJiM0MzsjZGVmaW5lIFNFVFVQX1NLSVAJCSgtNzcpCiYjNDM7CiYjNDM7LyogRklQUy0yMDQgTUwtRFNBLTg3IHNpZ25hdHVyZSBzaXplLCBzZWUgaW5jbHVkZS9jcnlwdG8vbWxkc2EuaC4gKi8KJiM0MzsjZGVmaW5lIE1MRFNBODdfU0lHTkFUVVJFX1NJWkUJNDYyNwomIzQzOwomIzQzO3N0YXRpYyBpbnQgbG9hZF9sb2FkZXJfbG9nKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCwKJiM0MzsJCQkgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCwKJiM0MzsJCQkgICBfX3UzMiBmZF9hcnJheV9jbnQsIGNoYXIgKmxvZ19idWYsIF9fdTMyIGxvZ19zeikKIHsKIAl1bmlvbiBicGZfYXR0ciBhdHRyOwogCWludCBmZDsKQEAgLTQ4LDE4ICYjNDM7NTcsMzEgQEAgc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsCiAJYXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NCgmIzM0O0R1YWwgQlNEL0dQTCYjMzQ7KTsKIAlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7CiAJYXR0ci5mZF9hcnJheSA9IHB0cl90b191NjQoJmFtcDttYXBfZmQpOwomIzQzOwlhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDsKIAlpZiAoc2lnKSB7CiAJCWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpOwogCQlhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6OwogCQlhdHRyLmtleXJpbmdfaWQgPSBrZXlyaW5nX2lkOwogCX0KLQlhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDsKJiM0MzsJaWYgKGxvZ19idWYpIHsKJiM0MzsJCWF0dHIubG9nX2xldmVsID0gMTsKJiM0MzsJCWF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7CiYjNDM7CQlhdHRyLmxvZ19zaXplID0gbG9nX3N6OwomIzQzOwl9CiAJbWVtY3B5KGF0dHIucHJvZ19uYW1lLCAmIzM0O19fbG9hZGVyLnByb2cmIzM0Oywgc2l6ZW9mKCYjMzQ7X19sb2FkZXIucHJvZyYjMzQ7KSk7CiAJZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCAmYW1wO2F0dHIsCiAJCSAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTsKIAlyZXR1cm4gZmQgJmx0OyAwID8gLWVycm5vIDogZmQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCwKJiM0MzsJCSAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCwKJiM0MzsJCSAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpCiYjNDM7ewomIzQzOwlyZXR1cm4gbG9hZF9sb2FkZXJfbG9nKGluc25zLCBpbnNuc19zeiwgbWFwX2ZkLCBzaWcsIHNpZ19zeiwga2V5cmluZ19pZCwKJiM0MzsJCQkgICAgICAgZmRfYXJyYXlfY250LCBOVUxMLCAwKTsKJiM0Mzt9CiYjNDM7CiBzdGF0aWMgaW50IHJ1bl9nZW5fbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwKIAkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgZGF0YV9zeiwKIAkJCSAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeiwKQEAgLTE1NiwxMiAmIzQzOzE3OCwzMCBAQCBzdGF0aWMgaW50IHJ1bl9zZXR1cChjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmRpcikKIAl9CiAJaWYgKHdhaXRwaWQocGlkLCAmYW1wO3N0YXR1cywgMCkgJmx0OyAwKQogCQlyZXR1cm4gLWVycm5vOwotCXJldHVybiAoV0lGRVhJVEVEKHN0YXR1cykgJmFtcDsmYW1wOwotCQlXRVhJVFNUQVRVUyhzdGF0dXMpID09IDApID8gMCA6IC1FSU5WQUw7CiYjNDM7CWlmICghV0lGRVhJVEVEKHN0YXR1cykpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsJcmV0dXJuIC1XRVhJVFNUQVRVUyhzdGF0dXMpOwogfQogCi1zdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCi0JCSAgICB2b2lkICpzaWcsIF9fdTMyICpzaWdfc3opCiYjNDM7c3RhdGljIHZvaWQgZ2Vua2V5X2Rpcl9maW5pKGNvbnN0IGNoYXIgKmRpcikKJiM0Mzt7CiYjNDM7CXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZmlsZXNbXSA9IHsKJiM0MzsJCSYjMzQ7c2lnbmluZ19rZXkuZGVyJiMzNDssICYjMzQ7c2lnbmluZ19rZXkucGVtJiMzNDssICYjMzQ7eDUwOS5nZW5rZXkmIzM0OywKJiM0MzsJfTsKJiM0MzsJY2hhciBwYXRoW1BBVEhfTUFYXTsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CiYjNDM7CWlmICghZGlyKQomIzQzOwkJcmV0dXJuOwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgQVJSQVlfU0laRShmaWxlcyk7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICYjMzQ7JXMvJXMmIzM0OywgZGlyLCBmaWxlc1tpXSk7CiYjNDM7CQl1bmxpbmsocGF0aCk7CiYjNDM7CX0KJiM0MzsJcm1kaXIoZGlyKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzaWduX2J1Zl9kaWdlc3QoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbiwKJiM0MzsJCQkgICB2b2lkICpzaWcsIF9fdTMyICpzaWdfc3osIGNvbnN0IGNoYXIgKmRpZ2VzdCkKIHsKIAljaGFyIGRhdGFfdG1wbFtQQVRIX01BWF0sIGtleVtQQVRIX01BWF07CiAJY2hhciBzaWdwYXRoW1BBVEhfTUFYICYjNDM7IHNpemVvZigmIzM0Oy5wN3MmIzM0OyldOwpAQCAtMTc2LDYgJiM0MzsyMTYsNyBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCiAJZmQgPSBta3N0ZW1wKGRhdGFfdG1wbCk7CiAJaWYgKGZkICZsdDsgMCkKIAkJcmV0dXJuIC1lcnJubzsKJiM0MzsJc25wcmludGYoc2lncGF0aCwgc2l6ZW9mKHNpZ3BhdGgpLCAmIzM0OyVzLnA3cyYjMzQ7LCBkYXRhX3RtcGwpOwogCWlmICh3cml0ZShmZCwgYnVmLCBsZW4pICE9IChzc2l6ZV90KWxlbikgewogCQljbG9zZShmZCk7CiAJCXJldCA9IC1FSU87CkBAIC0xOTAsNyAmIzQzOzIzMSw3IEBAIHN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbiwKIAl9CiAJaWYgKHBpZCA9PSAwKSB7CiAJCXNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICYjMzQ7JXMvc2lnbmluZ19rZXkucGVtJiMzNDssIGRpcik7Ci0JCWV4ZWNscCgmIzM0Oy4vc2lnbi1maWxlJiMzNDssICYjMzQ7Li9zaWduLWZpbGUmIzM0OywgJiMzNDstZCYjMzQ7LCAmIzM0O3NoYTI1NiYjMzQ7LAomIzQzOwkJZXhlY2xwKCYjMzQ7Li9zaWduLWZpbGUmIzM0OywgJiMzNDsuL3NpZ24tZmlsZSYjMzQ7LCAmIzM0Oy1kJiMzNDssIGRpZ2VzdCwKIAkJICAgICAgIGtleSwga2V5LCBkYXRhX3RtcGwsIE5VTEwpOwogCQlleGl0KDEpOwogCX0KQEAgLTIwMCwzNCAmIzQzOzI0MSwzOCBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCiAJCWdvdG8gb3V0OwogCX0KIAotCXNucHJpbnRmKHNpZ3BhdGgsIHNpemVvZihzaWdwYXRoKSwgJiMzNDslcy5wN3MmIzM0OywgZGF0YV90bXBsKTsKIAlpZiAoc3RhdChzaWdwYXRoLCAmYW1wO3N0KSAmbHQ7IDApIHsKIAkJcmV0ID0gLWVycm5vOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKHN0LnN0X3NpemUgJmd0OyAob2ZmX3QpKnNpZ19zeikgewogCQlyZXQgPSAtRTJCSUc7Ci0JCWdvdG8gb3V0X3NpZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAlmZCA9IG9wZW4oc2lncGF0aCwgT19SRE9OTFkpOwogCWlmIChmZCAmbHQ7IDApIHsKIAkJcmV0ID0gLWVycm5vOwotCQlnb3RvIG91dF9zaWc7CiYjNDM7CQlnb3RvIG91dDsKIAl9CiAJaWYgKHJlYWQoZmQsIHNpZywgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSkgewogCQljbG9zZShmZCk7CiAJCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0X3NpZzsKJiM0MzsJCWdvdG8gb3V0OwogCX0KIAljbG9zZShmZCk7CiAJKnNpZ19zeiA9IHN0LnN0X3NpemU7Ci1vdXRfc2lnOgotCXVubGluayhzaWdwYXRoKTsKIG91dDoKJiM0MzsJdW5saW5rKHNpZ3BhdGgpOwogCXVubGluayhkYXRhX3RtcGwpOwogCXJldHVybiByZXQ7CiB9CiAKJiM0MztzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sCiYjNDM7CQkgICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6KQomIzQzO3sKJiM0MzsJcmV0dXJuIHNpZ25fYnVmX2RpZ2VzdChkaXIsIGJ1ZiwgbGVuLCBzaWcsIHNpZ19zeiwgJiMzNDtzaGEyNTYmIzM0Oyk7CiYjNDM7fQomIzQzOwogc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7CiAJc3RydWN0IHRlc3Rfc2lnbmVkX2xvYWRlciAqc2tlbDsKIAlzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzIGdvcHRzOwpAQCAtNDU3LDcgJiM0Mzs1MDIsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlyZXR1cm47Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTUyOSw3ICYjNDM7NTc0LDYgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyh2b2lkKQogCXN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9OwogCWNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9OwogCXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKLQl1bmlvbiBicGZfYXR0ciBhdHRyOwogCWludCBmZDsKIAogCWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpID09IDApIHsKQEAgLTUzOCwyMiAmIzQzOzU4Miw5IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZCkKIAkJICogZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSB2ZXJpZmllciBsb2cuIEEgcHJlc2VudC1idXQtCiAJCSAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LgogCQkgKi8KLQkJbWVtc2V0KCZhbXA7YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKLQkJYXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7Ci0JCWF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGYuZ29wdHMuaW5zbnMpOwotCQlhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pOwotCQlhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KCYjMzQ7RHVhbCBCU0QvR1BMJiMzNDspOwotCQlhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7Ci0JCWF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChqdW5rKTsKLQkJYXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpemVvZihqdW5rKTsKLQkJYXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HOwotCQlhdHRyLmxvZ19sZXZlbCA9IDE7Ci0JCWF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7Ci0JCWF0dHIubG9nX3NpemUgPSBzaXplb2YobG9nX2J1Zik7Ci0JCW1lbWNweShhdHRyLnByb2dfbmFtZSwgJiMzNDtfX2xvYWRlci5wcm9nJiMzNDssIHNpemVvZigmIzM0O19fbG9hZGVyLnByb2cmIzM0OykpOwotCi0JCWZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmFtcDthdHRyLAotCQkJICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpOwomIzQzOwkJZmQgPSBsb2FkX2xvYWRlcl9sb2coZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssCiYjNDM7CQkJCSAgICAgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDAsCiYjNDM7CQkJCSAgICAgbG9nX2J1Ziwgc2l6ZW9mKGxvZ19idWYpKTsKIAkJQVNTRVJUX0xUKGZkLCAwLCAmIzM0O2ludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWQmIzM0Oyk7CiAJCWlmIChmZCAmZ3Q7PSAwKQogCQkJY2xvc2UoZmQpOwpAQCAtNTcxLDggJiM0Mzs2MDIsOSBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfdG9vX2xhcmdlKHZvaWQpCiAKIAlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSA9PSAwKSB7CiAJCS8qCi0JCSAqIHNpZ25hdHVyZV9zaXplIGJleW9uZCB0aGUga2VybmVsJiMzOTtzIGJvdW5kIChLTUFMTE9DX01BWF9DQUNIRV9TSVpFKQotCQkgKiBpcyByZWplY3RlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyByZWFkLgomIzQzOwkJICogc2lnbmF0dXJlX3NpemUgYmV5b25kIHRoZSBrZXJuZWwmIzM5O3MgYm91bmQKJiM0MzsJCSAqIChCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkUpIGlzIHJlamVjdGVkIGJlZm9yZSB0aGUgYnVmZmVyCiYjNDM7CQkgKiBpcyByZWFkLgogCQkgKi8KIAkJZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuaywKIAkJCQkgNjQgJmx0OyZsdDsgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7CkBAIC02MjYsNiAmIzQzOzY1OCwyNjggQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2JhZF9rZXlyaW5nKHZvaWQpCiAJZ2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoJmFtcDtmKTsKIH0KIAomIzQzO3N0YXRpYyBib29sIGtleXJpbmdfdW5zZWFsZWRfYm9vdCh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciB2YWwgPSAwOwomIzQzOwlpbnQgZmQ7CiYjNDM7CiYjNDM7CWZkID0gb3BlbigmIzM0Oy9zeXMvbW9kdWxlL2JwZi9wYXJhbWV0ZXJzL2tleXJpbmdfdW5zZWFsZWQmIzM0OywgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgJmx0OyAwKQomIzQzOwkJcmV0dXJuIGZhbHNlOwomIzQzOwlpZiAocmVhZChmZCwgJmFtcDt2YWwsIDEpICE9IDEpCiYjNDM7CQl2YWwgPSAwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CXJldHVybiB2YWwgPT0gJiMzOTtZJiMzOTsgfHwgdmFsID09ICYjMzk7MSYjMzk7OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGJwZl9rZXlyaW5nX2xvb2t1cChpbnQgKm5yX2tleXMpCiYjNDM7ewomIzQzOwljaGFyIGxpbmVbNTEyXSwgdHlwZVszMl0sIGRlc2NbNjRdOwomIzQzOwlpbnQgc2VyaWFsID0gLUVOT0VOVDsKJiM0MzsJRklMRSAqZjsKJiM0MzsKJiM0MzsJZiA9IGZvcGVuKCYjMzQ7L3Byb2Mva2V5cyYjMzQ7LCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWlmICghZikKJiM0MzsJCXJldHVybiAtZXJybm87CiYjNDM7CiYjNDM7CXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7CiYjNDM7CQl1bnNpZ25lZCBpbnQgaGV4OwomIzQzOwkJY2hhciAqc3VtOwomIzQzOwomIzQzOwkJaWYgKHNzY2FuZihsaW5lLCAmIzM0OyV4ICUqcyAlKnMgJSpzICUqcyAlKnMgJSpzICUzMXMgJTYzcyYjMzQ7LAomIzQzOwkJCSAgICZhbXA7aGV4LCB0eXBlLCBkZXNjKSAhPSAzKQomIzQzOwkJCWNvbnRpbnVlOwomIzQzOwkJaWYgKHN0cmNtcCh0eXBlLCAmIzM0O2tleXJpbmcmIzM0OykgfHwgc3RyY21wKGRlc2MsICYjMzQ7LmJwZjomIzM0OykpCiYjNDM7CQkJY29udGludWU7CiYjNDM7CiYjNDM7CQlzZXJpYWwgPSAoaW50KWhleDsKJiM0MzsJCWlmIChucl9rZXlzKSB7CiYjNDM7CQkJc3VtID0gc3Ryc3RyKGxpbmUsICYjMzQ7LmJwZjogJiMzNDspOwomIzQzOwkJCSpucl9rZXlzID0gIXN1bSB8fCAhc3RybmNtcChzdW0gJiM0MzsgNiwgJiMzNDtlbXB0eSYjMzQ7LCA1KSA/CiYjNDM7CQkJCSAgIDAgOiBhdG9pKHN1bSAmIzQzOyA2KTsKJiM0MzsJCX0KJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CWZjbG9zZShmKTsKJiM0MzsJcmV0dXJuIHNlcmlhbDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGxvbmcga2V5Y3RsX3JldChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMykKJiM0Mzt7CiYjNDM7CWxvbmcgcmV0ID0gc3lzY2FsbChfX05SX2tleWN0bCwgY21kLCBhcmcyLCBhcmczKTsKJiM0MzsKJiM0MzsJcmV0dXJuIHJldCAmbHQ7IDAgPyAtZXJybm8gOiByZXQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogV2hhdCB0aGUgYnBmIGtleXJpbmcgc3RpbGwgbmVlZHMgb25jZSBpdCBnb3QgcHJvdmlzaW9uZWQ6IEtFWV9QT1NfU0VBUkNICiYjNDM7ICogZm9yIHRoZSBpbi1rZXJuZWwgc2VhcmNoIGR1cmluZyB2ZXJpZmljYXRpb24sIGFuZCB0aGUgdXNlciB2aWV3L3JlYWQgYml0cwomIzQzOyAqIHNvIGl0IHN0YXlzIHZpc2libGUgaW4gL3Byb2Mva2V5cywgcmVzdCBpcyBkcm9wcGVkIHNvIHRoZSBlbnJvbGxlZCBpcwomIzQzOyAqIHRoZXJlZm9yZSBmaW5hbC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIEJQRl9LRVlSSU5HX1BFUk1fTE9DS0VECQkweDA4MDMwMDAwCiYjNDM7LyogV2hhdCBicGZfa2V5cmluZ19pbml0KCkgZ3JhbnRzIGF0IGJvb3QuICovCiYjNDM7I2RlZmluZSBCUEZfS0VZUklOR19QRVJNX0lOSVRJQUwJMHgwODJmMDAwMAomIzQzOwomIzQzO3N0YXRpYyB2b2lkIGJwZl9rZXlyaW5nX3NlYWxlZCh2b2lkKQomIzQzO3sKJiM0MzsJc3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7fTsKJiM0MzsJc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmOwomIzQzOwlpbnQgc2VyaWFsLCBrZXksIGZkOwomIzQzOwomIzQzOwlpZiAoa2V5cmluZ191bnNlYWxlZF9ib290KCkpIHsKJiM0MzsJCXByaW50ZigmIzM0OyVzOlNLSVA6dGhlIGJwZiBrZXlyaW5nIHdhcyB1bnNlYWxlZCBhdCBib290XG4mIzM0OywgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CXNlcmlhbCA9IGJwZl9rZXlyaW5nX2xvb2t1cChOVUxMKTsKJiM0MzsJaWYgKHNlcmlhbCAmZ3Q7PSAwKSB7CiYjNDM7CQlrZXkgPSBzeXNjYWxsKF9fTlJfYWRkX2tleSwgJiMzNDt1c2VyJiMzNDssICYjMzQ7c2VhbHByb2JlJiMzNDssICYjMzQ7eCYjMzQ7LCAxLCBzZXJpYWwpOwomIzQzOwkJaWYgKGtleSAmZ3Q7PSAwKQomIzQzOwkJCXN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9VTkxJTkssIGtleSwgc2VyaWFsKTsKJiM0MzsJCUFTU0VSVF9FUShrZXkgJmx0OyAwID8gLWVycm5vIDogMCwgLUVQRVJNLAomIzQzOwkJCSAgJiMzNDtub3RoaW5nIGxpbmtzIGludG8gYSBzZWFsZWQga2V5cmluZyYjMzQ7KTsKJiM0MzsJfQomIzQzOwlpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoJmFtcDtmKSA9PSAwKSB7CiYjNDM7CQlmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLAomIzQzOwkJCQkgc2l6ZW9mKGp1bmspLCBCUEZfS0VZUklOR19CUEYsIDApOwomIzQzOwkJQVNTRVJUX0VRKGZkLCAtRU5PS0VZLCAmIzM0O3NlYWxlZCBicGYga2V5cmluZyByZWplY3RlZCYjMzQ7KTsKJiM0MzsJCWlmIChmZCAmZ3Q7PSAwKQomIzQzOwkJCWNsb3NlKGZkKTsKJiM0MzsJfQomIzQzOwlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHRyeV9sb2FkKGNvbnN0IHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYsIGNvbnN0IHZvaWQgKnNpZywKJiM0MzsJCSAgICBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsIGNoYXIgKmxvZ19idWYsIF9fdTMyIGxvZ19zeikKJiM0Mzt7CiYjNDM7CWludCBtYXBfZmQsIHByb2dfZmQ7CiYjNDM7CiYjNDM7CW1hcF9mZCA9IHNldHVwX21ldGFfbWFwKGYpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsICYjMzQ7bWV0YV9tYXAmIzM0OykpCiYjNDM7CQlyZXR1cm4gbWFwX2ZkOwomIzQzOwlwcm9nX2ZkID0gbG9hZF9sb2FkZXJfbG9nKGYtJmd0O2dvcHRzLmluc25zLCBmLSZndDtnb3B0cy5pbnNuc19zeiwgbWFwX2ZkLAomIzQzOwkJCQkgIHNpZywgc2lnX3N6LCBrZXlyaW5nX2lkLCAxLCBsb2dfYnVmLCBsb2dfc3opOwomIzQzOwljbG9zZShtYXBfZmQpOwomIzQzOwlpZiAocHJvZ19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UocHJvZ19mZCk7CiYjNDM7CXJldHVybiBwcm9nX2ZkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoaXMgbmVlZHMgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MSBvbiB0aGUgZ3Vlc3Qga2VybmVsIGNvbW1hbmQgbGluZSwgd2hpY2gKJiM0MzsgKiB2bXRlc3Quc2ggY2FuIHBhc3MgdmlhIEtFUk5FTF9DTURMSU5FX0VYVFJBLiBUaGVyZSBpcyBubyB3YXkgdG8gdW5zZWFsIHRoZQomIzQzOyAqIGtleXJpbmcgZnJvbSBoZXJlLCBzbyB3aXRob3V0IGl0IHRoZSB0ZXN0IHNraXBzLiBJdCBhbHNvIG9ubHkgd29ya3Mgb25jZQomIzQzOyAqIHBlciBib290LCBhcyByZXN0cmljdGluZyBhIGtleXJpbmcgY2Fubm90IGJlIHVuZG9uZS4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBicGZfa2V5cmluZ19wcm92aXNpb25lZCh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBkaXJfdG1wbFtdID0gJiMzNDsvdG1wL2JwZmtleXJpbmdYWFhYWFgmIzM0OzsKJiM0MzsJY2hhciBiYWRfdG1wbFtdID0gJiMzNDsvdG1wL2JwZmtleXJpbmdiYWRYWFhYWFgmIzM0OzsKJiM0MzsJX191OCAqc2lnID0gTlVMTCwgKmJhZCA9IE5VTEwsICpidWYgPSBOVUxMOwomIzQzOwlpbnQgc2VyaWFsLCBlcnI7CiYjNDM7CWludCBucl9rZXlzID0gMCwgZGVyX2ZkID0gLTE7CiYjNDM7CXN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjsKJiM0MzsJX191MzIgc2lnX3N6ID0gODE5MiwgYmFkX3N6OwomIzQzOwlib29sIGhhdmVfZml4dHVyZSA9IGZhbHNlOwomIzQzOwljaGFyICpkaXIsICpiYWRfZGlyID0gTlVMTDsKJiM0MzsJY2hhciBsb2dfYnVmWzEwMjRdID0ge307CiYjNDM7CWNoYXIgcGF0aFtQQVRIX01BWF07CiYjNDM7CV9fdTggZGVyWzQwOTZdOwomIzQzOwlzc2l6ZV90IGRlcl9zejsKJiM0MzsKJiM0MzsJc2VyaWFsID0gYnBmX2tleXJpbmdfbG9va3VwKCZhbXA7bnJfa2V5cyk7CiYjNDM7CWlmIChzZXJpYWwgJmx0OyAwKSB7CiYjNDM7CQlwcmludGYoJiMzNDslczpTS0lQOm5vIGJwZiBrZXlyaW5nIChuZWVkcyBDT05GSUdfS0VZUylcbiYjMzQ7LCBfX2Z1bmNfXyk7CiYjNDM7CQl0ZXN0X19za2lwKCk7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKG5yX2tleXMgIT0gMCkgewomIzQzOwkJcHJpbnRmKCYjMzQ7JXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgaGFzIGFscmVhZHkgYmVlbiBwcm92aXNpb25lZFxuJiMzNDssCiYjNDM7CQkgICAgICAgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCAmIzM0O21rZHRlbXAmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O2dlbmtleSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAgZ2Vua2V5JiMzNDspKQomIzQzOwkJZ290byBybWRpcjsKJiM0MzsKJiM0MzsJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAmIzM0OyVzL3NpZ25pbmdfa2V5LmRlciYjMzQ7LCBkaXIpOwomIzQzOwlkZXJfZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQoZGVyX2ZkLCAmIzM0O29wZW4gc2lnbmluZ19rZXkuZGVyJiMzNDspKQomIzQzOwkJZ290byBybWRpcjsKJiM0MzsJZGVyX3N6ID0gcmVhZChkZXJfZmQsIGRlciwgc2l6ZW9mKGRlcikpOwomIzQzOwljbG9zZShkZXJfZmQpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChkZXJfc3osIDAsICYjMzQ7cmVhZCBzaWduaW5nX2tleS5kZXImIzM0OykpCiYjNDM7CQlnb3RvIHJtZGlyOwomIzQzOwomIzQzOwllcnIgPSBzeXNjYWxsKF9fTlJfYWRkX2tleSwgJiMzNDthc3ltbWV0cmljJiMzNDssICYjMzQ7JiMzNDssIGRlciwgKHNpemVfdClkZXJfc3osCiYjNDM7CQkgICAgICBzZXJpYWwpOwomIzQzOwlpZiAoZXJyICZsdDsgMCAmYW1wOyZhbXA7IGVycm5vID09IEVQRVJNKSB7CiYjNDM7CQlwcmludGYoJiMzNDslczpTS0lQOnRoZSBicGYga2V5cmluZyBpcyBzZWFsZWQsIG5lZWQgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MVxuJiMzNDssCiYjNDM7CQkgICAgICAgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJZ290byBybWRpcjsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9HRShlcnIsIDAsICYjMzQ7YWRkIHRoZSBzaWduaW5nIGtleSB0byB0aGUgYnBmIGtleXJpbmcmIzM0OykpCiYjNDM7CQlnb3RvIHJtZGlyOwomIzQzOwomIzQzOwlzaWcgPSBtYWxsb2Moc2lnX3N6KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNpZywgJiMzNDtzaWcgYnVmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWhhdmVfZml4dHVyZSA9IHRydWU7CiYjNDM7CWlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdCgmYW1wO2YpICE9IDApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCAmIzM0O3NpZ25idWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJbWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7CiYjNDM7CW1lbWNweShidWYgJiM0MzsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihkaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3osIHNpZywKJiM0MzsJCQkJJmFtcDtzaWdfc3opLCAmIzM0O3NpZ24gaW5zbnN8fG1ldGFkYXRhJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLCAtRU5PS0VZLAomIzQzOwkJICAmIzM0O3VucmVzdHJpY3RlZCBrZXlyaW5nIHN0aWxsIG5vdCBjb25zdWx0ZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CUFTU0VSVF9FUSh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIE5VTEwsIDApLAomIzQzOwkJICAtRVBFUk0sICYjMzQ7Y2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCBiZWZvcmUgcHJvdmlzaW9uaW5nJiMzNDspOwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfUkVTVFJJQ1RfS0VZUklORywgc2VyaWFsLAomIzQzOwkJCSAgICAgICBOVUxMLCBOVUxMKSwgJiMzNDtyZXN0cmljdCBicGYga2V5cmluZyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19GRCh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLAomIzQzOwkJCSAgJiMzNDtsb2FkIHNpZ25lZCBieSBhIGtleSBpbiB0aGUgLmJwZiBrZXlyaW5nJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWJhZF9kaXIgPSBta2R0ZW1wKGJhZF90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGJhZF9kaXIsICYjMzQ7bWtkdGVtcCB1bmVucm9sbGVkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O2dlbmtleSYjMzQ7LCBiYWRfZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwIGdlbmtleSB1bmVucm9sbGVkJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWJhZF9zeiA9IDgxOTI7CiYjNDM7CWJhZCA9IG1hbGxvYyhiYWRfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoYmFkLCAmIzM0O2JhZCBzaWcgYnVmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX09LKHNpZ25fYnVmKGJhZF9kaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiAmIzQzOyBmLmRhdGFfc3osIGJhZCwKJiM0MzsJCQkJJmFtcDtiYWRfc3opLCAmIzM0O3NpZ24gd2l0aCBhbiB1bmVucm9sbGVkIGtleSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlBU1NFUlRfRVEodHJ5X2xvYWQoJmFtcDtmLCBiYWQsIGJhZF9zeiwgQlBGX0tFWVJJTkdfQlBGLCBsb2dfYnVmLAomIzQzOwkJCSAgIHNpemVvZihsb2dfYnVmKSksIC1FTk9LRVksCiYjNDM7CQkgICYjMzQ7a2V5IG91dHNpZGUgdGhlIGJwZiBrZXlyaW5nIHJlZnVzZWQmIzM0Oyk7CiYjNDM7CUFTU0VSVF9IQVNfU1VCU1RSKGxvZ19idWYsICYjMzQ7c2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQmIzM0OywKJiM0MzsJCQkgICYjMzQ7dGhlIGJwZiBrZXlyaW5nIHdhcyBjb25zdWx0ZWQmIzM0Oyk7CiYjNDM7CiYjNDM7CWYuYmxvYlswXSBePSAweGZmOwomIzQzOwllcnIgPSB0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApOwomIzQzOwlmLmJsb2JbMF0gXj0gMHhmZjsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgJiMzNDt0YW1wZXJlZCBtZXRhZGF0YSByZWZ1c2VkJiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfRVEodHJ5X2xvYWQoJmFtcDtmLCBzaWcsIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBOVUxMLCAwKSwKJiM0MzsJCSAgLUVQRVJNLCAmIzM0O2NhbGxlci1zdXBwbGllZCBrZXlyaW5nIHJlZnVzZWQgb25jZSAuYnBmIGlzIGluIHVzZSYjMzQ7KTsKJiM0MzsKJiM0MzsJZXJyID0ga2V5Y3RsX3JldChLRVlDVExfVU5MSU5LLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIHNlcmlhbCk7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FTk9FTlQsICYjMzQ7a2V5cmluZyB3cml0YWJsZSB3aGlsZSB0aGUgdXNlciBiaXRzIGFyZSB0aGVyZSYjMzQ7KTsKJiM0MzsKJiM0MzsJZXJyID0ga2V5Y3RsX3JldChLRVlDVExfU0VUUEVSTSwgc2VyaWFsLCBCUEZfS0VZUklOR19QRVJNX0xPQ0tFRCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtkcm9wIHRoZSB1c2VyIGJpdHMgb24gdGhlIGJwZiBrZXlyaW5nJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CUFTU0VSVF9PS19GRCh0cnlfbG9hZCgmYW1wO2YsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLAomIzQzOwkJICAgICAmIzM0O2xvYWQgc3RpbGwgdmVyaWZpZWQgYWdhaW5zdCB0aGUgbG9ja2VkIGtleXJpbmcmIzM0Oyk7CiYjNDM7CiYjNDM7CWVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1VOTElOSywgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBzZXJpYWwpOwomIzQzOwlBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCAmIzM0O3VubGluayByZWZ1c2VkJiMzNDspOwomIzQzOwllcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9DTEVBUiwgc2VyaWFsLCAwKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgJiMzNDtjbGVhciByZWZ1c2VkJiMzNDspOwomIzQzOwllcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9SRVZPS0UsIHNlcmlhbCwgMCk7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FQUNDRVMsICYjMzQ7cmV2b2tlIHJlZnVzZWQmIzM0Oyk7CiYjNDM7CWVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX0lOVkFMSURBVEUsIHNlcmlhbCwgMCk7CiYjNDM7CUFTU0VSVF9FUShlcnIsIC1FQUNDRVMsICYjMzQ7aW52YWxpZGF0ZSByZWZ1c2VkJiMzNDspOwomIzQzOwllcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRfVElNRU9VVCwgc2VyaWFsLCAxKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgJiMzNDt0aW1lb3V0IHJlZnVzZWQmIzM0Oyk7CiYjNDM7CWVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1NFVFBFUk0sIHNlcmlhbCwgQlBGX0tFWVJJTkdfUEVSTV9JTklUSUFMKTsKJiM0MzsJQVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgJiMzNDt0aGUgYml0cyBjYW5ub3QgYmUgZ3JhbnRlZCBiYWNrJiMzNDspOwomIzQzOwomIzQzOwlBU1NFUlRfRVEoYnBmX2tleXJpbmdfbG9va3VwKCZhbXA7bnJfa2V5cyksIHNlcmlhbCwgJiMzNDtrZXlyaW5nIHN0aWxsIHRoZXJlJiMzNDspOwomIzQzOwlBU1NFUlRfRVEobnJfa2V5cywgMSwgJiMzNDt0aGUgZW5yb2xsZWQga2V5IHN1cnZpdmVkJiMzNDspOwomIzQzO291dDoKJiM0MzsJaWYgKGhhdmVfZml4dHVyZSkKJiM0MzsJCWdlbl9sb2FkZXJfZml4dHVyZV9maW5pKCZhbXA7Zik7CiYjNDM7CWdlbmtleV9kaXJfZmluaShiYWRfZGlyKTsKJiM0MzsJZnJlZShidWYpOwomIzQzOwlmcmVlKGJhZCk7CiYjNDM7CWZyZWUoc2lnKTsKJiM0MztybWRpcjoKJiM0MzsJZ2Vua2V5X2Rpcl9maW5pKGRpcik7CiYjNDM7fQomIzQzOwogLyoKICAqIEEgc2lnbmVkIGxvYWRlciBtdXN0IGlnbm9yZSBjdHgtc3VwcGxpZWQgbWFwIGRpbWVuc2lvbnM6IHRoZSBob3N0IGNhbm5vdAogICogcmVzaXplIGEgc2lnbmVkIHByb2dyYW0mIzM5O3MgbWFwcyB2aWEgdGhlIGxvYWRlciBjdHguIERyaXZlIGEgb25lLW1hcCBwcm9ncmFtCkBAIC04MzEsNyAmIzQzOzExMjUsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNucyh2b2lkKQogCWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwogCWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKIAkJcmV0dXJuOwotCWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cC1yc2EmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiAJCXJtZGlyKGRpcik7CiAJCXJldHVybjsKIAl9CkBAIC05MzEsNyAmIzQzOzEyMjUsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19tZXRhZGF0YSh2b2lkKQogCWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwogCWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKIAkJcmV0dXJuOwotCWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cC1yc2EmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiAJCXJtZGlyKGRpcik7CiAJCXJldHVybjsKIAl9CkBAIC0xMjY3LDcgJiM0MzsxNTYxLDcgQEAgc3RhdGljIHZvaWQgbHNtX3NpZ25hdHVyZV92ZXJkaWN0KHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlnb3RvIG91dDsKLQlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cCYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKJiM0MzsJaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAtcnNhJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewogCQlybWRpcihkaXIpOwogCQlkaXIgPSBOVUxMOwogCQlnb3RvIG91dDsKQEAgLTE0NTAsNyAmIzQzOzE3NDQsNyBAQCBzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKQogCWRpciA9IG1rZHRlbXAoZGlyX3RtcGwpOwogCWlmICghQVNTRVJUX09LX1BUUihkaXIsICYjMzQ7bWtkdGVtcCYjMzQ7KSkKIAkJcmV0dXJuOwotCWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwJiMzNDssIGRpciksICYjMzQ7dmVyaWZ5X3NpZ19zZXR1cCYjMzQ7KSkgewomIzQzOwlpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoJiMzNDtzZXR1cC1yc2EmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiAJCXJtZGlyKGRpcik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTI0LDYgJiM0MzsxODE4LDg5IEBAIHN0YXRpYyB2b2lkIGxvYWR0aW1lX3dpdGhfbWFwKHZvaWQpCiAJdGVzdF9zaWduZWRfbG9hZGVyX21hcF9fZGVzdHJveShza2VsKTsKIH0KIAomIzQzOy8qCiYjNDM7ICogRW5kLXRvLWVuZCBzaWduZWQgbG9hZCB3aXRoIGEgcG9zdC1xdWFudHVtIGtleS4gTUwtRFNBIChGSVBTLTIwNCkgaXMgd2lyZWQKJiM0MzsgKiB0aHJvdWdoIHRoZSBYLjUwOSBhbmQgUEtDUyM3IHBhcnNlcnMsIGFuZCBCUEYgcmVhY2hlcyB0aGVtIHZpYQomIzQzOyAqIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSB3aXRob3V0IGtub3dpbmcgdGhlIGFsZ29yaXRobSwgc28gYW4gTUwtRFNBIGtleSBpbgomIzQzOyAqIHRoZSBrZXlyaW5nIHNob3VsZCB2ZXJpZnkgYW4gTUwtRFNBIHNpZ25lZCBwcm9ncmFtIHdpdGggbm8gQlBGLXNpZGUgd29yay4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBtbGRzYV9zaWduZWRfbG9hZCh2b2lkKQomIzQzO3sKJiM0MzsJY2hhciBkaXJfdG1wbFtdID0gJiMzNDsvdG1wL2JwZm1sZHNhWFhYWFhYJiMzNDs7CiYjNDM7CWludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xLCBlcnI7CiYjNDM7CV9fdTggKnNpZyA9IE5VTEwsICpidWYgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7CiYjNDM7CWJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7CiYjNDM7CV9fdTMyIHNpZ19zeiA9IDE2Mzg0OwomIzQzOwljaGFyICpkaXI7CiYjNDM7CiYjNDM7CXN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgJiMzNDtrZXlyaW5nJiMzNDssICYjMzQ7X3VpZC4wJiMzNDssIE5VTEwsCiYjNDM7CQlLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpOwomIzQzOwlkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBydW5fc2V0dXAoJiMzNDtzZXR1cC1tbGRzYSYjMzQ7LCBkaXIpOwomIzQzOwlpZiAoZXJyID09IFNFVFVQX1NLSVApIHsKJiM0MzsJCXByaW50ZigmIzM0OyVzOlNLSVA6b3BlbnNzbCBoYXMgbm8gTUwtRFNBIHN1cHBvcnQgKG5lZWRzIDMuNSYjNDM7KVxuJiMzNDssCiYjNDM7CQkgICAgICAgX19mdW5jX18pOwomIzQzOwkJdGVzdF9fc2tpcCgpOwomIzQzOwkJZ2Vua2V5X2Rpcl9maW5pKGRpcik7CiYjNDM7CQlyZXR1cm47CiYjNDM7CX0KJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAgc2V0dXAtbWxkc2EmIzM0OykpIHsKJiM0MzsJCWdlbmtleV9kaXJfZmluaShkaXIpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CXNpZyA9IG1hbGxvYyhzaWdfc3opOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2lnLCAmIzM0O3NpZyBidWYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaGF2ZV9maXh0dXJlID0gdHJ1ZTsKJiM0MzsJaWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KCZhbXA7ZikgIT0gMCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWYgPSBtYWxsb2MoKHNpemVfdClmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeik7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihidWYsICYjMzQ7c2lnbmJ1ZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwltZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTsKJiM0MzsJbWVtY3B5KGJ1ZiAmIzQzOyBmLmdvcHRzLmluc25zX3N6LCBmLmJsb2IsIGYuZGF0YV9zeik7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UgaXRzZWxmLCBidXQgb3BlbnNzbCBiZWZvcmUgNC4wIGNhbm5vdAomIzQzOwkgKiBwcm9kdWNlIGEgQ01TIG1lc3NhZ2Ugd2l0aG91dCBzaWduZWRBdHRycyBmb3IgaXQsIGFuZCB3aXRoIHRob3NlIGluCiYjNDM7CSAqIHBsYXkgb25seSBTSEEtNTEyIGlzIHBlcm1pdHRlZCBmb3IgdGhlIG1lc3NhZ2VEaWdlc3QgYXR0cmlidXRlLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFBU1NFUlRfT0soc2lnbl9idWZfZGlnZXN0KGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICYjNDM7IGYuZGF0YV9zeiwKJiM0MzsJCQkJICAgICAgIHNpZywgJmFtcDtzaWdfc3osICYjMzQ7c2hhNTEyJiMzNDspLAomIzQzOwkJICAgICAgICYjMzQ7c2lnbiBpbnNuc3x8bWV0YWRhdGEgd2l0aCBNTC1EU0EmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogR3VhcmQgYWdhaW5zdCB0aGUgc2V0dXAgc2lsZW50bHkgaGFuZGluZyBiYWNrIHNvbWUgb3RoZXIga2V5IHR5cGU6CiYjNDM7CSAqIGFuIFJTQSBvciBFQ0RTQSBzaWduYXR1cmUgaXMgYSBmZXcgaHVuZHJlZCBieXRlcywgd2hlcmUgYW4gTUwtRFNBLTg3CiYjNDM7CSAqIG9uZSBjYW5ub3QgYmUgc21hbGxlciB0aGFuIHRoZSByYXcgc2lnbmF0dXJlIGl0IGNhcnJpZXMuCiYjNDM7CSAqLwomIzQzOwlBU1NFUlRfR1Qoc2lnX3N6LCBNTERTQTg3X1NJR05BVFVSRV9TSVpFLCAmIzM0O01MLURTQS04NyBzaWduYXR1cmUgc2l6ZSYjMzQ7KTsKJiM0MzsKJiM0MzsJbWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoJmFtcDtmKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCAmIzM0O21ldGFfbWFwJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CXByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZywKJiM0MzsJCQkgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7CiYjNDM7CUFTU0VSVF9PS19GRChwcm9nX2ZkLCAmIzM0O01MLURTQSBzaWduZWQgbG9hZGVyIGxvYWQmIzM0Oyk7CiYjNDM7b3V0OgomIzQzOwlpZiAocHJvZ19mZCAmZ3Q7PSAwKQomIzQzOwkJY2xvc2UocHJvZ19mZCk7CiYjNDM7CWlmIChtYXBfZmQgJmd0Oz0gMCkKJiM0MzsJCWNsb3NlKG1hcF9mZCk7CiYjNDM7CWlmIChoYXZlX2ZpeHR1cmUpCiYjNDM7CQlnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaSgmYW1wO2YpOwomIzQzOwlmcmVlKGJ1Zik7CiYjNDM7CWZyZWUoc2lnKTsKJiM0MzsJcnVuX3NldHVwKCYjMzQ7Y2xlYW51cCYjMzQ7LCBkaXIpOwomIzQzO30KJiM0MzsKIC8qCiAgKiBBIHNpZ25lZCBwcm9ncmFtIG5lZWQgbm90IGJpbmQgYW55IG1hcC4gQSBwbGFpbiBCUEZfUFJPR19UWVBFX1NZU0NBTEwKICAqIHByb2dyYW0gd2l0aCBubyBmZF9hcnJheSBpcyBzaWduZWQgb3ZlciBpdHMgaW5zdHJ1Y3Rpb25zIGFsb25lOiB0aGUga2VybmVsCkBAIC0xNTQ4LDcgJiM0MzsxOTI1LDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX25vX2ZkX2FycmF5KHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlyZXR1cm47Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2MTksNyAmIzQzOzE5OTYsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbWFwX2J5X2ZkX3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlnb3RvIG91dF9tYXA7Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJZ290byBvdXRfbWFwOwogCX0KQEAgLTE2ODEsNyAmIzQzOzIwNTgsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlnb3RvIG91dF9tYXA7Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJZ290byBvdXRfbWFwOwogCX0KQEAgLTE3MzUsNyAmIzQzOzIxMTIsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKHZvaWQpCiAJZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7CiAJaWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgJiMzNDtta2R0ZW1wJiMzNDspKQogCQlyZXR1cm47Ci0JaWYgKCFBU1NFUlRfT0socnVuX3NldHVwKCYjMzQ7c2V0dXAmIzM0OywgZGlyKSwgJiMzNDt2ZXJpZnlfc2lnX3NldHVwJiMzNDspKSB7CiYjNDM7CWlmICghQVNTRVJUX09LKHJ1bl9zZXR1cCgmIzM0O3NldHVwLXJzYSYjMzQ7LCBkaXIpLCAmIzM0O3ZlcmlmeV9zaWdfc2V0dXAmIzM0OykpIHsKIAkJcm1kaXIoZGlyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE3NzksNiAmIzQzOzIxNTYsMTEgQEAgc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKQogCiB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKQogewomIzQzOwlpZiAoa2V5cmluZ191bnNlYWxlZF9ib290KCkpIHsKJiM0MzsJCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7YnBmX2tleXJpbmdfcHJvdmlzaW9uZWQmIzM0OykpCiYjNDM7CQkJYnBmX2tleXJpbmdfcHJvdmlzaW9uZWQoKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQogCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bG9hZHRpbWVfbm9fbWFwJiMzNDspKQogCQlsb2FkdGltZV9ub19tYXAoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2xvYWR0aW1lX3dpdGhfbWFwJiMzNDspKQpAQCAtMTgwNSw2ICYjNDM7MjE4NywxMCBAQCB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKQogCQlzaWduYXR1cmVfemVyb19zaXplKCk7CiAJaWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoJiMzNDtzaWduYXR1cmVfYmFkX2tleXJpbmcmIzM0OykpCiAJCXNpZ25hdHVyZV9iYWRfa2V5cmluZygpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O2JwZl9rZXlyaW5nX3NlYWxlZCYjMzQ7KSkKJiM0MzsJCWJwZl9rZXlyaW5nX3NlYWxlZCgpOwomIzQzOwlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21sZHNhX3NpZ25lZF9sb2FkJiMzNDspKQomIzQzOwkJbWxkc2Ffc2lnbmVkX2xvYWQoKTsKIAlpZiAodGVzdF9fc3RhcnRfc3VidGVzdCgmIzM0O21ldGFkYXRhX2N0eF9tYXhfZW50cmllc19pZ25vcmVkJiMzNDspKQogCQltZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCgpOwogCWlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KCYjMzQ7bWV0YWRhdGFfY3R4X2luaXRpYWxfdmFsdWVfaWdub3JlZCYjMzQ7KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYwppbmRleCBmMzI3ZmViOGUzOGMzLi4xMmIxNDZkMjA1ZDc1IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmMKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jCkBAIC0yNTcsNyAmIzQzOzI1Nyw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfdmVyaWZ5X3BrY3M3X3NpZ19mcm9tX21hcCh2b2lkKQogCWlmICghQVNTRVJUX09LX1BUUih0bXBfZGlyLCAmIzM0O21rZHRlbXAmIzM0OykpCiAJCXJldHVybjsKIAotCXJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCAmIzM0O3NldHVwJiMzNDspOwomIzQzOwlyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgJiMzNDtzZXR1cC1yc2EmIzM0Oyk7CiAJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O19ydW5fc2V0dXBfcHJvY2VzcyYjMzQ7KSkKIAkJZ290byBjbG9zZV9wcm9nOwogCkBAIC00NTgsNyAmIzQzOzQ1OCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfcGtjczdfc2lnX2ZzdmVyaXR5KHZvaWQpCiAJc25wcmludGYoZGF0YV9wYXRoLCBQQVRIX01BWCwgJiMzNDslcy9kYXRhLWZpbGUmIzM0OywgdG1wX2Rpcik7CiAJc25wcmludGYoc2lnX3BhdGgsIFBBVEhfTUFYLCAmIzM0OyVzL3NpZy1maWxlJiMzNDssIHRtcF9kaXIpOwogCi0JcmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsICYjMzQ7c2V0dXAmIzM0Oyk7CiYjNDM7CXJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCAmIzM0O3NldHVwLXJzYSYjMzQ7KTsKIAlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7X3J1bl9zZXR1cF9wcm9jZXNzJiMzNDspKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZlcmlmeV9zaWdfc2V0dXAuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaAppbmRleCAwOTE3OWZiNTUxZjA5Li4yNzM3YzFhMmJjZmQ2IDEwMDc1NQotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaApAQCAtMjgsNyAmIzQzOzI4LDcgQEAgYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZAogCiB1c2FnZSgpCiB7Ci0JZWNobyAmIzM0O1VzYWdlOiAkMCAmbHQ7c2V0dXB8Y2xlYW51cCAmbHQ7ZXhpc3RpbmdfdG1wX2RpciZndDsmIzM0OwomIzQzOwllY2hvICYjMzQ7VXNhZ2U6ICQwICZsdDtzZXR1cC1yc2F8c2V0dXAtbWxkc2F8Y2xlYW51cCAmbHQ7ZXhpc3RpbmdfdG1wX2RpciZndDsmIzM0OwogCWV4aXQgMQogfQogCkBAIC00Nyw3ICYjNDM7NDcsNyBAQCBnZW5rZXkoKQogCQkke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAtb3V0Zm9ybSBkZXIKIH0KIAotc2V0dXAoKQomIzQzO3NldHVwX3JzYSgpCiB7CiAJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKIApAQCAtNTcsNiAmIzQzOzU3LDU3IEBAIHNldHVwKCkKIAlrZXljdGwgbGluayAka2V5X2lkICRrZXlyaW5nX2lkCiB9CiAKJiM0MzttbGRzYV9zdXBwb3J0ZWQoKQomIzQzO3sKJiM0MzsJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKJiM0MzsKJiM0MzsJZ2Vua2V5X21sZHNhICYjMzQ7JHt0bXBfZGlyfSYjMzQ7IHx8IHJldHVybiAxCiYjNDM7CTogJmd0OyAke3RtcF9kaXJ9L3Byb2JlCiYjNDM7CSMgU2FtZSBkaWdlc3QgYXMgdGhlIGNhbGxlciBzaWducyB3aXRoLCBzZWUgc2lnbl9idWZfZGlnZXN0KCkuCiYjNDM7CS4vc2lnbi1maWxlIC1kIHNoYTUxMiAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcCiYjNDM7CQkke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSAke3RtcF9kaXJ9L3Byb2JlIHx8IHJldHVybiAxCiYjNDM7CXJtIC1mICR7dG1wX2Rpcn0vcHJvYmUgJHt0bXBfZGlyfS9wcm9iZS5wN3MKJiM0Mzt9CiYjNDM7CiYjNDM7Z2Vua2V5X21sZHNhKCkKJiM0Mzt7CiYjNDM7CWxvY2FsIHRtcF9kaXI9JiMzNDskMSYjMzQ7CiYjNDM7CiYjNDM7CWVjaG8gJiMzNDske3g1MDlfZ2Vua2V5X2NvbnRlbnR9JiMzNDsgJmd0OyAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5CiYjNDM7CiYjNDM7CSMgTm8gLSZsdDtkaWdlc3QmZ3Q7IGhlcmU6IE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UgaXRzZWxmLCBhbmQgb3BlbnNzbAomIzQzOwkjIHJlamVjdHMgYW4gZXhwbGljaXQgZGlnZXN0IGZvciBpdC4KJiM0MzsJb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLWRheXMgMzY1MDAgXAomIzQzOwkJCS1iYXRjaCAteDUwOSAtbmV3a2V5IE1MLURTQS04NyBcCiYjNDM7CQkJLWNvbmZpZyAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5IFwKJiM0MzsJCQktb3V0Zm9ybSBQRU0gLW91dCAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcCiYjNDM7CQkJLWtleW91dCAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSAyJmd0OyZhbXA7MQomIzQzOwomIzQzOwlvcGVuc3NsIHg1MDkgLWluICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIC1vdXQgXAomIzQzOwkJJHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgLW91dGZvcm0gZGVyCiYjNDM7fQomIzQzOwomIzQzO21sZHNhX3NraXAoKQomIzQzO3sKJiM0MzsJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKJiM0MzsKJiM0MzsJcm0gLWYgJHt0bXBfZGlyfS94NTA5LmdlbmtleSAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcCiYjNDM7CQkke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAke3RtcF9kaXJ9L3Byb2JlIFwKJiM0MzsJCSR7dG1wX2Rpcn0vcHJvYmUucDdzCiYjNDM7CWV4aXQgNzcKJiM0Mzt9CiYjNDM7CiYjNDM7c2V0dXBfbWxkc2EoKQomIzQzO3sKJiM0MzsJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKJiM0MzsKJiM0MzsJbWxkc2Ffc3VwcG9ydGVkICYjMzQ7JHt0bXBfZGlyfSYjMzQ7IHx8IG1sZHNhX3NraXAgJiMzNDske3RtcF9kaXJ9JiMzNDsKJiM0MzsJa2V5X2lkPSQoY2F0ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkuZGVyIHwKJiM0MzsJCSBrZXljdGwgcGFkZCBhc3ltbWV0cmljIGVicGZfdGVzdGluZ19rZXkgQHMpCiYjNDM7CWtleXJpbmdfaWQ9JChrZXljdGwgbmV3cmluZyBlYnBmX3Rlc3Rpbmdfa2V5cmluZyBAcykKJiM0MzsJa2V5Y3RsIGxpbmsgJGtleV9pZCAka2V5cmluZ19pZAomIzQzO30KJiM0MzsKIGNsZWFudXAoKSB7CiAJbG9jYWwgdG1wX2Rpcj0mIzM0OyQxJiMzNDsKIApAQCAtOTEsNyAmIzQzOzE0Miw3IEBAIGNhdGNoKCkKIAlsb2NhbCBleGl0X2NvZGU9JiMzNDskMSYjMzQ7CiAJbG9jYWwgbG9nX2ZpbGU9JiMzNDskMiYjMzQ7CiAKLQlpZiBbWyAmIzM0OyR7ZXhpdF9jb2RlfSYjMzQ7IC1uZSAwIF1dOyB0aGVuCiYjNDM7CWlmIFtbICYjMzQ7JHtleGl0X2NvZGV9JiMzNDsgLW5lIDAgJmFtcDsmYW1wOyAmIzM0OyR7ZXhpdF9jb2RlfSYjMzQ7IC1uZSA3NyBdXTsgdGhlbgogCQljYXQgJiMzNDske2xvZ19maWxlfSYjMzQ7ICZndDsmYW1wOzMKIAlmaQogCkBAIC0xMDgsOCAmIzQzOzE1OSwxMCBAQCBtYWluKCkKIAogCVtbICEgLWQgJiMzNDske3RtcF9kaXJ9JiMzNDsgXV0gJmFtcDsmYW1wOyBlY2hvICYjMzQ7RGlyZWN0b3J5ICR7dG1wX2Rpcn0gZG9lc24mIzM5O3QgZXhpc3QmIzM0OyAmYW1wOyZhbXA7IGV4aXQgMQogCi0JaWYgW1sgJiMzNDske2FjdGlvbn0mIzM0OyA9PSAmIzM0O3NldHVwJiMzNDsgXV07IHRoZW4KLQkJc2V0dXAgJiMzNDske3RtcF9kaXJ9JiMzNDsKJiM0MzsJaWYgW1sgJiMzNDske2FjdGlvbn0mIzM0OyA9PSAmIzM0O3NldHVwLXJzYSYjMzQ7IF1dOyB0aGVuCiYjNDM7CQlzZXR1cF9yc2EgJiMzNDske3RtcF9kaXJ9JiMzNDsKJiM0MzsJZWxpZiBbWyAmIzM0OyR7YWN0aW9ufSYjMzQ7ID09ICYjMzQ7c2V0dXAtbWxkc2EmIzM0OyBdXTsgdGhlbgomIzQzOwkJc2V0dXBfbWxkc2EgJiMzNDske3RtcF9kaXJ9JiMzNDsKIAllbGlmIFtbICYjMzQ7JHthY3Rpb259JiMzNDsgPT0gJiMzNDtnZW5rZXkmIzM0OyBdXTsgdGhlbgogCQlnZW5rZXkgJiMzNDske3RtcF9kaXJ9JiMzNDsKIAllbGlmIFtbICYjMzQ7JHthY3Rpb259JiMzNDsgPT0gJiMzNDtjbGVhbnVwJiMzNDsgXV07IHRoZW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdm10ZXN0LnNoCmluZGV4IDZhM2QwMjZkNzZiZDYuLmU3ZTBiNDE5YTBiODcgMTAwNzU1Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2gKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaApAQCAtMTA3LDYgJiM0MzsxMDcsMTQgQEAgT3B0aW9uczoKIAktcykJCUluc3RlYWQgb2YgcG93ZXJpbmcgb2ZmIHRoZSBWTSwgc3RhcnQgYW4gaW50ZXJhY3RpdmUKIAkJCXNoZWxsLiBJZiAmbHQ7Y29tbWFuZCZndDsgaXMgc3BlY2lmaWVkLCB0aGUgc2hlbGwgcnVucyBhZnRlcgogCQkJdGhlIGNvbW1hbmQgZmluaXNoZXMgZXhlY3V0aW5nCiYjNDM7CiYjNDM7RW52aXJvbm1lbnQgdmFyaWFibGVzOgomIzQzOwomIzQzOwlLRVJORUxfQ01ETElORV9FWFRSQQomIzQzOwkJCUV4dHJhIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhlIGd1ZXN0IGtlcm5lbCBjb21tYW5kCiYjNDM7CQkJbGluZSwgZm9yIHRlc3RzIHRoYXQgbmVlZCBhIGJvb3QtdGltZSBzZXR0aW5nLiBlLmc6CiYjNDM7CiYjNDM7CSAgS0VSTkVMX0NNRExJTkVfRVhUUkE9JiMzNDticGYua2V5cmluZ191bnNlYWxlZD0xJiMzNDsgJDAgLS0gLi90ZXN0X3Byb2dzIC10IHNpZ25lZF9sb2FkZXIKIEVPRgogfQogCkBAIC0yODYsNiAmIzQzOzI5NCwxMiBAQCBFT0YKIAkJUUVNVV9GTEFHUz0oJiMzNDske0hPU1RfRkxBR1NbQF19JiMzNDspCiAJZmkKIAomIzQzOwlsb2NhbCBrZXJuZWxfY21kbGluZT0mIzM0O3Jvb3Q9L2Rldi92ZGEgcncgY29uc29sZT0ke1FFTVVfQ09OU09MRX0mIzM0OwomIzQzOwomIzQzOwlpZiBbWyAtbiAmIzM0OyR7S0VSTkVMX0NNRExJTkVfRVhUUkE6LX0mIzM0OyBdXTsgdGhlbgomIzQzOwkJa2VybmVsX2NtZGxpbmUmIzQzOz0mIzM0OyAke0tFUk5FTF9DTURMSU5FX0VYVFJBfSYjMzQ7CiYjNDM7CWZpCiYjNDM7CiAJJHtRRU1VX0JJTkFSWX0gXAogCQktbm9kZWZhdWx0cyBcCiAJCS1kaXNwbGF5IG5vbmUgXApAQCAtMjk0LDcgJiM0MzszMDgsNyBAQCBFT0YKIAkJLW0gNEcgXAogCQktZHJpdmUgZmlsZT0mIzM0OyR7cm9vdGZzX2ltZ30mIzM0Oyxmb3JtYXQ9cmF3LGluZGV4PTEsbWVkaWE9ZGlzayxpZj12aXJ0aW8sY2FjaGU9bm9uZSBcCiAJCS1rZXJuZWwgJiMzNDske2tlcm5lbF9iemltYWdlfSYjMzQ7IFwKLQkJLWFwcGVuZCAmIzM0O3Jvb3Q9L2Rldi92ZGEgcncgY29uc29sZT0ke1FFTVVfQ09OU09MRX0mIzM0OwomIzQzOwkJLWFwcGVuZCAmIzM0OyR7a2VybmVsX2NtZGxpbmV9JiMzNDsKIH0KIAogY29weV9sb2dzKCkKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE0OjU2PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT43bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIyNzQ2CgkJCQkJCQlvdXRwdXQ6IDE4CgkJCQkJCQl0aG91Z2h0czogOTU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50IGZvciBCUEYgS2V5cmluZyBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIGFzc2Vzc21lbnQgaXMgdGhhdCB3ZSBuZWVkIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoIHNlcmllcyB3YXJyYW50cyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZXlyaW5nIChgLmJwZmApIGFuZCBhIGtlcm5lbCBwYXJhbWV0ZXIsIGBicGYua2V5cmluZ191bnNlYWxlZD0xYC4gTXkgcHJpbWFyeSBjb25jZXJuIGlzIGlmIHRoaXMgcGF0Y2ggb3BlbnMgdXAgYW55IG5ldyBtZW1vcnkgc2FmZXR5IHZ1bG5lcmFiaWxpdGllcy4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiB0aGlzIGludHJvZHVjZXMgbmV3IHVzZXItc3BhY2UgaW50ZXJhY3Rpb25zIG9yIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGxlYWQgdG8gbWVtb3J5IGNvcnJ1cHRpb24uCgpMb29raW5nIGF0IHRoZSBjaGFuZ2VzLCBlc3BlY2lhbGx5IGluIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgLCB0aGUgY29yZSBtb2RpZmljYXRpb24gc2VlbXMgdG8gcmV2b2x2ZSBhcm91bmQgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBhZ2FpbnN0IHRoaXMgbmV3IGtleXJpbmcuIFRoZSBjb2RlIGNoZWNrcyBgYXR0ci0mZ3Q7c2lnbmF0dXJlX3NpemVgIGFuZCBsb29rcyB1cCBrZXlzIHVzaW5nIGBicGZfbG9va3VwX3N5c3RlbV9rZXlgIG9yIGBicGZfbG9va3VwX3VzZXJfa2V5YCwgZGVwZW5kaW5nIG9uIHRoZSBga2V5cmluZ19pZGAuIFRoZXJlJiMzOTtzIGEgbmV3IGNoZWNrIGZvciBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2Agd2hpY2ggY2FsbHMgYGJwZl9sb29rdXBfa2V5cmluZ2AuCgpOb3csIHRoZSBsaW5lIGBia2V5ID0ga21hbGxvY19vYmooKmJrZXkpO2AgaW4gYGJwZl9sb29rdXBfa2V5cmluZ2AgY2F1Z2h0IG15IGV5ZS4gVGhlIGBrbWFsbG9jX29iamAgc2VlbXMgdW51c3VhbCwgbm90IGEgc3RhbmRhcmQga2VybmVsIGZ1bmN0aW9uLiBNeSBmaXJzdCB0aG91Z2h0IHdhcyB0aGlzIHNlZW1zIGxpa2Ugc29tZXRoaW5nIGN1c3RvbS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGlzLgoKTGV0JiMzOTtzIHNlZS4gVGhpcyBsb29rcyBsaWtlIGBrbWFsbG9jX29iaigqYmtleSlgIHdoaWNoIGRvZXNuJiMzOTt0IHNlZW0gY29ycmVjdC4gTGV0IG1lIGNoZWNrIHRoZSBpbmNsdWRlIGZpbGVzIG9yIG90aGVyIGtlcm5lbCBmaWxlcy4gV2FpdCwgbGV0IG1lIGp1c3QgY2hlY2suIE9oIHdhaXQsIGBrbWFsbG9jX29iamAgaXMgbm90IGluIHRoZSBwYXRjaCBpdHNlbGYuIFRoZSBkaWZmIGxvb2tzIGxpa2UgaXQmIzM5O3Mgc2F5aW5nIGBrbWFsbG9jX29iamAuIEkmIzM5O20gZ29pbmcgdG8gc2VhcmNoIGZvciBga21hbGxvY19vYmpgLiBMZXQmIzM5O3MgY29uZmlybSBpdCYjMzk7cyBub3QgYSB0eXBvLiBPaCB3YWl0LCBJIHNlZSBpdCYjMzk7cyByaWdodCBpbiB0aGUgY29kZS4gTGV0JiMzOTtzIG1ha2Ugc3VyZSBpdCYjMzk7cyBub3QgYSB0eXBvLiBMZXQmIzM5O3Mgc2VlLi4uIEkmIzM5O2xsIGNoZWNrIGBpbmNsdWRlL2xpbnV4L3NsYWIuaGAgb3IgYGtlcm5lbC9icGYva2V5cy5jYC4gQWxyaWdodCwgbGV0IG1lIHVzZSB0aGUgZ3JlcHBlciB0b29sIHRvIHNlYXJjaCBmb3IgYGttYWxsb2Nfb2JqYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjUgMTU6MDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a21hbGxvY19vYmomIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7XG5GdWxsIG91dHB1dCBpcyB0b28gbG9uZywgc2hvd2luZyA1MDAgb3V0IG9mIDE1NTYyIGxpbmVzLlxuVXNlIG1vcmUgcHJlY2lzZSBleHByZXNzaW9uIGlmIHBvc3NpYmxlLlxuXG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3Q9MjAzPW5vbi1cXCBgYE5VTExgYCwgbG9ja2xlc3NseSBhY2Nlc3NpbmcgdGhlIGBgLVx1MDAzZWFgYCBhbmQgYGAtXHUwMDNlYmBgIGZpZWxkcy5cbi0tXG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3QtMjA4LSAgICAgICAyIHtcbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdDoyMDk6ICAgICAgIDMgICBwID0ga21hbGxvY19vYmooKnApO1xuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0LTIxMC0gICAgICAgNCAgIGlmICghcClcbi0tXG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3Q9MjI1PXRoZWlyIHJpZ2h0cyB0byByZW9yZGVyIHRoaXMgY29kZSBhcyBmb2xsb3dzOlxuLS1cbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdC0yMzAtICAgICAgIDIge1xuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0OjIzMTogICAgICAgMyAgIHAgPSBrbWFsbG9jX29iaigqcCk7XG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3QtMjMyLSAgICAgICA0ICAgaWYgKCFwKVxuLS1cbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdD0yNjE9c2hvd3MgYW4gZXhhbXBsZSBvZiBpbnNlcnRpb246XG4tLVxuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0LTI2Ni0gICAgICAgMiB7XG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3Q6MjY3OiAgICAgICAzICAgcCA9IGttYWxsb2Nfb2JqKCpwKTtcbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdC0yNjgtICAgICAgIDQgICBpZiAoIXApXG4tLVxuRG9jdW1lbnRhdGlvbi9SQ1UvbGlzdFJDVS5yc3Q9MjY3PVRoZSBSQ1UgdmVyc2lvbiBvZiBhdWRpdF91cGRfcnVsZSgpIGlzIGFzIGZvbGxvd3M6OlxuLS1cbkRvY3VtZW50YXRpb24vUkNVL2xpc3RSQ1UucnN0LTI3OC1cdFx0XHRpZiAoIWF1ZGl0X2NvbXBhcmVfcnVsZShydWxlLCBcdTAwMjZlLVx1MDAzZXJ1bGUpKSB7XG5Eb2N1bWVudGF0aW9uL1JDVS9saXN0UkNVLnJzdDoyNzk6XHRcdFx0XHRuZSA9IGttYWxsb2Nfb2JqKCplbnRyeSwgR0ZQX0FUT01JQyk7XG5Eb2N1bWVudGF0aW9uL1JDVS9saXN0UkNVLnJzdC0yODAtXHRcdFx0XHRpZiAobmUgPT0gTlVMTClcbi0tXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0PTQ0MT11c2VzIG9mIFJDVSBtYXkgYmUgZm91bmQgaW4gbGlzdFJDVS5yc3QgYW5kIE5NSS1SQ1UucnN0LlxuLS1cbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtNDcwLVxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdDo0NzE6XHRcdG5ld19mcCA9IGttYWxsb2Nfb2JqKCpuZXdfZnApO1xuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC00NzItXHRcdHNwaW5fbG9jayhcdTAwMjZmb29fbXV0ZXgpO1xuLS1cbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q9NTUzPVRoZSBmb29fdXBkYXRlX2EoKSBmdW5jdGlvbiBtaWdodCB0aGVuIGJlIHdyaXR0ZW4gYXMgZm9sbG93czo6XG4tLVxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC01NzItXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0OjU3MzpcdFx0bmV3X2ZwID0ga21hbGxvY19vYmooKm5ld19mcCk7XG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0LTU3NC1cdFx0c3Bpbl9sb2NrKFx1MDAyNmZvb19tdXRleCk7XG4tLVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9rcmVmLnJzdD0zOT1rcmVmX2luaXQgYXMgc286OlxuLS1cbkRvY3VtZW50YXRpb24vY29yZS1hcGkva3JlZi5yc3QtNDItXG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2tyZWYucnN0OjQzOiAgICAgZGF0YSA9IGttYWxsb2Nfb2JqKCpkYXRhKTtcbkRvY3VtZW50YXRpb24vY29yZS1hcGkva3JlZi5yc3QtNDQtICAgICBpZiAoIWRhdGEpXG4tLVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9rcmVmLnJzdD04MT10aHJlYWQgdG8gcHJvY2Vzczo6XG4tLVxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9rcmVmLnJzdC0xMDItXHRzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7XG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2tyZWYucnN0OjEwMzpcdGRhdGEgPSBrbWFsbG9jX29iaigqZGF0YSk7XG5Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2tyZWYucnN0LTEwNC1cdGlmICghZGF0YSlcbi0tXG5Eb2N1bWVudGF0aW9uL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0PTM4Mz10byBwcm90ZWN0IHRoZSBjYWNoZSBhbmQgYWxsIHRoZSBvYmplY3RzIHdpdGhpbiBpdC4gSGVyZSYjMzk7cyB0aGUgY29kZTo6XG4tLVxuRG9jdW1lbnRhdGlvbi9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC00NDQtXG5Eb2N1bWVudGF0aW9uL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0OjQ0NTogICAgICAgICAgICBpZiAoKG9iaiA9IGttYWxsb2Nfb2JqKCpvYmopKSA9PSBOVUxMKVxuRG9jdW1lbnRhdGlvbi9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC00NDYtICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTtcbi0tXG5Eb2N1bWVudGF0aW9uL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0PTQ5OT13aGljaCBhcmUgdGFrZW4gYXdheSwgYW5kIHRoZSBgYCYjNDM7YGAgYXJlIGxpbmVzIHdoaWNoIGFyZSBhZGRlZC5cbi0tXG5Eb2N1bWVudGF0aW9uL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0LTUxOS1cbkRvY3VtZW50YXRpb24va2VybmVsLWhhY2tpbmcvbG9ja2luZy5yc3Q6NTIwOiAgICAgICAgICAgICBpZiAoKG9iaiA9IGttYWxsb2Nfb2JqKCpvYmopKSA9PSBOVUxMKVxuRG9jdW1lbnRhdGlvbi9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC01MjEtICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07XG4tLVxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2t0eXBlcy5yc3Q9NDk4PXdvcmtzIHBlcmZlY3RseTo6XG4tLVxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2t0eXBlcy5yc3QtNTAwLSAgcmF3X3NwaW5fbG9jayhcdTAwMjZsb2NrKTtcbkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2NrdHlwZXMucnN0OjUwMTogIHAgPSBrbWFsbG9jX29iaigqcCwgR0ZQX0FUT01JQyk7XG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3R5cGVzLnJzdC01MDItXG4tLVxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2t0eXBlcy5yc3Q9NTA3PXByZWVtcHRpb24gb24gUFJFRU1QVF9SVCBrZXJuZWxzOjpcbi0tXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3R5cGVzLnJzdC01MDktICBzcGluX2xvY2soXHUwMDI2bG9jayk7XG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3R5cGVzLnJzdDo1MTA6ICBwID0ga21hbGxvY19vYmooKnAsIEdGUF9BVE9NSUMpO1xuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2t0eXBlcy5yc3QtNTExLVxuLS1cbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTkzOD1UaGUga2VybmVsIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbCBwdXJwb3NlIG1lbW9yeSBhbGxvY2F0b3JzOlxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q6OTM5OmttYWxsb2MoKSwga3phbGxvYygpLCBrbWFsbG9jX29ianMoKSwga3phbGxvY19vYmpzKCksIHZtYWxsb2MoKSwgYW5kXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC05NDAtdnphbGxvYygpLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvblxuLS1cbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTk0ND1UaGUgcHJlZmVycmVkIGZvcm0gZm9yIHBhc3NpbmcgYSBzaXplIG9mIGEgc3RydWN0IGlzIHRoZSBmb2xsb3dpbmc6XG4tLVxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtOTQ3LVxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q6OTQ4Olx0cCA9IGttYWxsb2Nfb2JqKCpwLCAuLi4pO1xuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtOTQ5LVxuLS1cbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTk1OD1UaGUgcHJlZmVycmVkIGZvcm0gZm9yIGFsbG9jYXRpbmcgYW4gYXJyYXkgaXMgdGhlIGZvbGxvd2luZzpcbi0tXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC05NjEtXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdDo5NjI6XHRwID0ga21hbGxvY19vYmpzKCpwLCBuLCAuLi4pO1xuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtOTYzLVxuLS1cbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdD0zODY9bWF5IGhlbHAgd2l0aCBhbGlnbm1lbnQsIHdyYXAtYXJvdW5kLCBvciBhZGRpdGlvbmFsIGhhcmRlbmluZy4gVGhlXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3Q6Mzg3OmttYWxsb2Nfb2JqKCktZmFtaWx5IG9mIG1hY3JvcyBwcm92aWRlIHRoaXMgaW50cm9zcGVjdGlvbiwgd2hpY2ggY2FuIGJlXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3QtMzg4LXVzZWQgZm9yIHRoZSBjb21tb24gY29kZSBwYXR0ZXJucyBmb3Igc2luZ2xlLCBhcnJheSwgYW5kIGZsZXhpYmxlIG9iamVjdFxuLS1cbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdD0zOTg9YmVjb21lLCByZXNwZWN0aXZlbHk6OlxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2RlcHJlY2F0ZWQucnN0LTM5OS1cbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdDo0MDA6XHRwdHIgPSBrbWFsbG9jX29iaigqcHRyIFssIGdmcF0gKTtcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdC00MDEtXHRwdHIgPSBremFsbG9jX29iaigqcHRyIFssIGdmcF0gKTtcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdDo0MDI6XHRwdHIgPSBrbWFsbG9jX29ianMoKnB0ciwgY291bnQgWywgZ2ZwXSApO1xuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2RlcHJlY2F0ZWQucnN0LTQwMy1cdHB0ciA9IGt6YWxsb2Nfb2JqcygqcHRyLCBjb3VudCBbLCBnZnBdICk7XG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3QtNDA0LVx0cHRyID0ga21hbGxvY19mbGV4KCpwdHIsIGZsZXhfbWVtYmVyLCBjb3VudCBbLCBnZnBdICk7XG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3Q6NDA1Olx0X19hdXRvX3R5cGUgcHRyID0ga21hbGxvY19vYmooc3RydWN0IGZvbyBbLCBnZnBdICk7XG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3QtNDA2LVxuLS1cbkRvY3VtZW50YXRpb24vc291bmQva2VybmVsLWFwaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnJzdD0xNzM0PWNhbGxiYWNrOjpcbi0tXG5Eb2N1bWVudGF0aW9uL3NvdW5kL2tlcm5lbC1hcGkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci5yc3QtMTczOS0gICAgICAgICAgLi4uLlxuRG9jdW1lbnRhdGlvbi9zb3VuZC9rZXJuZWwtYXBpL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIucnN0OjE3NDA6ICAgICAgICAgIGRhdGEgPSBrbWFsbG9jX29iaigqZGF0YSk7XG5Eb2N1bWVudGF0aW9uL3NvdW5kL2tlcm5lbC1hcGkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci5yc3QtMTc0MS0gICAgICAgICAgc3Vic3RyZWFtLVx1MDAzZXJ1bnRpbWUtXHUwMDNlcHJpdmF0ZV9kYXRhID0gZGF0YTtcbi0tXG5Eb2N1bWVudGF0aW9uL3NvdW5kL2tlcm5lbC1hcGkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci5yc3Q9MzMwMj1kZXN0cnVjdG9yIGZ1bmN0aW9uIGlzIHNldCBpbiB0aGUgYGBwcml2YXRlX2ZyZWVgYCBmaWVsZDo6XG5Eb2N1bWVudGF0aW9uL3NvdW5kL2tlcm5lbC1hcGkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci5yc3QtMzMwMy1cbkRvY3VtZW50YXRpb24vc291bmQva2VybmVsLWFwaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnJzdDozMzA0OiAgc3RydWN0IG15ZGF0YSAqcCA9IGttYWxsb2Nfb2JqKCpwKTtcbkRvY3VtZW50YXRpb24vc291bmQva2VybmVsLWFwaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnJzdC0zMzA1LSAgaHctXHUwMDNlcHJpdmF0ZV9kYXRhID0gcDtcbi0tXG5Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeS5yc3Q9MjQyPUFuZCBTT0Mtc3BlY2lmaWMgdXRpbGl0eSBjb2RlIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2U6OlxuLS1cbkRvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5LnJzdC0yNTEtXG5Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeS5yc3Q6MjUyOlx0XHRwZGF0YTIgPSBrbWFsbG9jX29iaigqcGRhdGEyKTtcbkRvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5LnJzdC0yNTMtXHRcdCpwZGF0YTIgPSBwZGF0YTtcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdD00MDM9ZSB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgY29udGllbmUuIEVjY28gaWwgY29kaWNlOjpcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC00NjQtXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdDo0NjU6ICAgICAgICAgICAgaWYgKChvYmogPSBrbWFsbG9jX29iaigqb2JqKSkgPT0gTlVMTClcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0LTQ2Ni0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNO1xuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0PTUxOT1zb25vIHF1ZWxsZSByaW1vc3NlLCBtZW50cmUgcXVlbGxlIGBgJiM0MztgYCBzb25vIHF1ZWxsZSBhZ2dpdW50ZS5cbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC01MzktXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdDo1NDA6ICAgICAgICAgICAgIGlmICgob2JqID0ga21hbGxvY19vYmooKm9iaikpID09IE5VTEwpXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC01NDEtICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07XG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2NrdHlwZXMucnN0PTQ4OD1tZW1vcmlhLiBTdSB1biBrZXJuZWwgbm9uLVBSRUVNUFRfUlQgaWwgc2VndWVudGUgY29kaWNlIGZ1bnppb25hIHBlcmZldHRhbWVudGU6OlxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2xvY2tpbmcvbG9ja3R5cGVzLnJzdC00OTAtICByYXdfc3Bpbl9sb2NrKFx1MDAyNmxvY2spO1xuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2NrdHlwZXMucnN0OjQ5MTogIHAgPSBrbWFsbG9jX29iaigqcCwgR0ZQX0FUT01JQyk7XG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2t0eXBlcy5yc3QtNDkyLVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2xvY2tpbmcvbG9ja3R5cGVzLnJzdD00OTc9UFJFRU1QVF9SVDo6XG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2NrdHlwZXMucnN0LTQ5OS0gIHNwaW5fbG9jayhcdTAwMjZsb2NrKTtcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2xvY2tpbmcvbG9ja3R5cGVzLnJzdDo1MDA6ICBwID0ga21hbGxvY19vYmooKnAsIEdGUF9BVE9NSUMpO1xuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2NrdHlwZXMucnN0LTUwMS1cbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q9OTQyPUlsIG1vZG8gcHJlZmVyaXRvIHBlciBwYXNzYXJlIGxhIGRpbWVuc2lvbmUgZGkgdW5hIHN0cnV0dHVyYSDDqCBpbCBzZWd1ZW50ZTpcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtOTQ1LVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0Ojk0NjpcdHAgPSBrbWFsbG9jX29iaigqcCwgLi4uKTtcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC05NDctXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvc3BfU1AvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTk1ND1MYSBmb3JtYSBwcmVmZXJpZGEgcGFyYSBwYXNhciBlbCB0YW1hw7FvIGRlIHVuYSBlc3RydWN0dXJhIGVzIGxhIHNpZ3VpZW50ZTpcbi0tXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9zcF9TUC9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtOTU3LVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvc3BfU1AvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0Ojk1ODpcdHAgPSBrbWFsbG9jX29iaigqcCwgLi4uKTtcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3NwX1NQL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC05NTktXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3Q9NDY9a3JlZuWPr+S7peWHuueOsOWcqOaVsOaNrue7k+aehOS9k+S4reeahOS7u+S9leWcsOaWueOAglxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2tyZWYucnN0LTU0LVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3Q6NTU6ICAgICBkYXRhID0ga21hbGxvY19vYmooKmRhdGEpO1xuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3QtNTYtICAgICBpZiAoIWRhdGEpXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3Q9NjI9S3JlZuinhOWImVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2tyZWYucnN0LTEwOC1cdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaztcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2tyZWYucnN0OjEwOTpcdGRhdGEgPSBrbWFsbG9jX29iaigqZGF0YSk7XG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9rcmVmLnJzdC0xMTAtXHRpZiAoIWRhdGEpXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTgxMD1Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9tZW1vcnktYWxsb2NhdGlvbi5yc3Qg44CCXG4tLVxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0LTgxNS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdDo4MTY6XHRwID0ga21hbGxvY19vYmooKnAsIC4uLik7XG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtODE3LVxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX1RXL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdD04MjQ9RG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkvbWVtb3J5LWFsbG9jYXRpb24ucnN0IOOAglxuLS1cbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX1RXL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC04MjktXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9UVy9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q6ODMwOlx0cCA9IGttYWxsb2Nfb2JqKCpwLCAuLi4pO1xuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfVFcvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0LTgzMS1cbi0tXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jPTg1Nz1tYXJ2ZWxfYWdwX3NldHVwKGFscGhhX2FncF9pbmZvICphZ3ApXG4tLVxuYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9tYXJ2ZWwuYy04NjMtXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jOjg2NDpcdGFwZXIgPSBrbWFsbG9jX29iaigqYXBlcik7XG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jLTg2NS1cdGlmIChhcGVyID09IE5VTEwpIHJldHVybiAtRU5PTUVNO1xuLS1cbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmM9MTAxOT1tYXJ2ZWxfYWdwX2luZm8odm9pZClcbi0tXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jLTEwNjEtXHQgKi9cbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmM6MTA2MjpcdGFncCA9IGttYWxsb2Nfb2JqKCphZ3ApO1xuYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9tYXJ2ZWwuYy0xMDYzLVx0aWYgKCFhZ3ApXG4tLVxuYXJjaC9hbHBoYS9rZXJuZWwvY29yZV90aXRhbi5jPTU5MD10aXRhbl9hZ3Bfc2V0dXAoYWxwaGFfYWdwX2luZm8gKmFncClcbi0tXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmMtNTk2LVxuYXJjaC9hbHBoYS9rZXJuZWwvY29yZV90aXRhbi5jOjU5NzpcdGFwZXIgPSBrbWFsbG9jX29iaihzdHJ1Y3QgdGl0YW5fYWdwX2FwZXJ0dXJlKTtcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYy01OTgtXHRpZiAoYXBlciA9PSBOVUxMKVxuLS1cbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYz03MzE9dGl0YW5fYWdwX2luZm8odm9pZClcbi0tXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmMtNzYyLVx0ICovXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmM6NzYzOlx0YWdwID0ga21hbGxvY19vYmooKmFncCk7XG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmMtNzY0LVx0aWYgKCFhZ3ApXG4tLVxuYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmM9Mjk9cHJvY2Vzc19yZWxvY19mb3JfZ290KEVsZjY0X1JlbGEgKnJlbGEsXG4tLVxuYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmMtNDgtXG5hcmNoL2FscGhhL2tlcm5lbC9tb2R1bGUuYzo0OTpcdGcgPSBrbWFsbG9jX29iaigqZyk7XG5hcmNoL2FscGhhL2tlcm5lbC9tb2R1bGUuYy01MC1cdGctXHUwMDNlbmV4dCA9IGNoYWluc1tyX3N5bV0ubmV4dDtcbi0tXG5hcmNoL2FscGhhL2tlcm5lbC9wY2kuYz0yMTE9c3RhdGljIHZvaWQgcGRldl9zYXZlX3NybV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldilcbi0tXG5hcmNoL2FscGhhL2tlcm5lbC9wY2kuYy0yMjMtXG5hcmNoL2FscGhhL2tlcm5lbC9wY2kuYzoyMjQ6XHR0bXAgPSBrbWFsbG9jX29iaigqdG1wKTtcbmFyY2gvYWxwaGEva2VybmVsL3BjaS5jLTIyNS1cdGlmICghdG1wKSB7XG4tLVxuYXJjaC9hcmMva2VybmVsL3Vud2luZC5jPTM1OT12b2lkICp1bndpbmRfYWRkX3RhYmxlKHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgY29uc3Qgdm9pZCAqdGFibGVfc3RhcnQsXG4tLVxuYXJjaC9hcmMva2VybmVsL3Vud2luZC5jLTM2OC1cbmFyY2gvYXJjL2tlcm5lbC91bndpbmQuYzozNjk6XHR0YWJsZSA9IGttYWxsb2Nfb2JqKCp0YWJsZSk7XG5hcmNoL2FyYy9rZXJuZWwvdW53aW5kLmMtMzcwLVx0aWYgKCF0YWJsZSlcbi0tXG5hcmNoL2FybS9jb21tb24vbG9jb21vLmM9Mjc0PXN0YXRpYyBpbnQgbG9jb21vX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpXG4tLVxuYXJjaC9hcm0vY29tbW9uL2xvY29tby5jLTI3OS1cbmFyY2gvYXJtL2NvbW1vbi9sb2NvbW8uYzoyODA6XHRzYXZlID0ga21hbGxvY19vYmooc3RydWN0IGxvY29tb19zYXZlX2RhdGEpO1xuYXJjaC9hcm0vY29tbW9uL2xvY29tby5jLTI4MS1cdGlmICghc2F2ZSlcbi0tXG5hcmNoL2FybS9jb21tb24vc2ExMTExLmM9OTY0PXN0YXRpYyBpbnQgc2ExMTExX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KVxuLS1cbmFyY2gvYXJtL2NvbW1vbi9zYTExMTEuYy05NzEtXG5hcmNoL2FybS9jb21tb24vc2ExMTExLmM6OTcyOlx0c2F2ZSA9IGttYWxsb2Nfb2JqKHN0cnVjdCBzYTExMTFfc2F2ZV9kYXRhKTtcbmFyY2gvYXJtL2NvbW1vbi9zYTExMTEuYy05NzMtXHRpZiAoIXNhdmUpXG4tLVxuYXJjaC9hcm0va2VybmVsL3Vud2luZC5jPTU3Mj1zdHJ1Y3QgdW53aW5kX3RhYmxlICp1bndpbmRfdGFibGVfYWRkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSxcbi0tXG5hcmNoL2FybS9rZXJuZWwvdW53aW5kLmMtNTc2LVx0dW5zaWduZWQgbG9uZyBmbGFncztcbmFyY2gvYXJtL2tlcm5lbC91bndpbmQuYzo1Nzc6XHRzdHJ1Y3QgdW53aW5kX3RhYmxlICp0YWIgPSBrbWFsbG9jX29iaigqdGFiKTtcbmFyY2gvYXJtL2tlcm5lbC91bndpbmQuYy01NzgtXG4tLVxuYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmM9NTM9c3RhdGljIHN0cnVjdCBwb3dlcmRvbWFpbiAqX2dldF9wd3JkbShzdHJ1Y3QgZGV2aWNlICpkZXYpXG4tLVxuYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmMtMTAxLVxuYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmM6MTAyOlx0ZW50cnkgPSBrbWFsbG9jX29iaigqZW50cnkpO1xuYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmMtMTAzLVx0aWYgKGVudHJ5KSB7XG4tLVxuYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYz00MDY9c3RhdGljIGludCBfX2luaXQgcHdyZG1zX3NldHVwKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHZvaWQgKnVudXNlZClcbi0tXG5hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jLTQxMi1cbmFyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmM6NDEzOlx0cHdyc3QgPSBrbWFsbG9jX29iaihzdHJ1Y3QgcG93ZXJfc3RhdGUsIEdGUF9BVE9NSUMpO1xuYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYy00MTQtXHRpZiAoIXB3cnN0KVxuLS1cbmFyY2gvYXJtL21hY2gtb21hcDIvcG00NHh4LmM9MTEzPXN0YXRpYyBpbnQgX19pbml0IHB3cmRtc19zZXR1cChzdHJ1Y3QgcG93ZXJkb21haW4gKnB3cmRtLCB2b2lkICp1bnVzZWQpXG4tLVxuYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTQ0eHguYy0xMzQtXG5hcmNoL2FybS9tYWNoLW9tYXAyL3BtNDR4eC5jOjEzNTpcdHB3cnN0ID0ga21hbGxvY19vYmooc3RydWN0IHBvd2VyX3N0YXRlLCBHRlBfQVRPTUlDKTtcbmFyY2gvYXJtL21hY2gtb21hcDIvcG00NHh4LmMtMTM2LVx0aWYgKCFwd3JzdClcbi0tXG5hcmNoL2FybS9tbS9wZ2QuYy0xOS0jaWZkZWYgQ09ORklHX0FSTV9MUEFFXG5hcmNoL2FybS9tbS9wZ2QuYzoyMDojZGVmaW5lIF9wZ2RfYWxsb2MobW0pXHRcdGttYWxsb2Nfb2JqcyhwZ2RfdCwgUFRSU19QRVJfUEdELCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTylcbmFyY2gvYXJtL21tL3BnZC5jLTIxLSNkZWZpbmUgX3BnZF9mcmVlKG1tLCBwZ2QpXHRrZnJlZShwZ2QpXG4tLVxuYXJjaC9hcm0vcHJvYmVzL2twcm9iZXMvdGVzdC1jb3JlLmM9NzY0PXN0YXRpYyBpbnQgY292ZXJhZ2Vfc3RhcnQoY29uc3QgdW5pb24gZGVjb2RlX2l0ZW0gKnRhYmxlKVxuYXJjaC9hcm0vcHJvYmVzL2twcm9iZXMvdGVzdC1jb3JlLmMtNzY1LXtcbmFyY2gvYXJtL3Byb2Jlcy9rcHJvYmVzL3Rlc3QtY29yZS5jOjc2NjpcdGNvdmVyYWdlLmJhc2UgPSBrbWFsbG9jX29ianMoc3RydWN0IGNvdmVyYWdlX2VudHJ5LFxuYXJjaC9hcm0vcHJvYmVzL2twcm9iZXMvdGVzdC1jb3JlLmMtNzY3LVx0XHRcdFx0ICAgICBNQVhfQ09WRVJBR0VfRU5UUklFUyk7XG4tLVxuYXJjaC9hcm02NC9rdm0vcG11LWVtdWwuYz03NzQ9dm9pZCBrdm1faG9zdF9wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqcG11KVxuLS1cbmFyY2gvYXJtNjQva3ZtL3BtdS1lbXVsLmMtNzg2LVxuYXJjaC9hcm02NC9rdm0vcG11LWVtdWwuYzo3ODc6XHRlbnRyeSA9IGttYWxsb2Nfb2JqKCplbnRyeSk7XG5hcmNoL2FybTY0L2t2bS9wbXUtZW11bC5jLTc4OC1cdGlmICghZW50cnkpXG4tLVxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWRlYnVnLmM9MTAyPXN0YXRpYyB2b2lkICp2Z2ljX2RlYnVnX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpXG4tLVxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWRlYnVnLmMtMTA2LVxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWRlYnVnLmM6MTA3Olx0aXRlciA9IGttYWxsb2Nfb2JqKCppdGVyKTtcbmFyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy1kZWJ1Zy5jLTEwOC1cdGlmICghaXRlcilcbi0tXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtZGVidWcuYz0zNjQ9c3RhdGljIHZvaWQgKnZnaWNfaXRzX2RlYnVnX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpXG4tLVxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWRlYnVnLmMtMzc3LVxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWRlYnVnLmM6Mzc4Olx0aXRlciA9IGttYWxsb2Nfb2JqKCppdGVyKTtcbmFyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy1kZWJ1Zy5jLTM3OS1cdGlmICghaXRlcilcbi0tXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtaW5pdC5jPTc0Mz12b2lkIF9faW5pdCB2Z2ljX3NldF9rdm1faW5mbyhjb25zdCBzdHJ1Y3QgZ2ljX2t2bV9pbmZvICppbmZvKVxuLS1cbmFyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy1pbml0LmMtNzQ1LVx0QlVHX09OKGdpY19rdm1faW5mbyAhPSBOVUxMKTtcbmFyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy1pbml0LmM6NzQ2Olx0Z2ljX2t2bV9pbmZvID0ga21hbGxvY19vYmooKmdpY19rdm1faW5mbyk7XG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtaW5pdC5jLTc0Ny1cdGlmIChnaWNfa3ZtX2luZm8pXG4tLVxuYXJjaC9tNjhrL2VtdS9uZmJsb2NrLmM9OTc9c3RhdGljIGludCBfX2luaXQgbmZoZF9pbml0X29uZShpbnQgaWQsIHUzMiBibG9ja3MsIHUzMiBic2l6ZSlcbi0tXG5hcmNoL202OGsvZW11L25mYmxvY2suYy0xMTQtXG5hcmNoL202OGsvZW11L25mYmxvY2suYzoxMTU6XHRkZXYgPSBrbWFsbG9jX29iaihzdHJ1Y3QgbmZoZF9kZXZpY2UpO1xuYXJjaC9tNjhrL2VtdS9uZmJsb2NrLmMtMTE2LVx0aWYgKCFkZXYpXG4tLVxuYXJjaC9tNjhrL21tL2ttYXAuYz0xMDg9c3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKmdldF9pb19hcmVhKHVuc2lnbmVkIGxvbmcgc2l6ZSlcbi0tXG5hcmNoL202OGsvbW0va21hcC5jLTExMi1cbmFyY2gvbTY4ay9tbS9rbWFwLmM6MTEzOlx0YXJlYSA9IGttYWxsb2Nfb2JqKCphcmVhKTtcbmFyY2gvbTY4ay9tbS9rbWFwLmMtMTE0LVx0aWYgKCFhcmVhKVxuLS1cbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jPTI1Mz11MzIgYXUxeHh4X2RiZG1hX2NoYW5fYWxsb2ModTMyIHNyY2lkLCB1MzIgZGVzdGlkLFxuLS1cbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jLTMxMi1cdFx0XHQgKi9cbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jOjMxMzpcdFx0XHRjdHAgPSBrbWFsbG9jX29iaihjaGFuX3RhYl90LCBHRlBfQVRPTUlDKTtcbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jLTMxNC1cdFx0XHRjaGFuX3RhYl9wdHJbaV0gPSBjdHA7XG4tLVxuYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmM9MzkxPXUzMiBhdTF4eHhfZGJkbWFfcmluZ19hbGxvYyh1MzIgY2hhbmlkLCBpbnQgZW50cmllcylcbi0tXG5hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYy00MTQtXHQgKi9cbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jOjQxNTpcdGRlc2NfYmFzZSA9ICh1MzIpIGttYWxsb2Nfb2JqcyhhdTF4X2RkbWFfZGVzY190LCBlbnRyaWVzLFxuYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmMtNDE2LVx0XHRcdFx0ICAgICAgIEdGUF9LRVJORUwgfCBHRlBfRE1BKTtcbi0tXG5hcmNoL21pcHMva2VybmVsL21vZHVsZS5jPTU5PXN0YXRpYyBpbnQgYXBwbHlfcl9taXBzX2hpMTYoc3RydWN0IG1vZHVsZSAqbWUsIHUzMiAqbG9jYXRpb24sIEVsZl9BZGRyIHYsXG4tLVxuYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYy03NC1cdCAqL1xuYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYzo3NTpcdG4gPSBrbWFsbG9jX29iaigqbik7XG5hcmNoL21pcHMva2VybmVsL21vZHVsZS5jLTc2LVx0aWYgKCFuKVxuLS1cbmFyY2gvbWlwcy9rZXJuZWwvdnBlLmM9MzExPXN0YXRpYyBpbnQgYXBwbHlfcl9taXBzX2hpMTYoc3RydWN0IG1vZHVsZSAqbWUsIHVpbnQzMl90ICpsb2NhdGlvbixcbi0tXG5hcmNoL21pcHMva2VybmVsL3ZwZS5jLTMyMC1cdCAqL1xuYXJjaC9taXBzL2tlcm5lbC92cGUuYzozMjE6XHRuID0ga21hbGxvY19vYmooKm4pO1xuYXJjaC9taXBzL2tlcm5lbC92cGUuYy0zMjItXHRpZiAoIW4pXG4tLVxuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jPTE4OD1wYXRfcXVlcnlfbW9kdWxlKHVsb25nIHBjZWxsX2xvYywgdWxvbmcgbW9kX2luZGV4KVxuLS1cbmFyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYy0xOTUtXG5hcmNoL3BhcmlzYy9rZXJuZWwvaW52ZW50b3J5LmM6MTk2Olx0cGFfcGRjX2NlbGwgPSBrbWFsbG9jX29iaigqcGFfcGRjX2NlbGwpO1xuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jLTE5Ny1cdGlmICghcGFfcGRjX2NlbGwpXG4tLVxuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jPTUzMj1hZGRfc3lzdGVtX21hcF9hZGRyZXNzZXMoc3RydWN0IHBhcmlzY19kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgXG4tLVxuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jLTUzOC1cbmFyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYzo1Mzk6XHRkZXYtXHUwMDNlYWRkciA9IGttYWxsb2Nfb2JqcygqZGV2LVx1MDAzZWFkZHIsIG51bV9hZGRycyk7XG5hcmNoL3BhcmlzYy9rZXJuZWwvaW52ZW50b3J5LmMtNTQwLVx0aWYoIWRldi1cdTAwM2VhZGRyKSB7XG4tLVxuYXJjaC9wYXJpc2Mva2VybmVsL3Byb2Nlc3Nvci5jPTgxPXN0YXRpYyBpbnQgX19pbml0IHByb2Nlc3Nvcl9wcm9iZShzdHJ1Y3QgcGFyaXNjX2RldmljZSAqZGV2KVxuLS1cbmFyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYy0xMTItXG5hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmM6MTEzOlx0XHRwYV9wZGNfY2VsbCA9IGttYWxsb2Nfb2JqKCpwYV9wZGNfY2VsbCk7XG5hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmMtMTE0LVx0XHRpZiAoIXBhX3BkY19jZWxsKVxuLS1cbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYz0xNDk9dW53aW5kX3RhYmxlX2FkZChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgXG4tLVxuYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jLTE1OS1cbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYzoxNjA6XHR0YWJsZSA9IGttYWxsb2Nfb2JqKHN0cnVjdCB1bndpbmRfdGFibGUsIEdGUF9VU0VSKTtcbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYy0xNjEtXHRpZiAodGFibGUgPT0gTlVMTClcbi0tXG5hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmM9NDA2PXZvaWQgdW53aW5kX2ZyYW1lX2luaXRfZnJvbV9ibG9ja2VkX3Rhc2soc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpXG4tLVxuYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jLTQxMC1cbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYzo0MTE6XHRyMiA9IGttYWxsb2Nfb2JqKHN0cnVjdCBwdF9yZWdzLCBHRlBfQVRPTUlDKTtcbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYy00MTItXHRpZiAoIXIyKVxuLS1cbmFyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYz05ODQ9aW50IF9faW5pdCBudnJhbV9zY2FuX3BhcnRpdGlvbnModm9pZClcbi0tXG5hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMtMTAzMi1cdFx0fVxuYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jOjEwMzM6XHRcdHRtcF9wYXJ0ID0ga21hbGxvY19vYmooKnRtcF9wYXJ0KTtcbmFyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYy0xMDM0LVx0XHRlcnIgPSAtRU5PTUVNO1xuLS1cbmFyY2gvcG93ZXJwYy9rdm0vZTUwMF9tbXUuYz03MzE9aW50IGt2bV92Y3B1X2lvY3RsX2NvbmZpZ190bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LFxuLS1cbmFyY2gvcG93ZXJwYy9rdm0vZTUwMF9tbXUuYy03NzQtXHRcdCAgICBjZmctXHUwMDNlYXJyYXkgLyBQQUdFX1NJWkU7XG5hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11LmM6Nzc1Olx0cGFnZXMgPSBrbWFsbG9jX29ianMoKnBhZ2VzLCBudW1fcGFnZXMpO1xuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jLTc3Ni1cdGlmICghcGFnZXMpXG4tLVxuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jPTg5OD1pbnQga3ZtcHBjX2U1MDBfdGxiX2luaXQoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMClcbi0tXG5hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11LmMtOTE0LVxuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jOjkxNTpcdHZjcHVfZTUwMC1cdTAwM2VndGxiX2FyY2ggPSBrbWFsbG9jX29ianMoKnZjcHVfZTUwMC1cdTAwM2VndGxiX2FyY2gsXG5hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11LmMtOTE2LVx0XHRcdFx0XHQgICAgS1ZNX0U1MDBfVExCMF9TSVpFICYjNDM7IEtWTV9FNTAwX1RMQjFfU0laRSk7XG4tLVxuYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jPTQ1PXN0YXRpYyBpbnQgZ3JvdyhyaF9pbmZvX3QgKiBpbmZvLCBpbnQgbWF4X2Jsb2Nrcylcbi0tXG5hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmMtNTYtXG5hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmM6NTc6XHRibG9jayA9IGttYWxsb2Nfb2JqcyhyaF9ibG9ja190LCBtYXhfYmxvY2tzLCBHRlBfQVRPTUlDKTtcbmFyY2gvcG93ZXJwYy9saWIvcmhlYXAuYy01OC1cdGlmIChibG9jayA9PSBOVUxMKVxuLS1cbmFyY2gvcG93ZXJwYy9saWIvcmhlYXAuYz0yNTM9cmhfaW5mb190ICpyaF9jcmVhdGUodW5zaWduZWQgaW50IGFsaWdubWVudClcbi0tXG5hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmMtMjYwLVxuYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jOjI2MTpcdGluZm8gPSBrbWFsbG9jX29iaigqaW5mbywgR0ZQX0FUT01JQyk7XG5hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmMtMjYyLVx0aWYgKGluZm8gPT0gTlVMTClcbi0tXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvbW11X2NvbnRleHQuYz05NT1zdGF0aWMgaW50IGhhc2hfX2luaXRfbmV3X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pXG4tLVxuYXJjaC9wb3dlcnBjL21tL2Jvb2szczY0L21tdV9jb250ZXh0LmMtOTgtXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvbW11X2NvbnRleHQuYzo5OTpcdG1tLVx1MDAzZWNvbnRleHQuaGFzaF9jb250ZXh0ID0ga21hbGxvY19vYmooc3RydWN0IGhhc2hfbW1fY29udGV4dCk7XG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvbW11X2NvbnRleHQuYy0xMDAtXHRpZiAoIW1tLVx1MDAzZWNvbnRleHQuaGFzaF9jb250ZXh0KVxuLS1cbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9tbXVfY29udGV4dC5jLTEyNS1cdFx0aWYgKGN1cnJlbnQtXHUwMDNlbW0tXHUwMDNlY29udGV4dC5oYXNoX2NvbnRleHQtXHUwMDNlc3B0KSB7XG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvbW11X2NvbnRleHQuYzoxMjY6XHRcdFx0bW0tXHUwMDNlY29udGV4dC5oYXNoX2NvbnRleHQtXHUwMDNlc3B0ID0ga21hbGxvY19vYmooc3RydWN0IHN1YnBhZ2VfcHJvdF90YWJsZSk7XG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvbW11X2NvbnRleHQuYy0xMjctXHRcdFx0aWYgKCFtbS1cdTAwM2Vjb250ZXh0Lmhhc2hfY29udGV4dC1cdTAwM2VzcHQpIHtcbi0tXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmM9NjIzPXN0YXRpYyBpbnQgZXZlbnRfdW5pcV9hZGQoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBubCxcbi0tXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtNjUwLVxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jOjY1MTpcdGRhdGEgPSBrbWFsbG9jX29iaigqZGF0YSk7XG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtNjUyLVx0aWYgKCFkYXRhKVxuLS1cbmFyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYz03NTU9c3RhdGljIGludCBjcmVhdGVfZXZlbnRzX2Zyb21fY2F0YWxvZyhzdHJ1Y3QgYXR0cmlidXRlICoqKmV2ZW50c18sXG4tLVxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jLTkwOC1cbmFyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYzo5MDk6XHRldmVudHMgPSBrbWFsbG9jX29ianMoKmV2ZW50cywgYXR0cl9tYXggJiM0MzsgMSk7XG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtOTEwLVx0aWYgKCFldmVudHMpIHtcbi0tXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtOTE0LVxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jOjkxNTpcdGV2ZW50X2Rlc2NzID0ga21hbGxvY19vYmpzKCpldmVudF9kZXNjcywgZXZlbnRfaWR4ICYjNDM7IDEpO1xuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jLTkxNi1cdGlmICghZXZlbnRfZGVzY3MpIHtcbi0tXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtOTIwLVxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jOjkyMTpcdGV2ZW50X2xvbmdfZGVzY3MgPSBrbWFsbG9jX29ianMoKmV2ZW50X2xvbmdfZGVzY3MsIGV2ZW50X2lkeCAmIzQzOyAxKTtcbmFyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYy05MjItXHRpZiAoIWV2ZW50X2xvbmdfZGVzY3MpIHtcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9oc3RhX21zaS5jPTEyMj1zdGF0aWMgaW50IGhzdGFfbXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvaHN0YV9tc2kuYy0xNTMtXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9oc3RhX21zaS5jOjE1NDpcdHBwYzR4eF9oc3RhX21zaS5pcnFfbWFwID0ga21hbGxvY19vYmpzKGludCwgaXJxX2NvdW50KTtcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2hzdGFfbXNpLmMtMTU1LVx0aWYgKCFwcGM0eHhfaHN0YV9tc2kuaXJxX21hcCkge1xuLS1cbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmM9NDQ9c3RhdGljIGludCBzcHVmc19hdHRyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYy00OS1cbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmM6NTA6XHRhdHRyID0ga21hbGxvY19vYmooKmF0dHIpO1xuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYy01MS1cdGlmICghYXR0cilcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYz02Mjg9dm9pZCBxdWV1ZV9ob3RwbHVnX2V2ZW50KHN0cnVjdCBwc2VyaWVzX2hwX2Vycm9ybG9nICpocF9lcnJsb2cpXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMtNjM2LVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmM6NjM3Olx0d29yayA9IGttYWxsb2Nfb2JqKHN0cnVjdCBwc2VyaWVzX2hwX3dvcmssIEdGUF9BVE9NSUMpO1xuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmMtNjM4LVx0aWYgKHdvcmspIHtcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjc2VydmVyLmM9MTE5PWludCBodmNzX2dldF9wYXJ0bmVyX2luZm8odWludDMyX3QgdW5pdF9hZGRyZXNzLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLFxuLS1cbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYy0xNjItXHRcdCAqIGh2Y3NfZnJlZV9wYXJ0bmVyX2luZm8oKS4gKi9cbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYzoxNjM6XHRcdG5leHRfcGFydG5lcl9pbmZvID0ga21hbGxvY19vYmooc3RydWN0IGh2Y3NfcGFydG5lcl9pbmZvLFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Y3NlcnZlci5jLTE2NC1cdFx0XHRcdFx0XHRHRlBfQVRPTUlDKTtcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhcmNmZy5jPTE0ND1zdGF0aWMgdm9pZCBzaG93X2dwY2lfZGF0YShzdHJ1Y3Qgc2VxX2ZpbGUgKm0pXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXJjZmcuYy0xNDktXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhcmNmZy5jOjE1MDpcdGJ1ZiA9IGttYWxsb2Nfb2JqKCpidWYpO1xuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXJjZmcuYy0xNTEtXHRpZiAoYnVmID09IE5VTEwpXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jPTQzNT1zdGF0aWMgaW50IHBzZXJpZXNfbXNpX29wc19wcmVwYXJlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHN0cnVjdCBkZXZpY2UgKmRldixcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbXNpLmMtNDQzLVx0c3RydWN0IHBzZXJpZXNfbXNpX2RldmljZSAqcHNlcmllc19kZXYgX19mcmVlKGtmcmVlKVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jOjQ0NDpcdFx0PSBrbWFsbG9jX29iaigqcHNlcmllc19kZXYpO1xuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jLTQ0NS1cdGlmICghcHNlcmllc19kZXYpXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jPTEyMD1zdGF0aWMgaW50IHBzZXJpZXNfcGNpX3NyaW92X2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTE2IG51bV92ZnMpXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jLTE0My1cdHBkbiA9IHBjaV9nZXRfcGRuKHBkZXYpO1xuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jOjE0NDpcdHBkbi1cdTAwM2VwZV9udW1fbWFwID0ga21hbGxvY19vYmpzKCpwZG4tXHUwMDNlcGVfbnVtX21hcCwgbnVtX3Zmcyk7XG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMtMTQ1LVx0aWYgKCFwZG4tXHUwMDNlcGVfbnVtX21hcClcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmFzLmM9MTA3Nj1zdGF0aWMgaW50IF9faW5pdCBwc2VyaWVzX3Zhc19pbml0KHZvaWQpXG4tLVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Zhcy5jLTEwODktXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmFzLmM6MTA5MDpcdGh2X2NhcHMgPSBrbWFsbG9jX29iaigqaHZfY2Fwcyk7XG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmFzLmMtMTA5MS1cdGlmICghaHZfY2Fwcylcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmlvLmM9NzA1PXN0YXRpYyBpbnQgdmlvX2Ntb19idXNfcHJvYmUoc3RydWN0IHZpb19kZXYgKnZpb2Rldilcbi0tXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmlvLmMtNzQ3LVxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Zpby5jOjc0ODpcdFx0ZGV2X2VudCA9IGttYWxsb2Nfb2JqKHN0cnVjdCB2aW9fY21vX2Rldl9lbnRyeSk7XG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmlvLmMtNzQ5LVx0XHRpZiAoIWRldl9lbnQpXG4tLVxuYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmM9MzUyPXN0YXRpYyBpbnQgZnNsX2xiY19zeXNjb3JlX3N1c3BlbmQodm9pZCAqZGF0YSlcbi0tXG5hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYy0zNjQtXG5hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYzozNjU6XHRjdHJsLVx1MDAzZXNhdmVkX3JlZ3MgPSBrbWFsbG9jX29iaihzdHJ1Y3QgZnNsX2xiY19yZWdzKTtcbmFyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jLTM2Ni1cdGlmICghY3RybC1cdTAwM2VzYXZlZF9yZWdzKVxuLS1cbmFyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jPTE1NDk9dm9pZCBfX2luaXQgbXBpY19pbml0KHN0cnVjdCBtcGljICptcGljKVxuLS1cbmFyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jLTE2NDEtXHQvKiBhbGxvY2F0ZSBtZW1vcnkgdG8gc2F2ZSBtcGljIHN0YXRlICovXG5hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYzoxNjQyOlx0bXBpYy1cdTAwM2VzYXZlX2RhdGEgPSBrbWFsbG9jX29ianMoKm1waWMtXHUwMDNlc2F2ZV9kYXRhLCBtcGljLVx1MDAzZW51bV9zb3VyY2VzKTtcbmFyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jLTE2NDMtXHRCVUdfT04obXBpYy1cdTAwM2VzYXZlX2RhdGEgPT0gTlVMTCk7XG4tLVxuYXJjaC9wb3dlcnBjL3N5c2Rldi9vZl9ydGMuYz0yMz12b2lkIF9faW5pdCBvZl9pbnN0YW50aWF0ZV9ydGModm9pZClcbi0tXG5hcmNoL3Bvd2VycGMvc3lzZGV2L29mX3J0Yy5jLTM1LVxuYXJjaC9wb3dlcnBjL3N5c2Rldi9vZl9ydGMuYzozNjpcdFx0XHRyZXMgPSBrbWFsbG9jX29iaigqcmVzKTtcbmFyY2gvcG93ZXJwYy9zeXNkZXYvb2ZfcnRjLmMtMzctXHRcdFx0aWYgKCFyZXMpIHtcbi0tXG5hcmNoL3Jpc2N2L2tlcm5lbC9tb2R1bGUuYz02NTQ9c3RhdGljIGludCBhZGRfcmVsb2NhdGlvbl90b19hY2N1bXVsYXRlKHN0cnVjdCBtb2R1bGUgKm1lLCBpbnQgdHlwZSxcbi0tXG5hcmNoL3Jpc2N2L2tlcm5lbC9tb2R1bGUuYy02NjUtXG5hcmNoL3Jpc2N2L2tlcm5lbC9tb2R1bGUuYzo2NjY6XHRlbnRyeSA9IGttYWxsb2Nfb2JqKCplbnRyeSk7XG5hcmNoL3Jpc2N2L2tlcm5lbC9tb2R1bGUuYy02NjctXG4tLVxuYXJjaC9yaXNjdi9rZXJuZWwvbW9kdWxlLmMtNjk5LVx0aWYgKCFmb3VuZCkge1xuYXJjaC9yaXNjdi9rZXJuZWwvbW9kdWxlLmM6NzAwOlx0XHRyZWxfaGVhZCA9IGttYWxsb2Nfb2JqKCpyZWxfaGVhZCk7XG5hcmNoL3Jpc2N2L2tlcm5lbC9tb2R1bGUuYy03MDEtXG4tLVxuYXJjaC9yaXNjdi9rZXJuZWwvbW9kdWxlLmMtNzExLVx0XHRcdGJ1Y2tldCA9XG5hcmNoL3Jpc2N2L2tlcm5lbC9tb2R1bGUuYzo3MTI6XHRcdFx0XHRrbWFsbG9jX29iaihzdHJ1Y3QgdXNlZF9idWNrZXQpO1xuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE1OjA0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT43bTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM0NTI3CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMzY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgYnBmX2xvb2t1cF9rZXlyaW5nIFBhdGNoKioKCk9rYXksIHNvIGBrbWFsbG9jX29iamAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0aGlzIGlzIHByb2JhYmx5IGEgbWFjcm8sIG1vc3QgbGlrZWx5IGRlZmluZWQgc29tZXdoZXJlIGluIHRoZSBrZXJuZWwmIzM5O3MgYGluY2x1ZGUvbGludXgvc2xhYi5oYCBkaXJlY3RvcnksIG9yIGEgc2ltaWxhciBoZWFkZXIuIEl0JiMzOTtzIGFsbW9zdCBjZXJ0YWlubHkgYSB3cmFwcGVyIGFyb3VuZCBga21hbGxvYyhzaXplb2YoKmJrZXkpLCBHRlBfS0VSTkVMKWAuICBKdXN0IGEgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24uCgpSaWdodCwgdGhlIHBhdGNoIHVzZXMgYGttYWxsb2Nfb2JqKCpia2V5KWAsIHdoaWNoIGlzIHB1cmVseSBhbGxvY2F0aW9uLiBOb3RoaW5nIGZhbmN5LiAgTXkgaW1tZWRpYXRlIGNvbmNlcm4sIHRob3VnaCwgaXMgd2hldGhlciB0aGUgcGF0Y2ggaW5hZHZlcnRlbnRseSBpbnRyb2R1Y2VzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGJlaW5nIGV4cG9zZWQgdG8gdXNlciBzcGFjZS4gSSBkb24mIzM5O3Qgc2VlIGFueSBvYnZpb3VzIGRpcmVjdCBwYXRoIGhlcmUsIGJ1dCBsZXQmIzM5O3MgYmUgdGhvcm91Z2guCgpMZXQmIzM5O3MgZGl2ZSBpbnRvIGBicGZfbG9va3VwX2tleXJpbmdgOgoKYGBgYwomIzQzO3N0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBicGZfa2V5ICpia2V5OwomIzQzOwomIzQzOwlpZiAoIWJwZl9rZXlyaW5nKQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CWlmICghUkVBRF9PTkNFKGJwZl9rZXlyaW5nLSZndDtrZXlzLm5yX2xlYXZlc19vbl90cmVlKSB8fAomIzQzOwkgICAgIVJFQURfT05DRShicGZfa2V5cmluZy0mZ3Q7cmVzdHJpY3RfbGluaykpCiYjNDM7CQlyZXR1cm4gTlVMTDsKJiM0MzsKJiM0MzsJYmtleSA9IGttYWxsb2Nfb2JqKCpia2V5KTsKJiM0MzsJaWYgKCFia2V5KQomIzQzOwkJcmV0dXJuIE5VTEw7CiYjNDM7CiYjNDM7CWJrZXktJmd0O2tleSA9IGJwZl9rZXlyaW5nOwomIzQzOwlia2V5LSZndDtoYXNfcmVmID0gZmFsc2U7CiYjNDM7CXJldHVybiBia2V5OwomIzQzO30KYGBgCgpBaGEhIE5vdyB0aGlzIGlzIHdoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcuIGBrbWFsbG9jX29iamAgYWxsb2NhdGVzLCBidXQgZG9lcyBpdCB6ZXJvIHRoZSBtZW1vcnk/IElmIGl0IGJlaGF2ZXMgbGlrZSBzdGFuZGFyZCBga21hbGxvY2AsIHRoZSBhbGxvY2F0ZWQgYGJrZXlgICppc24mIzM5O3QqIGZ1bGx5IGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQuIAoKT2theSwgbGV0IG1lIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgYnBmX2tleWAgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBMZXQmIzM5O3MgbG9vayBhdCBgaW5jbHVkZS9saW51eC9icGYuaGAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE1OjExPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3N0cnVjdCBicGZfa2V5IFxceyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2JwZi5oPTM4MDQ9c3RhdGljIGlubGluZSBpbnQgYnBmX2ZkX3JldXNlcG9ydF9hcnJheV91cGRhdGVfZWxlbShzdHJ1Y3QgYnBmX21hcCAqbWFwLFxuLS1cbmluY2x1ZGUvbGludXgvYnBmLmgtMzgxMy0jaWZkZWYgQ09ORklHX0tFWVNcbmluY2x1ZGUvbGludXgvYnBmLmg6MzgxNDpzdHJ1Y3QgYnBmX2tleSB7XG5pbmNsdWRlL2xpbnV4L2JwZi5oLTM4MTUtXHRzdHJ1Y3Qga2V5ICprZXk7XG4tLVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3JlZl90cmFja2luZy5jLTI1LVxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3JlZl90cmFja2luZy5jOjI2OnN0cnVjdCBicGZfa2V5IHt9IF9fYXR0cmlidXRlX18oKHByZXNlcnZlX2FjY2Vzc19pbmRleCkpO1xudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3JlZl90cmFja2luZy5jLTI3LVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNToxMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNTU2MwoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDI2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gdGhlIGBicGZfa2V5YCBTdHJ1Y3R1cmUqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIHNwZWNpZmljcyBvZiBgc3RydWN0IGJwZl9rZXlgLCBhbmQgdGhlIGJlc3QgcGxhY2UgdG8gc3RhcnQsIGFzIGFsd2F5cywgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlOiBgaW5jbHVkZS9saW51eC9icGYuaGAuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBtZW1iZXJzLCB0aGVpciBkYXRhIHR5cGVzLCBhbmQgYW55IHJlbGV2YW50IGNvbW1lbnRzIHdpdGhpbiB0aGUgaGVhZGVyIGZpbGUgaXRzZWxmLiBUaGlzIGlzIGNydWNpYWwgZm9yIHdoYXRldmVyIEkmIzM5O20gd29ya2luZyBvbiDigJMgd2hldGhlciBpdCYjMzk7cyB1bmRlcnN0YW5kaW5nIGV4aXN0aW5nIEJQRiBjb2RlLCBleHRlbmRpbmcgdGhlIGtlcm5lbCYjMzk7cyBCUEYgZnVuY3Rpb25hbGl0eSwgb3IgbWF5YmUgZXZlbiBkZWJ1Z2dpbmcgc29tZXRoaW5nIHJlbGF0ZWQgdG8ga2V5IG1hbmFnZW1lbnQgd2l0aGluIGEgQlBGIHByb2dyYW0uIEkmIzM5O20gbG9va2luZyBmb3IgYW55dGhpbmcgdGhhdCBtaWdodCBzaGVkIGxpZ2h0IG9uIGhvdyBrZXlzIGFyZSBzdHJ1Y3R1cmVkLCBob3cgdGhleSYjMzk7cmUgdXNlZCwgYW5kIGFueSBwb3RlbnRpYWwgZ290Y2hhcyBvciBvcHRpbWl6YXRpb25zIHJlbGF0ZWQgdG8gdGhlbS4gR290dGEgbWFrZSBzdXJlIEkmIzM5O20gbm90IG1pc3NpbmcgYW55dGhpbmcgY3JpdGljYWwgZm9yIG15IGN1cnJlbnQgdGFzay4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjUgMTU6MTI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2JwZi5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzgxNCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAxMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDszODE0Olx0c3RydWN0IGJwZl9rZXkge1xuMzgxNTpcdFx0c3RydWN0IGtleSAqa2V5O1xuMzgxNjpcdFx0Ym9vbCBoYXNfcmVmO1xuMzgxNzpcdH07XG4zODE4Olx0I2VuZGlmIC8qIENPTkZJR19LRVlTICovXG4zODE5Olx0XG4zODIwOlx0I2lmIGRlZmluZWQoQ09ORklHX0tFWVMpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTClcbjM4MjE6XHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF91c2VyX2tleShzMzIgc2VyaWFsLCB1NjQgZmxhZ3MpO1xuMzgyMjpcdHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKTtcbjM4MjM6XHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNToxMjwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzNjAwNwoJCQkJCQkJb3V0cHV0OiAzOAoJCQkJCQkJdGhvdWdodHM6IDE2NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIGBicGZfa2V5YCBTdHJ1Y3R1cmUgYW5kIGl0cyBVc2FnZSoqCgpPa2F5LCBzbyBJJiMzOTttIGxvb2tpbmcgYXQgdGhpcyBgc3RydWN0IGJwZl9rZXlgIGFuZCBpdCYjMzk7cyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkLiBKdXN0IHR3byBmaWVsZHM6IGEgcG9pbnRlciB0byBhIGBzdHJ1Y3Qga2V5YCBjYWxsZWQgYGtleWAsIGFuZCBhIGJvb2xlYW4gYGhhc19yZWZgLiBSaWdodCBhd2F5LCBJIG5vdGljZSB0aGUgaW5pdGlhbGl6YXRpb24gaW4gYGJwZl9sb29rdXBfa2V5cmluZ2A6IGBia2V5LSZndDtrZXkgPSBicGZfa2V5cmluZztgIGFuZCBgYmtleS0mZ3Q7aGFzX3JlZiA9IGZhbHNlO2AuIE5vdGhpbmcgdW51c3VhbCB0aGVyZS4KCkkmIzM5O20gdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIGFsaWdubWVudC4gVGhlcmUgKm1pZ2h0KiBiZSBzb21lIHBhZGRpbmcgYmV0d2VlbiBga2V5YCB3aGljaCBpcyA4IGJ5dGVzLCBhbmQgYGhhc19yZWZgLCB3aGljaCBpcyAxIGJ5dGUsIGJ1dCBzaW5jZSB0aGlzIGBzdHJ1Y3QgYnBmX2tleWAgaXNuJiMzOTt0IGV4cG9zZWQgdG8gdXNlciBzcGFjZSwgdGhhdCYjMzk7cyBub3QgYSBodWdlIGNvbmNlcm4uIEl0JiMzOTtzIHVzZWQgaW50ZXJuYWxseSBpbiBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgYW5kIGV2ZW50dWFsbHkgY2xlYW5lZCB1cCB3aXRoIGBicGZfa2V5X3B1dGAuIFRoYXQgbWVhbnMgdGhlcmUgYXJlIG5vIGNvbmNlcm5zIGFib3V0IHN0cnVjdHVyZSBsYXlvdXQgYmVpbmcgaW50ZXJwcmV0ZWQgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBsZXNzIHRydXN0d29ydGh5IHRoYW4gd2l0aGluIHRoZSBrZXJuZWwgaXRzZWxmLgoKTm93LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoYXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGZ1bmN0aW9uLiBJIHNob3VsZCBjaGVjayBpdCBvdXQgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AuIExldCYjMzk7cyBzZWUgaG93IGl0JiMzOTtzIGFjdHVhbGx5IHVzaW5nIHRoaXMgYGJwZl9rZXlgIHN0cnVjdHVyZSBhbmQgaWYgdGhlcmUgYXJlIGFueSBzdWJ0bGUgaW50ZXJhY3Rpb25zIHRvIGJlIGF3YXJlIG9mLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNToxMjwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvdmVyaWZpZXIuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDIxMDE1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDUwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIxMDE1Olx0XHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcbjIxMDE2Olx0XHR2b2lkICpzaWcsICpkYXRhID0gTlVMTDtcbjIxMDE3Olx0XHR1MzIgbWFwX2NudCA9IGVudi1cdTAwM2V1c2VkX21hcF9jbnQ7XG4yMTAxODpcdFx0dTMyIGksIG9mZiwgaW5zbnNfc3o7XG4yMTAxOTpcdFx0dTY0IGRhdGFfc3o7XG4yMTAyMDpcdFx0aW50IGVyciA9IDA7XG4yMTAyMTpcdFxuMjEwMjI6XHRcdGlmICghYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSB8fFxuMjEwMjM6XHRcdCAgICBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplIFx1MDAzZSBCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkUpXG4yMTAyNDpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIxMDI1Olx0XG4yMTAyNjpcdFx0aWYgKCFzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVx1MDAzZWtleXJpbmdfaWQpKSB7XG4yMTAyNzpcdFx0XHRrZXkgPSBicGZfbG9va3VwX3N5c3RlbV9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkKTtcbjIxMDI4Olx0XHR9IGVsc2Uge1xuMjEwMjk6XHRcdFx0aWYgKGF0dHItXHUwMDNla2V5cmluZ19pZCAhPSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XG4yMTAzMDpcdFx0XHRcdGlmIChicGZfa2V5cmluZ19lbmZvcmNlZCgpKSB7XG4yMTAzMTpcdFx0XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2NhbGxlci1zdXBwbGllZCBrZXlyaW5nIHJlZnVzZWQsIHVzZSBicGYga2V5cmluZ1xcblwmIzM0Oyk7XG4yMTAzMjpcdFx0XHRcdFx0cmV0dXJuIC1FUEVSTTtcbjIxMDMzOlx0XHRcdFx0fVxuMjEwMzQ6XHRcdFx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4yMTAzNTpcdFx0XHR9IGVsc2Uge1xuMjEwMzY6XHRcdFx0XHRrZXkgPSBicGZfbG9va3VwX2tleXJpbmcoKTtcbjIxMDM3Olx0XHRcdH1cbjIxMDM4Olx0XHR9XG4yMTAzOTpcdFx0aWYgKCFrZXkpIHtcbjIxMDQwOlx0XHRcdGlmIChhdHRyLVx1MDAzZWtleXJpbmdfaWQgPT0gVkVSSUZZX1VTRV9CUEZfS0VZUklORykge1xuMjEwNDE6XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7dGhlIGJwZiBrZXlyaW5nIGlzIGVtcHR5IG9yIGhhcyBub3QgYmVlbiByZXN0cmljdGVkXFxuXCYjMzQ7KTtcbjIxMDQyOlx0XHRcdFx0cmV0dXJuIC1FTk9LRVk7XG4yMTA0MzpcdFx0XHR9IGVsc2Uge1xuMjEwNDQ6XHRcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7Y2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcblwmIzM0OyxcbjIxMDQ1Olx0XHRcdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuMjEwNDY6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIxMDQ3Olx0XHRcdH1cbjIxMDQ4Olx0XHR9XG4yMTA0OTpcdFxuMjEwNTA6XHRcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbjIxMDUxOlx0XHRpZiAoSVNfRVJSKHNpZykpIHtcbjIxMDUyOlx0XHRcdGJwZl9rZXlfcHV0KGtleSk7XG4yMTA1MzpcdFx0XHRyZXR1cm4gUFRSX0VSUihzaWcpO1xuMjEwNTQ6XHRcdH1cbjIxMDU1Olx0XG4yMTA1NjpcdFx0aW5zbnNfc3ogPSBwcm9nLVx1MDAzZWxlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuMjEwNTc6XHRcdGRhdGFfc3ogPSBpbnNuc19zejtcbjIxMDU4Olx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBtYXBfY250OyBpJiM0MzsmIzQzOykge1xuMjEwNTk6XHRcdFx0c3RydWN0IGJwZl9tYXAgKm1hcCA9IG1hcHNbaV07XG4yMTA2MDpcdFxuMjEwNjE6XHRcdFx0aWYgKG1hcC1cdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgfHxcbjIxMDYyOlx0XHRcdCAgICAhbWFwLVx1MDAzZW9wcy1cdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIpIHtcbjIxMDYzOlx0XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O3NpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAmIzM5OyVzJiMzOTsgbXVzdCBiZSBhbiBhcnJheVxcblwmIzM0OyxcbjIxMDY0Olx0XHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE1OjEyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDM3MzgzCgkJCQkJCQlvdXRwdXQ6IDM4CgkJCQkJCQl0aG91Z2h0czogMzI0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKk15IEFzc2Vzc21lbnQgb2YgdGhlIFByb3Bvc2VkIFBhdGNoKioKCk9rYXksIGxldCBtZSBicmVhayB0aGlzIGRvd24uIEZyb20gd2hhdCBJIHNlZSwgdGhpcyBwYXRjaCBpcyBmYWlybHkgY29udGFpbmVkIOKAkyBpdOKAmXMgbm90IGludHJvZHVjaW5nIGFueSBub3ZlbCB1c2VyLXNwYWNlIGRhdGEgc3RydWN0dXJlcywgd2hpY2ggaXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LiBUaGUgY29yZSBzZWVtcyB0byBiZSBjZW50ZXJlZCBhcm91bmQgaGFuZGxpbmcgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgIHdpdGhpbiBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAuIFRoYXQmIzM5O3MgdGhlIGtleS4gSSBjYW4gaW1tZWRpYXRlbHkgaW5mZXIgdGhhdCB0aGUgZ29hbCBpcyB0byBsZXZlcmFnZSBhIEJQRiBrZXlyaW5nIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhIHJlYXNvbmFibGUgYXJjaGl0ZWN0dXJhbCBjaG9pY2UuCgpTbywgaXQgbG9va3MgbGlrZSBpdCYjMzk7cyBidWlsZGluZyB0aGUgZ3JvdW5kd29yayBmb3Iga2V5IG1hbmFnZW1lbnQgd2l0aCBgYnBmX2tleXJpbmdfaW5pdGAsIGFuZCB0aGUgYGJwZl9rZXlyaW5nX3Vuc2VhbGVkYCBtb2R1bGUgcGFyYW1ldGVyIGlzIGludGVyZXN0aW5nIOKAkyBpdCBwcm92aWRlcyBjb250cm9sIG92ZXIga2V5cmluZyBzZWFsaW5nLCB3aGljaCBsaWtlbHkgaGFzIHNlY3VyaXR5IGltcGxpY2F0aW9ucy4gSSBuZWVkIHRvIGtlZXAgdGhhdCBpbiBtaW5kLgoKVGhlIGFkZGl0aW9uIG9mIGBicGZfbG9va3VwX2tleXJpbmdgIHJhaXNlcyBhIHJlZCBmbGFnLiBJIHdhbnQgdG8gY2hlY2sgZm9yIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZXMsIHNvIEkmIzM5O2xsIGRyaWxsIGRvd24gb24gdGhlIG1lbW9yeSBhbGxvY2F0aW9uLiBUaGUgdXNlIG9mIGBrbWFsbG9jX29iamAsIHdoaWNoIGlzIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBhcyBga21hbGxvY2AsIHRvIGFsbG9jYXRlIHRoZSBgc3RydWN0IGJwZl9rZXlgIGlzIHN0YW5kYXJkLiBJdCBzZWVtcyBzYWZlIGFzIHRoZSBmaWVsZHMgYGtleWAgYW5kIGBoYXNfcmVmYCBhcmUgaW5pdGlhbGl6ZWQsIGJ1dCBJJiMzOTtsbCBtYWtlIHN1cmUgdGhleSBzdGF5IGluaXRpYWxpemVkLiBGdXJ0aGVybW9yZSwgc2luY2UgdGhlIGBicGZfa2V5YCBzdHJ1Y3R1cmUgaXRzZWxmIGlzbiYjMzk7dCBkaXJlY3RseSBleHBvc2VkIHRvIHVzZXIgc3BhY2UsIHRoZSByaXNrIHNlZW1zIG1pbmltYWwsIGJ1dCB0aGF0JiMzOTtzIHNvbWV0aGluZyB0byBleHBsaWNpdGx5IHZlcmlmeS4KClRoZSBzaWduYXR1cmUgaGFuZGxpbmcgaXMgd2hlcmUgdGhlIGNvcmUgb2YgdGhlIHNlY3VyaXR5IGxpZXMuIFRoZSBzaWduYXR1cmUgaXMgY29waWVkIGZyb20gdXNlciBzcGFjZSB2aWEgYGt2bWVtZHVwX2JwZnB0cmAsIHdoaWNoIGlzIGdvb2QgcHJhY3RpY2UuIEkmIzM5O20gcGxlYXNlZCB0byBzZWUgdGhhdCB0aGUgYGF0dHItJmd0O3NpZ25hdHVyZV9zaXplYCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCBgQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFYCAoNjRLQiksIGEgc3RyaWN0ZXIgYm91bmQgdGhhbiB0aGUgb2xkIGBLTUFMTE9DX01BWF9DQUNIRV9TSVpFYC4gVGhpcyBwcmV2ZW50cyBleGNlc3NpdmUgbWVtb3J5IGFsbG9jYXRpb24uIEl0IHRoZW4gZ2V0cyB2ZXJpZmllZCB1c2luZyBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgLiBUaGUgZmFjdCB0aGF0IGl0JiMzOTtzIHVzaW5nIGEgUEtDUyM3IHNpZ25hdHVyZSBhbmQgaXQmIzM5O3MgYmVpbmcgY29waWVkIGFuZCB2YWxpZGF0ZWQgc3VnZ2VzdHMgYSBzb2xpZCwgd2VsbC1kZWZpbmVkIGFwcHJvYWNoIHRvIHNpZ25pbmcgQlBGIHByb2dyYW1zLiBCdXQgdGhhdCBmdW5jdGlvbiB1c2FnZSwgSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoYXQgZnVydGhlci4gSSBzaG91bGQgY2hlY2sgaG93IHRoYXQgZnVuY3Rpb24gaXMgYmVpbmcgdXNlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIHBvdGVudGlhbCBmbGF3cy4KCkZpbmFsbHksIHRoZSB1cGRhdGVzIHRvIGBicGZ0b29sYCBmb3IgTUwtRFNBIGFuZCBDTVNfTk9BVFRSIHN1cHBvcnQgYXJlIHdlbGNvbWUsIGFuZCB0aGUgYWRkZWQgc2VsZnRlc3RzIGFyZSBhIHBvc2l0aXZlIHNpZ24gb2Ygcm9idXN0IGRldmVsb3BtZW50LiBPdmVyYWxsLCBpdCYjMzk7cyBhIHNvbGlkIHN0YXJ0LiBJIHdhbnQgdG8gZG8gYSBjb2RlIHJldmlldyBvZiB0aGUgYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYCBmdW5jdGlvbiBpdHNlbGYgYW5kIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdW5leHBlY3RlZCBzaWRlIGVmZmVjdHMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7a2VybmVsL2JwZi92ZXJpZmllci5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjEwNjUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNTAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjEwNjU6XHRcdFx0XHRlcnIgPSAtRUlOVkFMO1xuMjEwNjY6XHRcdFx0XHRnb3RvIG91dDtcbjIxMDY3Olx0XHRcdH1cbjIxMDY4Olx0XHRcdGlmICghUkVBRF9PTkNFKG1hcC1cdTAwM2Vmcm96ZW4pKSB7XG4yMTA2OTpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJiMzOTslcyYjMzk7IG11c3QgYmUgZnJvemVuXFxuXCYjMzQ7LFxuMjEwNzA6XHRcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbjIxMDcxOlx0XHRcdFx0ZXJyID0gLUVQRVJNO1xuMjEwNzI6XHRcdFx0XHRnb3RvIG91dDtcbjIxMDczOlx0XHRcdH1cbjIxMDc0Olx0XHRcdGlmIChicGZfbWFwX3dyaXRlX2FjdGl2ZShtYXApKSB7XG4yMTA3NTpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJiMzOTslcyYjMzk7IGhhcyBhY3RpdmUgd3JpdGVyc1xcblwmIzM0OyxcbjIxMDc2Olx0XHRcdFx0XHRtYXAtXHUwMDNlbmFtZSk7XG4yMTA3NzpcdFx0XHRcdGVyciA9IC1FQlVTWTtcbjIxMDc4Olx0XHRcdFx0Z290byBvdXQ7XG4yMTA3OTpcdFx0XHR9XG4yMTA4MDpcdFx0XHRpZiAoIW1hcC1cdTAwM2VleGNsX3Byb2dfc2hhKSB7XG4yMTA4MTpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJiMzOTslcyYjMzk7IG11c3QgYmUgZXhjbHVzaXZlXFxuXCYjMzQ7LFxuMjEwODI6XHRcdFx0XHRcdG1hcC1cdTAwM2VuYW1lKTtcbjIxMDgzOlx0XHRcdFx0ZXJyID0gLUVQRVJNO1xuMjEwODQ6XHRcdFx0XHRnb3RvIG91dDtcbjIxMDg1Olx0XHRcdH1cbjIxMDg2Olx0XHRcdGRhdGFfc3ogJiM0Mzs9IG1hcC1cdTAwM2V2YWx1ZV9zaXplO1xuMjEwODc6XHRcdH1cbjIxMDg4Olx0XHRpZiAoYnBmX2R5bnB0cl9jaGVja19zaXplKGRhdGFfc3opKSB7XG4yMTA4OTpcdFx0XHR2ZXJib3NlKGVudiwgXCYjMzQ7c2lnbmVkIHBheWxvYWQgdG9vIGxhcmdlOiAlbGx1IGJ5dGVzXFxuXCYjMzQ7LCBkYXRhX3N6KTtcbjIxMDkwOlx0XHRcdGVyciA9IC1FMkJJRztcbjIxMDkxOlx0XHRcdGdvdG8gb3V0O1xuMjEwOTI6XHRcdH1cbjIxMDkzOlx0XHRkYXRhID0ga3ZtYWxsb2MoZGF0YV9zeiwgR0ZQX0tFUk5FTF9BQ0NPVU5UIHwgX19HRlBfWkVSTyk7XG4yMTA5NDpcdFx0aWYgKCFkYXRhKSB7XG4yMTA5NTpcdFx0XHRlcnIgPSAtRU5PTUVNO1xuMjEwOTY6XHRcdFx0Z290byBvdXQ7XG4yMTA5NzpcdFx0fVxuMjEwOTg6XHRcdG1lbWNweShkYXRhLCBwcm9nLVx1MDAzZWluc25zaSwgaW5zbnNfc3opO1xuMjEwOTk6XHRcdG9mZiA9IGluc25zX3N6O1xuMjExMDA6XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG1hcF9jbnQ7IGkmIzQzOyYjNDM7KSB7XG4yMTEwMTpcdFx0XHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcbjIxMTAyOlx0XHRcdHU2NCBhZGRyO1xuMjExMDM6XHRcbjIxMTA0Olx0XHRcdGVyciA9IG1hcC1cdTAwM2VvcHMtXHUwMDNlbWFwX2RpcmVjdF92YWx1ZV9hZGRyKG1hcCwgXHUwMDI2YWRkciwgMCk7XG4yMTEwNTpcdFx0XHRpZiAoZXJyKSB7XG4yMTEwNjpcdFx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtmYWlsZWQgdG8gcmVhZCBzaWduZWQgbWV0YWRhdGEgbWFwICYjMzk7JXMmIzM5OzogJWRcXG5cJiMzNDssXG4yMTEwNzpcdFx0XHRcdFx0bWFwLVx1MDAzZW5hbWUsIGVycik7XG4yMTEwODpcdFx0XHRcdGdvdG8gb3V0O1xuMjExMDk6XHRcdFx0fVxuMjExMTA6XHRcdFx0bWVtY3B5KGRhdGEgJiM0Mzsgb2ZmLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFkZHIsXG4yMTExMTpcdFx0XHQgICAgICAgbWFwLVx1MDAzZXZhbHVlX3NpemUpO1xuMjExMTI6XHRcdFx0b2ZmICYjNDM7PSBtYXAtXHUwMDNldmFsdWVfc2l6ZTtcbjIxMTEzOlx0XHR9XG4yMTExNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNToxMzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuMS1wcm8tcHJldmlldzwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAzOTEwNgoJCQkJCQkJb3V0cHV0OiAyMQoJCQkJCQkJdGhvdWdodHM6IDE1ODYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUGF0Y2ggU2VyaWVzOiBObyBLTVNBTiBGdXp6aW5nIE5lZWRlZCoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBhbGxvY2F0ZWQgYSBgZGF0YWAgYnVmZmVyIHVzaW5nIGBrdm1hbGxvY2Agd2l0aCBgX19HRlBfWkVST2AuIFRoaXMgbWVhbnMgaXQmIzM5O3MgZnVsbHkgemVyb2VkIHJpZ2h0IG9mZiB0aGUgYmF0LCBhbmQgdGhlbiBJIHBvcHVsYXRlIGl0IHdpdGggYG1lbWNweWAuIFN1YnNlcXVlbnRseSwgSSBwYXNzIHRoaXMgbWVtb3J5IHRvIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAuIFNvLCB0aGVyZSYjMzk7cyBubyB3YXkgdW5pbml0aWFsaXplZCBtZW1vcnkgaXMgbGVha2luZyB0aGVyZS4KCk5vdywgSSBjaGVja2VkIHRoZSBjaGFuZ2VzIHRvIGBpbmNsdWRlL2xpbnV4L2JwZi5oYCwgc3BlY2lmaWNhbGx5IHRoZSBhZGRpdGlvbiBvZiBgQlBGX1NJR19LRVlSSU5HX0JQRmAgdG8gdGhlIGBlbnVtIGJwZl9zaWdfa2V5cmluZ2AuIFRoYXQmIzM5O3MgYSBzaW1wbGUgZW51bSBhZGRpdGlvbjsgbm8gbWVtb3J5IGNvbmNlcm5zIHRoZXJlLgoKTmV4dCwgSSBsb29rZWQgYXQgYGJwZl9jbGFzc2lmeV9rZXlyaW5nYCBpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gVGhpcyBpbnZvbHZlcyBhZGRpbmcgYSBjYXNlIGluIGEgYHN3aXRjaGAgc3RhdGVtZW50IHRoYXQgY2xhc3NpZmllcyB0aGUgbmV3IGtleXJpbmcuIEFnYWluLCBubyBtZW1vcnkgaW5pdGlhbGl6YXRpb24gaXNzdWVzIGFyZSBldmlkZW50LgoKVGhlbiBJIGV4YW1pbmVkIHRoZSBgYnBmX2tleXJpbmdfaW5pdGAgZnVuY3Rpb24gaW4gYGtlcm5lbC9icGYva2V5cy5jYC4gVGhpcyBjcmVhdGVzIGEgbmV3IGtleXJpbmcgYW5kLCBpZiBpdCYjMzk7cyBub3Qgc2VhbGVkLCBpdCBhdHRlbXB0cyB0byByZXN0cmljdCBpdC4gVGhpcyBpcyB3aGVyZSBJIGhhdmUgdG8gYmUgcGFydGljdWxhcmx5IGNhcmVmdWwuIEkgY2hlY2tlZCwgYW5kIGBicGZfa2V5cmluZ19pbml0YCBpc24mIzM5O3QgbGVha2luZyBhbnkgdW5pbml0aWFsaXplZCBkYXRhLgoKSSBjb250aW51ZWQgd2l0aCBgYnBmX2tleXJpbmdfZW5mb3JjZWRgIGFuZCBgYnBmX2xvb2t1cF9rZXlyaW5nYCwgc2NydXRpbml6aW5nIHRoZW0gZm9yIGFueSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuIEJ1dCBmcm9tIHdoYXQgSSBjYW4gc2VlLCB0aGVzZSBmdW5jdGlvbnMgb25seSByZXR1cm4gcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmVzLCBubyB1bmluaXRpYWxpemVkIGRhdGEgaXMgZ29pbmcgdG8gYmUgbGVha2luZy4KCkkgYWxzbyBjaGVja2VkIHRoZSBgYnBmdG9vbGAgY2hhbmdlcyByZWxhdGVkIHRvIHRoZSBDTVMgc2lnbmF0dXJlIGhhbmRsaW5nIGFuZCB0aGUgc2VsZnRlc3QgY2hhbmdlcy4gVGhvc2UgZGlkbiYjMzk7dCBwcmVzZW50IGFueSBpbW1lZGlhdGUgaXNzdWVzLgoKR2l2ZW4gdGhhdCB0aGlzIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIGEgbmV3IGtleXJpbmcgZm9yIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gYnV0IGRvZXNuJiMzOTt0IGludHJvZHVjZSBhbnkgbmV3IHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlLCBvciBhbnkgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMgY291bGQgYmUgcmVhZCBsYXRlci4gSSBhbHNvIG1hZGUgc3VyZSB0aGF0IHRoZSBhbGxvY2F0aW9uIG9mIGBia2V5ID0ga21hbGxvY19vYmooKmJrZXkpO2AgaXMgaW5pdGlhbGl6ZWQuCgpUaGVyZWZvcmUsIEkmIzM5O20gY29uZmlkZW50IHRoYXQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzbiYjMzk7dCBuZWVkZWQuIFRoZSBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGxpa2UgS0FTQU4gYW5kIG90aGVycywgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gY2F0Y2ggYW55IHBvdGVudGlhbCBtZW1vcnkgZXJyb3JzIGxpa2Ugb3V0LW9mLWJvdW5kcyBhY2Nlc3Mgb3IgdXNlLWFmdGVyLWZyZWUgaXNzdWVzLgpMZXQmIzM5O3MganVzdCBkb3VibGUgY2hlY2sgYGt2bWVtZHVwX2JwZnB0cmAgdG8gbWFrZSBzdXJlIQoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI4LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yNSAxNToxMzwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtrdm1lbWR1cF9icGZwdHImIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9icGZwdHIuaD02Mj1zdGF0aWMgaW5saW5lIGludCBjb3B5X3RvX2JwZnB0cl9vZmZzZXQoYnBmcHRyX3QgZHN0LCBzaXplX3Qgb2Zmc2V0LFxuLS1cbmluY2x1ZGUvbGludXgvYnBmcHRyLmgtNjctXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oOjY4OnN0YXRpYyBpbmxpbmUgdm9pZCAqa3ZtZW1kdXBfYnBmcHRyX25vcHJvZihicGZwdHJfdCBzcmMsIHNpemVfdCBsZW4pXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oLTY5LXtcbi0tXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oLTc5LX1cbmluY2x1ZGUvbGludXgvYnBmcHRyLmg6ODA6I2RlZmluZSBrdm1lbWR1cF9icGZwdHIoLi4uKVx0YWxsb2NfaG9va3Moa3ZtZW1kdXBfYnBmcHRyX25vcHJvZihfX1ZBX0FSR1NfXykpXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oLTgxLVxuLS1cbmtlcm5lbC9icGYvc3lzY2FsbC5jPTE3NzI9c3RhdGljIHZvaWQgKl9fX2JwZl9jb3B5X2tleShicGZwdHJfdCB1a2V5LCB1NjQga2V5X3NpemUpXG4tLVxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTc3NC1cdGlmIChrZXlfc2l6ZSlcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjE3NzU6XHRcdHJldHVybiBrdm1lbWR1cF9icGZwdHIodWtleSwga2V5X3NpemUpO1xua2VybmVsL2JwZi9zeXNjYWxsLmMtMTc3Ni1cbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYz0xODQ3PXN0YXRpYyBpbnQgbWFwX3VwZGF0ZV9lbGVtKHVuaW9uIGJwZl9hdHRyICphdHRyLCBicGZwdHJfdCB1YXR0cilcbi0tXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xODc5LVx0dmFsdWVfc2l6ZSA9IGJwZl9tYXBfdmFsdWVfc2l6ZShtYXAsIGF0dHItXHUwMDNlZmxhZ3MpO1xua2VybmVsL2JwZi9zeXNjYWxsLmM6MTg4MDpcdHZhbHVlID0ga3ZtZW1kdXBfYnBmcHRyKHV2YWx1ZSwgdmFsdWVfc2l6ZSk7XG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xODgxLVx0aWYgKElTX0VSUih2YWx1ZSkpIHtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjEwMDg9c3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTIxMDQ5LVxua2VybmVsL2JwZi92ZXJpZmllci5jOjIxMDUwOlx0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTIxMDUxLVx0aWYgKElTX0VSUihzaWcpKSB7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE1OjEzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy4xLXByby1wcmV2aWV3PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDQxODA2CgkJCQkJCQlvdXRwdXQ6IDMyMgoJCQkJCQkJdGhvdWdodHM6IDExNzMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgdGhlIEJQRiBLZXlyaW5nIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBUaGUgY29yZSBjb25jZXJuIGlzIHdoZXRoZXIgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGFueSBuZXcgYXZlbnVlcyBmb3IgdW5pbml0aWFsaXplZCBtZW1vcnkgdG8gbGVhayBpbmZvcm1hdGlvbiBvciBjYXVzZSB2dWxuZXJhYmlsaXRpZXMuIEkmIzM5O20gZ29pbmcgdGhyb3VnaCB0aGUgY29kZSBjaGFuZ2VzIG1ldGhvZGljYWxseS4KCkZpcnN0LCBga3ZtZW1kdXBfYnBmcHRyYDogdGhhdCBvbmUmIzM5O3Mgc29saWQuIEl0JiMzOTtzIGRlc2lnbmVkIHRvIGNvcHkgZGF0YSAqZnJvbSogdXNlcnNwYWNlLCBzbyB3aGF0ZXZlciBtZW1vcnkgaXQgcmV0dXJucyBpcyBndWFyYW50ZWVkIHRvIGJlIGluaXRpYWxpemVkIHdpdGggdXNlci1wcm92aWRlZCBkYXRhLiBBbmQgaWYgdGhlIGNvcHkgZmFpbHMsIGl0IGZyZWVzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBwcmV2ZW50aW5nIGFueSBwb3RlbnRpYWwgbGVhay4gR29vZC4KCk5vdywgYGJwZl9rZXlyaW5nX2luaXRgLiBUaGlzIGlzIGNhbGxlZCBhdCBgbGF0ZV9pbml0Y2FsbGAsIGNyZWF0aW5nIHRoZSBrZXlyaW5nLiBJdCBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGEga2V5cmluZyBzdHJ1Y3QsIGFuZCBzcGVjaWZpY2FsbHkgcmVzdHJpY3RzIGl0IGlmIGBicGZfa2V5cmluZ191bnNlYWxlZGAgaXMgZmFsc2UuIE5vIGlzc3VlcyBoZXJlOyBldmVyeXRoaW5nJiMzOTtzIHByb3Blcmx5IGluaXRpYWxpemVkLgoKTW92aW5nIG9uIHRvIGBicGZfbG9va3VwX2tleXJpbmdgLiBUaGlzIGlzIHdoZXJlIGEgYHN0cnVjdCBicGZfa2V5YCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2Nfb2JqYC4gQ3J1Y2lhbGx5LCBhZnRlciB0aGUgYWxsb2NhdGlvbiwgaXQgZXhwbGljaXRseSBpbml0aWFsaXplcyBib3RoIGBia2V5LSZndDtrZXlgIGFuZCBgYmtleS0mZ3Q7aGFzX3JlZmAuIFRoaXMgaXMga2V5OiBhbGwgdGhlIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYWxsb2NhdGlvbiwgcHJldmVudGluZyBhbnkgcG90ZW50aWFsIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJlYWRzLgoKVGhlbiwgdGhlIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBsb2dpYzogVGhpcyBpcyBqdXN0IGFib3V0IHNlbGVjdGluZyB0aGUgcmlnaHQga2V5cmluZy4gTm8gbWVtb3J5IGFsbG9jYXRpb24gaGFwcGVucyBoZXJlLCBqdXN0IGJyYW5jaGluZyBsb2dpYyB0byBkZXRlcm1pbmUgd2hpY2gga2V5cmluZyB0byB1c2UgYmFzZWQgb24gdGhlIGBhdHRyLSZndDtrZXlyaW5nX2lkYC4gU28sIHRoaXMgc2VjdGlvbiBpcyBhbHNvIGNsZWFuLgoKQW5kIGZpbmFsbHksIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgaXRzZWxmLiBUaGlzIGlzICpub3QqIG1vZGlmaWVkIGluIHRoZSBwYXRjaCwgc28gdGhlIHBhdGNoIGRvZXNuJiMzOTt0IGltcGFjdCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCBpdCBqdXN0IGNhbGxzIGl0LgoKVGhlcmVmb3JlLCBhZnRlciBhIGNhcmVmdWwgcmV2aWV3LCBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHRoaXMgcGF0Y2ggZG9lcyAqbm90KiBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBUaGVyZSBhcmUgbm8gYWxsb2NhdGlvbnMgd2hlcmUgZmllbGRzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQsIGFuZCBubyBuZXcga2VybmVsIHN0cnVjdHVyZXMgYXJlIGJlaW5nIGNvcGllZCB0byB1c2VyIHNwYWNlLiBJdCBpcyBhIG5ldyBCUEYga2V5cmluZyAoYC5icGZgKSBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgaW5jbHVkaW5nIGEga2VybmVsIHBhcmFtZXRlciB0byBtYW5hZ2UgaXRzIHN0YXRlLiBUaGUgY2hhbmdlcyBhcmUgc3RyYWlnaHRmb3J3YXJkIGFuZCBmb2N1cyBvbiBrZXlyaW5nIG1hbmFnZW1lbnQgYW5kIHZlcmlmaWNhdGlvbiBsb2dpYywgd2l0aG91dCBpbnRyb2R1Y2luZyBhbnkgb2J2aW91cyBzb3VyY2VzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBLTVNBTiBpc24mIzM5O3QgbmVjZXNzYXJ5IGhlcmUsIGFzIHRoaXMgcGF0Y2ggZG9lcyBub3QgcG9zZSBhIHRocmVhdCB0byB0aGUgc2VjdXJpdHkgYW5kIGludGVncml0eSBvZiB0aGUgc3lzdGVtIGluIHRlcm1zIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGxpa2UgS0FTQU4gc2hvdWxkIGJlIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBpc3N1ZXMgcmVsYXRlZCB0byB0aGlzIHBhdGNoLiBUaGUga2V5IGFsbG9jYXRpb25zIGFuZCBjb3BpZXMgYXJlIGVpdGhlciBmcm9tIGEga25vd24gc291cmNlLCBvciBmdWxseSB6ZXJvZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI1IDE1OjEzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZXlyaW5nIChgLmJwZmApIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhbG9uZyB3aXRoIGEga2VybmVsIHBhcmFtZXRlciBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIHRvIG1hbmFnZSBpdHMgc3RhdGUuIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIGFkZGluZyBhIG5ldyBrZXlyaW5nIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLCBhZGRpbmcgYSBsb29rdXAgZnVuY3Rpb24gYGJwZl9sb29rdXBfa2V5cmluZ2Agd2hpY2ggYWxsb2NhdGVzIGEgYHN0cnVjdCBicGZfa2V5YCBhbmQgaW5pdGlhbGl6ZXMgaXRzIGZpZWxkcywgYW5kIG1vZGlmeWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgdG8gaGFuZGxlIHRoZSBuZXcgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgIElELlxuXG5Ob25lIG9mIHRoZXNlIGNoYW5nZXMgaW50cm9kdWNlIG5ldyBrZXJuZWwgc3RydWN0dXJlcyB0aGF0IGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgaW50cm9kdWNlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCBmaWVsZHMuIFRoZSBvbmx5IG5ldyBrZXJuZWwgYWxsb2NhdGlvbiBpcyBmb3IgYHN0cnVjdCBicGZfa2V5YCB2aWEgYGttYWxsb2Nfb2JqYCwgYW5kIGFsbCBpdHMgZmllbGRzIChga2V5YCBhbmQgYGhhc19yZWZgKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBhZnRlciBhbGxvY2F0aW9uLiBUaGUgc2lnbmF0dXJlIGFuZCBkYXRhIGJ1ZmZlcnMgdXNlZCBkdXJpbmcgdmVyaWZpY2F0aW9uIGFyZSBhbGxvY2F0ZWQgd2l0aCBga3ZtZW1kdXBfYnBmcHRyYCAod2hpY2ggY29waWVzIGZyb20gdXNlciBzcGFjZSkgYW5kIGBrdm1hbGxvYyguLi4sIF9fR0ZQX1pFUk8pYCAod2hpY2ggemVyby1pbml0aWFsaXplcyksIHJlc3BlY3RpdmVseS5cblxuQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcywgc3VjaCBhcyBtZW1vcnkgbGVha3MsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHVzZS1hZnRlci1mcmVlIGlzc3Vlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBkZWZhdWx0IGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZXlyaW5nIChgLmJwZmApIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhbG9uZyB3aXRoIGEga2VybmVsIHBhcmFtZXRlciBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIHRvIG1hbmFnZSBpdHMgc3RhdGUuIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIGFkZGluZyBhIG5ldyBrZXlyaW5nIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLCBhZGRpbmcgYSBsb29rdXAgZnVuY3Rpb24gYGJwZl9sb29rdXBfa2V5cmluZ2Agd2hpY2ggYWxsb2NhdGVzIGEgYHN0cnVjdCBicGZfa2V5YCBhbmQgaW5pdGlhbGl6ZXMgaXRzIGZpZWxkcywgYW5kIG1vZGlmeWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgdG8gaGFuZGxlIHRoZSBuZXcgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgIElELlxuXG5Ob25lIG9mIHRoZXNlIGNoYW5nZXMgaW50cm9kdWNlIG5ldyBrZXJuZWwgc3RydWN0dXJlcyB0aGF0IGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgaW50cm9kdWNlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCBmaWVsZHMuIFRoZSBvbmx5IG5ldyBrZXJuZWwgYWxsb2NhdGlvbiBpcyBmb3IgYHN0cnVjdCBicGZfa2V5YCB2aWEgYGttYWxsb2Nfb2JqYCwgYW5kIGFsbCBpdHMgZmllbGRzIChga2V5YCBhbmQgYGhhc19yZWZgKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBhZnRlciBhbGxvY2F0aW9uLiBUaGUgc2lnbmF0dXJlIGFuZCBkYXRhIGJ1ZmZlcnMgdXNlZCBkdXJpbmcgdmVyaWZpY2F0aW9uIGFyZSBhbGxvY2F0ZWQgd2l0aCBga3ZtZW1kdXBfYnBmcHRyYCAod2hpY2ggY29waWVzIGZyb20gdXNlciBzcGFjZSkgYW5kIGBrdm1hbGxvYyguLi4sIF9fR0ZQX1pFUk8pYCAod2hpY2ggemVyby1pbml0aWFsaXplcyksIHJlc3BlY3RpdmVseS5cblxuQW55IHBvdGVudGlhbCBidWdzIGludHJvZHVjZWQgYnkgdGhlc2UgY2hhbmdlcywgc3VjaCBhcyBtZW1vcnkgbGVha3MsIG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIG9yIHVzZS1hZnRlci1mcmVlIGlzc3Vlcywgd291bGQgYmUgZWZmZWN0aXZlbHkgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOIGFuZCBvdGhlciBkZWZhdWx0IGJ1ZyBkZXRlY3RvcnMuIFRoZXJlIGlzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcyB0aGF0IHdvdWxkIG5lY2Vzc2l0YXRlIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbi4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTU6MDguMDg4NDMxNjA3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTEyNDMzNTkzNzM2MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVlTXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9sb29rdXBfa2V5cmluZ1wiLFxuICAgIFwiYnBmX2tleXJpbmdfZW5mb3JjZWRcIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZXlyaW5nIChgLmJwZmApIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhbG9uZyB3aXRoIGEga2VybmVsIHBhcmFtZXRlciBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIHRvIG1hbmFnZSBpdHMgc3RhdGUuIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIGFkZGluZyBhIG5ldyBrZXlyaW5nIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLCBhZGRpbmcgYSBsb29rdXAgZnVuY3Rpb24gYGJwZl9sb29rdXBfa2V5cmluZ2Agd2hpY2ggYWxsb2NhdGVzIGEgYHN0cnVjdCBicGZfa2V5YCBhbmQgaW5pdGlhbGl6ZXMgaXRzIGZpZWxkcywgYW5kIG1vZGlmeWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgdG8gaGFuZGxlIHRoZSBuZXcgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgIElELlxcblxcbk5vbmUgb2YgdGhlc2UgY2hhbmdlcyBpbnRyb2R1Y2UgbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBpbnRyb2R1Y2UgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcy4gVGhlIG9ubHkgbmV3IGtlcm5lbCBhbGxvY2F0aW9uIGlzIGZvciBgc3RydWN0IGJwZl9rZXlgIHZpYSBga21hbGxvY19vYmpgLCBhbmQgYWxsIGl0cyBmaWVsZHMgKGBrZXlgIGFuZCBgaGFzX3JlZmApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpb24uIFRoZSBzaWduYXR1cmUgYW5kIGRhdGEgYnVmZmVycyB1c2VkIGR1cmluZyB2ZXJpZmljYXRpb24gYXJlIGFsbG9jYXRlZCB3aXRoIGBrdm1lbWR1cF9icGZwdHJgICh3aGljaCBjb3BpZXMgZnJvbSB1c2VyIHNwYWNlKSBhbmQgYGt2bWFsbG9jKC4uLiwgX19HRlBfWkVSTylgICh3aGljaCB6ZXJvLWluaXRpYWxpemVzKSwgcmVzcGVjdGl2ZWx5LlxcblxcbkFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMsIHN1Y2ggYXMgbWVtb3J5IGxlYWtzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciB1c2UtYWZ0ZXItZnJlZSBpc3N1ZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBgLmJwZmAga2V5cmluZyBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBhbmQgYSBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIGJvb3QgcGFyYW1ldGVyLiBJdCBtb2RpZmllcyB0aGUgQlBGIHByb2dyYW0gbG9hZGluZyBhbmQgdmVyaWZpY2F0aW9uIHBhdGhzIGluIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCB0byBoYW5kbGUgdGhlIG5ldyBrZXlyaW5nIGFuZCBlbmZvcmNlIGl0cyB1c2Ugd2hlbiBjb25maWd1cmVkLiBUaGVzZSBjaGFuZ2VzIGFmZmVjdCB0aGUgYGJwZigpYCBzeXNjYWxsIHBhdGggYW5kIGludHJvZHVjZSBuZXcgcmVhY2hhYmxlIHN0YXRlIGFuZCBsb2dpYyB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE0OjU1OjA4LjA4ODQ0MTE2N1oiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjY2ODc3NjMyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNGIyMzJmODkwY2U2ZjE1YmM3OGI1Njc1MWZiNjljNDA0YjE3OWRiMFxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgVHVlIEF1ZyAyNSAxNDo1NTowNyAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0XFxuaW5kZXggZTQ2NDM2MzRhOWIxYi4uZTcwZmIxNTc1N2Q0MCAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dFxcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0XFxuQEAgLTY2Nyw2ICs2NjcsMjIgQEAgS2VybmVsIHBhcmFtZXRlcnNcXG4gXFxuIFxcdFxcdFxcdFNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Jvb3Rjb25maWcucnN0XFxuIFxcbitcXHRicGYua2V5cmluZ191bnNlYWxlZD1cXG4rXFx0XFx0XFx0W0JQRl0gV2hlbiBzZXQgdG8gMSwgbGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkXFxuK1xcdFxcdFxcdGFmdGVyIGluaXRpYWxpemF0aW9uIHNvIHRoYXQgdXNlcnNwYWNlIGNhbiBwcm92aXNpb25cXG4rXFx0XFx0XFx0a2V5cy4gT25jZSB0aGUga2V5cmluZyBpcyByZXN0cmljdGVkIGl0IGJlY29tZXMgYWN0aXZlXFxuK1xcdFxcdFxcdGFuZCBjYW4gYmUgdXNlZCBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi5cXG4rXFxuK1xcdFxcdFxcdFNldHRpbmcgdGhpcyBhbHNvIG1lYW5zIHRoYXQgdGhlIGJwZiBrZXlyaW5nIGlzIHRoZVxcbitcXHRcXHRcXHRvbmx5IG5vbi1zeXN0ZW0ga2V5cmluZyBhIGxvYWRlciBtYXkgc2VsZWN0IGZvciB0aGVcXG4rXFx0XFx0XFx0cmVzdCBvZiB0aGUgYm9vdDogY2FsbGVyLXN1cHBsaWVkIHVzZXIvc2Vzc2lvblxcbitcXHRcXHRcXHRrZXlyaW5ncyBhcmUgcmVmdXNlZCB3aXRoIC1FUEVSTSwgd2hldGhlciBvciBub3RcXG4rXFx0XFx0XFx0cHJvdmlzaW9uaW5nIGFjdHVhbGx5IGNvbXBsZXRlZC4gVGhlIHN5c3RlbSBrZXlyaW5nc1xcbitcXHRcXHRcXHRzdGF5IHNlbGVjdGFibGUuIExlYXZpbmcgaXQgdW5zZXQga2VlcHMgdGhlIHByaW9yXFxuK1xcdFxcdFxcdGJlaGF2aW91ciwgd2hlcmUgYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyBpcyBhbGxvd2VkLlxcbitcXG4rXFx0XFx0XFx0U2VlIERvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XFxuK1xcbiBcXHRidHR2LmNhcmQ9XFx0W0hXLFY0TF0gYnR0diAoYnQ4NDggKyBidDg3OCBiYXNlZCBncmFiYmVyIGNhcmRzKVxcbiBcXHRidHR2LnJhZGlvPVxcdE1vc3QgaW1wb3J0YW50IGluc21vZCBvcHRpb25zIGFyZSBhdmFpbGFibGUgYXNcXG4gXFx0XFx0XFx0a2VybmVsIGFyZ3MgdG9vLlxcbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdCBiL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XFxuaW5kZXggZTczZWFhZWJkOGIxNS4uNmMwM2ZiNThiMTQ2NCAxMDA2NDRcXG4tLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxcbisrKyBiL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XFxuQEAgLTI1NCwyMSArMjU0LDI1IEBAIHJldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2tcXG4gKGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgKSwgZG9lcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBjYXJyeSBpdHMgZnVsbCBtZWFuaW5nOlxcbiB2YWxpZGx5IHNpZ25lZCAqYW5kKiBmdWxseSB2ZXJpZmllZC5cXG4gXFxuLUEgbW9yZSByZWFsaXN0aWMgYWRtaXNzaW9uIHBvbGljeSB0aGFuIFxcXCJpcyBpdCBzaWduZWQgYXQgYWxsXFxcIjogYWNjZXB0IHByb2dyYW1zXFxuLXNpZ25lZCBieSBhIHN5c3RlbSBrZXlyaW5nLCBhY2NlcHQgYSB1c2VyLWtleXJpbmcgc2lnbmF0dXJlIG9ubHkgaWYgdGhlXFxuLWtleS9rZXlyaW5nIGl0IHdhcyB2ZXJpZmllZCBhZ2FpbnN0IGlzIG9uIGFuIGV4cGxpY2l0IGFsbG93bGlzdCwgYW5kIGVtaXQgYVxcbi10YW1wZXItZXZpZGVudCByZWNvcmQgb2YgZXZlcnkgZGVjaXNpb24gc28gdGhhdCBldmVuIGRlbmllZCBhdHRlbXB0cyBhcmVcXG4tYXVkaXRhYmxlLiAoSWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcXG4rQSBtb3JlIHJlYWxpc3RpYyBhZG1pc3Npb24gcG9saWN5IHRoYW4gXFxcImlzIGl0IHNpZ25lZCBhdCBhbGxcXFwiOiBiYXNlIHRydXN0IGluXFxuK3RoZSBicGYga2V5cmluZywgYWNjZXB0IGEgc3RhZ2luZyBzaWduYXR1cmUgb25seSB3aGlsZSB0aGUga2V5L2tleXJpbmcgdGhlXFxuK3Byb2dyYW0gd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhIHRhbXBlci1cXG4rZXZpZGVudCByZWNvcmQgb2YgZXZlcnkgZGVjaXNpb24gc28gdGhhdCBldmVuIGRlbmllZCBhdHRlbXB0cyBhcmUgYXVkaXRhYmxlLlxcbisoaWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcXG4gXFxuIC4uIGNvZGUtYmxvY2s6OiBjXFxuIFxcbi0gICAgLyogU2VyaWFscyBvZiB1c2VyIGtleXMva2V5cmluZ3Mgd2UgYWRkaXRpb25hbGx5IHRydXN0LiAqL1xcbisgICAgLypcXG4rICAgICAqIFNlcmlhbHMgb2YgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIHdlIGFyZSB3aWxsaW5nIHRvIHN0YWdlLiBFbXB0eVxcbisgICAgICogb24gYSBzeXN0ZW0gdGhhdCBoYXMgY29tbWl0dGVkIHRvIHRoZSBicGYga2V5cmluZywgd2hlcmUgdGhlIGtlcm5lbFxcbisgICAgICogcmVmdXNlcyB0aGVtIGFueXdheS5cXG4rICAgICAqL1xcbiAgICAgc3RydWN0IHtcXG4gICAgICAgICAgICAgX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9IQVNIKTtcXG4gICAgICAgICAgICAgX190eXBlKGtleSwgX19zMzIpOyAgICAgICAgICAgICAvKiBrZXlyaW5nX3NlcmlhbCAqL1xcbiAgICAgICAgICAgICBfX3R5cGUodmFsdWUsIF9fdTgpO1xcbiAgICAgICAgICAgICBfX3VpbnQobWF4X2VudHJpZXMsIDY0KTtcXG4tICAgIH0gdHJ1c3RlZF91c2VyX2tleXMgU0VDKFxcXCIubWFwc1xcXCIpO1xcbisgICAgfSBzdGFnaW5nX2tleXMgU0VDKFxcXCIubWFwc1xcXCIpO1xcbiBcXG4gICAgIC8qIEF1ZGl0IHN0cmVhbSBjb25zdW1lZCBieSBhIHVzZXJzcGFjZSBsb2dnZXIuICovXFxuICAgICBzdHJ1Y3Qge1xcbkBAIC0yOTEsMTEgKzI5NSwxOSBAQCBhdWRpdGFibGUuIChJbGx1c3RyYXRpdmUgLSBlcnJvciBjaGVja2luZyBlbGlkZWQuKVxcbiAgICAgICAgICAgICBpZiAoa2VybmVsKVxcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1c3QgaW4ta2VybmVsIGxvYWRzICovXFxuIFxcbi0gICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKVxcbisgICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKSB7XFxuICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHZhbGlkbHkgc2lnbmVkICovXFxuLSAgICAgICAgICAgIGVsc2UgaWYgKGt0eXBlID09IEJQRl9TSUdfS0VZUklOR19VU0VSIFxcdTAwMjZcXHUwMDI2XFxuLSAgICAgICAgICAgICAgICAgICAgICFicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZ0cnVzdGVkX3VzZXJfa2V5cywgXFx1MDAyNnNlcmlhbCkpXFxuLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBrZXkva2V5cmluZyBub3QgYWxsb3dsaXN0ZWQgKi9cXG4rICAgICAgICAgICAgfSBlbHNlIHN3aXRjaCAoa3R5cGUpIHtcXG4rICAgICAgICAgICAgY2FzZSBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjpcXG4rICAgICAgICAgICAgY2FzZSBCUEZfU0lHX0tFWVJJTkdfQlBGOlxcbisgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbisgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19VU0VSOlxcbisgICAgICAgICAgICAgICAgICAgIGlmICghYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2c3RhZ2luZ19rZXlzLCBcXHUwMDI2c2VyaWFsKSlcXG4rICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTtcXG4rICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4rICAgICAgICAgICAgZGVmYXVsdDpcXG4rICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIGtleXJpbmcgbm90IGluIHBvbGljeSAqL1xcbisgICAgICAgICAgICB9XFxuIFxcbiAgICAgICAgICAgICBkID0gYnBmX3JpbmdidWZfcmVzZXJ2ZShcXHUwMDI2YXVkaXQsIHNpemVvZigqZCksIDApO1xcbiAgICAgICAgICAgICBpZiAoZCkge1xcbkBAIC0zMDksNiArMzIxLDExIEBAIGF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXFxuICAgICAgICAgICAgIHJldHVybiByZXQ7XFxuICAgICB9XFxuIFxcbitTdWNoIGEgcG9saWN5IGlzIHdoYXQgbWFrZXMgYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyB1c2FibGUgYXQgYWxsIG9uIGEgc3lzdGVtXFxuK3RoYXQgZG9lcyBub3QgYm9vdCB3aXRoIGBgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgOiB0aGUgYWxsb3dsaXN0IGJvdW5kcyB3aGljaFxcbitzdGFnZWQga2V5cyBjb3VudCwgYW5kIHRoZSBMU00gaXRzZWxmIGhhcyB0byBwcm90ZWN0IHRoZW0gZnJvbSBiZWluZyB0YW1wZXJlZFxcbit3aXRoLlxcbitcXG4gT2JzZXJ2aW5nIGEgdmVyaWZpZWQgbG9hZDogYGBzZWN1cml0eV9icGZfcHJvZygpYGBcXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cXG4gXFxuQEAgLTM4MSw4ICszOTgsOSBAQCB0aGF0IHZlcmRpY3QgY292ZXJlZCBhbGwgb2YgaXRzIGV4Y2x1c2l2ZSBtYXBzLCByZWplY3RpbmcgYW55IHRoYXQgZGlkIG5vdCAtIHNvXFxuIGEgZGVueS1ieS1kZWZhdWx0IGFkbWlzc2lvbiBwb2xpY3kgbmVlZHMgbm8gc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LiBVc2VcXG4gYGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZVxcbiB0aGV5IGNhcnJ5IGFuIGlkLiBUaGUgYGB2ZXJkaWN0YGAsIGBga2V5cmluZ190eXBlYGAgYW5kIGBga2V5cmluZ19zZXJpYWxgYCBmaWVsZHNcXG4tbGV0IGEgcG9saWN5IGRpc3Rpbmd1aXNoLCBmb3IgZXhhbXBsZSwgXFxcInZlcmlmaWVkIGFuZCBzaWduZWQgYnkgYSBidWlsdGluIGtleVxcXCJcXG4tZnJvbSBcXFwidmVyaWZpZWQgYnkgYSB1c2VyIGtleVxcXCIuIEEgcG9saWN5IExTTSBzdWNoIGFzIElQRSBjb3VsZCBjb25zdW1lIHRoZSBzYW1lXFxuK2xldCBhIHBvbGljeSBkaXN0aW5ndWlzaCBcXFwidmVyaWZpZWQgYWdhaW5zdCB0aGUgb3BlcmF0b3IncyBicGYga2V5cmluZ1xcXCIgZnJvbVxcbitcXFwidmVyaWZpZWQgYWdhaW5zdCBhIGtleXJpbmcgdGhlIGxvYWRlciBzdXBwbGllZCBpdHNlbGZcXFwiLCB3aGljaCBpcyB0aGVcXG4rZGlzdGluY3Rpb24gdGhhdCBtYXR0ZXJzIG1vc3QuIEEgcG9saWN5IExTTSBzdWNoIGFzIElQRSBjb3VsZCBjb25zdW1lIHRoZSBzYW1lXFxuIGhvb2tzIHRvIGVuZm9yY2Ugc3lzdGVtIHBvbGljeSB3aXRob3V0IHdyaXRpbmcgYW55IEJQRiwgdGhvdWdoIG5vbmUgaW1wbGVtZW50c1xcbiB0aGlzIHRvZGF5LlxcbiBcXG5AQCAtMzkwLDMzICs0MDgsMTU0IEBAIEtleXJpbmdzXFxuID09PT09PT09XFxuIFxcbiBgYGtleXJpbmdfaWRgYCBzZWxlY3RzIHRoZSB0cnVzdGVkIGtleXJpbmcgdGhlIFBLQ1MjNyBzaWduYXR1cmUgaXMgdmVyaWZpZWRcXG4tYWdhaW5zdC4gVGhlIHdlbGwta25vd24gaWRzIGBgMGBgIChidWlsdGluKSwgYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGBcXG4tYW5kIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGAgc2VsZWN0IHRoZSBjb3JyZXNwb25kaW5nIHN5c3RlbSBrZXlyaW5ncztcXG4tYW55IG90aGVyIHZhbHVlIGlzIHRyZWF0ZWQgYXMgdGhlIHNlcmlhbCBvZiBhIHVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZy5cXG4tVGhlIGtleXJpbmcgaXMgbG9va2VkIHVwIGZpcnN0LCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBieXRlcyBhcmUgZXhhbWluZWQsIHNvIGFcXG4tc2lnbmF0dXJlIG5hbWluZyBhIG5vbi1leGlzdGVudCBrZXlyaW5nIGlzIHJlamVjdGVkIHVwIGZyb250LCBhbmQgYSBmYWlsZWRcXG4tdmVyaWZpY2F0aW9uIGFib3J0cyB0aGUgbG9hZCAtIHNvIGEgcHJvZ3JhbSB0aGF0IGxvYWRzIHN1Y2Nlc3NmdWxseSB3aXRoIGFcXG4tc2lnbmF0dXJlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC5cXG4rYWdhaW5zdC4gRm91ciB2YWx1ZXMgYXJlIHdlbGwta25vd247IGFueXRoaW5nIGVsc2UgaXMgdGFrZW4gYXMgdGhlIHNlcmlhbCBvZiBhXFxuK2NhbGxlci1zdXBwbGllZCB1c2VyIG9yIHNlc3Npb24ga2V5IG9yIGtleXJpbmc6XFxuK1xcbisuLiBsaXN0LXRhYmxlOjpcXG4rICAgOmhlYWRlci1yb3dzOiAxXFxuK1xcbisgICAqIC0gYGBrZXlyaW5nX2lkYGBcXG4rICAgICAtIEtleXJpbmdcXG4rICAgKiAtIGBgMGBgXFxuKyAgICAgLSBidWlsdGluIHRydXN0ZWQga2V5cmluZ1xcbisgICAqIC0gYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGAgKGBgMWBgKVxcbisgICAgIC0gc2Vjb25kYXJ5IHRydXN0ZWQga2V5cmluZ1xcbisgICAqIC0gYGBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkdgYCAoYGAyYGApXFxuKyAgICAgLSBwbGF0Zm9ybSBrZXlyaW5nXFxuKyAgICogLSBgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCAoYGAzYGApXFxuKyAgICAgLSB0aGUgYnBmIGtleXJpbmdcXG4rICAgKiAtIGFueXRoaW5nIGVsc2VcXG4rICAgICAtIHNlcmlhbCBvZiBhIGNhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmdcXG4rXFxuK1RoZSBrZXlyaW5nIGlzIHJlc29sdmVkIGZpcnN0LCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBieXRlcyBhcmUgZXhhbWluZWQsIHNvIGFcXG4rc2lnbmF0dXJlIG5hbWluZyBhIGtleXJpbmcgdGhhdCBjYW5ub3QgYmUgdXNlZCBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGFcXG4rZmFpbGVkIHZlcmlmaWNhdGlvbiBhYm9ydHMgdGhlIGxvYWQgLSBhIHByb2dyYW0gdGhhdCBsb2FkcyBzdWNjZXNzZnVsbHkgd2l0aFxcbithIHNpZ25hdHVyZSB0aGVyZWZvcmUgYWx3YXlzIGhhcyBjb25zaXN0ZW50IGtleXJpbmcgZmllbGRzIHJlY29yZGVkLlxcbitcXG4rVGhlIGJwZiBrZXlyaW5nXFxuKy0tLS0tLS0tLS0tLS0tLVxcbitcXG4rQSBzeXN0ZW0ga2V5cmluZyBuZWVkcyBhIGtlcm5lbCByZWJ1aWxkIG9yIGEgdm91Y2hlZC1mb3IgZW5yb2xsbWVudCB0byByb3RhdGUgYVxcbitrZXksIGFuZCBncmFudHMgQlBGLXNpZ25pbmcgdHJ1c3QgdG8ga2V5cyB0cnVzdGVkIGZvciBldmVyeXRoaW5nIGVsc2UgaW4gdGhlXFxuK2tlcm5lbCB0b28uIEEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcsIGF0IHRoZSBvdGhlciBleHRyZW1lLCBpcyBmaWxsZWQgYnkgdGhlXFxuK3ZlcnkgcHJvY2VzcyB0aGF0IGxvYWRzIHRoZSBwcm9ncmFtIGFuZCBzbyBjYXJyaWVzIG5vIHRydXN0IG9mIGl0cyBvd24uXFxuK1xcbitUaGUgYnBmIGtleXJpbmcgZmlsbHMgdGhhdCBnYXAgYW5kIGlzIHRoZSB0cnVzdCBhbmNob3Igd2hpY2ggYSBzaWduZWQgQlBGXFxuK2RlcGxveW1lbnQgc2hvdWxkIGJlIGJ1aWx0IG9uIHRvcCBvZjogYSBrZXlyaW5nIG5hbWVkIGBgLmJwZmBgLCBzZWxlY3RlZCB3aXRoXFxuK2BgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgLCB0aGF0IGFuIG9wZXJhdG9yIHByb3Zpc2lvbnMgYXQgYm9vdCB3aXRoIGEga2V5XFxuK3Njb3BlZCB0byBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCBub3RoaW5nIGVsc2UgaW4gdGhlIGtlcm5lbCdzIHRydXN0IGhpZXJhcmNoeS5cXG4rSXQgaXMgb3duZWQgYnkgdGhlIG9wZXJhdG9yIHJhdGhlciB0aGFuIGJ5IHRoZSBsb2FkZXIsIGFuZCByb3RhdGFibGUgYWNyb3NzIGFcXG4rcmVib290IHdpdGhvdXQgdG91Y2hpbmcgdGhlIGtlcm5lbCBpbWFnZS4gSXQgaXMgbW9kZWxsZWQgYWZ0ZXIgdGhlIGRtLXZlcml0eVxcbitrZXlyaW5nIChzZWUgYGBkbV92ZXJpdHkua2V5cmluZ191bnNlYWxlZD1gYCkgYW5kIHByb3Zpc2lvbmVkIHRoZSBzYW1lIHdheTogYW5cXG4raW5pdHJkIHJ1bnMgdGhlIGBga2V5Y3RsYGAgc3RlcHMgYmVsb3cgYmVmb3JlIGhhbmRpbmcgb2ZmIHRvIHRoZSByb290ZnMuXFxuK1xcbitQcm92aXNpb25pbmdcXG4rfn5+fn5+fn5+fn5+XFxuK1xcbitUaGUga2V5cmluZyBpcyBjcmVhdGVkIGR1cmluZyBgYGxhdGVfaW5pdGNhbGxgYCBhbmQgaXMgKipzZWFsZWQgZW1wdHkqKiBieVxcbitkZWZhdWx0OiBpdCBjYXJyaWVzIGEgcmVqZWN0LWFsbCByZXN0cmljdGlvbiwgc28gbm8ga2V5IGNhbiBldmVyIGJlIGFkZGVkIGFuZFxcbitgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCBmYWlscyB3aXRoIGBgLUVOT0tFWWBgIGZvciB0aGUgd2hvbGUgYm9vdC5cXG4rXFxuK2BgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgIGxlYXZlcyBpdCB1bnJlc3RyaWN0ZWQgYXQgaW5pdCBzbyB0aGUgaW5pdHJkIGNhblxcbitwcm92aXNpb24gaXQuIFRoZSBrZXlyaW5nIGlzIG5vdCBsaW5rZWQgaW50byBhbnkgcHJvY2VzcyBrZXlyaW5nLCBzbyBpdCBpc1xcbithZGRyZXNzZWQgYnkgdGhlIHNlcmlhbCBgYC9wcm9jL2tleXNgYCByZXBvcnRzLiBTdGVwcyB3b3VsZCBiZSBhcyBmb2xsb3dzOjpcXG4rXFxuKyAgICBzZXJpYWw9MHgkKGF3ayAnJDggPT0gXFxcImtleXJpbmdcXFwiIFxcdTAwMjZcXHUwMDI2ICQ5ID09IFxcXCIuYnBmOlxcXCIgeyBwcmludCAkMSB9JyAvcHJvYy9rZXlzKVxcbitcXG4rICAgIGtleWN0bCBwYWRkIGFzeW1tZXRyaWMgXFxcIlxcXCIgJHNlcmlhbCBcXHUwMDNjIHNpZ25pbmdfa2V5LmRlclxcbisgICAga2V5Y3RsIHJlc3RyaWN0X2tleXJpbmcgJHNlcmlhbFxcbitcXG4rQm90aCBzdGVwcyBhcmUgcmVxdWlyZWQ6IHRoZSBrZXlyaW5nIGlzIGNvbnN1bHRlZCBvbmx5IG9uY2UgaXQgaXMgKipub24tZW1wdHlcXG4rYW5kIHJlc3RyaWN0ZWQqKi4gQW4gdW5yZXN0cmljdGVkIGtleXJpbmcgaXMgaWdub3JlZCBldmVuIHdoZW4gaXQgaG9sZHMga2V5cyxcXG4rc28gYSBoYWxmLXByb3Zpc2lvbmVkIGtleXJpbmcgaXMgaW5lcnQgcmF0aGVyIHRoYW4gYSB3ZWFrZXIgdHJ1c3QgYW5jaG9yLCBhbmQgYVxcbitsb2FkIG5hbWluZyBpdCBmYWlscyB3aXRoIGBgLUVOT0tFWWBgIGFuZCBhIHZlcmlmaWVyIGxvZy4gUmVzdHJpY3RpbmcgY2Fubm90XFxuK2JlIHVuZG9uZS5cXG4rXFxuK01vcmUgdGhhbiBvbmUga2V5IGlzIGVucm9sbGVkIGJ5IHJlcGVhdGluZyB0aGUgYGBrZXljdGwgcGFkZGBgIHN0ZXA7IHRoZVxcbityZXN0cmljdGlvbiBpcyBhcHBsaWVkIG9uY2UsIGFmdGVyIHRoZSBsYXN0IG9mIHRoZW06OlxcbitcXG4rICAgIGZvciBrZXkgaW4gL2V0Yy9icGYva2V5cy8qLmRlcjsgZG9cXG4rICAgICAgICBrZXljdGwgcGFkZCBhc3ltbWV0cmljIFxcXCJcXFwiICRzZXJpYWwgXFx1MDAzYyAka2V5XFxuKyAgICBkb25lXFxuK1xcbisgICAga2V5Y3RsIHJlc3RyaWN0X2tleXJpbmcgJHNlcmlhbFxcbisgICAga2V5Y3RsIHNob3cgJHNlcmlhbFxcbitcXG4rVGhlIHJlc3RyaWN0aW9uIGJvdW5kcyB3aGF0IGNhbiBiZSBhZGRlZCwgbmV2ZXIgd2hhdCBjYW4gYmUgdGFrZW4gYXdheS4gQSBrZXlcXG4rdGhhdCBpcyBhbHJlYWR5IGVucm9sbGVkIGNhbiBzdGlsbCBiZSB1bmxpbmtlZCwgYW5kIHRoZSBrZXlyaW5nIGNsZWFyZWQgb3JcXG4rcmV2b2tlZCwgYnkgYW55dGhpbmcgcnVubmluZyBhcyByb290LiBUaGF0IGRvZXMgbm90IHdlYWtlbiB0aGUgYW5jaG9yLCBzaW5jZVxcbithIGtleXJpbmcgbGVmdCBlbXB0eSBpcyBubyBsb25nZXIgY29uc3VsdGVkIGFuZCBhIGxvYWQgbmFtaW5nIGl0IGZhaWxzIHdpdGhcXG4rYGAtRU5PS0VZYGAsIGJ1dCBpdCBkb2VzIHRha2Ugc2lnbmVkIGxvYWRpbmcgb3V0IHVudGlsIHRoZSBuZXh0IGJvb3QuIERyb3BwaW5nXFxuK3RoZSB1c2VyIHBlcm1pc3Npb25zIHRoZSBrZXlyaW5nIG5vIGxvbmdlciBuZWVkcyB3b3VsZCBjbG9zZSB0aGF0OyBhcyBhIHRoaXJkXFxuK3N0ZXAgaW4gdGhlIGluaXRyZDo6XFxuK1xcbisgICAga2V5Y3RsIHNldHBlcm0gJHNlcmlhbCAweDA4MDMwMDAwXFxuK1xcbitXaGF0IHJlbWFpbnMgaXMgYGBLRVlfUE9TX1NFQVJDSGBgIGZvciB0aGUgaW4ta2VybmVsIHNlYXJjaCBkdXJpbmcgdmVyaWZpY2F0aW9uLFxcbitwbHVzIGBgS0VZX1VTUl9WSUVXYGAgYW5kIGBgS0VZX1VTUl9SRUFEYGAgc28gdGhlIGtleXJpbmcgc3RheXMgdmlzaWJsZSBpblxcbitgYC9wcm9jL2tleXNgYCBhbmQgYGBrZXljdGwgc2hvd2BgLlxcbitcXG4rUHJvdmlzaW9uaW5nIGhhcyB0byBjb21wbGV0ZSBiZWZvcmUgY29udHJvbCBwYXNzZXMgdG8gdGhlIHJvb3Rmcy4gVGhlIGtleXJpbmdcXG4rdGFrZXMgYW55IG51bWJlciBvZiBrZXlzIGZvciBhcyBsb25nIGFzIGl0IGlzIHVucmVzdHJpY3RlZCwgc28gaXQgaXMgdGhlXFxuK3Jlc3RyaWN0aW9uIHRoYXQgYm91bmRzIHRoZSBlbnJvbGxlZCBzZXQsIG5vdCB0aGUgZmlyc3QgZW5yb2xsbWVudC4gQmVmb3JlXFxuK3RoZSBpbml0cmQgaGFuZHMgb2ZmIGNvbnRyb2wsIGl0IG11c3QgdGhlcmVmb3JlIHJlc3RyaWN0IHRoZSBrZXlyaW5nIGFmdGVyXFxuK3RoZSBsYXN0IGVucm9sbG1lbnQuXFxuK1xcbitFbmZvcmNlbWVudFxcbit+fn5+fn5+fn5+flxcbitcXG4rYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGAgc3RhdGVzIHRoYXQgdGhlIGJwZiBrZXlyaW5nIGlzICp0aGUqIHRydXN0IGFuY2hvciBmb3JcXG4rdGhpcyBib290LCBzbyBpdCBkb2VzIG1vcmUgdGhhbiB1bnNlYWwuIEZyb20gdGhlIGZpcnN0IHByb2dyYW0gbG9hZCBvbndhcmRzIGFcXG4rY2FsbGVyLXN1cHBsaWVkIHVzZXIvc2Vzc2lvbiBrZXlyaW5nIGlzIHJlZnVzZWQgd2l0aCBgYC1FUEVSTWBgIGFuZCBhIHZlcmlmaWVyXFxuK2xvZyBtZXNzYWdlLCB3aGV0aGVyIG9yIG5vdCBwcm92aXNpb25pbmcgZXZlciBjb21wbGV0ZWQuIFRoZSBzeXN0ZW0ga2V5cmluZ3NcXG4rc3RheSBzZWxlY3RhYmxlLlxcbitcXG4rRW5mb3JjZW1lbnQgaXMgcmVhZGFibGUgYXQgYGAvc3lzL21vZHVsZS9icGYvcGFyYW1ldGVycy9rZXlyaW5nX3Vuc2VhbGVkYGAsIGFuZFxcbityZWFkLW9ubHkgdGhlcmU6IHRoZSBmbGFnIGlzIGBgX19yb19hZnRlcl9pbml0YGAgYmVoaW5kIGEgMDQ0NCBwYXJhbWV0ZXIuIEl0IGlzXFxuK2Fsc28gZGVyaXZlZCBmcm9tIHRoZSBib290IGZsYWcgcmF0aGVyIHRoYW4gZnJvbSB0aGUga2V5cmluZydzIHJ1bnRpbWUgc3RhdGUsXFxuK3NvIHRoZXJlIGlzIG5vIHdpbmRvdyBlYXJseSBpbiBib290IGR1cmluZyB3aGljaCBhIGNhbGxlci1zdXBwbGllZCBrZXlyaW5nIGlzXFxuK3N0aWxsIGFjY2VwdGVkLlxcbitcXG4rQ2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIGFyZSBmb3Igc3RhZ2luZ1xcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuK1xcbitBIGBga2V5cmluZ19pZGBgIG5hbWluZyBhIHVzZXIgb3Igc2Vzc2lvbiBrZXkgb3Iga2V5cmluZyBpcyBhICpzdGFnaW5nKlxcbittZWNoYW5pc20sIG5vdCBhIHRydXN0IGFuY2hvcjogaXQgaXMgZmlsbGVkIGJ5IHRoZSBzYW1lIHVzZXJzcGFjZSB0aGF0IGxvYWRzIHRoZVxcbitwcm9ncmFtLCBzbyB2ZXJpZnlpbmcgYWdhaW5zdCBpdCBlc3RhYmxpc2hlcyBvbmx5IHRoYXQgdGhlIGxvYWRlciBzaWduZWQgd2hhdCBpdFxcbitsb2FkZWQuIEl0cyBwdXJwb3NlIGlzIHRvIGxldCBzb2Z0d2FyZSBpbnN0YWxsZWQgb250byBhIHJ1bm5pbmcgc3lzdGVtIC0gd2hvc2VcXG4rc2lnbmluZyBrZXkgaXMgbm90IGVucm9sbGVkIGFueXdoZXJlIHlldCAtIHJ1biBzaWduZWQgdW50aWwgdGhhdCBrZXkgcmVhY2hlcyB0aGVcXG4rYnBmIGtleXJpbmcgb24gdGhlIG5leHQgYm9vdC5cXG4rXFxuK0Egc3lzdGVtIHRoYXQgaGFzIGNvbW1pdHRlZCB0byB0aGUgYnBmIGtleXJpbmcgcmVmdXNlcyB0aGlzIHBhdGggb3V0cmlnaHQgKHNlZVxcbitgRW5mb3JjZW1lbnRgXykuIEEgc3lzdGVtIHRoYXQgaGFzIG5vdCBjYW4gc3RpbGwgYWxsb3cgaXQsIGJ1dCBhIHBvbGljeSBtdXN0XFxuK25ldmVyIHRyZWF0IGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYCBhcyBlcXVpdmFsZW50IHRvIHRoZSBicGYgb3Igc3lzdGVtXFxuK2tleXJpbmdzOyBpdCBzaG91bGQgYWxsb3dsaXN0IHRoZSBzcGVjaWZpYyBzZXJpYWxzIGl0IGlzIHdpbGxpbmcgdG8gc3RhZ2UgYW5kXFxuK3BhaXIgdGhhdCB3aXRoIGEgQlBGIExTTSBwb2xpY3kgcHJvdGVjdGluZyB0aG9zZSBrZXlzIGZyb20gdGFtcGVyaW5nLCBhcyBpblxcbitgRW5mb3JjZW1lbnQgdmlhIExTTXNgXy5cXG4rXFxuK1JlY29yZGVkIGZpZWxkc1xcbistLS0tLS0tLS0tLS0tLS1cXG4gXFxuIFR3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy1cXHUwMDNlYXV4LVxcdTAwM2VzaWdgYCBmb3IgYW4gTFNNIHRvIGluc3BlY3Q6XFxuIFxcbiBgYGtleXJpbmdfdHlwZWBgIChgYGVudW0gYnBmX3NpZ19rZXlyaW5nYGApXFxuICAgICBDbGFzc2lmaWVkIHB1cmVseSBmcm9tIGBga2V5cmluZ19pZGBgIHdoZW5ldmVyIHRoZSBwcm9ncmFtIGlzIHNpZ25lZDpcXG4gICAgIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYCwgYGBfU0VDT05EQVJZYGAsIGBgX1BMQVRGT1JNYGAgZm9yIHRoZSBzeXN0ZW1cXG4tICAgIGtleXJpbmdzLCBvciBgYF9VU0VSYGAgZm9yIGEgdXNlci9zZXNzaW9uIGtleXJpbmcuIEl0IGlzXFxuLSAgICBgYEJQRl9TSUdfS0VZUklOR19OT05FYGAgZm9yIGFuIHVuc2lnbmVkIHByb2dyYW0uXFxuKyAgICBrZXlyaW5ncywgYGBfQlBGYGAgZm9yIHRoZSBicGYga2V5cmluZywgb3IgYGBfVVNFUmBgIGZvciBhIGNhbGxlci1zdXBwbGllZFxcbisgICAgdXNlci9zZXNzaW9uIGtleXJpbmcuIEl0IGlzIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYCBmb3IgYW4gdW5zaWduZWRcXG4rICAgIHByb2dyYW0uXFxuIFxcbiBgYGtleXJpbmdfc2VyaWFsYGAgKGBgczMyYGApXFxuICAgICBTZXQgKipvbmx5Kiogb24gYSBzdWNjZXNzZnVsIHZlcmlmaWNhdGlvbiwgdG8gdGhlIHNlcmlhbCBvZiB0aGVcXG4tICAgICoqdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nKiogdGhhdCBgYGtleXJpbmdfaWRgYCByZXNvbHZlZCB0byAtIHRoZVxcbisgICAgKipjYWxsZXItc3VwcGxpZWQga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlXFxuICAgICBvYmplY3QgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQgYWdhaW5zdCwgbm90IHRoZSBpbmRpdmlkdWFsIGFzeW1tZXRyaWNcXG4gICAgIGtleSBpbnNpZGUgaXQgdGhhdCBtYXRjaGVkIHRoZSBzaWduZXIuIFBhc3NpbmdcXG4gICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcnc1xcbi0gICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFyZSB0cnVzdGVkIGFzIGEgd2hvbGUgYW5kIGV4cG9zZSBubyBzZXJpYWxcXG4tICAgIGhlcmUsIHNvIHRoZSBzZXJpYWwgaXMgYGAwYGAgZm9yIGJ1aWx0aW4sIHNlY29uZGFyeSBhbmQgcGxhdGZvcm1cXG4tICAgIHNpZ25hdHVyZXMsIGFuZCBgYDBgYCBmb3IgdW5zaWduZWQgcHJvZ3JhbXMuIEluIG90aGVyIHdvcmRzLCBhIG5vbi16ZXJvXFxuLSAgICBgYGtleXJpbmdfc2VyaWFsYGAgaXMgZXhhY3RseSBcXFwidmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoXFxuLSAgICB0aGlzIHNlcmlhbFxcXCIuXFxuKyAgICBzZXJpYWwuIFRoZSBzeXN0ZW0ga2V5cmluZ3MgYW5kIHRoZSBicGYga2V5cmluZyBhcmUgdHJ1c3RlZCBhcyBhIHdob2xlIGFuZFxcbisgICAgZXhwb3NlIG5vIHNlcmlhbCBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciB0aGVtLCBhbmQgYGAwYGAgZm9yXFxuKyAgICB1bnNpZ25lZCBwcm9ncmFtcy4gQSBub24temVybyBgYGtleXJpbmdfc2VyaWFsYGAgaXMgdGhlcmVmb3JlIGV4YWN0bHlcXG4rICAgIFxcXCJ2ZXJpZmllZCBhZ2FpbnN0IHRoZSBjYWxsZXItc3VwcGxpZWQga2V5L2tleXJpbmcgd2l0aCB0aGlzIHNlcmlhbFxcXCIsIHdoaWNoXFxuKyAgICBpcyBleGFjdGx5IHRoZSBjYXNlIGEgcG9saWN5IGhhcyB0byBzY3J1dGluaXNlLlxcbiBcXG4gLi4gbGlzdC10YWJsZTo6XFxuICAgIDpoZWFkZXItcm93czogMVxcbkBAIC00MzYsMTYgKzU3NSw0OSBAQCBUd28gZmllbGRzIGFyZSByZWNvcmRlZCBpbiBgYHByb2ctXFx1MDAzZWF1eC1cXHUwMDNlc2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OlxcbiAgICAqIC0gYGBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkdgYFxcbiAgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk1gYFxcbiAgICAgIC0gYGAwYGBcXG4tICAgKiAtIG90aGVyIChhIHVzZXIvc2Vzc2lvbiBrZXkgc2VyaWFsKVxcbisgICAqIC0gYGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYGBcXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JQRmBgXFxuKyAgICAgLSBgYDBgYFxcbisgICAqIC0gb3RoZXIgKGEgY2FsbGVyLXN1cHBsaWVkIGtleSBzZXJpYWwpXFxuICAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19VU0VSYGBcXG4gICAgICAtIHNlcmlhbCBvZiB0aGUgcmVzb2x2ZWQga2V5L2tleXJpbmdcXG4gXFxuLVByb2R1Y2luZyBhIHNpZ25lZCBvYmplY3RcXG4tPT09PT09PT09PT09PT09PT09PT09PT09PT1cXG4rUHJvZHVjaW5nIGFuZCBsb2FkaW5nIGEgc2lnbmVkIG9iamVjdFxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuK1xcbitHZW5lcmF0aW5nIGEgc2lnbmluZyBrZXlcXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuK1xcbitTaWduaW5nIGlzIGFsZ29yaXRobSBhZ25vc3RpYzogdGhlIGFsZ29yaXRobSBjb21lcyBmcm9tIHRoZSBYLjUwOSBjZXJ0aWZpY2F0ZVxcbithbmQgdGhlIFBLQ1MjNyBgYFNpZ25lckluZm9gYC4gQW55dGhpbmcgdGhlIFguNTA5IGFuZCBQS0NTIzcgcGFyc2VycyB1bmRlcnN0YW5kXFxuK3dvcmtzIHdpdGggbm8gQlBGLXNpZGUgY2hhbmdlLiBCb3RoIGV4YW1wbGVzIGJlbG93IHJlYWQgdGhlIGNlcnRpZmljYXRlIHJlcXVlc3RcXG4rY29uZmlnIGZyb20gYGB4NTA5LmdlbmtleWBgLCBmb3Igd2hpY2ggYGBjZXJ0cy94NTA5LmdlbmtleWBgIHNlcnZlcyBhcyBhXFxuK3RlbXBsYXRlIChzZWUgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tb2R1bGUtc2lnbmluZy5yc3QpLiBSU0E6OlxcbitcXG4rICAgIG9wZW5zc2wgcmVxIC1uZXcgLW5vZGVzIC11dGY4IC1zaGEyNTYgLWRheXMgMzY1MDAgLWJhdGNoIC14NTA5IFxcXFxcXG4rICAgICAgICAgICAgLWNvbmZpZyB4NTA5LmdlbmtleSAtb3V0Zm9ybSBQRU0gXFxcXFxcbisgICAgICAgICAgICAtb3V0IHNpZ25pbmdfa2V5LnBlbSAta2V5b3V0IHNpZ25pbmdfa2V5LnBlbVxcbisgICAgb3BlbnNzbCB4NTA5IC1pbiBzaWduaW5nX2tleS5wZW0gLW91dGZvcm0gZGVyIC1vdXQgc2lnbmluZ19rZXkuZGVyXFxuK1xcbitNTC1EU0EtODcgKEZJUFMtMjA0KSwgd2hpY2ggbmVlZHMgb3BlbnNzbCAzLjUgb3IgbGF0ZXIgYW5kIGBgQ09ORklHX0NSWVBUT19NTERTQWBgXFxuK2luIHRoZSBrZXJuZWwuIE5vdGUgdGhlIGFic2VuY2Ugb2YgYSBkaWdlc3Qgb3B0aW9uOiBNTC1EU0EgaGFzaGVzIHRoZSBtZXNzYWdlXFxuK2l0c2VsZiBhbmQgb3BlbnNzbCByZWplY3RzIGFuIGV4cGxpY2l0IGRpZ2VzdCBmb3IgaXQ6OlxcbitcXG4rICAgIG9wZW5zc2wgcmVxIC1uZXcgLW5vZGVzIC11dGY4IC1kYXlzIDM2NTAwIC1iYXRjaCAteDUwOSBcXFxcXFxuKyAgICAgICAgICAgIC1uZXdrZXkgTUwtRFNBLTg3IC1jb25maWcgeDUwOS5nZW5rZXkgLW91dGZvcm0gUEVNIFxcXFxcXG4rICAgICAgICAgICAgLW91dCBzaWduaW5nX2tleS5wZW0gLWtleW91dCBzaWduaW5nX2tleS5wZW1cXG4rICAgIG9wZW5zc2wgeDUwOSAtaW4gc2lnbmluZ19rZXkucGVtIC1vdXRmb3JtIGRlciAtb3V0IHNpZ25pbmdfa2V5LmRlclxcbitcXG4rYGBicGZ0b29sYGAgaGFuZGxlcyB0aGUgZm9sbG93aW5nIGludGVybmFsbHk6IG9wZW5zc2wgYmVmb3JlIDQuMCBjYW5ub3QgY29tYmluZVxcbitNTC1EU0Egd2l0aCBgYENNU19OT0FUVFJgYCwgc28gaXQgZmFsbHMgYmFjayB0byBzaWduZWRBdHRycywgd2hlcmUgb25seSBTSEEtNTEyXFxuK2lzIHBlcm1pdHRlZC4gVGhpcyBtaXJyb3JzIHdoYXQgbW9kdWxlIHNpZ25pbmcgZG9lcyBhcyB3ZWxsLlxcbitcXG4rU2lnbmluZ1xcbistLS0tLS0tXFxuIFxcbiBgYGJwZnRvb2xgYCBnZW5lcmF0ZXMgYW5kIHNpZ25zIGEgbGlnaHQgc2tlbGV0b24gaW4gb25lIHN0ZXA6OlxcbiBcXG4tICAgIGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MIC1TIC1rIFxcdTAwM2Nwcml2YXRlX2tleS5wZW1cXHUwMDNlIC1pIFxcdTAwM2NjZXJ0aWZpY2F0ZS54NTA5XFx1MDAzZSBcXFxcXFxuKyAgICBicGZ0b29sIGdlbiBza2VsZXRvbiAtTCAtUyAtayBzaWduaW5nX2tleS5wZW0gLWkgc2lnbmluZ19rZXkuZGVyIFxcXFxcXG4gICAgICAgICAgICAgb2JqLmJwZi5vIFxcdTAwM2Ugb2JqLmxza2VsLmhcXG4gXFxuIGBgLUxgYCBzZWxlY3RzIHRoZSBsaWdodC1za2VsZXRvbiAoYGBnZW5fbG9hZGVyYGApIGJhY2tlbmQgYW5kIGBgLVNgYCBlbmFibGVzXFxuQEAgLTQ1NCwxMiArNjI2LDM2IEBAIHNpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS5cXG4gcmVjb25zdHJ1Y3RzIC0gYW5kIGFsc28gY29tcHV0ZXMgYGBleGNsX3Byb2dfaGFzaGBgIGFzIHRoZSBkaWdlc3Qgb2YgdGhlIGxvYWRlclxcbiBpbnN0cnVjdGlvbnMgc28gdGhlIG1ldGFkYXRhIG1hcCBjYW4gYmUgYm91bmQgdG8gdGhlIGxvYWRlci4gVGhlIHNpZ25hdHVyZSBhbmRcXG4gaGFzaCBhcmUgZW1iZWRkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXI7IHRoZSBjZXJ0aWZpY2F0ZSBpcyB1c2VkIG9ubHkgZm9yXFxuLXNpZ25pbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gTG9hZGluZyB0aGUgc2tlbGV0b24gcGVyZm9ybXMgdGhlXFxuLWNyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmUuXFxuK3NpZ25pbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC5cXG4rXFxuK0xvYWRpbmdcXG4rLS0tLS0tLVxcbitcXG4rVGhlIGdlbmVyYXRlZCBza2VsZXRvbiBleHBvc2VzIGBga2V5cmluZ19pZGBgLCB3aGljaCBzZWxlY3RzIHRoZSBrZXlyaW5nIHRoZVxcbitrZXJuZWwgdmVyaWZpZXMgYWdhaW5zdC4gU2V0IGl0IGJldHdlZW4gb3BlbiBhbmQgbG9hZDsgbG9hZGluZyB0aGVuIHBlcmZvcm1zXFxuK3RoZSBjcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlOjpcXG4gXFxuLUF0IHJ1bnRpbWUgdGhlIHRydXN0ZWQgcHVibGljIGtleSBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGNob3NlbiBrZXlyaW5nIChmb3JcXG4tZXhhbXBsZSBhZGRlZCB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nLCBvciBidWlsdCBpbnRvIHRoZSBrZXJuZWwncyBidWlsdGluIHRydXN0ZWRcXG4ta2V5cmluZykgZm9yIHZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLlxcbisgICAgc3RydWN0IG9iaiAqc2tlbCA9IG9ial9fb3BlbigpO1xcbitcXG4rICAgIHNrZWwtXFx1MDAzZWtleXJpbmdfaWQgPSAzOyAgICAgICAgICAgLyogVkVSSUZZX1VTRV9CUEZfS0VZUklORyAqL1xcbisgICAgZXJyID0gb2JqX19sb2FkKHNrZWwpO1xcbitcXG4rRm9yIHRoZSBzdGFnaW5nIGNhc2UgdGhlIHNhbWUgb2JqZWN0IGlzIGxvYWRlZCBhZ2FpbnN0IGEga2V5cmluZyB0aGUgY2FsbGVyXFxuK3BvcHVsYXRlZCBpdHNlbGYsIHdoaWNoIG9ubHkgd29ya3Mgb24gYSBzeXN0ZW0gdGhhdCBoYXMgbm90IHNldFxcbitgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFgYDo6XFxuK1xcbisgICAgLypcXG4rICAgICAqIFN0YWdpbmcgb25seTogdGhpcyBrZXlyaW5nIGlzIHVuZGVyIHRoZSBsb2FkZXIncyBvd24gY29udHJvbCBhbmRcXG4rICAgICAqIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi4gU2VlIFxcXCJDYWxsZXItc3VwcGxpZWQga2V5cmluZ3MgYXJlIGZvclxcbisgICAgICogc3RhZ2luZ1xcXCIuXFxuKyAgICAgKi9cXG4rICAgIGtleV9pZCA9IGFkZF9rZXkoXFxcImFzeW1tZXRyaWNcXFwiLCBcXFwiXFxcIiwgZGVyLCBkZXJfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XFxuKyAgICBza2VsLVxcdTAwM2VrZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbisgICAgZXJyID0gb2JqX19sb2FkKHNrZWwpO1xcbitcXG4rRWl0aGVyIHdheSB0aGUgdHJ1c3RlZCBwdWJsaWMga2V5IG11c3QgYWxyZWFkeSBiZSBpbiB0aGUgY2hvc2VuIGtleXJpbmcgZm9yXFxuK3ZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLiBGb3IgdGhlIGJwZiBrZXlyaW5nIHRoYXQgZW5yb2xsbWVudCBoYXBwZW5zIG9uY2UgYXRcXG4rYm9vdCwgc2VlIGBQcm92aXNpb25pbmdgXy5cXG4gXFxuIFVBUEkgcmVmZXJlbmNlXFxuID09PT09PT09PT09PT09XFxuQEAgLTQ4Nyw2ICs2ODMsMTMgQEAgVUFQSSByZWZlcmVuY2VcXG4gICAgIFRoZSBtYXAgY29udGVudCBpcyBub3QgaGFzaGVkIHNlcGFyYXRlbHkgYXQgYWxsIC0gaXQgaXMgY292ZXJlZCwgYXMgYnl0ZXMsXFxuICAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuXFxuIFxcbitLZXJuZWwgY29tbWFuZCBsaW5lOlxcbitcXG4rYGBicGYua2V5cmluZ191bnNlYWxlZD1gYFxcbisgICAgU2V0IHRvIGBgMWBgIHRvIGxlYXZlIHRoZSBicGYga2V5cmluZyB1bnNlYWxlZCBmb3IgcHJvdmlzaW9uaW5nLCBhbmQgdG8gbWFrZVxcbisgICAgaXQgdGhlIG9ubHkgbm9uLXN5c3RlbSBrZXlyaW5nIGEgbG9hZGVyIG1heSBzZWxlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBib290XFxuKyAgICAoc2VlIGBUaGUgYnBmIGtleXJpbmdgXykuXFxuK1xcbiBOb3RlcyBhbmQgbGltaXRhdGlvbnNcXG4gPT09PT09PT09PT09PT09PT09PT09PVxcbiBcXG5AQCAtNDk1LDMgKzY5OCw1IEBAIE5vdGVzIGFuZCBsaW1pdGF0aW9uc1xcbiAgIGV4Y2VlZCBpdC5cXG4gLSBUaGUgbWV0YWRhdGEgY29udGFpbmVyIGlzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkgbWFwLCBhY2Nlc3NlZCB0aHJvdWdoXFxuICAgYGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHJgYC5cXG4rLSBUaGUgYnBmIGtleXJpbmcgbmVlZHMgYGBDT05GSUdfS0VZU2BgOyB3aXRob3V0IGl0IHRoZXJlIGlzIG5vIGJwZiBrZXlyaW5nXFxuKyAgYW5kIGBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgIG5ldmVyIHJlc29sdmVzLlxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS9saW51eC9icGYuaFxcbmluZGV4IGIzY2QyOGQ5ZTNiNTUuLjU3MWY3NzkyYTVjNDEgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaFxcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmhcXG5AQCAtMTczNSw2ICsxNzM1LDcgQEAgZW51bSBicGZfc2lnX2tleXJpbmcge1xcbiBcXHRCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZLFxcbiBcXHRCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk0sXFxuIFxcdEJQRl9TSUdfS0VZUklOR19VU0VSLFxcbitcXHRCUEZfU0lHX0tFWVJJTkdfQlBGLFxcbiB9O1xcbiBcXG4gc3RydWN0IGJwZl9wcm9nX2F1eCB7XFxuQEAgLTM4MTksNiArMzgyMCw4IEBAIHN0cnVjdCBicGZfa2V5IHtcXG4gI2lmIGRlZmluZWQoQ09ORklHX0tFWVMpIFxcdTAwMjZcXHUwMDI2IGRlZmluZWQoQ09ORklHX0JQRl9TWVNDQUxMKVxcbiBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF91c2VyX2tleShzMzIgc2VyaWFsLCB1NjQgZmxhZ3MpO1xcbiBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZCk7XFxuK3N0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZCk7XFxuK2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZCk7XFxuIHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpO1xcbiBpbnQgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmUoY29uc3Qgc3RydWN0IGJwZl9keW5wdHIgKmRhdGFfcCxcXG4gXFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcXG5AQCAtMzgzOSw2ICszODQyLDE2IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfc3lzdGVtX2tleSh1NjQgaWQpXFxuIFxcdHJldHVybiBOVUxMO1xcbiB9XFxuIFxcbitzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcXG4re1xcbitcXHRyZXR1cm4gTlVMTDtcXG4rfVxcbitcXG4rc3RhdGljIGlubGluZSBib29sIGJwZl9rZXlyaW5nX2VuZm9yY2VkKHZvaWQpXFxuK3tcXG4rXFx0cmV0dXJuIGZhbHNlO1xcbit9XFxuK1xcbiBzdGF0aWMgaW5saW5lIHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpXFxuIHtcXG4gfVxcbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZlcmlmaWNhdGlvbi5oIGIvaW5jbHVkZS9saW51eC92ZXJpZmljYXRpb24uaFxcbmluZGV4IGRlYzdmMmJlYWJmZDQuLjFjYjU5ZGRkYTI1MDkgMTAwNjQ0XFxuLS0tIGEvaW5jbHVkZS9saW51eC92ZXJpZmljYXRpb24uaFxcbisrKyBiL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmhcXG5AQCAtMTgsNiArMTgsMTYgQEBcXG4gI2RlZmluZSBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HICgoc3RydWN0IGtleSAqKTFVTClcXG4gI2RlZmluZSBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkcgICgoc3RydWN0IGtleSAqKTJVTClcXG4gXFxuKy8qXFxuKyAqIFRoZSBpZCBvZiBCUEYncyBcXFwiLmJwZlxcXCIga2V5cmluZywgcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzcGFjZS4gSXQgaXNcXG4rICogZXhwbGljaXRseSBub3QgYSBzZW50aW5lbCBsaWtlIHRoZSB0d28gYWJvdmUgYXMgQlBGIHJlc29sdmVzIGl0IHRvXFxuKyAqIHRoZSBrZXlyaW5nIGl0c2VsZiBhbmQgcGFzc2VzIHRoYXQsIHNvIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSBuZXZlclxcbisgKiBzZWVzIHRoaXMgdmFsdWUsIGFuZCBzeXN0ZW1fa2V5cmluZ19pZF9jaGVjaygpIG11c3Qga2VlcCByZWplY3RpbmcgaXQuXFxuKyAqIExlZnQgYXMgYSBwbGFpbiBpbnRlZ2VyIHNvIHRoYXQgaGFuZGluZyBpdCBvdmVyIGFzIEB0cnVzdGVkX2tleXMgZG9lc1xcbisgKiBub3QgY29tcGlsZS5cXG4rICovXFxuKyNkZWZpbmUgVkVSSUZZX1VTRV9CUEZfS0VZUklOR1xcdDNcXG4rXFxuIHN0YXRpYyBpbmxpbmUgaW50IHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKHU2NCBpZClcXG4ge1xcbiBcXHRpZiAoaWQgXFx1MDAzZSAodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkcpXFxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvTWFrZWZpbGUgYi9rZXJuZWwvYnBmL01ha2VmaWxlXFxuaW5kZXggOTAyNTVkODBlNWJlNi4uOWE5MmMzNDhiYmRhNiAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL01ha2VmaWxlXFxuKysrIGIva2VybmVsL2JwZi9NYWtlZmlsZVxcbkBAIC0yNyw2ICsyNyw5IEBAIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gb2ZmbG9hZC5vXFxuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gbmV0X25hbWVzcGFjZS5vXFxuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gdGN4Lm9cXG4gZW5kaWZcXG4raWZlcSAoJChDT05GSUdfS0VZUykseSlcXG4rb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBrZXlzLm9cXG4rZW5kaWZcXG4gaWZlcSAoJChDT05GSUdfUEVSRl9FVkVOVFMpLHkpXFxuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gc3RhY2ttYXAub1xcbiBlbmRpZlxcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2tleXMuYyBiL2tlcm5lbC9icGYva2V5cy5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42MGNiODUyOTVjODlhXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL2tlcm5lbC9icGYva2V5cy5jXFxuQEAgLTAsMCArMSw3MiBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cXG4rXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2NyZWQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2Vyci5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgva2V5LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW51eC9tb2R1bGVwYXJhbS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbitcXG4rI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVhcXG4rI2RlZmluZSBNT0RVTEVfUEFSQU1fUFJFRklYIFxcXCJicGYuXFxcIlxcbitcXG4rc3RhdGljIHN0cnVjdCBrZXkgKmJwZl9rZXlyaW5nO1xcbitcXG4rc3RhdGljIGJvb2wgYnBmX2tleXJpbmdfdW5zZWFsZWQgX19yb19hZnRlcl9pbml0O1xcbittb2R1bGVfcGFyYW1fbmFtZWQoa2V5cmluZ191bnNlYWxlZCwgYnBmX2tleXJpbmdfdW5zZWFsZWQsIGJvb2wsIDA0NDQpO1xcbitNT0RVTEVfUEFSTV9ERVNDKGtleXJpbmdfdW5zZWFsZWQsIFxcXCJMZWF2ZSB0aGUgYnBmIGtleXJpbmcgdW5zZWFsZWRcXFwiKTtcXG4rXFxuK2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZClcXG4re1xcbitcXHRyZXR1cm4gYnBmX2tleXJpbmdfdW5zZWFsZWQ7XFxuK31cXG4rXFxuK3N0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcXG4re1xcbitcXHRzdHJ1Y3QgYnBmX2tleSAqYmtleTtcXG4rXFxuK1xcdGlmICghYnBmX2tleXJpbmcpXFxuK1xcdFxcdHJldHVybiBOVUxMO1xcbitcXHRpZiAoIVJFQURfT05DRShicGZfa2V5cmluZy1cXHUwMDNla2V5cy5ucl9sZWF2ZXNfb25fdHJlZSkgfHxcXG4rXFx0ICAgICFSRUFEX09OQ0UoYnBmX2tleXJpbmctXFx1MDAzZXJlc3RyaWN0X2xpbmspKVxcbitcXHRcXHRyZXR1cm4gTlVMTDtcXG4rXFxuK1xcdGJrZXkgPSBrbWFsbG9jX29iaigqYmtleSk7XFxuK1xcdGlmICghYmtleSlcXG4rXFx0XFx0cmV0dXJuIE5VTEw7XFxuK1xcbitcXHRia2V5LVxcdTAwM2VrZXkgPSBicGZfa2V5cmluZztcXG4rXFx0YmtleS1cXHUwMDNlaGFzX3JlZiA9IGZhbHNlO1xcbitcXHRyZXR1cm4gYmtleTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBfX2luaXQgYnBmX2tleXJpbmdfaW5pdCh2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBrZXkgKmtleXJpbmc7XFxuK1xcbitcXHRrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhcXFwiLmJwZlxcXCIsXFxuK1xcdFxcdFxcdFxcdEdMT0JBTF9ST09UX1VJRCwgR0xPQkFMX1JPT1RfR0lELFxcbitcXHRcXHRcXHRcXHRjdXJyZW50X2NyZWQoKSwgS0VZX1BPU19TRUFSQ0ggfFxcbitcXHRcXHRcXHRcXHRLRVlfVVNSX1ZJRVcgfCBLRVlfVVNSX1JFQUQgfFxcbitcXHRcXHRcXHRcXHRLRVlfVVNSX1dSSVRFIHwgS0VZX1VTUl9TRUFSQ0ggfFxcbitcXHRcXHRcXHRcXHRLRVlfVVNSX1NFVEFUVFIsIEtFWV9BTExPQ19OT1RfSU5fUVVPVEEsXFxuK1xcdFxcdFxcdFxcdE5VTEwsIE5VTEwpO1xcbitcXHRpZiAoSVNfRVJSKGtleXJpbmcpKSB7XFxuK1xcdFxcdHByX2VycihcXFwiYnBmOiBjYW5ub3QgYWxsb2NhdGUgYnBmIGtleXJpbmc6ICVsZFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIFBUUl9FUlIoa2V5cmluZykpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXHRpZiAoIWJwZl9rZXlyaW5nX3Vuc2VhbGVkIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICBrZXlyaW5nX3Jlc3RyaWN0KG1ha2Vfa2V5X3JlZihrZXlyaW5nLCB0cnVlKSwgTlVMTCwgTlVMTCkpIHtcXG4rXFx0XFx0cHJfZXJyKFxcXCJicGY6IGNhbm5vdCBzZWFsIGJwZiBrZXlyaW5nXFxcXG5cXFwiKTtcXG4rXFx0XFx0a2V5X3Jldm9rZShrZXlyaW5nKTtcXG4rXFx0XFx0a2V5X3B1dChrZXlyaW5nKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdGJwZl9rZXlyaW5nID0ga2V5cmluZztcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rbGF0ZV9pbml0Y2FsbChicGZfa2V5cmluZ19pbml0KTtcXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi92ZXJpZmllci5jIGIva2VybmVsL2JwZi92ZXJpZmllci5jXFxuaW5kZXggZTAzNmFlMjBiZjZiOS4uNTU4ZTUxOGFkMzEwOSAxMDA2NDRcXG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcXG4rKysgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcXG5AQCAtMjA5NzIsNiArMjA5NzIsMTQgQEAgaW50IGJwZl9maXh1cF9rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcXG4gXFx0cmV0dXJuIDA7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIFVwcGVyIGJvdW5kIG9uIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGJsb2IgcGFzc2VkIHdpdGggYSBwcm9ncmFtLiBDb21mb3J0YWJseVxcbisgKiBhYm92ZSB0aGUgbGFyZ2VzdCBzaWduYXR1cmUgdGhlIGtlcm5lbCBjYW4gdmVyaWZ5LCBhbmQgZmFyIGJlbG93IGFueXRoaW5nXFxuKyAqIHRoYXQgd291bGQgbWFrZSByZWplY3RpbmcgYSBsb2FkIGV4cGVuc2l2ZS4gRGVsaWJlcmF0ZWx5IGEgZml4ZWQgbnVtYmVyIHNvXFxuKyAqIHRoYXQgd2hhdCB0aGUgc3lzY2FsbCBhY2NlcHRzIGRvZXMgbm90IGRlcGVuZCBvbiBQQUdFX1NJWkUuXFxuKyAqL1xcbisjZGVmaW5lIEJQRl9QUk9HX01BWF9TSUdOQVRVUkVfU0laRVxcdCg2NCAqIDEwMjQpXFxuK1xcbiBzdGF0aWMgZW51bSBicGZfc2lnX2tleXJpbmcgYnBmX2NsYXNzaWZ5X2tleXJpbmcoczMyIGtleXJpbmdfaWQpXFxuIHtcXG4gXFx0c3dpdGNoIChrZXlyaW5nX2lkKSB7XFxuQEAgLTIwOTgxLDYgKzIwOTg5LDggQEAgc3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxcbiBcXHRcXHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWTtcXG4gXFx0Y2FzZSAoczMyKSh1bnNpZ25lZCBsb25nKVZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklORzpcXG4gXFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19QTEFURk9STTtcXG4rXFx0Y2FzZSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HOlxcbitcXHRcXHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX0JQRjtcXG4gXFx0ZGVmYXVsdDpcXG4gXFx0XFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19VU0VSO1xcbiBcXHR9XFxuQEAgLTIxMDA5LDIxICsyMTAxOSwzMiBAQCBzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4gXFx0dTY0IGRhdGFfc3o7XFxuIFxcdGludCBlcnIgPSAwO1xcbiBcXG4tXFx0LypcXG4tXFx0ICogRG9uJ3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxcbi1cXHQgKiBQcmFjdGljYWwgc2lnbmF0dXJlIGZvciBCUEYgcHJvZ3JhbSBzaG91bGQgYmUgYmVsb3cgdGhpcyBsaW1pdC5cXG4tXFx0ICovXFxuIFxcdGlmICghYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUgfHxcXG4tXFx0ICAgIGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplIFxcdTAwM2UgS01BTExPQ19NQVhfQ0FDSEVfU0laRSlcXG4rXFx0ICAgIGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplIFxcdTAwM2UgQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFKVxcbiBcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4tXFx0aWYgKHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpID09IDApXFxuK1xcbitcXHRpZiAoIXN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXFx1MDAzZWtleXJpbmdfaWQpKSB7XFxuIFxcdFxcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVxcdTAwM2VrZXlyaW5nX2lkKTtcXG4tXFx0ZWxzZVxcbi1cXHRcXHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQsIDApO1xcbitcXHR9IGVsc2Uge1xcbitcXHRcXHRpZiAoYXR0ci1cXHUwMDNla2V5cmluZ19pZCAhPSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XFxuK1xcdFxcdFxcdGlmIChicGZfa2V5cmluZ19lbmZvcmNlZCgpKSB7XFxuK1xcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCwgdXNlIGJwZiBrZXlyaW5nXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0XFx0cmV0dXJuIC1FUEVSTTtcXG4rXFx0XFx0XFx0fVxcbitcXHRcXHRcXHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQsIDApO1xcbitcXHRcXHR9IGVsc2Uge1xcbitcXHRcXHRcXHRrZXkgPSBicGZfbG9va3VwX2tleXJpbmcoKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuIFxcdGlmICgha2V5KSB7XFxuLVxcdFxcdHZlcmJvc2UoZW52LCBcXFwiY2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcXFxuXFxcIixcXG4tXFx0XFx0XFx0YXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuLVxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHRpZiAoYXR0ci1cXHUwMDNla2V5cmluZ19pZCA9PSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XFxuK1xcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwidGhlIGJwZiBrZXlyaW5nIGlzIGVtcHR5IG9yIGhhcyBub3QgYmVlbiByZXN0cmljdGVkXFxcXG5cXFwiKTtcXG4rXFx0XFx0XFx0cmV0dXJuIC1FTk9LRVk7XFxuK1xcdFxcdH0gZWxzZSB7XFxuK1xcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiY2Fubm90IHJlc29sdmUgc2lnbmluZyBrZXlyaW5nIHdpdGgga2V5cmluZ19pZCAlZFxcXFxuXFxcIixcXG4rXFx0XFx0XFx0XFx0YXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuK1xcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRcXHR9XFxuIFxcdH1cXG4gXFxuIFxcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSk7XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaCBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxcbmluZGV4IDc4YjZlMGViYjg1ZDguLjkzMTVhMWRiMWY3YzIgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXFxuQEAgLTU3LDcgKzU3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkICp1NjRfdG9fcHRyKF9fdTY0IHB0cilcXG4gXFx0fSlcXG4gXFxuICNkZWZpbmUgRVJSX01BWF9MRU5cXHQxMDI0XFxuLSNkZWZpbmUgTUFYX1NJR19TSVpFXFx0NDA5NlxcbisjZGVmaW5lIE1BWF9TSUdfU0laRVxcdDE2Mzg0XFxuIFxcbiAjZGVmaW5lIEJQRl9UQUdfRk1UXFx0XFxcIiUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeCUwMmhoeFxcXCJcXG4gXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xcbmluZGV4IDg4NzI2YTZkYjZkMGUuLjFiNTUwMmY0OGFkZDAgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jXFxuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jXFxuQEAgLTEzMCw2ICsxMzAsOSBAQCBfX3UzMiByZWdpc3Rlcl9zZXNzaW9uX2tleShjb25zdCBjaGFyICprZXlfZGVyX3BhdGgpXFxuIFxcbiBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcXG4ge1xcbitcXHR1bnNpZ25lZCBpbnQgc2lnbmVyX2ZsYWdzID0gQ01TX05PQ0VSVFMgfCBDTVNfQklOQVJZIHwgQ01TX05PU01JTUVDQVAgfFxcbitcXHRcXHRcXHRcXHQgICAgQ01TX1VTRV9LRVlJRCB8IENNU19OT0FUVFI7XFxuK1xcdGNvbnN0IEVWUF9NRCAqY21zX2RpZ2VzdCA9IEVWUF9zaGEyNTYoKTtcXG4gXFx0QklPICpiZF9pbiA9IE5VTEwsICpiZF9vdXQgPSBOVUxMO1xcbiBcXHRFVlBfUEtFWSAqcHJpdmF0ZV9rZXkgPSBOVUxMO1xcbiBcXHRDTVNfQ29udGVudEluZm8gKmNtcyA9IE5VTEw7XFxuQEAgLTE2Nyw2ICsxNzAsMjEgQEAgaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXFxuIFxcdFxcdGdvdG8gY2xlYW51cDtcXG4gXFx0fVxcbiBcXG4rI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgXFx1MDAzZT0gMHgzMDAwMDAwMEwgXFx1MDAyNlxcdTAwMjYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiBcXHUwMDNjIDB4NDAwMDAwMDBMXFxuK1xcdGlmIChFVlBfUEtFWV9pc19hKHByaXZhdGVfa2V5LCBcXFwiTUwtRFNBLTQ0XFxcIikgfHxcXG4rXFx0ICAgIEVWUF9QS0VZX2lzX2EocHJpdmF0ZV9rZXksIFxcXCJNTC1EU0EtNjVcXFwiKSB8fFxcbitcXHQgICAgRVZQX1BLRVlfaXNfYShwcml2YXRlX2tleSwgXFxcIk1MLURTQS04N1xcXCIpKSB7XFxuK1xcdFxcdC8qXFxuK1xcdFxcdCAqIE1MLURTQSArIENNU19OT0FUVFIgaXMgbm90IHN1cHBvcnRlZCBiZWZvcmUgb3BlbnNzbC00LjAsIHNvXFxuK1xcdFxcdCAqIGZhbGwgYmFjayB0byBzaWduZWRBdHRycy4gTUwtRFNBIGRvZXMgaXRzIG93biBoYXNoaW5nIGFuZFxcbitcXHRcXHQgKiBpZ25vcmVzIHRoZSBDTVMgZGlnZXN0LCBleGNlcHQgd2hlbiBzaWduZWRBdHRycyBhcmUgdXNlZCxcXG4rXFx0XFx0ICogd2hlcmUgb25seSBTSEEtNTEyIGlzIHBlcm1pdHRlZC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdHNpZ25lcl9mbGFncyBcXHUwMDI2PSB+Q01TX05PQVRUUjtcXG4rXFx0XFx0Y21zX2RpZ2VzdCA9IEVWUF9zaGE1MTIoKTtcXG4rXFx0fVxcbisjZW5kaWZcXG4rXFxuIFxcdGNtcyA9IENNU19zaWduKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsXFxuIFxcdFxcdCAgICAgICBDTVNfTk9DRVJUUyB8IENNU19QQVJUSUFMIHwgQ01TX0JJTkFSWSB8IENNU19ERVRBQ0hFRCB8XFxuIFxcdFxcdFxcdCAgICAgICBDTVNfU1RSRUFNKTtcXG5AQCAtMTc1LDkgKzE5Myw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxcbiBcXHRcXHRnb3RvIGNsZWFudXA7XFxuIFxcdH1cXG4gXFxuLVxcdGlmICghQ01TX2FkZDFfc2lnbmVyKGNtcywgeDUwOSwgcHJpdmF0ZV9rZXksIEVWUF9zaGEyNTYoKSxcXG4tXFx0XFx0XFx0ICAgICBDTVNfTk9DRVJUUyB8IENNU19CSU5BUlkgfCBDTVNfTk9TTUlNRUNBUCB8XFxuLVxcdFxcdFxcdCAgICAgQ01TX1VTRV9LRVlJRCB8IENNU19OT0FUVFIpKSB7XFxuK1xcdGlmICghQ01TX2FkZDFfc2lnbmVyKGNtcywgeDUwOSwgcHJpdmF0ZV9rZXksIGNtc19kaWdlc3QsIHNpZ25lcl9mbGFncykpIHtcXG4gXFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4gXFx0XFx0Z290byBjbGVhbnVwO1xcbiBcXHR9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZVxcbmluZGV4IDVmMWEzYmZjMDU2OWYuLjA1YjNlZTY0MjkwZmEgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXFxuQEAgLTY2Myw3ICs2NjMsNyBAQCAkKFRSVU5ORVJfQlBGX0xTS0VMUyk6ICUubHNrZWwuaDogJS5icGYubyAkKEJQRlRPT0wpIHwgJChUUlVOTkVSX09VVFBVVClcXG4gXFx0fSkgXFx1MDAyNlxcdTAwMjYgXFxcXFxcbiBcXHRybSAtZiAkJChcXHUwMDNjOi5vPS5sbGlua2VkMS5vKSAkJChcXHUwMDNjOi5vPS5sbGlua2VkMi5vKSAkJChcXHUwMDNjOi5vPS5sbGlua2VkMy5vKVxcbiBcXG4tJChUUlVOTkVSX0JQRl9MU0tFTFNfU0lHTkVEKTogJS5sc2tlbC5oOiAlLmJwZi5vICQoQlBGVE9PTCkgfCAkKFRSVU5ORVJfT1VUUFVUKVxcbiskKFRSVU5ORVJfQlBGX0xTS0VMU19TSUdORUQpOiAlLmxza2VsLmg6ICUuYnBmLm8gJChCUEZUT09MKSAkKFZFUklGSUNBVElPTl9DRVJUKSB8ICQoVFJVTk5FUl9PVVRQVVQpXFxuIFxcdCQoUSkkKGlmICQoUEVSTUlTU0lWRSksaWYgWyAhIC1mICQkXFx1MDAzYyBdOyB0aGVuXFx0XFx0XFx0XFxcXFxcbiBcXHRcXHQkJChSTSkgJCRAO1xcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4gXFx0XFx0cHJpbnRmICcgICUtMTJzICVzXFxcXG4nICdTS0lQLVNLRUwnICckJChub3RkaXIgJCRAKScgMVxcdTAwM2VcXHUwMDI2MjsgXFxcXFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjJlYzE1MTE3YWJiNTAgMTAwNjQ0XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcXG5AQCAtNTEsNiArNTEsOCBAQCBDT05GSUdfSVBWNl9TRUc2X0xXVFVOTkVMPXlcXG4gQ09ORklHX0lQVjZfU0lUPXlcXG4gQ09ORklHX0lQVjZfVFVOTkVMPXlcXG4gQ09ORklHX0tFWVM9eVxcbitDT05GSUdfQ1JZUFRPX01MRFNBPXlcXG4rQ09ORklHX0NSWVBUT19TSEE1MTI9eVxcbiBDT05GSUdfTElSQz15XFxuIENPTkZJR19MSVZFUEFUQ0g9eVxcbiBDT05GSUdfTFdUVU5ORUw9eVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcXG5pbmRleCA3NzM4MWQzNDU0MzVjLi42MjBhNmQyMmE3NTljIDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xcbkBAIC0zMiwxMSArMzIsMjAgQEAgZW51bSB7XFxuIFxcdEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlksXFxuIFxcdEJQRl9TSUdfS0VZUklOR19QTEFURk9STSxcXG4gXFx0QlBGX1NJR19LRVlSSU5HX1VTRVIsXFxuK1xcdEJQRl9TSUdfS0VZUklOR19CUEYsXFxuIH07XFxuIFxcbi1zdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcXG4tXFx0XFx0ICAgICAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkLFxcbi1cXHRcXHQgICAgICAgX191MzIgZmRfYXJyYXlfY250KVxcbisjZGVmaW5lIEJQRl9LRVlSSU5HX0JQRlxcdFxcdDNcXG4rXFxuKy8qIHZlcmlmeV9zaWdfc2V0dXAuc2ggZXhpdHMgd2l0aCB0aGlzIHdoZW4gb3BlbnNzbCBjYW5ub3QgZG8gTUwtRFNBLiAqL1xcbisjZGVmaW5lIFNFVFVQX1NLSVBcXHRcXHQoLTc3KVxcbitcXG4rLyogRklQUy0yMDQgTUwtRFNBLTg3IHNpZ25hdHVyZSBzaXplLCBzZWUgaW5jbHVkZS9jcnlwdG8vbWxkc2EuaC4gKi9cXG4rI2RlZmluZSBNTERTQTg3X1NJR05BVFVSRV9TSVpFXFx0NDYyN1xcbitcXG4rc3RhdGljIGludCBsb2FkX2xvYWRlcl9sb2coY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxcbitcXHRcXHRcXHQgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCxcXG4rXFx0XFx0XFx0ICAgX191MzIgZmRfYXJyYXlfY250LCBjaGFyICpsb2dfYnVmLCBfX3UzMiBsb2dfc3opXFxuIHtcXG4gXFx0dW5pb24gYnBmX2F0dHIgYXR0cjtcXG4gXFx0aW50IGZkO1xcbkBAIC00OCwxOCArNTcsMzEgQEAgc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsXFxuIFxcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXFxcIkR1YWwgQlNEL0dQTFxcXCIpO1xcbiBcXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XFxuIFxcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KFxcdTAwMjZtYXBfZmQpO1xcbitcXHRhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDtcXG4gXFx0aWYgKHNpZykge1xcbiBcXHRcXHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoc2lnKTtcXG4gXFx0XFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpZ19zejtcXG4gXFx0XFx0YXR0ci5rZXlyaW5nX2lkID0ga2V5cmluZ19pZDtcXG4gXFx0fVxcbi1cXHRhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDtcXG4rXFx0aWYgKGxvZ19idWYpIHtcXG4rXFx0XFx0YXR0ci5sb2dfbGV2ZWwgPSAxO1xcbitcXHRcXHRhdHRyLmxvZ19idWYgPSBwdHJfdG9fdTY0KGxvZ19idWYpO1xcbitcXHRcXHRhdHRyLmxvZ19zaXplID0gbG9nX3N6O1xcbitcXHR9XFxuIFxcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXFxcIl9fbG9hZGVyLnByb2dcXFwiLCBzaXplb2YoXFxcIl9fbG9hZGVyLnByb2dcXFwiKSk7XFxuIFxcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXFx1MDAyNmF0dHIsXFxuIFxcdFxcdCAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcXG4gXFx0cmV0dXJuIGZkIFxcdTAwM2MgMCA/IC1lcnJubyA6IGZkO1xcbiB9XFxuIFxcbitzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcXG4rXFx0XFx0ICAgICAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkLFxcbitcXHRcXHQgICAgICAgX191MzIgZmRfYXJyYXlfY250KVxcbit7XFxuK1xcdHJldHVybiBsb2FkX2xvYWRlcl9sb2coaW5zbnMsIGluc25zX3N6LCBtYXBfZmQsIHNpZywgc2lnX3N6LCBrZXlyaW5nX2lkLFxcbitcXHRcXHRcXHQgICAgICAgZmRfYXJyYXlfY250LCBOVUxMLCAwKTtcXG4rfVxcbitcXG4gc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXFxuIFxcdFxcdFxcdCAgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgZGF0YV9zeixcXG4gXFx0XFx0XFx0ICBjb25zdCB2b2lkICpleGNsLCBfX3UzMiBleGNsX3N6LFxcbkBAIC0xNTYsMTIgKzE3OCwzMCBAQCBzdGF0aWMgaW50IHJ1bl9zZXR1cChjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmRpcilcXG4gXFx0fVxcbiBcXHRpZiAod2FpdHBpZChwaWQsIFxcdTAwMjZzdGF0dXMsIDApIFxcdTAwM2MgMClcXG4gXFx0XFx0cmV0dXJuIC1lcnJubztcXG4tXFx0cmV0dXJuIChXSUZFWElURUQoc3RhdHVzKSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHRXRVhJVFNUQVRVUyhzdGF0dXMpID09IDApID8gMCA6IC1FSU5WQUw7XFxuK1xcdGlmICghV0lGRVhJVEVEKHN0YXR1cykpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXHRyZXR1cm4gLVdFWElUU1RBVFVTKHN0YXR1cyk7XFxuIH1cXG4gXFxuLXN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcXG4tXFx0XFx0ICAgIHZvaWQgKnNpZywgX191MzIgKnNpZ19zeilcXG4rc3RhdGljIHZvaWQgZ2Vua2V5X2Rpcl9maW5pKGNvbnN0IGNoYXIgKmRpcilcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSB7XFxuK1xcdFxcdFxcXCJzaWduaW5nX2tleS5kZXJcXFwiLCBcXFwic2lnbmluZ19rZXkucGVtXFxcIiwgXFxcIng1MDkuZ2Vua2V5XFxcIixcXG4rXFx0fTtcXG4rXFx0Y2hhciBwYXRoW1BBVEhfTUFYXTtcXG4rXFx0c2l6ZV90IGk7XFxuK1xcbitcXHRpZiAoIWRpcilcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgQVJSQVlfU0laRShmaWxlcyk7IGkrKykge1xcbitcXHRcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFxcXCIlcy8lc1xcXCIsIGRpciwgZmlsZXNbaV0pO1xcbitcXHRcXHR1bmxpbmsocGF0aCk7XFxuK1xcdH1cXG4rXFx0cm1kaXIoZGlyKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCBzaWduX2J1Zl9kaWdlc3QoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcXG4rXFx0XFx0XFx0ICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6LCBjb25zdCBjaGFyICpkaWdlc3QpXFxuIHtcXG4gXFx0Y2hhciBkYXRhX3RtcGxbUEFUSF9NQVhdLCBrZXlbUEFUSF9NQVhdO1xcbiBcXHRjaGFyIHNpZ3BhdGhbUEFUSF9NQVggKyBzaXplb2YoXFxcIi5wN3NcXFwiKV07XFxuQEAgLTE3Niw2ICsyMTYsNyBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXFxuIFxcdGZkID0gbWtzdGVtcChkYXRhX3RtcGwpO1xcbiBcXHRpZiAoZmQgXFx1MDAzYyAwKVxcbiBcXHRcXHRyZXR1cm4gLWVycm5vO1xcbitcXHRzbnByaW50ZihzaWdwYXRoLCBzaXplb2Yoc2lncGF0aCksIFxcXCIlcy5wN3NcXFwiLCBkYXRhX3RtcGwpO1xcbiBcXHRpZiAod3JpdGUoZmQsIGJ1ZiwgbGVuKSAhPSAoc3NpemVfdClsZW4pIHtcXG4gXFx0XFx0Y2xvc2UoZmQpO1xcbiBcXHRcXHRyZXQgPSAtRUlPO1xcbkBAIC0xOTAsNyArMjMxLDcgQEAgc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxcbiBcXHR9XFxuIFxcdGlmIChwaWQgPT0gMCkge1xcbiBcXHRcXHRzbnByaW50ZihrZXksIHNpemVvZihrZXkpLCBcXFwiJXMvc2lnbmluZ19rZXkucGVtXFxcIiwgZGlyKTtcXG4tXFx0XFx0ZXhlY2xwKFxcXCIuL3NpZ24tZmlsZVxcXCIsIFxcXCIuL3NpZ24tZmlsZVxcXCIsIFxcXCItZFxcXCIsIFxcXCJzaGEyNTZcXFwiLFxcbitcXHRcXHRleGVjbHAoXFxcIi4vc2lnbi1maWxlXFxcIiwgXFxcIi4vc2lnbi1maWxlXFxcIiwgXFxcIi1kXFxcIiwgZGlnZXN0LFxcbiBcXHRcXHQgICAgICAga2V5LCBrZXksIGRhdGFfdG1wbCwgTlVMTCk7XFxuIFxcdFxcdGV4aXQoMSk7XFxuIFxcdH1cXG5AQCAtMjAwLDM0ICsyNDEsMzggQEAgc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXG4tXFx0c25wcmludGYoc2lncGF0aCwgc2l6ZW9mKHNpZ3BhdGgpLCBcXFwiJXMucDdzXFxcIiwgZGF0YV90bXBsKTtcXG4gXFx0aWYgKHN0YXQoc2lncGF0aCwgXFx1MDAyNnN0KSBcXHUwMDNjIDApIHtcXG4gXFx0XFx0cmV0ID0gLWVycm5vO1xcbiBcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXHRpZiAoc3Quc3Rfc2l6ZSBcXHUwMDNlIChvZmZfdCkqc2lnX3N6KSB7XFxuIFxcdFxcdHJldCA9IC1FMkJJRztcXG4tXFx0XFx0Z290byBvdXRfc2lnO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXHRmZCA9IG9wZW4oc2lncGF0aCwgT19SRE9OTFkpO1xcbiBcXHRpZiAoZmQgXFx1MDAzYyAwKSB7XFxuIFxcdFxcdHJldCA9IC1lcnJubztcXG4tXFx0XFx0Z290byBvdXRfc2lnO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXHRpZiAocmVhZChmZCwgc2lnLCBzdC5zdF9zaXplKSAhPSBzdC5zdF9zaXplKSB7XFxuIFxcdFxcdGNsb3NlKGZkKTtcXG4gXFx0XFx0cmV0ID0gLUVJTztcXG4tXFx0XFx0Z290byBvdXRfc2lnO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFx0fVxcbiBcXHRjbG9zZShmZCk7XFxuIFxcdCpzaWdfc3ogPSBzdC5zdF9zaXplO1xcbi1vdXRfc2lnOlxcbi1cXHR1bmxpbmsoc2lncGF0aCk7XFxuIG91dDpcXG4rXFx0dW5saW5rKHNpZ3BhdGgpO1xcbiBcXHR1bmxpbmsoZGF0YV90bXBsKTtcXG4gXFx0cmV0dXJuIHJldDtcXG4gfVxcbiBcXG4rc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxcbitcXHRcXHQgICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6KVxcbit7XFxuK1xcdHJldHVybiBzaWduX2J1Zl9kaWdlc3QoZGlyLCBidWYsIGxlbiwgc2lnLCBzaWdfc3osIFxcXCJzaGEyNTZcXFwiKTtcXG4rfVxcbitcXG4gc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7XFxuIFxcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWw7XFxuIFxcdHN0cnVjdCBnZW5fbG9hZGVyX29wdHMgZ29wdHM7XFxuQEAgLTQ1Nyw3ICs1MDIsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXFxuIFxcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xcbiBcXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbiBcXHRcXHRyZXR1cm47XFxuLVxcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXBcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXAtcnNhXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbiBcXHRcXHRybWRpcihkaXIpO1xcbiBcXHRcXHRyZXR1cm47XFxuIFxcdH1cXG5AQCAtNTI5LDcgKzU3NCw2IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZClcXG4gXFx0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XFxuIFxcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xcbiBcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuLVxcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XFxuIFxcdGludCBmZDtcXG4gXFxuIFxcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcXHUwMDI2ZikgPT0gMCkge1xcbkBAIC01MzgsMjIgKzU4Miw5IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZClcXG4gXFx0XFx0ICogZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSB2ZXJpZmllciBsb2cuIEEgcHJlc2VudC1idXQtXFxuIFxcdFxcdCAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LlxcbiBcXHRcXHQgKi9cXG4tXFx0XFx0bWVtc2V0KFxcdTAwMjZhdHRyLCAwLCBzaXplb2YoYXR0cikpO1xcbi1cXHRcXHRhdHRyLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU1lTQ0FMTDtcXG4tXFx0XFx0YXR0ci5pbnNucyA9IHB0cl90b191NjQoZi5nb3B0cy5pbnNucyk7XFxuLVxcdFxcdGF0dHIuaW5zbl9jbnQgPSBmLmdvcHRzLmluc25zX3N6IC8gc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XFxuLVxcdFxcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXFxcIkR1YWwgQlNEL0dQTFxcXCIpO1xcbi1cXHRcXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XFxuLVxcdFxcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChqdW5rKTtcXG4tXFx0XFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpemVvZihqdW5rKTtcXG4tXFx0XFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xcbi1cXHRcXHRhdHRyLmxvZ19sZXZlbCA9IDE7XFxuLVxcdFxcdGF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7XFxuLVxcdFxcdGF0dHIubG9nX3NpemUgPSBzaXplb2YobG9nX2J1Zik7XFxuLVxcdFxcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXFxcIl9fbG9hZGVyLnByb2dcXFwiLCBzaXplb2YoXFxcIl9fbG9hZGVyLnByb2dcXFwiKSk7XFxuLVxcbi1cXHRcXHRmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFxcdTAwMjZhdHRyLFxcbi1cXHRcXHRcXHQgICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XFxuK1xcdFxcdGZkID0gbG9hZF9sb2FkZXJfbG9nKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxcbitcXHRcXHRcXHRcXHQgICAgIHNpemVvZihqdW5rKSwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwLFxcbitcXHRcXHRcXHRcXHQgICAgIGxvZ19idWYsIHNpemVvZihsb2dfYnVmKSk7XFxuIFxcdFxcdEFTU0VSVF9MVChmZCwgMCwgXFxcImludmFsaWQgc2lnbmF0dXJlIHJlamVjdGVkIGF0IGxvYWRcXFwiKTtcXG4gXFx0XFx0aWYgKGZkIFxcdTAwM2U9IDApXFxuIFxcdFxcdFxcdGNsb3NlKGZkKTtcXG5AQCAtNTcxLDggKzYwMiw5IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV90b29fbGFyZ2Uodm9pZClcXG4gXFxuIFxcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcXHUwMDI2ZikgPT0gMCkge1xcbiBcXHRcXHQvKlxcbi1cXHRcXHQgKiBzaWduYXR1cmVfc2l6ZSBiZXlvbmQgdGhlIGtlcm5lbCdzIGJvdW5kIChLTUFMTE9DX01BWF9DQUNIRV9TSVpFKVxcbi1cXHRcXHQgKiBpcyByZWplY3RlZCBiZWZvcmUgdGhlIGJ1ZmZlciBpcyByZWFkLlxcbitcXHRcXHQgKiBzaWduYXR1cmVfc2l6ZSBiZXlvbmQgdGhlIGtlcm5lbCdzIGJvdW5kXFxuK1xcdFxcdCAqIChCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkUpIGlzIHJlamVjdGVkIGJlZm9yZSB0aGUgYnVmZmVyXFxuK1xcdFxcdCAqIGlzIHJlYWQuXFxuIFxcdFxcdCAqL1xcbiBcXHRcXHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxcbiBcXHRcXHRcXHRcXHQgNjQgXFx1MDAzY1xcdTAwM2MgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XFxuQEAgLTYyNiw2ICs2NTgsMjY4IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9iYWRfa2V5cmluZyh2b2lkKVxcbiBcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuIH1cXG4gXFxuK3N0YXRpYyBib29sIGtleXJpbmdfdW5zZWFsZWRfYm9vdCh2b2lkKVxcbit7XFxuK1xcdGNoYXIgdmFsID0gMDtcXG4rXFx0aW50IGZkO1xcbitcXG4rXFx0ZmQgPSBvcGVuKFxcXCIvc3lzL21vZHVsZS9icGYvcGFyYW1ldGVycy9rZXlyaW5nX3Vuc2VhbGVkXFxcIiwgT19SRE9OTFkpO1xcbitcXHRpZiAoZmQgXFx1MDAzYyAwKVxcbitcXHRcXHRyZXR1cm4gZmFsc2U7XFxuK1xcdGlmIChyZWFkKGZkLCBcXHUwMDI2dmFsLCAxKSAhPSAxKVxcbitcXHRcXHR2YWwgPSAwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcdHJldHVybiB2YWwgPT0gJ1knIHx8IHZhbCA9PSAnMSc7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgYnBmX2tleXJpbmdfbG9va3VwKGludCAqbnJfa2V5cylcXG4re1xcbitcXHRjaGFyIGxpbmVbNTEyXSwgdHlwZVszMl0sIGRlc2NbNjRdO1xcbitcXHRpbnQgc2VyaWFsID0gLUVOT0VOVDtcXG4rXFx0RklMRSAqZjtcXG4rXFxuK1xcdGYgPSBmb3BlbihcXFwiL3Byb2Mva2V5c1xcXCIsIFxcXCJyXFxcIik7XFxuK1xcdGlmICghZilcXG4rXFx0XFx0cmV0dXJuIC1lcnJubztcXG4rXFxuK1xcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7XFxuK1xcdFxcdHVuc2lnbmVkIGludCBoZXg7XFxuK1xcdFxcdGNoYXIgKnN1bTtcXG4rXFxuK1xcdFxcdGlmIChzc2NhbmYobGluZSwgXFxcIiV4ICUqcyAlKnMgJSpzICUqcyAlKnMgJSpzICUzMXMgJTYzc1xcXCIsXFxuK1xcdFxcdFxcdCAgIFxcdTAwMjZoZXgsIHR5cGUsIGRlc2MpICE9IDMpXFxuK1xcdFxcdFxcdGNvbnRpbnVlO1xcbitcXHRcXHRpZiAoc3RyY21wKHR5cGUsIFxcXCJrZXlyaW5nXFxcIikgfHwgc3RyY21wKGRlc2MsIFxcXCIuYnBmOlxcXCIpKVxcbitcXHRcXHRcXHRjb250aW51ZTtcXG4rXFxuK1xcdFxcdHNlcmlhbCA9IChpbnQpaGV4O1xcbitcXHRcXHRpZiAobnJfa2V5cykge1xcbitcXHRcXHRcXHRzdW0gPSBzdHJzdHIobGluZSwgXFxcIi5icGY6IFxcXCIpO1xcbitcXHRcXHRcXHQqbnJfa2V5cyA9ICFzdW0gfHwgIXN0cm5jbXAoc3VtICsgNiwgXFxcImVtcHR5XFxcIiwgNSkgP1xcbitcXHRcXHRcXHRcXHQgICAwIDogYXRvaShzdW0gKyA2KTtcXG4rXFx0XFx0fVxcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXHRmY2xvc2UoZik7XFxuK1xcdHJldHVybiBzZXJpYWw7XFxuK31cXG4rXFxuK3N0YXRpYyBsb25nIGtleWN0bF9yZXQoaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcyLCB1bnNpZ25lZCBsb25nIGFyZzMpXFxuK3tcXG4rXFx0bG9uZyByZXQgPSBzeXNjYWxsKF9fTlJfa2V5Y3RsLCBjbWQsIGFyZzIsIGFyZzMpO1xcbitcXG4rXFx0cmV0dXJuIHJldCBcXHUwMDNjIDAgPyAtZXJybm8gOiByZXQ7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFdoYXQgdGhlIGJwZiBrZXlyaW5nIHN0aWxsIG5lZWRzIG9uY2UgaXQgZ290IHByb3Zpc2lvbmVkOiBLRVlfUE9TX1NFQVJDSFxcbisgKiBmb3IgdGhlIGluLWtlcm5lbCBzZWFyY2ggZHVyaW5nIHZlcmlmaWNhdGlvbiwgYW5kIHRoZSB1c2VyIHZpZXcvcmVhZCBiaXRzXFxuKyAqIHNvIGl0IHN0YXlzIHZpc2libGUgaW4gL3Byb2Mva2V5cywgcmVzdCBpcyBkcm9wcGVkIHNvIHRoZSBlbnJvbGxlZCBpc1xcbisgKiB0aGVyZWZvcmUgZmluYWwuXFxuKyAqL1xcbisjZGVmaW5lIEJQRl9LRVlSSU5HX1BFUk1fTE9DS0VEXFx0XFx0MHgwODAzMDAwMFxcbisvKiBXaGF0IGJwZl9rZXlyaW5nX2luaXQoKSBncmFudHMgYXQgYm9vdC4gKi9cXG4rI2RlZmluZSBCUEZfS0VZUklOR19QRVJNX0lOSVRJQUxcXHQweDA4MmYwMDAwXFxuK1xcbitzdGF0aWMgdm9pZCBicGZfa2V5cmluZ19zZWFsZWQodm9pZClcXG4re1xcbitcXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHt9O1xcbitcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuK1xcdGludCBzZXJpYWwsIGtleSwgZmQ7XFxuK1xcbitcXHRpZiAoa2V5cmluZ191bnNlYWxlZF9ib290KCkpIHtcXG4rXFx0XFx0cHJpbnRmKFxcXCIlczpTS0lQOnRoZSBicGYga2V5cmluZyB3YXMgdW5zZWFsZWQgYXQgYm9vdFxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHR0ZXN0X19za2lwKCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRzZXJpYWwgPSBicGZfa2V5cmluZ19sb29rdXAoTlVMTCk7XFxuK1xcdGlmIChzZXJpYWwgXFx1MDAzZT0gMCkge1xcbitcXHRcXHRrZXkgPSBzeXNjYWxsKF9fTlJfYWRkX2tleSwgXFxcInVzZXJcXFwiLCBcXFwic2VhbHByb2JlXFxcIiwgXFxcInhcXFwiLCAxLCBzZXJpYWwpO1xcbitcXHRcXHRpZiAoa2V5IFxcdTAwM2U9IDApXFxuK1xcdFxcdFxcdHN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9VTkxJTkssIGtleSwgc2VyaWFsKTtcXG4rXFx0XFx0QVNTRVJUX0VRKGtleSBcXHUwMDNjIDAgPyAtZXJybm8gOiAwLCAtRVBFUk0sXFxuK1xcdFxcdFxcdCAgXFxcIm5vdGhpbmcgbGlua3MgaW50byBhIHNlYWxlZCBrZXlyaW5nXFxcIik7XFxuK1xcdH1cXG4rXFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFxcdTAwMjZmKSA9PSAwKSB7XFxuK1xcdFxcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXFxuK1xcdFxcdFxcdFxcdCBzaXplb2YoanVuayksIEJQRl9LRVlSSU5HX0JQRiwgMCk7XFxuK1xcdFxcdEFTU0VSVF9FUShmZCwgLUVOT0tFWSwgXFxcInNlYWxlZCBicGYga2V5cmluZyByZWplY3RlZFxcXCIpO1xcbitcXHRcXHRpZiAoZmQgXFx1MDAzZT0gMClcXG4rXFx0XFx0XFx0Y2xvc2UoZmQpO1xcbitcXHR9XFxuK1xcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFxcdTAwMjZmKTtcXG4rfVxcbitcXG4rc3RhdGljIGludCB0cnlfbG9hZChjb25zdCBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmLCBjb25zdCB2b2lkICpzaWcsXFxuK1xcdFxcdCAgICBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsIGNoYXIgKmxvZ19idWYsIF9fdTMyIGxvZ19zeilcXG4re1xcbitcXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xcbitcXG4rXFx0bWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoZik7XFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXFxcIm1ldGFfbWFwXFxcIikpXFxuK1xcdFxcdHJldHVybiBtYXBfZmQ7XFxuK1xcdHByb2dfZmQgPSBsb2FkX2xvYWRlcl9sb2coZi1cXHUwMDNlZ29wdHMuaW5zbnMsIGYtXFx1MDAzZWdvcHRzLmluc25zX3N6LCBtYXBfZmQsXFxuK1xcdFxcdFxcdFxcdCAgc2lnLCBzaWdfc3osIGtleXJpbmdfaWQsIDEsIGxvZ19idWYsIGxvZ19zeik7XFxuK1xcdGNsb3NlKG1hcF9mZCk7XFxuK1xcdGlmIChwcm9nX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHByb2dfZmQpO1xcbitcXHRyZXR1cm4gcHJvZ19mZDtcXG4rfVxcbitcXG4rLypcXG4rICogVGhpcyBuZWVkcyBicGYua2V5cmluZ191bnNlYWxlZD0xIG9uIHRoZSBndWVzdCBrZXJuZWwgY29tbWFuZCBsaW5lLCB3aGljaFxcbisgKiB2bXRlc3Quc2ggY2FuIHBhc3MgdmlhIEtFUk5FTF9DTURMSU5FX0VYVFJBLiBUaGVyZSBpcyBubyB3YXkgdG8gdW5zZWFsIHRoZVxcbisgKiBrZXlyaW5nIGZyb20gaGVyZSwgc28gd2l0aG91dCBpdCB0aGUgdGVzdCBza2lwcy4gSXQgYWxzbyBvbmx5IHdvcmtzIG9uY2VcXG4rICogcGVyIGJvb3QsIGFzIHJlc3RyaWN0aW5nIGEga2V5cmluZyBjYW5ub3QgYmUgdW5kb25lLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgYnBmX2tleXJpbmdfcHJvdmlzaW9uZWQodm9pZClcXG4re1xcbitcXHRjaGFyIGRpcl90bXBsW10gPSBcXFwiL3RtcC9icGZrZXlyaW5nWFhYWFhYXFxcIjtcXG4rXFx0Y2hhciBiYWRfdG1wbFtdID0gXFxcIi90bXAvYnBma2V5cmluZ2JhZFhYWFhYWFxcXCI7XFxuK1xcdF9fdTggKnNpZyA9IE5VTEwsICpiYWQgPSBOVUxMLCAqYnVmID0gTlVMTDtcXG4rXFx0aW50IHNlcmlhbCwgZXJyO1xcbitcXHRpbnQgbnJfa2V5cyA9IDAsIGRlcl9mZCA9IC0xO1xcbitcXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XFxuK1xcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIGJhZF9zejtcXG4rXFx0Ym9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTtcXG4rXFx0Y2hhciAqZGlyLCAqYmFkX2RpciA9IE5VTEw7XFxuK1xcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xcbitcXHRjaGFyIHBhdGhbUEFUSF9NQVhdO1xcbitcXHRfX3U4IGRlcls0MDk2XTtcXG4rXFx0c3NpemVfdCBkZXJfc3o7XFxuK1xcbitcXHRzZXJpYWwgPSBicGZfa2V5cmluZ19sb29rdXAoXFx1MDAyNm5yX2tleXMpO1xcbitcXHRpZiAoc2VyaWFsIFxcdTAwM2MgMCkge1xcbitcXHRcXHRwcmludGYoXFxcIiVzOlNLSVA6bm8gYnBmIGtleXJpbmcgKG5lZWRzIENPTkZJR19LRVlTKVxcXFxuXFxcIiwgX19mdW5jX18pO1xcbitcXHRcXHR0ZXN0X19za2lwKCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbitcXHRpZiAobnJfa2V5cyAhPSAwKSB7XFxuK1xcdFxcdHByaW50ZihcXFwiJXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgaGFzIGFscmVhZHkgYmVlbiBwcm92aXNpb25lZFxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwiZ2Vua2V5XFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXAgZ2Vua2V5XFxcIikpXFxuK1xcdFxcdGdvdG8gcm1kaXI7XFxuK1xcbitcXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFxcXCIlcy9zaWduaW5nX2tleS5kZXJcXFwiLCBkaXIpO1xcbitcXHRkZXJfZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfRkQoZGVyX2ZkLCBcXFwib3BlbiBzaWduaW5nX2tleS5kZXJcXFwiKSlcXG4rXFx0XFx0Z290byBybWRpcjtcXG4rXFx0ZGVyX3N6ID0gcmVhZChkZXJfZmQsIGRlciwgc2l6ZW9mKGRlcikpO1xcbitcXHRjbG9zZShkZXJfZmQpO1xcbitcXHRpZiAoIUFTU0VSVF9HVChkZXJfc3osIDAsIFxcXCJyZWFkIHNpZ25pbmdfa2V5LmRlclxcXCIpKVxcbitcXHRcXHRnb3RvIHJtZGlyO1xcbitcXG4rXFx0ZXJyID0gc3lzY2FsbChfX05SX2FkZF9rZXksIFxcXCJhc3ltbWV0cmljXFxcIiwgXFxcIlxcXCIsIGRlciwgKHNpemVfdClkZXJfc3osXFxuK1xcdFxcdCAgICAgIHNlcmlhbCk7XFxuK1xcdGlmIChlcnIgXFx1MDAzYyAwIFxcdTAwMjZcXHUwMDI2IGVycm5vID09IEVQRVJNKSB7XFxuK1xcdFxcdHByaW50ZihcXFwiJXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgaXMgc2VhbGVkLCBuZWVkIGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFcXFxcblxcXCIsXFxuK1xcdFxcdCAgICAgICBfX2Z1bmNfXyk7XFxuK1xcdFxcdHRlc3RfX3NraXAoKTtcXG4rXFx0XFx0Z290byBybWRpcjtcXG4rXFx0fVxcbitcXHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFxcXCJhZGQgdGhlIHNpZ25pbmcga2V5IHRvIHRoZSBicGYga2V5cmluZ1xcXCIpKVxcbitcXHRcXHRnb3RvIHJtZGlyO1xcbitcXG4rXFx0c2lnID0gbWFsbG9jKHNpZ19zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihzaWcsIFxcXCJzaWcgYnVmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRoYXZlX2ZpeHR1cmUgPSB0cnVlO1xcbitcXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXFx1MDAyNmYpICE9IDApXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0YnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeik7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihidWYsIFxcXCJzaWduYnVmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRtZW1jcHkoYnVmLCBmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6KTtcXG4rXFx0bWVtY3B5KGJ1ZiArIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osIHNpZyxcXG4rXFx0XFx0XFx0XFx0XFx1MDAyNnNpZ19zeiksIFxcXCJzaWduIGluc25zfHxtZXRhZGF0YVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdEFTU0VSVF9FUSh0cnlfbG9hZChcXHUwMDI2Ziwgc2lnLCBzaWdfc3osIEJQRl9LRVlSSU5HX0JQRiwgTlVMTCwgMCksIC1FTk9LRVksXFxuK1xcdFxcdCAgXFxcInVucmVzdHJpY3RlZCBrZXlyaW5nIHN0aWxsIG5vdCBjb25zdWx0ZWRcXFwiKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSh0cnlfbG9hZChcXHUwMDI2Ziwgc2lnLCBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgTlVMTCwgMCksXFxuK1xcdFxcdCAgLUVQRVJNLCBcXFwiY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCBiZWZvcmUgcHJvdmlzaW9uaW5nXFxcIik7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PSyhzeXNjYWxsKF9fTlJfa2V5Y3RsLCBLRVlDVExfUkVTVFJJQ1RfS0VZUklORywgc2VyaWFsLFxcbitcXHRcXHRcXHQgICAgICAgTlVMTCwgTlVMTCksIFxcXCJyZXN0cmljdCBicGYga2V5cmluZ1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX0ZEKHRyeV9sb2FkKFxcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKSxcXG4rXFx0XFx0XFx0ICBcXFwibG9hZCBzaWduZWQgYnkgYSBrZXkgaW4gdGhlIC5icGYga2V5cmluZ1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJhZF9kaXIgPSBta2R0ZW1wKGJhZF90bXBsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJhZF9kaXIsIFxcXCJta2R0ZW1wIHVuZW5yb2xsZWRcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwiZ2Vua2V5XFxcIiwgYmFkX2RpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwIGdlbmtleSB1bmVucm9sbGVkXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRiYWRfc3ogPSA4MTkyO1xcbitcXHRiYWQgPSBtYWxsb2MoYmFkX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJhZCwgXFxcImJhZCBzaWcgYnVmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1ZihiYWRfZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osIGJhZCxcXG4rXFx0XFx0XFx0XFx0XFx1MDAyNmJhZF9zeiksIFxcXCJzaWduIHdpdGggYW4gdW5lbnJvbGxlZCBrZXlcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRBU1NFUlRfRVEodHJ5X2xvYWQoXFx1MDAyNmYsIGJhZCwgYmFkX3N6LCBCUEZfS0VZUklOR19CUEYsIGxvZ19idWYsXFxuK1xcdFxcdFxcdCAgIHNpemVvZihsb2dfYnVmKSksIC1FTk9LRVksXFxuK1xcdFxcdCAgXFxcImtleSBvdXRzaWRlIHRoZSBicGYga2V5cmluZyByZWZ1c2VkXFxcIik7XFxuK1xcdEFTU0VSVF9IQVNfU1VCU1RSKGxvZ19idWYsIFxcXCJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZFxcXCIsXFxuK1xcdFxcdFxcdCAgXFxcInRoZSBicGYga2V5cmluZyB3YXMgY29uc3VsdGVkXFxcIik7XFxuK1xcbitcXHRmLmJsb2JbMF0gXj0gMHhmZjtcXG4rXFx0ZXJyID0gdHJ5X2xvYWQoXFx1MDAyNmYsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApO1xcbitcXHRmLmJsb2JbMF0gXj0gMHhmZjtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgXFxcInRhbXBlcmVkIG1ldGFkYXRhIHJlZnVzZWRcXFwiKTtcXG4rXFxuK1xcdEFTU0VSVF9FUSh0cnlfbG9hZChcXHUwMDI2Ziwgc2lnLCBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgTlVMTCwgMCksXFxuK1xcdFxcdCAgLUVQRVJNLCBcXFwiY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCBvbmNlIC5icGYgaXMgaW4gdXNlXFxcIik7XFxuK1xcbitcXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9VTkxJTkssIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgc2VyaWFsKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVOT0VOVCwgXFxcImtleXJpbmcgd3JpdGFibGUgd2hpbGUgdGhlIHVzZXIgYml0cyBhcmUgdGhlcmVcXFwiKTtcXG4rXFxuK1xcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1NFVFBFUk0sIHNlcmlhbCwgQlBGX0tFWVJJTkdfUEVSTV9MT0NLRUQpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJkcm9wIHRoZSB1c2VyIGJpdHMgb24gdGhlIGJwZiBrZXlyaW5nXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0QVNTRVJUX09LX0ZEKHRyeV9sb2FkKFxcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKSxcXG4rXFx0XFx0ICAgICBcXFwibG9hZCBzdGlsbCB2ZXJpZmllZCBhZ2FpbnN0IHRoZSBsb2NrZWQga2V5cmluZ1xcXCIpO1xcbitcXG4rXFx0ZXJyID0ga2V5Y3RsX3JldChLRVlDVExfVU5MSU5LLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIHNlcmlhbCk7XFxuK1xcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFxcXCJ1bmxpbmsgcmVmdXNlZFxcXCIpO1xcbitcXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9DTEVBUiwgc2VyaWFsLCAwKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXFxcImNsZWFyIHJlZnVzZWRcXFwiKTtcXG4rXFx0ZXJyID0ga2V5Y3RsX3JldChLRVlDVExfUkVWT0tFLCBzZXJpYWwsIDApO1xcbitcXHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcXFwicmV2b2tlIHJlZnVzZWRcXFwiKTtcXG4rXFx0ZXJyID0ga2V5Y3RsX3JldChLRVlDVExfSU5WQUxJREFURSwgc2VyaWFsLCAwKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXFxcImludmFsaWRhdGUgcmVmdXNlZFxcXCIpO1xcbitcXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRfVElNRU9VVCwgc2VyaWFsLCAxKTtcXG4rXFx0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXFxcInRpbWVvdXQgcmVmdXNlZFxcXCIpO1xcbitcXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRQRVJNLCBzZXJpYWwsIEJQRl9LRVlSSU5HX1BFUk1fSU5JVElBTCk7XFxuK1xcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFxcXCJ0aGUgYml0cyBjYW5ub3QgYmUgZ3JhbnRlZCBiYWNrXFxcIik7XFxuK1xcbitcXHRBU1NFUlRfRVEoYnBmX2tleXJpbmdfbG9va3VwKFxcdTAwMjZucl9rZXlzKSwgc2VyaWFsLCBcXFwia2V5cmluZyBzdGlsbCB0aGVyZVxcXCIpO1xcbitcXHRBU1NFUlRfRVEobnJfa2V5cywgMSwgXFxcInRoZSBlbnJvbGxlZCBrZXkgc3Vydml2ZWRcXFwiKTtcXG4rb3V0OlxcbitcXHRpZiAoaGF2ZV9maXh0dXJlKVxcbitcXHRcXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcXHUwMDI2Zik7XFxuK1xcdGdlbmtleV9kaXJfZmluaShiYWRfZGlyKTtcXG4rXFx0ZnJlZShidWYpO1xcbitcXHRmcmVlKGJhZCk7XFxuK1xcdGZyZWUoc2lnKTtcXG4rcm1kaXI6XFxuK1xcdGdlbmtleV9kaXJfZmluaShkaXIpO1xcbit9XFxuK1xcbiAvKlxcbiAgKiBBIHNpZ25lZCBsb2FkZXIgbXVzdCBpZ25vcmUgY3R4LXN1cHBsaWVkIG1hcCBkaW1lbnNpb25zOiB0aGUgaG9zdCBjYW5ub3RcXG4gICogcmVzaXplIGEgc2lnbmVkIHByb2dyYW0ncyBtYXBzIHZpYSB0aGUgbG9hZGVyIGN0eC4gRHJpdmUgYSBvbmUtbWFwIHByb2dyYW1cXG5AQCAtODMxLDcgKzExMjUsNyBAQCBzdGF0aWMgdm9pZCBzaWduYXR1cmVfYXV0aGVudGljYXRlc19pbnNucyh2b2lkKVxcbiBcXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcXG4gXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXFxcIm1rZHRlbXBcXFwiKSlcXG4gXFx0XFx0cmV0dXJuO1xcbi1cXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbitcXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwLXJzYVxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4gXFx0XFx0cm1kaXIoZGlyKTtcXG4gXFx0XFx0cmV0dXJuO1xcbiBcXHR9XFxuQEAgLTkzMSw3ICsxMjI1LDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfbWV0YWRhdGEodm9pZClcXG4gXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuIFxcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuIFxcdFxcdHJldHVybjtcXG4tXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cC1yc2FcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuIFxcdFxcdHJtZGlyKGRpcik7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbkBAIC0xMjY3LDcgKzE1NjEsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcXG4gXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuIFxcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuIFxcdFxcdGdvdG8gb3V0O1xcbi1cXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbitcXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwLXJzYVxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4gXFx0XFx0cm1kaXIoZGlyKTtcXG4gXFx0XFx0ZGlyID0gTlVMTDtcXG4gXFx0XFx0Z290byBvdXQ7XFxuQEAgLTE0NTAsNyArMTc0NCw3IEBAIHN0YXRpYyB2b2lkIGxvYWR0aW1lX3ZlcmlmeShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBpbnQgZXhwZWN0X21hcHMpXFxuIFxcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xcbiBcXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbiBcXHRcXHRyZXR1cm47XFxuLVxcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXBcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXAtcnNhXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbiBcXHRcXHRybWRpcihkaXIpO1xcbiBcXHRcXHRyZXR1cm47XFxuIFxcdH1cXG5AQCAtMTUyNCw2ICsxODE4LDg5IEBAIHN0YXRpYyB2b2lkIGxvYWR0aW1lX3dpdGhfbWFwKHZvaWQpXFxuIFxcdHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXBfX2Rlc3Ryb3koc2tlbCk7XFxuIH1cXG4gXFxuKy8qXFxuKyAqIEVuZC10by1lbmQgc2lnbmVkIGxvYWQgd2l0aCBhIHBvc3QtcXVhbnR1bSBrZXkuIE1MLURTQSAoRklQUy0yMDQpIGlzIHdpcmVkXFxuKyAqIHRocm91Z2ggdGhlIFguNTA5IGFuZCBQS0NTIzcgcGFyc2VycywgYW5kIEJQRiByZWFjaGVzIHRoZW0gdmlhXFxuKyAqIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSB3aXRob3V0IGtub3dpbmcgdGhlIGFsZ29yaXRobSwgc28gYW4gTUwtRFNBIGtleSBpblxcbisgKiB0aGUga2V5cmluZyBzaG91bGQgdmVyaWZ5IGFuIE1MLURTQSBzaWduZWQgcHJvZ3JhbSB3aXRoIG5vIEJQRi1zaWRlIHdvcmsuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCBtbGRzYV9zaWduZWRfbG9hZCh2b2lkKVxcbit7XFxuK1xcdGNoYXIgZGlyX3RtcGxbXSA9IFxcXCIvdG1wL2JwZm1sZHNhWFhYWFhYXFxcIjtcXG4rXFx0aW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTEsIGVycjtcXG4rXFx0X191OCAqc2lnID0gTlVMTCwgKmJ1ZiA9IE5VTEw7XFxuK1xcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcXG4rXFx0Ym9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTtcXG4rXFx0X191MzIgc2lnX3N6ID0gMTYzODQ7XFxuK1xcdGNoYXIgKmRpcjtcXG4rXFxuK1xcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXFxcImtleXJpbmdcXFwiLCBcXFwiX3VpZC4wXFxcIiwgTlVMTCxcXG4rXFx0XFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcXG4rXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IHJ1bl9zZXR1cChcXFwic2V0dXAtbWxkc2FcXFwiLCBkaXIpO1xcbitcXHRpZiAoZXJyID09IFNFVFVQX1NLSVApIHtcXG4rXFx0XFx0cHJpbnRmKFxcXCIlczpTS0lQOm9wZW5zc2wgaGFzIG5vIE1MLURTQSBzdXBwb3J0IChuZWVkcyAzLjUrKVxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIF9fZnVuY19fKTtcXG4rXFx0XFx0dGVzdF9fc2tpcCgpO1xcbitcXHRcXHRnZW5rZXlfZGlyX2ZpbmkoZGlyKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInZlcmlmeV9zaWdfc2V0dXAgc2V0dXAtbWxkc2FcXFwiKSkge1xcbitcXHRcXHRnZW5rZXlfZGlyX2ZpbmkoZGlyKTtcXG4rXFx0XFx0cmV0dXJuO1xcbitcXHR9XFxuK1xcbitcXHRzaWcgPSBtYWxsb2Moc2lnX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKHNpZywgXFxcInNpZyBidWZcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGhhdmVfZml4dHVyZSA9IHRydWU7XFxuK1xcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcXHUwMDI2ZikgIT0gMClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRidWYgPSBtYWxsb2MoKHNpemVfdClmLmdvcHRzLmluc25zX3N6ICsgZi5kYXRhX3N6KTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgXFxcInNpZ25idWZcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xcbitcXHRtZW1jcHkoYnVmICsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xcbitcXG4rXFx0LypcXG4rXFx0ICogTUwtRFNBIGhhc2hlcyB0aGUgbWVzc2FnZSBpdHNlbGYsIGJ1dCBvcGVuc3NsIGJlZm9yZSA0LjAgY2Fubm90XFxuK1xcdCAqIHByb2R1Y2UgYSBDTVMgbWVzc2FnZSB3aXRob3V0IHNpZ25lZEF0dHJzIGZvciBpdCwgYW5kIHdpdGggdGhvc2UgaW5cXG4rXFx0ICogcGxheSBvbmx5IFNIQS01MTIgaXMgcGVybWl0dGVkIGZvciB0aGUgbWVzc2FnZURpZ2VzdCBhdHRyaWJ1dGUuXFxuK1xcdCAqL1xcbitcXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1Zl9kaWdlc3QoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osXFxuK1xcdFxcdFxcdFxcdCAgICAgICBzaWcsIFxcdTAwMjZzaWdfc3osIFxcXCJzaGE1MTJcXFwiKSxcXG4rXFx0XFx0ICAgICAgIFxcXCJzaWduIGluc25zfHxtZXRhZGF0YSB3aXRoIE1MLURTQVxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEd1YXJkIGFnYWluc3QgdGhlIHNldHVwIHNpbGVudGx5IGhhbmRpbmcgYmFjayBzb21lIG90aGVyIGtleSB0eXBlOlxcbitcXHQgKiBhbiBSU0Egb3IgRUNEU0Egc2lnbmF0dXJlIGlzIGEgZmV3IGh1bmRyZWQgYnl0ZXMsIHdoZXJlIGFuIE1MLURTQS04N1xcbitcXHQgKiBvbmUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiB0aGUgcmF3IHNpZ25hdHVyZSBpdCBjYXJyaWVzLlxcbitcXHQgKi9cXG4rXFx0QVNTRVJUX0dUKHNpZ19zeiwgTUxEU0E4N19TSUdOQVRVUkVfU0laRSwgXFxcIk1MLURTQS04NyBzaWduYXR1cmUgc2l6ZVxcXCIpO1xcbitcXG4rXFx0bWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoXFx1MDAyNmYpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsIFxcXCJtZXRhX21hcFxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0cHJvZ19mZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIG1hcF9mZCwgc2lnLFxcbitcXHRcXHRcXHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XFxuK1xcdEFTU0VSVF9PS19GRChwcm9nX2ZkLCBcXFwiTUwtRFNBIHNpZ25lZCBsb2FkZXIgbG9hZFxcXCIpO1xcbitvdXQ6XFxuK1xcdGlmIChwcm9nX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKHByb2dfZmQpO1xcbitcXHRpZiAobWFwX2ZkIFxcdTAwM2U9IDApXFxuK1xcdFxcdGNsb3NlKG1hcF9mZCk7XFxuK1xcdGlmIChoYXZlX2ZpeHR1cmUpXFxuK1xcdFxcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFxcdTAwMjZmKTtcXG4rXFx0ZnJlZShidWYpO1xcbitcXHRmcmVlKHNpZyk7XFxuK1xcdHJ1bl9zZXR1cChcXFwiY2xlYW51cFxcXCIsIGRpcik7XFxuK31cXG4rXFxuIC8qXFxuICAqIEEgc2lnbmVkIHByb2dyYW0gbmVlZCBub3QgYmluZCBhbnkgbWFwLiBBIHBsYWluIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTFxcbiAgKiBwcm9ncmFtIHdpdGggbm8gZmRfYXJyYXkgaXMgc2lnbmVkIG92ZXIgaXRzIGluc3RydWN0aW9ucyBhbG9uZTogdGhlIGtlcm5lbFxcbkBAIC0xNTQ4LDcgKzE5MjUsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbm9fZmRfYXJyYXkodm9pZClcXG4gXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuIFxcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuIFxcdFxcdHJldHVybjtcXG4tXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cC1yc2FcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuIFxcdFxcdHJtZGlyKGRpcik7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbkBAIC0xNjE5LDcgKzE5OTYsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbWFwX2J5X2ZkX3JlamVjdGVkKHZvaWQpXFxuIFxcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xcbiBcXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbiBcXHRcXHRnb3RvIG91dF9tYXA7XFxuLVxcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXBcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuK1xcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcXFwic2V0dXAtcnNhXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbiBcXHRcXHRybWRpcihkaXIpO1xcbiBcXHRcXHRnb3RvIG91dF9tYXA7XFxuIFxcdH1cXG5AQCAtMTY4MSw3ICsyMDU4LDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxcbiBcXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcXG4gXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXFxcIm1rZHRlbXBcXFwiKSlcXG4gXFx0XFx0Z290byBvdXRfbWFwO1xcbi1cXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwXFxcIiwgZGlyKSwgXFxcInZlcmlmeV9zaWdfc2V0dXBcXFwiKSkge1xcbitcXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXFxcInNldHVwLXJzYVxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4gXFx0XFx0cm1kaXIoZGlyKTtcXG4gXFx0XFx0Z290byBvdXRfbWFwO1xcbiBcXHR9XFxuQEAgLTE3MzUsNyArMjExMiw3IEBAIHN0YXRpYyB2b2lkIHNpZ25lZF9tb2R1bGVfa2Z1bmNfcmVqZWN0ZWQodm9pZClcXG4gXFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XFxuIFxcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFxcXCJta2R0ZW1wXFxcIikpXFxuIFxcdFxcdHJldHVybjtcXG4tXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cFxcXCIsIGRpciksIFxcXCJ2ZXJpZnlfc2lnX3NldHVwXFxcIikpIHtcXG4rXFx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFxcXCJzZXR1cC1yc2FcXFwiLCBkaXIpLCBcXFwidmVyaWZ5X3NpZ19zZXR1cFxcXCIpKSB7XFxuIFxcdFxcdHJtZGlyKGRpcik7XFxuIFxcdFxcdHJldHVybjtcXG4gXFx0fVxcbkBAIC0xNzc5LDYgKzIxNTYsMTEgQEAgc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKVxcbiBcXG4gdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZClcXG4ge1xcbitcXHRpZiAoa2V5cmluZ191bnNlYWxlZF9ib290KCkpIHtcXG4rXFx0XFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImJwZl9rZXlyaW5nX3Byb3Zpc2lvbmVkXFxcIikpXFxuK1xcdFxcdFxcdGJwZl9rZXlyaW5nX3Byb3Zpc2lvbmVkKCk7XFxuK1xcdFxcdHJldHVybjtcXG4rXFx0fVxcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibG9hZHRpbWVfbm9fbWFwXFxcIikpXFxuIFxcdFxcdGxvYWR0aW1lX25vX21hcCgpO1xcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibG9hZHRpbWVfd2l0aF9tYXBcXFwiKSlcXG5AQCAtMTgwNSw2ICsyMTg3LDEwIEBAIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpXFxuIFxcdFxcdHNpZ25hdHVyZV96ZXJvX3NpemUoKTtcXG4gXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcInNpZ25hdHVyZV9iYWRfa2V5cmluZ1xcXCIpKVxcbiBcXHRcXHRzaWduYXR1cmVfYmFkX2tleXJpbmcoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcImJwZl9rZXlyaW5nX3NlYWxlZFxcXCIpKVxcbitcXHRcXHRicGZfa2V5cmluZ19zZWFsZWQoKTtcXG4rXFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXFxcIm1sZHNhX3NpZ25lZF9sb2FkXFxcIikpXFxuK1xcdFxcdG1sZHNhX3NpZ25lZF9sb2FkKCk7XFxuIFxcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFxcXCJtZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZFxcXCIpKVxcbiBcXHRcXHRtZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCgpO1xcbiBcXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcXFwibWV0YWRhdGFfY3R4X2luaXRpYWxfdmFsdWVfaWdub3JlZFxcXCIpKVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmNcXG5pbmRleCBmMzI3ZmViOGUzOGMzLi4xMmIxNDZkMjA1ZDc1IDEwMDY0NFxcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuY1xcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuY1xcbkBAIC0yNTcsNyArMjU3LDcgQEAgc3RhdGljIHZvaWQgdGVzdF92ZXJpZnlfcGtjczdfc2lnX2Zyb21fbWFwKHZvaWQpXFxuIFxcdGlmICghQVNTRVJUX09LX1BUUih0bXBfZGlyLCBcXFwibWtkdGVtcFxcXCIpKVxcbiBcXHRcXHRyZXR1cm47XFxuIFxcbi1cXHRyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgXFxcInNldHVwXFxcIik7XFxuK1xcdHJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCBcXFwic2V0dXAtcnNhXFxcIik7XFxuIFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIl9ydW5fc2V0dXBfcHJvY2Vzc1xcXCIpKVxcbiBcXHRcXHRnb3RvIGNsb3NlX3Byb2c7XFxuIFxcbkBAIC00NTgsNyArNDU4LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9wa2NzN19zaWdfZnN2ZXJpdHkodm9pZClcXG4gXFx0c25wcmludGYoZGF0YV9wYXRoLCBQQVRIX01BWCwgXFxcIiVzL2RhdGEtZmlsZVxcXCIsIHRtcF9kaXIpO1xcbiBcXHRzbnByaW50ZihzaWdfcGF0aCwgUEFUSF9NQVgsIFxcXCIlcy9zaWctZmlsZVxcXCIsIHRtcF9kaXIpO1xcbiBcXG4tXFx0cmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsIFxcXCJzZXR1cFxcXCIpO1xcbitcXHRyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgXFxcInNldHVwLXJzYVxcXCIpO1xcbiBcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJfcnVuX3NldHVwX3Byb2Nlc3NcXFwiKSlcXG4gXFx0XFx0Z290byBvdXQ7XFxuIFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92ZXJpZnlfc2lnX3NldHVwLnNoXFxuaW5kZXggMDkxNzlmYjU1MWYwOS4uMjczN2MxYTJiY2ZkNiAxMDA3NTVcXG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92ZXJpZnlfc2lnX3NldHVwLnNoXFxuQEAgLTI4LDcgKzI4LDcgQEAgYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZFxcbiBcXG4gdXNhZ2UoKVxcbiB7XFxuLVxcdGVjaG8gXFxcIlVzYWdlOiAkMCBcXHUwMDNjc2V0dXB8Y2xlYW51cCBcXHUwMDNjZXhpc3RpbmdfdG1wX2RpclxcdTAwM2VcXFwiXFxuK1xcdGVjaG8gXFxcIlVzYWdlOiAkMCBcXHUwMDNjc2V0dXAtcnNhfHNldHVwLW1sZHNhfGNsZWFudXAgXFx1MDAzY2V4aXN0aW5nX3RtcF9kaXJcXHUwMDNlXFxcIlxcbiBcXHRleGl0IDFcXG4gfVxcbiBcXG5AQCAtNDcsNyArNDcsNyBAQCBnZW5rZXkoKVxcbiBcXHRcXHQke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAtb3V0Zm9ybSBkZXJcXG4gfVxcbiBcXG4tc2V0dXAoKVxcbitzZXR1cF9yc2EoKVxcbiB7XFxuIFxcdGxvY2FsIHRtcF9kaXI9XFxcIiQxXFxcIlxcbiBcXG5AQCAtNTcsNiArNTcsNTcgQEAgc2V0dXAoKVxcbiBcXHRrZXljdGwgbGluayAka2V5X2lkICRrZXlyaW5nX2lkXFxuIH1cXG4gXFxuK21sZHNhX3N1cHBvcnRlZCgpXFxuK3tcXG4rXFx0bG9jYWwgdG1wX2Rpcj1cXFwiJDFcXFwiXFxuK1xcbitcXHRnZW5rZXlfbWxkc2EgXFxcIiR7dG1wX2Rpcn1cXFwiIHx8IHJldHVybiAxXFxuK1xcdDogXFx1MDAzZSAke3RtcF9kaXJ9L3Byb2JlXFxuK1xcdCMgU2FtZSBkaWdlc3QgYXMgdGhlIGNhbGxlciBzaWducyB3aXRoLCBzZWUgc2lnbl9idWZfZGlnZXN0KCkuXFxuK1xcdC4vc2lnbi1maWxlIC1kIHNoYTUxMiAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcXFxcXFxuK1xcdFxcdCR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtICR7dG1wX2Rpcn0vcHJvYmUgfHwgcmV0dXJuIDFcXG4rXFx0cm0gLWYgJHt0bXBfZGlyfS9wcm9iZSAke3RtcF9kaXJ9L3Byb2JlLnA3c1xcbit9XFxuK1xcbitnZW5rZXlfbWxkc2EoKVxcbit7XFxuK1xcdGxvY2FsIHRtcF9kaXI9XFxcIiQxXFxcIlxcbitcXG4rXFx0ZWNobyBcXFwiJHt4NTA5X2dlbmtleV9jb250ZW50fVxcXCIgXFx1MDAzZSAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5XFxuK1xcbitcXHQjIE5vIC1cXHUwMDNjZGlnZXN0XFx1MDAzZSBoZXJlOiBNTC1EU0EgaGFzaGVzIHRoZSBtZXNzYWdlIGl0c2VsZiwgYW5kIG9wZW5zc2xcXG4rXFx0IyByZWplY3RzIGFuIGV4cGxpY2l0IGRpZ2VzdCBmb3IgaXQuXFxuK1xcdG9wZW5zc2wgcmVxIC1uZXcgLW5vZGVzIC11dGY4IC1kYXlzIDM2NTAwIFxcXFxcXG4rXFx0XFx0XFx0LWJhdGNoIC14NTA5IC1uZXdrZXkgTUwtRFNBLTg3IFxcXFxcXG4rXFx0XFx0XFx0LWNvbmZpZyAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5IFxcXFxcXG4rXFx0XFx0XFx0LW91dGZvcm0gUEVNIC1vdXQgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gXFxcXFxcbitcXHRcXHRcXHQta2V5b3V0ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIDJcXHUwMDNlXFx1MDAyNjFcXG4rXFxuK1xcdG9wZW5zc2wgeDUwOSAtaW4gJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gLW91dCBcXFxcXFxuK1xcdFxcdCR7dG1wX2Rpcn0vc2lnbmluZ19rZXkuZGVyIC1vdXRmb3JtIGRlclxcbit9XFxuK1xcbittbGRzYV9za2lwKClcXG4re1xcbitcXHRsb2NhbCB0bXBfZGlyPVxcXCIkMVxcXCJcXG4rXFxuK1xcdHJtIC1mICR7dG1wX2Rpcn0veDUwOS5nZW5rZXkgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gXFxcXFxcbitcXHRcXHQke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAke3RtcF9kaXJ9L3Byb2JlIFxcXFxcXG4rXFx0XFx0JHt0bXBfZGlyfS9wcm9iZS5wN3NcXG4rXFx0ZXhpdCA3N1xcbit9XFxuK1xcbitzZXR1cF9tbGRzYSgpXFxuK3tcXG4rXFx0bG9jYWwgdG1wX2Rpcj1cXFwiJDFcXFwiXFxuK1xcbitcXHRtbGRzYV9zdXBwb3J0ZWQgXFxcIiR7dG1wX2Rpcn1cXFwiIHx8IG1sZHNhX3NraXAgXFxcIiR7dG1wX2Rpcn1cXFwiXFxuK1xcdGtleV9pZD0kKGNhdCAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciB8XFxuK1xcdFxcdCBrZXljdGwgcGFkZCBhc3ltbWV0cmljIGVicGZfdGVzdGluZ19rZXkgQHMpXFxuK1xcdGtleXJpbmdfaWQ9JChrZXljdGwgbmV3cmluZyBlYnBmX3Rlc3Rpbmdfa2V5cmluZyBAcylcXG4rXFx0a2V5Y3RsIGxpbmsgJGtleV9pZCAka2V5cmluZ19pZFxcbit9XFxuK1xcbiBjbGVhbnVwKCkge1xcbiBcXHRsb2NhbCB0bXBfZGlyPVxcXCIkMVxcXCJcXG4gXFxuQEAgLTkxLDcgKzE0Miw3IEBAIGNhdGNoKClcXG4gXFx0bG9jYWwgZXhpdF9jb2RlPVxcXCIkMVxcXCJcXG4gXFx0bG9jYWwgbG9nX2ZpbGU9XFxcIiQyXFxcIlxcbiBcXG4tXFx0aWYgW1sgXFxcIiR7ZXhpdF9jb2RlfVxcXCIgLW5lIDAgXV07IHRoZW5cXG4rXFx0aWYgW1sgXFxcIiR7ZXhpdF9jb2RlfVxcXCIgLW5lIDAgXFx1MDAyNlxcdTAwMjYgXFxcIiR7ZXhpdF9jb2RlfVxcXCIgLW5lIDc3IF1dOyB0aGVuXFxuIFxcdFxcdGNhdCBcXFwiJHtsb2dfZmlsZX1cXFwiIFxcdTAwM2VcXHUwMDI2M1xcbiBcXHRmaVxcbiBcXG5AQCAtMTA4LDggKzE1OSwxMCBAQCBtYWluKClcXG4gXFxuIFxcdFtbICEgLWQgXFxcIiR7dG1wX2Rpcn1cXFwiIF1dIFxcdTAwMjZcXHUwMDI2IGVjaG8gXFxcIkRpcmVjdG9yeSAke3RtcF9kaXJ9IGRvZXNuJ3QgZXhpc3RcXFwiIFxcdTAwMjZcXHUwMDI2IGV4aXQgMVxcbiBcXG4tXFx0aWYgW1sgXFxcIiR7YWN0aW9ufVxcXCIgPT0gXFxcInNldHVwXFxcIiBdXTsgdGhlblxcbi1cXHRcXHRzZXR1cCBcXFwiJHt0bXBfZGlyfVxcXCJcXG4rXFx0aWYgW1sgXFxcIiR7YWN0aW9ufVxcXCIgPT0gXFxcInNldHVwLXJzYVxcXCIgXV07IHRoZW5cXG4rXFx0XFx0c2V0dXBfcnNhIFxcXCIke3RtcF9kaXJ9XFxcIlxcbitcXHRlbGlmIFtbIFxcXCIke2FjdGlvbn1cXFwiID09IFxcXCJzZXR1cC1tbGRzYVxcXCIgXV07IHRoZW5cXG4rXFx0XFx0c2V0dXBfbWxkc2EgXFxcIiR7dG1wX2Rpcn1cXFwiXFxuIFxcdGVsaWYgW1sgXFxcIiR7YWN0aW9ufVxcXCIgPT0gXFxcImdlbmtleVxcXCIgXV07IHRoZW5cXG4gXFx0XFx0Z2Vua2V5IFxcXCIke3RtcF9kaXJ9XFxcIlxcbiBcXHRlbGlmIFtbIFxcXCIke2FjdGlvbn1cXFwiID09IFxcXCJjbGVhbnVwXFxcIiBdXTsgdGhlblxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdm10ZXN0LnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaFxcbmluZGV4IDZhM2QwMjZkNzZiZDYuLmU3ZTBiNDE5YTBiODcgMTAwNzU1XFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2hcXG5AQCAtMTA3LDYgKzEwNywxNCBAQCBPcHRpb25zOlxcbiBcXHQtcylcXHRcXHRJbnN0ZWFkIG9mIHBvd2VyaW5nIG9mZiB0aGUgVk0sIHN0YXJ0IGFuIGludGVyYWN0aXZlXFxuIFxcdFxcdFxcdHNoZWxsLiBJZiBcXHUwMDNjY29tbWFuZFxcdTAwM2UgaXMgc3BlY2lmaWVkLCB0aGUgc2hlbGwgcnVucyBhZnRlclxcbiBcXHRcXHRcXHR0aGUgY29tbWFuZCBmaW5pc2hlcyBleGVjdXRpbmdcXG4rXFxuK0Vudmlyb25tZW50IHZhcmlhYmxlczpcXG4rXFxuK1xcdEtFUk5FTF9DTURMSU5FX0VYVFJBXFxuK1xcdFxcdFxcdEV4dHJhIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhlIGd1ZXN0IGtlcm5lbCBjb21tYW5kXFxuK1xcdFxcdFxcdGxpbmUsIGZvciB0ZXN0cyB0aGF0IG5lZWQgYSBib290LXRpbWUgc2V0dGluZy4gZS5nOlxcbitcXG4rXFx0ICBLRVJORUxfQ01ETElORV9FWFRSQT1cXFwiYnBmLmtleXJpbmdfdW5zZWFsZWQ9MVxcXCIgJDAgLS0gLi90ZXN0X3Byb2dzIC10IHNpZ25lZF9sb2FkZXJcXG4gRU9GXFxuIH1cXG4gXFxuQEAgLTI4Niw2ICsyOTQsMTIgQEAgRU9GXFxuIFxcdFxcdFFFTVVfRkxBR1M9KFxcXCIke0hPU1RfRkxBR1NbQF19XFxcIilcXG4gXFx0ZmlcXG4gXFxuK1xcdGxvY2FsIGtlcm5lbF9jbWRsaW5lPVxcXCJyb290PS9kZXYvdmRhIHJ3IGNvbnNvbGU9JHtRRU1VX0NPTlNPTEV9XFxcIlxcbitcXG4rXFx0aWYgW1sgLW4gXFxcIiR7S0VSTkVMX0NNRExJTkVfRVhUUkE6LX1cXFwiIF1dOyB0aGVuXFxuK1xcdFxcdGtlcm5lbF9jbWRsaW5lKz1cXFwiICR7S0VSTkVMX0NNRExJTkVfRVhUUkF9XFxcIlxcbitcXHRmaVxcbitcXG4gXFx0JHtRRU1VX0JJTkFSWX0gXFxcXFxcbiBcXHRcXHQtbm9kZWZhdWx0cyBcXFxcXFxuIFxcdFxcdC1kaXNwbGF5IG5vbmUgXFxcXFxcbkBAIC0yOTQsNyArMzA4LDcgQEAgRU9GXFxuIFxcdFxcdC1tIDRHIFxcXFxcXG4gXFx0XFx0LWRyaXZlIGZpbGU9XFxcIiR7cm9vdGZzX2ltZ31cXFwiLGZvcm1hdD1yYXcsaW5kZXg9MSxtZWRpYT1kaXNrLGlmPXZpcnRpbyxjYWNoZT1ub25lIFxcXFxcXG4gXFx0XFx0LWtlcm5lbCBcXFwiJHtrZXJuZWxfYnppbWFnZX1cXFwiIFxcXFxcXG4tXFx0XFx0LWFwcGVuZCBcXFwicm9vdD0vZGV2L3ZkYSBydyBjb25zb2xlPSR7UUVNVV9DT05TT0xFfVxcXCJcXG4rXFx0XFx0LWFwcGVuZCBcXFwiJHtrZXJuZWxfY21kbGluZX1cXFwiXFxuIH1cXG4gXFxuIGNvcHlfbG9ncygpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE0OjU1OjA4Ljc1NjExMDU0OVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjk2Njc4MjUxNDM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktFWVNcIixcbiAgICBcIkJQRl9TWVNDQUxMXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX2xvb2t1cF9rZXlyaW5nXCIsXG4gICAgXCJicGZfa2V5cmluZ19lbmZvcmNlZFwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgYC5icGZgIGtleXJpbmcgZm9yIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gYW5kIGEgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkYCBib290IHBhcmFtZXRlci4gSXQgbW9kaWZpZXMgdGhlIEJQRiBwcm9ncmFtIGxvYWRpbmcgYW5kIHZlcmlmaWNhdGlvbiBwYXRocyBpbiBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgdG8gaGFuZGxlIHRoZSBuZXcga2V5cmluZyBhbmQgZW5mb3JjZSBpdHMgdXNlIHdoZW4gY29uZmlndXJlZC4gVGhlc2UgY2hhbmdlcyBhZmZlY3QgdGhlIGBicGYoKWAgc3lzY2FsbCBwYXRoIGFuZCBpbnRyb2R1Y2UgbmV3IHJlYWNoYWJsZSBzdGF0ZSBhbmQgbG9naWMgdGhhdCBzaG91bGQgYmUgZnV6emVkLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZGV0ZXJtaW5lXG5pZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuXG5cbklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpblxueW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5XG51c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBleGFtaW5lIHRoZSBhY3R1YWwgc291cmNlIGNvZGUgYW5kIGNvbmZpcm0gYW55IGFzc3VtcHRpb25zLlxuXG5SZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOlxuLSBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBLY29uZmlnIGZpbGVzLCBvciBjb2RlIGNvbW1lbnRzLlxuLSBQdXJlbHkgZGVjb3JhdGl2ZSBjaGFuZ2VzLCBzdWNoIGFzIGxvZ2dpbmcgKGUuZy4sIHByX2VyciwgcHJpbnRrKSBvciB0cmFjZXBvaW50cy5cbi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LlxuLSBDb2RlIHBhdGhzIHRoYXQgYXJlIGltcG9zc2libGUgdG8gcmVhY2ggaW4gdmlydHVhbGl6ZWQgZW52aXJvbm1lbnRzIGxpa2UgR0NFIG9yIFFFTVUsXG4gIGV2ZW4gd2hlbiB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgaGFyZHdhcmUgKGUuZy4sIHVzYiBnYWRnZXQsIG1hYzgwMjExX2h3c2ltKS5cbi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gIGlvbmljLCBhbWRncHUpIHRoYXQgcmVxdWlyZSBwaHlzaWNhbCBQQ0llIGhhcmR3YXJlIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBEcml2ZXIgLnJlbW92ZSwgLnNodXRkb3duLCBvciBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzIChlLmcuLCBpZ2JfcmVtb3ZlKVxuICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuXG5cbklmIGl0IG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIGtlcm5lbCBsb2dpYywgZHJpdmVycywgb3IgYXJjaGl0ZWN0dXJlcywgdXNlIHlvdXIgY29kZSBzZWFyY2hcbnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLlxuXG5XaGVuIHJldHVybmluZyBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IE1VU1QgQUxTTzpcbjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuXG4gICBBdm9pZCBsaXN0aW5nIGdlbmVyaWMgaG90LXBhdGggZnVuY3Rpb25zIHRvIHByZXZlbnQgc2tld2VkIHRlc3QgZGlzdHJpYnV0aW9ucy5cbiAgIFByZWZlciBub24tc3RhdGljLCBub24taW5saW5lZCBBUEkgZW50cnlwb2ludCBmdW5jdGlvbnMgb3ZlciBpbnRlcm5hbCBzdGF0aWMgaGVscGVyIGZ1bmN0aW9uc1xuICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuXG4yLiBJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IHRlc3QgdGhpcyBuZXcvbW9kaWZpZWQgZmVhdHVyZS5cbiAgIEdvIGFuZCBsb29rIGludG8gdGhlIEtjb25maWcgZmlsZXMgYW5kIGNoZWNrIGZvciBpZmRlZnMgYXJvdW5kIHRoZSBjb2RlLCBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbiAgIEFsc28gY2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzXG4gICBuZWVkZWQgZm9yIEtidWlsZCB0byBjb21waWxlIHRoZSBjb2RlIHN0YXRpY2FsbHkgaW50byB2bWxpbnV4LiBMaXN0IHRoZW0gaW4gdGhlIEVuYWJsZUNvbmZpZ3NcbiAgIG91dHB1dCBhcnJheSwgYW5kIERPIE5PVCBhZGQgYSAnQ09ORklHXycgcHJlZml4IChlLmcuLCByZXR1cm4gXCJORVRfSVBWNFwiIGluc3RlYWQgb2YgXCJDT05GSUdfTkVUX0lQVjRcIikuXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0YjIzMmY4OTBjZTZmMTViYzc4YjU2NzUxZmI2OWM0MDRiMTc5ZGIwXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFR1ZSBBdWcgMjUgMTQ6NTU6MDcgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0XG5pbmRleCBlNDY0MzYzNGE5YjFiLi5lNzBmYjE1NzU3ZDQwIDEwMDY0NFxuLS0tIGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHRcbisrKyBiL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0XG5AQCAtNjY3LDYgKzY2NywyMiBAQCBLZXJuZWwgcGFyYW1ldGVyc1xuIFxuIFx0XHRcdFNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2Jvb3Rjb25maWcucnN0XG4gXG4rXHRicGYua2V5cmluZ191bnNlYWxlZD1cbitcdFx0XHRbQlBGXSBXaGVuIHNldCB0byAxLCBsZWF2ZSB0aGUgYnBmIGtleXJpbmcgdW5zZWFsZWRcbitcdFx0XHRhZnRlciBpbml0aWFsaXphdGlvbiBzbyB0aGF0IHVzZXJzcGFjZSBjYW4gcHJvdmlzaW9uXG4rXHRcdFx0a2V5cy4gT25jZSB0aGUga2V5cmluZyBpcyByZXN0cmljdGVkIGl0IGJlY29tZXMgYWN0aXZlXG4rXHRcdFx0YW5kIGNhbiBiZSB1c2VkIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLlxuK1xuK1x0XHRcdFNldHRpbmcgdGhpcyBhbHNvIG1lYW5zIHRoYXQgdGhlIGJwZiBrZXlyaW5nIGlzIHRoZVxuK1x0XHRcdG9ubHkgbm9uLXN5c3RlbSBrZXlyaW5nIGEgbG9hZGVyIG1heSBzZWxlY3QgZm9yIHRoZVxuK1x0XHRcdHJlc3Qgb2YgdGhlIGJvb3Q6IGNhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb25cbitcdFx0XHRrZXlyaW5ncyBhcmUgcmVmdXNlZCB3aXRoIC1FUEVSTSwgd2hldGhlciBvciBub3RcbitcdFx0XHRwcm92aXNpb25pbmcgYWN0dWFsbHkgY29tcGxldGVkLiBUaGUgc3lzdGVtIGtleXJpbmdzXG4rXHRcdFx0c3RheSBzZWxlY3RhYmxlLiBMZWF2aW5nIGl0IHVuc2V0IGtlZXBzIHRoZSBwcmlvclxuK1x0XHRcdGJlaGF2aW91ciwgd2hlcmUgYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyBpcyBhbGxvd2VkLlxuK1xuK1x0XHRcdFNlZSBEb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuK1xuIFx0YnR0di5jYXJkPVx0W0hXLFY0TF0gYnR0diAoYnQ4NDggKyBidDg3OCBiYXNlZCBncmFiYmVyIGNhcmRzKVxuIFx0YnR0di5yYWRpbz1cdE1vc3QgaW1wb3J0YW50IGluc21vZCBvcHRpb25zIGFyZSBhdmFpbGFibGUgYXNcbiBcdFx0XHRrZXJuZWwgYXJncyB0b28uXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuaW5kZXggZTczZWFhZWJkOGIxNS4uNmMwM2ZiNThiMTQ2NCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0XG4rKysgYi9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuQEAgLTI1NCwyMSArMjU0LDI1IEBAIHJldHVybmVkLiBPbmx5IGFmdGVyIHRoZSBwcm9ncmFtIGhhcyBmdWxseSBsb2FkZWQsIGF0IHRoZSBuZXh0IGhvb2tcbiAoYGBzZWN1cml0eV9icGZfcHJvZygpYGApLCBkb2VzIGBgQlBGX1NJR19WRVJJRklFRGBgIGNhcnJ5IGl0cyBmdWxsIG1lYW5pbmc6XG4gdmFsaWRseSBzaWduZWQgKmFuZCogZnVsbHkgdmVyaWZpZWQuXG4gXG4tQSBtb3JlIHJlYWxpc3RpYyBhZG1pc3Npb24gcG9saWN5IHRoYW4gXCJpcyBpdCBzaWduZWQgYXQgYWxsXCI6IGFjY2VwdCBwcm9ncmFtc1xuLXNpZ25lZCBieSBhIHN5c3RlbSBrZXlyaW5nLCBhY2NlcHQgYSB1c2VyLWtleXJpbmcgc2lnbmF0dXJlIG9ubHkgaWYgdGhlXG4ta2V5L2tleXJpbmcgaXQgd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhXG4tdGFtcGVyLWV2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlXG4tYXVkaXRhYmxlLiAoSWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbitBIG1vcmUgcmVhbGlzdGljIGFkbWlzc2lvbiBwb2xpY3kgdGhhbiBcImlzIGl0IHNpZ25lZCBhdCBhbGxcIjogYmFzZSB0cnVzdCBpblxuK3RoZSBicGYga2V5cmluZywgYWNjZXB0IGEgc3RhZ2luZyBzaWduYXR1cmUgb25seSB3aGlsZSB0aGUga2V5L2tleXJpbmcgdGhlXG4rcHJvZ3JhbSB3YXMgdmVyaWZpZWQgYWdhaW5zdCBpcyBvbiBhbiBleHBsaWNpdCBhbGxvd2xpc3QsIGFuZCBlbWl0IGEgdGFtcGVyLVxuK2V2aWRlbnQgcmVjb3JkIG9mIGV2ZXJ5IGRlY2lzaW9uIHNvIHRoYXQgZXZlbiBkZW5pZWQgYXR0ZW1wdHMgYXJlIGF1ZGl0YWJsZS5cbisoaWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbiBcbiAuLiBjb2RlLWJsb2NrOjogY1xuIFxuLSAgICAvKiBTZXJpYWxzIG9mIHVzZXIga2V5cy9rZXlyaW5ncyB3ZSBhZGRpdGlvbmFsbHkgdHJ1c3QuICovXG4rICAgIC8qXG4rICAgICAqIFNlcmlhbHMgb2YgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIHdlIGFyZSB3aWxsaW5nIHRvIHN0YWdlLiBFbXB0eVxuKyAgICAgKiBvbiBhIHN5c3RlbSB0aGF0IGhhcyBjb21taXR0ZWQgdG8gdGhlIGJwZiBrZXlyaW5nLCB3aGVyZSB0aGUga2VybmVsXG4rICAgICAqIHJlZnVzZXMgdGhlbSBhbnl3YXkuXG4rICAgICAqL1xuICAgICBzdHJ1Y3Qge1xuICAgICAgICAgICAgIF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfSEFTSCk7XG4gICAgICAgICAgICAgX190eXBlKGtleSwgX19zMzIpOyAgICAgICAgICAgICAvKiBrZXlyaW5nX3NlcmlhbCAqL1xuICAgICAgICAgICAgIF9fdHlwZSh2YWx1ZSwgX191OCk7XG4gICAgICAgICAgICAgX191aW50KG1heF9lbnRyaWVzLCA2NCk7XG4tICAgIH0gdHJ1c3RlZF91c2VyX2tleXMgU0VDKFwiLm1hcHNcIik7XG4rICAgIH0gc3RhZ2luZ19rZXlzIFNFQyhcIi5tYXBzXCIpO1xuIFxuICAgICAvKiBBdWRpdCBzdHJlYW0gY29uc3VtZWQgYnkgYSB1c2Vyc3BhY2UgbG9nZ2VyLiAqL1xuICAgICBzdHJ1Y3Qge1xuQEAgLTI5MSwxMSArMjk1LDE5IEBAIGF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4gICAgICAgICAgICAgaWYgKGtlcm5lbClcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgLyogdHJ1c3QgaW4ta2VybmVsIGxvYWRzICovXG4gXG4tICAgICAgICAgICAgaWYgKHZlcmRpY3QgIT0gQlBGX1NJR19WRVJJRklFRClcbisgICAgICAgICAgICBpZiAodmVyZGljdCAhPSBCUEZfU0lHX1ZFUklGSUVEKSB7XG4gICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgdmFsaWRseSBzaWduZWQgKi9cbi0gICAgICAgICAgICBlbHNlIGlmIChrdHlwZSA9PSBCUEZfU0lHX0tFWVJJTkdfVVNFUiBcdTAwMjZcdTAwMjZcbi0gICAgICAgICAgICAgICAgICAgICAhYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ0cnVzdGVkX3VzZXJfa2V5cywgXHUwMDI2c2VyaWFsKSlcbi0gICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5L2tleXJpbmcgbm90IGFsbG93bGlzdGVkICovXG4rICAgICAgICAgICAgfSBlbHNlIHN3aXRjaCAoa3R5cGUpIHtcbisgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19CVUlMVElOOlxuKyAgICAgICAgICAgIGNhc2UgQlBGX1NJR19LRVlSSU5HX0JQRjpcbisgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuKyAgICAgICAgICAgIGNhc2UgQlBGX1NJR19LRVlSSU5HX1VTRVI6XG4rICAgICAgICAgICAgICAgICAgICBpZiAoIWJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2c3RhZ2luZ19rZXlzLCBcdTAwMjZzZXJpYWwpKVxuKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07XG4rICAgICAgICAgICAgICAgICAgICBicmVhaztcbisgICAgICAgICAgICBkZWZhdWx0OlxuKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBrZXlyaW5nIG5vdCBpbiBwb2xpY3kgKi9cbisgICAgICAgICAgICB9XG4gXG4gICAgICAgICAgICAgZCA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2YXVkaXQsIHNpemVvZigqZCksIDApO1xuICAgICAgICAgICAgIGlmIChkKSB7XG5AQCAtMzA5LDYgKzMyMSwxMSBAQCBhdWRpdGFibGUuIChJbGx1c3RyYXRpdmUgLSBlcnJvciBjaGVja2luZyBlbGlkZWQuKVxuICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgIH1cbiBcbitTdWNoIGEgcG9saWN5IGlzIHdoYXQgbWFrZXMgYSBjYWxsZXItc3VwcGxpZWQga2V5cmluZyB1c2FibGUgYXQgYWxsIG9uIGEgc3lzdGVtXG4rdGhhdCBkb2VzIG5vdCBib290IHdpdGggYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGA6IHRoZSBhbGxvd2xpc3QgYm91bmRzIHdoaWNoXG4rc3RhZ2VkIGtleXMgY291bnQsIGFuZCB0aGUgTFNNIGl0c2VsZiBoYXMgdG8gcHJvdGVjdCB0aGVtIGZyb20gYmVpbmcgdGFtcGVyZWRcbit3aXRoLlxuK1xuIE9ic2VydmluZyBhIHZlcmlmaWVkIGxvYWQ6IGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgXG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiBcbkBAIC0zODEsOCArMzk4LDkgQEAgdGhhdCB2ZXJkaWN0IGNvdmVyZWQgYWxsIG9mIGl0cyBleGNsdXNpdmUgbWFwcywgcmVqZWN0aW5nIGFueSB0aGF0IGRpZCBub3QgLSBzb1xuIGEgZGVueS1ieS1kZWZhdWx0IGFkbWlzc2lvbiBwb2xpY3kgbmVlZHMgbm8gc2Vjb25kIGVuZm9yY2VtZW50IHBvaW50LiBVc2VcbiBgYHNlY3VyaXR5X2JwZl9wcm9nKClgYCB0byByZWNvcmQgb3IgZmluYWxseSBnYXRlIHRoZSB2ZXJpZmllZCBwcm9ncmFtcyBvbmNlXG4gdGhleSBjYXJyeSBhbiBpZC4gVGhlIGBgdmVyZGljdGBgLCBgYGtleXJpbmdfdHlwZWBgIGFuZCBgYGtleXJpbmdfc2VyaWFsYGAgZmllbGRzXG4tbGV0IGEgcG9saWN5IGRpc3Rpbmd1aXNoLCBmb3IgZXhhbXBsZSwgXCJ2ZXJpZmllZCBhbmQgc2lnbmVkIGJ5IGEgYnVpbHRpbiBrZXlcIlxuLWZyb20gXCJ2ZXJpZmllZCBieSBhIHVzZXIga2V5XCIuIEEgcG9saWN5IExTTSBzdWNoIGFzIElQRSBjb3VsZCBjb25zdW1lIHRoZSBzYW1lXG4rbGV0IGEgcG9saWN5IGRpc3Rpbmd1aXNoIFwidmVyaWZpZWQgYWdhaW5zdCB0aGUgb3BlcmF0b3IncyBicGYga2V5cmluZ1wiIGZyb21cbitcInZlcmlmaWVkIGFnYWluc3QgYSBrZXlyaW5nIHRoZSBsb2FkZXIgc3VwcGxpZWQgaXRzZWxmXCIsIHdoaWNoIGlzIHRoZVxuK2Rpc3RpbmN0aW9uIHRoYXQgbWF0dGVycyBtb3N0LiBBIHBvbGljeSBMU00gc3VjaCBhcyBJUEUgY291bGQgY29uc3VtZSB0aGUgc2FtZVxuIGhvb2tzIHRvIGVuZm9yY2Ugc3lzdGVtIHBvbGljeSB3aXRob3V0IHdyaXRpbmcgYW55IEJQRiwgdGhvdWdoIG5vbmUgaW1wbGVtZW50c1xuIHRoaXMgdG9kYXkuXG4gXG5AQCAtMzkwLDMzICs0MDgsMTU0IEBAIEtleXJpbmdzXG4gPT09PT09PT1cbiBcbiBgYGtleXJpbmdfaWRgYCBzZWxlY3RzIHRoZSB0cnVzdGVkIGtleXJpbmcgdGhlIFBLQ1MjNyBzaWduYXR1cmUgaXMgdmVyaWZpZWRcbi1hZ2FpbnN0LiBUaGUgd2VsbC1rbm93biBpZHMgYGAwYGAgKGJ1aWx0aW4pLCBgYFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkdgYFxuLWFuZCBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIHNlbGVjdCB0aGUgY29ycmVzcG9uZGluZyBzeXN0ZW0ga2V5cmluZ3M7XG4tYW55IG90aGVyIHZhbHVlIGlzIHRyZWF0ZWQgYXMgdGhlIHNlcmlhbCBvZiBhIHVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZy5cbi1UaGUga2V5cmluZyBpcyBsb29rZWQgdXAgZmlyc3QsIGJlZm9yZSB0aGUgc2lnbmF0dXJlIGJ5dGVzIGFyZSBleGFtaW5lZCwgc28gYVxuLXNpZ25hdHVyZSBuYW1pbmcgYSBub24tZXhpc3RlbnQga2V5cmluZyBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGEgZmFpbGVkXG4tdmVyaWZpY2F0aW9uIGFib3J0cyB0aGUgbG9hZCAtIHNvIGEgcHJvZ3JhbSB0aGF0IGxvYWRzIHN1Y2Nlc3NmdWxseSB3aXRoIGFcbi1zaWduYXR1cmUgYWx3YXlzIGhhcyBjb25zaXN0ZW50IGtleXJpbmcgZmllbGRzIHJlY29yZGVkLlxuK2FnYWluc3QuIEZvdXIgdmFsdWVzIGFyZSB3ZWxsLWtub3duOyBhbnl0aGluZyBlbHNlIGlzIHRha2VuIGFzIHRoZSBzZXJpYWwgb2YgYVxuK2NhbGxlci1zdXBwbGllZCB1c2VyIG9yIHNlc3Npb24ga2V5IG9yIGtleXJpbmc6XG4rXG4rLi4gbGlzdC10YWJsZTo6XG4rICAgOmhlYWRlci1yb3dzOiAxXG4rXG4rICAgKiAtIGBga2V5cmluZ19pZGBgXG4rICAgICAtIEtleXJpbmdcbisgICAqIC0gYGAwYGBcbisgICAgIC0gYnVpbHRpbiB0cnVzdGVkIGtleXJpbmdcbisgICAqIC0gYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGAgKGBgMWBgKVxuKyAgICAgLSBzZWNvbmRhcnkgdHJ1c3RlZCBrZXlyaW5nXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGAgKGBgMmBgKVxuKyAgICAgLSBwbGF0Zm9ybSBrZXlyaW5nXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgIChgYDNgYClcbisgICAgIC0gdGhlIGJwZiBrZXlyaW5nXG4rICAgKiAtIGFueXRoaW5nIGVsc2VcbisgICAgIC0gc2VyaWFsIG9mIGEgY2FsbGVyLXN1cHBsaWVkIHVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZ1xuK1xuK1RoZSBrZXlyaW5nIGlzIHJlc29sdmVkIGZpcnN0LCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBieXRlcyBhcmUgZXhhbWluZWQsIHNvIGFcbitzaWduYXR1cmUgbmFtaW5nIGEga2V5cmluZyB0aGF0IGNhbm5vdCBiZSB1c2VkIGlzIHJlamVjdGVkIHVwIGZyb250LCBhbmQgYVxuK2ZhaWxlZCB2ZXJpZmljYXRpb24gYWJvcnRzIHRoZSBsb2FkIC0gYSBwcm9ncmFtIHRoYXQgbG9hZHMgc3VjY2Vzc2Z1bGx5IHdpdGhcbithIHNpZ25hdHVyZSB0aGVyZWZvcmUgYWx3YXlzIGhhcyBjb25zaXN0ZW50IGtleXJpbmcgZmllbGRzIHJlY29yZGVkLlxuK1xuK1RoZSBicGYga2V5cmluZ1xuKy0tLS0tLS0tLS0tLS0tLVxuK1xuK0Egc3lzdGVtIGtleXJpbmcgbmVlZHMgYSBrZXJuZWwgcmVidWlsZCBvciBhIHZvdWNoZWQtZm9yIGVucm9sbG1lbnQgdG8gcm90YXRlIGFcbitrZXksIGFuZCBncmFudHMgQlBGLXNpZ25pbmcgdHJ1c3QgdG8ga2V5cyB0cnVzdGVkIGZvciBldmVyeXRoaW5nIGVsc2UgaW4gdGhlXG4ra2VybmVsIHRvby4gQSBjYWxsZXItc3VwcGxpZWQga2V5cmluZywgYXQgdGhlIG90aGVyIGV4dHJlbWUsIGlzIGZpbGxlZCBieSB0aGVcbit2ZXJ5IHByb2Nlc3MgdGhhdCBsb2FkcyB0aGUgcHJvZ3JhbSBhbmQgc28gY2FycmllcyBubyB0cnVzdCBvZiBpdHMgb3duLlxuK1xuK1RoZSBicGYga2V5cmluZyBmaWxscyB0aGF0IGdhcCBhbmQgaXMgdGhlIHRydXN0IGFuY2hvciB3aGljaCBhIHNpZ25lZCBCUEZcbitkZXBsb3ltZW50IHNob3VsZCBiZSBidWlsdCBvbiB0b3Agb2Y6IGEga2V5cmluZyBuYW1lZCBgYC5icGZgYCwgc2VsZWN0ZWQgd2l0aFxuK2BgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgLCB0aGF0IGFuIG9wZXJhdG9yIHByb3Zpc2lvbnMgYXQgYm9vdCB3aXRoIGEga2V5XG4rc2NvcGVkIHRvIEJQRiBwcm9ncmFtIGxvYWRpbmcgYW5kIG5vdGhpbmcgZWxzZSBpbiB0aGUga2VybmVsJ3MgdHJ1c3QgaGllcmFyY2h5LlxuK0l0IGlzIG93bmVkIGJ5IHRoZSBvcGVyYXRvciByYXRoZXIgdGhhbiBieSB0aGUgbG9hZGVyLCBhbmQgcm90YXRhYmxlIGFjcm9zcyBhXG4rcmVib290IHdpdGhvdXQgdG91Y2hpbmcgdGhlIGtlcm5lbCBpbWFnZS4gSXQgaXMgbW9kZWxsZWQgYWZ0ZXIgdGhlIGRtLXZlcml0eVxuK2tleXJpbmcgKHNlZSBgYGRtX3Zlcml0eS5rZXlyaW5nX3Vuc2VhbGVkPWBgKSBhbmQgcHJvdmlzaW9uZWQgdGhlIHNhbWUgd2F5OiBhblxuK2luaXRyZCBydW5zIHRoZSBgYGtleWN0bGBgIHN0ZXBzIGJlbG93IGJlZm9yZSBoYW5kaW5nIG9mZiB0byB0aGUgcm9vdGZzLlxuK1xuK1Byb3Zpc2lvbmluZ1xuK35+fn5+fn5+fn5+flxuK1xuK1RoZSBrZXlyaW5nIGlzIGNyZWF0ZWQgZHVyaW5nIGBgbGF0ZV9pbml0Y2FsbGBgIGFuZCBpcyAqKnNlYWxlZCBlbXB0eSoqIGJ5XG4rZGVmYXVsdDogaXQgY2FycmllcyBhIHJlamVjdC1hbGwgcmVzdHJpY3Rpb24sIHNvIG5vIGtleSBjYW4gZXZlciBiZSBhZGRlZCBhbmRcbitgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCBmYWlscyB3aXRoIGBgLUVOT0tFWWBgIGZvciB0aGUgd2hvbGUgYm9vdC5cbitcbitgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFgYCBsZWF2ZXMgaXQgdW5yZXN0cmljdGVkIGF0IGluaXQgc28gdGhlIGluaXRyZCBjYW5cbitwcm92aXNpb24gaXQuIFRoZSBrZXlyaW5nIGlzIG5vdCBsaW5rZWQgaW50byBhbnkgcHJvY2VzcyBrZXlyaW5nLCBzbyBpdCBpc1xuK2FkZHJlc3NlZCBieSB0aGUgc2VyaWFsIGBgL3Byb2Mva2V5c2BgIHJlcG9ydHMuIFN0ZXBzIHdvdWxkIGJlIGFzIGZvbGxvd3M6OlxuK1xuKyAgICBzZXJpYWw9MHgkKGF3ayAnJDggPT0gXCJrZXlyaW5nXCIgXHUwMDI2XHUwMDI2ICQ5ID09IFwiLmJwZjpcIiB7IHByaW50ICQxIH0nIC9wcm9jL2tleXMpXG4rXG4rICAgIGtleWN0bCBwYWRkIGFzeW1tZXRyaWMgXCJcIiAkc2VyaWFsIFx1MDAzYyBzaWduaW5nX2tleS5kZXJcbisgICAga2V5Y3RsIHJlc3RyaWN0X2tleXJpbmcgJHNlcmlhbFxuK1xuK0JvdGggc3RlcHMgYXJlIHJlcXVpcmVkOiB0aGUga2V5cmluZyBpcyBjb25zdWx0ZWQgb25seSBvbmNlIGl0IGlzICoqbm9uLWVtcHR5XG4rYW5kIHJlc3RyaWN0ZWQqKi4gQW4gdW5yZXN0cmljdGVkIGtleXJpbmcgaXMgaWdub3JlZCBldmVuIHdoZW4gaXQgaG9sZHMga2V5cyxcbitzbyBhIGhhbGYtcHJvdmlzaW9uZWQga2V5cmluZyBpcyBpbmVydCByYXRoZXIgdGhhbiBhIHdlYWtlciB0cnVzdCBhbmNob3IsIGFuZCBhXG4rbG9hZCBuYW1pbmcgaXQgZmFpbHMgd2l0aCBgYC1FTk9LRVlgYCBhbmQgYSB2ZXJpZmllciBsb2cuIFJlc3RyaWN0aW5nIGNhbm5vdFxuK2JlIHVuZG9uZS5cbitcbitNb3JlIHRoYW4gb25lIGtleSBpcyBlbnJvbGxlZCBieSByZXBlYXRpbmcgdGhlIGBga2V5Y3RsIHBhZGRgYCBzdGVwOyB0aGVcbityZXN0cmljdGlvbiBpcyBhcHBsaWVkIG9uY2UsIGFmdGVyIHRoZSBsYXN0IG9mIHRoZW06OlxuK1xuKyAgICBmb3Iga2V5IGluIC9ldGMvYnBmL2tleXMvKi5kZXI7IGRvXG4rICAgICAgICBrZXljdGwgcGFkZCBhc3ltbWV0cmljIFwiXCIgJHNlcmlhbCBcdTAwM2MgJGtleVxuKyAgICBkb25lXG4rXG4rICAgIGtleWN0bCByZXN0cmljdF9rZXlyaW5nICRzZXJpYWxcbisgICAga2V5Y3RsIHNob3cgJHNlcmlhbFxuK1xuK1RoZSByZXN0cmljdGlvbiBib3VuZHMgd2hhdCBjYW4gYmUgYWRkZWQsIG5ldmVyIHdoYXQgY2FuIGJlIHRha2VuIGF3YXkuIEEga2V5XG4rdGhhdCBpcyBhbHJlYWR5IGVucm9sbGVkIGNhbiBzdGlsbCBiZSB1bmxpbmtlZCwgYW5kIHRoZSBrZXlyaW5nIGNsZWFyZWQgb3JcbityZXZva2VkLCBieSBhbnl0aGluZyBydW5uaW5nIGFzIHJvb3QuIFRoYXQgZG9lcyBub3Qgd2Vha2VuIHRoZSBhbmNob3IsIHNpbmNlXG4rYSBrZXlyaW5nIGxlZnQgZW1wdHkgaXMgbm8gbG9uZ2VyIGNvbnN1bHRlZCBhbmQgYSBsb2FkIG5hbWluZyBpdCBmYWlscyB3aXRoXG4rYGAtRU5PS0VZYGAsIGJ1dCBpdCBkb2VzIHRha2Ugc2lnbmVkIGxvYWRpbmcgb3V0IHVudGlsIHRoZSBuZXh0IGJvb3QuIERyb3BwaW5nXG4rdGhlIHVzZXIgcGVybWlzc2lvbnMgdGhlIGtleXJpbmcgbm8gbG9uZ2VyIG5lZWRzIHdvdWxkIGNsb3NlIHRoYXQ7IGFzIGEgdGhpcmRcbitzdGVwIGluIHRoZSBpbml0cmQ6OlxuK1xuKyAgICBrZXljdGwgc2V0cGVybSAkc2VyaWFsIDB4MDgwMzAwMDBcbitcbitXaGF0IHJlbWFpbnMgaXMgYGBLRVlfUE9TX1NFQVJDSGBgIGZvciB0aGUgaW4ta2VybmVsIHNlYXJjaCBkdXJpbmcgdmVyaWZpY2F0aW9uLFxuK3BsdXMgYGBLRVlfVVNSX1ZJRVdgYCBhbmQgYGBLRVlfVVNSX1JFQURgYCBzbyB0aGUga2V5cmluZyBzdGF5cyB2aXNpYmxlIGluXG4rYGAvcHJvYy9rZXlzYGAgYW5kIGBga2V5Y3RsIHNob3dgYC5cbitcbitQcm92aXNpb25pbmcgaGFzIHRvIGNvbXBsZXRlIGJlZm9yZSBjb250cm9sIHBhc3NlcyB0byB0aGUgcm9vdGZzLiBUaGUga2V5cmluZ1xuK3Rha2VzIGFueSBudW1iZXIgb2Yga2V5cyBmb3IgYXMgbG9uZyBhcyBpdCBpcyB1bnJlc3RyaWN0ZWQsIHNvIGl0IGlzIHRoZVxuK3Jlc3RyaWN0aW9uIHRoYXQgYm91bmRzIHRoZSBlbnJvbGxlZCBzZXQsIG5vdCB0aGUgZmlyc3QgZW5yb2xsbWVudC4gQmVmb3JlXG4rdGhlIGluaXRyZCBoYW5kcyBvZmYgY29udHJvbCwgaXQgbXVzdCB0aGVyZWZvcmUgcmVzdHJpY3QgdGhlIGtleXJpbmcgYWZ0ZXJcbit0aGUgbGFzdCBlbnJvbGxtZW50LlxuK1xuK0VuZm9yY2VtZW50XG4rfn5+fn5+fn5+fn5cbitcbitgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFgYCBzdGF0ZXMgdGhhdCB0aGUgYnBmIGtleXJpbmcgaXMgKnRoZSogdHJ1c3QgYW5jaG9yIGZvclxuK3RoaXMgYm9vdCwgc28gaXQgZG9lcyBtb3JlIHRoYW4gdW5zZWFsLiBGcm9tIHRoZSBmaXJzdCBwcm9ncmFtIGxvYWQgb253YXJkcyBhXG4rY2FsbGVyLXN1cHBsaWVkIHVzZXIvc2Vzc2lvbiBrZXlyaW5nIGlzIHJlZnVzZWQgd2l0aCBgYC1FUEVSTWBgIGFuZCBhIHZlcmlmaWVyXG4rbG9nIG1lc3NhZ2UsIHdoZXRoZXIgb3Igbm90IHByb3Zpc2lvbmluZyBldmVyIGNvbXBsZXRlZC4gVGhlIHN5c3RlbSBrZXlyaW5nc1xuK3N0YXkgc2VsZWN0YWJsZS5cbitcbitFbmZvcmNlbWVudCBpcyByZWFkYWJsZSBhdCBgYC9zeXMvbW9kdWxlL2JwZi9wYXJhbWV0ZXJzL2tleXJpbmdfdW5zZWFsZWRgYCwgYW5kXG4rcmVhZC1vbmx5IHRoZXJlOiB0aGUgZmxhZyBpcyBgYF9fcm9fYWZ0ZXJfaW5pdGBgIGJlaGluZCBhIDA0NDQgcGFyYW1ldGVyLiBJdCBpc1xuK2Fsc28gZGVyaXZlZCBmcm9tIHRoZSBib290IGZsYWcgcmF0aGVyIHRoYW4gZnJvbSB0aGUga2V5cmluZydzIHJ1bnRpbWUgc3RhdGUsXG4rc28gdGhlcmUgaXMgbm8gd2luZG93IGVhcmx5IGluIGJvb3QgZHVyaW5nIHdoaWNoIGEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgaXNcbitzdGlsbCBhY2NlcHRlZC5cbitcbitDYWxsZXItc3VwcGxpZWQga2V5cmluZ3MgYXJlIGZvciBzdGFnaW5nXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuK1xuK0EgYGBrZXlyaW5nX2lkYGAgbmFtaW5nIGEgdXNlciBvciBzZXNzaW9uIGtleSBvciBrZXlyaW5nIGlzIGEgKnN0YWdpbmcqXG4rbWVjaGFuaXNtLCBub3QgYSB0cnVzdCBhbmNob3I6IGl0IGlzIGZpbGxlZCBieSB0aGUgc2FtZSB1c2Vyc3BhY2UgdGhhdCBsb2FkcyB0aGVcbitwcm9ncmFtLCBzbyB2ZXJpZnlpbmcgYWdhaW5zdCBpdCBlc3RhYmxpc2hlcyBvbmx5IHRoYXQgdGhlIGxvYWRlciBzaWduZWQgd2hhdCBpdFxuK2xvYWRlZC4gSXRzIHB1cnBvc2UgaXMgdG8gbGV0IHNvZnR3YXJlIGluc3RhbGxlZCBvbnRvIGEgcnVubmluZyBzeXN0ZW0gLSB3aG9zZVxuK3NpZ25pbmcga2V5IGlzIG5vdCBlbnJvbGxlZCBhbnl3aGVyZSB5ZXQgLSBydW4gc2lnbmVkIHVudGlsIHRoYXQga2V5IHJlYWNoZXMgdGhlXG4rYnBmIGtleXJpbmcgb24gdGhlIG5leHQgYm9vdC5cbitcbitBIHN5c3RlbSB0aGF0IGhhcyBjb21taXR0ZWQgdG8gdGhlIGJwZiBrZXlyaW5nIHJlZnVzZXMgdGhpcyBwYXRoIG91dHJpZ2h0IChzZWVcbitgRW5mb3JjZW1lbnRgXykuIEEgc3lzdGVtIHRoYXQgaGFzIG5vdCBjYW4gc3RpbGwgYWxsb3cgaXQsIGJ1dCBhIHBvbGljeSBtdXN0XG4rbmV2ZXIgdHJlYXQgYGBCUEZfU0lHX0tFWVJJTkdfVVNFUmBgIGFzIGVxdWl2YWxlbnQgdG8gdGhlIGJwZiBvciBzeXN0ZW1cbitrZXlyaW5nczsgaXQgc2hvdWxkIGFsbG93bGlzdCB0aGUgc3BlY2lmaWMgc2VyaWFscyBpdCBpcyB3aWxsaW5nIHRvIHN0YWdlIGFuZFxuK3BhaXIgdGhhdCB3aXRoIGEgQlBGIExTTSBwb2xpY3kgcHJvdGVjdGluZyB0aG9zZSBrZXlzIGZyb20gdGFtcGVyaW5nLCBhcyBpblxuK2BFbmZvcmNlbWVudCB2aWEgTFNNc2BfLlxuK1xuK1JlY29yZGVkIGZpZWxkc1xuKy0tLS0tLS0tLS0tLS0tLVxuIFxuIFR3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OlxuIFxuIGBga2V5cmluZ190eXBlYGAgKGBgZW51bSBicGZfc2lnX2tleXJpbmdgYClcbiAgICAgQ2xhc3NpZmllZCBwdXJlbHkgZnJvbSBgYGtleXJpbmdfaWRgYCB3aGVuZXZlciB0aGUgcHJvZ3JhbSBpcyBzaWduZWQ6XG4gICAgIGBgQlBGX1NJR19LRVlSSU5HX0JVSUxUSU5gYCwgYGBfU0VDT05EQVJZYGAsIGBgX1BMQVRGT1JNYGAgZm9yIHRoZSBzeXN0ZW1cbi0gICAga2V5cmluZ3MsIG9yIGBgX1VTRVJgYCBmb3IgYSB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXNcbi0gICAgYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgIGZvciBhbiB1bnNpZ25lZCBwcm9ncmFtLlxuKyAgICBrZXlyaW5ncywgYGBfQlBGYGAgZm9yIHRoZSBicGYga2V5cmluZywgb3IgYGBfVVNFUmBgIGZvciBhIGNhbGxlci1zdXBwbGllZFxuKyAgICB1c2VyL3Nlc3Npb24ga2V5cmluZy4gSXQgaXMgYGBCUEZfU0lHX0tFWVJJTkdfTk9ORWBgIGZvciBhbiB1bnNpZ25lZFxuKyAgICBwcm9ncmFtLlxuIFxuIGBga2V5cmluZ19zZXJpYWxgYCAoYGBzMzJgYClcbiAgICAgU2V0ICoqb25seSoqIG9uIGEgc3VjY2Vzc2Z1bCB2ZXJpZmljYXRpb24sIHRvIHRoZSBzZXJpYWwgb2YgdGhlXG4tICAgICoqdXNlci9zZXNzaW9uIGtleSBvciBrZXlyaW5nKiogdGhhdCBgYGtleXJpbmdfaWRgYCByZXNvbHZlZCB0byAtIHRoZVxuKyAgICAqKmNhbGxlci1zdXBwbGllZCBrZXkgb3Iga2V5cmluZyoqIHRoYXQgYGBrZXlyaW5nX2lkYGAgcmVzb2x2ZWQgdG8gLSB0aGVcbiAgICAgb2JqZWN0IHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkIGFnYWluc3QsIG5vdCB0aGUgaW5kaXZpZHVhbCBhc3ltbWV0cmljXG4gICAgIGtleSBpbnNpZGUgaXQgdGhhdCBtYXRjaGVkIHRoZSBzaWduZXIuIFBhc3NpbmdcbiAgICAgYGBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkdgYCwgZm9yIGV4YW1wbGUsIHJlY29yZHMgdGhlIHNlc3Npb24ga2V5cmluZydzXG4tICAgIHNlcmlhbC4gVGhlIHN5c3RlbSBrZXlyaW5ncyBhcmUgdHJ1c3RlZCBhcyBhIHdob2xlIGFuZCBleHBvc2Ugbm8gc2VyaWFsXG4tICAgIGhlcmUsIHNvIHRoZSBzZXJpYWwgaXMgYGAwYGAgZm9yIGJ1aWx0aW4sIHNlY29uZGFyeSBhbmQgcGxhdGZvcm1cbi0gICAgc2lnbmF0dXJlcywgYW5kIGBgMGBgIGZvciB1bnNpZ25lZCBwcm9ncmFtcy4gSW4gb3RoZXIgd29yZHMsIGEgbm9uLXplcm9cbi0gICAgYGBrZXlyaW5nX3NlcmlhbGBgIGlzIGV4YWN0bHkgXCJ2ZXJpZmllZCBhZ2FpbnN0IHRoZSB1c2VyIGtleS9rZXlyaW5nIHdpdGhcbi0gICAgdGhpcyBzZXJpYWxcIi5cbisgICAgc2VyaWFsLiBUaGUgc3lzdGVtIGtleXJpbmdzIGFuZCB0aGUgYnBmIGtleXJpbmcgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmRcbisgICAgZXhwb3NlIG5vIHNlcmlhbCBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciB0aGVtLCBhbmQgYGAwYGAgZm9yXG4rICAgIHVuc2lnbmVkIHByb2dyYW1zLiBBIG5vbi16ZXJvIGBga2V5cmluZ19zZXJpYWxgYCBpcyB0aGVyZWZvcmUgZXhhY3RseVxuKyAgICBcInZlcmlmaWVkIGFnYWluc3QgdGhlIGNhbGxlci1zdXBwbGllZCBrZXkva2V5cmluZyB3aXRoIHRoaXMgc2VyaWFsXCIsIHdoaWNoXG4rICAgIGlzIGV4YWN0bHkgdGhlIGNhc2UgYSBwb2xpY3kgaGFzIHRvIHNjcnV0aW5pc2UuXG4gXG4gLi4gbGlzdC10YWJsZTo6XG4gICAgOmhlYWRlci1yb3dzOiAxXG5AQCAtNDM2LDE2ICs1NzUsNDkgQEAgVHdvIGZpZWxkcyBhcmUgcmVjb3JkZWQgaW4gYGBwcm9nLVx1MDAzZWF1eC1cdTAwM2VzaWdgYCBmb3IgYW4gTFNNIHRvIGluc3BlY3Q6XG4gICAgKiAtIGBgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HYGBcbiAgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk1gYFxuICAgICAgLSBgYDBgYFxuLSAgICogLSBvdGhlciAoYSB1c2VyL3Nlc3Npb24ga2V5IHNlcmlhbClcbisgICAqIC0gYGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYGBcbisgICAgIC0gYGBCUEZfU0lHX0tFWVJJTkdfQlBGYGBcbisgICAgIC0gYGAwYGBcbisgICAqIC0gb3RoZXIgKGEgY2FsbGVyLXN1cHBsaWVkIGtleSBzZXJpYWwpXG4gICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYFxuICAgICAgLSBzZXJpYWwgb2YgdGhlIHJlc29sdmVkIGtleS9rZXlyaW5nXG4gXG4tUHJvZHVjaW5nIGEgc2lnbmVkIG9iamVjdFxuLT09PT09PT09PT09PT09PT09PT09PT09PT09XG4rUHJvZHVjaW5nIGFuZCBsb2FkaW5nIGEgc2lnbmVkIG9iamVjdFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbitcbitHZW5lcmF0aW5nIGEgc2lnbmluZyBrZXlcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbitcbitTaWduaW5nIGlzIGFsZ29yaXRobSBhZ25vc3RpYzogdGhlIGFsZ29yaXRobSBjb21lcyBmcm9tIHRoZSBYLjUwOSBjZXJ0aWZpY2F0ZVxuK2FuZCB0aGUgUEtDUyM3IGBgU2lnbmVySW5mb2BgLiBBbnl0aGluZyB0aGUgWC41MDkgYW5kIFBLQ1MjNyBwYXJzZXJzIHVuZGVyc3RhbmRcbit3b3JrcyB3aXRoIG5vIEJQRi1zaWRlIGNoYW5nZS4gQm90aCBleGFtcGxlcyBiZWxvdyByZWFkIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0XG4rY29uZmlnIGZyb20gYGB4NTA5LmdlbmtleWBgLCBmb3Igd2hpY2ggYGBjZXJ0cy94NTA5LmdlbmtleWBgIHNlcnZlcyBhcyBhXG4rdGVtcGxhdGUgKHNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL21vZHVsZS1zaWduaW5nLnJzdCkuIFJTQTo6XG4rXG4rICAgIG9wZW5zc2wgcmVxIC1uZXcgLW5vZGVzIC11dGY4IC1zaGEyNTYgLWRheXMgMzY1MDAgLWJhdGNoIC14NTA5IFxcXG4rICAgICAgICAgICAgLWNvbmZpZyB4NTA5LmdlbmtleSAtb3V0Zm9ybSBQRU0gXFxcbisgICAgICAgICAgICAtb3V0IHNpZ25pbmdfa2V5LnBlbSAta2V5b3V0IHNpZ25pbmdfa2V5LnBlbVxuKyAgICBvcGVuc3NsIHg1MDkgLWluIHNpZ25pbmdfa2V5LnBlbSAtb3V0Zm9ybSBkZXIgLW91dCBzaWduaW5nX2tleS5kZXJcbitcbitNTC1EU0EtODcgKEZJUFMtMjA0KSwgd2hpY2ggbmVlZHMgb3BlbnNzbCAzLjUgb3IgbGF0ZXIgYW5kIGBgQ09ORklHX0NSWVBUT19NTERTQWBgXG4raW4gdGhlIGtlcm5lbC4gTm90ZSB0aGUgYWJzZW5jZSBvZiBhIGRpZ2VzdCBvcHRpb246IE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2VcbitpdHNlbGYgYW5kIG9wZW5zc2wgcmVqZWN0cyBhbiBleHBsaWNpdCBkaWdlc3QgZm9yIGl0OjpcbitcbisgICAgb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLWRheXMgMzY1MDAgLWJhdGNoIC14NTA5IFxcXG4rICAgICAgICAgICAgLW5ld2tleSBNTC1EU0EtODcgLWNvbmZpZyB4NTA5LmdlbmtleSAtb3V0Zm9ybSBQRU0gXFxcbisgICAgICAgICAgICAtb3V0IHNpZ25pbmdfa2V5LnBlbSAta2V5b3V0IHNpZ25pbmdfa2V5LnBlbVxuKyAgICBvcGVuc3NsIHg1MDkgLWluIHNpZ25pbmdfa2V5LnBlbSAtb3V0Zm9ybSBkZXIgLW91dCBzaWduaW5nX2tleS5kZXJcbitcbitgYGJwZnRvb2xgYCBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgaW50ZXJuYWxseTogb3BlbnNzbCBiZWZvcmUgNC4wIGNhbm5vdCBjb21iaW5lXG4rTUwtRFNBIHdpdGggYGBDTVNfTk9BVFRSYGAsIHNvIGl0IGZhbGxzIGJhY2sgdG8gc2lnbmVkQXR0cnMsIHdoZXJlIG9ubHkgU0hBLTUxMlxuK2lzIHBlcm1pdHRlZC4gVGhpcyBtaXJyb3JzIHdoYXQgbW9kdWxlIHNpZ25pbmcgZG9lcyBhcyB3ZWxsLlxuK1xuK1NpZ25pbmdcbistLS0tLS0tXG4gXG4gYGBicGZ0b29sYGAgZ2VuZXJhdGVzIGFuZCBzaWducyBhIGxpZ2h0IHNrZWxldG9uIGluIG9uZSBzdGVwOjpcbiBcbi0gICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgXHUwMDNjcHJpdmF0ZV9rZXkucGVtXHUwMDNlIC1pIFx1MDAzY2NlcnRpZmljYXRlLng1MDlcdTAwM2UgXFxcbisgICAgYnBmdG9vbCBnZW4gc2tlbGV0b24gLUwgLVMgLWsgc2lnbmluZ19rZXkucGVtIC1pIHNpZ25pbmdfa2V5LmRlciBcXFxuICAgICAgICAgICAgIG9iai5icGYubyBcdTAwM2Ugb2JqLmxza2VsLmhcbiBcbiBgYC1MYGAgc2VsZWN0cyB0aGUgbGlnaHQtc2tlbGV0b24gKGBgZ2VuX2xvYWRlcmBgKSBiYWNrZW5kIGFuZCBgYC1TYGAgZW5hYmxlc1xuQEAgLTQ1NCwxMiArNjI2LDM2IEBAIHNpZ25pbmc7IGBgLWtgYCBhbmQgYGAtaWBgIHN1cHBseSB0aGUgc2lnbmluZyBrZXkgYW5kIGl0cyBYLjUwOSBjZXJ0aWZpY2F0ZS5cbiByZWNvbnN0cnVjdHMgLSBhbmQgYWxzbyBjb21wdXRlcyBgYGV4Y2xfcHJvZ19oYXNoYGAgYXMgdGhlIGRpZ2VzdCBvZiB0aGUgbG9hZGVyXG4gaW5zdHJ1Y3Rpb25zIHNvIHRoZSBtZXRhZGF0YSBtYXAgY2FuIGJlIGJvdW5kIHRvIHRoZSBsb2FkZXIuIFRoZSBzaWduYXR1cmUgYW5kXG4gaGFzaCBhcmUgZW1iZWRkZWQgaW4gdGhlIGdlbmVyYXRlZCBoZWFkZXI7IHRoZSBjZXJ0aWZpY2F0ZSBpcyB1c2VkIG9ubHkgZm9yXG4tc2lnbmluZyBhbmQgaXMgbm90IGluY2x1ZGVkLiBMb2FkaW5nIHRoZSBza2VsZXRvbiBwZXJmb3JtcyB0aGVcbi1jcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlLlxuK3NpZ25pbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC5cbitcbitMb2FkaW5nXG4rLS0tLS0tLVxuK1xuK1RoZSBnZW5lcmF0ZWQgc2tlbGV0b24gZXhwb3NlcyBgYGtleXJpbmdfaWRgYCwgd2hpY2ggc2VsZWN0cyB0aGUga2V5cmluZyB0aGVcbitrZXJuZWwgdmVyaWZpZXMgYWdhaW5zdC4gU2V0IGl0IGJldHdlZW4gb3BlbiBhbmQgbG9hZDsgbG9hZGluZyB0aGVuIHBlcmZvcm1zXG4rdGhlIGNyZWF0ZS9wb3B1bGF0ZS9mcmVlemUvbG9hZCBzZXF1ZW5jZSBkZXNjcmliZWQgYWJvdmU6OlxuIFxuLUF0IHJ1bnRpbWUgdGhlIHRydXN0ZWQgcHVibGljIGtleSBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGNob3NlbiBrZXlyaW5nIChmb3Jcbi1leGFtcGxlIGFkZGVkIHRvIHRoZSBzZXNzaW9uIGtleXJpbmcsIG9yIGJ1aWx0IGludG8gdGhlIGtlcm5lbCdzIGJ1aWx0aW4gdHJ1c3RlZFxuLWtleXJpbmcpIGZvciB2ZXJpZmljYXRpb24gdG8gc3VjY2VlZC5cbisgICAgc3RydWN0IG9iaiAqc2tlbCA9IG9ial9fb3BlbigpO1xuK1xuKyAgICBza2VsLVx1MDAzZWtleXJpbmdfaWQgPSAzOyAgICAgICAgICAgLyogVkVSSUZZX1VTRV9CUEZfS0VZUklORyAqL1xuKyAgICBlcnIgPSBvYmpfX2xvYWQoc2tlbCk7XG4rXG4rRm9yIHRoZSBzdGFnaW5nIGNhc2UgdGhlIHNhbWUgb2JqZWN0IGlzIGxvYWRlZCBhZ2FpbnN0IGEga2V5cmluZyB0aGUgY2FsbGVyXG4rcG9wdWxhdGVkIGl0c2VsZiwgd2hpY2ggb25seSB3b3JrcyBvbiBhIHN5c3RlbSB0aGF0IGhhcyBub3Qgc2V0XG4rYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGA6OlxuK1xuKyAgICAvKlxuKyAgICAgKiBTdGFnaW5nIG9ubHk6IHRoaXMga2V5cmluZyBpcyB1bmRlciB0aGUgbG9hZGVyJ3Mgb3duIGNvbnRyb2wgYW5kXG4rICAgICAqIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi4gU2VlIFwiQ2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIGFyZSBmb3JcbisgICAgICogc3RhZ2luZ1wiLlxuKyAgICAgKi9cbisgICAga2V5X2lkID0gYWRkX2tleShcImFzeW1tZXRyaWNcIiwgXCJcIiwgZGVyLCBkZXJfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rICAgIHNrZWwtXHUwMDNla2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbisgICAgZXJyID0gb2JqX19sb2FkKHNrZWwpO1xuK1xuK0VpdGhlciB3YXkgdGhlIHRydXN0ZWQgcHVibGljIGtleSBtdXN0IGFscmVhZHkgYmUgaW4gdGhlIGNob3NlbiBrZXlyaW5nIGZvclxuK3ZlcmlmaWNhdGlvbiB0byBzdWNjZWVkLiBGb3IgdGhlIGJwZiBrZXlyaW5nIHRoYXQgZW5yb2xsbWVudCBoYXBwZW5zIG9uY2UgYXRcbitib290LCBzZWUgYFByb3Zpc2lvbmluZ2BfLlxuIFxuIFVBUEkgcmVmZXJlbmNlXG4gPT09PT09PT09PT09PT1cbkBAIC00ODcsNiArNjgzLDEzIEBAIFVBUEkgcmVmZXJlbmNlXG4gICAgIFRoZSBtYXAgY29udGVudCBpcyBub3QgaGFzaGVkIHNlcGFyYXRlbHkgYXQgYWxsIC0gaXQgaXMgY292ZXJlZCwgYXMgYnl0ZXMsXG4gICAgIGJ5IHRoZSBwcm9ncmFtIHNpZ25hdHVyZS5cbiBcbitLZXJuZWwgY29tbWFuZCBsaW5lOlxuK1xuK2BgYnBmLmtleXJpbmdfdW5zZWFsZWQ9YGBcbisgICAgU2V0IHRvIGBgMWBgIHRvIGxlYXZlIHRoZSBicGYga2V5cmluZyB1bnNlYWxlZCBmb3IgcHJvdmlzaW9uaW5nLCBhbmQgdG8gbWFrZVxuKyAgICBpdCB0aGUgb25seSBub24tc3lzdGVtIGtleXJpbmcgYSBsb2FkZXIgbWF5IHNlbGVjdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGJvb3RcbisgICAgKHNlZSBgVGhlIGJwZiBrZXlyaW5nYF8pLlxuK1xuIE5vdGVzIGFuZCBsaW1pdGF0aW9uc1xuID09PT09PT09PT09PT09PT09PT09PT1cbiBcbkBAIC00OTUsMyArNjk4LDUgQEAgTm90ZXMgYW5kIGxpbWl0YXRpb25zXG4gICBleGNlZWQgaXQuXG4gLSBUaGUgbWV0YWRhdGEgY29udGFpbmVyIGlzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkgbWFwLCBhY2Nlc3NlZCB0aHJvdWdoXG4gICBgYG1hcF9kaXJlY3RfdmFsdWVfYWRkcmBgLlxuKy0gVGhlIGJwZiBrZXlyaW5nIG5lZWRzIGBgQ09ORklHX0tFWVNgYDsgd2l0aG91dCBpdCB0aGVyZSBpcyBubyBicGYga2V5cmluZ1xuKyAgYW5kIGBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgIG5ldmVyIHJlc29sdmVzLlxuZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYnBmLmggYi9pbmNsdWRlL2xpbnV4L2JwZi5oXG5pbmRleCBiM2NkMjhkOWUzYjU1Li41NzFmNzc5MmE1YzQxIDEwMDY0NFxuLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaFxuKysrIGIvaW5jbHVkZS9saW51eC9icGYuaFxuQEAgLTE3MzUsNiArMTczNSw3IEBAIGVudW0gYnBmX3NpZ19rZXlyaW5nIHtcbiBcdEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlksXG4gXHRCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk0sXG4gXHRCUEZfU0lHX0tFWVJJTkdfVVNFUixcbitcdEJQRl9TSUdfS0VZUklOR19CUEYsXG4gfTtcbiBcbiBzdHJ1Y3QgYnBmX3Byb2dfYXV4IHtcbkBAIC0zODE5LDYgKzM4MjAsOCBAQCBzdHJ1Y3QgYnBmX2tleSB7XG4gI2lmIGRlZmluZWQoQ09ORklHX0tFWVMpIFx1MDAyNlx1MDAyNiBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTClcbiBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF91c2VyX2tleShzMzIgc2VyaWFsLCB1NjQgZmxhZ3MpO1xuIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX3N5c3RlbV9rZXkodTY0IGlkKTtcbitzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpO1xuK2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZCk7XG4gdm9pZCBicGZfa2V5X3B1dChzdHJ1Y3QgYnBmX2tleSAqYmtleSk7XG4gaW50IGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpkYXRhX3AsXG4gXHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBicGZfZHlucHRyICpzaWdfcCxcbkBAIC0zODM5LDYgKzM4NDIsMTYgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZClcbiBcdHJldHVybiBOVUxMO1xuIH1cbiBcbitzdGF0aWMgaW5saW5lIHN0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcbit7XG4rXHRyZXR1cm4gTlVMTDtcbit9XG4rXG4rc3RhdGljIGlubGluZSBib29sIGJwZl9rZXlyaW5nX2VuZm9yY2VkKHZvaWQpXG4re1xuK1x0cmV0dXJuIGZhbHNlO1xuK31cbitcbiBzdGF0aWMgaW5saW5lIHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpXG4ge1xuIH1cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZlcmlmaWNhdGlvbi5oIGIvaW5jbHVkZS9saW51eC92ZXJpZmljYXRpb24uaFxuaW5kZXggZGVjN2YyYmVhYmZkNC4uMWNiNTlkZGRhMjUwOSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmhcbisrKyBiL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmhcbkBAIC0xOCw2ICsxOCwxNiBAQFxuICNkZWZpbmUgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklORyAoKHN0cnVjdCBrZXkgKikxVUwpXG4gI2RlZmluZSBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkcgICgoc3RydWN0IGtleSAqKTJVTClcbiBcbisvKlxuKyAqIFRoZSBpZCBvZiBCUEYncyBcIi5icGZcIiBrZXlyaW5nLCByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNwYWNlLiBJdCBpc1xuKyAqIGV4cGxpY2l0bHkgbm90IGEgc2VudGluZWwgbGlrZSB0aGUgdHdvIGFib3ZlIGFzIEJQRiByZXNvbHZlcyBpdCB0b1xuKyAqIHRoZSBrZXlyaW5nIGl0c2VsZiBhbmQgcGFzc2VzIHRoYXQsIHNvIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSBuZXZlclxuKyAqIHNlZXMgdGhpcyB2YWx1ZSwgYW5kIHN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKCkgbXVzdCBrZWVwIHJlamVjdGluZyBpdC5cbisgKiBMZWZ0IGFzIGEgcGxhaW4gaW50ZWdlciBzbyB0aGF0IGhhbmRpbmcgaXQgb3ZlciBhcyBAdHJ1c3RlZF9rZXlzIGRvZXNcbisgKiBub3QgY29tcGlsZS5cbisgKi9cbisjZGVmaW5lIFZFUklGWV9VU0VfQlBGX0tFWVJJTkdcdDNcbitcbiBzdGF0aWMgaW5saW5lIGludCBzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayh1NjQgaWQpXG4ge1xuIFx0aWYgKGlkIFx1MDAzZSAodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkcpXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9NYWtlZmlsZSBiL2tlcm5lbC9icGYvTWFrZWZpbGVcbmluZGV4IDkwMjU1ZDgwZTViZTYuLjlhOTJjMzQ4YmJkYTYgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL01ha2VmaWxlXG4rKysgYi9rZXJuZWwvYnBmL01ha2VmaWxlXG5AQCAtMjcsNiArMjcsOSBAQCBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IG9mZmxvYWQub1xuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gbmV0X25hbWVzcGFjZS5vXG4gb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSB0Y3gub1xuIGVuZGlmXG4raWZlcSAoJChDT05GSUdfS0VZUykseSlcbitvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGtleXMub1xuK2VuZGlmXG4gaWZlcSAoJChDT05GSUdfUEVSRl9FVkVOVFMpLHkpXG4gb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBzdGFja21hcC5vXG4gZW5kaWZcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2tleXMuYyBiL2tlcm5lbC9icGYva2V5cy5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjBjYjg1Mjk1Yzg5YVxuLS0tIC9kZXYvbnVsbFxuKysrIGIva2VybmVsL2JwZi9rZXlzLmNcbkBAIC0wLDAgKzEsNzIgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4rLyogQ29weXJpZ2h0IChjKSAyMDI2IElzb3ZhbGVudCAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvY3JlZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvZXJyLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9pbml0LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9rZXkuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21vZHVsZXBhcmFtLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9zbGFiLmhcdTAwM2VcbitcbisjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWFxuKyNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCBcImJwZi5cIlxuK1xuK3N0YXRpYyBzdHJ1Y3Qga2V5ICpicGZfa2V5cmluZztcbitcbitzdGF0aWMgYm9vbCBicGZfa2V5cmluZ191bnNlYWxlZCBfX3JvX2FmdGVyX2luaXQ7XG4rbW9kdWxlX3BhcmFtX25hbWVkKGtleXJpbmdfdW5zZWFsZWQsIGJwZl9rZXlyaW5nX3Vuc2VhbGVkLCBib29sLCAwNDQ0KTtcbitNT0RVTEVfUEFSTV9ERVNDKGtleXJpbmdfdW5zZWFsZWQsIFwiTGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkXCIpO1xuK1xuK2Jvb2wgYnBmX2tleXJpbmdfZW5mb3JjZWQodm9pZClcbit7XG4rXHRyZXR1cm4gYnBmX2tleXJpbmdfdW5zZWFsZWQ7XG4rfVxuK1xuK3N0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2tleSAqYmtleTtcbitcbitcdGlmICghYnBmX2tleXJpbmcpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWYgKCFSRUFEX09OQ0UoYnBmX2tleXJpbmctXHUwMDNla2V5cy5ucl9sZWF2ZXNfb25fdHJlZSkgfHxcbitcdCAgICAhUkVBRF9PTkNFKGJwZl9rZXlyaW5nLVx1MDAzZXJlc3RyaWN0X2xpbmspKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGJrZXkgPSBrbWFsbG9jX29iaigqYmtleSk7XG4rXHRpZiAoIWJrZXkpXG4rXHRcdHJldHVybiBOVUxMO1xuK1xuK1x0YmtleS1cdTAwM2VrZXkgPSBicGZfa2V5cmluZztcbitcdGJrZXktXHUwMDNlaGFzX3JlZiA9IGZhbHNlO1xuK1x0cmV0dXJuIGJrZXk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgX19pbml0IGJwZl9rZXlyaW5nX2luaXQodm9pZClcbit7XG4rXHRzdHJ1Y3Qga2V5ICprZXlyaW5nO1xuK1xuK1x0a2V5cmluZyA9IGtleXJpbmdfYWxsb2MoXCIuYnBmXCIsXG4rXHRcdFx0XHRHTE9CQUxfUk9PVF9VSUQsIEdMT0JBTF9ST09UX0dJRCxcbitcdFx0XHRcdGN1cnJlbnRfY3JlZCgpLCBLRVlfUE9TX1NFQVJDSCB8XG4rXHRcdFx0XHRLRVlfVVNSX1ZJRVcgfCBLRVlfVVNSX1JFQUQgfFxuK1x0XHRcdFx0S0VZX1VTUl9XUklURSB8IEtFWV9VU1JfU0VBUkNIIHxcbitcdFx0XHRcdEtFWV9VU1JfU0VUQVRUUiwgS0VZX0FMTE9DX05PVF9JTl9RVU9UQSxcbitcdFx0XHRcdE5VTEwsIE5VTEwpO1xuK1x0aWYgKElTX0VSUihrZXlyaW5nKSkge1xuK1x0XHRwcl9lcnIoXCJicGY6IGNhbm5vdCBhbGxvY2F0ZSBicGYga2V5cmluZzogJWxkXFxuXCIsXG4rXHRcdCAgICAgICBQVFJfRVJSKGtleXJpbmcpKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXHRpZiAoIWJwZl9rZXlyaW5nX3Vuc2VhbGVkIFx1MDAyNlx1MDAyNlxuK1x0ICAgIGtleXJpbmdfcmVzdHJpY3QobWFrZV9rZXlfcmVmKGtleXJpbmcsIHRydWUpLCBOVUxMLCBOVUxMKSkge1xuK1x0XHRwcl9lcnIoXCJicGY6IGNhbm5vdCBzZWFsIGJwZiBrZXlyaW5nXFxuXCIpO1xuK1x0XHRrZXlfcmV2b2tlKGtleXJpbmcpO1xuK1x0XHRrZXlfcHV0KGtleXJpbmcpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGJwZl9rZXlyaW5nID0ga2V5cmluZztcbitcdHJldHVybiAwO1xuK31cbitsYXRlX2luaXRjYWxsKGJwZl9rZXlyaW5nX2luaXQpO1xuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuaW5kZXggZTAzNmFlMjBiZjZiOS4uNTU4ZTUxOGFkMzEwOSAxMDA2NDRcbi0tLSBhL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jXG5AQCAtMjA5NzIsNiArMjA5NzIsMTQgQEAgaW50IGJwZl9maXh1cF9rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbixcbiBcdHJldHVybiAwO1xuIH1cbiBcbisvKlxuKyAqIFVwcGVyIGJvdW5kIG9uIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGJsb2IgcGFzc2VkIHdpdGggYSBwcm9ncmFtLiBDb21mb3J0YWJseVxuKyAqIGFib3ZlIHRoZSBsYXJnZXN0IHNpZ25hdHVyZSB0aGUga2VybmVsIGNhbiB2ZXJpZnksIGFuZCBmYXIgYmVsb3cgYW55dGhpbmdcbisgKiB0aGF0IHdvdWxkIG1ha2UgcmVqZWN0aW5nIGEgbG9hZCBleHBlbnNpdmUuIERlbGliZXJhdGVseSBhIGZpeGVkIG51bWJlciBzb1xuKyAqIHRoYXQgd2hhdCB0aGUgc3lzY2FsbCBhY2NlcHRzIGRvZXMgbm90IGRlcGVuZCBvbiBQQUdFX1NJWkUuXG4rICovXG4rI2RlZmluZSBCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkVcdCg2NCAqIDEwMjQpXG4rXG4gc3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuIHtcbiBcdHN3aXRjaCAoa2V5cmluZ19pZCkge1xuQEAgLTIwOTgxLDYgKzIwOTg5LDggQEAgc3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxuIFx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWTtcbiBcdGNhc2UgKHMzMikodW5zaWduZWQgbG9uZylWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkc6XG4gXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk07XG4rXHRjYXNlIFZFUklGWV9VU0VfQlBGX0tFWVJJTkc6XG4rXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfQlBGO1xuIFx0ZGVmYXVsdDpcbiBcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19VU0VSO1xuIFx0fVxuQEAgLTIxMDA5LDIxICsyMTAxOSwzMiBAQCBzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcbiBcdHU2NCBkYXRhX3N6O1xuIFx0aW50IGVyciA9IDA7XG4gXG4tXHQvKlxuLVx0ICogRG9uJ3QgYXR0ZW1wdCB0byB1c2Uga21hbGxvY19sYXJnZSBvciB2bWFsbG9jIGZvciBzaWduYXR1cmVzLlxuLVx0ICogUHJhY3RpY2FsIHNpZ25hdHVyZSBmb3IgQlBGIHByb2dyYW0gc2hvdWxkIGJlIGJlbG93IHRoaXMgbGltaXQuXG4tXHQgKi9cbiBcdGlmICghYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSB8fFxuLVx0ICAgIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4rXHQgICAgYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSBcdTAwM2UgQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFKVxuIFx0XHRyZXR1cm4gLUVJTlZBTDtcbi1cdGlmIChzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVx1MDAzZWtleXJpbmdfaWQpID09IDApXG4rXG4rXHRpZiAoIXN5c3RlbV9rZXlyaW5nX2lkX2NoZWNrKGF0dHItXHUwMDNla2V5cmluZ19pZCkpIHtcbiBcdFx0a2V5ID0gYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4tXHRlbHNlXG4tXHRcdGtleSA9IGJwZl9sb29rdXBfdXNlcl9rZXkoYXR0ci1cdTAwM2VrZXlyaW5nX2lkLCAwKTtcbitcdH0gZWxzZSB7XG4rXHRcdGlmIChhdHRyLVx1MDAzZWtleXJpbmdfaWQgIT0gVkVSSUZZX1VTRV9CUEZfS0VZUklORykge1xuK1x0XHRcdGlmIChicGZfa2V5cmluZ19lbmZvcmNlZCgpKSB7XG4rXHRcdFx0XHR2ZXJib3NlKGVudiwgXCJjYWxsZXItc3VwcGxpZWQga2V5cmluZyByZWZ1c2VkLCB1c2UgYnBmIGtleXJpbmdcXG5cIik7XG4rXHRcdFx0XHRyZXR1cm4gLUVQRVJNO1xuK1x0XHRcdH1cbitcdFx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4rXHRcdH0gZWxzZSB7XG4rXHRcdFx0a2V5ID0gYnBmX2xvb2t1cF9rZXlyaW5nKCk7XG4rXHRcdH1cbitcdH1cbiBcdGlmICgha2V5KSB7XG4tXHRcdHZlcmJvc2UoZW52LCBcImNhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcXG5cIixcbi1cdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuLVx0XHRyZXR1cm4gLUVJTlZBTDtcbitcdFx0aWYgKGF0dHItXHUwMDNla2V5cmluZ19pZCA9PSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XG4rXHRcdFx0dmVyYm9zZShlbnYsIFwidGhlIGJwZiBrZXlyaW5nIGlzIGVtcHR5IG9yIGhhcyBub3QgYmVlbiByZXN0cmljdGVkXFxuXCIpO1xuK1x0XHRcdHJldHVybiAtRU5PS0VZO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdHZlcmJvc2UoZW52LCBcImNhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcXG5cIixcbitcdFx0XHRcdGF0dHItXHUwMDNla2V5cmluZ19pZCk7XG4rXHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdH1cbiBcdH1cbiBcbiBcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplKTtcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9tYWluLmggYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbmluZGV4IDc4YjZlMGViYjg1ZDguLjkzMTVhMWRiMWY3YzIgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL21haW4uaFxuQEAgLTU3LDcgKzU3LDcgQEAgc3RhdGljIGlubGluZSB2b2lkICp1NjRfdG9fcHRyKF9fdTY0IHB0cilcbiBcdH0pXG4gXG4gI2RlZmluZSBFUlJfTUFYX0xFTlx0MTAyNFxuLSNkZWZpbmUgTUFYX1NJR19TSVpFXHQ0MDk2XG4rI2RlZmluZSBNQVhfU0lHX1NJWkVcdDE2Mzg0XG4gXG4gI2RlZmluZSBCUEZfVEFHX0ZNVFx0XCIlMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHglMDJoaHhcIlxuIFxuZGlmZiAtLWdpdCBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uYyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuaW5kZXggODg3MjZhNmRiNmQwZS4uMWI1NTAyZjQ4YWRkMCAxMDA2NDRcbi0tLSBhL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuKysrIGIvdG9vbHMvYnBmL2JwZnRvb2wvc2lnbi5jXG5AQCAtMTMwLDYgKzEzMCw5IEBAIF9fdTMyIHJlZ2lzdGVyX3Nlc3Npb25fa2V5KGNvbnN0IGNoYXIgKmtleV9kZXJfcGF0aClcbiBcbiBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcbiB7XG4rXHR1bnNpZ25lZCBpbnQgc2lnbmVyX2ZsYWdzID0gQ01TX05PQ0VSVFMgfCBDTVNfQklOQVJZIHwgQ01TX05PU01JTUVDQVAgfFxuK1x0XHRcdFx0ICAgIENNU19VU0VfS0VZSUQgfCBDTVNfTk9BVFRSO1xuK1x0Y29uc3QgRVZQX01EICpjbXNfZGlnZXN0ID0gRVZQX3NoYTI1NigpO1xuIFx0QklPICpiZF9pbiA9IE5VTEwsICpiZF9vdXQgPSBOVUxMO1xuIFx0RVZQX1BLRVkgKnByaXZhdGVfa2V5ID0gTlVMTDtcbiBcdENNU19Db250ZW50SW5mbyAqY21zID0gTlVMTDtcbkBAIC0xNjcsNiArMTcwLDIxIEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0XHRnb3RvIGNsZWFudXA7XG4gXHR9XG4gXG4rI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgXHUwMDNlPSAweDMwMDAwMDAwTCBcdTAwMjZcdTAwMjYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiBcdTAwM2MgMHg0MDAwMDAwMExcbitcdGlmIChFVlBfUEtFWV9pc19hKHByaXZhdGVfa2V5LCBcIk1MLURTQS00NFwiKSB8fFxuK1x0ICAgIEVWUF9QS0VZX2lzX2EocHJpdmF0ZV9rZXksIFwiTUwtRFNBLTY1XCIpIHx8XG4rXHQgICAgRVZQX1BLRVlfaXNfYShwcml2YXRlX2tleSwgXCJNTC1EU0EtODdcIikpIHtcbitcdFx0LypcbitcdFx0ICogTUwtRFNBICsgQ01TX05PQVRUUiBpcyBub3Qgc3VwcG9ydGVkIGJlZm9yZSBvcGVuc3NsLTQuMCwgc29cbitcdFx0ICogZmFsbCBiYWNrIHRvIHNpZ25lZEF0dHJzLiBNTC1EU0EgZG9lcyBpdHMgb3duIGhhc2hpbmcgYW5kXG4rXHRcdCAqIGlnbm9yZXMgdGhlIENNUyBkaWdlc3QsIGV4Y2VwdCB3aGVuIHNpZ25lZEF0dHJzIGFyZSB1c2VkLFxuK1x0XHQgKiB3aGVyZSBvbmx5IFNIQS01MTIgaXMgcGVybWl0dGVkLlxuK1x0XHQgKi9cbitcdFx0c2lnbmVyX2ZsYWdzIFx1MDAyNj0gfkNNU19OT0FUVFI7XG4rXHRcdGNtc19kaWdlc3QgPSBFVlBfc2hhNTEyKCk7XG4rXHR9XG4rI2VuZGlmXG4rXG4gXHRjbXMgPSBDTVNfc2lnbihOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLFxuIFx0XHQgICAgICAgQ01TX05PQ0VSVFMgfCBDTVNfUEFSVElBTCB8IENNU19CSU5BUlkgfCBDTVNfREVUQUNIRUQgfFxuIFx0XHRcdCAgICAgICBDTVNfU1RSRUFNKTtcbkBAIC0xNzUsOSArMTkzLDcgQEAgaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4gXHRcdGdvdG8gY2xlYW51cDtcbiBcdH1cbiBcbi1cdGlmICghQ01TX2FkZDFfc2lnbmVyKGNtcywgeDUwOSwgcHJpdmF0ZV9rZXksIEVWUF9zaGEyNTYoKSxcbi1cdFx0XHQgICAgIENNU19OT0NFUlRTIHwgQ01TX0JJTkFSWSB8IENNU19OT1NNSU1FQ0FQIHxcbi1cdFx0XHQgICAgIENNU19VU0VfS0VZSUQgfCBDTVNfTk9BVFRSKSkge1xuK1x0aWYgKCFDTVNfYWRkMV9zaWduZXIoY21zLCB4NTA5LCBwcml2YXRlX2tleSwgY21zX2RpZ2VzdCwgc2lnbmVyX2ZsYWdzKSkge1xuIFx0XHRlcnIgPSAtRUlOVkFMO1xuIFx0XHRnb3RvIGNsZWFudXA7XG4gXHR9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG5pbmRleCA1ZjFhM2JmYzA1NjlmLi4wNWIzZWU2NDI5MGZhIDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvTWFrZWZpbGVcbkBAIC02NjMsNyArNjYzLDcgQEAgJChUUlVOTkVSX0JQRl9MU0tFTFMpOiAlLmxza2VsLmg6ICUuYnBmLm8gJChCUEZUT09MKSB8ICQoVFJVTk5FUl9PVVRQVVQpXG4gXHR9KSBcdTAwMjZcdTAwMjYgXFxcbiBcdHJtIC1mICQkKFx1MDAzYzoubz0ubGxpbmtlZDEubykgJCQoXHUwMDNjOi5vPS5sbGlua2VkMi5vKSAkJChcdTAwM2M6Lm89LmxsaW5rZWQzLm8pXG4gXG4tJChUUlVOTkVSX0JQRl9MU0tFTFNfU0lHTkVEKTogJS5sc2tlbC5oOiAlLmJwZi5vICQoQlBGVE9PTCkgfCAkKFRSVU5ORVJfT1VUUFVUKVxuKyQoVFJVTk5FUl9CUEZfTFNLRUxTX1NJR05FRCk6ICUubHNrZWwuaDogJS5icGYubyAkKEJQRlRPT0wpICQoVkVSSUZJQ0FUSU9OX0NFUlQpIHwgJChUUlVOTkVSX09VVFBVVClcbiBcdCQoUSkkKGlmICQoUEVSTUlTU0lWRSksaWYgWyAhIC1mICQkXHUwMDNjIF07IHRoZW5cdFx0XHRcXFxuIFx0XHQkJChSTSkgJCRAO1x0XHRcdFx0XHRcdFxcXG4gXHRcdHByaW50ZiAnICAlLTEycyAlc1xcbicgJ1NLSVAtU0tFTCcgJyQkKG5vdGRpciAkJEApJyAxXHUwMDNlXHUwMDI2MjsgXFxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ1xuaW5kZXggZWE3MDQ0ZjMwYWRjMy4uMmVjMTUxMTdhYmI1MCAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbkBAIC01MSw2ICs1MSw4IEBAIENPTkZJR19JUFY2X1NFRzZfTFdUVU5ORUw9eVxuIENPTkZJR19JUFY2X1NJVD15XG4gQ09ORklHX0lQVjZfVFVOTkVMPXlcbiBDT05GSUdfS0VZUz15XG4rQ09ORklHX0NSWVBUT19NTERTQT15XG4rQ09ORklHX0NSWVBUT19TSEE1MTI9eVxuIENPTkZJR19MSVJDPXlcbiBDT05GSUdfTElWRVBBVENIPXlcbiBDT05GSUdfTFdUVU5ORUw9eVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xuaW5kZXggNzczODFkMzQ1NDM1Yy4uNjIwYTZkMjJhNzU5YyAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jXG5AQCAtMzIsMTEgKzMyLDIwIEBAIGVudW0ge1xuIFx0QlBGX1NJR19LRVlSSU5HX1NFQ09OREFSWSxcbiBcdEJQRl9TSUdfS0VZUklOR19QTEFURk9STSxcbiBcdEJQRl9TSUdfS0VZUklOR19VU0VSLFxuK1x0QlBGX1NJR19LRVlSSU5HX0JQRixcbiB9O1xuIFxuLXN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxuLVx0XHQgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsXG4tXHRcdCAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpXG4rI2RlZmluZSBCUEZfS0VZUklOR19CUEZcdFx0M1xuK1xuKy8qIHZlcmlmeV9zaWdfc2V0dXAuc2ggZXhpdHMgd2l0aCB0aGlzIHdoZW4gb3BlbnNzbCBjYW5ub3QgZG8gTUwtRFNBLiAqL1xuKyNkZWZpbmUgU0VUVVBfU0tJUFx0XHQoLTc3KVxuK1xuKy8qIEZJUFMtMjA0IE1MLURTQS04NyBzaWduYXR1cmUgc2l6ZSwgc2VlIGluY2x1ZGUvY3J5cHRvL21sZHNhLmguICovXG4rI2RlZmluZSBNTERTQTg3X1NJR05BVFVSRV9TSVpFXHQ0NjI3XG4rXG4rc3RhdGljIGludCBsb2FkX2xvYWRlcl9sb2coY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxuK1x0XHRcdCAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkLFxuK1x0XHRcdCAgIF9fdTMyIGZkX2FycmF5X2NudCwgY2hhciAqbG9nX2J1ZiwgX191MzIgbG9nX3N6KVxuIHtcbiBcdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4gXHRpbnQgZmQ7XG5AQCAtNDgsMTggKzU3LDMxIEBAIHN0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxuIFx0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcIkR1YWwgQlNEL0dQTFwiKTtcbiBcdGF0dHIucHJvZ19mbGFncyA9IEJQRl9GX1NMRUVQQUJMRTtcbiBcdGF0dHIuZmRfYXJyYXkgPSBwdHJfdG9fdTY0KFx1MDAyNm1hcF9mZCk7XG4rXHRhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDtcbiBcdGlmIChzaWcpIHtcbiBcdFx0YXR0ci5zaWduYXR1cmUgPSBwdHJfdG9fdTY0KHNpZyk7XG4gXHRcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaWdfc3o7XG4gXHRcdGF0dHIua2V5cmluZ19pZCA9IGtleXJpbmdfaWQ7XG4gXHR9XG4tXHRhdHRyLmZkX2FycmF5X2NudCA9IGZkX2FycmF5X2NudDtcbitcdGlmIChsb2dfYnVmKSB7XG4rXHRcdGF0dHIubG9nX2xldmVsID0gMTtcbitcdFx0YXR0ci5sb2dfYnVmID0gcHRyX3RvX3U2NChsb2dfYnVmKTtcbitcdFx0YXR0ci5sb2dfc2l6ZSA9IGxvZ19zejtcbitcdH1cbiBcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCJfX2xvYWRlci5wcm9nXCIsIHNpemVvZihcIl9fbG9hZGVyLnByb2dcIikpO1xuIFx0ZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuIFx0XHQgICAgIG9mZnNldG9mZW5kKHVuaW9uIGJwZl9hdHRyLCBrZXlyaW5nX2lkKSk7XG4gXHRyZXR1cm4gZmQgXHUwMDNjIDAgPyAtZXJybm8gOiBmZDtcbiB9XG4gXG4rc3RhdGljIGludCBsb2FkX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osIGludCBtYXBfZmQsXG4rXHRcdCAgICAgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCxcbitcdFx0ICAgICAgIF9fdTMyIGZkX2FycmF5X2NudClcbit7XG4rXHRyZXR1cm4gbG9hZF9sb2FkZXJfbG9nKGluc25zLCBpbnNuc19zeiwgbWFwX2ZkLCBzaWcsIHNpZ19zeiwga2V5cmluZ19pZCxcbitcdFx0XHQgICAgICAgZmRfYXJyYXlfY250LCBOVUxMLCAwKTtcbit9XG4rXG4gc3RhdGljIGludCBydW5fZ2VuX2xvYWRlcihjb25zdCB2b2lkICppbnNucywgX191MzIgaW5zbnNfc3osXG4gXHRcdFx0ICBjb25zdCB2b2lkICpkYXRhLCBfX3UzMiBkYXRhX3N6LFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqZXhjbCwgX191MzIgZXhjbF9zeixcbkBAIC0xNTYsMTIgKzE3OCwzMCBAQCBzdGF0aWMgaW50IHJ1bl9zZXR1cChjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmRpcilcbiBcdH1cbiBcdGlmICh3YWl0cGlkKHBpZCwgXHUwMDI2c3RhdHVzLCAwKSBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC1lcnJubztcbi1cdHJldHVybiAoV0lGRVhJVEVEKHN0YXR1cykgXHUwMDI2XHUwMDI2XG4tXHRcdFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgPyAwIDogLUVJTlZBTDtcbitcdGlmICghV0lGRVhJVEVEKHN0YXR1cykpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1x0cmV0dXJuIC1XRVhJVFNUQVRVUyhzdGF0dXMpO1xuIH1cbiBcbi1zdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4tXHRcdCAgICB2b2lkICpzaWcsIF9fdTMyICpzaWdfc3opXG4rc3RhdGljIHZvaWQgZ2Vua2V5X2Rpcl9maW5pKGNvbnN0IGNoYXIgKmRpcilcbit7XG4rXHRzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZpbGVzW10gPSB7XG4rXHRcdFwic2lnbmluZ19rZXkuZGVyXCIsIFwic2lnbmluZ19rZXkucGVtXCIsIFwieDUwOS5nZW5rZXlcIixcbitcdH07XG4rXHRjaGFyIHBhdGhbUEFUSF9NQVhdO1xuK1x0c2l6ZV90IGk7XG4rXG4rXHRpZiAoIWRpcilcbitcdFx0cmV0dXJuO1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgQVJSQVlfU0laRShmaWxlcyk7IGkrKykge1xuK1x0XHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiJXMvJXNcIiwgZGlyLCBmaWxlc1tpXSk7XG4rXHRcdHVubGluayhwYXRoKTtcbitcdH1cbitcdHJtZGlyKGRpcik7XG4rfVxuK1xuK3N0YXRpYyBpbnQgc2lnbl9idWZfZGlnZXN0KGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4rXHRcdFx0ICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6LCBjb25zdCBjaGFyICpkaWdlc3QpXG4ge1xuIFx0Y2hhciBkYXRhX3RtcGxbUEFUSF9NQVhdLCBrZXlbUEFUSF9NQVhdO1xuIFx0Y2hhciBzaWdwYXRoW1BBVEhfTUFYICsgc2l6ZW9mKFwiLnA3c1wiKV07XG5AQCAtMTc2LDYgKzIxNiw3IEBAIHN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcbiBcdGZkID0gbWtzdGVtcChkYXRhX3RtcGwpO1xuIFx0aWYgKGZkIFx1MDAzYyAwKVxuIFx0XHRyZXR1cm4gLWVycm5vO1xuK1x0c25wcmludGYoc2lncGF0aCwgc2l6ZW9mKHNpZ3BhdGgpLCBcIiVzLnA3c1wiLCBkYXRhX3RtcGwpO1xuIFx0aWYgKHdyaXRlKGZkLCBidWYsIGxlbikgIT0gKHNzaXplX3QpbGVuKSB7XG4gXHRcdGNsb3NlKGZkKTtcbiBcdFx0cmV0ID0gLUVJTztcbkBAIC0xOTAsNyArMjMxLDcgQEAgc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuIFx0fVxuIFx0aWYgKHBpZCA9PSAwKSB7XG4gXHRcdHNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksIFwiJXMvc2lnbmluZ19rZXkucGVtXCIsIGRpcik7XG4tXHRcdGV4ZWNscChcIi4vc2lnbi1maWxlXCIsIFwiLi9zaWduLWZpbGVcIiwgXCItZFwiLCBcInNoYTI1NlwiLFxuK1x0XHRleGVjbHAoXCIuL3NpZ24tZmlsZVwiLCBcIi4vc2lnbi1maWxlXCIsIFwiLWRcIiwgZGlnZXN0LFxuIFx0XHQgICAgICAga2V5LCBrZXksIGRhdGFfdG1wbCwgTlVMTCk7XG4gXHRcdGV4aXQoMSk7XG4gXHR9XG5AQCAtMjAwLDM0ICsyNDEsMzggQEAgc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcbi1cdHNucHJpbnRmKHNpZ3BhdGgsIHNpemVvZihzaWdwYXRoKSwgXCIlcy5wN3NcIiwgZGF0YV90bXBsKTtcbiBcdGlmIChzdGF0KHNpZ3BhdGgsIFx1MDAyNnN0KSBcdTAwM2MgMCkge1xuIFx0XHRyZXQgPSAtZXJybm87XG4gXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0aWYgKHN0LnN0X3NpemUgXHUwMDNlIChvZmZfdCkqc2lnX3N6KSB7XG4gXHRcdHJldCA9IC1FMkJJRztcbi1cdFx0Z290byBvdXRfc2lnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcdGZkID0gb3BlbihzaWdwYXRoLCBPX1JET05MWSk7XG4gXHRpZiAoZmQgXHUwMDNjIDApIHtcbiBcdFx0cmV0ID0gLWVycm5vO1xuLVx0XHRnb3RvIG91dF9zaWc7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0aWYgKHJlYWQoZmQsIHNpZywgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSkge1xuIFx0XHRjbG9zZShmZCk7XG4gXHRcdHJldCA9IC1FSU87XG4tXHRcdGdvdG8gb3V0X3NpZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXHRjbG9zZShmZCk7XG4gXHQqc2lnX3N6ID0gc3Quc3Rfc2l6ZTtcbi1vdXRfc2lnOlxuLVx0dW5saW5rKHNpZ3BhdGgpO1xuIG91dDpcbitcdHVubGluayhzaWdwYXRoKTtcbiBcdHVubGluayhkYXRhX3RtcGwpO1xuIFx0cmV0dXJuIHJldDtcbiB9XG4gXG4rc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuK1x0XHQgICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6KVxuK3tcbitcdHJldHVybiBzaWduX2J1Zl9kaWdlc3QoZGlyLCBidWYsIGxlbiwgc2lnLCBzaWdfc3osIFwic2hhMjU2XCIpO1xuK31cbitcbiBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIHtcbiBcdHN0cnVjdCB0ZXN0X3NpZ25lZF9sb2FkZXIgKnNrZWw7XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9vcHRzIGdvcHRzO1xuQEAgLTQ1Nyw3ICs1MDIsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfYnRmX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC01MjksNyArNTc0LDYgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyh2b2lkKVxuIFx0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7IDB4MzAsIDB4NDIsIDB4MTMsIDB4MzcsIH07XG4gXHRjaGFyIGxvZ19idWZbMTAyNF0gPSB7fTtcbiBcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbi1cdHVuaW9uIGJwZl9hdHRyIGF0dHI7XG4gXHRpbnQgZmQ7XG4gXG4gXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuQEAgLTUzOCwyMiArNTgyLDkgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2ZhaWx1cmVfbG9ncyh2b2lkKVxuIFx0XHQgKiBmYWlsdXJlIGlzIHJlcG9ydGVkIHRocm91Z2ggdGhlIHZlcmlmaWVyIGxvZy4gQSBwcmVzZW50LWJ1dC1cbiBcdFx0ICogaW52YWxpZCBzaWduYXR1cmUgaXMgcmVqZWN0ZWQgYW5kIHRoZSBsb2cgc2F5cyB3aHkuXG4gXHRcdCAqL1xuLVx0XHRtZW1zZXQoXHUwMDI2YXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTtcbi1cdFx0YXR0ci5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NZU0NBTEw7XG4tXHRcdGF0dHIuaW5zbnMgPSBwdHJfdG9fdTY0KGYuZ29wdHMuaW5zbnMpO1xuLVx0XHRhdHRyLmluc25fY250ID0gZi5nb3B0cy5pbnNuc19zeiAvIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pO1xuLVx0XHRhdHRyLmxpY2Vuc2UgPSBwdHJfdG9fdTY0KFwiRHVhbCBCU0QvR1BMXCIpO1xuLVx0XHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4tXHRcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChqdW5rKTtcbi1cdFx0YXR0ci5zaWduYXR1cmVfc2l6ZSA9IHNpemVvZihqdW5rKTtcbi1cdFx0YXR0ci5rZXlyaW5nX2lkID0gS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HO1xuLVx0XHRhdHRyLmxvZ19sZXZlbCA9IDE7XG4tXHRcdGF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7XG4tXHRcdGF0dHIubG9nX3NpemUgPSBzaXplb2YobG9nX2J1Zik7XG4tXHRcdG1lbWNweShhdHRyLnByb2dfbmFtZSwgXCJfX2xvYWRlci5wcm9nXCIsIHNpemVvZihcIl9fbG9hZGVyLnByb2dcIikpO1xuLVxuLVx0XHRmZCA9IHN5c2NhbGwoX19OUl9icGYsIEJQRl9QUk9HX0xPQUQsIFx1MDAyNmF0dHIsXG4tXHRcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuK1x0XHRmZCA9IGxvYWRfbG9hZGVyX2xvZyhmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbitcdFx0XHRcdCAgICAgc2l6ZW9mKGp1bmspLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDAsXG4rXHRcdFx0XHQgICAgIGxvZ19idWYsIHNpemVvZihsb2dfYnVmKSk7XG4gXHRcdEFTU0VSVF9MVChmZCwgMCwgXCJpbnZhbGlkIHNpZ25hdHVyZSByZWplY3RlZCBhdCBsb2FkXCIpO1xuIFx0XHRpZiAoZmQgXHUwMDNlPSAwKVxuIFx0XHRcdGNsb3NlKGZkKTtcbkBAIC01NzEsOCArNjAyLDkgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX3Rvb19sYXJnZSh2b2lkKVxuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbiBcdFx0Lypcbi1cdFx0ICogc2lnbmF0dXJlX3NpemUgYmV5b25kIHRoZSBrZXJuZWwncyBib3VuZCAoS01BTExPQ19NQVhfQ0FDSEVfU0laRSlcbi1cdFx0ICogaXMgcmVqZWN0ZWQgYmVmb3JlIHRoZSBidWZmZXIgaXMgcmVhZC5cbitcdFx0ICogc2lnbmF0dXJlX3NpemUgYmV5b25kIHRoZSBrZXJuZWwncyBib3VuZFxuK1x0XHQgKiAoQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFKSBpcyByZWplY3RlZCBiZWZvcmUgdGhlIGJ1ZmZlclxuK1x0XHQgKiBpcyByZWFkLlxuIFx0XHQgKi9cbiBcdFx0ZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCAtMSwganVuayxcbiBcdFx0XHRcdCA2NCBcdTAwM2NcdTAwM2MgMjAsIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMCk7XG5AQCAtNjI2LDYgKzY1OCwyNjggQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2JhZF9rZXlyaW5nKHZvaWQpXG4gXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbiB9XG4gXG4rc3RhdGljIGJvb2wga2V5cmluZ191bnNlYWxlZF9ib290KHZvaWQpXG4re1xuK1x0Y2hhciB2YWwgPSAwO1xuK1x0aW50IGZkO1xuK1xuK1x0ZmQgPSBvcGVuKFwiL3N5cy9tb2R1bGUvYnBmL3BhcmFtZXRlcnMva2V5cmluZ191bnNlYWxlZFwiLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgXHUwMDNjIDApXG4rXHRcdHJldHVybiBmYWxzZTtcbitcdGlmIChyZWFkKGZkLCBcdTAwMjZ2YWwsIDEpICE9IDEpXG4rXHRcdHZhbCA9IDA7XG4rXHRjbG9zZShmZCk7XG4rXHRyZXR1cm4gdmFsID09ICdZJyB8fCB2YWwgPT0gJzEnO1xuK31cbitcbitzdGF0aWMgaW50IGJwZl9rZXlyaW5nX2xvb2t1cChpbnQgKm5yX2tleXMpXG4re1xuK1x0Y2hhciBsaW5lWzUxMl0sIHR5cGVbMzJdLCBkZXNjWzY0XTtcbitcdGludCBzZXJpYWwgPSAtRU5PRU5UO1xuK1x0RklMRSAqZjtcbitcbitcdGYgPSBmb3BlbihcIi9wcm9jL2tleXNcIiwgXCJyXCIpO1xuK1x0aWYgKCFmKVxuK1x0XHRyZXR1cm4gLWVycm5vO1xuK1xuK1x0d2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHtcbitcdFx0dW5zaWduZWQgaW50IGhleDtcbitcdFx0Y2hhciAqc3VtO1xuK1xuK1x0XHRpZiAoc3NjYW5mKGxpbmUsIFwiJXggJSpzICUqcyAlKnMgJSpzICUqcyAlKnMgJTMxcyAlNjNzXCIsXG4rXHRcdFx0ICAgXHUwMDI2aGV4LCB0eXBlLCBkZXNjKSAhPSAzKVxuK1x0XHRcdGNvbnRpbnVlO1xuK1x0XHRpZiAoc3RyY21wKHR5cGUsIFwia2V5cmluZ1wiKSB8fCBzdHJjbXAoZGVzYywgXCIuYnBmOlwiKSlcbitcdFx0XHRjb250aW51ZTtcbitcbitcdFx0c2VyaWFsID0gKGludCloZXg7XG4rXHRcdGlmIChucl9rZXlzKSB7XG4rXHRcdFx0c3VtID0gc3Ryc3RyKGxpbmUsIFwiLmJwZjogXCIpO1xuK1x0XHRcdCpucl9rZXlzID0gIXN1bSB8fCAhc3RybmNtcChzdW0gKyA2LCBcImVtcHR5XCIsIDUpID9cbitcdFx0XHRcdCAgIDAgOiBhdG9pKHN1bSArIDYpO1xuK1x0XHR9XG4rXHRcdGJyZWFrO1xuK1x0fVxuK1x0ZmNsb3NlKGYpO1xuK1x0cmV0dXJuIHNlcmlhbDtcbit9XG4rXG4rc3RhdGljIGxvbmcga2V5Y3RsX3JldChpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZzIsIHVuc2lnbmVkIGxvbmcgYXJnMylcbit7XG4rXHRsb25nIHJldCA9IHN5c2NhbGwoX19OUl9rZXljdGwsIGNtZCwgYXJnMiwgYXJnMyk7XG4rXG4rXHRyZXR1cm4gcmV0IFx1MDAzYyAwID8gLWVycm5vIDogcmV0O1xuK31cbitcbisvKlxuKyAqIFdoYXQgdGhlIGJwZiBrZXlyaW5nIHN0aWxsIG5lZWRzIG9uY2UgaXQgZ290IHByb3Zpc2lvbmVkOiBLRVlfUE9TX1NFQVJDSFxuKyAqIGZvciB0aGUgaW4ta2VybmVsIHNlYXJjaCBkdXJpbmcgdmVyaWZpY2F0aW9uLCBhbmQgdGhlIHVzZXIgdmlldy9yZWFkIGJpdHNcbisgKiBzbyBpdCBzdGF5cyB2aXNpYmxlIGluIC9wcm9jL2tleXMsIHJlc3QgaXMgZHJvcHBlZCBzbyB0aGUgZW5yb2xsZWQgaXNcbisgKiB0aGVyZWZvcmUgZmluYWwuXG4rICovXG4rI2RlZmluZSBCUEZfS0VZUklOR19QRVJNX0xPQ0tFRFx0XHQweDA4MDMwMDAwXG4rLyogV2hhdCBicGZfa2V5cmluZ19pbml0KCkgZ3JhbnRzIGF0IGJvb3QuICovXG4rI2RlZmluZSBCUEZfS0VZUklOR19QRVJNX0lOSVRJQUxcdDB4MDgyZjAwMDBcbitcbitzdGF0aWMgdm9pZCBicGZfa2V5cmluZ19zZWFsZWQodm9pZClcbit7XG4rXHRzdGF0aWMgY29uc3QgX191OCBqdW5rWzY0XSA9IHt9O1xuK1x0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuK1x0aW50IHNlcmlhbCwga2V5LCBmZDtcbitcbitcdGlmIChrZXlyaW5nX3Vuc2VhbGVkX2Jvb3QoKSkge1xuK1x0XHRwcmludGYoXCIlczpTS0lQOnRoZSBicGYga2V5cmluZyB3YXMgdW5zZWFsZWQgYXQgYm9vdFxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0c2VyaWFsID0gYnBmX2tleXJpbmdfbG9va3VwKE5VTEwpO1xuK1x0aWYgKHNlcmlhbCBcdTAwM2U9IDApIHtcbitcdFx0a2V5ID0gc3lzY2FsbChfX05SX2FkZF9rZXksIFwidXNlclwiLCBcInNlYWxwcm9iZVwiLCBcInhcIiwgMSwgc2VyaWFsKTtcbitcdFx0aWYgKGtleSBcdTAwM2U9IDApXG4rXHRcdFx0c3lzY2FsbChfX05SX2tleWN0bCwgS0VZQ1RMX1VOTElOSywga2V5LCBzZXJpYWwpO1xuK1x0XHRBU1NFUlRfRVEoa2V5IFx1MDAzYyAwID8gLWVycm5vIDogMCwgLUVQRVJNLFxuK1x0XHRcdCAgXCJub3RoaW5nIGxpbmtzIGludG8gYSBzZWFsZWQga2V5cmluZ1wiKTtcbitcdH1cbitcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKSB7XG4rXHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4rXHRcdFx0XHQgc2l6ZW9mKGp1bmspLCBCUEZfS0VZUklOR19CUEYsIDApO1xuK1x0XHRBU1NFUlRfRVEoZmQsIC1FTk9LRVksIFwic2VhbGVkIGJwZiBrZXlyaW5nIHJlamVjdGVkXCIpO1xuK1x0XHRpZiAoZmQgXHUwMDNlPSAwKVxuK1x0XHRcdGNsb3NlKGZkKTtcbitcdH1cbitcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuK31cbitcbitzdGF0aWMgaW50IHRyeV9sb2FkKGNvbnN0IHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgKmYsIGNvbnN0IHZvaWQgKnNpZyxcbitcdFx0ICAgIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCwgY2hhciAqbG9nX2J1ZiwgX191MzIgbG9nX3N6KVxuK3tcbitcdGludCBtYXBfZmQsIHByb2dfZmQ7XG4rXG4rXHRtYXBfZmQgPSBzZXR1cF9tZXRhX21hcChmKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCJtZXRhX21hcFwiKSlcbitcdFx0cmV0dXJuIG1hcF9mZDtcbitcdHByb2dfZmQgPSBsb2FkX2xvYWRlcl9sb2coZi1cdTAwM2Vnb3B0cy5pbnNucywgZi1cdTAwM2Vnb3B0cy5pbnNuc19zeiwgbWFwX2ZkLFxuK1x0XHRcdFx0ICBzaWcsIHNpZ19zeiwga2V5cmluZ19pZCwgMSwgbG9nX2J1ZiwgbG9nX3N6KTtcbitcdGNsb3NlKG1hcF9mZCk7XG4rXHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK1x0cmV0dXJuIHByb2dfZmQ7XG4rfVxuK1xuKy8qXG4rICogVGhpcyBuZWVkcyBicGYua2V5cmluZ191bnNlYWxlZD0xIG9uIHRoZSBndWVzdCBrZXJuZWwgY29tbWFuZCBsaW5lLCB3aGljaFxuKyAqIHZtdGVzdC5zaCBjYW4gcGFzcyB2aWEgS0VSTkVMX0NNRExJTkVfRVhUUkEuIFRoZXJlIGlzIG5vIHdheSB0byB1bnNlYWwgdGhlXG4rICoga2V5cmluZyBmcm9tIGhlcmUsIHNvIHdpdGhvdXQgaXQgdGhlIHRlc3Qgc2tpcHMuIEl0IGFsc28gb25seSB3b3JrcyBvbmNlXG4rICogcGVyIGJvb3QsIGFzIHJlc3RyaWN0aW5nIGEga2V5cmluZyBjYW5ub3QgYmUgdW5kb25lLlxuKyAqL1xuK3N0YXRpYyB2b2lkIGJwZl9rZXlyaW5nX3Byb3Zpc2lvbmVkKHZvaWQpXG4re1xuK1x0Y2hhciBkaXJfdG1wbFtdID0gXCIvdG1wL2JwZmtleXJpbmdYWFhYWFhcIjtcbitcdGNoYXIgYmFkX3RtcGxbXSA9IFwiL3RtcC9icGZrZXlyaW5nYmFkWFhYWFhYXCI7XG4rXHRfX3U4ICpzaWcgPSBOVUxMLCAqYmFkID0gTlVMTCwgKmJ1ZiA9IE5VTEw7XG4rXHRpbnQgc2VyaWFsLCBlcnI7XG4rXHRpbnQgbnJfa2V5cyA9IDAsIGRlcl9mZCA9IC0xO1xuK1x0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuK1x0X191MzIgc2lnX3N6ID0gODE5MiwgYmFkX3N6O1xuK1x0Ym9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTtcbitcdGNoYXIgKmRpciwgKmJhZF9kaXIgPSBOVUxMO1xuK1x0Y2hhciBsb2dfYnVmWzEwMjRdID0ge307XG4rXHRjaGFyIHBhdGhbUEFUSF9NQVhdO1xuK1x0X191OCBkZXJbNDA5Nl07XG4rXHRzc2l6ZV90IGRlcl9zejtcbitcbitcdHNlcmlhbCA9IGJwZl9rZXlyaW5nX2xvb2t1cChcdTAwMjZucl9rZXlzKTtcbitcdGlmIChzZXJpYWwgXHUwMDNjIDApIHtcbitcdFx0cHJpbnRmKFwiJXM6U0tJUDpubyBicGYga2V5cmluZyAobmVlZHMgQ09ORklHX0tFWVMpXFxuXCIsIF9fZnVuY19fKTtcbitcdFx0dGVzdF9fc2tpcCgpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXHRpZiAobnJfa2V5cyAhPSAwKSB7XG4rXHRcdHByaW50ZihcIiVzOlNLSVA6dGhlIGJwZiBrZXlyaW5nIGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlzaW9uZWRcXG5cIixcbitcdFx0ICAgICAgIF9fZnVuY19fKTtcbitcdFx0dGVzdF9fc2tpcCgpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwiZ2Vua2V5XCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cCBnZW5rZXlcIikpXG4rXHRcdGdvdG8gcm1kaXI7XG4rXG4rXHRzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFwiJXMvc2lnbmluZ19rZXkuZGVyXCIsIGRpcik7XG4rXHRkZXJfZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKGRlcl9mZCwgXCJvcGVuIHNpZ25pbmdfa2V5LmRlclwiKSlcbitcdFx0Z290byBybWRpcjtcbitcdGRlcl9zeiA9IHJlYWQoZGVyX2ZkLCBkZXIsIHNpemVvZihkZXIpKTtcbitcdGNsb3NlKGRlcl9mZCk7XG4rXHRpZiAoIUFTU0VSVF9HVChkZXJfc3osIDAsIFwicmVhZCBzaWduaW5nX2tleS5kZXJcIikpXG4rXHRcdGdvdG8gcm1kaXI7XG4rXG4rXHRlcnIgPSBzeXNjYWxsKF9fTlJfYWRkX2tleSwgXCJhc3ltbWV0cmljXCIsIFwiXCIsIGRlciwgKHNpemVfdClkZXJfc3osXG4rXHRcdCAgICAgIHNlcmlhbCk7XG4rXHRpZiAoZXJyIFx1MDAzYyAwIFx1MDAyNlx1MDAyNiBlcnJubyA9PSBFUEVSTSkge1xuK1x0XHRwcmludGYoXCIlczpTS0lQOnRoZSBicGYga2V5cmluZyBpcyBzZWFsZWQsIG5lZWQgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MVxcblwiLFxuK1x0XHQgICAgICAgX19mdW5jX18pO1xuK1x0XHR0ZXN0X19za2lwKCk7XG4rXHRcdGdvdG8gcm1kaXI7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwiYWRkIHRoZSBzaWduaW5nIGtleSB0byB0aGUgYnBmIGtleXJpbmdcIikpXG4rXHRcdGdvdG8gcm1kaXI7XG4rXG4rXHRzaWcgPSBtYWxsb2Moc2lnX3N6KTtcbitcdGlmICghQVNTRVJUX09LX1BUUihzaWcsIFwic2lnIGJ1ZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRoYXZlX2ZpeHR1cmUgPSB0cnVlO1xuK1x0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpICE9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcInNpZ25idWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0bWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7XG4rXHRtZW1jcHkoYnVmICsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osIHNpZyxcbitcdFx0XHRcdFx1MDAyNnNpZ19zeiksIFwic2lnbiBpbnNuc3x8bWV0YWRhdGFcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKHRyeV9sb2FkKFx1MDAyNmYsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLCAtRU5PS0VZLFxuK1x0XHQgIFwidW5yZXN0cmljdGVkIGtleXJpbmcgc3RpbGwgbm90IGNvbnN1bHRlZFwiKTtcbitcbitcdEFTU0VSVF9FUSh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBOVUxMLCAwKSxcbitcdFx0ICAtRVBFUk0sIFwiY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCBiZWZvcmUgcHJvdmlzaW9uaW5nXCIpO1xuK1xuK1x0aWYgKCFBU1NFUlRfT0soc3lzY2FsbChfX05SX2tleWN0bCwgS0VZQ1RMX1JFU1RSSUNUX0tFWVJJTkcsIHNlcmlhbCxcbitcdFx0XHQgICAgICAgTlVMTCwgTlVMTCksIFwicmVzdHJpY3QgYnBmIGtleXJpbmdcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQodHJ5X2xvYWQoXHUwMDI2Ziwgc2lnLCBzaWdfc3osIEJQRl9LRVlSSU5HX0JQRiwgTlVMTCwgMCksXG4rXHRcdFx0ICBcImxvYWQgc2lnbmVkIGJ5IGEga2V5IGluIHRoZSAuYnBmIGtleXJpbmdcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YmFkX2RpciA9IG1rZHRlbXAoYmFkX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJhZF9kaXIsIFwibWtkdGVtcCB1bmVucm9sbGVkXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcImdlbmtleVwiLCBiYWRfZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwIGdlbmtleSB1bmVucm9sbGVkXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGJhZF9zeiA9IDgxOTI7XG4rXHRiYWQgPSBtYWxsb2MoYmFkX3N6KTtcbitcdGlmICghQVNTRVJUX09LX1BUUihiYWQsIFwiYmFkIHNpZyBidWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfT0soc2lnbl9idWYoYmFkX2RpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICsgZi5kYXRhX3N6LCBiYWQsXG4rXHRcdFx0XHRcdTAwMjZiYWRfc3opLCBcInNpZ24gd2l0aCBhbiB1bmVucm9sbGVkIGtleVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRBU1NFUlRfRVEodHJ5X2xvYWQoXHUwMDI2ZiwgYmFkLCBiYWRfc3osIEJQRl9LRVlSSU5HX0JQRiwgbG9nX2J1ZixcbitcdFx0XHQgICBzaXplb2YobG9nX2J1ZikpLCAtRU5PS0VZLFxuK1x0XHQgIFwia2V5IG91dHNpZGUgdGhlIGJwZiBrZXlyaW5nIHJlZnVzZWRcIik7XG4rXHRBU1NFUlRfSEFTX1NVQlNUUihsb2dfYnVmLCBcInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkXCIsXG4rXHRcdFx0ICBcInRoZSBicGYga2V5cmluZyB3YXMgY29uc3VsdGVkXCIpO1xuK1xuK1x0Zi5ibG9iWzBdIF49IDB4ZmY7XG4rXHRlcnIgPSB0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKTtcbitcdGYuYmxvYlswXSBePSAweGZmO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVLRVlSRUpFQ1RFRCwgXCJ0YW1wZXJlZCBtZXRhZGF0YSByZWZ1c2VkXCIpO1xuK1xuK1x0QVNTRVJUX0VRKHRyeV9sb2FkKFx1MDAyNmYsIHNpZywgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIE5VTEwsIDApLFxuK1x0XHQgIC1FUEVSTSwgXCJjYWxsZXItc3VwcGxpZWQga2V5cmluZyByZWZ1c2VkIG9uY2UgLmJwZiBpcyBpbiB1c2VcIik7XG4rXG4rXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9VTkxJTkssIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgc2VyaWFsKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FTk9FTlQsIFwia2V5cmluZyB3cml0YWJsZSB3aGlsZSB0aGUgdXNlciBiaXRzIGFyZSB0aGVyZVwiKTtcbitcbitcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1NFVFBFUk0sIHNlcmlhbCwgQlBGX0tFWVJJTkdfUEVSTV9MT0NLRUQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImRyb3AgdGhlIHVzZXIgYml0cyBvbiB0aGUgYnBmIGtleXJpbmdcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX09LX0ZEKHRyeV9sb2FkKFx1MDAyNmYsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLFxuK1x0XHQgICAgIFwibG9hZCBzdGlsbCB2ZXJpZmllZCBhZ2FpbnN0IHRoZSBsb2NrZWQga2V5cmluZ1wiKTtcbitcbitcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1VOTElOSywgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBzZXJpYWwpO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJ1bmxpbmsgcmVmdXNlZFwiKTtcbitcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX0NMRUFSLCBzZXJpYWwsIDApO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJjbGVhciByZWZ1c2VkXCIpO1xuK1x0ZXJyID0ga2V5Y3RsX3JldChLRVlDVExfUkVWT0tFLCBzZXJpYWwsIDApO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJyZXZva2UgcmVmdXNlZFwiKTtcbitcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX0lOVkFMSURBVEUsIHNlcmlhbCwgMCk7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcImludmFsaWRhdGUgcmVmdXNlZFwiKTtcbitcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1NFVF9USU1FT1VULCBzZXJpYWwsIDEpO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJ0aW1lb3V0IHJlZnVzZWRcIik7XG4rXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRQRVJNLCBzZXJpYWwsIEJQRl9LRVlSSU5HX1BFUk1fSU5JVElBTCk7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRUFDQ0VTLCBcInRoZSBiaXRzIGNhbm5vdCBiZSBncmFudGVkIGJhY2tcIik7XG4rXG4rXHRBU1NFUlRfRVEoYnBmX2tleXJpbmdfbG9va3VwKFx1MDAyNm5yX2tleXMpLCBzZXJpYWwsIFwia2V5cmluZyBzdGlsbCB0aGVyZVwiKTtcbitcdEFTU0VSVF9FUShucl9rZXlzLCAxLCBcInRoZSBlbnJvbGxlZCBrZXkgc3Vydml2ZWRcIik7XG4rb3V0OlxuK1x0aWYgKGhhdmVfZml4dHVyZSlcbitcdFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4rXHRnZW5rZXlfZGlyX2ZpbmkoYmFkX2Rpcik7XG4rXHRmcmVlKGJ1Zik7XG4rXHRmcmVlKGJhZCk7XG4rXHRmcmVlKHNpZyk7XG4rcm1kaXI6XG4rXHRnZW5rZXlfZGlyX2ZpbmkoZGlyKTtcbit9XG4rXG4gLypcbiAgKiBBIHNpZ25lZCBsb2FkZXIgbXVzdCBpZ25vcmUgY3R4LXN1cHBsaWVkIG1hcCBkaW1lbnNpb25zOiB0aGUgaG9zdCBjYW5ub3RcbiAgKiByZXNpemUgYSBzaWduZWQgcHJvZ3JhbSdzIG1hcHMgdmlhIHRoZSBsb2FkZXIgY3R4LiBEcml2ZSBhIG9uZS1tYXAgcHJvZ3JhbVxuQEAgLTgzMSw3ICsxMTI1LDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfaW5zbnModm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuIFx0XHRyZXR1cm47XG4tXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwLXJzYVwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbiBcdFx0cm1kaXIoZGlyKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuQEAgLTkzMSw3ICsxMjI1LDcgQEAgc3RhdGljIHZvaWQgc2lnbmF0dXJlX2F1dGhlbnRpY2F0ZXNfbWV0YWRhdGEodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuIFx0XHRyZXR1cm47XG4tXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cFwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbitcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwLXJzYVwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXBcIikpIHtcbiBcdFx0cm1kaXIoZGlyKTtcbiBcdFx0cmV0dXJuO1xuIFx0fVxuQEAgLTEyNjcsNyArMTU2MSw3IEBAIHN0YXRpYyB2b2lkIGxzbV9zaWduYXR1cmVfdmVyZGljdCh2b2lkKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4gXHRcdGdvdG8gb3V0O1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdGRpciA9IE5VTEw7XG4gXHRcdGdvdG8gb3V0O1xuQEAgLTE0NTAsNyArMTc0NCw3IEBAIHN0YXRpYyB2b2lkIGxvYWR0aW1lX3ZlcmlmeShzdHJ1Y3QgYnBmX29iamVjdCAqb2JqLCBpbnQgZXhwZWN0X21hcHMpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xNTI0LDYgKzE4MTgsODkgQEAgc3RhdGljIHZvaWQgbG9hZHRpbWVfd2l0aF9tYXAodm9pZClcbiBcdHRlc3Rfc2lnbmVkX2xvYWRlcl9tYXBfX2Rlc3Ryb3koc2tlbCk7XG4gfVxuIFxuKy8qXG4rICogRW5kLXRvLWVuZCBzaWduZWQgbG9hZCB3aXRoIGEgcG9zdC1xdWFudHVtIGtleS4gTUwtRFNBIChGSVBTLTIwNCkgaXMgd2lyZWRcbisgKiB0aHJvdWdoIHRoZSBYLjUwOSBhbmQgUEtDUyM3IHBhcnNlcnMsIGFuZCBCUEYgcmVhY2hlcyB0aGVtIHZpYVxuKyAqIHZlcmlmeV9wa2NzN19zaWduYXR1cmUoKSB3aXRob3V0IGtub3dpbmcgdGhlIGFsZ29yaXRobSwgc28gYW4gTUwtRFNBIGtleSBpblxuKyAqIHRoZSBrZXlyaW5nIHNob3VsZCB2ZXJpZnkgYW4gTUwtRFNBIHNpZ25lZCBwcm9ncmFtIHdpdGggbm8gQlBGLXNpZGUgd29yay5cbisgKi9cbitzdGF0aWMgdm9pZCBtbGRzYV9zaWduZWRfbG9hZCh2b2lkKVxuK3tcbitcdGNoYXIgZGlyX3RtcGxbXSA9IFwiL3RtcC9icGZtbGRzYVhYWFhYWFwiO1xuK1x0aW50IG1hcF9mZCA9IC0xLCBwcm9nX2ZkID0gLTEsIGVycjtcbitcdF9fdTggKnNpZyA9IE5VTEwsICpidWYgPSBOVUxMO1xuK1x0c3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSBmO1xuK1x0Ym9vbCBoYXZlX2ZpeHR1cmUgPSBmYWxzZTtcbitcdF9fdTMyIHNpZ19zeiA9IDE2Mzg0O1xuK1x0Y2hhciAqZGlyO1xuK1xuK1x0c3lzY2FsbChfX05SX3JlcXVlc3Rfa2V5LCBcImtleXJpbmdcIiwgXCJfdWlkLjBcIiwgTlVMTCxcbitcdFx0S0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HKTtcbitcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBydW5fc2V0dXAoXCJzZXR1cC1tbGRzYVwiLCBkaXIpO1xuK1x0aWYgKGVyciA9PSBTRVRVUF9TS0lQKSB7XG4rXHRcdHByaW50ZihcIiVzOlNLSVA6b3BlbnNzbCBoYXMgbm8gTUwtRFNBIHN1cHBvcnQgKG5lZWRzIDMuNSspXFxuXCIsXG4rXHRcdCAgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0Z2Vua2V5X2Rpcl9maW5pKGRpcik7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJ2ZXJpZnlfc2lnX3NldHVwIHNldHVwLW1sZHNhXCIpKSB7XG4rXHRcdGdlbmtleV9kaXJfZmluaShkaXIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRzaWcgPSBtYWxsb2Moc2lnX3N6KTtcbitcdGlmICghQVNTRVJUX09LX1BUUihzaWcsIFwic2lnIGJ1ZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRoYXZlX2ZpeHR1cmUgPSB0cnVlO1xuK1x0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpICE9IDApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmID0gbWFsbG9jKChzaXplX3QpZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYnVmLCBcInNpZ25idWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0bWVtY3B5KGJ1ZiwgZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeik7XG4rXHRtZW1jcHkoYnVmICsgZi5nb3B0cy5pbnNuc19zeiwgZi5ibG9iLCBmLmRhdGFfc3opO1xuK1xuK1x0LypcbitcdCAqIE1MLURTQSBoYXNoZXMgdGhlIG1lc3NhZ2UgaXRzZWxmLCBidXQgb3BlbnNzbCBiZWZvcmUgNC4wIGNhbm5vdFxuK1x0ICogcHJvZHVjZSBhIENNUyBtZXNzYWdlIHdpdGhvdXQgc2lnbmVkQXR0cnMgZm9yIGl0LCBhbmQgd2l0aCB0aG9zZSBpblxuK1x0ICogcGxheSBvbmx5IFNIQS01MTIgaXMgcGVybWl0dGVkIGZvciB0aGUgbWVzc2FnZURpZ2VzdCBhdHRyaWJ1dGUuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmX2RpZ2VzdChkaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeixcbitcdFx0XHRcdCAgICAgICBzaWcsIFx1MDAyNnNpZ19zeiwgXCJzaGE1MTJcIiksXG4rXHRcdCAgICAgICBcInNpZ24gaW5zbnN8fG1ldGFkYXRhIHdpdGggTUwtRFNBXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBHdWFyZCBhZ2FpbnN0IHRoZSBzZXR1cCBzaWxlbnRseSBoYW5kaW5nIGJhY2sgc29tZSBvdGhlciBrZXkgdHlwZTpcbitcdCAqIGFuIFJTQSBvciBFQ0RTQSBzaWduYXR1cmUgaXMgYSBmZXcgaHVuZHJlZCBieXRlcywgd2hlcmUgYW4gTUwtRFNBLTg3XG4rXHQgKiBvbmUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiB0aGUgcmF3IHNpZ25hdHVyZSBpdCBjYXJyaWVzLlxuK1x0ICovXG4rXHRBU1NFUlRfR1Qoc2lnX3N6LCBNTERTQTg3X1NJR05BVFVSRV9TSVpFLCBcIk1MLURTQS04NyBzaWduYXR1cmUgc2l6ZVwiKTtcbitcbitcdG1hcF9mZCA9IHNldHVwX21ldGFfbWFwKFx1MDAyNmYpO1xuK1x0aWYgKCFBU1NFUlRfT0tfRkQobWFwX2ZkLCBcIm1ldGFfbWFwXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdHByb2dfZmQgPSBsb2FkX2xvYWRlcihmLmdvcHRzLmluc25zLCBmLmdvcHRzLmluc25zX3N6LCBtYXBfZmQsIHNpZyxcbitcdFx0XHQgICAgICBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgMSk7XG4rXHRBU1NFUlRfT0tfRkQocHJvZ19mZCwgXCJNTC1EU0Egc2lnbmVkIGxvYWRlciBsb2FkXCIpO1xuK291dDpcbitcdGlmIChwcm9nX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UocHJvZ19mZCk7XG4rXHRpZiAobWFwX2ZkIFx1MDAzZT0gMClcbitcdFx0Y2xvc2UobWFwX2ZkKTtcbitcdGlmIChoYXZlX2ZpeHR1cmUpXG4rXHRcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuK1x0ZnJlZShidWYpO1xuK1x0ZnJlZShzaWcpO1xuK1x0cnVuX3NldHVwKFwiY2xlYW51cFwiLCBkaXIpO1xuK31cbitcbiAvKlxuICAqIEEgc2lnbmVkIHByb2dyYW0gbmVlZCBub3QgYmluZCBhbnkgbWFwLiBBIHBsYWluIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTFxuICAqIHByb2dyYW0gd2l0aCBubyBmZF9hcnJheSBpcyBzaWduZWQgb3ZlciBpdHMgaW5zdHJ1Y3Rpb25zIGFsb25lOiB0aGUga2VybmVsXG5AQCAtMTU0OCw3ICsxOTI1LDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX25vX2ZkX2FycmF5KHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xNjE5LDcgKzE5OTYsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbWFwX2J5X2ZkX3JlamVjdGVkKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0Z290byBvdXRfbWFwO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdGdvdG8gb3V0X21hcDtcbiBcdH1cbkBAIC0xNjgxLDcgKzIwNTgsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfc3BhcnNlX2ZkX2FycmF5X3JlamVjdGVkKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0Z290byBvdXRfbWFwO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdGdvdG8gb3V0X21hcDtcbiBcdH1cbkBAIC0xNzM1LDcgKzIxMTIsNyBAQCBzdGF0aWMgdm9pZCBzaWduZWRfbW9kdWxlX2tmdW5jX3JlamVjdGVkKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xNzc5LDYgKzIxNTYsMTEgQEAgc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKVxuIFxuIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpXG4ge1xuK1x0aWYgKGtleXJpbmdfdW5zZWFsZWRfYm9vdCgpKSB7XG4rXHRcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYnBmX2tleXJpbmdfcHJvdmlzaW9uZWRcIikpXG4rXHRcdFx0YnBmX2tleXJpbmdfcHJvdmlzaW9uZWQoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJsb2FkdGltZV9ub19tYXBcIikpXG4gXHRcdGxvYWR0aW1lX25vX21hcCgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJsb2FkdGltZV93aXRoX21hcFwiKSlcbkBAIC0xODA1LDYgKzIxODcsMTAgQEAgdm9pZCB0ZXN0X3NpZ25lZF9sb2FkZXIodm9pZClcbiBcdFx0c2lnbmF0dXJlX3plcm9fc2l6ZSgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJzaWduYXR1cmVfYmFkX2tleXJpbmdcIikpXG4gXHRcdHNpZ25hdHVyZV9iYWRfa2V5cmluZygpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJicGZfa2V5cmluZ19zZWFsZWRcIikpXG4rXHRcdGJwZl9rZXlyaW5nX3NlYWxlZCgpO1xuK1x0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtbGRzYV9zaWduZWRfbG9hZFwiKSlcbitcdFx0bWxkc2Ffc2lnbmVkX2xvYWQoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWV0YWRhdGFfY3R4X21heF9lbnRyaWVzX2lnbm9yZWRcIikpXG4gXHRcdG1ldGFkYXRhX2N0eF9tYXhfZW50cmllc19pZ25vcmVkKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1ldGFkYXRhX2N0eF9pbml0aWFsX3ZhbHVlX2lnbm9yZWRcIikpXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jXG5pbmRleCBmMzI3ZmViOGUzOGMzLi4xMmIxNDZkMjA1ZDc1IDEwMDY0NFxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy92ZXJpZnlfcGtjczdfc2lnLmNcbkBAIC0yNTcsNyArMjU3LDcgQEAgc3RhdGljIHZvaWQgdGVzdF92ZXJpZnlfcGtjczdfc2lnX2Zyb21fbWFwKHZvaWQpXG4gXHRpZiAoIUFTU0VSVF9PS19QVFIodG1wX2RpciwgXCJta2R0ZW1wXCIpKVxuIFx0XHRyZXR1cm47XG4gXG4tXHRyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgXCJzZXR1cFwiKTtcbitcdHJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCBcInNldHVwLXJzYVwiKTtcbiBcdGlmICghQVNTRVJUX09LKHJldCwgXCJfcnVuX3NldHVwX3Byb2Nlc3NcIikpXG4gXHRcdGdvdG8gY2xvc2VfcHJvZztcbiBcbkBAIC00NTgsNyArNDU4LDcgQEAgc3RhdGljIHZvaWQgdGVzdF9wa2NzN19zaWdfZnN2ZXJpdHkodm9pZClcbiBcdHNucHJpbnRmKGRhdGFfcGF0aCwgUEFUSF9NQVgsIFwiJXMvZGF0YS1maWxlXCIsIHRtcF9kaXIpO1xuIFx0c25wcmludGYoc2lnX3BhdGgsIFBBVEhfTUFYLCBcIiVzL3NpZy1maWxlXCIsIHRtcF9kaXIpO1xuIFxuLVx0cmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsIFwic2V0dXBcIik7XG4rXHRyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgXCJzZXR1cC1yc2FcIik7XG4gXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiX3J1bl9zZXR1cF9wcm9jZXNzXCIpKVxuIFx0XHRnb3RvIG91dDtcbiBcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92ZXJpZnlfc2lnX3NldHVwLnNoXG5pbmRleCAwOTE3OWZiNTUxZjA5Li4yNzM3YzFhMmJjZmQ2IDEwMDc1NVxuLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZlcmlmeV9zaWdfc2V0dXAuc2hcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92ZXJpZnlfc2lnX3NldHVwLnNoXG5AQCAtMjgsNyArMjgsNyBAQCBhdXRob3JpdHlLZXlJZGVudGlmaWVyPWtleWlkXG4gXG4gdXNhZ2UoKVxuIHtcbi1cdGVjaG8gXCJVc2FnZTogJDAgXHUwMDNjc2V0dXB8Y2xlYW51cCBcdTAwM2NleGlzdGluZ190bXBfZGlyXHUwMDNlXCJcbitcdGVjaG8gXCJVc2FnZTogJDAgXHUwMDNjc2V0dXAtcnNhfHNldHVwLW1sZHNhfGNsZWFudXAgXHUwMDNjZXhpc3RpbmdfdG1wX2Rpclx1MDAzZVwiXG4gXHRleGl0IDFcbiB9XG4gXG5AQCAtNDcsNyArNDcsNyBAQCBnZW5rZXkoKVxuIFx0XHQke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAtb3V0Zm9ybSBkZXJcbiB9XG4gXG4tc2V0dXAoKVxuK3NldHVwX3JzYSgpXG4ge1xuIFx0bG9jYWwgdG1wX2Rpcj1cIiQxXCJcbiBcbkBAIC01Nyw2ICs1Nyw1NyBAQCBzZXR1cCgpXG4gXHRrZXljdGwgbGluayAka2V5X2lkICRrZXlyaW5nX2lkXG4gfVxuIFxuK21sZHNhX3N1cHBvcnRlZCgpXG4re1xuK1x0bG9jYWwgdG1wX2Rpcj1cIiQxXCJcbitcbitcdGdlbmtleV9tbGRzYSBcIiR7dG1wX2Rpcn1cIiB8fCByZXR1cm4gMVxuK1x0OiBcdTAwM2UgJHt0bXBfZGlyfS9wcm9iZVxuK1x0IyBTYW1lIGRpZ2VzdCBhcyB0aGUgY2FsbGVyIHNpZ25zIHdpdGgsIHNlZSBzaWduX2J1Zl9kaWdlc3QoKS5cbitcdC4vc2lnbi1maWxlIC1kIHNoYTUxMiAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcXFxuK1x0XHQke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSAke3RtcF9kaXJ9L3Byb2JlIHx8IHJldHVybiAxXG4rXHRybSAtZiAke3RtcF9kaXJ9L3Byb2JlICR7dG1wX2Rpcn0vcHJvYmUucDdzXG4rfVxuK1xuK2dlbmtleV9tbGRzYSgpXG4re1xuK1x0bG9jYWwgdG1wX2Rpcj1cIiQxXCJcbitcbitcdGVjaG8gXCIke3g1MDlfZ2Vua2V5X2NvbnRlbnR9XCIgXHUwMDNlICR7dG1wX2Rpcn0veDUwOS5nZW5rZXlcbitcbitcdCMgTm8gLVx1MDAzY2RpZ2VzdFx1MDAzZSBoZXJlOiBNTC1EU0EgaGFzaGVzIHRoZSBtZXNzYWdlIGl0c2VsZiwgYW5kIG9wZW5zc2xcbitcdCMgcmVqZWN0cyBhbiBleHBsaWNpdCBkaWdlc3QgZm9yIGl0LlxuK1x0b3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLXV0ZjggLWRheXMgMzY1MDAgXFxcbitcdFx0XHQtYmF0Y2ggLXg1MDkgLW5ld2tleSBNTC1EU0EtODcgXFxcbitcdFx0XHQtY29uZmlnICR7dG1wX2Rpcn0veDUwOS5nZW5rZXkgXFxcbitcdFx0XHQtb3V0Zm9ybSBQRU0gLW91dCAke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LnBlbSBcXFxuK1x0XHRcdC1rZXlvdXQgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gMlx1MDAzZVx1MDAyNjFcbitcbitcdG9wZW5zc2wgeDUwOSAtaW4gJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gLW91dCBcXFxuK1x0XHQke3RtcF9kaXJ9L3NpZ25pbmdfa2V5LmRlciAtb3V0Zm9ybSBkZXJcbit9XG4rXG4rbWxkc2Ffc2tpcCgpXG4re1xuK1x0bG9jYWwgdG1wX2Rpcj1cIiQxXCJcbitcbitcdHJtIC1mICR7dG1wX2Rpcn0veDUwOS5nZW5rZXkgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gXFxcbitcdFx0JHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgJHt0bXBfZGlyfS9wcm9iZSBcXFxuK1x0XHQke3RtcF9kaXJ9L3Byb2JlLnA3c1xuK1x0ZXhpdCA3N1xuK31cbitcbitzZXR1cF9tbGRzYSgpXG4re1xuK1x0bG9jYWwgdG1wX2Rpcj1cIiQxXCJcbitcbitcdG1sZHNhX3N1cHBvcnRlZCBcIiR7dG1wX2Rpcn1cIiB8fCBtbGRzYV9za2lwIFwiJHt0bXBfZGlyfVwiXG4rXHRrZXlfaWQ9JChjYXQgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgfFxuK1x0XHQga2V5Y3RsIHBhZGQgYXN5bW1ldHJpYyBlYnBmX3Rlc3Rpbmdfa2V5IEBzKVxuK1x0a2V5cmluZ19pZD0kKGtleWN0bCBuZXdyaW5nIGVicGZfdGVzdGluZ19rZXlyaW5nIEBzKVxuK1x0a2V5Y3RsIGxpbmsgJGtleV9pZCAka2V5cmluZ19pZFxuK31cbitcbiBjbGVhbnVwKCkge1xuIFx0bG9jYWwgdG1wX2Rpcj1cIiQxXCJcbiBcbkBAIC05MSw3ICsxNDIsNyBAQCBjYXRjaCgpXG4gXHRsb2NhbCBleGl0X2NvZGU9XCIkMVwiXG4gXHRsb2NhbCBsb2dfZmlsZT1cIiQyXCJcbiBcbi1cdGlmIFtbIFwiJHtleGl0X2NvZGV9XCIgLW5lIDAgXV07IHRoZW5cbitcdGlmIFtbIFwiJHtleGl0X2NvZGV9XCIgLW5lIDAgXHUwMDI2XHUwMDI2IFwiJHtleGl0X2NvZGV9XCIgLW5lIDc3IF1dOyB0aGVuXG4gXHRcdGNhdCBcIiR7bG9nX2ZpbGV9XCIgXHUwMDNlXHUwMDI2M1xuIFx0ZmlcbiBcbkBAIC0xMDgsOCArMTU5LDEwIEBAIG1haW4oKVxuIFxuIFx0W1sgISAtZCBcIiR7dG1wX2Rpcn1cIiBdXSBcdTAwMjZcdTAwMjYgZWNobyBcIkRpcmVjdG9yeSAke3RtcF9kaXJ9IGRvZXNuJ3QgZXhpc3RcIiBcdTAwMjZcdTAwMjYgZXhpdCAxXG4gXG4tXHRpZiBbWyBcIiR7YWN0aW9ufVwiID09IFwic2V0dXBcIiBdXTsgdGhlblxuLVx0XHRzZXR1cCBcIiR7dG1wX2Rpcn1cIlxuK1x0aWYgW1sgXCIke2FjdGlvbn1cIiA9PSBcInNldHVwLXJzYVwiIF1dOyB0aGVuXG4rXHRcdHNldHVwX3JzYSBcIiR7dG1wX2Rpcn1cIlxuK1x0ZWxpZiBbWyBcIiR7YWN0aW9ufVwiID09IFwic2V0dXAtbWxkc2FcIiBdXTsgdGhlblxuK1x0XHRzZXR1cF9tbGRzYSBcIiR7dG1wX2Rpcn1cIlxuIFx0ZWxpZiBbWyBcIiR7YWN0aW9ufVwiID09IFwiZ2Vua2V5XCIgXV07IHRoZW5cbiBcdFx0Z2Vua2V5IFwiJHt0bXBfZGlyfVwiXG4gXHRlbGlmIFtbIFwiJHthY3Rpb259XCIgPT0gXCJjbGVhbnVwXCIgXV07IHRoZW5cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdm10ZXN0LnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaFxuaW5kZXggNmEzZDAyNmQ3NmJkNi4uZTdlMGI0MTlhMGI4NyAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2hcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2hcbkBAIC0xMDcsNiArMTA3LDE0IEBAIE9wdGlvbnM6XG4gXHQtcylcdFx0SW5zdGVhZCBvZiBwb3dlcmluZyBvZmYgdGhlIFZNLCBzdGFydCBhbiBpbnRlcmFjdGl2ZVxuIFx0XHRcdHNoZWxsLiBJZiBcdTAwM2Njb21tYW5kXHUwMDNlIGlzIHNwZWNpZmllZCwgdGhlIHNoZWxsIHJ1bnMgYWZ0ZXJcbiBcdFx0XHR0aGUgY29tbWFuZCBmaW5pc2hlcyBleGVjdXRpbmdcbitcbitFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4rXG4rXHRLRVJORUxfQ01ETElORV9FWFRSQVxuK1x0XHRcdEV4dHJhIGFyZ3VtZW50cyB0byBhcHBlbmQgdG8gdGhlIGd1ZXN0IGtlcm5lbCBjb21tYW5kXG4rXHRcdFx0bGluZSwgZm9yIHRlc3RzIHRoYXQgbmVlZCBhIGJvb3QtdGltZSBzZXR0aW5nLiBlLmc6XG4rXG4rXHQgIEtFUk5FTF9DTURMSU5FX0VYVFJBPVwiYnBmLmtleXJpbmdfdW5zZWFsZWQ9MVwiICQwIC0tIC4vdGVzdF9wcm9ncyAtdCBzaWduZWRfbG9hZGVyXG4gRU9GXG4gfVxuIFxuQEAgLTI4Niw2ICsyOTQsMTIgQEAgRU9GXG4gXHRcdFFFTVVfRkxBR1M9KFwiJHtIT1NUX0ZMQUdTW0BdfVwiKVxuIFx0ZmlcbiBcbitcdGxvY2FsIGtlcm5lbF9jbWRsaW5lPVwicm9vdD0vZGV2L3ZkYSBydyBjb25zb2xlPSR7UUVNVV9DT05TT0xFfVwiXG4rXG4rXHRpZiBbWyAtbiBcIiR7S0VSTkVMX0NNRExJTkVfRVhUUkE6LX1cIiBdXTsgdGhlblxuK1x0XHRrZXJuZWxfY21kbGluZSs9XCIgJHtLRVJORUxfQ01ETElORV9FWFRSQX1cIlxuK1x0ZmlcbitcbiBcdCR7UUVNVV9CSU5BUll9IFxcXG4gXHRcdC1ub2RlZmF1bHRzIFxcXG4gXHRcdC1kaXNwbGF5IG5vbmUgXFxcbkBAIC0yOTQsNyArMzA4LDcgQEAgRU9GXG4gXHRcdC1tIDRHIFxcXG4gXHRcdC1kcml2ZSBmaWxlPVwiJHtyb290ZnNfaW1nfVwiLGZvcm1hdD1yYXcsaW5kZXg9MSxtZWRpYT1kaXNrLGlmPXZpcnRpbyxjYWNoZT1ub25lIFxcXG4gXHRcdC1rZXJuZWwgXCIke2tlcm5lbF9iemltYWdlfVwiIFxcXG4tXHRcdC1hcHBlbmQgXCJyb290PS9kZXYvdmRhIHJ3IGNvbnNvbGU9JHtRRU1VX0NPTlNPTEV9XCJcbitcdFx0LWFwcGVuZCBcIiR7a2VybmVsX2NtZGxpbmV9XCJcbiB9XG4gXG4gY29weV9sb2dzKClcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE0OjU1OjA4Ljc1NjExMjA4OVoiLCJTZXEiOjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjc0MDk1NDE5NzIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBCUEYgS2V5cmluZyBJbXBsZW1lbnRhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggc2VyaWVzLCBhbmQgaXQncyBpbnRyb2R1Y2luZyBhIG5ldyBgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWAgYm9vdCBwYXJhbWV0ZXIsIHdoaWNoIGlzIGludHJpZ3VpbmcuIEFuZCwgaXQgc2VlbXMgdG8gYmUgc2V0dGluZyB1cCBhIG5ldyBgLmJwZmAga2V5cmluZyBzcGVjaWZpY2FsbHkgZm9yIHZlcmlmeWluZyBCUEYgcHJvZ3JhbSBzaWduYXR1cmVzLiBTbWFydCBtb3ZlLCB0aGF0IGtpbmQgb2YgZGVkaWNhdGVkIGluZnJhc3RydWN0dXJlIGtlZXBzIHRoaW5ncyBjbGVhbiBhbmQgbWFuYWdlYWJsZS4gVGhlIHBhdGNoIHRvdWNoZXMgYGtlcm5lbC9icGYva2V5cy5jYCBhbmQgYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AsIHNvIHRob3NlIGFyZSB0aGUgYXJlYXMgSSBuZWVkIHRvIGZvY3VzIG9uLlxuXG5MZXQgbWUgYnJlYWsgZG93biB0aGUgY29yZSBjaGFuZ2VzOiBhIGZldyBuZXcgZnVuY3Rpb25zIGFyZSBiZWluZyBpbnRyb2R1Y2VkLCBgYnBmX2tleXJpbmdfZW5mb3JjZWQoKWAsIGBicGZfbG9va3VwX2tleXJpbmcoKWAsIGFuZCBgYnBmX2tleXJpbmdfaW5pdCgpYCwgd2hpY2ggZ2l2ZSBtZSB0aGUgaW5pdGlhbCBzZW5zZSB0aGF0IGEga2V5cmluZyBpcyBpbmRlZWQgYmVpbmcgY3JlYXRlZCBhbmQgbWFuYWdlZC4gSW50ZXJlc3RpbmcgYXMgd2VsbCBpcyB0aGF0IHRoZSBhbHJlYWR5IGRlZmluZWQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoKWAgZnVuY3Rpb24gaXMgYmVpbmcgbW9kaWZpZWQgdG8gaGFuZGxlIGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYCB3aGljaCBtYWtlcyBwZXJmZWN0IHNlbnNlIGluIHRlcm1zIG9mIGxldmVyYWdpbmcgZXhpc3RpbmcgY29kZSBmb3IgbmV3IGZ1bmN0aW9uYWxpdHkuXG5cblRpbWUgdG8gZGlnIGludG8gdGhlIGRldGFpbHMuIEknbGwgZmlyZSB1cCBgZ3JlcHBlcmAgYW5kIHNlZSB3aGF0IHRoZSBjb2RlIHJlYWxseSBsb29rcyBsaWtlIGFuZCBleGFtaW5lIHRoZSBjb250ZXh0cyBpbiB3aGljaCBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgYW5kIGBicGZfa2V5cmluZ19pbml0YCBhcmUgYmVpbmcgY2FsbGVkLCBhbmQgaG93IHRob3NlIG5ldyBmdW5jdGlvbnMgZml0IGludG8gdGhlIGV4aXN0aW5nIEJQRiB2ZXJpZmljYXRpb24gcHJvY2Vzcy4gTmVlZCB0byB1bmRlcnN0YW5kIHRoZSBsb2dpYyBmbG93IGhlcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyNzQ5LCJPdXRwdXRUb2tlbnMiOjIyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkyLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTU6MTYuMTY1NjU3MjgxWiIsIlNlcSI6NCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE2Njg5ODA4ODksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjA5ODM9c3RhdGljIGVudW0gYnBmX3NpZ19rZXlyaW5nIGJwZl9jbGFzc2lmeV9rZXlyaW5nKHMzMiBrZXlyaW5nX2lkKVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIxMDA3LSAqL1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyMTAwODpzdGF0aWMgaW50IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjEwMDktXFx0XFx0XFx0XFx0ICAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYm9vbCBpc19rZXJuZWwpXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjExMzY9aW50IGJwZl9jaGVjayhzdHJ1Y3QgYnBmX3Byb2cgKipwcm9nLCB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYnBmcHRyX3QgdWF0dHIsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjExODctXFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxua2VybmVsL2JwZi92ZXJpZmllci5jOjIxMTg4OlxcdFxcdHJldCA9IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoZW52LCBhdHRyLCB1YXR0ci5pc19rZXJuZWwpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMTE4OS1cXHRcXHRpZiAocmV0KVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jPTYzOT1zdGF0aWMgdm9pZCBzaWduYXR1cmVfYmFkX2tleXJpbmcodm9pZClcXG4tLVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYy02NDctXFx0XFx0ICogQSBwcmVzZW50IHNpZ25hdHVyZSB3aXRoIGEga2V5cmluZ19pZCB0aGF0IHJlc29sdmVzIHRvIG5vIGtleSBpc1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYzo2NDg6XFx0XFx0ICogcmVqZWN0ZWQgdXAgZnJvbnQ6IGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmUoKSBmYWlscyB0aGUga2V5cmluZ1xcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYy02NDktXFx0XFx0ICogbG9va3VwICgtRUlOVkFMKSBiZWZvcmUgaXQgZXZlciBsb29rcyBhdCB0aGUgc2lnbmF0dXJlIGJ5dGVzLiBBXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE0OjU1OjE3LjgzNDY0MjcxWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MjcyNjI4NTQ1NjIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBEZXBlbmRlbmNpZXMgb2YgVGhpcyBCUEYgUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzbid0IGludHJvZHVjaW5nIGEgKm5ldyogY29uZmlnIG9wdGlvbiwgd2hpY2ggaXMgZ29vZC4gSW5zdGVhZCwgaXQncyBsZXZlcmFnaW5nIGV4aXN0aW5nIG9uZXM6IGBDT05GSUdfS0VZU2AgYW5kIGBDT05GSUdfQlBGX1NZU0NBTExgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgaW50ZXJwbGF5IGhlcmUuIExldCdzIHNlZS4uLiBsb29raW5nIGF0IGBrZXJuZWwvYnBmL01ha2VmaWxlYC4uLiBBaGEhIFRoZSBkZXBlbmRlbmN5IGlzIGV4cGxpY2l0OlxuXG5gYGBtYWtlZmlsZVxuaWZlcSAoJChDT05GSUdfS0VZUykseSlcbm9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0ga2V5cy5vXG5lbmRpZlxuYGBgXG5cblNvLCBgQ09ORklHX0tFWVNgICptdXN0KiBiZSBlbmFibGVkIGZvciBga2V5cy5vYCB0byBldmVuIGJlIGNvbnNpZGVyZWQgZm9yIGluY2x1c2lvbi4gQW5kIHRoZW4sIG9ubHkgaWYgYENPTkZJR19CUEZfU1lTQ0FMTGAgaXMgYWxzbyBlbmFibGVkLCB3aWxsIHRoZSBvYmplY3QgZmlsZSBiZSBidWlsdC4gR290IGl0LiBTbyBib3RoIGFyZSByZXF1aXJlZC5cblxuTm93LCBsZXQgbWUgY2hlY2sgdGhlIHNlbGZ0ZXN0cyBjb25maWcsIGp1c3QgdG8gc2VlIHdoYXQgZWxzZSBtaWdodCBiZSBicm91Z2h0IGFsb25nIGZvciB0aGUgcmlkZS4gTG9va2luZyBhdCBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZ2A6XG5cbmBgYFxuQ09ORklHX0tFWVM9eVxuQ09ORklHX0NSWVBUT19NTERTQT15XG5DT05GSUdfQ1JZUFRPX1NIQTUxMj15XG5gYGBcblxuQWxyaWdodCwgYEtFWVNgIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGB5YCB0aGVyZS4gIEFuZCwgaW50ZXJlc3RpbmdseSwgdGhlIHNlbGZ0ZXN0cyBhbHNvIHB1bGwgaW4gYENSWVBUT19NTERTQWAgYW5kIGBDUllQVE9fU0hBNTEyYC4gIFRob3NlIGNyeXB0byBvcHRpb25zICptaWdodCogYmUgcmVsZXZhbnQsIG9yIHRoZXkgbWF5IHNpbXBseSBiZSBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIGZyb20gc29tZXdoZXJlIGVsc2UgaW4gdGhlIHN0YWNrLiBJIHNob3VsZCBrZWVwIGFuIGV5ZSBvbiB0aG9zZS5cblxuTm93IEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgYGtleXMuY2AgZG9lcy4uLiBMZXQncyBzZWUgd2hhdCB3ZSBjYW4gZmluZCBpbiB0aGUgY29kZSBpdHNlbGYsIGBrZXJuZWwvYnBmL2tleXMuY2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIzNzE5LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE0OjU1OjQ1LjA5NzQ5OTg3MloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNjQ1OTM0MDUxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImJwZl9rZXlyaW5nX2luaXRcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9rZXlzLmM9MjY9c3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfa2V5cmluZyh2b2lkKVxcbi0tXFxua2VybmVsL2JwZi9rZXlzLmMtNDQtXFxua2VybmVsL2JwZi9rZXlzLmM6NDU6c3RhdGljIGludCBfX2luaXQgYnBmX2tleXJpbmdfaW5pdCh2b2lkKVxcbmtlcm5lbC9icGYva2V5cy5jLTQ2LXtcXG4tLVxcbmtlcm5lbC9icGYva2V5cy5jLTcxLX1cXG5rZXJuZWwvYnBmL2tleXMuYzo3MjpsYXRlX2luaXRjYWxsKGJwZl9rZXlyaW5nX2luaXQpO1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jPTcwNz1zdGF0aWMgbG9uZyBrZXljdGxfcmV0KGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnMiwgdW5zaWduZWQgbG9uZyBhcmczKVxcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jLTcyMC0jZGVmaW5lIEJQRl9LRVlSSU5HX1BFUk1fTE9DS0VEXFx0XFx0MHgwODAzMDAwMFxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuYzo3MjE6LyogV2hhdCBicGZfa2V5cmluZ19pbml0KCkgZ3JhbnRzIGF0IGJvb3QuICovXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvc2lnbmVkX2xvYWRlci5jLTcyMi0jZGVmaW5lIEJQRl9LRVlSSU5HX1BFUk1fSU5JVElBTFxcdDB4MDgyZjAwMDBcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTU6NDYuNzQzNDQxNDAzWiIsIlNlcSI6NywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTIxNTY3NTI4MzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyBJIHVuZGVyc3RhbmQgaXQ6XG5cbioqRXhhbWluaW5nIEJQRiBLZXlyaW5nIEZ1bmN0aW9uYWxpdHkgYW5kIFZlcmlmaWNhdGlvbiBDaGFuZ2VzKipcblxuT2theSwgc28gSSBzZWUgc29tZSBuZXcgQlBGIGtleXJpbmcgZnVuY3Rpb25zIGhhdmUgYmVlbiBhZGRlZC4gU3BlY2lmaWNhbGx5LCBgYnBmX2tleXJpbmdfZW5mb3JjZWRgLCBgYnBmX2xvb2t1cF9rZXlyaW5nYCwgYW5kIGBicGZfa2V5cmluZ19pbml0YC4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMsIFwiSW50ZXJlc3RpbmcuLi4gd2hhdCdzIHRoZSByYXRpb25hbGUgYmVoaW5kIHRoZXNlP1wiIFRoaXMgbGlrZWx5IGluZGljYXRlcyBhbiBlZmZvcnQgdG8gZXh0ZW5kIEJQRidzIGNhcGFiaWxpdGllcyB3aXRoaW4gdGhlIGtlcm5lbCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBrZXkgbWFuYWdlbWVudC4gVGhlIG5hbWluZyBjb252ZW50aW9uIGlzIHByZXR0eSBzdHJhaWdodGZvcndhcmQsIEkgY2FuIGluZmVyIHRoYXQgYGVuZm9yY2VkYCBtaWdodCBiZSByZWxhdGVkIHRvIGFjY2VzcyBjb250cm9scywgYGxvb2t1cGAgZm9yIHJldHJpZXZpbmcga2V5cywgYW5kIGBpbml0YCBmb3IgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGtleXJpbmcuXG5cbk5vdywgdGhlIG1lbnRpb24gb2YgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIGJlaW5nIG1vZGlmaWVkIGluIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgIHJlYWxseSBncmFicyBteSBhdHRlbnRpb24uIFRoYXQgc3VnZ2VzdHMgdGhhdCB0aGVzZSBuZXcga2V5cmluZyBmdW5jdGlvbnMgaGF2ZSBuZWNlc3NpdGF0ZWQgY2hhbmdlcyB0byB0aGUgQlBGIHByb2dyYW0gdmVyaWZpY2F0aW9uIHByb2Nlc3MuIE15IG5leHQgc3RlcCBpcyBjbGVhcmx5IHRvIGRpdmUgaW50byBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AuIEkgbmVlZCB0byB1bmRlcnN0YW5kICpob3cqIHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBoYXMgYmVlbiBhbHRlcmVkIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcga2V5cmluZyBmZWF0dXJlcy4gSSdtIGtlZW4gdG8gc2VlIGlmIHRoaXMgYWZmZWN0cyB0aGUgc2VjdXJpdHkgbW9kZWwgaW4gYW55IG5vdGFibGUgd2F5cy4gVW5kZXJzdGFuZGluZyB0aGUgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBpcyBjcnVjaWFsIGluIGFzc2Vzc2luZyB0aGUgaW50ZWdyaXR5IGFuZCBzYWZldHkgb2YgQlBGIHByb2dyYW1zLCBlc3BlY2lhbGx5IG5vdyB0aGF0IGtleXJpbmdzIGFyZSBpbnZvbHZlZC4gSSdsbCBmb2N1cyBvbiBob3cgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIGhhbmRsZXMgdGhlc2UgYWRkaXRpb25zLCB0byBlbnN1cmUgdGhhdCB0aGUgc2VjdXJpdHkgcHJvcGVydGllcyByZW1haW4uXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0NjI0LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTU6NTguOTAwMTk3NDUxWiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODc0NzUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMTAwMCxcbiAgXCJMaW5lQ291bnRcIjogMTAwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIxMDAwOlxcdCAqIFZlcmlmeSB0aGUgUEtDUyM3IHNpZ25hdHVyZSBvZiBhIGxvYWRlZCBwcm9ncmFtLiBDYWxsZWQgZnJvbSBicGZfY2hlY2soKVxcbjIxMDAxOlxcdCAqIG9uY2UgdGhlIHByb2dyYW0ncyBtZXRhZGF0YSBtYXBzIGhhdmUgYmVlbiByZXNvbHZlZCBpbnRvIHVzZWRfbWFwcywgc29cXG4yMTAwMjpcXHQgKiB0aGUgZXhhY3QgbWFwcyBmb2xkZWQgaW50byB0aGUgc2lnbmF0dXJlIGFyZSB0aGUgb25lcyB0aGUgcHJvZ3JhbSBiaW5kcy5cXG4yMTAwMzpcXHQgKlxcbjIxMDA0OlxcdCAqIFRoZSBzaWduYXR1cmUgY292ZXJzIHRoZSBpbnN0cnVjdGlvbnMgZm9sbG93ZWQgYnkgdGhlIGZyb3plbiBjb250ZW50cyBvZlxcbjIxMDA1OlxcdCAqIGVhY2ggbWFwLCBpbiBAbWFwcyBvcmRlcjogaW5zbnMgfHwgbWFwXzAgfHwgbWFwXzEgfHwgWy4uLl0uIE9uIHN1Y2Nlc3MgdGhlXFxuMjEwMDY6XFx0ICogdmVyZGljdCBhbmQga2V5cmluZyBpbmZvIGFyZSByZWNvcmRlZCBvbiBwcm9nLVxcdTAwM2VhdXguXFxuMjEwMDc6XFx0ICovXFxuMjEwMDg6XFx0c3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuMjEwMDk6XFx0XFx0XFx0XFx0XFx0ICAgICB1bmlvbiBicGZfYXR0ciAqYXR0ciwgYm9vbCBpc19rZXJuZWwpXFxuMjEwMTA6XFx0e1xcbjIxMDExOlxcdFxcdGJwZnB0cl90IHVzaWcgPSBtYWtlX2JwZnB0cihhdHRyLVxcdTAwM2VzaWduYXR1cmUsIGlzX2tlcm5lbCk7XFxuMjEwMTI6XFx0XFx0c3RydWN0IGJwZl9keW5wdHJfa2VybiBzaWdfcHRyLCBkYXRhX3B0cjtcXG4yMTAxMzpcXHRcXHRzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBlbnYtXFx1MDAzZXByb2c7XFxuMjEwMTQ6XFx0XFx0c3RydWN0IGJwZl9tYXAgKiptYXBzID0gZW52LVxcdTAwM2V1c2VkX21hcHM7XFxuMjEwMTU6XFx0XFx0c3RydWN0IGJwZl9rZXkgKmtleSA9IE5VTEw7XFxuMjEwMTY6XFx0XFx0dm9pZCAqc2lnLCAqZGF0YSA9IE5VTEw7XFxuMjEwMTc6XFx0XFx0dTMyIG1hcF9jbnQgPSBlbnYtXFx1MDAzZXVzZWRfbWFwX2NudDtcXG4yMTAxODpcXHRcXHR1MzIgaSwgb2ZmLCBpbnNuc19zejtcXG4yMTAxOTpcXHRcXHR1NjQgZGF0YV9zejtcXG4yMTAyMDpcXHRcXHRpbnQgZXJyID0gMDtcXG4yMTAyMTpcXHRcXG4yMTAyMjpcXHRcXHRpZiAoIWF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplIHx8XFxuMjEwMjM6XFx0XFx0ICAgIGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplIFxcdTAwM2UgQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFKVxcbjIxMDI0OlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIxMDI1OlxcdFxcbjIxMDI2OlxcdFxcdGlmICghc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci1cXHUwMDNla2V5cmluZ19pZCkpIHtcXG4yMTAyNzpcXHRcXHRcXHRrZXkgPSBicGZfbG9va3VwX3N5c3RlbV9rZXkoYXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuMjEwMjg6XFx0XFx0fSBlbHNlIHtcXG4yMTAyOTpcXHRcXHRcXHRpZiAoYXR0ci1cXHUwMDNla2V5cmluZ19pZCAhPSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XFxuMjEwMzA6XFx0XFx0XFx0XFx0aWYgKGJwZl9rZXlyaW5nX2VuZm9yY2VkKCkpIHtcXG4yMTAzMTpcXHRcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImNhbGxlci1zdXBwbGllZCBrZXlyaW5nIHJlZnVzZWQsIHVzZSBicGYga2V5cmluZ1xcXFxuXFxcIik7XFxuMjEwMzI6XFx0XFx0XFx0XFx0XFx0cmV0dXJuIC1FUEVSTTtcXG4yMTAzMzpcXHRcXHRcXHRcXHR9XFxuMjEwMzQ6XFx0XFx0XFx0XFx0a2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLVxcdTAwM2VrZXlyaW5nX2lkLCAwKTtcXG4yMTAzNTpcXHRcXHRcXHR9IGVsc2Uge1xcbjIxMDM2OlxcdFxcdFxcdFxcdGtleSA9IGJwZl9sb29rdXBfa2V5cmluZygpO1xcbjIxMDM3OlxcdFxcdFxcdH1cXG4yMTAzODpcXHRcXHR9XFxuMjEwMzk6XFx0XFx0aWYgKCFrZXkpIHtcXG4yMTA0MDpcXHRcXHRcXHRpZiAoYXR0ci1cXHUwMDNla2V5cmluZ19pZCA9PSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HKSB7XFxuMjEwNDE6XFx0XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJ0aGUgYnBmIGtleXJpbmcgaXMgZW1wdHkgb3IgaGFzIG5vdCBiZWVuIHJlc3RyaWN0ZWRcXFxcblxcXCIpO1xcbjIxMDQyOlxcdFxcdFxcdFxcdHJldHVybiAtRU5PS0VZO1xcbjIxMDQzOlxcdFxcdFxcdH0gZWxzZSB7XFxuMjEwNDQ6XFx0XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxcXG5cXFwiLFxcbjIxMDQ1OlxcdFxcdFxcdFxcdFxcdGF0dHItXFx1MDAzZWtleXJpbmdfaWQpO1xcbjIxMDQ2OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIxMDQ3OlxcdFxcdFxcdH1cXG4yMTA0ODpcXHRcXHR9XFxuMjEwNDk6XFx0XFxuMjEwNTA6XFx0XFx0c2lnID0ga3ZtZW1kdXBfYnBmcHRyKHVzaWcsIGF0dHItXFx1MDAzZXNpZ25hdHVyZV9zaXplKTtcXG4yMTA1MTpcXHRcXHRpZiAoSVNfRVJSKHNpZykpIHtcXG4yMTA1MjpcXHRcXHRcXHRicGZfa2V5X3B1dChrZXkpO1xcbjIxMDUzOlxcdFxcdFxcdHJldHVybiBQVFJfRVJSKHNpZyk7XFxuMjEwNTQ6XFx0XFx0fVxcbjIxMDU1OlxcdFxcbjIxMDU2OlxcdFxcdGluc25zX3N6ID0gcHJvZy1cXHUwMDNlbGVuICogc2l6ZW9mKHN0cnVjdCBicGZfaW5zbik7XFxuMjEwNTc6XFx0XFx0ZGF0YV9zeiA9IGluc25zX3N6O1xcbjIxMDU4OlxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBtYXBfY250OyBpKyspIHtcXG4yMTA1OTpcXHRcXHRcXHRzdHJ1Y3QgYnBmX21hcCAqbWFwID0gbWFwc1tpXTtcXG4yMTA2MDpcXHRcXG4yMTA2MTpcXHRcXHRcXHRpZiAobWFwLVxcdTAwM2VtYXBfdHlwZSAhPSBCUEZfTUFQX1RZUEVfQVJSQVkgfHxcXG4yMTA2MjpcXHRcXHRcXHQgICAgIW1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIpIHtcXG4yMTA2MzpcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAnJXMnIG11c3QgYmUgYW4gYXJyYXlcXFxcblxcXCIsXFxuMjEwNjQ6XFx0XFx0XFx0XFx0XFx0bWFwLVxcdTAwM2VuYW1lKTtcXG4yMTA2NTpcXHRcXHRcXHRcXHRlcnIgPSAtRUlOVkFMO1xcbjIxMDY2OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjIxMDY3OlxcdFxcdFxcdH1cXG4yMTA2ODpcXHRcXHRcXHRpZiAoIVJFQURfT05DRShtYXAtXFx1MDAzZWZyb3plbikpIHtcXG4yMTA2OTpcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAnJXMnIG11c3QgYmUgZnJvemVuXFxcXG5cXFwiLFxcbjIxMDcwOlxcdFxcdFxcdFxcdFxcdG1hcC1cXHUwMDNlbmFtZSk7XFxuMjEwNzE6XFx0XFx0XFx0XFx0ZXJyID0gLUVQRVJNO1xcbjIxMDcyOlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjIxMDczOlxcdFxcdFxcdH1cXG4yMTA3NDpcXHRcXHRcXHRpZiAoYnBmX21hcF93cml0ZV9hY3RpdmUobWFwKSkge1xcbjIxMDc1OlxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgaGFzIGFjdGl2ZSB3cml0ZXJzXFxcXG5cXFwiLFxcbjIxMDc2OlxcdFxcdFxcdFxcdFxcdG1hcC1cXHUwMDNlbmFtZSk7XFxuMjEwNzc6XFx0XFx0XFx0XFx0ZXJyID0gLUVCVVNZO1xcbjIxMDc4OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjIxMDc5OlxcdFxcdFxcdH1cXG4yMTA4MDpcXHRcXHRcXHRpZiAoIW1hcC1cXHUwMDNlZXhjbF9wcm9nX3NoYSkge1xcbjIxMDgxOlxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBleGNsdXNpdmVcXFxcblxcXCIsXFxuMjEwODI6XFx0XFx0XFx0XFx0XFx0bWFwLVxcdTAwM2VuYW1lKTtcXG4yMTA4MzpcXHRcXHRcXHRcXHRlcnIgPSAtRVBFUk07XFxuMjEwODQ6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMjEwODU6XFx0XFx0XFx0fVxcbjIxMDg2OlxcdFxcdFxcdGRhdGFfc3ogKz0gbWFwLVxcdTAwM2V2YWx1ZV9zaXplO1xcbjIxMDg3OlxcdFxcdH1cXG4yMTA4ODpcXHRcXHRpZiAoYnBmX2R5bnB0cl9jaGVja19zaXplKGRhdGFfc3opKSB7XFxuMjEwODk6XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcGF5bG9hZCB0b28gbGFyZ2U6ICVsbHUgYnl0ZXNcXFxcblxcXCIsIGRhdGFfc3opO1xcbjIxMDkwOlxcdFxcdFxcdGVyciA9IC1FMkJJRztcXG4yMTA5MTpcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTA5MjpcXHRcXHR9XFxuMjEwOTM6XFx0XFx0ZGF0YSA9IGt2bWFsbG9jKGRhdGFfc3osIEdGUF9LRVJORUxfQUNDT1VOVCB8IF9fR0ZQX1pFUk8pO1xcbjIxMDk0OlxcdFxcdGlmICghZGF0YSkge1xcbjIxMDk1OlxcdFxcdFxcdGVyciA9IC1FTk9NRU07XFxuMjEwOTY6XFx0XFx0XFx0Z290byBvdXQ7XFxuMjEwOTc6XFx0XFx0fVxcbjIxMDk4OlxcdFxcdG1lbWNweShkYXRhLCBwcm9nLVxcdTAwM2VpbnNuc2ksIGluc25zX3N6KTtcXG4yMTA5OTpcXHRcXHRvZmYgPSBpbnNuc19zejtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTU6NTguOTAxMDczNDUxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NjEzOTcwOTQ1NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgS2V5cmluZyBQYXRjaCoqXG5cbk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgaW50cm9kdWNpbmcgc29tZXRoaW5nIHByZXR0eSBzaWduaWZpY2FudDogYSBkZWRpY2F0ZWQga2V5cmluZyBzcGVjaWZpY2FsbHkgZm9yIHZlcmlmeWluZyB0aGUgc2lnbmF0dXJlcyBvZiBCUEYgcHJvZ3JhbXMuIFRoYXQncyBhIHNvbGlkIG1vdmUsIGl0IGlzb2xhdGVzIHRoYXQgY29uY2Vybi4gSSBzZWUgdGhlIG5ldyBmdW5jdGlvbnMgYXJlIGBicGZfbG9va3VwX2tleXJpbmdgLCBgYnBmX2tleXJpbmdfZW5mb3JjZWRgLCBhbmQgYGJwZl9rZXlyaW5nX2luaXRgLiBUaG9zZSBuYW1lcyBhcmUgc3RyYWlnaHRmb3J3YXJkOyBleGFjdGx5IHdoYXQgeW91J2QgZXhwZWN0LiBUaGUgY29yZSBvZiBpdCBhbGwgc2VlbXMgdG8gYmUgaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCB3aGljaCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBhY3R1YWxseSBkb2VzIHRoZSB2YWxpZGF0aW9uLlxuXG5Ob3csIHRoZSBxdWVzdGlvbiBpcyAqd2hlcmUqIHRoaXMgaXMgYmVpbmcgY2FsbGVkIGZyb20uIEFoYSwgaXQncyByZWFjaGFibGUgdGhyb3VnaCBgYnBmX2NoZWNrYCwgc3BlY2lmaWNhbGx5IGR1cmluZyB0aGUgQlBGIHByb2dyYW0gbG9hZCBwcm9jZXNzIHdoZW4gYSBzaWduYXR1cmUgaXMgcHJlc2VudC4gVGhhdCBtYWtlcyBzZW5zZS4gTGV0J3Mgc2VlLi4uIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBjYWxsZWQgaWYgYGVudi1cdTAwM2VzaWduYXR1cmVgIGlzIHNldC4gUmlnaHQsIHJpZ2h0Li4uIGFuZCBgZW52LVx1MDAzZXNpZ25hdHVyZWAgZ2V0cyBzZXQgaWYgYGF0dHItXHUwMDNlc2lnbmF0dXJlYCBpcyBwcm92aWRlZCwgd2hpY2ggaXMgaG93IHRoZSBwcm9ncmFtIGxvYWRlciBwYXNzZXMgdGhlIHNpZ25hdHVyZS4gT2theSwgdGhhdCdzIGNsZWFuLiBMZXQgbWUgY29uZmlybSB0aGlzIGNvbm5lY3Rpb24gYnkgdGFraW5nIGEgcXVpY2sgbG9vayBhdCBgYnBmX2NoZWNrYCBpbiBga2VybmVsL2JwZi92ZXJpZmllci5jYC4gSnVzdCB3YW50IHRvIGJlIHN1cmUgSSdtIG5vdCBtaXNzaW5nIGFueXRoaW5nLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyNjgxMiwiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1MywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE0OjU2OjA1LjA0MDc4NzQzNVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTc2ODgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMTE4MCxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjExODA6XFx0XFx0XFx0XFx0Z290byBlcnJfcHJlcDtcXG4yMTE4MTpcXHRcXHR9XFxuMjExODI6XFx0XFxuMjExODM6XFx0XFx0cmV0ID0gcHJvY2Vzc19mZF9hcnJheShlbnYsIGF0dHIsIHVhdHRyKTtcXG4yMTE4NDpcXHRcXHRpZiAocmV0KVxcbjIxMTg1OlxcdFxcdFxcdGdvdG8gZXJyX3ByZXA7XFxuMjExODY6XFx0XFxuMjExODc6XFx0XFx0aWYgKGVudi1cXHUwMDNlc2lnbmF0dXJlKSB7XFxuMjExODg6XFx0XFx0XFx0cmV0ID0gYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZShlbnYsIGF0dHIsIHVhdHRyLmlzX2tlcm5lbCk7XFxuMjExODk6XFx0XFx0XFx0aWYgKHJldClcXG4yMTE5MDpcXHRcXHRcXHRcXHRnb3RvIGVycl9wcmVwO1xcbjIxMTkxOlxcdFxcdH1cXG4yMTE5MjpcXHRcXG4yMTE5MzpcXHRcXHRyZXQgPSBzZWN1cml0eV9icGZfcHJvZ19sb2FkKGVudi1cXHUwMDNlcHJvZywgYXR0ciwgZW52LVxcdTAwM2Vwcm9nLVxcdTAwM2VhdXgtXFx1MDAzZXRva2VuLFxcbjIxMTk0OlxcdFxcdFxcdFxcdFxcdCAgICAgdWF0dHIuaXNfa2VybmVsKTtcXG4yMTE5NTpcXHRcXHRpZiAocmV0KVxcbjIxMTk2OlxcdFxcdFxcdGdvdG8gZXJyX3ByZXA7XFxuMjExOTc6XFx0XFxuMjExOTg6XFx0XFx0YnBmX2dldF9idGZfdm1saW51eCgpO1xcbjIxMTk5OlxcdFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNDo1NjowNS4wNDE5Njg5NTVaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTA4NTI0OTczMjMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQW5hbHlzaXMgb2YgQlBGIFNpZ25hdHVyZSBWZXJpZmljYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcsIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBzZWVtcyBsaWtlIGEgc29saWQgc3ltYm9sIHRvIHN0YXJ0IHdpdGgsIGFsb25nIHdpdGggYGJwZl9sb29rdXBfa2V5cmluZ2AgYW5kIGBicGZfa2V5cmluZ19lbmZvcmNlZGAuIEkgbmVlZCB0byByZW1lbWJlciB0aGF0IGBicGZfa2V5cmluZ19pbml0YCBpcyBjYWxsZWQgZHVyaW5nIGJvb3QgYXMgaXQgaXMgYW4gaW5pdGNhbGwuIFRoaXMgcmVxdWlyZXMgYEtFWVNgIGFuZCBgQlBGX1NZU0NBTExgIGNvbmZpZ3VyYXRpb25zLiBXYWl0LCBoYW5nIG9uLCBJIHNlZSBgQ09ORklHX0NSWVBUT19NTERTQWAgYW5kIGBDT05GSUdfQ1JZUFRPX1NIQTUxMmAgYXJlIGluIHRoZSBzZWxmdGVzdHMgY29uZmlnLCBidXQgdGhvc2UgYXJlbid0ICpzdHJpY3RseSogbmVlZGVkIGZvciB0aGUgY29yZSBmZWF0dXJlLCB0aGV5IGFyZSBqdXN0IHRoZXJlIGZvciBzZWxmdGVzdHMgdG8gdXNlIE1MLURTQSBzaWduYXR1cmVzLiBUaGUgZmVhdHVyZSBpdHNlbGYganVzdCB1c2VzIHdoYXRldmVyIGNyeXB0byB0aGUga2VybmVsJ3MgUEtDUyM3IHBhcnNlciBzdXBwb3J0cy5cblxuT2theSwgYmFjayB0byB0aGUgY29uZmlncy4uLmBDT05GSUdfS0VZU2AgaXMgZGVmaW5pdGVseSByZXF1aXJlZCBmb3IgYGJwZl9sb29rdXBfa2V5cmluZ2AgYW5kIGBicGZfa2V5cmluZ19lbmZvcmNlZGAgYmVjYXVzZSB0aG9zZSBmdW5jdGlvbnMgbGl2ZSBpbiBga2VybmVsL2JwZi9rZXlzLmNgLCB3aGljaCBvbmx5IGdldHMgY29tcGlsZWQgaWYgYENPTkZJR19LRVlTPXlgLiBMZXQgbWUgZG91YmxlLWNoZWNrIHRoZSBga2VybmVsL2JwZi9NYWtlZmlsZWAgdG8gY29uZmlybTpcblxuYGBgbWFrZWZpbGVcbmlmZXEgKCQoQ09ORklHX0tFWVMpLHkpXG5vYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IGtleXMub1xuZW5kaWZcbmBgYFxuXG5ZZXAsIGNvbmZpcm1lZCwgYENPTkZJR19LRVlTYCBpcyBhIGhhcmQgcmVxdWlyZW1lbnQuXG5cbk5vdywgYWJvdXQgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLCBJIHNob3VsZCBwcm9iYWJseSBjaGVjayBpZiBpdCdzIHN0YXRpYy4gWWVzLCBpdCBpcy4gVGhlIGluc3RydWN0aW9ucyBzYXkgdG8gcHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50cyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXJzLCBiZWNhdXNlIHN0YXRpYyBoZWxwZXJzIGdldCBpbmxpbmVkIGFuZCBkb24ndCBoYXZlIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMuIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBzdGF0aWMuIElzIGl0IGlubGluZWQ/IEl0J3MgcHJldHR5IGxhcmdlLCBzbyBpdCdzIHByb2JhYmx5ICpub3QqIGlubGluZWQsIGJ1dCBgYnBmX2NoZWNrYCBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCwgYW5kIHRoYXQgc2VlbXMgcHJvYmxlbWF0aWMuXG5cbldhaXQsIGBicGZfY2hlY2tgIGlzIHRoZSBtYWluIHZlcmlmaWVyIGVudHJ5IHBvaW50LiBGdXp6aW5nIHRoYXQgaXMgcHJvYmFibHkgdG9vIGdlbmVyaWMsIHNvIGxldCdzIHNlZSwgYXJlIHRoZXJlIGFueSBub24tc3RhdGljIGZ1bmN0aW9ucyBhdmFpbGFibGU/IGBicGZfbG9va3VwX2tleXJpbmdgIGFuZCBgYnBmX2tleXJpbmdfZW5mb3JjZWRgIGFyZSBub24tc3RhdGljLiBMZXQncyBkaWcgaW50byBga2VybmVsL2JwZi9rZXlzLmNgIGEgYml0IGZ1cnRoZXIuLi5cblxuXG4iLCJJbnB1dFRva2VucyI6Mjc1NzQsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNDo1NjoxNS44OTQ0Njk0MDhaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE1NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi9rZXlzLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XFxuICAgMjpcXHQvKiBDb3B5cmlnaHQgKGMpIDIwMjYgSXNvdmFsZW50ICovXFxuICAgMzpcXHRcXG4gICA0OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9icGYuaFxcdTAwM2VcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9jcmVkLmhcXHUwMDNlXFxuICAgNjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvZXJyLmhcXHUwMDNlXFxuICAgNzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvaW5pdC5oXFx1MDAzZVxcbiAgIDg6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2tleS5oXFx1MDAzZVxcbiAgIDk6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZXBhcmFtLmhcXHUwMDNlXFxuICAxMDpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc2xhYi5oXFx1MDAzZVxcbiAgMTE6XFx0XFxuICAxMjpcXHQjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWFxcbiAgMTM6XFx0I2RlZmluZSBNT0RVTEVfUEFSQU1fUFJFRklYIFxcXCJicGYuXFxcIlxcbiAgMTQ6XFx0XFxuICAxNTpcXHRzdGF0aWMgc3RydWN0IGtleSAqYnBmX2tleXJpbmc7XFxuICAxNjpcXHRcXG4gIDE3OlxcdHN0YXRpYyBib29sIGJwZl9rZXlyaW5nX3Vuc2VhbGVkIF9fcm9fYWZ0ZXJfaW5pdDtcXG4gIDE4OlxcdG1vZHVsZV9wYXJhbV9uYW1lZChrZXlyaW5nX3Vuc2VhbGVkLCBicGZfa2V5cmluZ191bnNlYWxlZCwgYm9vbCwgMDQ0NCk7XFxuICAxOTpcXHRNT0RVTEVfUEFSTV9ERVNDKGtleXJpbmdfdW5zZWFsZWQsIFxcXCJMZWF2ZSB0aGUgYnBmIGtleXJpbmcgdW5zZWFsZWRcXFwiKTtcXG4gIDIwOlxcdFxcbiAgMjE6XFx0Ym9vbCBicGZfa2V5cmluZ19lbmZvcmNlZCh2b2lkKVxcbiAgMjI6XFx0e1xcbiAgMjM6XFx0XFx0cmV0dXJuIGJwZl9rZXlyaW5nX3Vuc2VhbGVkO1xcbiAgMjQ6XFx0fVxcbiAgMjU6XFx0XFxuICAyNjpcXHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpXFxuICAyNzpcXHR7XFxuICAyODpcXHRcXHRzdHJ1Y3QgYnBmX2tleSAqYmtleTtcXG4gIDI5OlxcdFxcbiAgMzA6XFx0XFx0aWYgKCFicGZfa2V5cmluZylcXG4gIDMxOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAgMzI6XFx0XFx0aWYgKCFSRUFEX09OQ0UoYnBmX2tleXJpbmctXFx1MDAzZWtleXMubnJfbGVhdmVzX29uX3RyZWUpIHx8XFxuICAzMzpcXHRcXHQgICAgIVJFQURfT05DRShicGZfa2V5cmluZy1cXHUwMDNlcmVzdHJpY3RfbGluaykpXFxuICAzNDpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDM1OlxcdFxcbiAgMzY6XFx0XFx0YmtleSA9IGttYWxsb2Nfb2JqKCpia2V5KTtcXG4gIDM3OlxcdFxcdGlmICghYmtleSlcXG4gIDM4OlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAgMzk6XFx0XFxuICA0MDpcXHRcXHRia2V5LVxcdTAwM2VrZXkgPSBicGZfa2V5cmluZztcXG4gIDQxOlxcdFxcdGJrZXktXFx1MDAzZWhhc19yZWYgPSBmYWxzZTtcXG4gIDQyOlxcdFxcdHJldHVybiBia2V5O1xcbiAgNDM6XFx0fVxcbiAgNDQ6XFx0XFxuICA0NTpcXHRzdGF0aWMgaW50IF9faW5pdCBicGZfa2V5cmluZ19pbml0KHZvaWQpXFxuICA0NjpcXHR7XFxuICA0NzpcXHRcXHRzdHJ1Y3Qga2V5ICprZXlyaW5nO1xcbiAgNDg6XFx0XFxuICA0OTpcXHRcXHRrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhcXFwiLmJwZlxcXCIsXFxuICA1MDpcXHRcXHRcXHRcXHRcXHRHTE9CQUxfUk9PVF9VSUQsIEdMT0JBTF9ST09UX0dJRCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTY6MTUuODk0NTQyMDU4WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjI5NDY4MDg3NzYyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgUGxhbjogQlBGIEtleXJpbmcgU2lnbmF0dXJlIFZlcmlmaWNhdGlvbioqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoaXMgcGF0Y2ggYW5kIGZpZ3VyaW5nIG91dCBob3cgdG8gYXBwcm9hY2ggZnV6emluZyBpdC4gSSBzZWUgdGhhdCBgYnBmX2xvb2t1cF9rZXlyaW5nYCBhbmQgYGJwZl9rZXlyaW5nX2VuZm9yY2VkYCBhcmUgbm9uLXN0YXRpYyBmdW5jdGlvbnMsIGFuZCB0aGV5IHNlZW0gY2VudHJhbCB0byB0aGlzIG5ldyBCUEYga2V5cmluZyBmdW5jdGlvbmFsaXR5LCBzbyB0aG9zZSBhcmUgZGVmaW5pdGVseSBwcmltZSBjYW5kaWRhdGVzIGZvciBmdXp6aW5nIHN5bWJvbHMuIEFsdGhvdWdoIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBpcyBzdGF0aWMgYW5kIHBvdGVudGlhbGx5IGxhcmdlLCBpdCBhbHJlYWR5IGV4aXN0cywgYW5kIHRoaXMgcGF0Y2gganVzdCAqbW9kaWZpZXMqIGl0IHRvIHVzZSB0aGUgbmV3IGtleXJpbmcsIHdoaWNoIG1lYW5zIGl0cyBtYWluIGxvZ2ljIGlzIGNyaXRpY2FsIGFuZCBzaG91bGQgYWxzbyBiZSBjb25zaWRlcmVkLiBTaW5jZSB0aGUgcGF0Y2ggaGVhdmlseSBjaGFuZ2VzIHRoaXMgZnVuY3Rpb24sIGluY2x1ZGluZyBpdCBtYWtlcyBzZW5zZS5cblxuRXNzZW50aWFsbHksIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2V5cmluZyBmb3IgdmVyaWZ5aW5nIEJQRiBwcm9ncmFtIHNpZ25hdHVyZXMsIGFuZCBpdCBlbmZvcmNlcyBpdHMgdXNlIHdoZW4gdW5zZWFsZWQuIFRoaXMgaW1wYWN0cyB0aGUgQlBGIHByb2dyYW0gbG9hZGluZyBhbmQgdmVyaWZpY2F0aW9uIHBhdGhzLCBhY2Nlc3NlZCBmcm9tIHVzZXItc3BhY2UgdGhyb3VnaCB0aGUgYGJwZigpYCBzeXNjYWxsLiBUaGlzIG1vZGlmaWVkIHBhdGggaXMgcmlwZSBmb3IgZnV6emluZy5cblxuTXkgcHJpbWFyeSBmb2N1cyB3aWxsIGJlIG9uIHRoZSBhZGRlZC9tb2RpZmllZCBmdW5jdGlvbmFsaXR5IHJlbGF0ZWQgdG8gdGhlIGtleXJpbmcuIEknbGwgZmxhZyBgYnBmX2xvb2t1cF9rZXlyaW5nYCBhbmQgYGJwZl9rZXlyaW5nX2VuZm9yY2VkYCBhcyBcIkZvY3VzU3ltYm9sc1wiLiBJJ2xsIGFsc28gaW5jbHVkZSBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAsIGFzIGl0cyByb2xlIGlzIGVzc2VudGlhbCBhbmQgaXQncyBub3QgaW5saW5lZC5cblxuQXMgZm9yIGNvbmZpZ3VyYXRpb25zLCBpdCdzIHByZXR0eSBjbGVhciB0aGF0IGBDT05GSUdfS0VZU2AgYW5kIGBCUEZfU1lTQ0FMTGAgYXJlIHJlbGV2YW50LiBJIG5lZWQgdGhlIGtleXJpbmcgc3VwcG9ydCAoS0VZUykgYW5kIHRoZSBCUEYgc3lzdGVtIGNhbGwgKEJQRl9TWVNDQUxMKSwgYXMgdGhlIEJQRiBzeXNjYWxsIGlzIGhvdyB0aGUgQlBGIGxvZ2ljIGlzIHJlYWNoZWQuXG5cbkkgcmV2aWV3ZWQgdGhlIGNoYW5nZXM6IGJlc2lkZXMgdGhlIEJQRiBjb2RlIGluIGBrZXJuZWwvYnBmL2tleXMuY2AgYW5kIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgLCBtYW55IHNlbGZ0ZXN0cyBhbmQgdG9vbHMgYXJlIHVwZGF0ZWQgdG8gc3VwcG9ydCB0aGUgY2hhbmdlcy4gVGhlIGZ1bmN0aW9uYWwgY2hhbmdlcyBhcmUgaW5kZWVkIHdpdGhpbiB0aGUga2VybmVsIG1vZHVsZXMuIFRoaXMgaXMgd29ydGggZnV6emluZy5cblxuU28sIHRoZSBwbGFuIGlzOiBmdXp6IHRoZSBCUEYgc3lzdGVtIGNhbGwsIHdpdGggdGhlIEtFWSBjb25maWcgZW5hYmxlZCwgYW5kIHRhcmdldCB0aGUgdmVyaWZpY2F0aW9uIGxvZ2ljIHRoYXQgbm93IGluY29ycG9yYXRlcyBrZXlyaW5nIGNoZWNrcy5cblxuSSdtIHJlYWR5IHRvIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI5Mjc0LCJPdXRwdXRUb2tlbnMiOjE1MSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExODEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNDo1Njo0NS4zNjI2MzI2MVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcxNzI3MzY1LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVlTXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9sb29rdXBfa2V5cmluZ1wiLFxuICAgIFwiYnBmX2tleXJpbmdfZW5mb3JjZWRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGAuYnBmYCBrZXlyaW5nIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFuZCBhIGBicGYua2V5cmluZ191bnNlYWxlZGAgYm9vdCBwYXJhbWV0ZXIuIEl0IG1vZGlmaWVzIHRoZSBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCB2ZXJpZmljYXRpb24gcGF0aHMgaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIHRvIGhhbmRsZSB0aGUgbmV3IGtleXJpbmcgYW5kIGVuZm9yY2UgaXRzIHVzZSB3aGVuIGNvbmZpZ3VyZWQuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IHRoZSBgYnBmKClgIHN5c2NhbGwgcGF0aCBhbmQgaW50cm9kdWNlIG5ldyByZWFjaGFibGUgc3RhdGUgYW5kIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLRVlTXCIsXG4gICAgXCJCUEZfU1lTQ0FMTFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9sb29rdXBfa2V5cmluZ1wiLFxuICAgIFwiYnBmX2tleXJpbmdfZW5mb3JjZWRcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IGAuYnBmYCBrZXlyaW5nIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGFuZCBhIGBicGYua2V5cmluZ191bnNlYWxlZGAgYm9vdCBwYXJhbWV0ZXIuIEl0IG1vZGlmaWVzIHRoZSBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCB2ZXJpZmljYXRpb24gcGF0aHMgaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIHRvIGhhbmRsZSB0aGUgbmV3IGtleXJpbmcgYW5kIGVuZm9yY2UgaXRzIHVzZSB3aGVuIGNvbmZpZ3VyZWQuIFRoZXNlIGNoYW5nZXMgYWZmZWN0IHRoZSBgYnBmKClgIHN5c2NhbGwgcGF0aCBhbmQgaW50cm9kdWNlIG5ldyByZWFjaGFibGUgc3RhdGUgYW5kIGxvZ2ljIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTY6NDUuNDM0MzY1NDY1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDI2OTg5OTg0MjgzLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTQ6NTY6NDUuNDM0ODUwODk1WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImJlc3QtZXhwZW5zaXZlIiwiRHVyYXRpb24iOjEwMjY5ODk0ODM2MzMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZXlyaW5nIChgLmJwZmApIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhbG9uZyB3aXRoIGEga2VybmVsIHBhcmFtZXRlciBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIHRvIG1hbmFnZSBpdHMgc3RhdGUuIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIGFkZGluZyBhIG5ldyBrZXlyaW5nIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLCBhZGRpbmcgYSBsb29rdXAgZnVuY3Rpb24gYGJwZl9sb29rdXBfa2V5cmluZ2Agd2hpY2ggYWxsb2NhdGVzIGEgYHN0cnVjdCBicGZfa2V5YCBhbmQgaW5pdGlhbGl6ZXMgaXRzIGZpZWxkcywgYW5kIG1vZGlmeWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgdG8gaGFuZGxlIHRoZSBuZXcgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgIElELlxcblxcbk5vbmUgb2YgdGhlc2UgY2hhbmdlcyBpbnRyb2R1Y2UgbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBpbnRyb2R1Y2UgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcy4gVGhlIG9ubHkgbmV3IGtlcm5lbCBhbGxvY2F0aW9uIGlzIGZvciBgc3RydWN0IGJwZl9rZXlgIHZpYSBga21hbGxvY19vYmpgLCBhbmQgYWxsIGl0cyBmaWVsZHMgKGBrZXlgIGFuZCBgaGFzX3JlZmApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpb24uIFRoZSBzaWduYXR1cmUgYW5kIGRhdGEgYnVmZmVycyB1c2VkIGR1cmluZyB2ZXJpZmljYXRpb24gYXJlIGFsbG9jYXRlZCB3aXRoIGBrdm1lbWR1cF9icGZwdHJgICh3aGljaCBjb3BpZXMgZnJvbSB1c2VyIHNwYWNlKSBhbmQgYGt2bWFsbG9jKC4uLiwgX19HRlBfWkVSTylgICh3aGljaCB6ZXJvLWluaXRpYWxpemVzKSwgcmVzcGVjdGl2ZWx5LlxcblxcbkFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMsIHN1Y2ggYXMgbWVtb3J5IGxlYWtzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciB1c2UtYWZ0ZXItZnJlZSBpc3N1ZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgNGIyMzJmODkwY2U2ZjE1YmM3OGI1Njc1MWZiNjljNDA0YjE3OWRiMFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUdWUgQXVnIDI1IDE0OjU1OjA3IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dFxuaW5kZXggZTQ2NDM2MzRhOWIxYi4uZTcwZmIxNTc1N2Q0MCAxMDA2NDRcbi0tLSBhL0RvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUva2VybmVsLXBhcmFtZXRlcnMudHh0XG4rKysgYi9Eb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dFxuQEAgLTY2Nyw2ICs2NjcsMjIgQEAgS2VybmVsIHBhcmFtZXRlcnNcbiBcbiBcdFx0XHRTZWUgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9ib290Y29uZmlnLnJzdFxuIFxuK1x0YnBmLmtleXJpbmdfdW5zZWFsZWQ9XG4rXHRcdFx0W0JQRl0gV2hlbiBzZXQgdG8gMSwgbGVhdmUgdGhlIGJwZiBrZXlyaW5nIHVuc2VhbGVkXG4rXHRcdFx0YWZ0ZXIgaW5pdGlhbGl6YXRpb24gc28gdGhhdCB1c2Vyc3BhY2UgY2FuIHByb3Zpc2lvblxuK1x0XHRcdGtleXMuIE9uY2UgdGhlIGtleXJpbmcgaXMgcmVzdHJpY3RlZCBpdCBiZWNvbWVzIGFjdGl2ZVxuK1x0XHRcdGFuZCBjYW4gYmUgdXNlZCBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi5cbitcbitcdFx0XHRTZXR0aW5nIHRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZSBicGYga2V5cmluZyBpcyB0aGVcbitcdFx0XHRvbmx5IG5vbi1zeXN0ZW0ga2V5cmluZyBhIGxvYWRlciBtYXkgc2VsZWN0IGZvciB0aGVcbitcdFx0XHRyZXN0IG9mIHRoZSBib290OiBjYWxsZXItc3VwcGxpZWQgdXNlci9zZXNzaW9uXG4rXHRcdFx0a2V5cmluZ3MgYXJlIHJlZnVzZWQgd2l0aCAtRVBFUk0sIHdoZXRoZXIgb3Igbm90XG4rXHRcdFx0cHJvdmlzaW9uaW5nIGFjdHVhbGx5IGNvbXBsZXRlZC4gVGhlIHN5c3RlbSBrZXlyaW5nc1xuK1x0XHRcdHN0YXkgc2VsZWN0YWJsZS4gTGVhdmluZyBpdCB1bnNldCBrZWVwcyB0aGUgcHJpb3JcbitcdFx0XHRiZWhhdmlvdXIsIHdoZXJlIGEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgaXMgYWxsb3dlZC5cbitcbitcdFx0XHRTZWUgRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3RcbitcbiBcdGJ0dHYuY2FyZD1cdFtIVyxWNExdIGJ0dHYgKGJ0ODQ4ICsgYnQ4NzggYmFzZWQgZ3JhYmJlciBjYXJkcylcbiBcdGJ0dHYucmFkaW89XHRNb3N0IGltcG9ydGFudCBpbnNtb2Qgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGFzXG4gXHRcdFx0a2VybmVsIGFyZ3MgdG9vLlxuZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYnBmL3NpZ25pbmcucnN0IGIvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3RcbmluZGV4IGU3M2VhYWViZDhiMTUuLjZjMDNmYjU4YjE0NjQgMTAwNjQ0XG4tLS0gYS9Eb2N1bWVudGF0aW9uL2JwZi9zaWduaW5nLnJzdFxuKysrIGIvRG9jdW1lbnRhdGlvbi9icGYvc2lnbmluZy5yc3RcbkBAIC0yNTQsMjEgKzI1NCwyNSBAQCByZXR1cm5lZC4gT25seSBhZnRlciB0aGUgcHJvZ3JhbSBoYXMgZnVsbHkgbG9hZGVkLCBhdCB0aGUgbmV4dCBob29rXG4gKGBgc2VjdXJpdHlfYnBmX3Byb2coKWBgKSwgZG9lcyBgYEJQRl9TSUdfVkVSSUZJRURgYCBjYXJyeSBpdHMgZnVsbCBtZWFuaW5nOlxuIHZhbGlkbHkgc2lnbmVkICphbmQqIGZ1bGx5IHZlcmlmaWVkLlxuIFxuLUEgbW9yZSByZWFsaXN0aWMgYWRtaXNzaW9uIHBvbGljeSB0aGFuIFwiaXMgaXQgc2lnbmVkIGF0IGFsbFwiOiBhY2NlcHQgcHJvZ3JhbXNcbi1zaWduZWQgYnkgYSBzeXN0ZW0ga2V5cmluZywgYWNjZXB0IGEgdXNlci1rZXlyaW5nIHNpZ25hdHVyZSBvbmx5IGlmIHRoZVxuLWtleS9rZXlyaW5nIGl0IHdhcyB2ZXJpZmllZCBhZ2FpbnN0IGlzIG9uIGFuIGV4cGxpY2l0IGFsbG93bGlzdCwgYW5kIGVtaXQgYVxuLXRhbXBlci1ldmlkZW50IHJlY29yZCBvZiBldmVyeSBkZWNpc2lvbiBzbyB0aGF0IGV2ZW4gZGVuaWVkIGF0dGVtcHRzIGFyZVxuLWF1ZGl0YWJsZS4gKElsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4rQSBtb3JlIHJlYWxpc3RpYyBhZG1pc3Npb24gcG9saWN5IHRoYW4gXCJpcyBpdCBzaWduZWQgYXQgYWxsXCI6IGJhc2UgdHJ1c3QgaW5cbit0aGUgYnBmIGtleXJpbmcsIGFjY2VwdCBhIHN0YWdpbmcgc2lnbmF0dXJlIG9ubHkgd2hpbGUgdGhlIGtleS9rZXlyaW5nIHRoZVxuK3Byb2dyYW0gd2FzIHZlcmlmaWVkIGFnYWluc3QgaXMgb24gYW4gZXhwbGljaXQgYWxsb3dsaXN0LCBhbmQgZW1pdCBhIHRhbXBlci1cbitldmlkZW50IHJlY29yZCBvZiBldmVyeSBkZWNpc2lvbiBzbyB0aGF0IGV2ZW4gZGVuaWVkIGF0dGVtcHRzIGFyZSBhdWRpdGFibGUuXG4rKGlsbHVzdHJhdGl2ZSAtIGVycm9yIGNoZWNraW5nIGVsaWRlZC4pXG4gXG4gLi4gY29kZS1ibG9jazo6IGNcbiBcbi0gICAgLyogU2VyaWFscyBvZiB1c2VyIGtleXMva2V5cmluZ3Mgd2UgYWRkaXRpb25hbGx5IHRydXN0LiAqL1xuKyAgICAvKlxuKyAgICAgKiBTZXJpYWxzIG9mIGNhbGxlci1zdXBwbGllZCBrZXlyaW5ncyB3ZSBhcmUgd2lsbGluZyB0byBzdGFnZS4gRW1wdHlcbisgICAgICogb24gYSBzeXN0ZW0gdGhhdCBoYXMgY29tbWl0dGVkIHRvIHRoZSBicGYga2V5cmluZywgd2hlcmUgdGhlIGtlcm5lbFxuKyAgICAgKiByZWZ1c2VzIHRoZW0gYW55d2F5LlxuKyAgICAgKi9cbiAgICAgc3RydWN0IHtcbiAgICAgICAgICAgICBfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0hBU0gpO1xuICAgICAgICAgICAgIF9fdHlwZShrZXksIF9fczMyKTsgICAgICAgICAgICAgLyoga2V5cmluZ19zZXJpYWwgKi9cbiAgICAgICAgICAgICBfX3R5cGUodmFsdWUsIF9fdTgpO1xuICAgICAgICAgICAgIF9fdWludChtYXhfZW50cmllcywgNjQpO1xuLSAgICB9IHRydXN0ZWRfdXNlcl9rZXlzIFNFQyhcIi5tYXBzXCIpO1xuKyAgICB9IHN0YWdpbmdfa2V5cyBTRUMoXCIubWFwc1wiKTtcbiBcbiAgICAgLyogQXVkaXQgc3RyZWFtIGNvbnN1bWVkIGJ5IGEgdXNlcnNwYWNlIGxvZ2dlci4gKi9cbiAgICAgc3RydWN0IHtcbkBAIC0yOTEsMTEgKzI5NSwxOSBAQCBhdWRpdGFibGUuIChJbGx1c3RyYXRpdmUgLSBlcnJvciBjaGVja2luZyBlbGlkZWQuKVxuICAgICAgICAgICAgIGlmIChrZXJuZWwpXG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRydXN0IGluLWtlcm5lbCBsb2FkcyAqL1xuIFxuLSAgICAgICAgICAgIGlmICh2ZXJkaWN0ICE9IEJQRl9TSUdfVkVSSUZJRUQpXG4rICAgICAgICAgICAgaWYgKHZlcmRpY3QgIT0gQlBGX1NJR19WRVJJRklFRCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNOyAgICAgICAgICAgICAgICAgICAvKiBtdXN0IGJlIHZhbGlkbHkgc2lnbmVkICovXG4tICAgICAgICAgICAgZWxzZSBpZiAoa3R5cGUgPT0gQlBGX1NJR19LRVlSSU5HX1VTRVIgXHUwMDI2XHUwMDI2XG4tICAgICAgICAgICAgICAgICAgICAgIWJwZl9tYXBfbG9va3VwX2VsZW0oXHUwMDI2dHJ1c3RlZF91c2VyX2tleXMsIFx1MDAyNnNlcmlhbCkpXG4tICAgICAgICAgICAgICAgICAgICByZXQgPSAtRVBFUk07ICAgICAgICAgICAgICAgICAgIC8qIGtleS9rZXlyaW5nIG5vdCBhbGxvd2xpc3RlZCAqL1xuKyAgICAgICAgICAgIH0gZWxzZSBzd2l0Y2ggKGt0eXBlKSB7XG4rICAgICAgICAgICAgY2FzZSBCUEZfU0lHX0tFWVJJTkdfQlVJTFRJTjpcbisgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19CUEY6XG4rICAgICAgICAgICAgICAgICAgICBicmVhaztcbisgICAgICAgICAgICBjYXNlIEJQRl9TSUdfS0VZUklOR19VU0VSOlxuKyAgICAgICAgICAgICAgICAgICAgaWYgKCFicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNnN0YWdpbmdfa2V5cywgXHUwMDI2c2VyaWFsKSlcbisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVQRVJNO1xuKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4rICAgICAgICAgICAgZGVmYXVsdDpcbisgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FUEVSTTsgICAgICAgICAgICAgICAgICAgLyoga2V5cmluZyBub3QgaW4gcG9saWN5ICovXG4rICAgICAgICAgICAgfVxuIFxuICAgICAgICAgICAgIGQgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKFx1MDAyNmF1ZGl0LCBzaXplb2YoKmQpLCAwKTtcbiAgICAgICAgICAgICBpZiAoZCkge1xuQEAgLTMwOSw2ICszMjEsMTEgQEAgYXVkaXRhYmxlLiAoSWxsdXN0cmF0aXZlIC0gZXJyb3IgY2hlY2tpbmcgZWxpZGVkLilcbiAgICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICB9XG4gXG4rU3VjaCBhIHBvbGljeSBpcyB3aGF0IG1ha2VzIGEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgdXNhYmxlIGF0IGFsbCBvbiBhIHN5c3RlbVxuK3RoYXQgZG9lcyBub3QgYm9vdCB3aXRoIGBgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgOiB0aGUgYWxsb3dsaXN0IGJvdW5kcyB3aGljaFxuK3N0YWdlZCBrZXlzIGNvdW50LCBhbmQgdGhlIExTTSBpdHNlbGYgaGFzIHRvIHByb3RlY3QgdGhlbSBmcm9tIGJlaW5nIHRhbXBlcmVkXG4rd2l0aC5cbitcbiBPYnNlcnZpbmcgYSB2ZXJpZmllZCBsb2FkOiBgYHNlY3VyaXR5X2JwZl9wcm9nKClgYFxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gXG5AQCAtMzgxLDggKzM5OCw5IEBAIHRoYXQgdmVyZGljdCBjb3ZlcmVkIGFsbCBvZiBpdHMgZXhjbHVzaXZlIG1hcHMsIHJlamVjdGluZyBhbnkgdGhhdCBkaWQgbm90IC0gc29cbiBhIGRlbnktYnktZGVmYXVsdCBhZG1pc3Npb24gcG9saWN5IG5lZWRzIG5vIHNlY29uZCBlbmZvcmNlbWVudCBwb2ludC4gVXNlXG4gYGBzZWN1cml0eV9icGZfcHJvZygpYGAgdG8gcmVjb3JkIG9yIGZpbmFsbHkgZ2F0ZSB0aGUgdmVyaWZpZWQgcHJvZ3JhbXMgb25jZVxuIHRoZXkgY2FycnkgYW4gaWQuIFRoZSBgYHZlcmRpY3RgYCwgYGBrZXlyaW5nX3R5cGVgYCBhbmQgYGBrZXlyaW5nX3NlcmlhbGBgIGZpZWxkc1xuLWxldCBhIHBvbGljeSBkaXN0aW5ndWlzaCwgZm9yIGV4YW1wbGUsIFwidmVyaWZpZWQgYW5kIHNpZ25lZCBieSBhIGJ1aWx0aW4ga2V5XCJcbi1mcm9tIFwidmVyaWZpZWQgYnkgYSB1c2VyIGtleVwiLiBBIHBvbGljeSBMU00gc3VjaCBhcyBJUEUgY291bGQgY29uc3VtZSB0aGUgc2FtZVxuK2xldCBhIHBvbGljeSBkaXN0aW5ndWlzaCBcInZlcmlmaWVkIGFnYWluc3QgdGhlIG9wZXJhdG9yJ3MgYnBmIGtleXJpbmdcIiBmcm9tXG4rXCJ2ZXJpZmllZCBhZ2FpbnN0IGEga2V5cmluZyB0aGUgbG9hZGVyIHN1cHBsaWVkIGl0c2VsZlwiLCB3aGljaCBpcyB0aGVcbitkaXN0aW5jdGlvbiB0aGF0IG1hdHRlcnMgbW9zdC4gQSBwb2xpY3kgTFNNIHN1Y2ggYXMgSVBFIGNvdWxkIGNvbnN1bWUgdGhlIHNhbWVcbiBob29rcyB0byBlbmZvcmNlIHN5c3RlbSBwb2xpY3kgd2l0aG91dCB3cml0aW5nIGFueSBCUEYsIHRob3VnaCBub25lIGltcGxlbWVudHNcbiB0aGlzIHRvZGF5LlxuIFxuQEAgLTM5MCwzMyArNDA4LDE1NCBAQCBLZXlyaW5nc1xuID09PT09PT09XG4gXG4gYGBrZXlyaW5nX2lkYGAgc2VsZWN0cyB0aGUgdHJ1c3RlZCBrZXlyaW5nIHRoZSBQS0NTIzcgc2lnbmF0dXJlIGlzIHZlcmlmaWVkXG4tYWdhaW5zdC4gVGhlIHdlbGwta25vd24gaWRzIGBgMGBgIChidWlsdGluKSwgYGBWRVJJRllfVVNFX1NFQ09OREFSWV9LRVlSSU5HYGBcbi1hbmQgYGBWRVJJRllfVVNFX1BMQVRGT1JNX0tFWVJJTkdgYCBzZWxlY3QgdGhlIGNvcnJlc3BvbmRpbmcgc3lzdGVtIGtleXJpbmdzO1xuLWFueSBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIHRoZSBzZXJpYWwgb2YgYSB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmcuXG4tVGhlIGtleXJpbmcgaXMgbG9va2VkIHVwIGZpcnN0LCBiZWZvcmUgdGhlIHNpZ25hdHVyZSBieXRlcyBhcmUgZXhhbWluZWQsIHNvIGFcbi1zaWduYXR1cmUgbmFtaW5nIGEgbm9uLWV4aXN0ZW50IGtleXJpbmcgaXMgcmVqZWN0ZWQgdXAgZnJvbnQsIGFuZCBhIGZhaWxlZFxuLXZlcmlmaWNhdGlvbiBhYm9ydHMgdGhlIGxvYWQgLSBzbyBhIHByb2dyYW0gdGhhdCBsb2FkcyBzdWNjZXNzZnVsbHkgd2l0aCBhXG4tc2lnbmF0dXJlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC5cbithZ2FpbnN0LiBGb3VyIHZhbHVlcyBhcmUgd2VsbC1rbm93bjsgYW55dGhpbmcgZWxzZSBpcyB0YWtlbiBhcyB0aGUgc2VyaWFsIG9mIGFcbitjYWxsZXItc3VwcGxpZWQgdXNlciBvciBzZXNzaW9uIGtleSBvciBrZXlyaW5nOlxuK1xuKy4uIGxpc3QtdGFibGU6OlxuKyAgIDpoZWFkZXItcm93czogMVxuK1xuKyAgICogLSBgYGtleXJpbmdfaWRgYFxuKyAgICAgLSBLZXlyaW5nXG4rICAgKiAtIGBgMGBgXG4rICAgICAtIGJ1aWx0aW4gdHJ1c3RlZCBrZXlyaW5nXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9TRUNPTkRBUllfS0VZUklOR2BgIChgYDFgYClcbisgICAgIC0gc2Vjb25kYXJ5IHRydXN0ZWQga2V5cmluZ1xuKyAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgIChgYDJgYClcbisgICAgIC0gcGxhdGZvcm0ga2V5cmluZ1xuKyAgICogLSBgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCAoYGAzYGApXG4rICAgICAtIHRoZSBicGYga2V5cmluZ1xuKyAgICogLSBhbnl0aGluZyBlbHNlXG4rICAgICAtIHNlcmlhbCBvZiBhIGNhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5IG9yIGtleXJpbmdcbitcbitUaGUga2V5cmluZyBpcyByZXNvbHZlZCBmaXJzdCwgYmVmb3JlIHRoZSBzaWduYXR1cmUgYnl0ZXMgYXJlIGV4YW1pbmVkLCBzbyBhXG4rc2lnbmF0dXJlIG5hbWluZyBhIGtleXJpbmcgdGhhdCBjYW5ub3QgYmUgdXNlZCBpcyByZWplY3RlZCB1cCBmcm9udCwgYW5kIGFcbitmYWlsZWQgdmVyaWZpY2F0aW9uIGFib3J0cyB0aGUgbG9hZCAtIGEgcHJvZ3JhbSB0aGF0IGxvYWRzIHN1Y2Nlc3NmdWxseSB3aXRoXG4rYSBzaWduYXR1cmUgdGhlcmVmb3JlIGFsd2F5cyBoYXMgY29uc2lzdGVudCBrZXlyaW5nIGZpZWxkcyByZWNvcmRlZC5cbitcbitUaGUgYnBmIGtleXJpbmdcbistLS0tLS0tLS0tLS0tLS1cbitcbitBIHN5c3RlbSBrZXlyaW5nIG5lZWRzIGEga2VybmVsIHJlYnVpbGQgb3IgYSB2b3VjaGVkLWZvciBlbnJvbGxtZW50IHRvIHJvdGF0ZSBhXG4ra2V5LCBhbmQgZ3JhbnRzIEJQRi1zaWduaW5nIHRydXN0IHRvIGtleXMgdHJ1c3RlZCBmb3IgZXZlcnl0aGluZyBlbHNlIGluIHRoZVxuK2tlcm5lbCB0b28uIEEgY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcsIGF0IHRoZSBvdGhlciBleHRyZW1lLCBpcyBmaWxsZWQgYnkgdGhlXG4rdmVyeSBwcm9jZXNzIHRoYXQgbG9hZHMgdGhlIHByb2dyYW0gYW5kIHNvIGNhcnJpZXMgbm8gdHJ1c3Qgb2YgaXRzIG93bi5cbitcbitUaGUgYnBmIGtleXJpbmcgZmlsbHMgdGhhdCBnYXAgYW5kIGlzIHRoZSB0cnVzdCBhbmNob3Igd2hpY2ggYSBzaWduZWQgQlBGXG4rZGVwbG95bWVudCBzaG91bGQgYmUgYnVpbHQgb24gdG9wIG9mOiBhIGtleXJpbmcgbmFtZWQgYGAuYnBmYGAsIHNlbGVjdGVkIHdpdGhcbitgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCwgdGhhdCBhbiBvcGVyYXRvciBwcm92aXNpb25zIGF0IGJvb3Qgd2l0aCBhIGtleVxuK3Njb3BlZCB0byBCUEYgcHJvZ3JhbSBsb2FkaW5nIGFuZCBub3RoaW5nIGVsc2UgaW4gdGhlIGtlcm5lbCdzIHRydXN0IGhpZXJhcmNoeS5cbitJdCBpcyBvd25lZCBieSB0aGUgb3BlcmF0b3IgcmF0aGVyIHRoYW4gYnkgdGhlIGxvYWRlciwgYW5kIHJvdGF0YWJsZSBhY3Jvc3MgYVxuK3JlYm9vdCB3aXRob3V0IHRvdWNoaW5nIHRoZSBrZXJuZWwgaW1hZ2UuIEl0IGlzIG1vZGVsbGVkIGFmdGVyIHRoZSBkbS12ZXJpdHlcbitrZXlyaW5nIChzZWUgYGBkbV92ZXJpdHkua2V5cmluZ191bnNlYWxlZD1gYCkgYW5kIHByb3Zpc2lvbmVkIHRoZSBzYW1lIHdheTogYW5cbitpbml0cmQgcnVucyB0aGUgYGBrZXljdGxgYCBzdGVwcyBiZWxvdyBiZWZvcmUgaGFuZGluZyBvZmYgdG8gdGhlIHJvb3Rmcy5cbitcbitQcm92aXNpb25pbmdcbit+fn5+fn5+fn5+fn5cbitcbitUaGUga2V5cmluZyBpcyBjcmVhdGVkIGR1cmluZyBgYGxhdGVfaW5pdGNhbGxgYCBhbmQgaXMgKipzZWFsZWQgZW1wdHkqKiBieVxuK2RlZmF1bHQ6IGl0IGNhcnJpZXMgYSByZWplY3QtYWxsIHJlc3RyaWN0aW9uLCBzbyBubyBrZXkgY2FuIGV2ZXIgYmUgYWRkZWQgYW5kXG4rYGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYGAgZmFpbHMgd2l0aCBgYC1FTk9LRVlgYCBmb3IgdGhlIHdob2xlIGJvb3QuXG4rXG4rYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGAgbGVhdmVzIGl0IHVucmVzdHJpY3RlZCBhdCBpbml0IHNvIHRoZSBpbml0cmQgY2FuXG4rcHJvdmlzaW9uIGl0LiBUaGUga2V5cmluZyBpcyBub3QgbGlua2VkIGludG8gYW55IHByb2Nlc3Mga2V5cmluZywgc28gaXQgaXNcbithZGRyZXNzZWQgYnkgdGhlIHNlcmlhbCBgYC9wcm9jL2tleXNgYCByZXBvcnRzLiBTdGVwcyB3b3VsZCBiZSBhcyBmb2xsb3dzOjpcbitcbisgICAgc2VyaWFsPTB4JChhd2sgJyQ4ID09IFwia2V5cmluZ1wiIFx1MDAyNlx1MDAyNiAkOSA9PSBcIi5icGY6XCIgeyBwcmludCAkMSB9JyAvcHJvYy9rZXlzKVxuK1xuKyAgICBrZXljdGwgcGFkZCBhc3ltbWV0cmljIFwiXCIgJHNlcmlhbCBcdTAwM2Mgc2lnbmluZ19rZXkuZGVyXG4rICAgIGtleWN0bCByZXN0cmljdF9rZXlyaW5nICRzZXJpYWxcbitcbitCb3RoIHN0ZXBzIGFyZSByZXF1aXJlZDogdGhlIGtleXJpbmcgaXMgY29uc3VsdGVkIG9ubHkgb25jZSBpdCBpcyAqKm5vbi1lbXB0eVxuK2FuZCByZXN0cmljdGVkKiouIEFuIHVucmVzdHJpY3RlZCBrZXlyaW5nIGlzIGlnbm9yZWQgZXZlbiB3aGVuIGl0IGhvbGRzIGtleXMsXG4rc28gYSBoYWxmLXByb3Zpc2lvbmVkIGtleXJpbmcgaXMgaW5lcnQgcmF0aGVyIHRoYW4gYSB3ZWFrZXIgdHJ1c3QgYW5jaG9yLCBhbmQgYVxuK2xvYWQgbmFtaW5nIGl0IGZhaWxzIHdpdGggYGAtRU5PS0VZYGAgYW5kIGEgdmVyaWZpZXIgbG9nLiBSZXN0cmljdGluZyBjYW5ub3RcbitiZSB1bmRvbmUuXG4rXG4rTW9yZSB0aGFuIG9uZSBrZXkgaXMgZW5yb2xsZWQgYnkgcmVwZWF0aW5nIHRoZSBgYGtleWN0bCBwYWRkYGAgc3RlcDsgdGhlXG4rcmVzdHJpY3Rpb24gaXMgYXBwbGllZCBvbmNlLCBhZnRlciB0aGUgbGFzdCBvZiB0aGVtOjpcbitcbisgICAgZm9yIGtleSBpbiAvZXRjL2JwZi9rZXlzLyouZGVyOyBkb1xuKyAgICAgICAga2V5Y3RsIHBhZGQgYXN5bW1ldHJpYyBcIlwiICRzZXJpYWwgXHUwMDNjICRrZXlcbisgICAgZG9uZVxuK1xuKyAgICBrZXljdGwgcmVzdHJpY3Rfa2V5cmluZyAkc2VyaWFsXG4rICAgIGtleWN0bCBzaG93ICRzZXJpYWxcbitcbitUaGUgcmVzdHJpY3Rpb24gYm91bmRzIHdoYXQgY2FuIGJlIGFkZGVkLCBuZXZlciB3aGF0IGNhbiBiZSB0YWtlbiBhd2F5LiBBIGtleVxuK3RoYXQgaXMgYWxyZWFkeSBlbnJvbGxlZCBjYW4gc3RpbGwgYmUgdW5saW5rZWQsIGFuZCB0aGUga2V5cmluZyBjbGVhcmVkIG9yXG4rcmV2b2tlZCwgYnkgYW55dGhpbmcgcnVubmluZyBhcyByb290LiBUaGF0IGRvZXMgbm90IHdlYWtlbiB0aGUgYW5jaG9yLCBzaW5jZVxuK2Ega2V5cmluZyBsZWZ0IGVtcHR5IGlzIG5vIGxvbmdlciBjb25zdWx0ZWQgYW5kIGEgbG9hZCBuYW1pbmcgaXQgZmFpbHMgd2l0aFxuK2BgLUVOT0tFWWBgLCBidXQgaXQgZG9lcyB0YWtlIHNpZ25lZCBsb2FkaW5nIG91dCB1bnRpbCB0aGUgbmV4dCBib290LiBEcm9wcGluZ1xuK3RoZSB1c2VyIHBlcm1pc3Npb25zIHRoZSBrZXlyaW5nIG5vIGxvbmdlciBuZWVkcyB3b3VsZCBjbG9zZSB0aGF0OyBhcyBhIHRoaXJkXG4rc3RlcCBpbiB0aGUgaW5pdHJkOjpcbitcbisgICAga2V5Y3RsIHNldHBlcm0gJHNlcmlhbCAweDA4MDMwMDAwXG4rXG4rV2hhdCByZW1haW5zIGlzIGBgS0VZX1BPU19TRUFSQ0hgYCBmb3IgdGhlIGluLWtlcm5lbCBzZWFyY2ggZHVyaW5nIHZlcmlmaWNhdGlvbixcbitwbHVzIGBgS0VZX1VTUl9WSUVXYGAgYW5kIGBgS0VZX1VTUl9SRUFEYGAgc28gdGhlIGtleXJpbmcgc3RheXMgdmlzaWJsZSBpblxuK2BgL3Byb2Mva2V5c2BgIGFuZCBgYGtleWN0bCBzaG93YGAuXG4rXG4rUHJvdmlzaW9uaW5nIGhhcyB0byBjb21wbGV0ZSBiZWZvcmUgY29udHJvbCBwYXNzZXMgdG8gdGhlIHJvb3Rmcy4gVGhlIGtleXJpbmdcbit0YWtlcyBhbnkgbnVtYmVyIG9mIGtleXMgZm9yIGFzIGxvbmcgYXMgaXQgaXMgdW5yZXN0cmljdGVkLCBzbyBpdCBpcyB0aGVcbityZXN0cmljdGlvbiB0aGF0IGJvdW5kcyB0aGUgZW5yb2xsZWQgc2V0LCBub3QgdGhlIGZpcnN0IGVucm9sbG1lbnQuIEJlZm9yZVxuK3RoZSBpbml0cmQgaGFuZHMgb2ZmIGNvbnRyb2wsIGl0IG11c3QgdGhlcmVmb3JlIHJlc3RyaWN0IHRoZSBrZXlyaW5nIGFmdGVyXG4rdGhlIGxhc3QgZW5yb2xsbWVudC5cbitcbitFbmZvcmNlbWVudFxuK35+fn5+fn5+fn5+XG4rXG4rYGBicGYua2V5cmluZ191bnNlYWxlZD0xYGAgc3RhdGVzIHRoYXQgdGhlIGJwZiBrZXlyaW5nIGlzICp0aGUqIHRydXN0IGFuY2hvciBmb3Jcbit0aGlzIGJvb3QsIHNvIGl0IGRvZXMgbW9yZSB0aGFuIHVuc2VhbC4gRnJvbSB0aGUgZmlyc3QgcHJvZ3JhbSBsb2FkIG9ud2FyZHMgYVxuK2NhbGxlci1zdXBwbGllZCB1c2VyL3Nlc3Npb24ga2V5cmluZyBpcyByZWZ1c2VkIHdpdGggYGAtRVBFUk1gYCBhbmQgYSB2ZXJpZmllclxuK2xvZyBtZXNzYWdlLCB3aGV0aGVyIG9yIG5vdCBwcm92aXNpb25pbmcgZXZlciBjb21wbGV0ZWQuIFRoZSBzeXN0ZW0ga2V5cmluZ3NcbitzdGF5IHNlbGVjdGFibGUuXG4rXG4rRW5mb3JjZW1lbnQgaXMgcmVhZGFibGUgYXQgYGAvc3lzL21vZHVsZS9icGYvcGFyYW1ldGVycy9rZXlyaW5nX3Vuc2VhbGVkYGAsIGFuZFxuK3JlYWQtb25seSB0aGVyZTogdGhlIGZsYWcgaXMgYGBfX3JvX2FmdGVyX2luaXRgYCBiZWhpbmQgYSAwNDQ0IHBhcmFtZXRlci4gSXQgaXNcbithbHNvIGRlcml2ZWQgZnJvbSB0aGUgYm9vdCBmbGFnIHJhdGhlciB0aGFuIGZyb20gdGhlIGtleXJpbmcncyBydW50aW1lIHN0YXRlLFxuK3NvIHRoZXJlIGlzIG5vIHdpbmRvdyBlYXJseSBpbiBib290IGR1cmluZyB3aGljaCBhIGNhbGxlci1zdXBwbGllZCBrZXlyaW5nIGlzXG4rc3RpbGwgYWNjZXB0ZWQuXG4rXG4rQ2FsbGVyLXN1cHBsaWVkIGtleXJpbmdzIGFyZSBmb3Igc3RhZ2luZ1xuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbitcbitBIGBga2V5cmluZ19pZGBgIG5hbWluZyBhIHVzZXIgb3Igc2Vzc2lvbiBrZXkgb3Iga2V5cmluZyBpcyBhICpzdGFnaW5nKlxuK21lY2hhbmlzbSwgbm90IGEgdHJ1c3QgYW5jaG9yOiBpdCBpcyBmaWxsZWQgYnkgdGhlIHNhbWUgdXNlcnNwYWNlIHRoYXQgbG9hZHMgdGhlXG4rcHJvZ3JhbSwgc28gdmVyaWZ5aW5nIGFnYWluc3QgaXQgZXN0YWJsaXNoZXMgb25seSB0aGF0IHRoZSBsb2FkZXIgc2lnbmVkIHdoYXQgaXRcbitsb2FkZWQuIEl0cyBwdXJwb3NlIGlzIHRvIGxldCBzb2Z0d2FyZSBpbnN0YWxsZWQgb250byBhIHJ1bm5pbmcgc3lzdGVtIC0gd2hvc2VcbitzaWduaW5nIGtleSBpcyBub3QgZW5yb2xsZWQgYW55d2hlcmUgeWV0IC0gcnVuIHNpZ25lZCB1bnRpbCB0aGF0IGtleSByZWFjaGVzIHRoZVxuK2JwZiBrZXlyaW5nIG9uIHRoZSBuZXh0IGJvb3QuXG4rXG4rQSBzeXN0ZW0gdGhhdCBoYXMgY29tbWl0dGVkIHRvIHRoZSBicGYga2V5cmluZyByZWZ1c2VzIHRoaXMgcGF0aCBvdXRyaWdodCAoc2VlXG4rYEVuZm9yY2VtZW50YF8pLiBBIHN5c3RlbSB0aGF0IGhhcyBub3QgY2FuIHN0aWxsIGFsbG93IGl0LCBidXQgYSBwb2xpY3kgbXVzdFxuK25ldmVyIHRyZWF0IGBgQlBGX1NJR19LRVlSSU5HX1VTRVJgYCBhcyBlcXVpdmFsZW50IHRvIHRoZSBicGYgb3Igc3lzdGVtXG4ra2V5cmluZ3M7IGl0IHNob3VsZCBhbGxvd2xpc3QgdGhlIHNwZWNpZmljIHNlcmlhbHMgaXQgaXMgd2lsbGluZyB0byBzdGFnZSBhbmRcbitwYWlyIHRoYXQgd2l0aCBhIEJQRiBMU00gcG9saWN5IHByb3RlY3RpbmcgdGhvc2Uga2V5cyBmcm9tIHRhbXBlcmluZywgYXMgaW5cbitgRW5mb3JjZW1lbnQgdmlhIExTTXNgXy5cbitcbitSZWNvcmRlZCBmaWVsZHNcbistLS0tLS0tLS0tLS0tLS1cbiBcbiBUd28gZmllbGRzIGFyZSByZWNvcmRlZCBpbiBgYHByb2ctXHUwMDNlYXV4LVx1MDAzZXNpZ2BgIGZvciBhbiBMU00gdG8gaW5zcGVjdDpcbiBcbiBgYGtleXJpbmdfdHlwZWBgIChgYGVudW0gYnBmX3NpZ19rZXlyaW5nYGApXG4gICAgIENsYXNzaWZpZWQgcHVyZWx5IGZyb20gYGBrZXlyaW5nX2lkYGAgd2hlbmV2ZXIgdGhlIHByb2dyYW0gaXMgc2lnbmVkOlxuICAgICBgYEJQRl9TSUdfS0VZUklOR19CVUlMVElOYGAsIGBgX1NFQ09OREFSWWBgLCBgYF9QTEFURk9STWBgIGZvciB0aGUgc3lzdGVtXG4tICAgIGtleXJpbmdzLCBvciBgYF9VU0VSYGAgZm9yIGEgdXNlci9zZXNzaW9uIGtleXJpbmcuIEl0IGlzXG4tICAgIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYCBmb3IgYW4gdW5zaWduZWQgcHJvZ3JhbS5cbisgICAga2V5cmluZ3MsIGBgX0JQRmBgIGZvciB0aGUgYnBmIGtleXJpbmcsIG9yIGBgX1VTRVJgYCBmb3IgYSBjYWxsZXItc3VwcGxpZWRcbisgICAgdXNlci9zZXNzaW9uIGtleXJpbmcuIEl0IGlzIGBgQlBGX1NJR19LRVlSSU5HX05PTkVgYCBmb3IgYW4gdW5zaWduZWRcbisgICAgcHJvZ3JhbS5cbiBcbiBgYGtleXJpbmdfc2VyaWFsYGAgKGBgczMyYGApXG4gICAgIFNldCAqKm9ubHkqKiBvbiBhIHN1Y2Nlc3NmdWwgdmVyaWZpY2F0aW9uLCB0byB0aGUgc2VyaWFsIG9mIHRoZVxuLSAgICAqKnVzZXIvc2Vzc2lvbiBrZXkgb3Iga2V5cmluZyoqIHRoYXQgYGBrZXlyaW5nX2lkYGAgcmVzb2x2ZWQgdG8gLSB0aGVcbisgICAgKipjYWxsZXItc3VwcGxpZWQga2V5IG9yIGtleXJpbmcqKiB0aGF0IGBga2V5cmluZ19pZGBgIHJlc29sdmVkIHRvIC0gdGhlXG4gICAgIG9iamVjdCB0aGUgc2lnbmF0dXJlIHdhcyB2ZXJpZmllZCBhZ2FpbnN0LCBub3QgdGhlIGluZGl2aWR1YWwgYXN5bW1ldHJpY1xuICAgICBrZXkgaW5zaWRlIGl0IHRoYXQgbWF0Y2hlZCB0aGUgc2lnbmVyLiBQYXNzaW5nXG4gICAgIGBgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HYGAsIGZvciBleGFtcGxlLCByZWNvcmRzIHRoZSBzZXNzaW9uIGtleXJpbmcnc1xuLSAgICBzZXJpYWwuIFRoZSBzeXN0ZW0ga2V5cmluZ3MgYXJlIHRydXN0ZWQgYXMgYSB3aG9sZSBhbmQgZXhwb3NlIG5vIHNlcmlhbFxuLSAgICBoZXJlLCBzbyB0aGUgc2VyaWFsIGlzIGBgMGBgIGZvciBidWlsdGluLCBzZWNvbmRhcnkgYW5kIHBsYXRmb3JtXG4tICAgIHNpZ25hdHVyZXMsIGFuZCBgYDBgYCBmb3IgdW5zaWduZWQgcHJvZ3JhbXMuIEluIG90aGVyIHdvcmRzLCBhIG5vbi16ZXJvXG4tICAgIGBga2V5cmluZ19zZXJpYWxgYCBpcyBleGFjdGx5IFwidmVyaWZpZWQgYWdhaW5zdCB0aGUgdXNlciBrZXkva2V5cmluZyB3aXRoXG4tICAgIHRoaXMgc2VyaWFsXCIuXG4rICAgIHNlcmlhbC4gVGhlIHN5c3RlbSBrZXlyaW5ncyBhbmQgdGhlIGJwZiBrZXlyaW5nIGFyZSB0cnVzdGVkIGFzIGEgd2hvbGUgYW5kXG4rICAgIGV4cG9zZSBubyBzZXJpYWwgaGVyZSwgc28gdGhlIHNlcmlhbCBpcyBgYDBgYCBmb3IgdGhlbSwgYW5kIGBgMGBgIGZvclxuKyAgICB1bnNpZ25lZCBwcm9ncmFtcy4gQSBub24temVybyBgYGtleXJpbmdfc2VyaWFsYGAgaXMgdGhlcmVmb3JlIGV4YWN0bHlcbisgICAgXCJ2ZXJpZmllZCBhZ2FpbnN0IHRoZSBjYWxsZXItc3VwcGxpZWQga2V5L2tleXJpbmcgd2l0aCB0aGlzIHNlcmlhbFwiLCB3aGljaFxuKyAgICBpcyBleGFjdGx5IHRoZSBjYXNlIGEgcG9saWN5IGhhcyB0byBzY3J1dGluaXNlLlxuIFxuIC4uIGxpc3QtdGFibGU6OlxuICAgIDpoZWFkZXItcm93czogMVxuQEAgLTQzNiwxNiArNTc1LDQ5IEBAIFR3byBmaWVsZHMgYXJlIHJlY29yZGVkIGluIGBgcHJvZy1cdTAwM2VhdXgtXHUwMDNlc2lnYGAgZm9yIGFuIExTTSB0byBpbnNwZWN0OlxuICAgICogLSBgYFZFUklGWV9VU0VfUExBVEZPUk1fS0VZUklOR2BgXG4gICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNYGBcbiAgICAgIC0gYGAwYGBcbi0gICAqIC0gb3RoZXIgKGEgdXNlci9zZXNzaW9uIGtleSBzZXJpYWwpXG4rICAgKiAtIGBgVkVSSUZZX1VTRV9CUEZfS0VZUklOR2BgXG4rICAgICAtIGBgQlBGX1NJR19LRVlSSU5HX0JQRmBgXG4rICAgICAtIGBgMGBgXG4rICAgKiAtIG90aGVyIChhIGNhbGxlci1zdXBwbGllZCBrZXkgc2VyaWFsKVxuICAgICAgLSBgYEJQRl9TSUdfS0VZUklOR19VU0VSYGBcbiAgICAgIC0gc2VyaWFsIG9mIHRoZSByZXNvbHZlZCBrZXkva2V5cmluZ1xuIFxuLVByb2R1Y2luZyBhIHNpZ25lZCBvYmplY3Rcbi09PT09PT09PT09PT09PT09PT09PT09PT09PVxuK1Byb2R1Y2luZyBhbmQgbG9hZGluZyBhIHNpZ25lZCBvYmplY3Rcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4rXG4rR2VuZXJhdGluZyBhIHNpZ25pbmcga2V5XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4rXG4rU2lnbmluZyBpcyBhbGdvcml0aG0gYWdub3N0aWM6IHRoZSBhbGdvcml0aG0gY29tZXMgZnJvbSB0aGUgWC41MDkgY2VydGlmaWNhdGVcbithbmQgdGhlIFBLQ1MjNyBgYFNpZ25lckluZm9gYC4gQW55dGhpbmcgdGhlIFguNTA5IGFuZCBQS0NTIzcgcGFyc2VycyB1bmRlcnN0YW5kXG4rd29ya3Mgd2l0aCBubyBCUEYtc2lkZSBjaGFuZ2UuIEJvdGggZXhhbXBsZXMgYmVsb3cgcmVhZCB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdFxuK2NvbmZpZyBmcm9tIGBgeDUwOS5nZW5rZXlgYCwgZm9yIHdoaWNoIGBgY2VydHMveDUwOS5nZW5rZXlgYCBzZXJ2ZXMgYXMgYVxuK3RlbXBsYXRlIChzZWUgRG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9tb2R1bGUtc2lnbmluZy5yc3QpLiBSU0E6OlxuK1xuKyAgICBvcGVuc3NsIHJlcSAtbmV3IC1ub2RlcyAtdXRmOCAtc2hhMjU2IC1kYXlzIDM2NTAwIC1iYXRjaCAteDUwOSBcXFxuKyAgICAgICAgICAgIC1jb25maWcgeDUwOS5nZW5rZXkgLW91dGZvcm0gUEVNIFxcXG4rICAgICAgICAgICAgLW91dCBzaWduaW5nX2tleS5wZW0gLWtleW91dCBzaWduaW5nX2tleS5wZW1cbisgICAgb3BlbnNzbCB4NTA5IC1pbiBzaWduaW5nX2tleS5wZW0gLW91dGZvcm0gZGVyIC1vdXQgc2lnbmluZ19rZXkuZGVyXG4rXG4rTUwtRFNBLTg3IChGSVBTLTIwNCksIHdoaWNoIG5lZWRzIG9wZW5zc2wgMy41IG9yIGxhdGVyIGFuZCBgYENPTkZJR19DUllQVE9fTUxEU0FgYFxuK2luIHRoZSBrZXJuZWwuIE5vdGUgdGhlIGFic2VuY2Ugb2YgYSBkaWdlc3Qgb3B0aW9uOiBNTC1EU0EgaGFzaGVzIHRoZSBtZXNzYWdlXG4raXRzZWxmIGFuZCBvcGVuc3NsIHJlamVjdHMgYW4gZXhwbGljaXQgZGlnZXN0IGZvciBpdDo6XG4rXG4rICAgIG9wZW5zc2wgcmVxIC1uZXcgLW5vZGVzIC11dGY4IC1kYXlzIDM2NTAwIC1iYXRjaCAteDUwOSBcXFxuKyAgICAgICAgICAgIC1uZXdrZXkgTUwtRFNBLTg3IC1jb25maWcgeDUwOS5nZW5rZXkgLW91dGZvcm0gUEVNIFxcXG4rICAgICAgICAgICAgLW91dCBzaWduaW5nX2tleS5wZW0gLWtleW91dCBzaWduaW5nX2tleS5wZW1cbisgICAgb3BlbnNzbCB4NTA5IC1pbiBzaWduaW5nX2tleS5wZW0gLW91dGZvcm0gZGVyIC1vdXQgc2lnbmluZ19rZXkuZGVyXG4rXG4rYGBicGZ0b29sYGAgaGFuZGxlcyB0aGUgZm9sbG93aW5nIGludGVybmFsbHk6IG9wZW5zc2wgYmVmb3JlIDQuMCBjYW5ub3QgY29tYmluZVxuK01MLURTQSB3aXRoIGBgQ01TX05PQVRUUmBgLCBzbyBpdCBmYWxscyBiYWNrIHRvIHNpZ25lZEF0dHJzLCB3aGVyZSBvbmx5IFNIQS01MTJcbitpcyBwZXJtaXR0ZWQuIFRoaXMgbWlycm9ycyB3aGF0IG1vZHVsZSBzaWduaW5nIGRvZXMgYXMgd2VsbC5cbitcbitTaWduaW5nXG4rLS0tLS0tLVxuIFxuIGBgYnBmdG9vbGBgIGdlbmVyYXRlcyBhbmQgc2lnbnMgYSBsaWdodCBza2VsZXRvbiBpbiBvbmUgc3RlcDo6XG4gXG4tICAgIGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MIC1TIC1rIFx1MDAzY3ByaXZhdGVfa2V5LnBlbVx1MDAzZSAtaSBcdTAwM2NjZXJ0aWZpY2F0ZS54NTA5XHUwMDNlIFxcXG4rICAgIGJwZnRvb2wgZ2VuIHNrZWxldG9uIC1MIC1TIC1rIHNpZ25pbmdfa2V5LnBlbSAtaSBzaWduaW5nX2tleS5kZXIgXFxcbiAgICAgICAgICAgICBvYmouYnBmLm8gXHUwMDNlIG9iai5sc2tlbC5oXG4gXG4gYGAtTGBgIHNlbGVjdHMgdGhlIGxpZ2h0LXNrZWxldG9uIChgYGdlbl9sb2FkZXJgYCkgYmFja2VuZCBhbmQgYGAtU2BgIGVuYWJsZXNcbkBAIC00NTQsMTIgKzYyNiwzNiBAQCBzaWduaW5nOyBgYC1rYGAgYW5kIGBgLWlgYCBzdXBwbHkgdGhlIHNpZ25pbmcga2V5IGFuZCBpdHMgWC41MDkgY2VydGlmaWNhdGUuXG4gcmVjb25zdHJ1Y3RzIC0gYW5kIGFsc28gY29tcHV0ZXMgYGBleGNsX3Byb2dfaGFzaGBgIGFzIHRoZSBkaWdlc3Qgb2YgdGhlIGxvYWRlclxuIGluc3RydWN0aW9ucyBzbyB0aGUgbWV0YWRhdGEgbWFwIGNhbiBiZSBib3VuZCB0byB0aGUgbG9hZGVyLiBUaGUgc2lnbmF0dXJlIGFuZFxuIGhhc2ggYXJlIGVtYmVkZGVkIGluIHRoZSBnZW5lcmF0ZWQgaGVhZGVyOyB0aGUgY2VydGlmaWNhdGUgaXMgdXNlZCBvbmx5IGZvclxuLXNpZ25pbmcgYW5kIGlzIG5vdCBpbmNsdWRlZC4gTG9hZGluZyB0aGUgc2tlbGV0b24gcGVyZm9ybXMgdGhlXG4tY3JlYXRlL3BvcHVsYXRlL2ZyZWV6ZS9sb2FkIHNlcXVlbmNlIGRlc2NyaWJlZCBhYm92ZS5cbitzaWduaW5nIGFuZCBpcyBub3QgaW5jbHVkZWQuXG4rXG4rTG9hZGluZ1xuKy0tLS0tLS1cbitcbitUaGUgZ2VuZXJhdGVkIHNrZWxldG9uIGV4cG9zZXMgYGBrZXlyaW5nX2lkYGAsIHdoaWNoIHNlbGVjdHMgdGhlIGtleXJpbmcgdGhlXG4ra2VybmVsIHZlcmlmaWVzIGFnYWluc3QuIFNldCBpdCBiZXR3ZWVuIG9wZW4gYW5kIGxvYWQ7IGxvYWRpbmcgdGhlbiBwZXJmb3Jtc1xuK3RoZSBjcmVhdGUvcG9wdWxhdGUvZnJlZXplL2xvYWQgc2VxdWVuY2UgZGVzY3JpYmVkIGFib3ZlOjpcbiBcbi1BdCBydW50aW1lIHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBjaG9zZW4ga2V5cmluZyAoZm9yXG4tZXhhbXBsZSBhZGRlZCB0byB0aGUgc2Vzc2lvbiBrZXlyaW5nLCBvciBidWlsdCBpbnRvIHRoZSBrZXJuZWwncyBidWlsdGluIHRydXN0ZWRcbi1rZXlyaW5nKSBmb3IgdmVyaWZpY2F0aW9uIHRvIHN1Y2NlZWQuXG4rICAgIHN0cnVjdCBvYmogKnNrZWwgPSBvYmpfX29wZW4oKTtcbitcbisgICAgc2tlbC1cdTAwM2VrZXlyaW5nX2lkID0gMzsgICAgICAgICAgIC8qIFZFUklGWV9VU0VfQlBGX0tFWVJJTkcgKi9cbisgICAgZXJyID0gb2JqX19sb2FkKHNrZWwpO1xuK1xuK0ZvciB0aGUgc3RhZ2luZyBjYXNlIHRoZSBzYW1lIG9iamVjdCBpcyBsb2FkZWQgYWdhaW5zdCBhIGtleXJpbmcgdGhlIGNhbGxlclxuK3BvcHVsYXRlZCBpdHNlbGYsIHdoaWNoIG9ubHkgd29ya3Mgb24gYSBzeXN0ZW0gdGhhdCBoYXMgbm90IHNldFxuK2BgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWBgOjpcbitcbisgICAgLypcbisgICAgICogU3RhZ2luZyBvbmx5OiB0aGlzIGtleXJpbmcgaXMgdW5kZXIgdGhlIGxvYWRlcidzIG93biBjb250cm9sIGFuZFxuKyAgICAgKiBjYXJyaWVzIG5vIHRydXN0IG9mIGl0cyBvd24uIFNlZSBcIkNhbGxlci1zdXBwbGllZCBrZXlyaW5ncyBhcmUgZm9yXG4rICAgICAqIHN0YWdpbmdcIi5cbisgICAgICovXG4rICAgIGtleV9pZCA9IGFkZF9rZXkoXCJhc3ltbWV0cmljXCIsIFwiXCIsIGRlciwgZGVyX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcpO1xuKyAgICBza2VsLVx1MDAzZWtleXJpbmdfaWQgPSBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkc7XG4rICAgIGVyciA9IG9ial9fbG9hZChza2VsKTtcbitcbitFaXRoZXIgd2F5IHRoZSB0cnVzdGVkIHB1YmxpYyBrZXkgbXVzdCBhbHJlYWR5IGJlIGluIHRoZSBjaG9zZW4ga2V5cmluZyBmb3Jcbit2ZXJpZmljYXRpb24gdG8gc3VjY2VlZC4gRm9yIHRoZSBicGYga2V5cmluZyB0aGF0IGVucm9sbG1lbnQgaGFwcGVucyBvbmNlIGF0XG4rYm9vdCwgc2VlIGBQcm92aXNpb25pbmdgXy5cbiBcbiBVQVBJIHJlZmVyZW5jZVxuID09PT09PT09PT09PT09XG5AQCAtNDg3LDYgKzY4MywxMyBAQCBVQVBJIHJlZmVyZW5jZVxuICAgICBUaGUgbWFwIGNvbnRlbnQgaXMgbm90IGhhc2hlZCBzZXBhcmF0ZWx5IGF0IGFsbCAtIGl0IGlzIGNvdmVyZWQsIGFzIGJ5dGVzLFxuICAgICBieSB0aGUgcHJvZ3JhbSBzaWduYXR1cmUuXG4gXG4rS2VybmVsIGNvbW1hbmQgbGluZTpcbitcbitgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkPWBgXG4rICAgIFNldCB0byBgYDFgYCB0byBsZWF2ZSB0aGUgYnBmIGtleXJpbmcgdW5zZWFsZWQgZm9yIHByb3Zpc2lvbmluZywgYW5kIHRvIG1ha2VcbisgICAgaXQgdGhlIG9ubHkgbm9uLXN5c3RlbSBrZXlyaW5nIGEgbG9hZGVyIG1heSBzZWxlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBib290XG4rICAgIChzZWUgYFRoZSBicGYga2V5cmluZ2BfKS5cbitcbiBOb3RlcyBhbmQgbGltaXRhdGlvbnNcbiA9PT09PT09PT09PT09PT09PT09PT09XG4gXG5AQCAtNDk1LDMgKzY5OCw1IEBAIE5vdGVzIGFuZCBsaW1pdGF0aW9uc1xuICAgZXhjZWVkIGl0LlxuIC0gVGhlIG1ldGFkYXRhIGNvbnRhaW5lciBpcyBhIHNpbmdsZS1lbGVtZW50IGFycmF5IG1hcCwgYWNjZXNzZWQgdGhyb3VnaFxuICAgYGBtYXBfZGlyZWN0X3ZhbHVlX2FkZHJgYC5cbistIFRoZSBicGYga2V5cmluZyBuZWVkcyBgYENPTkZJR19LRVlTYGA7IHdpdGhvdXQgaXQgdGhlcmUgaXMgbm8gYnBmIGtleXJpbmdcbisgIGFuZCBgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgYCBuZXZlciByZXNvbHZlcy5cbmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS9saW51eC9icGYuaFxuaW5kZXggYjNjZDI4ZDllM2I1NS4uNTcxZjc3OTJhNWM0MSAxMDA2NDRcbi0tLSBhL2luY2x1ZGUvbGludXgvYnBmLmhcbisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmhcbkBAIC0xNzM1LDYgKzE3MzUsNyBAQCBlbnVtIGJwZl9zaWdfa2V5cmluZyB7XG4gXHRCUEZfU0lHX0tFWVJJTkdfU0VDT05EQVJZLFxuIFx0QlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNLFxuIFx0QlBGX1NJR19LRVlSSU5HX1VTRVIsXG4rXHRCUEZfU0lHX0tFWVJJTkdfQlBGLFxuIH07XG4gXG4gc3RydWN0IGJwZl9wcm9nX2F1eCB7XG5AQCAtMzgxOSw2ICszODIwLDggQEAgc3RydWN0IGJwZl9rZXkge1xuICNpZiBkZWZpbmVkKENPTkZJR19LRVlTKSBcdTAwMjZcdTAwMjYgZGVmaW5lZChDT05GSUdfQlBGX1NZU0NBTEwpXG4gc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfdXNlcl9rZXkoczMyIHNlcmlhbCwgdTY0IGZsYWdzKTtcbiBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9zeXN0ZW1fa2V5KHU2NCBpZCk7XG4rc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfa2V5cmluZyh2b2lkKTtcbitib29sIGJwZl9rZXlyaW5nX2VuZm9yY2VkKHZvaWQpO1xuIHZvaWQgYnBmX2tleV9wdXQoc3RydWN0IGJwZl9rZXkgKmJrZXkpO1xuIGludCBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqZGF0YV9wLFxuIFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX2R5bnB0ciAqc2lnX3AsXG5AQCAtMzgzOSw2ICszODQyLDE2IEBAIHN0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfc3lzdGVtX2tleSh1NjQgaWQpXG4gXHRyZXR1cm4gTlVMTDtcbiB9XG4gXG4rc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpXG4re1xuK1x0cmV0dXJuIE5VTEw7XG4rfVxuK1xuK3N0YXRpYyBpbmxpbmUgYm9vbCBicGZfa2V5cmluZ19lbmZvcmNlZCh2b2lkKVxuK3tcbitcdHJldHVybiBmYWxzZTtcbit9XG4rXG4gc3RhdGljIGlubGluZSB2b2lkIGJwZl9rZXlfcHV0KHN0cnVjdCBicGZfa2V5ICpia2V5KVxuIHtcbiB9XG5kaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92ZXJpZmljYXRpb24uaCBiL2luY2x1ZGUvbGludXgvdmVyaWZpY2F0aW9uLmhcbmluZGV4IGRlYzdmMmJlYWJmZDQuLjFjYjU5ZGRkYTI1MDkgMTAwNjQ0XG4tLS0gYS9pbmNsdWRlL2xpbnV4L3ZlcmlmaWNhdGlvbi5oXG4rKysgYi9pbmNsdWRlL2xpbnV4L3ZlcmlmaWNhdGlvbi5oXG5AQCAtMTgsNiArMTgsMTYgQEBcbiAjZGVmaW5lIFZFUklGWV9VU0VfU0VDT05EQVJZX0tFWVJJTkcgKChzdHJ1Y3Qga2V5ICopMVVMKVxuICNkZWZpbmUgVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HICAoKHN0cnVjdCBrZXkgKikyVUwpXG4gXG4rLypcbisgKiBUaGUgaWQgb2YgQlBGJ3MgXCIuYnBmXCIga2V5cmluZywgcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzcGFjZS4gSXQgaXNcbisgKiBleHBsaWNpdGx5IG5vdCBhIHNlbnRpbmVsIGxpa2UgdGhlIHR3byBhYm92ZSBhcyBCUEYgcmVzb2x2ZXMgaXQgdG9cbisgKiB0aGUga2V5cmluZyBpdHNlbGYgYW5kIHBhc3NlcyB0aGF0LCBzbyB2ZXJpZnlfcGtjczdfc2lnbmF0dXJlKCkgbmV2ZXJcbisgKiBzZWVzIHRoaXMgdmFsdWUsIGFuZCBzeXN0ZW1fa2V5cmluZ19pZF9jaGVjaygpIG11c3Qga2VlcCByZWplY3RpbmcgaXQuXG4rICogTGVmdCBhcyBhIHBsYWluIGludGVnZXIgc28gdGhhdCBoYW5kaW5nIGl0IG92ZXIgYXMgQHRydXN0ZWRfa2V5cyBkb2VzXG4rICogbm90IGNvbXBpbGUuXG4rICovXG4rI2RlZmluZSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HXHQzXG4rXG4gc3RhdGljIGlubGluZSBpbnQgc3lzdGVtX2tleXJpbmdfaWRfY2hlY2sodTY0IGlkKVxuIHtcbiBcdGlmIChpZCBcdTAwM2UgKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HKVxuZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvTWFrZWZpbGUgYi9rZXJuZWwvYnBmL01ha2VmaWxlXG5pbmRleCA5MDI1NWQ4MGU1YmU2Li45YTkyYzM0OGJiZGE2IDEwMDY0NFxuLS0tIGEva2VybmVsL2JwZi9NYWtlZmlsZVxuKysrIGIva2VybmVsL2JwZi9NYWtlZmlsZVxuQEAgLTI3LDYgKzI3LDkgQEAgb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBvZmZsb2FkLm9cbiBvYmotJChDT05GSUdfQlBGX1NZU0NBTEwpICs9IG5ldF9uYW1lc3BhY2Uub1xuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gdGN4Lm9cbiBlbmRpZlxuK2lmZXEgKCQoQ09ORklHX0tFWVMpLHkpXG4rb2JqLSQoQ09ORklHX0JQRl9TWVNDQUxMKSArPSBrZXlzLm9cbitlbmRpZlxuIGlmZXEgKCQoQ09ORklHX1BFUkZfRVZFTlRTKSx5KVxuIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gc3RhY2ttYXAub1xuIGVuZGlmXG5kaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9rZXlzLmMgYi9rZXJuZWwvYnBmL2tleXMuY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjYwY2I4NTI5NWM4OWFcbi0tLSAvZGV2L251bGxcbisrKyBiL2tlcm5lbC9icGYva2V5cy5jXG5AQCAtMCwwICsxLDcyIEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxuKy8qIENvcHlyaWdodCAoYykgMjAyNiBJc292YWxlbnQgKi9cbitcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2NyZWQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L2Vyci5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvaW5pdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgva2V5LmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGVwYXJhbS5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjbGludXgvc2xhYi5oXHUwMDNlXG4rXG4rI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVhcbisjZGVmaW5lIE1PRFVMRV9QQVJBTV9QUkVGSVggXCJicGYuXCJcbitcbitzdGF0aWMgc3RydWN0IGtleSAqYnBmX2tleXJpbmc7XG4rXG4rc3RhdGljIGJvb2wgYnBmX2tleXJpbmdfdW5zZWFsZWQgX19yb19hZnRlcl9pbml0O1xuK21vZHVsZV9wYXJhbV9uYW1lZChrZXlyaW5nX3Vuc2VhbGVkLCBicGZfa2V5cmluZ191bnNlYWxlZCwgYm9vbCwgMDQ0NCk7XG4rTU9EVUxFX1BBUk1fREVTQyhrZXlyaW5nX3Vuc2VhbGVkLCBcIkxlYXZlIHRoZSBicGYga2V5cmluZyB1bnNlYWxlZFwiKTtcbitcbitib29sIGJwZl9rZXlyaW5nX2VuZm9yY2VkKHZvaWQpXG4re1xuK1x0cmV0dXJuIGJwZl9rZXlyaW5nX3Vuc2VhbGVkO1xuK31cbitcbitzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF9rZXlyaW5nKHZvaWQpXG4re1xuK1x0c3RydWN0IGJwZl9rZXkgKmJrZXk7XG4rXG4rXHRpZiAoIWJwZl9rZXlyaW5nKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcdGlmICghUkVBRF9PTkNFKGJwZl9rZXlyaW5nLVx1MDAzZWtleXMubnJfbGVhdmVzX29uX3RyZWUpIHx8XG4rXHQgICAgIVJFQURfT05DRShicGZfa2V5cmluZy1cdTAwM2VyZXN0cmljdF9saW5rKSlcbitcdFx0cmV0dXJuIE5VTEw7XG4rXG4rXHRia2V5ID0ga21hbGxvY19vYmooKmJrZXkpO1xuK1x0aWYgKCFia2V5KVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGJrZXktXHUwMDNla2V5ID0gYnBmX2tleXJpbmc7XG4rXHRia2V5LVx1MDAzZWhhc19yZWYgPSBmYWxzZTtcbitcdHJldHVybiBia2V5O1xuK31cbitcbitzdGF0aWMgaW50IF9faW5pdCBicGZfa2V5cmluZ19pbml0KHZvaWQpXG4re1xuK1x0c3RydWN0IGtleSAqa2V5cmluZztcbitcbitcdGtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKFwiLmJwZlwiLFxuK1x0XHRcdFx0R0xPQkFMX1JPT1RfVUlELCBHTE9CQUxfUk9PVF9HSUQsXG4rXHRcdFx0XHRjdXJyZW50X2NyZWQoKSwgS0VZX1BPU19TRUFSQ0ggfFxuK1x0XHRcdFx0S0VZX1VTUl9WSUVXIHwgS0VZX1VTUl9SRUFEIHxcbitcdFx0XHRcdEtFWV9VU1JfV1JJVEUgfCBLRVlfVVNSX1NFQVJDSCB8XG4rXHRcdFx0XHRLRVlfVVNSX1NFVEFUVFIsIEtFWV9BTExPQ19OT1RfSU5fUVVPVEEsXG4rXHRcdFx0XHROVUxMLCBOVUxMKTtcbitcdGlmIChJU19FUlIoa2V5cmluZykpIHtcbitcdFx0cHJfZXJyKFwiYnBmOiBjYW5ub3QgYWxsb2NhdGUgYnBmIGtleXJpbmc6ICVsZFxcblwiLFxuK1x0XHQgICAgICAgUFRSX0VSUihrZXlyaW5nKSk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1x0aWYgKCFicGZfa2V5cmluZ191bnNlYWxlZCBcdTAwMjZcdTAwMjZcbitcdCAgICBrZXlyaW5nX3Jlc3RyaWN0KG1ha2Vfa2V5X3JlZihrZXlyaW5nLCB0cnVlKSwgTlVMTCwgTlVMTCkpIHtcbitcdFx0cHJfZXJyKFwiYnBmOiBjYW5ub3Qgc2VhbCBicGYga2V5cmluZ1xcblwiKTtcbitcdFx0a2V5X3Jldm9rZShrZXlyaW5nKTtcbitcdFx0a2V5X3B1dChrZXlyaW5nKTtcbitcdFx0cmV0dXJuIDA7XG4rXHR9XG4rXG4rXHRicGZfa2V5cmluZyA9IGtleXJpbmc7XG4rXHRyZXR1cm4gMDtcbit9XG4rbGF0ZV9pbml0Y2FsbChicGZfa2V5cmluZ19pbml0KTtcbmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbmluZGV4IGUwMzZhZTIwYmY2YjkuLjU1OGU1MThhZDMxMDkgMTAwNjQ0XG4tLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmNcbisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuY1xuQEAgLTIwOTcyLDYgKzIwOTcyLDE0IEBAIGludCBicGZfZml4dXBfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24sXG4gXHRyZXR1cm4gMDtcbiB9XG4gXG4rLypcbisgKiBVcHBlciBib3VuZCBvbiB0aGUgUEtDUyM3IHNpZ25hdHVyZSBibG9iIHBhc3NlZCB3aXRoIGEgcHJvZ3JhbS4gQ29tZm9ydGFibHlcbisgKiBhYm92ZSB0aGUgbGFyZ2VzdCBzaWduYXR1cmUgdGhlIGtlcm5lbCBjYW4gdmVyaWZ5LCBhbmQgZmFyIGJlbG93IGFueXRoaW5nXG4rICogdGhhdCB3b3VsZCBtYWtlIHJlamVjdGluZyBhIGxvYWQgZXhwZW5zaXZlLiBEZWxpYmVyYXRlbHkgYSBmaXhlZCBudW1iZXIgc29cbisgKiB0aGF0IHdoYXQgdGhlIHN5c2NhbGwgYWNjZXB0cyBkb2VzIG5vdCBkZXBlbmQgb24gUEFHRV9TSVpFLlxuKyAqL1xuKyNkZWZpbmUgQlBGX1BST0dfTUFYX1NJR05BVFVSRV9TSVpFXHQoNjQgKiAxMDI0KVxuK1xuIHN0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZClcbiB7XG4gXHRzd2l0Y2ggKGtleXJpbmdfaWQpIHtcbkBAIC0yMDk4MSw2ICsyMDk4OSw4IEBAIHN0YXRpYyBlbnVtIGJwZl9zaWdfa2V5cmluZyBicGZfY2xhc3NpZnlfa2V5cmluZyhzMzIga2V5cmluZ19pZClcbiBcdFx0cmV0dXJuIEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlk7XG4gXHRjYXNlIChzMzIpKHVuc2lnbmVkIGxvbmcpVkVSSUZZX1VTRV9QTEFURk9STV9LRVlSSU5HOlxuIFx0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX1BMQVRGT1JNO1xuK1x0Y2FzZSBWRVJJRllfVVNFX0JQRl9LRVlSSU5HOlxuK1x0XHRyZXR1cm4gQlBGX1NJR19LRVlSSU5HX0JQRjtcbiBcdGRlZmF1bHQ6XG4gXHRcdHJldHVybiBCUEZfU0lHX0tFWVJJTkdfVVNFUjtcbiBcdH1cbkBAIC0yMTAwOSwyMSArMjEwMTksMzIgQEAgc3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4gXHR1NjQgZGF0YV9zejtcbiBcdGludCBlcnIgPSAwO1xuIFxuLVx0Lypcbi1cdCAqIERvbid0IGF0dGVtcHQgdG8gdXNlIGttYWxsb2NfbGFyZ2Ugb3Igdm1hbGxvYyBmb3Igc2lnbmF0dXJlcy5cbi1cdCAqIFByYWN0aWNhbCBzaWduYXR1cmUgZm9yIEJQRiBwcm9ncmFtIHNob3VsZCBiZSBiZWxvdyB0aGlzIGxpbWl0LlxuLVx0ICovXG4gXHRpZiAoIWF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgfHxcbi1cdCAgICBhdHRyLVx1MDAzZXNpZ25hdHVyZV9zaXplIFx1MDAzZSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFKVxuK1x0ICAgIGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemUgXHUwMDNlIEJQRl9QUk9HX01BWF9TSUdOQVRVUkVfU0laRSlcbiBcdFx0cmV0dXJuIC1FSU5WQUw7XG4tXHRpZiAoc3lzdGVtX2tleXJpbmdfaWRfY2hlY2soYXR0ci1cdTAwM2VrZXlyaW5nX2lkKSA9PSAwKVxuK1xuK1x0aWYgKCFzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVx1MDAzZWtleXJpbmdfaWQpKSB7XG4gXHRcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuLVx0ZWxzZVxuLVx0XHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXHUwMDNla2V5cmluZ19pZCwgMCk7XG4rXHR9IGVsc2Uge1xuK1x0XHRpZiAoYXR0ci1cdTAwM2VrZXlyaW5nX2lkICE9IFZFUklGWV9VU0VfQlBGX0tFWVJJTkcpIHtcbitcdFx0XHRpZiAoYnBmX2tleXJpbmdfZW5mb3JjZWQoKSkge1xuK1x0XHRcdFx0dmVyYm9zZShlbnYsIFwiY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCwgdXNlIGJwZiBrZXlyaW5nXFxuXCIpO1xuK1x0XHRcdFx0cmV0dXJuIC1FUEVSTTtcbitcdFx0XHR9XG4rXHRcdFx0a2V5ID0gYnBmX2xvb2t1cF91c2VyX2tleShhdHRyLVx1MDAzZWtleXJpbmdfaWQsIDApO1xuK1x0XHR9IGVsc2Uge1xuK1x0XHRcdGtleSA9IGJwZl9sb29rdXBfa2V5cmluZygpO1xuK1x0XHR9XG4rXHR9XG4gXHRpZiAoIWtleSkge1xuLVx0XHR2ZXJib3NlKGVudiwgXCJjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxuXCIsXG4tXHRcdFx0YXR0ci1cdTAwM2VrZXlyaW5nX2lkKTtcbi1cdFx0cmV0dXJuIC1FSU5WQUw7XG4rXHRcdGlmIChhdHRyLVx1MDAzZWtleXJpbmdfaWQgPT0gVkVSSUZZX1VTRV9CUEZfS0VZUklORykge1xuK1x0XHRcdHZlcmJvc2UoZW52LCBcInRoZSBicGYga2V5cmluZyBpcyBlbXB0eSBvciBoYXMgbm90IGJlZW4gcmVzdHJpY3RlZFxcblwiKTtcbitcdFx0XHRyZXR1cm4gLUVOT0tFWTtcbitcdFx0fSBlbHNlIHtcbitcdFx0XHR2ZXJib3NlKGVudiwgXCJjYW5ub3QgcmVzb2x2ZSBzaWduaW5nIGtleXJpbmcgd2l0aCBrZXlyaW5nX2lkICVkXFxuXCIsXG4rXHRcdFx0XHRhdHRyLVx1MDAzZWtleXJpbmdfaWQpO1xuK1x0XHRcdHJldHVybiAtRUlOVkFMO1xuK1x0XHR9XG4gXHR9XG4gXG4gXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZSk7XG5kaWZmIC0tZ2l0IGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oIGIvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG5pbmRleCA3OGI2ZTBlYmI4NWQ4Li45MzE1YTFkYjFmN2MyIDEwMDY0NFxuLS0tIGEvdG9vbHMvYnBmL2JwZnRvb2wvbWFpbi5oXG4rKysgYi90b29scy9icGYvYnBmdG9vbC9tYWluLmhcbkBAIC01Nyw3ICs1Nyw3IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCAqdTY0X3RvX3B0cihfX3U2NCBwdHIpXG4gXHR9KVxuIFxuICNkZWZpbmUgRVJSX01BWF9MRU5cdDEwMjRcbi0jZGVmaW5lIE1BWF9TSUdfU0laRVx0NDA5NlxuKyNkZWZpbmUgTUFYX1NJR19TSVpFXHQxNjM4NFxuIFxuICNkZWZpbmUgQlBGX1RBR19GTVRcdFwiJTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4JTAyaGh4XCJcbiBcbmRpZmYgLS1naXQgYS90b29scy9icGYvYnBmdG9vbC9zaWduLmMgYi90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbmluZGV4IDg4NzI2YTZkYjZkMGUuLjFiNTUwMmY0OGFkZDAgMTAwNjQ0XG4tLS0gYS90b29scy9icGYvYnBmdG9vbC9zaWduLmNcbisrKyBiL3Rvb2xzL2JwZi9icGZ0b29sL3NpZ24uY1xuQEAgLTEzMCw2ICsxMzAsOSBAQCBfX3UzMiByZWdpc3Rlcl9zZXNzaW9uX2tleShjb25zdCBjaGFyICprZXlfZGVyX3BhdGgpXG4gXG4gaW50IGJwZnRvb2xfcHJvZ19zaWduKHN0cnVjdCBicGZfbG9hZF9hbmRfcnVuX29wdHMgKm9wdHMpXG4ge1xuK1x0dW5zaWduZWQgaW50IHNpZ25lcl9mbGFncyA9IENNU19OT0NFUlRTIHwgQ01TX0JJTkFSWSB8IENNU19OT1NNSU1FQ0FQIHxcbitcdFx0XHRcdCAgICBDTVNfVVNFX0tFWUlEIHwgQ01TX05PQVRUUjtcbitcdGNvbnN0IEVWUF9NRCAqY21zX2RpZ2VzdCA9IEVWUF9zaGEyNTYoKTtcbiBcdEJJTyAqYmRfaW4gPSBOVUxMLCAqYmRfb3V0ID0gTlVMTDtcbiBcdEVWUF9QS0VZICpwcml2YXRlX2tleSA9IE5VTEw7XG4gXHRDTVNfQ29udGVudEluZm8gKmNtcyA9IE5VTEw7XG5AQCAtMTY3LDYgKzE3MCwyMSBAQCBpbnQgYnBmdG9vbF9wcm9nX3NpZ24oc3RydWN0IGJwZl9sb2FkX2FuZF9ydW5fb3B0cyAqb3B0cylcbiBcdFx0Z290byBjbGVhbnVwO1xuIFx0fVxuIFxuKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIFx1MDAzZT0gMHgzMDAwMDAwMEwgXHUwMDI2XHUwMDI2IE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgXHUwMDNjIDB4NDAwMDAwMDBMXG4rXHRpZiAoRVZQX1BLRVlfaXNfYShwcml2YXRlX2tleSwgXCJNTC1EU0EtNDRcIikgfHxcbitcdCAgICBFVlBfUEtFWV9pc19hKHByaXZhdGVfa2V5LCBcIk1MLURTQS02NVwiKSB8fFxuK1x0ICAgIEVWUF9QS0VZX2lzX2EocHJpdmF0ZV9rZXksIFwiTUwtRFNBLTg3XCIpKSB7XG4rXHRcdC8qXG4rXHRcdCAqIE1MLURTQSArIENNU19OT0FUVFIgaXMgbm90IHN1cHBvcnRlZCBiZWZvcmUgb3BlbnNzbC00LjAsIHNvXG4rXHRcdCAqIGZhbGwgYmFjayB0byBzaWduZWRBdHRycy4gTUwtRFNBIGRvZXMgaXRzIG93biBoYXNoaW5nIGFuZFxuK1x0XHQgKiBpZ25vcmVzIHRoZSBDTVMgZGlnZXN0LCBleGNlcHQgd2hlbiBzaWduZWRBdHRycyBhcmUgdXNlZCxcbitcdFx0ICogd2hlcmUgb25seSBTSEEtNTEyIGlzIHBlcm1pdHRlZC5cbitcdFx0ICovXG4rXHRcdHNpZ25lcl9mbGFncyBcdTAwMjY9IH5DTVNfTk9BVFRSO1xuK1x0XHRjbXNfZGlnZXN0ID0gRVZQX3NoYTUxMigpO1xuK1x0fVxuKyNlbmRpZlxuK1xuIFx0Y21zID0gQ01TX3NpZ24oTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCxcbiBcdFx0ICAgICAgIENNU19OT0NFUlRTIHwgQ01TX1BBUlRJQUwgfCBDTVNfQklOQVJZIHwgQ01TX0RFVEFDSEVEIHxcbiBcdFx0XHQgICAgICAgQ01TX1NUUkVBTSk7XG5AQCAtMTc1LDkgKzE5Myw3IEBAIGludCBicGZ0b29sX3Byb2dfc2lnbihzdHJ1Y3QgYnBmX2xvYWRfYW5kX3J1bl9vcHRzICpvcHRzKVxuIFx0XHRnb3RvIGNsZWFudXA7XG4gXHR9XG4gXG4tXHRpZiAoIUNNU19hZGQxX3NpZ25lcihjbXMsIHg1MDksIHByaXZhdGVfa2V5LCBFVlBfc2hhMjU2KCksXG4tXHRcdFx0ICAgICBDTVNfTk9DRVJUUyB8IENNU19CSU5BUlkgfCBDTVNfTk9TTUlNRUNBUCB8XG4tXHRcdFx0ICAgICBDTVNfVVNFX0tFWUlEIHwgQ01TX05PQVRUUikpIHtcbitcdGlmICghQ01TX2FkZDFfc2lnbmVyKGNtcywgeDUwOSwgcHJpdmF0ZV9rZXksIGNtc19kaWdlc3QsIHNpZ25lcl9mbGFncykpIHtcbiBcdFx0ZXJyID0gLUVJTlZBTDtcbiBcdFx0Z290byBjbGVhbnVwO1xuIFx0fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZVxuaW5kZXggNWYxYTNiZmMwNTY5Zi4uMDViM2VlNjQyOTBmYSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9NYWtlZmlsZVxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL01ha2VmaWxlXG5AQCAtNjYzLDcgKzY2Myw3IEBAICQoVFJVTk5FUl9CUEZfTFNLRUxTKTogJS5sc2tlbC5oOiAlLmJwZi5vICQoQlBGVE9PTCkgfCAkKFRSVU5ORVJfT1VUUFVUKVxuIFx0fSkgXHUwMDI2XHUwMDI2IFxcXG4gXHRybSAtZiAkJChcdTAwM2M6Lm89LmxsaW5rZWQxLm8pICQkKFx1MDAzYzoubz0ubGxpbmtlZDIubykgJCQoXHUwMDNjOi5vPS5sbGlua2VkMy5vKVxuIFxuLSQoVFJVTk5FUl9CUEZfTFNLRUxTX1NJR05FRCk6ICUubHNrZWwuaDogJS5icGYubyAkKEJQRlRPT0wpIHwgJChUUlVOTkVSX09VVFBVVClcbiskKFRSVU5ORVJfQlBGX0xTS0VMU19TSUdORUQpOiAlLmxza2VsLmg6ICUuYnBmLm8gJChCUEZUT09MKSAkKFZFUklGSUNBVElPTl9DRVJUKSB8ICQoVFJVTk5FUl9PVVRQVVQpXG4gXHQkKFEpJChpZiAkKFBFUk1JU1NJVkUpLGlmIFsgISAtZiAkJFx1MDAzYyBdOyB0aGVuXHRcdFx0XFxcbiBcdFx0JCQoUk0pICQkQDtcdFx0XHRcdFx0XHRcXFxuIFx0XHRwcmludGYgJyAgJS0xMnMgJXNcXG4nICdTS0lQLVNLRUwnICckJChub3RkaXIgJCRAKScgMVx1MDAzZVx1MDAyNjI7IFxcXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL2NvbmZpZyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9jb25maWdcbmluZGV4IGVhNzA0NGYzMGFkYzMuLjJlYzE1MTE3YWJiNTAgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvY29uZmlnXG5AQCAtNTEsNiArNTEsOCBAQCBDT05GSUdfSVBWNl9TRUc2X0xXVFVOTkVMPXlcbiBDT05GSUdfSVBWNl9TSVQ9eVxuIENPTkZJR19JUFY2X1RVTk5FTD15XG4gQ09ORklHX0tFWVM9eVxuK0NPTkZJR19DUllQVE9fTUxEU0E9eVxuK0NPTkZJR19DUllQVE9fU0hBNTEyPXlcbiBDT05GSUdfTElSQz15XG4gQ09ORklHX0xJVkVQQVRDSD15XG4gQ09ORklHX0xXVFVOTkVMPXlcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcbmluZGV4IDc3MzgxZDM0NTQzNWMuLjYyMGE2ZDIyYTc1OWMgMTAwNjQ0XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9zaWduZWRfbG9hZGVyLmNcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3NpZ25lZF9sb2FkZXIuY1xuQEAgLTMyLDExICszMiwyMCBAQCBlbnVtIHtcbiBcdEJQRl9TSUdfS0VZUklOR19TRUNPTkRBUlksXG4gXHRCUEZfU0lHX0tFWVJJTkdfUExBVEZPUk0sXG4gXHRCUEZfU0lHX0tFWVJJTkdfVVNFUixcbitcdEJQRl9TSUdfS0VZUklOR19CUEYsXG4gfTtcbiBcbi1zdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbi1cdFx0ICAgICAgIGNvbnN0IHZvaWQgKnNpZywgX191MzIgc2lnX3N6LCBfX3MzMiBrZXlyaW5nX2lkLFxuLVx0XHQgICAgICAgX191MzIgZmRfYXJyYXlfY250KVxuKyNkZWZpbmUgQlBGX0tFWVJJTkdfQlBGXHRcdDNcbitcbisvKiB2ZXJpZnlfc2lnX3NldHVwLnNoIGV4aXRzIHdpdGggdGhpcyB3aGVuIG9wZW5zc2wgY2Fubm90IGRvIE1MLURTQS4gKi9cbisjZGVmaW5lIFNFVFVQX1NLSVBcdFx0KC03NylcbitcbisvKiBGSVBTLTIwNCBNTC1EU0EtODcgc2lnbmF0dXJlIHNpemUsIHNlZSBpbmNsdWRlL2NyeXB0by9tbGRzYS5oLiAqL1xuKyNkZWZpbmUgTUxEU0E4N19TSUdOQVRVUkVfU0laRVx0NDYyN1xuK1xuK3N0YXRpYyBpbnQgbG9hZF9sb2FkZXJfbG9nKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbitcdFx0XHQgICBjb25zdCB2b2lkICpzaWcsIF9fdTMyIHNpZ19zeiwgX19zMzIga2V5cmluZ19pZCxcbitcdFx0XHQgICBfX3UzMiBmZF9hcnJheV9jbnQsIGNoYXIgKmxvZ19idWYsIF9fdTMyIGxvZ19zeilcbiB7XG4gXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuIFx0aW50IGZkO1xuQEAgLTQ4LDE4ICs1NywzMSBAQCBzdGF0aWMgaW50IGxvYWRfbG9hZGVyKGNvbnN0IHZvaWQgKmluc25zLCBfX3UzMiBpbnNuc19zeiwgaW50IG1hcF9mZCxcbiBcdGF0dHIubGljZW5zZSA9IHB0cl90b191NjQoXCJEdWFsIEJTRC9HUExcIik7XG4gXHRhdHRyLnByb2dfZmxhZ3MgPSBCUEZfRl9TTEVFUEFCTEU7XG4gXHRhdHRyLmZkX2FycmF5ID0gcHRyX3RvX3U2NChcdTAwMjZtYXBfZmQpO1xuK1x0YXR0ci5mZF9hcnJheV9jbnQgPSBmZF9hcnJheV9jbnQ7XG4gXHRpZiAoc2lnKSB7XG4gXHRcdGF0dHIuc2lnbmF0dXJlID0gcHRyX3RvX3U2NChzaWcpO1xuIFx0XHRhdHRyLnNpZ25hdHVyZV9zaXplID0gc2lnX3N6O1xuIFx0XHRhdHRyLmtleXJpbmdfaWQgPSBrZXlyaW5nX2lkO1xuIFx0fVxuLVx0YXR0ci5mZF9hcnJheV9jbnQgPSBmZF9hcnJheV9jbnQ7XG4rXHRpZiAobG9nX2J1Zikge1xuK1x0XHRhdHRyLmxvZ19sZXZlbCA9IDE7XG4rXHRcdGF0dHIubG9nX2J1ZiA9IHB0cl90b191NjQobG9nX2J1Zik7XG4rXHRcdGF0dHIubG9nX3NpemUgPSBsb2dfc3o7XG4rXHR9XG4gXHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwiX19sb2FkZXIucHJvZ1wiLCBzaXplb2YoXCJfX2xvYWRlci5wcm9nXCIpKTtcbiBcdGZkID0gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgXHUwMDI2YXR0cixcbiBcdFx0ICAgICBvZmZzZXRvZmVuZCh1bmlvbiBicGZfYXR0ciwga2V5cmluZ19pZCkpO1xuIFx0cmV0dXJuIGZkIFx1MDAzYyAwID8gLWVycm5vIDogZmQ7XG4gfVxuIFxuK3N0YXRpYyBpbnQgbG9hZF9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LCBpbnQgbWFwX2ZkLFxuK1x0XHQgICAgICAgY29uc3Qgdm9pZCAqc2lnLCBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsXG4rXHRcdCAgICAgICBfX3UzMiBmZF9hcnJheV9jbnQpXG4re1xuK1x0cmV0dXJuIGxvYWRfbG9hZGVyX2xvZyhpbnNucywgaW5zbnNfc3osIG1hcF9mZCwgc2lnLCBzaWdfc3osIGtleXJpbmdfaWQsXG4rXHRcdFx0ICAgICAgIGZkX2FycmF5X2NudCwgTlVMTCwgMCk7XG4rfVxuK1xuIHN0YXRpYyBpbnQgcnVuX2dlbl9sb2FkZXIoY29uc3Qgdm9pZCAqaW5zbnMsIF9fdTMyIGluc25zX3N6LFxuIFx0XHRcdCAgY29uc3Qgdm9pZCAqZGF0YSwgX191MzIgZGF0YV9zeixcbiBcdFx0XHQgIGNvbnN0IHZvaWQgKmV4Y2wsIF9fdTMyIGV4Y2xfc3osXG5AQCAtMTU2LDEyICsxNzgsMzAgQEAgc3RhdGljIGludCBydW5fc2V0dXAoY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICpkaXIpXG4gXHR9XG4gXHRpZiAod2FpdHBpZChwaWQsIFx1MDAyNnN0YXR1cywgMCkgXHUwMDNjIDApXG4gXHRcdHJldHVybiAtZXJybm87XG4tXHRyZXR1cm4gKFdJRkVYSVRFRChzdGF0dXMpIFx1MDAyNlx1MDAyNlxuLVx0XHRXRVhJVFNUQVRVUyhzdGF0dXMpID09IDApID8gMCA6IC1FSU5WQUw7XG4rXHRpZiAoIVdJRkVYSVRFRChzdGF0dXMpKVxuK1x0XHRyZXR1cm4gLUVJTlZBTDtcbitcdHJldHVybiAtV0VYSVRTVEFUVVMoc3RhdHVzKTtcbiB9XG4gXG4tc3RhdGljIGludCBzaWduX2J1Zihjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuLVx0XHQgICAgdm9pZCAqc2lnLCBfX3UzMiAqc2lnX3N6KVxuK3N0YXRpYyB2b2lkIGdlbmtleV9kaXJfZmluaShjb25zdCBjaGFyICpkaXIpXG4re1xuK1x0c3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmaWxlc1tdID0ge1xuK1x0XHRcInNpZ25pbmdfa2V5LmRlclwiLCBcInNpZ25pbmdfa2V5LnBlbVwiLCBcIng1MDkuZ2Vua2V5XCIsXG4rXHR9O1xuK1x0Y2hhciBwYXRoW1BBVEhfTUFYXTtcbitcdHNpemVfdCBpO1xuK1xuK1x0aWYgKCFkaXIpXG4rXHRcdHJldHVybjtcbitcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEFSUkFZX1NJWkUoZmlsZXMpOyBpKyspIHtcbitcdFx0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIiVzLyVzXCIsIGRpciwgZmlsZXNbaV0pO1xuK1x0XHR1bmxpbmsocGF0aCk7XG4rXHR9XG4rXHRybWRpcihkaXIpO1xuK31cbitcbitzdGF0aWMgaW50IHNpZ25fYnVmX2RpZ2VzdChjb25zdCBjaGFyICpkaXIsIGNvbnN0IHZvaWQgKmJ1ZiwgX191MzIgbGVuLFxuK1x0XHRcdCAgIHZvaWQgKnNpZywgX191MzIgKnNpZ19zeiwgY29uc3QgY2hhciAqZGlnZXN0KVxuIHtcbiBcdGNoYXIgZGF0YV90bXBsW1BBVEhfTUFYXSwga2V5W1BBVEhfTUFYXTtcbiBcdGNoYXIgc2lncGF0aFtQQVRIX01BWCArIHNpemVvZihcIi5wN3NcIildO1xuQEAgLTE3Niw2ICsyMTYsNyBAQCBzdGF0aWMgaW50IHNpZ25fYnVmKGNvbnN0IGNoYXIgKmRpciwgY29uc3Qgdm9pZCAqYnVmLCBfX3UzMiBsZW4sXG4gXHRmZCA9IG1rc3RlbXAoZGF0YV90bXBsKTtcbiBcdGlmIChmZCBcdTAwM2MgMClcbiBcdFx0cmV0dXJuIC1lcnJubztcbitcdHNucHJpbnRmKHNpZ3BhdGgsIHNpemVvZihzaWdwYXRoKSwgXCIlcy5wN3NcIiwgZGF0YV90bXBsKTtcbiBcdGlmICh3cml0ZShmZCwgYnVmLCBsZW4pICE9IChzc2l6ZV90KWxlbikge1xuIFx0XHRjbG9zZShmZCk7XG4gXHRcdHJldCA9IC1FSU87XG5AQCAtMTkwLDcgKzIzMSw3IEBAIHN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcbiBcdH1cbiBcdGlmIChwaWQgPT0gMCkge1xuIFx0XHRzbnByaW50ZihrZXksIHNpemVvZihrZXkpLCBcIiVzL3NpZ25pbmdfa2V5LnBlbVwiLCBkaXIpO1xuLVx0XHRleGVjbHAoXCIuL3NpZ24tZmlsZVwiLCBcIi4vc2lnbi1maWxlXCIsIFwiLWRcIiwgXCJzaGEyNTZcIixcbitcdFx0ZXhlY2xwKFwiLi9zaWduLWZpbGVcIiwgXCIuL3NpZ24tZmlsZVwiLCBcIi1kXCIsIGRpZ2VzdCxcbiBcdFx0ICAgICAgIGtleSwga2V5LCBkYXRhX3RtcGwsIE5VTEwpO1xuIFx0XHRleGl0KDEpO1xuIFx0fVxuQEAgLTIwMCwzNCArMjQxLDM4IEBAIHN0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcbiBcdFx0Z290byBvdXQ7XG4gXHR9XG4gXG4tXHRzbnByaW50ZihzaWdwYXRoLCBzaXplb2Yoc2lncGF0aCksIFwiJXMucDdzXCIsIGRhdGFfdG1wbCk7XG4gXHRpZiAoc3RhdChzaWdwYXRoLCBcdTAwMjZzdCkgXHUwMDNjIDApIHtcbiBcdFx0cmV0ID0gLWVycm5vO1xuIFx0XHRnb3RvIG91dDtcbiBcdH1cbiBcdGlmIChzdC5zdF9zaXplIFx1MDAzZSAob2ZmX3QpKnNpZ19zeikge1xuIFx0XHRyZXQgPSAtRTJCSUc7XG4tXHRcdGdvdG8gb3V0X3NpZztcbitcdFx0Z290byBvdXQ7XG4gXHR9XG4gXHRmZCA9IG9wZW4oc2lncGF0aCwgT19SRE9OTFkpO1xuIFx0aWYgKGZkIFx1MDAzYyAwKSB7XG4gXHRcdHJldCA9IC1lcnJubztcbi1cdFx0Z290byBvdXRfc2lnO1xuK1x0XHRnb3RvIG91dDtcbiBcdH1cbiBcdGlmIChyZWFkKGZkLCBzaWcsIHN0LnN0X3NpemUpICE9IHN0LnN0X3NpemUpIHtcbiBcdFx0Y2xvc2UoZmQpO1xuIFx0XHRyZXQgPSAtRUlPO1xuLVx0XHRnb3RvIG91dF9zaWc7XG4rXHRcdGdvdG8gb3V0O1xuIFx0fVxuIFx0Y2xvc2UoZmQpO1xuIFx0KnNpZ19zeiA9IHN0LnN0X3NpemU7XG4tb3V0X3NpZzpcbi1cdHVubGluayhzaWdwYXRoKTtcbiBvdXQ6XG4rXHR1bmxpbmsoc2lncGF0aCk7XG4gXHR1bmxpbmsoZGF0YV90bXBsKTtcbiBcdHJldHVybiByZXQ7XG4gfVxuIFxuK3N0YXRpYyBpbnQgc2lnbl9idWYoY29uc3QgY2hhciAqZGlyLCBjb25zdCB2b2lkICpidWYsIF9fdTMyIGxlbixcbitcdFx0ICAgIHZvaWQgKnNpZywgX191MzIgKnNpZ19zeilcbit7XG4rXHRyZXR1cm4gc2lnbl9idWZfZGlnZXN0KGRpciwgYnVmLCBsZW4sIHNpZywgc2lnX3N6LCBcInNoYTI1NlwiKTtcbit9XG4rXG4gc3RydWN0IGdlbl9sb2FkZXJfZml4dHVyZSB7XG4gXHRzdHJ1Y3QgdGVzdF9zaWduZWRfbG9hZGVyICpza2VsO1xuIFx0c3RydWN0IGdlbl9sb2FkZXJfb3B0cyBnb3B0cztcbkBAIC00NTcsNyArNTAyLDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX2J0Zl9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4gXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXAtcnNhXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG5AQCAtNTI5LDcgKzU3NCw2IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZClcbiBcdHN0YXRpYyBjb25zdCBfX3U4IGp1bmtbNjRdID0geyAweDMwLCAweDQyLCAweDEzLCAweDM3LCB9O1xuIFx0Y2hhciBsb2dfYnVmWzEwMjRdID0ge307XG4gXHRzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlIGY7XG4tXHR1bmlvbiBicGZfYXR0ciBhdHRyO1xuIFx0aW50IGZkO1xuIFxuIFx0aWYgKGdlbl9sb2FkZXJfZml4dHVyZV9pbml0KFx1MDAyNmYpID09IDApIHtcbkBAIC01MzgsMjIgKzU4Miw5IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9mYWlsdXJlX2xvZ3Modm9pZClcbiBcdFx0ICogZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSB2ZXJpZmllciBsb2cuIEEgcHJlc2VudC1idXQtXG4gXHRcdCAqIGludmFsaWQgc2lnbmF0dXJlIGlzIHJlamVjdGVkIGFuZCB0aGUgbG9nIHNheXMgd2h5LlxuIFx0XHQgKi9cbi1cdFx0bWVtc2V0KFx1MDAyNmF0dHIsIDAsIHNpemVvZihhdHRyKSk7XG4tXHRcdGF0dHIucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TWVNDQUxMO1xuLVx0XHRhdHRyLmluc25zID0gcHRyX3RvX3U2NChmLmdvcHRzLmluc25zKTtcbi1cdFx0YXR0ci5pbnNuX2NudCA9IGYuZ29wdHMuaW5zbnNfc3ogLyBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcbi1cdFx0YXR0ci5saWNlbnNlID0gcHRyX3RvX3U2NChcIkR1YWwgQlNEL0dQTFwiKTtcbi1cdFx0YXR0ci5wcm9nX2ZsYWdzID0gQlBGX0ZfU0xFRVBBQkxFO1xuLVx0XHRhdHRyLnNpZ25hdHVyZSA9IHB0cl90b191NjQoanVuayk7XG4tXHRcdGF0dHIuc2lnbmF0dXJlX3NpemUgPSBzaXplb2YoanVuayk7XG4tXHRcdGF0dHIua2V5cmluZ19pZCA9IEtFWV9TUEVDX1NFU1NJT05fS0VZUklORztcbi1cdFx0YXR0ci5sb2dfbGV2ZWwgPSAxO1xuLVx0XHRhdHRyLmxvZ19idWYgPSBwdHJfdG9fdTY0KGxvZ19idWYpO1xuLVx0XHRhdHRyLmxvZ19zaXplID0gc2l6ZW9mKGxvZ19idWYpO1xuLVx0XHRtZW1jcHkoYXR0ci5wcm9nX25hbWUsIFwiX19sb2FkZXIucHJvZ1wiLCBzaXplb2YoXCJfX2xvYWRlci5wcm9nXCIpKTtcbi1cbi1cdFx0ZmQgPSBzeXNjYWxsKF9fTlJfYnBmLCBCUEZfUFJPR19MT0FELCBcdTAwMjZhdHRyLFxuLVx0XHRcdCAgICAgb2Zmc2V0b2ZlbmQodW5pb24gYnBmX2F0dHIsIGtleXJpbmdfaWQpKTtcbitcdFx0ZmQgPSBsb2FkX2xvYWRlcl9sb2coZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4rXHRcdFx0XHQgICAgIHNpemVvZihqdW5rKSwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCAwLFxuK1x0XHRcdFx0ICAgICBsb2dfYnVmLCBzaXplb2YobG9nX2J1ZikpO1xuIFx0XHRBU1NFUlRfTFQoZmQsIDAsIFwiaW52YWxpZCBzaWduYXR1cmUgcmVqZWN0ZWQgYXQgbG9hZFwiKTtcbiBcdFx0aWYgKGZkIFx1MDAzZT0gMClcbiBcdFx0XHRjbG9zZShmZCk7XG5AQCAtNTcxLDggKzYwMiw5IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV90b29fbGFyZ2Uodm9pZClcbiBcbiBcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSA9PSAwKSB7XG4gXHRcdC8qXG4tXHRcdCAqIHNpZ25hdHVyZV9zaXplIGJleW9uZCB0aGUga2VybmVsJ3MgYm91bmQgKEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkUpXG4tXHRcdCAqIGlzIHJlamVjdGVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzIHJlYWQuXG4rXHRcdCAqIHNpZ25hdHVyZV9zaXplIGJleW9uZCB0aGUga2VybmVsJ3MgYm91bmRcbitcdFx0ICogKEJQRl9QUk9HX01BWF9TSUdOQVRVUkVfU0laRSkgaXMgcmVqZWN0ZWQgYmVmb3JlIHRoZSBidWZmZXJcbitcdFx0ICogaXMgcmVhZC5cbiBcdFx0ICovXG4gXHRcdGZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgLTEsIGp1bmssXG4gXHRcdFx0XHQgNjQgXHUwMDNjXHUwMDNjIDIwLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDApO1xuQEAgLTYyNiw2ICs2NTgsMjY4IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9iYWRfa2V5cmluZyh2b2lkKVxuIFx0Z2VuX2xvYWRlcl9maXh0dXJlX2ZpbmkoXHUwMDI2Zik7XG4gfVxuIFxuK3N0YXRpYyBib29sIGtleXJpbmdfdW5zZWFsZWRfYm9vdCh2b2lkKVxuK3tcbitcdGNoYXIgdmFsID0gMDtcbitcdGludCBmZDtcbitcbitcdGZkID0gb3BlbihcIi9zeXMvbW9kdWxlL2JwZi9wYXJhbWV0ZXJzL2tleXJpbmdfdW5zZWFsZWRcIiwgT19SRE9OTFkpO1xuK1x0aWYgKGZkIFx1MDAzYyAwKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXHRpZiAocmVhZChmZCwgXHUwMDI2dmFsLCAxKSAhPSAxKVxuK1x0XHR2YWwgPSAwO1xuK1x0Y2xvc2UoZmQpO1xuK1x0cmV0dXJuIHZhbCA9PSAnWScgfHwgdmFsID09ICcxJztcbit9XG4rXG4rc3RhdGljIGludCBicGZfa2V5cmluZ19sb29rdXAoaW50ICpucl9rZXlzKVxuK3tcbitcdGNoYXIgbGluZVs1MTJdLCB0eXBlWzMyXSwgZGVzY1s2NF07XG4rXHRpbnQgc2VyaWFsID0gLUVOT0VOVDtcbitcdEZJTEUgKmY7XG4rXG4rXHRmID0gZm9wZW4oXCIvcHJvYy9rZXlzXCIsIFwiclwiKTtcbitcdGlmICghZilcbitcdFx0cmV0dXJuIC1lcnJubztcbitcbitcdHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGYpKSB7XG4rXHRcdHVuc2lnbmVkIGludCBoZXg7XG4rXHRcdGNoYXIgKnN1bTtcbitcbitcdFx0aWYgKHNzY2FuZihsaW5lLCBcIiV4ICUqcyAlKnMgJSpzICUqcyAlKnMgJSpzICUzMXMgJTYzc1wiLFxuK1x0XHRcdCAgIFx1MDAyNmhleCwgdHlwZSwgZGVzYykgIT0gMylcbitcdFx0XHRjb250aW51ZTtcbitcdFx0aWYgKHN0cmNtcCh0eXBlLCBcImtleXJpbmdcIikgfHwgc3RyY21wKGRlc2MsIFwiLmJwZjpcIikpXG4rXHRcdFx0Y29udGludWU7XG4rXG4rXHRcdHNlcmlhbCA9IChpbnQpaGV4O1xuK1x0XHRpZiAobnJfa2V5cykge1xuK1x0XHRcdHN1bSA9IHN0cnN0cihsaW5lLCBcIi5icGY6IFwiKTtcbitcdFx0XHQqbnJfa2V5cyA9ICFzdW0gfHwgIXN0cm5jbXAoc3VtICsgNiwgXCJlbXB0eVwiLCA1KSA/XG4rXHRcdFx0XHQgICAwIDogYXRvaShzdW0gKyA2KTtcbitcdFx0fVxuK1x0XHRicmVhaztcbitcdH1cbitcdGZjbG9zZShmKTtcbitcdHJldHVybiBzZXJpYWw7XG4rfVxuK1xuK3N0YXRpYyBsb25nIGtleWN0bF9yZXQoaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcyLCB1bnNpZ25lZCBsb25nIGFyZzMpXG4re1xuK1x0bG9uZyByZXQgPSBzeXNjYWxsKF9fTlJfa2V5Y3RsLCBjbWQsIGFyZzIsIGFyZzMpO1xuK1xuK1x0cmV0dXJuIHJldCBcdTAwM2MgMCA/IC1lcnJubyA6IHJldDtcbit9XG4rXG4rLypcbisgKiBXaGF0IHRoZSBicGYga2V5cmluZyBzdGlsbCBuZWVkcyBvbmNlIGl0IGdvdCBwcm92aXNpb25lZDogS0VZX1BPU19TRUFSQ0hcbisgKiBmb3IgdGhlIGluLWtlcm5lbCBzZWFyY2ggZHVyaW5nIHZlcmlmaWNhdGlvbiwgYW5kIHRoZSB1c2VyIHZpZXcvcmVhZCBiaXRzXG4rICogc28gaXQgc3RheXMgdmlzaWJsZSBpbiAvcHJvYy9rZXlzLCByZXN0IGlzIGRyb3BwZWQgc28gdGhlIGVucm9sbGVkIGlzXG4rICogdGhlcmVmb3JlIGZpbmFsLlxuKyAqL1xuKyNkZWZpbmUgQlBGX0tFWVJJTkdfUEVSTV9MT0NLRURcdFx0MHgwODAzMDAwMFxuKy8qIFdoYXQgYnBmX2tleXJpbmdfaW5pdCgpIGdyYW50cyBhdCBib290LiAqL1xuKyNkZWZpbmUgQlBGX0tFWVJJTkdfUEVSTV9JTklUSUFMXHQweDA4MmYwMDAwXG4rXG4rc3RhdGljIHZvaWQgYnBmX2tleXJpbmdfc2VhbGVkKHZvaWQpXG4re1xuK1x0c3RhdGljIGNvbnN0IF9fdTgganVua1s2NF0gPSB7fTtcbitcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbitcdGludCBzZXJpYWwsIGtleSwgZmQ7XG4rXG4rXHRpZiAoa2V5cmluZ191bnNlYWxlZF9ib290KCkpIHtcbitcdFx0cHJpbnRmKFwiJXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgd2FzIHVuc2VhbGVkIGF0IGJvb3RcXG5cIiwgX19mdW5jX18pO1xuK1x0XHR0ZXN0X19za2lwKCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcdHNlcmlhbCA9IGJwZl9rZXlyaW5nX2xvb2t1cChOVUxMKTtcbitcdGlmIChzZXJpYWwgXHUwMDNlPSAwKSB7XG4rXHRcdGtleSA9IHN5c2NhbGwoX19OUl9hZGRfa2V5LCBcInVzZXJcIiwgXCJzZWFscHJvYmVcIiwgXCJ4XCIsIDEsIHNlcmlhbCk7XG4rXHRcdGlmIChrZXkgXHUwMDNlPSAwKVxuK1x0XHRcdHN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9VTkxJTkssIGtleSwgc2VyaWFsKTtcbitcdFx0QVNTRVJUX0VRKGtleSBcdTAwM2MgMCA/IC1lcnJubyA6IDAsIC1FUEVSTSxcbitcdFx0XHQgIFwibm90aGluZyBsaW5rcyBpbnRvIGEgc2VhbGVkIGtleXJpbmdcIik7XG4rXHR9XG4rXHRpZiAoZ2VuX2xvYWRlcl9maXh0dXJlX2luaXQoXHUwMDI2ZikgPT0gMCkge1xuK1x0XHRmZCA9IGxvYWRfbG9hZGVyKGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3osIC0xLCBqdW5rLFxuK1x0XHRcdFx0IHNpemVvZihqdW5rKSwgQlBGX0tFWVJJTkdfQlBGLCAwKTtcbitcdFx0QVNTRVJUX0VRKGZkLCAtRU5PS0VZLCBcInNlYWxlZCBicGYga2V5cmluZyByZWplY3RlZFwiKTtcbitcdFx0aWYgKGZkIFx1MDAzZT0gMClcbitcdFx0XHRjbG9zZShmZCk7XG4rXHR9XG4rXHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbit9XG4rXG4rc3RhdGljIGludCB0cnlfbG9hZChjb25zdCBzdHJ1Y3QgZ2VuX2xvYWRlcl9maXh0dXJlICpmLCBjb25zdCB2b2lkICpzaWcsXG4rXHRcdCAgICBfX3UzMiBzaWdfc3osIF9fczMyIGtleXJpbmdfaWQsIGNoYXIgKmxvZ19idWYsIF9fdTMyIGxvZ19zeilcbit7XG4rXHRpbnQgbWFwX2ZkLCBwcm9nX2ZkO1xuK1xuK1x0bWFwX2ZkID0gc2V0dXBfbWV0YV9tYXAoZik7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChtYXBfZmQsIFwibWV0YV9tYXBcIikpXG4rXHRcdHJldHVybiBtYXBfZmQ7XG4rXHRwcm9nX2ZkID0gbG9hZF9sb2FkZXJfbG9nKGYtXHUwMDNlZ29wdHMuaW5zbnMsIGYtXHUwMDNlZ29wdHMuaW5zbnNfc3osIG1hcF9mZCxcbitcdFx0XHRcdCAgc2lnLCBzaWdfc3osIGtleXJpbmdfaWQsIDEsIGxvZ19idWYsIGxvZ19zeik7XG4rXHRjbG9zZShtYXBfZmQpO1xuK1x0aWYgKHByb2dfZmQgXHUwMDNlPSAwKVxuK1x0XHRjbG9zZShwcm9nX2ZkKTtcbitcdHJldHVybiBwcm9nX2ZkO1xuK31cbitcbisvKlxuKyAqIFRoaXMgbmVlZHMgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MSBvbiB0aGUgZ3Vlc3Qga2VybmVsIGNvbW1hbmQgbGluZSwgd2hpY2hcbisgKiB2bXRlc3Quc2ggY2FuIHBhc3MgdmlhIEtFUk5FTF9DTURMSU5FX0VYVFJBLiBUaGVyZSBpcyBubyB3YXkgdG8gdW5zZWFsIHRoZVxuKyAqIGtleXJpbmcgZnJvbSBoZXJlLCBzbyB3aXRob3V0IGl0IHRoZSB0ZXN0IHNraXBzLiBJdCBhbHNvIG9ubHkgd29ya3Mgb25jZVxuKyAqIHBlciBib290LCBhcyByZXN0cmljdGluZyBhIGtleXJpbmcgY2Fubm90IGJlIHVuZG9uZS5cbisgKi9cbitzdGF0aWMgdm9pZCBicGZfa2V5cmluZ19wcm92aXNpb25lZCh2b2lkKVxuK3tcbitcdGNoYXIgZGlyX3RtcGxbXSA9IFwiL3RtcC9icGZrZXlyaW5nWFhYWFhYXCI7XG4rXHRjaGFyIGJhZF90bXBsW10gPSBcIi90bXAvYnBma2V5cmluZ2JhZFhYWFhYWFwiO1xuK1x0X191OCAqc2lnID0gTlVMTCwgKmJhZCA9IE5VTEwsICpidWYgPSBOVUxMO1xuK1x0aW50IHNlcmlhbCwgZXJyO1xuK1x0aW50IG5yX2tleXMgPSAwLCBkZXJfZmQgPSAtMTtcbitcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbitcdF9fdTMyIHNpZ19zeiA9IDgxOTIsIGJhZF9zejtcbitcdGJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7XG4rXHRjaGFyICpkaXIsICpiYWRfZGlyID0gTlVMTDtcbitcdGNoYXIgbG9nX2J1ZlsxMDI0XSA9IHt9O1xuK1x0Y2hhciBwYXRoW1BBVEhfTUFYXTtcbitcdF9fdTggZGVyWzQwOTZdO1xuK1x0c3NpemVfdCBkZXJfc3o7XG4rXG4rXHRzZXJpYWwgPSBicGZfa2V5cmluZ19sb29rdXAoXHUwMDI2bnJfa2V5cyk7XG4rXHRpZiAoc2VyaWFsIFx1MDAzYyAwKSB7XG4rXHRcdHByaW50ZihcIiVzOlNLSVA6bm8gYnBmIGtleXJpbmcgKG5lZWRzIENPTkZJR19LRVlTKVxcblwiLCBfX2Z1bmNfXyk7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1x0aWYgKG5yX2tleXMgIT0gMCkge1xuK1x0XHRwcmludGYoXCIlczpTS0lQOnRoZSBicGYga2V5cmluZyBoYXMgYWxyZWFkeSBiZWVuIHByb3Zpc2lvbmVkXFxuXCIsXG4rXHRcdCAgICAgICBfX2Z1bmNfXyk7XG4rXHRcdHRlc3RfX3NraXAoKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4rXHRcdHJldHVybjtcbitcdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcImdlbmtleVwiLCBkaXIpLCBcInZlcmlmeV9zaWdfc2V0dXAgZ2Vua2V5XCIpKVxuK1x0XHRnb3RvIHJtZGlyO1xuK1xuK1x0c25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBcIiVzL3NpZ25pbmdfa2V5LmRlclwiLCBkaXIpO1xuK1x0ZGVyX2ZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7XG4rXHRpZiAoIUFTU0VSVF9PS19GRChkZXJfZmQsIFwib3BlbiBzaWduaW5nX2tleS5kZXJcIikpXG4rXHRcdGdvdG8gcm1kaXI7XG4rXHRkZXJfc3ogPSByZWFkKGRlcl9mZCwgZGVyLCBzaXplb2YoZGVyKSk7XG4rXHRjbG9zZShkZXJfZmQpO1xuK1x0aWYgKCFBU1NFUlRfR1QoZGVyX3N6LCAwLCBcInJlYWQgc2lnbmluZ19rZXkuZGVyXCIpKVxuK1x0XHRnb3RvIHJtZGlyO1xuK1xuK1x0ZXJyID0gc3lzY2FsbChfX05SX2FkZF9rZXksIFwiYXN5bW1ldHJpY1wiLCBcIlwiLCBkZXIsIChzaXplX3QpZGVyX3N6LFxuK1x0XHQgICAgICBzZXJpYWwpO1xuK1x0aWYgKGVyciBcdTAwM2MgMCBcdTAwMjZcdTAwMjYgZXJybm8gPT0gRVBFUk0pIHtcbitcdFx0cHJpbnRmKFwiJXM6U0tJUDp0aGUgYnBmIGtleXJpbmcgaXMgc2VhbGVkLCBuZWVkIGJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFcXG5cIixcbitcdFx0ICAgICAgIF9fZnVuY19fKTtcbitcdFx0dGVzdF9fc2tpcCgpO1xuK1x0XHRnb3RvIHJtZGlyO1xuK1x0fVxuK1x0aWYgKCFBU1NFUlRfR0UoZXJyLCAwLCBcImFkZCB0aGUgc2lnbmluZyBrZXkgdG8gdGhlIGJwZiBrZXlyaW5nXCIpKVxuK1x0XHRnb3RvIHJtZGlyO1xuK1xuK1x0c2lnID0gbWFsbG9jKHNpZ19zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2lnLCBcInNpZyBidWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aGF2ZV9maXh0dXJlID0gdHJ1ZTtcbitcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSAhPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgXCJzaWduYnVmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xuK1x0bWVtY3B5KGJ1ZiArIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTtcbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGRpciwgYnVmLCBmLmdvcHRzLmluc25zX3N6ICsgZi5kYXRhX3N6LCBzaWcsXG4rXHRcdFx0XHRcdTAwMjZzaWdfc3opLCBcInNpZ24gaW5zbnN8fG1ldGFkYXRhXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdEFTU0VSVF9FUSh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKSwgLUVOT0tFWSxcbitcdFx0ICBcInVucmVzdHJpY3RlZCBrZXlyaW5nIHN0aWxsIG5vdCBjb25zdWx0ZWRcIik7XG4rXG4rXHRBU1NFUlRfRVEodHJ5X2xvYWQoXHUwMDI2Ziwgc2lnLCBzaWdfc3osIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgTlVMTCwgMCksXG4rXHRcdCAgLUVQRVJNLCBcImNhbGxlci1zdXBwbGllZCBrZXlyaW5nIHJlZnVzZWQgYmVmb3JlIHByb3Zpc2lvbmluZ1wiKTtcbitcbitcdGlmICghQVNTRVJUX09LKHN5c2NhbGwoX19OUl9rZXljdGwsIEtFWUNUTF9SRVNUUklDVF9LRVlSSU5HLCBzZXJpYWwsXG4rXHRcdFx0ICAgICAgIE5VTEwsIE5VTEwpLCBcInJlc3RyaWN0IGJwZiBrZXlyaW5nXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX0ZEKHRyeV9sb2FkKFx1MDAyNmYsIHNpZywgc2lnX3N6LCBCUEZfS0VZUklOR19CUEYsIE5VTEwsIDApLFxuK1x0XHRcdCAgXCJsb2FkIHNpZ25lZCBieSBhIGtleSBpbiB0aGUgLmJwZiBrZXlyaW5nXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJhZF9kaXIgPSBta2R0ZW1wKGJhZF90bXBsKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihiYWRfZGlyLCBcIm1rZHRlbXAgdW5lbnJvbGxlZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJnZW5rZXlcIiwgYmFkX2RpciksIFwidmVyaWZ5X3NpZ19zZXR1cCBnZW5rZXkgdW5lbnJvbGxlZFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRiYWRfc3ogPSA4MTkyO1xuK1x0YmFkID0gbWFsbG9jKGJhZF9zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoYmFkLCBcImJhZCBzaWcgYnVmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX09LKHNpZ25fYnVmKGJhZF9kaXIsIGJ1ZiwgZi5nb3B0cy5pbnNuc19zeiArIGYuZGF0YV9zeiwgYmFkLFxuK1x0XHRcdFx0XHUwMDI2YmFkX3N6KSwgXCJzaWduIHdpdGggYW4gdW5lbnJvbGxlZCBrZXlcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0QVNTRVJUX0VRKHRyeV9sb2FkKFx1MDAyNmYsIGJhZCwgYmFkX3N6LCBCUEZfS0VZUklOR19CUEYsIGxvZ19idWYsXG4rXHRcdFx0ICAgc2l6ZW9mKGxvZ19idWYpKSwgLUVOT0tFWSxcbitcdFx0ICBcImtleSBvdXRzaWRlIHRoZSBicGYga2V5cmluZyByZWZ1c2VkXCIpO1xuK1x0QVNTRVJUX0hBU19TVUJTVFIobG9nX2J1ZiwgXCJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZFwiLFxuK1x0XHRcdCAgXCJ0aGUgYnBmIGtleXJpbmcgd2FzIGNvbnN1bHRlZFwiKTtcbitcbitcdGYuYmxvYlswXSBePSAweGZmO1xuK1x0ZXJyID0gdHJ5X2xvYWQoXHUwMDI2Ziwgc2lnLCBzaWdfc3osIEJQRl9LRVlSSU5HX0JQRiwgTlVMTCwgMCk7XG4rXHRmLmJsb2JbMF0gXj0gMHhmZjtcbitcdEFTU0VSVF9FUShlcnIsIC1FS0VZUkVKRUNURUQsIFwidGFtcGVyZWQgbWV0YWRhdGEgcmVmdXNlZFwiKTtcbitcbitcdEFTU0VSVF9FUSh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgS0VZX1NQRUNfU0VTU0lPTl9LRVlSSU5HLCBOVUxMLCAwKSxcbitcdFx0ICAtRVBFUk0sIFwiY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCBvbmNlIC5icGYgaXMgaW4gdXNlXCIpO1xuK1xuK1x0ZXJyID0ga2V5Y3RsX3JldChLRVlDVExfVU5MSU5LLCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIHNlcmlhbCk7XG4rXHRBU1NFUlRfRVEoZXJyLCAtRU5PRU5ULCBcImtleXJpbmcgd3JpdGFibGUgd2hpbGUgdGhlIHVzZXIgYml0cyBhcmUgdGhlcmVcIik7XG4rXG4rXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRQRVJNLCBzZXJpYWwsIEJQRl9LRVlSSU5HX1BFUk1fTE9DS0VEKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJkcm9wIHRoZSB1c2VyIGJpdHMgb24gdGhlIGJwZiBrZXlyaW5nXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdEFTU0VSVF9PS19GRCh0cnlfbG9hZChcdTAwMjZmLCBzaWcsIHNpZ19zeiwgQlBGX0tFWVJJTkdfQlBGLCBOVUxMLCAwKSxcbitcdFx0ICAgICBcImxvYWQgc3RpbGwgdmVyaWZpZWQgYWdhaW5zdCB0aGUgbG9ja2VkIGtleXJpbmdcIik7XG4rXG4rXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9VTkxJTkssIEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgc2VyaWFsKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFwidW5saW5rIHJlZnVzZWRcIik7XG4rXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9DTEVBUiwgc2VyaWFsLCAwKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFwiY2xlYXIgcmVmdXNlZFwiKTtcbitcdGVyciA9IGtleWN0bF9yZXQoS0VZQ1RMX1JFVk9LRSwgc2VyaWFsLCAwKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFwicmV2b2tlIHJlZnVzZWRcIik7XG4rXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9JTlZBTElEQVRFLCBzZXJpYWwsIDApO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJpbnZhbGlkYXRlIHJlZnVzZWRcIik7XG4rXHRlcnIgPSBrZXljdGxfcmV0KEtFWUNUTF9TRVRfVElNRU9VVCwgc2VyaWFsLCAxKTtcbitcdEFTU0VSVF9FUShlcnIsIC1FQUNDRVMsIFwidGltZW91dCByZWZ1c2VkXCIpO1xuK1x0ZXJyID0ga2V5Y3RsX3JldChLRVlDVExfU0VUUEVSTSwgc2VyaWFsLCBCUEZfS0VZUklOR19QRVJNX0lOSVRJQUwpO1xuK1x0QVNTRVJUX0VRKGVyciwgLUVBQ0NFUywgXCJ0aGUgYml0cyBjYW5ub3QgYmUgZ3JhbnRlZCBiYWNrXCIpO1xuK1xuK1x0QVNTRVJUX0VRKGJwZl9rZXlyaW5nX2xvb2t1cChcdTAwMjZucl9rZXlzKSwgc2VyaWFsLCBcImtleXJpbmcgc3RpbGwgdGhlcmVcIik7XG4rXHRBU1NFUlRfRVEobnJfa2V5cywgMSwgXCJ0aGUgZW5yb2xsZWQga2V5IHN1cnZpdmVkXCIpO1xuK291dDpcbitcdGlmIChoYXZlX2ZpeHR1cmUpXG4rXHRcdGdlbl9sb2FkZXJfZml4dHVyZV9maW5pKFx1MDAyNmYpO1xuK1x0Z2Vua2V5X2Rpcl9maW5pKGJhZF9kaXIpO1xuK1x0ZnJlZShidWYpO1xuK1x0ZnJlZShiYWQpO1xuK1x0ZnJlZShzaWcpO1xuK3JtZGlyOlxuK1x0Z2Vua2V5X2Rpcl9maW5pKGRpcik7XG4rfVxuK1xuIC8qXG4gICogQSBzaWduZWQgbG9hZGVyIG11c3QgaWdub3JlIGN0eC1zdXBwbGllZCBtYXAgZGltZW5zaW9uczogdGhlIGhvc3QgY2Fubm90XG4gICogcmVzaXplIGEgc2lnbmVkIHByb2dyYW0ncyBtYXBzIHZpYSB0aGUgbG9hZGVyIGN0eC4gRHJpdmUgYSBvbmUtbWFwIHByb2dyYW1cbkBAIC04MzEsNyArMTEyNSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX2luc25zKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC05MzEsNyArMTIyNSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25hdHVyZV9hdXRoZW50aWNhdGVzX21ldGFkYXRhKHZvaWQpXG4gXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbiBcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0cmV0dXJuO1xuLVx0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXBcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4rXHRpZiAoIUFTU0VSVF9PSyhydW5fc2V0dXAoXCJzZXR1cC1yc2FcIiwgZGlyKSwgXCJ2ZXJpZnlfc2lnX3NldHVwXCIpKSB7XG4gXHRcdHJtZGlyKGRpcik7XG4gXHRcdHJldHVybjtcbiBcdH1cbkBAIC0xMjY3LDcgKzE1NjEsNyBAQCBzdGF0aWMgdm9pZCBsc21fc2lnbmF0dXJlX3ZlcmRpY3Qodm9pZClcbiBcdGRpciA9IG1rZHRlbXAoZGlyX3RtcGwpO1xuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKGRpciwgXCJta2R0ZW1wXCIpKVxuIFx0XHRnb3RvIG91dDtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXAtcnNhXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRkaXIgPSBOVUxMO1xuIFx0XHRnb3RvIG91dDtcbkBAIC0xNDUwLDcgKzE3NDQsNyBAQCBzdGF0aWMgdm9pZCBsb2FkdGltZV92ZXJpZnkoc3RydWN0IGJwZl9vYmplY3QgKm9iaiwgaW50IGV4cGVjdF9tYXBzKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4gXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXAtcnNhXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG5AQCAtMTUyNCw2ICsxODE4LDg5IEBAIHN0YXRpYyB2b2lkIGxvYWR0aW1lX3dpdGhfbWFwKHZvaWQpXG4gXHR0ZXN0X3NpZ25lZF9sb2FkZXJfbWFwX19kZXN0cm95KHNrZWwpO1xuIH1cbiBcbisvKlxuKyAqIEVuZC10by1lbmQgc2lnbmVkIGxvYWQgd2l0aCBhIHBvc3QtcXVhbnR1bSBrZXkuIE1MLURTQSAoRklQUy0yMDQpIGlzIHdpcmVkXG4rICogdGhyb3VnaCB0aGUgWC41MDkgYW5kIFBLQ1MjNyBwYXJzZXJzLCBhbmQgQlBGIHJlYWNoZXMgdGhlbSB2aWFcbisgKiB2ZXJpZnlfcGtjczdfc2lnbmF0dXJlKCkgd2l0aG91dCBrbm93aW5nIHRoZSBhbGdvcml0aG0sIHNvIGFuIE1MLURTQSBrZXkgaW5cbisgKiB0aGUga2V5cmluZyBzaG91bGQgdmVyaWZ5IGFuIE1MLURTQSBzaWduZWQgcHJvZ3JhbSB3aXRoIG5vIEJQRi1zaWRlIHdvcmsuXG4rICovXG4rc3RhdGljIHZvaWQgbWxkc2Ffc2lnbmVkX2xvYWQodm9pZClcbit7XG4rXHRjaGFyIGRpcl90bXBsW10gPSBcIi90bXAvYnBmbWxkc2FYWFhYWFhcIjtcbitcdGludCBtYXBfZmQgPSAtMSwgcHJvZ19mZCA9IC0xLCBlcnI7XG4rXHRfX3U4ICpzaWcgPSBOVUxMLCAqYnVmID0gTlVMTDtcbitcdHN0cnVjdCBnZW5fbG9hZGVyX2ZpeHR1cmUgZjtcbitcdGJvb2wgaGF2ZV9maXh0dXJlID0gZmFsc2U7XG4rXHRfX3UzMiBzaWdfc3ogPSAxNjM4NDtcbitcdGNoYXIgKmRpcjtcbitcbitcdHN5c2NhbGwoX19OUl9yZXF1ZXN0X2tleSwgXCJrZXlyaW5nXCIsIFwiX3VpZC4wXCIsIE5VTEwsXG4rXHRcdEtFWV9TUEVDX1NFU1NJT05fS0VZUklORyk7XG4rXHRkaXIgPSBta2R0ZW1wKGRpcl90bXBsKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihkaXIsIFwibWtkdGVtcFwiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gcnVuX3NldHVwKFwic2V0dXAtbWxkc2FcIiwgZGlyKTtcbitcdGlmIChlcnIgPT0gU0VUVVBfU0tJUCkge1xuK1x0XHRwcmludGYoXCIlczpTS0lQOm9wZW5zc2wgaGFzIG5vIE1MLURTQSBzdXBwb3J0IChuZWVkcyAzLjUrKVxcblwiLFxuK1x0XHQgICAgICAgX19mdW5jX18pO1xuK1x0XHR0ZXN0X19za2lwKCk7XG4rXHRcdGdlbmtleV9kaXJfZmluaShkaXIpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwidmVyaWZ5X3NpZ19zZXR1cCBzZXR1cC1tbGRzYVwiKSkge1xuK1x0XHRnZW5rZXlfZGlyX2ZpbmkoZGlyKTtcbitcdFx0cmV0dXJuO1xuK1x0fVxuK1xuK1x0c2lnID0gbWFsbG9jKHNpZ19zeik7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIoc2lnLCBcInNpZyBidWZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aGF2ZV9maXh0dXJlID0gdHJ1ZTtcbitcdGlmIChnZW5fbG9hZGVyX2ZpeHR1cmVfaW5pdChcdTAwMjZmKSAhPSAwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZiA9IG1hbGxvYygoc2l6ZV90KWYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3opO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGJ1ZiwgXCJzaWduYnVmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdG1lbWNweShidWYsIGYuZ29wdHMuaW5zbnMsIGYuZ29wdHMuaW5zbnNfc3opO1xuK1x0bWVtY3B5KGJ1ZiArIGYuZ29wdHMuaW5zbnNfc3osIGYuYmxvYiwgZi5kYXRhX3N6KTtcbitcbitcdC8qXG4rXHQgKiBNTC1EU0EgaGFzaGVzIHRoZSBtZXNzYWdlIGl0c2VsZiwgYnV0IG9wZW5zc2wgYmVmb3JlIDQuMCBjYW5ub3RcbitcdCAqIHByb2R1Y2UgYSBDTVMgbWVzc2FnZSB3aXRob3V0IHNpZ25lZEF0dHJzIGZvciBpdCwgYW5kIHdpdGggdGhvc2UgaW5cbitcdCAqIHBsYXkgb25seSBTSEEtNTEyIGlzIHBlcm1pdHRlZCBmb3IgdGhlIG1lc3NhZ2VEaWdlc3QgYXR0cmlidXRlLlxuK1x0ICovXG4rXHRpZiAoIUFTU0VSVF9PSyhzaWduX2J1Zl9kaWdlc3QoZGlyLCBidWYsIGYuZ29wdHMuaW5zbnNfc3ogKyBmLmRhdGFfc3osXG4rXHRcdFx0XHQgICAgICAgc2lnLCBcdTAwMjZzaWdfc3osIFwic2hhNTEyXCIpLFxuK1x0XHQgICAgICAgXCJzaWduIGluc25zfHxtZXRhZGF0YSB3aXRoIE1MLURTQVwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKlxuK1x0ICogR3VhcmQgYWdhaW5zdCB0aGUgc2V0dXAgc2lsZW50bHkgaGFuZGluZyBiYWNrIHNvbWUgb3RoZXIga2V5IHR5cGU6XG4rXHQgKiBhbiBSU0Egb3IgRUNEU0Egc2lnbmF0dXJlIGlzIGEgZmV3IGh1bmRyZWQgYnl0ZXMsIHdoZXJlIGFuIE1MLURTQS04N1xuK1x0ICogb25lIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gdGhlIHJhdyBzaWduYXR1cmUgaXQgY2Fycmllcy5cbitcdCAqL1xuK1x0QVNTRVJUX0dUKHNpZ19zeiwgTUxEU0E4N19TSUdOQVRVUkVfU0laRSwgXCJNTC1EU0EtODcgc2lnbmF0dXJlIHNpemVcIik7XG4rXG4rXHRtYXBfZmQgPSBzZXR1cF9tZXRhX21hcChcdTAwMjZmKTtcbitcdGlmICghQVNTRVJUX09LX0ZEKG1hcF9mZCwgXCJtZXRhX21hcFwiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRwcm9nX2ZkID0gbG9hZF9sb2FkZXIoZi5nb3B0cy5pbnNucywgZi5nb3B0cy5pbnNuc19zeiwgbWFwX2ZkLCBzaWcsXG4rXHRcdFx0ICAgICAgc2lnX3N6LCBLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsIDEpO1xuK1x0QVNTRVJUX09LX0ZEKHByb2dfZmQsIFwiTUwtRFNBIHNpZ25lZCBsb2FkZXIgbG9hZFwiKTtcbitvdXQ6XG4rXHRpZiAocHJvZ19mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKHByb2dfZmQpO1xuK1x0aWYgKG1hcF9mZCBcdTAwM2U9IDApXG4rXHRcdGNsb3NlKG1hcF9mZCk7XG4rXHRpZiAoaGF2ZV9maXh0dXJlKVxuK1x0XHRnZW5fbG9hZGVyX2ZpeHR1cmVfZmluaShcdTAwMjZmKTtcbitcdGZyZWUoYnVmKTtcbitcdGZyZWUoc2lnKTtcbitcdHJ1bl9zZXR1cChcImNsZWFudXBcIiwgZGlyKTtcbit9XG4rXG4gLypcbiAgKiBBIHNpZ25lZCBwcm9ncmFtIG5lZWQgbm90IGJpbmQgYW55IG1hcC4gQSBwbGFpbiBCUEZfUFJPR19UWVBFX1NZU0NBTExcbiAgKiBwcm9ncmFtIHdpdGggbm8gZmRfYXJyYXkgaXMgc2lnbmVkIG92ZXIgaXRzIGluc3RydWN0aW9ucyBhbG9uZTogdGhlIGtlcm5lbFxuQEAgLTE1NDgsNyArMTkyNSw3IEBAIHN0YXRpYyB2b2lkIHNpZ25lZF9ub19mZF9hcnJheSh2b2lkKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4gXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXAtcnNhXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG5AQCAtMTYxOSw3ICsxOTk2LDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX21hcF9ieV9mZF9yZWplY3RlZCh2b2lkKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4gXHRcdGdvdG8gb3V0X21hcDtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXAtcnNhXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRnb3RvIG91dF9tYXA7XG4gXHR9XG5AQCAtMTY4MSw3ICsyMDU4LDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX3NwYXJzZV9mZF9hcnJheV9yZWplY3RlZCh2b2lkKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4gXHRcdGdvdG8gb3V0X21hcDtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXAtcnNhXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRnb3RvIG91dF9tYXA7XG4gXHR9XG5AQCAtMTczNSw3ICsyMTEyLDcgQEAgc3RhdGljIHZvaWQgc2lnbmVkX21vZHVsZV9rZnVuY19yZWplY3RlZCh2b2lkKVxuIFx0ZGlyID0gbWtkdGVtcChkaXJfdG1wbCk7XG4gXHRpZiAoIUFTU0VSVF9PS19QVFIoZGlyLCBcIm1rZHRlbXBcIikpXG4gXHRcdHJldHVybjtcbi1cdGlmICghQVNTRVJUX09LKHJ1bl9zZXR1cChcInNldHVwXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuK1x0aWYgKCFBU1NFUlRfT0socnVuX3NldHVwKFwic2V0dXAtcnNhXCIsIGRpciksIFwidmVyaWZ5X3NpZ19zZXR1cFwiKSkge1xuIFx0XHRybWRpcihkaXIpO1xuIFx0XHRyZXR1cm47XG4gXHR9XG5AQCAtMTc3OSw2ICsyMTU2LDExIEBAIHN0YXRpYyB2b2lkIHNpZ25lZF9tb2R1bGVfa2Z1bmNfcmVqZWN0ZWQodm9pZClcbiBcbiB2b2lkIHRlc3Rfc2lnbmVkX2xvYWRlcih2b2lkKVxuIHtcbitcdGlmIChrZXlyaW5nX3Vuc2VhbGVkX2Jvb3QoKSkge1xuK1x0XHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcImJwZl9rZXlyaW5nX3Byb3Zpc2lvbmVkXCIpKVxuK1x0XHRcdGJwZl9rZXlyaW5nX3Byb3Zpc2lvbmVkKCk7XG4rXHRcdHJldHVybjtcbitcdH1cbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibG9hZHRpbWVfbm9fbWFwXCIpKVxuIFx0XHRsb2FkdGltZV9ub19tYXAoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibG9hZHRpbWVfd2l0aF9tYXBcIikpXG5AQCAtMTgwNSw2ICsyMTg3LDEwIEBAIHZvaWQgdGVzdF9zaWduZWRfbG9hZGVyKHZvaWQpXG4gXHRcdHNpZ25hdHVyZV96ZXJvX3NpemUoKTtcbiBcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwic2lnbmF0dXJlX2JhZF9rZXlyaW5nXCIpKVxuIFx0XHRzaWduYXR1cmVfYmFkX2tleXJpbmcoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwiYnBmX2tleXJpbmdfc2VhbGVkXCIpKVxuK1x0XHRicGZfa2V5cmluZ19zZWFsZWQoKTtcbitcdGlmICh0ZXN0X19zdGFydF9zdWJ0ZXN0KFwibWxkc2Ffc2lnbmVkX2xvYWRcIikpXG4rXHRcdG1sZHNhX3NpZ25lZF9sb2FkKCk7XG4gXHRpZiAodGVzdF9fc3RhcnRfc3VidGVzdChcIm1ldGFkYXRhX2N0eF9tYXhfZW50cmllc19pZ25vcmVkXCIpKVxuIFx0XHRtZXRhZGF0YV9jdHhfbWF4X2VudHJpZXNfaWdub3JlZCgpO1xuIFx0aWYgKHRlc3RfX3N0YXJ0X3N1YnRlc3QoXCJtZXRhZGF0YV9jdHhfaW5pdGlhbF92YWx1ZV9pZ25vcmVkXCIpKVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuY1xuaW5kZXggZjMyN2ZlYjhlMzhjMy4uMTJiMTQ2ZDIwNWQ3NSAxMDA2NDRcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL3ZlcmlmeV9wa2NzN19zaWcuY1xuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvdmVyaWZ5X3BrY3M3X3NpZy5jXG5AQCAtMjU3LDcgKzI1Nyw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfdmVyaWZ5X3BrY3M3X3NpZ19mcm9tX21hcCh2b2lkKVxuIFx0aWYgKCFBU1NFUlRfT0tfUFRSKHRtcF9kaXIsIFwibWtkdGVtcFwiKSlcbiBcdFx0cmV0dXJuO1xuIFxuLVx0cmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsIFwic2V0dXBcIik7XG4rXHRyZXQgPSBfcnVuX3NldHVwX3Byb2Nlc3ModG1wX2RpciwgXCJzZXR1cC1yc2FcIik7XG4gXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiX3J1bl9zZXR1cF9wcm9jZXNzXCIpKVxuIFx0XHRnb3RvIGNsb3NlX3Byb2c7XG4gXG5AQCAtNDU4LDcgKzQ1OCw3IEBAIHN0YXRpYyB2b2lkIHRlc3RfcGtjczdfc2lnX2ZzdmVyaXR5KHZvaWQpXG4gXHRzbnByaW50ZihkYXRhX3BhdGgsIFBBVEhfTUFYLCBcIiVzL2RhdGEtZmlsZVwiLCB0bXBfZGlyKTtcbiBcdHNucHJpbnRmKHNpZ19wYXRoLCBQQVRIX01BWCwgXCIlcy9zaWctZmlsZVwiLCB0bXBfZGlyKTtcbiBcbi1cdHJldCA9IF9ydW5fc2V0dXBfcHJvY2Vzcyh0bXBfZGlyLCBcInNldHVwXCIpO1xuK1x0cmV0ID0gX3J1bl9zZXR1cF9wcm9jZXNzKHRtcF9kaXIsIFwic2V0dXAtcnNhXCIpO1xuIFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIl9ydW5fc2V0dXBfcHJvY2Vzc1wiKSlcbiBcdFx0Z290byBvdXQ7XG4gXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZlcmlmeV9zaWdfc2V0dXAuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaFxuaW5kZXggMDkxNzlmYjU1MWYwOS4uMjczN2MxYTJiY2ZkNiAxMDA3NTVcbi0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92ZXJpZnlfc2lnX3NldHVwLnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdmVyaWZ5X3NpZ19zZXR1cC5zaFxuQEAgLTI4LDcgKzI4LDcgQEAgYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZFxuIFxuIHVzYWdlKClcbiB7XG4tXHRlY2hvIFwiVXNhZ2U6ICQwIFx1MDAzY3NldHVwfGNsZWFudXAgXHUwMDNjZXhpc3RpbmdfdG1wX2Rpclx1MDAzZVwiXG4rXHRlY2hvIFwiVXNhZ2U6ICQwIFx1MDAzY3NldHVwLXJzYXxzZXR1cC1tbGRzYXxjbGVhbnVwIFx1MDAzY2V4aXN0aW5nX3RtcF9kaXJcdTAwM2VcIlxuIFx0ZXhpdCAxXG4gfVxuIFxuQEAgLTQ3LDcgKzQ3LDcgQEAgZ2Vua2V5KClcbiBcdFx0JHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgLW91dGZvcm0gZGVyXG4gfVxuIFxuLXNldHVwKClcbitzZXR1cF9yc2EoKVxuIHtcbiBcdGxvY2FsIHRtcF9kaXI9XCIkMVwiXG4gXG5AQCAtNTcsNiArNTcsNTcgQEAgc2V0dXAoKVxuIFx0a2V5Y3RsIGxpbmsgJGtleV9pZCAka2V5cmluZ19pZFxuIH1cbiBcbittbGRzYV9zdXBwb3J0ZWQoKVxuK3tcbitcdGxvY2FsIHRtcF9kaXI9XCIkMVwiXG4rXG4rXHRnZW5rZXlfbWxkc2EgXCIke3RtcF9kaXJ9XCIgfHwgcmV0dXJuIDFcbitcdDogXHUwMDNlICR7dG1wX2Rpcn0vcHJvYmVcbitcdCMgU2FtZSBkaWdlc3QgYXMgdGhlIGNhbGxlciBzaWducyB3aXRoLCBzZWUgc2lnbl9idWZfZGlnZXN0KCkuXG4rXHQuL3NpZ24tZmlsZSAtZCBzaGE1MTIgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gXFxcbitcdFx0JHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gJHt0bXBfZGlyfS9wcm9iZSB8fCByZXR1cm4gMVxuK1x0cm0gLWYgJHt0bXBfZGlyfS9wcm9iZSAke3RtcF9kaXJ9L3Byb2JlLnA3c1xuK31cbitcbitnZW5rZXlfbWxkc2EoKVxuK3tcbitcdGxvY2FsIHRtcF9kaXI9XCIkMVwiXG4rXG4rXHRlY2hvIFwiJHt4NTA5X2dlbmtleV9jb250ZW50fVwiIFx1MDAzZSAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5XG4rXG4rXHQjIE5vIC1cdTAwM2NkaWdlc3RcdTAwM2UgaGVyZTogTUwtRFNBIGhhc2hlcyB0aGUgbWVzc2FnZSBpdHNlbGYsIGFuZCBvcGVuc3NsXG4rXHQjIHJlamVjdHMgYW4gZXhwbGljaXQgZGlnZXN0IGZvciBpdC5cbitcdG9wZW5zc2wgcmVxIC1uZXcgLW5vZGVzIC11dGY4IC1kYXlzIDM2NTAwIFxcXG4rXHRcdFx0LWJhdGNoIC14NTA5IC1uZXdrZXkgTUwtRFNBLTg3IFxcXG4rXHRcdFx0LWNvbmZpZyAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5IFxcXG4rXHRcdFx0LW91dGZvcm0gUEVNIC1vdXQgJHt0bXBfZGlyfS9zaWduaW5nX2tleS5wZW0gXFxcbitcdFx0XHQta2V5b3V0ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIDJcdTAwM2VcdTAwMjYxXG4rXG4rXHRvcGVuc3NsIHg1MDkgLWluICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIC1vdXQgXFxcbitcdFx0JHt0bXBfZGlyfS9zaWduaW5nX2tleS5kZXIgLW91dGZvcm0gZGVyXG4rfVxuK1xuK21sZHNhX3NraXAoKVxuK3tcbitcdGxvY2FsIHRtcF9kaXI9XCIkMVwiXG4rXG4rXHRybSAtZiAke3RtcF9kaXJ9L3g1MDkuZ2Vua2V5ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkucGVtIFxcXG4rXHRcdCR7dG1wX2Rpcn0vc2lnbmluZ19rZXkuZGVyICR7dG1wX2Rpcn0vcHJvYmUgXFxcbitcdFx0JHt0bXBfZGlyfS9wcm9iZS5wN3NcbitcdGV4aXQgNzdcbit9XG4rXG4rc2V0dXBfbWxkc2EoKVxuK3tcbitcdGxvY2FsIHRtcF9kaXI9XCIkMVwiXG4rXG4rXHRtbGRzYV9zdXBwb3J0ZWQgXCIke3RtcF9kaXJ9XCIgfHwgbWxkc2Ffc2tpcCBcIiR7dG1wX2Rpcn1cIlxuK1x0a2V5X2lkPSQoY2F0ICR7dG1wX2Rpcn0vc2lnbmluZ19rZXkuZGVyIHxcbitcdFx0IGtleWN0bCBwYWRkIGFzeW1tZXRyaWMgZWJwZl90ZXN0aW5nX2tleSBAcylcbitcdGtleXJpbmdfaWQ9JChrZXljdGwgbmV3cmluZyBlYnBmX3Rlc3Rpbmdfa2V5cmluZyBAcylcbitcdGtleWN0bCBsaW5rICRrZXlfaWQgJGtleXJpbmdfaWRcbit9XG4rXG4gY2xlYW51cCgpIHtcbiBcdGxvY2FsIHRtcF9kaXI9XCIkMVwiXG4gXG5AQCAtOTEsNyArMTQyLDcgQEAgY2F0Y2goKVxuIFx0bG9jYWwgZXhpdF9jb2RlPVwiJDFcIlxuIFx0bG9jYWwgbG9nX2ZpbGU9XCIkMlwiXG4gXG4tXHRpZiBbWyBcIiR7ZXhpdF9jb2RlfVwiIC1uZSAwIF1dOyB0aGVuXG4rXHRpZiBbWyBcIiR7ZXhpdF9jb2RlfVwiIC1uZSAwIFx1MDAyNlx1MDAyNiBcIiR7ZXhpdF9jb2RlfVwiIC1uZSA3NyBdXTsgdGhlblxuIFx0XHRjYXQgXCIke2xvZ19maWxlfVwiIFx1MDAzZVx1MDAyNjNcbiBcdGZpXG4gXG5AQCAtMTA4LDggKzE1OSwxMCBAQCBtYWluKClcbiBcbiBcdFtbICEgLWQgXCIke3RtcF9kaXJ9XCIgXV0gXHUwMDI2XHUwMDI2IGVjaG8gXCJEaXJlY3RvcnkgJHt0bXBfZGlyfSBkb2Vzbid0IGV4aXN0XCIgXHUwMDI2XHUwMDI2IGV4aXQgMVxuIFxuLVx0aWYgW1sgXCIke2FjdGlvbn1cIiA9PSBcInNldHVwXCIgXV07IHRoZW5cbi1cdFx0c2V0dXAgXCIke3RtcF9kaXJ9XCJcbitcdGlmIFtbIFwiJHthY3Rpb259XCIgPT0gXCJzZXR1cC1yc2FcIiBdXTsgdGhlblxuK1x0XHRzZXR1cF9yc2EgXCIke3RtcF9kaXJ9XCJcbitcdGVsaWYgW1sgXCIke2FjdGlvbn1cIiA9PSBcInNldHVwLW1sZHNhXCIgXV07IHRoZW5cbitcdFx0c2V0dXBfbWxkc2EgXCIke3RtcF9kaXJ9XCJcbiBcdGVsaWYgW1sgXCIke2FjdGlvbn1cIiA9PSBcImdlbmtleVwiIF1dOyB0aGVuXG4gXHRcdGdlbmtleSBcIiR7dG1wX2Rpcn1cIlxuIFx0ZWxpZiBbWyBcIiR7YWN0aW9ufVwiID09IFwiY2xlYW51cFwiIF1dOyB0aGVuXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3ZtdGVzdC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi92bXRlc3Quc2hcbmluZGV4IDZhM2QwMjZkNzZiZDYuLmU3ZTBiNDE5YTBiODcgMTAwNzU1XG4tLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdm10ZXN0LnNoXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvdm10ZXN0LnNoXG5AQCAtMTA3LDYgKzEwNywxNCBAQCBPcHRpb25zOlxuIFx0LXMpXHRcdEluc3RlYWQgb2YgcG93ZXJpbmcgb2ZmIHRoZSBWTSwgc3RhcnQgYW4gaW50ZXJhY3RpdmVcbiBcdFx0XHRzaGVsbC4gSWYgXHUwMDNjY29tbWFuZFx1MDAzZSBpcyBzcGVjaWZpZWQsIHRoZSBzaGVsbCBydW5zIGFmdGVyXG4gXHRcdFx0dGhlIGNvbW1hbmQgZmluaXNoZXMgZXhlY3V0aW5nXG4rXG4rRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuK1xuK1x0S0VSTkVMX0NNRExJTkVfRVhUUkFcbitcdFx0XHRFeHRyYSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRoZSBndWVzdCBrZXJuZWwgY29tbWFuZFxuK1x0XHRcdGxpbmUsIGZvciB0ZXN0cyB0aGF0IG5lZWQgYSBib290LXRpbWUgc2V0dGluZy4gZS5nOlxuK1xuK1x0ICBLRVJORUxfQ01ETElORV9FWFRSQT1cImJwZi5rZXlyaW5nX3Vuc2VhbGVkPTFcIiAkMCAtLSAuL3Rlc3RfcHJvZ3MgLXQgc2lnbmVkX2xvYWRlclxuIEVPRlxuIH1cbiBcbkBAIC0yODYsNiArMjk0LDEyIEBAIEVPRlxuIFx0XHRRRU1VX0ZMQUdTPShcIiR7SE9TVF9GTEFHU1tAXX1cIilcbiBcdGZpXG4gXG4rXHRsb2NhbCBrZXJuZWxfY21kbGluZT1cInJvb3Q9L2Rldi92ZGEgcncgY29uc29sZT0ke1FFTVVfQ09OU09MRX1cIlxuK1xuK1x0aWYgW1sgLW4gXCIke0tFUk5FTF9DTURMSU5FX0VYVFJBOi19XCIgXV07IHRoZW5cbitcdFx0a2VybmVsX2NtZGxpbmUrPVwiICR7S0VSTkVMX0NNRExJTkVfRVhUUkF9XCJcbitcdGZpXG4rXG4gXHQke1FFTVVfQklOQVJZfSBcXFxuIFx0XHQtbm9kZWZhdWx0cyBcXFxuIFx0XHQtZGlzcGxheSBub25lIFxcXG5AQCAtMjk0LDcgKzMwOCw3IEBAIEVPRlxuIFx0XHQtbSA0RyBcXFxuIFx0XHQtZHJpdmUgZmlsZT1cIiR7cm9vdGZzX2ltZ31cIixmb3JtYXQ9cmF3LGluZGV4PTEsbWVkaWE9ZGlzayxpZj12aXJ0aW8sY2FjaGU9bm9uZSBcXFxuIFx0XHQta2VybmVsIFwiJHtrZXJuZWxfYnppbWFnZX1cIiBcXFxuLVx0XHQtYXBwZW5kIFwicm9vdD0vZGV2L3ZkYSBydyBjb25zb2xlPSR7UUVNVV9DT05TT0xFfVwiXG4rXHRcdC1hcHBlbmQgXCIke2tlcm5lbF9jbWRsaW5lfVwiXG4gfVxuIFxuIGNvcHlfbG9ncygpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNDo1Njo0NS40MzQ4NTE4NDVaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDQ1NTgwNjkwNTUyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEZ1enppbmcgU2Vzc2lvbiBBc3Nlc3NtZW50IGZvciBCUEYgS2V5cmluZyBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgd2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBzZXJpZXMgd2FycmFudHMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLiBUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2V5cmluZyAoYC5icGZgKSBhbmQgYSBrZXJuZWwgcGFyYW1ldGVyLCBgYnBmLmtleXJpbmdfdW5zZWFsZWQ9MWAuIE15IHByaW1hcnkgY29uY2VybiBpcyBpZiB0aGlzIHBhdGNoIG9wZW5zIHVwIGFueSBuZXcgbWVtb3J5IHNhZmV0eSB2dWxuZXJhYmlsaXRpZXMuIFNwZWNpZmljYWxseSwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaWYgdGhpcyBpbnRyb2R1Y2VzIG5ldyB1c2VyLXNwYWNlIGludGVyYWN0aW9ucyBvciBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBsZWFkIHRvIG1lbW9yeSBjb3JydXB0aW9uLlxuXG5Mb29raW5nIGF0IHRoZSBjaGFuZ2VzLCBlc3BlY2lhbGx5IGluIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgLCB0aGUgY29yZSBtb2RpZmljYXRpb24gc2VlbXMgdG8gcmV2b2x2ZSBhcm91bmQgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBhZ2FpbnN0IHRoaXMgbmV3IGtleXJpbmcuIFRoZSBjb2RlIGNoZWNrcyBgYXR0ci1cdTAwM2VzaWduYXR1cmVfc2l6ZWAgYW5kIGxvb2tzIHVwIGtleXMgdXNpbmcgYGJwZl9sb29rdXBfc3lzdGVtX2tleWAgb3IgYGJwZl9sb29rdXBfdXNlcl9rZXlgLCBkZXBlbmRpbmcgb24gdGhlIGBrZXlyaW5nX2lkYC4gVGhlcmUncyBhIG5ldyBjaGVjayBmb3IgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgIHdoaWNoIGNhbGxzIGBicGZfbG9va3VwX2tleXJpbmdgLlxuXG5Ob3csIHRoZSBsaW5lIGBia2V5ID0ga21hbGxvY19vYmooKmJrZXkpO2AgaW4gYGJwZl9sb29rdXBfa2V5cmluZ2AgY2F1Z2h0IG15IGV5ZS4gVGhlIGBrbWFsbG9jX29iamAgc2VlbXMgdW51c3VhbCwgbm90IGEgc3RhbmRhcmQga2VybmVsIGZ1bmN0aW9uLiBNeSBmaXJzdCB0aG91Z2h0IHdhcyB0aGlzIHNlZW1zIGxpa2Ugc29tZXRoaW5nIGN1c3RvbS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGlzLlxuXG5MZXQncyBzZWUuIFRoaXMgbG9va3MgbGlrZSBga21hbGxvY19vYmooKmJrZXkpYCB3aGljaCBkb2Vzbid0IHNlZW0gY29ycmVjdC4gTGV0IG1lIGNoZWNrIHRoZSBpbmNsdWRlIGZpbGVzIG9yIG90aGVyIGtlcm5lbCBmaWxlcy4gV2FpdCwgbGV0IG1lIGp1c3QgY2hlY2suIE9oIHdhaXQsIGBrbWFsbG9jX29iamAgaXMgbm90IGluIHRoZSBwYXRjaCBpdHNlbGYuIFRoZSBkaWZmIGxvb2tzIGxpa2UgaXQncyBzYXlpbmcgYGttYWxsb2Nfb2JqYC4gSSdtIGdvaW5nIHRvIHNlYXJjaCBmb3IgYGttYWxsb2Nfb2JqYC4gTGV0J3MgY29uZmlybSBpdCdzIG5vdCBhIHR5cG8uIE9oIHdhaXQsIEkgc2VlIGl0J3MgcmlnaHQgaW4gdGhlIGNvZGUuIExldCdzIG1ha2Ugc3VyZSBpdCdzIG5vdCBhIHR5cG8uIExldCdzIHNlZS4uLiBJJ2xsIGNoZWNrIGBpbmNsdWRlL2xpbnV4L3NsYWIuaGAgb3IgYGtlcm5lbC9icGYva2V5cy5jYC4gQWxyaWdodCwgbGV0IG1lIHVzZSB0aGUgZ3JlcHBlciB0b29sIHRvIHNlYXJjaCBmb3IgYGttYWxsb2Nfb2JqYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjI3NDYsIk91dHB1dFRva2VucyI6MTgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo5NTcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNTowNDoxMS4wMTU1NDY1MDdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2NDYxNjYzNDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia21hbGxvY19vYmpcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiXFxuRnVsbCBvdXRwdXQgaXMgdG9vIGxvbmcsIHNob3dpbmcgNTAwIG91dCBvZiAxNTU2MiBsaW5lcy5cXG5Vc2UgbW9yZSBwcmVjaXNlIGV4cHJlc3Npb24gaWYgcG9zc2libGUuXFxuXFxuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0PTIwMz1ub24tXFxcXCBgYE5VTExgYCwgbG9ja2xlc3NseSBhY2Nlc3NpbmcgdGhlIGBgLVxcdTAwM2VhYGAgYW5kIGBgLVxcdTAwM2ViYGAgZmllbGRzLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0LTIwOC0gICAgICAgMiB7XFxuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0OjIwOTogICAgICAgMyAgIHAgPSBrbWFsbG9jX29iaigqcCk7XFxuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0LTIxMC0gICAgICAgNCAgIGlmICghcClcXG4tLVxcbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdD0yMjU9dGhlaXIgcmlnaHRzIHRvIHJlb3JkZXIgdGhpcyBjb2RlIGFzIGZvbGxvd3M6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3QtMjMwLSAgICAgICAyIHtcXG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3Q6MjMxOiAgICAgICAzICAgcCA9IGttYWxsb2Nfb2JqKCpwKTtcXG5Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5yc3QtMjMyLSAgICAgICA0ICAgaWYgKCFwKVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMucnN0PTI2MT1zaG93cyBhbiBleGFtcGxlIG9mIGluc2VydGlvbjpcXG4tLVxcbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdC0yNjYtICAgICAgIDIge1xcbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdDoyNjc6ICAgICAgIDMgICBwID0ga21hbGxvY19vYmooKnApO1xcbkRvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLnJzdC0yNjgtICAgICAgIDQgICBpZiAoIXApXFxuLS1cXG5Eb2N1bWVudGF0aW9uL1JDVS9saXN0UkNVLnJzdD0yNjc9VGhlIFJDVSB2ZXJzaW9uIG9mIGF1ZGl0X3VwZF9ydWxlKCkgaXMgYXMgZm9sbG93czo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL1JDVS9saXN0UkNVLnJzdC0yNzgtXFx0XFx0XFx0aWYgKCFhdWRpdF9jb21wYXJlX3J1bGUocnVsZSwgXFx1MDAyNmUtXFx1MDAzZXJ1bGUpKSB7XFxuRG9jdW1lbnRhdGlvbi9SQ1UvbGlzdFJDVS5yc3Q6Mjc5OlxcdFxcdFxcdFxcdG5lID0ga21hbGxvY19vYmooKmVudHJ5LCBHRlBfQVRPTUlDKTtcXG5Eb2N1bWVudGF0aW9uL1JDVS9saXN0UkNVLnJzdC0yODAtXFx0XFx0XFx0XFx0aWYgKG5lID09IE5VTEwpXFxuLS1cXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0PTQ0MT11c2VzIG9mIFJDVSBtYXkgYmUgZm91bmQgaW4gbGlzdFJDVS5yc3QgYW5kIE5NSS1SQ1UucnN0Llxcbi0tXFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC00NzAtXFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdDo0NzE6XFx0XFx0bmV3X2ZwID0ga21hbGxvY19vYmooKm5ld19mcCk7XFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC00NzItXFx0XFx0c3Bpbl9sb2NrKFxcdTAwMjZmb29fbXV0ZXgpO1xcbi0tXFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdD01NTM9VGhlIGZvb191cGRhdGVfYSgpIGZ1bmN0aW9uIG1pZ2h0IHRoZW4gYmUgd3JpdHRlbiBhcyBmb2xsb3dzOjpcXG4tLVxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtNTcyLVxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q6NTczOlxcdFxcdG5ld19mcCA9IGttYWxsb2Nfb2JqKCpuZXdfZnApO1xcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtNTc0LVxcdFxcdHNwaW5fbG9jayhcXHUwMDI2Zm9vX211dGV4KTtcXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkva3JlZi5yc3Q9Mzk9a3JlZl9pbml0IGFzIHNvOjpcXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkva3JlZi5yc3QtNDItXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9rcmVmLnJzdDo0MzogICAgIGRhdGEgPSBrbWFsbG9jX29iaigqZGF0YSk7XFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9rcmVmLnJzdC00NC0gICAgIGlmICghZGF0YSlcXG4tLVxcbkRvY3VtZW50YXRpb24vY29yZS1hcGkva3JlZi5yc3Q9ODE9dGhyZWFkIHRvIHByb2Nlc3M6Olxcbi0tXFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9rcmVmLnJzdC0xMDItXFx0c3RydWN0IHRhc2tfc3RydWN0ICp0YXNrO1xcbkRvY3VtZW50YXRpb24vY29yZS1hcGkva3JlZi5yc3Q6MTAzOlxcdGRhdGEgPSBrbWFsbG9jX29iaigqZGF0YSk7XFxuRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9rcmVmLnJzdC0xMDQtXFx0aWYgKCFkYXRhKVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdD0zODM9dG8gcHJvdGVjdCB0aGUgY2FjaGUgYW5kIGFsbCB0aGUgb2JqZWN0cyB3aXRoaW4gaXQuIEhlcmUncyB0aGUgY29kZTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0LTQ0NC1cXG5Eb2N1bWVudGF0aW9uL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0OjQ0NTogICAgICAgICAgICBpZiAoKG9iaiA9IGttYWxsb2Nfb2JqKCpvYmopKSA9PSBOVUxMKVxcbkRvY3VtZW50YXRpb24va2VybmVsLWhhY2tpbmcvbG9ja2luZy5yc3QtNDQ2LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0PTQ5OT13aGljaCBhcmUgdGFrZW4gYXdheSwgYW5kIHRoZSBgYCtgYCBhcmUgbGluZXMgd2hpY2ggYXJlIGFkZGVkLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC01MTktXFxuRG9jdW1lbnRhdGlvbi9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdDo1MjA6ICAgICAgICAgICAgIGlmICgob2JqID0ga21hbGxvY19vYmooKm9iaikpID09IE5VTEwpXFxuRG9jdW1lbnRhdGlvbi9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC01MjEtICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07XFxuLS1cXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3R5cGVzLnJzdD00OTg9d29ya3MgcGVyZmVjdGx5OjpcXG4tLVxcbkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2NrdHlwZXMucnN0LTUwMC0gIHJhd19zcGluX2xvY2soXFx1MDAyNmxvY2spO1xcbkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2NrdHlwZXMucnN0OjUwMTogIHAgPSBrbWFsbG9jX29iaigqcCwgR0ZQX0FUT01JQyk7XFxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2t0eXBlcy5yc3QtNTAyLVxcbi0tXFxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2t0eXBlcy5yc3Q9NTA3PXByZWVtcHRpb24gb24gUFJFRU1QVF9SVCBrZXJuZWxzOjpcXG4tLVxcbkRvY3VtZW50YXRpb24vbG9ja2luZy9sb2NrdHlwZXMucnN0LTUwOS0gIHNwaW5fbG9jayhcXHUwMDI2bG9jayk7XFxuRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2t0eXBlcy5yc3Q6NTEwOiAgcCA9IGttYWxsb2Nfb2JqKCpwLCBHRlBfQVRPTUlDKTtcXG5Eb2N1bWVudGF0aW9uL2xvY2tpbmcvbG9ja3R5cGVzLnJzdC01MTEtXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdD05Mzg9VGhlIGtlcm5lbCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGdlbmVyYWwgcHVycG9zZSBtZW1vcnkgYWxsb2NhdG9yczpcXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdDo5Mzk6a21hbGxvYygpLCBremFsbG9jKCksIGttYWxsb2Nfb2JqcygpLCBremFsbG9jX29ianMoKSwgdm1hbGxvYygpLCBhbmRcXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC05NDAtdnphbGxvYygpLiAgUGxlYXNlIHJlZmVyIHRvIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvblxcbi0tXFxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q9OTQ0PVRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgcGFzc2luZyBhIHNpemUgb2YgYSBzdHJ1Y3QgaXMgdGhlIGZvbGxvd2luZzpcXG4tLVxcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0LTk0Ny1cXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdDo5NDg6XFx0cCA9IGttYWxsb2Nfb2JqKCpwLCAuLi4pO1xcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0LTk0OS1cXG4tLVxcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTk1OD1UaGUgcHJlZmVycmVkIGZvcm0gZm9yIGFsbG9jYXRpbmcgYW4gYXJyYXkgaXMgdGhlIGZvbGxvd2luZzpcXG4tLVxcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0LTk2MS1cXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdDo5NjI6XFx0cCA9IGttYWxsb2Nfb2JqcygqcCwgbiwgLi4uKTtcXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC05NjMtXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3Q9Mzg2PW1heSBoZWxwIHdpdGggYWxpZ25tZW50LCB3cmFwLWFyb3VuZCwgb3IgYWRkaXRpb25hbCBoYXJkZW5pbmcuIFRoZVxcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdDozODc6a21hbGxvY19vYmooKS1mYW1pbHkgb2YgbWFjcm9zIHByb3ZpZGUgdGhpcyBpbnRyb3NwZWN0aW9uLCB3aGljaCBjYW4gYmVcXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3QtMzg4LXVzZWQgZm9yIHRoZSBjb21tb24gY29kZSBwYXR0ZXJucyBmb3Igc2luZ2xlLCBhcnJheSwgYW5kIGZsZXhpYmxlIG9iamVjdFxcbi0tXFxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2RlcHJlY2F0ZWQucnN0PTM5OD1iZWNvbWUsIHJlc3BlY3RpdmVseTo6XFxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2RlcHJlY2F0ZWQucnN0LTM5OS1cXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3Q6NDAwOlxcdHB0ciA9IGttYWxsb2Nfb2JqKCpwdHIgWywgZ2ZwXSApO1xcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdC00MDEtXFx0cHRyID0ga3phbGxvY19vYmooKnB0ciBbLCBnZnBdICk7XFxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2RlcHJlY2F0ZWQucnN0OjQwMjpcXHRwdHIgPSBrbWFsbG9jX29ianMoKnB0ciwgY291bnQgWywgZ2ZwXSApO1xcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdC00MDMtXFx0cHRyID0ga3phbGxvY19vYmpzKCpwdHIsIGNvdW50IFssIGdmcF0gKTtcXG5Eb2N1bWVudGF0aW9uL3Byb2Nlc3MvZGVwcmVjYXRlZC5yc3QtNDA0LVxcdHB0ciA9IGttYWxsb2NfZmxleCgqcHRyLCBmbGV4X21lbWJlciwgY291bnQgWywgZ2ZwXSApO1xcbkRvY3VtZW50YXRpb24vcHJvY2Vzcy9kZXByZWNhdGVkLnJzdDo0MDU6XFx0X19hdXRvX3R5cGUgcHRyID0ga21hbGxvY19vYmooc3RydWN0IGZvbyBbLCBnZnBdICk7XFxuRG9jdW1lbnRhdGlvbi9wcm9jZXNzL2RlcHJlY2F0ZWQucnN0LTQwNi1cXG4tLVxcbkRvY3VtZW50YXRpb24vc291bmQva2VybmVsLWFwaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnJzdD0xNzM0PWNhbGxiYWNrOjpcXG4tLVxcbkRvY3VtZW50YXRpb24vc291bmQva2VybmVsLWFwaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnJzdC0xNzM5LSAgICAgICAgICAuLi4uXFxuRG9jdW1lbnRhdGlvbi9zb3VuZC9rZXJuZWwtYXBpL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIucnN0OjE3NDA6ICAgICAgICAgIGRhdGEgPSBrbWFsbG9jX29iaigqZGF0YSk7XFxuRG9jdW1lbnRhdGlvbi9zb3VuZC9rZXJuZWwtYXBpL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIucnN0LTE3NDEtICAgICAgICAgIHN1YnN0cmVhbS1cXHUwMDNlcnVudGltZS1cXHUwMDNlcHJpdmF0ZV9kYXRhID0gZGF0YTtcXG4tLVxcbkRvY3VtZW50YXRpb24vc291bmQva2VybmVsLWFwaS93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnJzdD0zMzAyPWRlc3RydWN0b3IgZnVuY3Rpb24gaXMgc2V0IGluIHRoZSBgYHByaXZhdGVfZnJlZWBgIGZpZWxkOjpcXG5Eb2N1bWVudGF0aW9uL3NvdW5kL2tlcm5lbC1hcGkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci5yc3QtMzMwMy1cXG5Eb2N1bWVudGF0aW9uL3NvdW5kL2tlcm5lbC1hcGkvd3JpdGluZy1hbi1hbHNhLWRyaXZlci5yc3Q6MzMwNDogIHN0cnVjdCBteWRhdGEgKnAgPSBrbWFsbG9jX29iaigqcCk7XFxuRG9jdW1lbnRhdGlvbi9zb3VuZC9rZXJuZWwtYXBpL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIucnN0LTMzMDUtICBody1cXHUwMDNlcHJpdmF0ZV9kYXRhID0gcDtcXG4tLVxcbkRvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5LnJzdD0yNDI9QW5kIFNPQy1zcGVjaWZpYyB1dGlsaXR5IGNvZGUgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeS5yc3QtMjUxLVxcbkRvY3VtZW50YXRpb24vc3BpL3NwaS1zdW1tYXJ5LnJzdDoyNTI6XFx0XFx0cGRhdGEyID0ga21hbGxvY19vYmooKnBkYXRhMik7XFxuRG9jdW1lbnRhdGlvbi9zcGkvc3BpLXN1bW1hcnkucnN0LTI1My1cXHRcXHQqcGRhdGEyID0gcGRhdGE7XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdD00MDM9ZSB0dXR0aSBnbGkgb2dnZXR0aSBjaGUgY29udGllbmUuIEVjY28gaWwgY29kaWNlOjpcXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0LTQ2NC1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdDo0NjU6ICAgICAgICAgICAgaWYgKChvYmogPSBrbWFsbG9jX29iaigqb2JqKSkgPT0gTlVMTClcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC00NjYtICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTtcXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0PTUxOT1zb25vIHF1ZWxsZSByaW1vc3NlLCBtZW50cmUgcXVlbGxlIGBgK2BgIHNvbm8gcXVlbGxlIGFnZ2l1bnRlLlxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQva2VybmVsLWhhY2tpbmcvbG9ja2luZy5yc3QtNTM5LVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2tlcm5lbC1oYWNraW5nL2xvY2tpbmcucnN0OjU0MDogICAgICAgICAgICAgaWYgKChvYmogPSBrbWFsbG9jX29iaigqb2JqKSkgPT0gTlVMTClcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9rZXJuZWwtaGFja2luZy9sb2NraW5nLnJzdC01NDEtICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2t0eXBlcy5yc3Q9NDg4PW1lbW9yaWEuIFN1IHVuIGtlcm5lbCBub24tUFJFRU1QVF9SVCBpbCBzZWd1ZW50ZSBjb2RpY2UgZnVuemlvbmEgcGVyZmV0dGFtZW50ZTo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2t0eXBlcy5yc3QtNDkwLSAgcmF3X3NwaW5fbG9jayhcXHUwMDI2bG9jayk7XFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2NrdHlwZXMucnN0OjQ5MTogIHAgPSBrbWFsbG9jX29iaigqcCwgR0ZQX0FUT01JQyk7XFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvbG9ja2luZy9sb2NrdHlwZXMucnN0LTQ5Mi1cXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL2xvY2tpbmcvbG9ja3R5cGVzLnJzdD00OTc9UFJFRU1QVF9SVDo6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2t0eXBlcy5yc3QtNDk5LSAgc3Bpbl9sb2NrKFxcdTAwMjZsb2NrKTtcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2t0eXBlcy5yc3Q6NTAwOiAgcCA9IGttYWxsb2Nfb2JqKCpwLCBHRlBfQVRPTUlDKTtcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9sb2NraW5nL2xvY2t0eXBlcy5yc3QtNTAxLVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvaXRfSVQvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTk0Mj1JbCBtb2RvIHByZWZlcml0byBwZXIgcGFzc2FyZSBsYSBkaW1lbnNpb25lIGRpIHVuYSBzdHJ1dHR1cmEgw6ggaWwgc2VndWVudGU6XFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9pdF9JVC9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtOTQ1LVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdDo5NDY6XFx0cCA9IGttYWxsb2Nfb2JqKCpwLCAuLi4pO1xcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL2l0X0lUL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC05NDctXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9zcF9TUC9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q9OTU0PUxhIGZvcm1hIHByZWZlcmlkYSBwYXJhIHBhc2FyIGVsIHRhbWHDsW8gZGUgdW5hIGVzdHJ1Y3R1cmEgZXMgbGEgc2lndWllbnRlOlxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvc3BfU1AvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0LTk1Ny1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9zcF9TUC9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q6OTU4OlxcdHAgPSBrbWFsbG9jX29iaigqcCwgLi4uKTtcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy9zcF9TUC9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtOTU5LVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3Q9NDY9a3JlZuWPr+S7peWHuueOsOWcqOaVsOaNrue7k+aehOS9k+S4reeahOS7u+S9leWcsOaWueOAglxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3QtNTQtXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3Q6NTU6ICAgICBkYXRhID0ga21hbGxvY19vYmooKmRhdGEpO1xcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL2tyZWYucnN0LTU2LSAgICAgaWYgKCFkYXRhKVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3Q9NjI9S3JlZuinhOWImVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vY29yZS1hcGkva3JlZi5yc3QtMTA4LVxcdHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaztcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9rcmVmLnJzdDoxMDk6XFx0ZGF0YSA9IGttYWxsb2Nfb2JqKCpkYXRhKTtcXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9rcmVmLnJzdC0xMTAtXFx0aWYgKCFkYXRhKVxcbi0tXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfQ04vcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0PTgxMD1Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9jb3JlLWFwaS9tZW1vcnktYWxsb2NhdGlvbi5yc3Qg44CCXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9DTi9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3QtODE1LVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdDo4MTY6XFx0cCA9IGttYWxsb2Nfb2JqKCpwLCAuLi4pO1xcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC04MTctXFxuLS1cXG5Eb2N1bWVudGF0aW9uL3RyYW5zbGF0aW9ucy96aF9UVy9wcm9jZXNzL2NvZGluZy1zdHlsZS5yc3Q9ODI0PURvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX0NOL2NvcmUtYXBpL21lbW9yeS1hbGxvY2F0aW9uLnJzdCDjgIJcXG4tLVxcbkRvY3VtZW50YXRpb24vdHJhbnNsYXRpb25zL3poX1RXL3Byb2Nlc3MvY29kaW5nLXN0eWxlLnJzdC04MjktXFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfVFcvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0OjgzMDpcXHRwID0ga21hbGxvY19vYmooKnAsIC4uLik7XFxuRG9jdW1lbnRhdGlvbi90cmFuc2xhdGlvbnMvemhfVFcvcHJvY2Vzcy9jb2Rpbmctc3R5bGUucnN0LTgzMS1cXG4tLVxcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmM9ODU3PW1hcnZlbF9hZ3Bfc2V0dXAoYWxwaGFfYWdwX2luZm8gKmFncClcXG4tLVxcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmMtODYzLVxcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmM6ODY0OlxcdGFwZXIgPSBrbWFsbG9jX29iaigqYXBlcik7XFxuYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9tYXJ2ZWwuYy04NjUtXFx0aWYgKGFwZXIgPT0gTlVMTCkgcmV0dXJuIC1FTk9NRU07XFxuLS1cXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jPTEwMTk9bWFydmVsX2FncF9pbmZvKHZvaWQpXFxuLS1cXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX21hcnZlbC5jLTEwNjEtXFx0ICovXFxuYXJjaC9hbHBoYS9rZXJuZWwvY29yZV9tYXJ2ZWwuYzoxMDYyOlxcdGFncCA9IGttYWxsb2Nfb2JqKCphZ3ApO1xcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfbWFydmVsLmMtMTA2My1cXHRpZiAoIWFncClcXG4tLVxcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYz01OTA9dGl0YW5fYWdwX3NldHVwKGFscGhhX2FncF9pbmZvICphZ3ApXFxuLS1cXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmMtNTk2LVxcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYzo1OTc6XFx0YXBlciA9IGttYWxsb2Nfb2JqKHN0cnVjdCB0aXRhbl9hZ3BfYXBlcnR1cmUpO1xcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYy01OTgtXFx0aWYgKGFwZXIgPT0gTlVMTClcXG4tLVxcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYz03MzE9dGl0YW5fYWdwX2luZm8odm9pZClcXG4tLVxcbmFyY2gvYWxwaGEva2VybmVsL2NvcmVfdGl0YW4uYy03NjItXFx0ICovXFxuYXJjaC9hbHBoYS9rZXJuZWwvY29yZV90aXRhbi5jOjc2MzpcXHRhZ3AgPSBrbWFsbG9jX29iaigqYWdwKTtcXG5hcmNoL2FscGhhL2tlcm5lbC9jb3JlX3RpdGFuLmMtNzY0LVxcdGlmICghYWdwKVxcbi0tXFxuYXJjaC9hbHBoYS9rZXJuZWwvbW9kdWxlLmM9Mjk9cHJvY2Vzc19yZWxvY19mb3JfZ290KEVsZjY0X1JlbGEgKnJlbGEsXFxuLS1cXG5hcmNoL2FscGhhL2tlcm5lbC9tb2R1bGUuYy00OC1cXG5hcmNoL2FscGhhL2tlcm5lbC9tb2R1bGUuYzo0OTpcXHRnID0ga21hbGxvY19vYmooKmcpO1xcbmFyY2gvYWxwaGEva2VybmVsL21vZHVsZS5jLTUwLVxcdGctXFx1MDAzZW5leHQgPSBjaGFpbnNbcl9zeW1dLm5leHQ7XFxuLS1cXG5hcmNoL2FscGhhL2tlcm5lbC9wY2kuYz0yMTE9c3RhdGljIHZvaWQgcGRldl9zYXZlX3NybV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldilcXG4tLVxcbmFyY2gvYWxwaGEva2VybmVsL3BjaS5jLTIyMy1cXG5hcmNoL2FscGhhL2tlcm5lbC9wY2kuYzoyMjQ6XFx0dG1wID0ga21hbGxvY19vYmooKnRtcCk7XFxuYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMtMjI1LVxcdGlmICghdG1wKSB7XFxuLS1cXG5hcmNoL2FyYy9rZXJuZWwvdW53aW5kLmM9MzU5PXZvaWQgKnVud2luZF9hZGRfdGFibGUoc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBjb25zdCB2b2lkICp0YWJsZV9zdGFydCxcXG4tLVxcbmFyY2gvYXJjL2tlcm5lbC91bndpbmQuYy0zNjgtXFxuYXJjaC9hcmMva2VybmVsL3Vud2luZC5jOjM2OTpcXHR0YWJsZSA9IGttYWxsb2Nfb2JqKCp0YWJsZSk7XFxuYXJjaC9hcmMva2VybmVsL3Vud2luZC5jLTM3MC1cXHRpZiAoIXRhYmxlKVxcbi0tXFxuYXJjaC9hcm0vY29tbW9uL2xvY29tby5jPTI3ND1zdGF0aWMgaW50IGxvY29tb19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKVxcbi0tXFxuYXJjaC9hcm0vY29tbW9uL2xvY29tby5jLTI3OS1cXG5hcmNoL2FybS9jb21tb24vbG9jb21vLmM6MjgwOlxcdHNhdmUgPSBrbWFsbG9jX29iaihzdHJ1Y3QgbG9jb21vX3NhdmVfZGF0YSk7XFxuYXJjaC9hcm0vY29tbW9uL2xvY29tby5jLTI4MS1cXHRpZiAoIXNhdmUpXFxuLS1cXG5hcmNoL2FybS9jb21tb24vc2ExMTExLmM9OTY0PXN0YXRpYyBpbnQgc2ExMTExX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KVxcbi0tXFxuYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jLTk3MS1cXG5hcmNoL2FybS9jb21tb24vc2ExMTExLmM6OTcyOlxcdHNhdmUgPSBrbWFsbG9jX29iaihzdHJ1Y3Qgc2ExMTExX3NhdmVfZGF0YSk7XFxuYXJjaC9hcm0vY29tbW9uL3NhMTExMS5jLTk3My1cXHRpZiAoIXNhdmUpXFxuLS1cXG5hcmNoL2FybS9rZXJuZWwvdW53aW5kLmM9NTcyPXN0cnVjdCB1bndpbmRfdGFibGUgKnVud2luZF90YWJsZV9hZGQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLFxcbi0tXFxuYXJjaC9hcm0va2VybmVsL3Vud2luZC5jLTU3Ni1cXHR1bnNpZ25lZCBsb25nIGZsYWdzO1xcbmFyY2gvYXJtL2tlcm5lbC91bndpbmQuYzo1Nzc6XFx0c3RydWN0IHVud2luZF90YWJsZSAqdGFiID0ga21hbGxvY19vYmooKnRhYik7XFxuYXJjaC9hcm0va2VybmVsL3Vud2luZC5jLTU3OC1cXG4tLVxcbmFyY2gvYXJtL21hY2gtb21hcDIvb21hcC1pb21tdS5jPTUzPXN0YXRpYyBzdHJ1Y3QgcG93ZXJkb21haW4gKl9nZXRfcHdyZG0oc3RydWN0IGRldmljZSAqZGV2KVxcbi0tXFxuYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmMtMTAxLVxcbmFyY2gvYXJtL21hY2gtb21hcDIvb21hcC1pb21tdS5jOjEwMjpcXHRlbnRyeSA9IGttYWxsb2Nfb2JqKCplbnRyeSk7XFxuYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLWlvbW11LmMtMTAzLVxcdGlmIChlbnRyeSkge1xcbi0tXFxuYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTM0eHguYz00MDY9c3RhdGljIGludCBfX2luaXQgcHdyZG1zX3NldHVwKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHZvaWQgKnVudXNlZClcXG4tLVxcbmFyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmMtNDEyLVxcbmFyY2gvYXJtL21hY2gtb21hcDIvcG0zNHh4LmM6NDEzOlxcdHB3cnN0ID0ga21hbGxvY19vYmooc3RydWN0IHBvd2VyX3N0YXRlLCBHRlBfQVRPTUlDKTtcXG5hcmNoL2FybS9tYWNoLW9tYXAyL3BtMzR4eC5jLTQxNC1cXHRpZiAoIXB3cnN0KVxcbi0tXFxuYXJjaC9hcm0vbWFjaC1vbWFwMi9wbTQ0eHguYz0xMTM9c3RhdGljIGludCBfX2luaXQgcHdyZG1zX3NldHVwKHN0cnVjdCBwb3dlcmRvbWFpbiAqcHdyZG0sIHZvaWQgKnVudXNlZClcXG4tLVxcbmFyY2gvYXJtL21hY2gtb21hcDIvcG00NHh4LmMtMTM0LVxcbmFyY2gvYXJtL21hY2gtb21hcDIvcG00NHh4LmM6MTM1OlxcdHB3cnN0ID0ga21hbGxvY19vYmooc3RydWN0IHBvd2VyX3N0YXRlLCBHRlBfQVRPTUlDKTtcXG5hcmNoL2FybS9tYWNoLW9tYXAyL3BtNDR4eC5jLTEzNi1cXHRpZiAoIXB3cnN0KVxcbi0tXFxuYXJjaC9hcm0vbW0vcGdkLmMtMTktI2lmZGVmIENPTkZJR19BUk1fTFBBRVxcbmFyY2gvYXJtL21tL3BnZC5jOjIwOiNkZWZpbmUgX3BnZF9hbGxvYyhtbSlcXHRcXHRrbWFsbG9jX29ianMocGdkX3QsIFBUUlNfUEVSX1BHRCwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pXFxuYXJjaC9hcm0vbW0vcGdkLmMtMjEtI2RlZmluZSBfcGdkX2ZyZWUobW0sIHBnZClcXHRrZnJlZShwZ2QpXFxuLS1cXG5hcmNoL2FybS9wcm9iZXMva3Byb2Jlcy90ZXN0LWNvcmUuYz03NjQ9c3RhdGljIGludCBjb3ZlcmFnZV9zdGFydChjb25zdCB1bmlvbiBkZWNvZGVfaXRlbSAqdGFibGUpXFxuYXJjaC9hcm0vcHJvYmVzL2twcm9iZXMvdGVzdC1jb3JlLmMtNzY1LXtcXG5hcmNoL2FybS9wcm9iZXMva3Byb2Jlcy90ZXN0LWNvcmUuYzo3NjY6XFx0Y292ZXJhZ2UuYmFzZSA9IGttYWxsb2Nfb2JqcyhzdHJ1Y3QgY292ZXJhZ2VfZW50cnksXFxuYXJjaC9hcm0vcHJvYmVzL2twcm9iZXMvdGVzdC1jb3JlLmMtNzY3LVxcdFxcdFxcdFxcdCAgICAgTUFYX0NPVkVSQUdFX0VOVFJJRVMpO1xcbi0tXFxuYXJjaC9hcm02NC9rdm0vcG11LWVtdWwuYz03NzQ9dm9pZCBrdm1faG9zdF9wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqcG11KVxcbi0tXFxuYXJjaC9hcm02NC9rdm0vcG11LWVtdWwuYy03ODYtXFxuYXJjaC9hcm02NC9rdm0vcG11LWVtdWwuYzo3ODc6XFx0ZW50cnkgPSBrbWFsbG9jX29iaigqZW50cnkpO1xcbmFyY2gvYXJtNjQva3ZtL3BtdS1lbXVsLmMtNzg4LVxcdGlmICghZW50cnkpXFxuLS1cXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtZGVidWcuYz0xMDI9c3RhdGljIHZvaWQgKnZnaWNfZGVidWdfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcylcXG4tLVxcbmFyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy1kZWJ1Zy5jLTEwNi1cXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtZGVidWcuYzoxMDc6XFx0aXRlciA9IGttYWxsb2Nfb2JqKCppdGVyKTtcXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtZGVidWcuYy0xMDgtXFx0aWYgKCFpdGVyKVxcbi0tXFxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWRlYnVnLmM9MzY0PXN0YXRpYyB2b2lkICp2Z2ljX2l0c19kZWJ1Z19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKVxcbi0tXFxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWRlYnVnLmMtMzc3LVxcbmFyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy1kZWJ1Zy5jOjM3ODpcXHRpdGVyID0ga21hbGxvY19vYmooKml0ZXIpO1xcbmFyY2gvYXJtNjQva3ZtL3ZnaWMvdmdpYy1kZWJ1Zy5jLTM3OS1cXHRpZiAoIWl0ZXIpXFxuLS1cXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtaW5pdC5jPTc0Mz12b2lkIF9faW5pdCB2Z2ljX3NldF9rdm1faW5mbyhjb25zdCBzdHJ1Y3QgZ2ljX2t2bV9pbmZvICppbmZvKVxcbi0tXFxuYXJjaC9hcm02NC9rdm0vdmdpYy92Z2ljLWluaXQuYy03NDUtXFx0QlVHX09OKGdpY19rdm1faW5mbyAhPSBOVUxMKTtcXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtaW5pdC5jOjc0NjpcXHRnaWNfa3ZtX2luZm8gPSBrbWFsbG9jX29iaigqZ2ljX2t2bV9pbmZvKTtcXG5hcmNoL2FybTY0L2t2bS92Z2ljL3ZnaWMtaW5pdC5jLTc0Ny1cXHRpZiAoZ2ljX2t2bV9pbmZvKVxcbi0tXFxuYXJjaC9tNjhrL2VtdS9uZmJsb2NrLmM9OTc9c3RhdGljIGludCBfX2luaXQgbmZoZF9pbml0X29uZShpbnQgaWQsIHUzMiBibG9ja3MsIHUzMiBic2l6ZSlcXG4tLVxcbmFyY2gvbTY4ay9lbXUvbmZibG9jay5jLTExNC1cXG5hcmNoL202OGsvZW11L25mYmxvY2suYzoxMTU6XFx0ZGV2ID0ga21hbGxvY19vYmooc3RydWN0IG5maGRfZGV2aWNlKTtcXG5hcmNoL202OGsvZW11L25mYmxvY2suYy0xMTYtXFx0aWYgKCFkZXYpXFxuLS1cXG5hcmNoL202OGsvbW0va21hcC5jPTEwOD1zdGF0aWMgc3RydWN0IHZtX3N0cnVjdCAqZ2V0X2lvX2FyZWEodW5zaWduZWQgbG9uZyBzaXplKVxcbi0tXFxuYXJjaC9tNjhrL21tL2ttYXAuYy0xMTItXFxuYXJjaC9tNjhrL21tL2ttYXAuYzoxMTM6XFx0YXJlYSA9IGttYWxsb2Nfb2JqKCphcmVhKTtcXG5hcmNoL202OGsvbW0va21hcC5jLTExNC1cXHRpZiAoIWFyZWEpXFxuLS1cXG5hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYz0yNTM9dTMyIGF1MXh4eF9kYmRtYV9jaGFuX2FsbG9jKHUzMiBzcmNpZCwgdTMyIGRlc3RpZCxcXG4tLVxcbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jLTMxMi1cXHRcXHRcXHQgKi9cXG5hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYzozMTM6XFx0XFx0XFx0Y3RwID0ga21hbGxvY19vYmooY2hhbl90YWJfdCwgR0ZQX0FUT01JQyk7XFxuYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmMtMzE0LVxcdFxcdFxcdGNoYW5fdGFiX3B0cltpXSA9IGN0cDtcXG4tLVxcbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jPTM5MT11MzIgYXUxeHh4X2RiZG1hX3JpbmdfYWxsb2ModTMyIGNoYW5pZCwgaW50IGVudHJpZXMpXFxuLS1cXG5hcmNoL21pcHMvYWxjaGVteS9jb21tb24vZGJkbWEuYy00MTQtXFx0ICovXFxuYXJjaC9taXBzL2FsY2hlbXkvY29tbW9uL2RiZG1hLmM6NDE1OlxcdGRlc2NfYmFzZSA9ICh1MzIpIGttYWxsb2Nfb2JqcyhhdTF4X2RkbWFfZGVzY190LCBlbnRyaWVzLFxcbmFyY2gvbWlwcy9hbGNoZW15L2NvbW1vbi9kYmRtYS5jLTQxNi1cXHRcXHRcXHRcXHQgICAgICAgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpO1xcbi0tXFxuYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYz01OT1zdGF0aWMgaW50IGFwcGx5X3JfbWlwc19oaTE2KHN0cnVjdCBtb2R1bGUgKm1lLCB1MzIgKmxvY2F0aW9uLCBFbGZfQWRkciB2LFxcbi0tXFxuYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYy03NC1cXHQgKi9cXG5hcmNoL21pcHMva2VybmVsL21vZHVsZS5jOjc1OlxcdG4gPSBrbWFsbG9jX29iaigqbik7XFxuYXJjaC9taXBzL2tlcm5lbC9tb2R1bGUuYy03Ni1cXHRpZiAoIW4pXFxuLS1cXG5hcmNoL21pcHMva2VybmVsL3ZwZS5jPTMxMT1zdGF0aWMgaW50IGFwcGx5X3JfbWlwc19oaTE2KHN0cnVjdCBtb2R1bGUgKm1lLCB1aW50MzJfdCAqbG9jYXRpb24sXFxuLS1cXG5hcmNoL21pcHMva2VybmVsL3ZwZS5jLTMyMC1cXHQgKi9cXG5hcmNoL21pcHMva2VybmVsL3ZwZS5jOjMyMTpcXHRuID0ga21hbGxvY19vYmooKm4pO1xcbmFyY2gvbWlwcy9rZXJuZWwvdnBlLmMtMzIyLVxcdGlmICghbilcXG4tLVxcbmFyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYz0xODg9cGF0X3F1ZXJ5X21vZHVsZSh1bG9uZyBwY2VsbF9sb2MsIHVsb25nIG1vZF9pbmRleClcXG4tLVxcbmFyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYy0xOTUtXFxuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jOjE5NjpcXHRwYV9wZGNfY2VsbCA9IGttYWxsb2Nfb2JqKCpwYV9wZGNfY2VsbCk7XFxuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jLTE5Ny1cXHRpZiAoIXBhX3BkY19jZWxsKVxcbi0tXFxuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jPTUzMj1hZGRfc3lzdGVtX21hcF9hZGRyZXNzZXMoc3RydWN0IHBhcmlzY19kZXZpY2UgKmRldiwgaW50IG51bV9hZGRycywgXFxuLS1cXG5hcmNoL3BhcmlzYy9rZXJuZWwvaW52ZW50b3J5LmMtNTM4LVxcbmFyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYzo1Mzk6XFx0ZGV2LVxcdTAwM2VhZGRyID0ga21hbGxvY19vYmpzKCpkZXYtXFx1MDAzZWFkZHIsIG51bV9hZGRycyk7XFxuYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jLTU0MC1cXHRpZighZGV2LVxcdTAwM2VhZGRyKSB7XFxuLS1cXG5hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmM9ODE9c3RhdGljIGludCBfX2luaXQgcHJvY2Vzc29yX3Byb2JlKHN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXYpXFxuLS1cXG5hcmNoL3BhcmlzYy9rZXJuZWwvcHJvY2Vzc29yLmMtMTEyLVxcbmFyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYzoxMTM6XFx0XFx0cGFfcGRjX2NlbGwgPSBrbWFsbG9jX29iaigqcGFfcGRjX2NlbGwpO1xcbmFyY2gvcGFyaXNjL2tlcm5lbC9wcm9jZXNzb3IuYy0xMTQtXFx0XFx0aWYgKCFwYV9wZGNfY2VsbClcXG4tLVxcbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYz0xNDk9dW53aW5kX3RhYmxlX2FkZChjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIGJhc2VfYWRkciwgXFxuLS1cXG5hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMtMTU5LVxcbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYzoxNjA6XFx0dGFibGUgPSBrbWFsbG9jX29iaihzdHJ1Y3QgdW53aW5kX3RhYmxlLCBHRlBfVVNFUik7XFxuYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jLTE2MS1cXHRpZiAodGFibGUgPT0gTlVMTClcXG4tLVxcbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYz00MDY9dm9pZCB1bndpbmRfZnJhbWVfaW5pdF9mcm9tX2Jsb2NrZWRfdGFzayhzdHJ1Y3QgdW53aW5kX2ZyYW1lX2luZm8gKmluZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdClcXG4tLVxcbmFyY2gvcGFyaXNjL2tlcm5lbC91bndpbmQuYy00MTAtXFxuYXJjaC9wYXJpc2Mva2VybmVsL3Vud2luZC5jOjQxMTpcXHRyMiA9IGttYWxsb2Nfb2JqKHN0cnVjdCBwdF9yZWdzLCBHRlBfQVRPTUlDKTtcXG5hcmNoL3BhcmlzYy9rZXJuZWwvdW53aW5kLmMtNDEyLVxcdGlmICghcjIpXFxuLS1cXG5hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmM9OTg0PWludCBfX2luaXQgbnZyYW1fc2Nhbl9wYXJ0aXRpb25zKHZvaWQpXFxuLS1cXG5hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMtMTAzMi1cXHRcXHR9XFxuYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jOjEwMzM6XFx0XFx0dG1wX3BhcnQgPSBrbWFsbG9jX29iaigqdG1wX3BhcnQpO1xcbmFyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYy0xMDM0LVxcdFxcdGVyciA9IC1FTk9NRU07XFxuLS1cXG5hcmNoL3Bvd2VycGMva3ZtL2U1MDBfbW11LmM9NzMxPWludCBrdm1fdmNwdV9pb2N0bF9jb25maWdfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSxcXG4tLVxcbmFyY2gvcG93ZXJwYy9rdm0vZTUwMF9tbXUuYy03NzQtXFx0XFx0ICAgIGNmZy1cXHUwMDNlYXJyYXkgLyBQQUdFX1NJWkU7XFxuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jOjc3NTpcXHRwYWdlcyA9IGttYWxsb2Nfb2JqcygqcGFnZXMsIG51bV9wYWdlcyk7XFxuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jLTc3Ni1cXHRpZiAoIXBhZ2VzKVxcbi0tXFxuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jPTg5OD1pbnQga3ZtcHBjX2U1MDBfdGxiX2luaXQoc3RydWN0IGt2bXBwY192Y3B1X2U1MDAgKnZjcHVfZTUwMClcXG4tLVxcbmFyY2gvcG93ZXJwYy9rdm0vZTUwMF9tbXUuYy05MTQtXFxuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jOjkxNTpcXHR2Y3B1X2U1MDAtXFx1MDAzZWd0bGJfYXJjaCA9IGttYWxsb2Nfb2JqcygqdmNwdV9lNTAwLVxcdTAwM2VndGxiX2FyY2gsXFxuYXJjaC9wb3dlcnBjL2t2bS9lNTAwX21tdS5jLTkxNi1cXHRcXHRcXHRcXHRcXHQgICAgS1ZNX0U1MDBfVExCMF9TSVpFICsgS1ZNX0U1MDBfVExCMV9TSVpFKTtcXG4tLVxcbmFyY2gvcG93ZXJwYy9saWIvcmhlYXAuYz00NT1zdGF0aWMgaW50IGdyb3cocmhfaW5mb190ICogaW5mbywgaW50IG1heF9ibG9ja3MpXFxuLS1cXG5hcmNoL3Bvd2VycGMvbGliL3JoZWFwLmMtNTYtXFxuYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jOjU3OlxcdGJsb2NrID0ga21hbGxvY19vYmpzKHJoX2Jsb2NrX3QsIG1heF9ibG9ja3MsIEdGUF9BVE9NSUMpO1xcbmFyY2gvcG93ZXJwYy9saWIvcmhlYXAuYy01OC1cXHRpZiAoYmxvY2sgPT0gTlVMTClcXG4tLVxcbmFyY2gvcG93ZXJwYy9saWIvcmhlYXAuYz0yNTM9cmhfaW5mb190ICpyaF9jcmVhdGUodW5zaWduZWQgaW50IGFsaWdubWVudClcXG4tLVxcbmFyY2gvcG93ZXJwYy9saWIvcmhlYXAuYy0yNjAtXFxuYXJjaC9wb3dlcnBjL2xpYi9yaGVhcC5jOjI2MTpcXHRpbmZvID0ga21hbGxvY19vYmooKmluZm8sIEdGUF9BVE9NSUMpO1xcbmFyY2gvcG93ZXJwYy9saWIvcmhlYXAuYy0yNjItXFx0aWYgKGluZm8gPT0gTlVMTClcXG4tLVxcbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9tbXVfY29udGV4dC5jPTk1PXN0YXRpYyBpbnQgaGFzaF9faW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSlcXG4tLVxcbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9tbXVfY29udGV4dC5jLTk4LVxcbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9tbXVfY29udGV4dC5jOjk5OlxcdG1tLVxcdTAwM2Vjb250ZXh0Lmhhc2hfY29udGV4dCA9IGttYWxsb2Nfb2JqKHN0cnVjdCBoYXNoX21tX2NvbnRleHQpO1xcbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9tbXVfY29udGV4dC5jLTEwMC1cXHRpZiAoIW1tLVxcdTAwM2Vjb250ZXh0Lmhhc2hfY29udGV4dClcXG4tLVxcbmFyY2gvcG93ZXJwYy9tbS9ib29rM3M2NC9tbXVfY29udGV4dC5jLTEyNS1cXHRcXHRpZiAoY3VycmVudC1cXHUwMDNlbW0tXFx1MDAzZWNvbnRleHQuaGFzaF9jb250ZXh0LVxcdTAwM2VzcHQpIHtcXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvbW11X2NvbnRleHQuYzoxMjY6XFx0XFx0XFx0bW0tXFx1MDAzZWNvbnRleHQuaGFzaF9jb250ZXh0LVxcdTAwM2VzcHQgPSBrbWFsbG9jX29iaihzdHJ1Y3Qgc3VicGFnZV9wcm90X3RhYmxlKTtcXG5hcmNoL3Bvd2VycGMvbW0vYm9vazNzNjQvbW11X2NvbnRleHQuYy0xMjctXFx0XFx0XFx0aWYgKCFtbS1cXHUwMDNlY29udGV4dC5oYXNoX2NvbnRleHQtXFx1MDAzZXNwdCkge1xcbi0tXFxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jPTYyMz1zdGF0aWMgaW50IGV2ZW50X3VuaXFfYWRkKHN0cnVjdCByYl9yb290ICpyb290LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmwsXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtNjUwLVxcbmFyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYzo2NTE6XFx0ZGF0YSA9IGttYWxsb2Nfb2JqKCpkYXRhKTtcXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtNjUyLVxcdGlmICghZGF0YSlcXG4tLVxcbmFyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYz03NTU9c3RhdGljIGludCBjcmVhdGVfZXZlbnRzX2Zyb21fY2F0YWxvZyhzdHJ1Y3QgYXR0cmlidXRlICoqKmV2ZW50c18sXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtOTA4LVxcbmFyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYzo5MDk6XFx0ZXZlbnRzID0ga21hbGxvY19vYmpzKCpldmVudHMsIGF0dHJfbWF4ICsgMSk7XFxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jLTkxMC1cXHRpZiAoIWV2ZW50cykge1xcbi0tXFxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jLTkxNC1cXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmM6OTE1OlxcdGV2ZW50X2Rlc2NzID0ga21hbGxvY19vYmpzKCpldmVudF9kZXNjcywgZXZlbnRfaWR4ICsgMSk7XFxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jLTkxNi1cXHRpZiAoIWV2ZW50X2Rlc2NzKSB7XFxuLS1cXG5hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMtOTIwLVxcbmFyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYzo5MjE6XFx0ZXZlbnRfbG9uZ19kZXNjcyA9IGttYWxsb2Nfb2JqcygqZXZlbnRfbG9uZ19kZXNjcywgZXZlbnRfaWR4ICsgMSk7XFxuYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jLTkyMi1cXHRpZiAoIWV2ZW50X2xvbmdfZGVzY3MpIHtcXG4tLVxcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2hzdGFfbXNpLmM9MTIyPXN0YXRpYyBpbnQgaHN0YV9tc2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldilcXG4tLVxcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2hzdGFfbXNpLmMtMTUzLVxcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2hzdGFfbXNpLmM6MTU0OlxcdHBwYzR4eF9oc3RhX21zaS5pcnFfbWFwID0ga21hbGxvY19vYmpzKGludCwgaXJxX2NvdW50KTtcXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9oc3RhX21zaS5jLTE1NS1cXHRpZiAoIXBwYzR4eF9oc3RhX21zaS5pcnFfbWFwKSB7XFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jPTQ0PXN0YXRpYyBpbnQgc3B1ZnNfYXR0cl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLFxcbi0tXFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYy00OS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jOjUwOlxcdGF0dHIgPSBrbWFsbG9jX29iaigqYXR0cik7XFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYy01MS1cXHRpZiAoIWF0dHIpXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYz02Mjg9dm9pZCBxdWV1ZV9ob3RwbHVnX2V2ZW50KHN0cnVjdCBwc2VyaWVzX2hwX2Vycm9ybG9nICpocF9lcnJsb2cpXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYy02MzYtXFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2RscGFyLmM6NjM3OlxcdHdvcmsgPSBrbWFsbG9jX29iaihzdHJ1Y3QgcHNlcmllc19ocF93b3JrLCBHRlBfQVRPTUlDKTtcXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYy02MzgtXFx0aWYgKHdvcmspIHtcXG4tLVxcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYz0xMTk9aW50IGh2Y3NfZ2V0X3BhcnRuZXJfaW5mbyh1aW50MzJfdCB1bml0X2FkZHJlc3MsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjc2VydmVyLmMtMTYyLVxcdFxcdCAqIGh2Y3NfZnJlZV9wYXJ0bmVyX2luZm8oKS4gKi9cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZjc2VydmVyLmM6MTYzOlxcdFxcdG5leHRfcGFydG5lcl9pbmZvID0ga21hbGxvY19vYmooc3RydWN0IGh2Y3NfcGFydG5lcl9pbmZvLFxcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odmNzZXJ2ZXIuYy0xNjQtXFx0XFx0XFx0XFx0XFx0XFx0R0ZQX0FUT01JQyk7XFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhcmNmZy5jPTE0ND1zdGF0aWMgdm9pZCBzaG93X2dwY2lfZGF0YShzdHJ1Y3Qgc2VxX2ZpbGUgKm0pXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhcmNmZy5jLTE0OS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhcmNmZy5jOjE1MDpcXHRidWYgPSBrbWFsbG9jX29iaigqYnVmKTtcXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhcmNmZy5jLTE1MS1cXHRpZiAoYnVmID09IE5VTEwpXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbXNpLmM9NDM1PXN0YXRpYyBpbnQgcHNlcmllc19tc2lfb3BzX3ByZXBhcmUoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2LFxcbi0tXFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jLTQ0My1cXHRzdHJ1Y3QgcHNlcmllc19tc2lfZGV2aWNlICpwc2VyaWVzX2RldiBfX2ZyZWUoa2ZyZWUpXFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jOjQ0NDpcXHRcXHQ9IGttYWxsb2Nfb2JqKCpwc2VyaWVzX2Rldik7XFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jLTQ0NS1cXHRpZiAoIXBzZXJpZXNfZGV2KVxcbi0tXFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jPTEyMD1zdGF0aWMgaW50IHBzZXJpZXNfcGNpX3NyaW92X2VuYWJsZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTE2IG51bV92ZnMpXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMtMTQzLVxcdHBkbiA9IHBjaV9nZXRfcGRuKHBkZXYpO1xcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYzoxNDQ6XFx0cGRuLVxcdTAwM2VwZV9udW1fbWFwID0ga21hbGxvY19vYmpzKCpwZG4tXFx1MDAzZXBlX251bV9tYXAsIG51bV92ZnMpO1xcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYy0xNDUtXFx0aWYgKCFwZG4tXFx1MDAzZXBlX251bV9tYXApXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmFzLmM9MTA3Nj1zdGF0aWMgaW50IF9faW5pdCBwc2VyaWVzX3Zhc19pbml0KHZvaWQpXFxuLS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmFzLmMtMTA4OS1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmFzLmM6MTA5MDpcXHRodl9jYXBzID0ga21hbGxvY19vYmooKmh2X2NhcHMpO1xcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy92YXMuYy0xMDkxLVxcdGlmICghaHZfY2FwcylcXG4tLVxcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy92aW8uYz03MDU9c3RhdGljIGludCB2aW9fY21vX2J1c19wcm9iZShzdHJ1Y3QgdmlvX2RldiAqdmlvZGV2KVxcbi0tXFxuYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Zpby5jLTc0Ny1cXG5hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvdmlvLmM6NzQ4OlxcdFxcdGRldl9lbnQgPSBrbWFsbG9jX29iaihzdHJ1Y3QgdmlvX2Ntb19kZXZfZW50cnkpO1xcbmFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy92aW8uYy03NDktXFx0XFx0aWYgKCFkZXZfZW50KVxcbi0tXFxuYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmM9MzUyPXN0YXRpYyBpbnQgZnNsX2xiY19zeXNjb3JlX3N1c3BlbmQodm9pZCAqZGF0YSlcXG4tLVxcbmFyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jLTM2NC1cXG5hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9sYmMuYzozNjU6XFx0Y3RybC1cXHUwMDNlc2F2ZWRfcmVncyA9IGttYWxsb2Nfb2JqKHN0cnVjdCBmc2xfbGJjX3JlZ3MpO1xcbmFyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jLTM2Ni1cXHRpZiAoIWN0cmwtXFx1MDAzZXNhdmVkX3JlZ3MpXFxuLS1cXG5hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYz0xNTQ5PXZvaWQgX19pbml0IG1waWNfaW5pdChzdHJ1Y3QgbXBpYyAqbXBpYylcXG4tLVxcbmFyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jLTE2NDEtXFx0LyogYWxsb2NhdGUgbWVtb3J5IHRvIHNhdmUgbXBpYyBzdGF0ZSAqL1xcbmFyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jOjE2NDI6XFx0bXBpYy1cXHUwMDNlc2F2ZV9kYXRhID0ga21hbGxvY19vYmpzKCptcGljLVxcdTAwM2VzYXZlX2RhdGEsIG1waWMtXFx1MDAzZW51bV9zb3VyY2VzKTtcXG5hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYy0xNjQzLVxcdEJVR19PTihtcGljLVxcdTAwM2VzYXZlX2RhdGEgPT0gTlVMTCk7XFxuLS1cXG5hcmNoL3Bvd2VycGMvc3lzZGV2L29mX3J0Yy5jPTIzPXZvaWQgX19pbml0IG9mX2luc3RhbnRpYXRlX3J0Yyh2b2lkKVxcbi0tXFxuYXJjaC9wb3dlcnBjL3N5c2Rldi9vZl9ydGMuYy0zNS1cXG5hcmNoL3Bvd2VycGMvc3lzZGV2L29mX3J0Yy5jOjM2OlxcdFxcdFxcdHJlcyA9IGttYWxsb2Nfb2JqKCpyZXMpO1xcbmFyY2gvcG93ZXJwYy9zeXNkZXYvb2ZfcnRjLmMtMzctXFx0XFx0XFx0aWYgKCFyZXMpIHtcXG4tLVxcbmFyY2gvcmlzY3Yva2VybmVsL21vZHVsZS5jPTY1ND1zdGF0aWMgaW50IGFkZF9yZWxvY2F0aW9uX3RvX2FjY3VtdWxhdGUoc3RydWN0IG1vZHVsZSAqbWUsIGludCB0eXBlLFxcbi0tXFxuYXJjaC9yaXNjdi9rZXJuZWwvbW9kdWxlLmMtNjY1LVxcbmFyY2gvcmlzY3Yva2VybmVsL21vZHVsZS5jOjY2NjpcXHRlbnRyeSA9IGttYWxsb2Nfb2JqKCplbnRyeSk7XFxuYXJjaC9yaXNjdi9rZXJuZWwvbW9kdWxlLmMtNjY3LVxcbi0tXFxuYXJjaC9yaXNjdi9rZXJuZWwvbW9kdWxlLmMtNjk5LVxcdGlmICghZm91bmQpIHtcXG5hcmNoL3Jpc2N2L2tlcm5lbC9tb2R1bGUuYzo3MDA6XFx0XFx0cmVsX2hlYWQgPSBrbWFsbG9jX29iaigqcmVsX2hlYWQpO1xcbmFyY2gvcmlzY3Yva2VybmVsL21vZHVsZS5jLTcwMS1cXG4tLVxcbmFyY2gvcmlzY3Yva2VybmVsL21vZHVsZS5jLTcxMS1cXHRcXHRcXHRidWNrZXQgPVxcbmFyY2gvcmlzY3Yva2VybmVsL21vZHVsZS5jOjcxMjpcXHRcXHRcXHRcXHRrbWFsbG9jX29iaihzdHJ1Y3QgdXNlZF9idWNrZXQpO1xcblxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNTowNDoxMy42NjE3MTY4NTlaIiwiU2VxIjoxOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6NDI0NTk0NDgxODkzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgYnBmX2xvb2t1cF9rZXlyaW5nIFBhdGNoKipcblxuT2theSwgc28gYGttYWxsb2Nfb2JqYC4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRoaXMgaXMgcHJvYmFibHkgYSBtYWNybywgbW9zdCBsaWtlbHkgZGVmaW5lZCBzb21ld2hlcmUgaW4gdGhlIGtlcm5lbCdzIGBpbmNsdWRlL2xpbnV4L3NsYWIuaGAgZGlyZWN0b3J5LCBvciBhIHNpbWlsYXIgaGVhZGVyLiBJdCdzIGFsbW9zdCBjZXJ0YWlubHkgYSB3cmFwcGVyIGFyb3VuZCBga21hbGxvYyhzaXplb2YoKmJrZXkpLCBHRlBfS0VSTkVMKWAuICBKdXN0IGEgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24uXG5cblJpZ2h0LCB0aGUgcGF0Y2ggdXNlcyBga21hbGxvY19vYmooKmJrZXkpYCwgd2hpY2ggaXMgcHVyZWx5IGFsbG9jYXRpb24uIE5vdGhpbmcgZmFuY3kuICBNeSBpbW1lZGlhdGUgY29uY2VybiwgdGhvdWdoLCBpcyB3aGV0aGVyIHRoZSBwYXRjaCBpbmFkdmVydGVudGx5IGludHJvZHVjZXMgdW5pbml0aWFsaXplZCBtZW1vcnkgYmVpbmcgZXhwb3NlZCB0byB1c2VyIHNwYWNlLiBJIGRvbid0IHNlZSBhbnkgb2J2aW91cyBkaXJlY3QgcGF0aCBoZXJlLCBidXQgbGV0J3MgYmUgdGhvcm91Z2guXG5cbkxldCdzIGRpdmUgaW50byBgYnBmX2xvb2t1cF9rZXlyaW5nYDpcblxuYGBgY1xuK3N0cnVjdCBicGZfa2V5ICpicGZfbG9va3VwX2tleXJpbmcodm9pZClcbit7XG4rXHRzdHJ1Y3QgYnBmX2tleSAqYmtleTtcbitcbitcdGlmICghYnBmX2tleXJpbmcpXG4rXHRcdHJldHVybiBOVUxMO1xuK1x0aWYgKCFSRUFEX09OQ0UoYnBmX2tleXJpbmctXHUwMDNla2V5cy5ucl9sZWF2ZXNfb25fdHJlZSkgfHxcbitcdCAgICAhUkVBRF9PTkNFKGJwZl9rZXlyaW5nLVx1MDAzZXJlc3RyaWN0X2xpbmspKVxuK1x0XHRyZXR1cm4gTlVMTDtcbitcbitcdGJrZXkgPSBrbWFsbG9jX29iaigqYmtleSk7XG4rXHRpZiAoIWJrZXkpXG4rXHRcdHJldHVybiBOVUxMO1xuK1xuK1x0YmtleS1cdTAwM2VrZXkgPSBicGZfa2V5cmluZztcbitcdGJrZXktXHUwMDNlaGFzX3JlZiA9IGZhbHNlO1xuK1x0cmV0dXJuIGJrZXk7XG4rfVxuYGBgXG5cbkFoYSEgTm93IHRoaXMgaXMgd2hlcmUgaXQgZ2V0cyBpbnRlcmVzdGluZy4gYGttYWxsb2Nfb2JqYCBhbGxvY2F0ZXMsIGJ1dCBkb2VzIGl0IHplcm8gdGhlIG1lbW9yeT8gSWYgaXQgYmVoYXZlcyBsaWtlIHN0YW5kYXJkIGBrbWFsbG9jYCwgdGhlIGFsbG9jYXRlZCBgYmtleWAgKmlzbid0KiBmdWxseSBpbml0aWFsaXplZCBhdCB0aGlzIHBvaW50LiBcblxuT2theSwgbGV0IG1lIGNoZWNrIHRoZSBkZWZpbml0aW9uIG9mIGBzdHJ1Y3QgYnBmX2tleWAgdG8gdW5kZXJzdGFuZCB0aGUgaW1wbGljYXRpb25zIG9mIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBMZXQncyBsb29rIGF0IGBpbmNsdWRlL2xpbnV4L2JwZi5oYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQ1MjcsIk91dHB1dFRva2VucyI6MjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjozNjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTU6MTE6MTguMjU2MjAxNjgxWiIsIlNlcSI6MjAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoyOTQ4ODU1MTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInN0cnVjdCBicGZfa2V5IFxcXFx7XCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvYnBmLmg9MzgwND1zdGF0aWMgaW5saW5lIGludCBicGZfZmRfcmV1c2Vwb3J0X2FycmF5X3VwZGF0ZV9lbGVtKHN0cnVjdCBicGZfbWFwICptYXAsXFxuLS1cXG5pbmNsdWRlL2xpbnV4L2JwZi5oLTM4MTMtI2lmZGVmIENPTkZJR19LRVlTXFxuaW5jbHVkZS9saW51eC9icGYuaDozODE0OnN0cnVjdCBicGZfa2V5IHtcXG5pbmNsdWRlL2xpbnV4L2JwZi5oLTM4MTUtXFx0c3RydWN0IGtleSAqa2V5O1xcbi0tXFxudG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL3ZlcmlmaWVyX3JlZl90cmFja2luZy5jLTI1LVxcbnRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy92ZXJpZmllcl9yZWZfdHJhY2tpbmcuYzoyNjpzdHJ1Y3QgYnBmX2tleSB7fSBfX2F0dHJpYnV0ZV9fKChwcmVzZXJ2ZV9hY2Nlc3NfaW5kZXgpKTtcXG50b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvdmVyaWZpZXJfcmVmX3RyYWNraW5nLmMtMjctXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE1OjExOjIxLjIwNTA2NjM5MloiLCJTZXEiOjIxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjo4MDM5MjY2MDg3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byB0aGUgYGJwZl9rZXlgIFN0cnVjdHVyZSoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBzcGVjaWZpY3Mgb2YgYHN0cnVjdCBicGZfa2V5YCwgYW5kIHRoZSBiZXN0IHBsYWNlIHRvIHN0YXJ0LCBhcyBhbHdheXMsIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZTogYGluY2x1ZGUvbGludXgvYnBmLmhgLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiBpdHMgbWVtYmVycywgdGhlaXIgZGF0YSB0eXBlcywgYW5kIGFueSByZWxldmFudCBjb21tZW50cyB3aXRoaW4gdGhlIGhlYWRlciBmaWxlIGl0c2VsZi4gVGhpcyBpcyBjcnVjaWFsIGZvciB3aGF0ZXZlciBJJ20gd29ya2luZyBvbiDigJMgd2hldGhlciBpdCdzIHVuZGVyc3RhbmRpbmcgZXhpc3RpbmcgQlBGIGNvZGUsIGV4dGVuZGluZyB0aGUga2VybmVsJ3MgQlBGIGZ1bmN0aW9uYWxpdHksIG9yIG1heWJlIGV2ZW4gZGVidWdnaW5nIHNvbWV0aGluZyByZWxhdGVkIHRvIGtleSBtYW5hZ2VtZW50IHdpdGhpbiBhIEJQRiBwcm9ncmFtLiBJJ20gbG9va2luZyBmb3IgYW55dGhpbmcgdGhhdCBtaWdodCBzaGVkIGxpZ2h0IG9uIGhvdyBrZXlzIGFyZSBzdHJ1Y3R1cmVkLCBob3cgdGhleSdyZSB1c2VkLCBhbmQgYW55IHBvdGVudGlhbCBnb3RjaGFzIG9yIG9wdGltaXphdGlvbnMgcmVsYXRlZCB0byB0aGVtLiBHb3R0YSBtYWtlIHN1cmUgSSdtIG5vdCBtaXNzaW5nIGFueXRoaW5nIGNyaXRpY2FsIGZvciBteSBjdXJyZW50IHRhc2suXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM1NTYzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTU6MTI6NDEuNTk3NzI5NjMyWiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIzMDgyMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJpbmNsdWRlL2xpbnV4L2JwZi5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM4MTQsXG4gIFwiTGluZUNvdW50XCI6IDEwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjM4MTQ6XFx0c3RydWN0IGJwZl9rZXkge1xcbjM4MTU6XFx0XFx0c3RydWN0IGtleSAqa2V5O1xcbjM4MTY6XFx0XFx0Ym9vbCBoYXNfcmVmO1xcbjM4MTc6XFx0fTtcXG4zODE4OlxcdCNlbmRpZiAvKiBDT05GSUdfS0VZUyAqL1xcbjM4MTk6XFx0XFxuMzgyMDpcXHQjaWYgZGVmaW5lZChDT05GSUdfS0VZUykgXFx1MDAyNlxcdTAwMjYgZGVmaW5lZChDT05GSUdfQlBGX1NZU0NBTEwpXFxuMzgyMTpcXHRzdHJ1Y3QgYnBmX2tleSAqYnBmX2xvb2t1cF91c2VyX2tleShzMzIgc2VyaWFsLCB1NjQgZmxhZ3MpO1xcbjM4MjI6XFx0c3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfc3lzdGVtX2tleSh1NjQgaWQpO1xcbjM4MjM6XFx0c3RydWN0IGJwZl9rZXkgKmJwZl9sb29rdXBfa2V5cmluZyh2b2lkKTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTU6MTI6NDEuNTk3OTYxNzgyWiIsIlNlcSI6MjMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy4xLXByby1wcmV2aWV3IiwiRHVyYXRpb24iOjU0NjI5MDk0OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBgYnBmX2tleWAgU3RydWN0dXJlIGFuZCBpdHMgVXNhZ2UqKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBhdCB0aGlzIGBzdHJ1Y3QgYnBmX2tleWAgYW5kIGl0J3MgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZC4gSnVzdCB0d28gZmllbGRzOiBhIHBvaW50ZXIgdG8gYSBgc3RydWN0IGtleWAgY2FsbGVkIGBrZXlgLCBhbmQgYSBib29sZWFuIGBoYXNfcmVmYC4gUmlnaHQgYXdheSwgSSBub3RpY2UgdGhlIGluaXRpYWxpemF0aW9uIGluIGBicGZfbG9va3VwX2tleXJpbmdgOiBgYmtleS1cdTAwM2VrZXkgPSBicGZfa2V5cmluZztgIGFuZCBgYmtleS1cdTAwM2VoYXNfcmVmID0gZmFsc2U7YC4gTm90aGluZyB1bnVzdWFsIHRoZXJlLlxuXG5JJ20gdGhpbmtpbmcgYWJvdXQgcG90ZW50aWFsIGFsaWdubWVudC4gVGhlcmUgKm1pZ2h0KiBiZSBzb21lIHBhZGRpbmcgYmV0d2VlbiBga2V5YCB3aGljaCBpcyA4IGJ5dGVzLCBhbmQgYGhhc19yZWZgLCB3aGljaCBpcyAxIGJ5dGUsIGJ1dCBzaW5jZSB0aGlzIGBzdHJ1Y3QgYnBmX2tleWAgaXNuJ3QgZXhwb3NlZCB0byB1c2VyIHNwYWNlLCB0aGF0J3Mgbm90IGEgaHVnZSBjb25jZXJuLiBJdCdzIHVzZWQgaW50ZXJuYWxseSBpbiBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgYW5kIGV2ZW50dWFsbHkgY2xlYW5lZCB1cCB3aXRoIGBicGZfa2V5X3B1dGAuIFRoYXQgbWVhbnMgdGhlcmUgYXJlIG5vIGNvbmNlcm5zIGFib3V0IHN0cnVjdHVyZSBsYXlvdXQgYmVpbmcgaW50ZXJwcmV0ZWQgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBsZXNzIHRydXN0d29ydGh5IHRoYW4gd2l0aGluIHRoZSBrZXJuZWwgaXRzZWxmLlxuXG5Ob3csIGxldCdzIGRpdmUgaW50byB0aGF0IGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBmdW5jdGlvbi4gSSBzaG91bGQgY2hlY2sgaXQgb3V0IGluIGBrZXJuZWwvYnBmL3ZlcmlmaWVyLmNgLiBMZXQncyBzZWUgaG93IGl0J3MgYWN0dWFsbHkgdXNpbmcgdGhpcyBgYnBmX2tleWAgc3RydWN0dXJlIGFuZCBpZiB0aGVyZSBhcmUgYW55IHN1YnRsZSBpbnRlcmFjdGlvbnMgdG8gYmUgYXdhcmUgb2YuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM2MDA3LCJPdXRwdXRUb2tlbnMiOjM4LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTY1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTU6MTI6NDcuMDYwODc1MzU0WiIsIlNlcSI6MjQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE0MTYzMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwia2VybmVsL2JwZi92ZXJpZmllci5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIxMDE1LFxuICBcIkxpbmVDb3VudFwiOiA1MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIyMTAxNTpcXHRcXHRzdHJ1Y3QgYnBmX2tleSAqa2V5ID0gTlVMTDtcXG4yMTAxNjpcXHRcXHR2b2lkICpzaWcsICpkYXRhID0gTlVMTDtcXG4yMTAxNzpcXHRcXHR1MzIgbWFwX2NudCA9IGVudi1cXHUwMDNldXNlZF9tYXBfY250O1xcbjIxMDE4OlxcdFxcdHUzMiBpLCBvZmYsIGluc25zX3N6O1xcbjIxMDE5OlxcdFxcdHU2NCBkYXRhX3N6O1xcbjIxMDIwOlxcdFxcdGludCBlcnIgPSAwO1xcbjIxMDIxOlxcdFxcbjIxMDIyOlxcdFxcdGlmICghYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUgfHxcXG4yMTAyMzpcXHRcXHQgICAgYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUgXFx1MDAzZSBCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkUpXFxuMjEwMjQ6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjEwMjU6XFx0XFxuMjEwMjY6XFx0XFx0aWYgKCFzeXN0ZW1fa2V5cmluZ19pZF9jaGVjayhhdHRyLVxcdTAwM2VrZXlyaW5nX2lkKSkge1xcbjIxMDI3OlxcdFxcdFxcdGtleSA9IGJwZl9sb29rdXBfc3lzdGVtX2tleShhdHRyLVxcdTAwM2VrZXlyaW5nX2lkKTtcXG4yMTAyODpcXHRcXHR9IGVsc2Uge1xcbjIxMDI5OlxcdFxcdFxcdGlmIChhdHRyLVxcdTAwM2VrZXlyaW5nX2lkICE9IFZFUklGWV9VU0VfQlBGX0tFWVJJTkcpIHtcXG4yMTAzMDpcXHRcXHRcXHRcXHRpZiAoYnBmX2tleXJpbmdfZW5mb3JjZWQoKSkge1xcbjIxMDMxOlxcdFxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiY2FsbGVyLXN1cHBsaWVkIGtleXJpbmcgcmVmdXNlZCwgdXNlIGJwZiBrZXlyaW5nXFxcXG5cXFwiKTtcXG4yMTAzMjpcXHRcXHRcXHRcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbjIxMDMzOlxcdFxcdFxcdFxcdH1cXG4yMTAzNDpcXHRcXHRcXHRcXHRrZXkgPSBicGZfbG9va3VwX3VzZXJfa2V5KGF0dHItXFx1MDAzZWtleXJpbmdfaWQsIDApO1xcbjIxMDM1OlxcdFxcdFxcdH0gZWxzZSB7XFxuMjEwMzY6XFx0XFx0XFx0XFx0a2V5ID0gYnBmX2xvb2t1cF9rZXlyaW5nKCk7XFxuMjEwMzc6XFx0XFx0XFx0fVxcbjIxMDM4OlxcdFxcdH1cXG4yMTAzOTpcXHRcXHRpZiAoIWtleSkge1xcbjIxMDQwOlxcdFxcdFxcdGlmIChhdHRyLVxcdTAwM2VrZXlyaW5nX2lkID09IFZFUklGWV9VU0VfQlBGX0tFWVJJTkcpIHtcXG4yMTA0MTpcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInRoZSBicGYga2V5cmluZyBpcyBlbXB0eSBvciBoYXMgbm90IGJlZW4gcmVzdHJpY3RlZFxcXFxuXFxcIik7XFxuMjEwNDI6XFx0XFx0XFx0XFx0cmV0dXJuIC1FTk9LRVk7XFxuMjEwNDM6XFx0XFx0XFx0fSBlbHNlIHtcXG4yMTA0NDpcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImNhbm5vdCByZXNvbHZlIHNpZ25pbmcga2V5cmluZyB3aXRoIGtleXJpbmdfaWQgJWRcXFxcblxcXCIsXFxuMjEwNDU6XFx0XFx0XFx0XFx0XFx0YXR0ci1cXHUwMDNla2V5cmluZ19pZCk7XFxuMjEwNDY6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjEwNDc6XFx0XFx0XFx0fVxcbjIxMDQ4OlxcdFxcdH1cXG4yMTA0OTpcXHRcXG4yMTA1MDpcXHRcXHRzaWcgPSBrdm1lbWR1cF9icGZwdHIodXNpZywgYXR0ci1cXHUwMDNlc2lnbmF0dXJlX3NpemUpO1xcbjIxMDUxOlxcdFxcdGlmIChJU19FUlIoc2lnKSkge1xcbjIxMDUyOlxcdFxcdFxcdGJwZl9rZXlfcHV0KGtleSk7XFxuMjEwNTM6XFx0XFx0XFx0cmV0dXJuIFBUUl9FUlIoc2lnKTtcXG4yMTA1NDpcXHRcXHR9XFxuMjEwNTU6XFx0XFxuMjEwNTY6XFx0XFx0aW5zbnNfc3ogPSBwcm9nLVxcdTAwM2VsZW4gKiBzaXplb2Yoc3RydWN0IGJwZl9pbnNuKTtcXG4yMTA1NzpcXHRcXHRkYXRhX3N6ID0gaW5zbnNfc3o7XFxuMjEwNTg6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1hcF9jbnQ7IGkrKykge1xcbjIxMDU5OlxcdFxcdFxcdHN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldO1xcbjIxMDYwOlxcdFxcbjIxMDYxOlxcdFxcdFxcdGlmIChtYXAtXFx1MDAzZW1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9BUlJBWSB8fFxcbjIxMDYyOlxcdFxcdFxcdCAgICAhbWFwLVxcdTAwM2VvcHMtXFx1MDAzZW1hcF9kaXJlY3RfdmFsdWVfYWRkcikge1xcbjIxMDYzOlxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHByb2dyYW0gbWV0YWRhdGEgbWFwICclcycgbXVzdCBiZSBhbiBhcnJheVxcXFxuXFxcIixcXG4yMTA2NDpcXHRcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNToxMjo0Ny4wNjIyOTc2MjRaIiwiU2VxIjoyNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MzA5MjYyNDAwOTMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgUHJvcG9zZWQgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQgbWUgYnJlYWsgdGhpcyBkb3duLiBGcm9tIHdoYXQgSSBzZWUsIHRoaXMgcGF0Y2ggaXMgZmFpcmx5IGNvbnRhaW5lZCDigJMgaXTigJlzIG5vdCBpbnRyb2R1Y2luZyBhbnkgbm92ZWwgdXNlci1zcGFjZSBkYXRhIHN0cnVjdHVyZXMsIHdoaWNoIGlzIGEgZ29vZCBzdGFydGluZyBwb2ludC4gVGhlIGNvcmUgc2VlbXMgdG8gYmUgY2VudGVyZWQgYXJvdW5kIGhhbmRsaW5nIGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYCB3aXRoaW4gYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgLiBUaGF0J3MgdGhlIGtleS4gSSBjYW4gaW1tZWRpYXRlbHkgaW5mZXIgdGhhdCB0aGUgZ29hbCBpcyB0byBsZXZlcmFnZSBhIEJQRiBrZXlyaW5nIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhIHJlYXNvbmFibGUgYXJjaGl0ZWN0dXJhbCBjaG9pY2UuXG5cblNvLCBpdCBsb29rcyBsaWtlIGl0J3MgYnVpbGRpbmcgdGhlIGdyb3VuZHdvcmsgZm9yIGtleSBtYW5hZ2VtZW50IHdpdGggYGJwZl9rZXlyaW5nX2luaXRgLCBhbmQgdGhlIGBicGZfa2V5cmluZ191bnNlYWxlZGAgbW9kdWxlIHBhcmFtZXRlciBpcyBpbnRlcmVzdGluZyDigJMgaXQgcHJvdmlkZXMgY29udHJvbCBvdmVyIGtleXJpbmcgc2VhbGluZywgd2hpY2ggbGlrZWx5IGhhcyBzZWN1cml0eSBpbXBsaWNhdGlvbnMuIEkgbmVlZCB0byBrZWVwIHRoYXQgaW4gbWluZC5cblxuVGhlIGFkZGl0aW9uIG9mIGBicGZfbG9va3VwX2tleXJpbmdgIHJhaXNlcyBhIHJlZCBmbGFnLiBJIHdhbnQgdG8gY2hlY2sgZm9yIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBleHBvc3VyZXMsIHNvIEknbGwgZHJpbGwgZG93biBvbiB0aGUgbWVtb3J5IGFsbG9jYXRpb24uIFRoZSB1c2Ugb2YgYGttYWxsb2Nfb2JqYCwgd2hpY2ggaXMgZnVuY3Rpb25hbGx5IHRoZSBzYW1lIGFzIGBrbWFsbG9jYCwgdG8gYWxsb2NhdGUgdGhlIGBzdHJ1Y3QgYnBmX2tleWAgaXMgc3RhbmRhcmQuIEl0IHNlZW1zIHNhZmUgYXMgdGhlIGZpZWxkcyBga2V5YCBhbmQgYGhhc19yZWZgIGFyZSBpbml0aWFsaXplZCwgYnV0IEknbGwgbWFrZSBzdXJlIHRoZXkgc3RheSBpbml0aWFsaXplZC4gRnVydGhlcm1vcmUsIHNpbmNlIHRoZSBgYnBmX2tleWAgc3RydWN0dXJlIGl0c2VsZiBpc24ndCBkaXJlY3RseSBleHBvc2VkIHRvIHVzZXIgc3BhY2UsIHRoZSByaXNrIHNlZW1zIG1pbmltYWwsIGJ1dCB0aGF0J3Mgc29tZXRoaW5nIHRvIGV4cGxpY2l0bHkgdmVyaWZ5LlxuXG5UaGUgc2lnbmF0dXJlIGhhbmRsaW5nIGlzIHdoZXJlIHRoZSBjb3JlIG9mIHRoZSBzZWN1cml0eSBsaWVzLiBUaGUgc2lnbmF0dXJlIGlzIGNvcGllZCBmcm9tIHVzZXIgc3BhY2UgdmlhIGBrdm1lbWR1cF9icGZwdHJgLCB3aGljaCBpcyBnb29kIHByYWN0aWNlLiBJJ20gcGxlYXNlZCB0byBzZWUgdGhhdCB0aGUgYGF0dHItXHUwMDNlc2lnbmF0dXJlX3NpemVgIGlzIHZhbGlkYXRlZCBhZ2FpbnN0IGBCUEZfUFJPR19NQVhfU0lHTkFUVVJFX1NJWkVgICg2NEtCKSwgYSBzdHJpY3RlciBib3VuZCB0aGFuIHRoZSBvbGQgYEtNQUxMT0NfTUFYX0NBQ0hFX1NJWkVgLiBUaGlzIHByZXZlbnRzIGV4Y2Vzc2l2ZSBtZW1vcnkgYWxsb2NhdGlvbi4gSXQgdGhlbiBnZXRzIHZlcmlmaWVkIHVzaW5nIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAuIFRoZSBmYWN0IHRoYXQgaXQncyB1c2luZyBhIFBLQ1MjNyBzaWduYXR1cmUgYW5kIGl0J3MgYmVpbmcgY29waWVkIGFuZCB2YWxpZGF0ZWQgc3VnZ2VzdHMgYSBzb2xpZCwgd2VsbC1kZWZpbmVkIGFwcHJvYWNoIHRvIHNpZ25pbmcgQlBGIHByb2dyYW1zLiBCdXQgdGhhdCBmdW5jdGlvbiB1c2FnZSwgSSBuZWVkIHRvIGludmVzdGlnYXRlIHRoYXQgZnVydGhlci4gSSBzaG91bGQgY2hlY2sgaG93IHRoYXQgZnVuY3Rpb24gaXMgYmVpbmcgdXNlZCB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIHBvdGVudGlhbCBmbGF3cy5cblxuRmluYWxseSwgdGhlIHVwZGF0ZXMgdG8gYGJwZnRvb2xgIGZvciBNTC1EU0EgYW5kIENNU19OT0FUVFIgc3VwcG9ydCBhcmUgd2VsY29tZSwgYW5kIHRoZSBhZGRlZCBzZWxmdGVzdHMgYXJlIGEgcG9zaXRpdmUgc2lnbiBvZiByb2J1c3QgZGV2ZWxvcG1lbnQuIE92ZXJhbGwsIGl0J3MgYSBzb2xpZCBzdGFydC4gSSB3YW50IHRvIGRvIGEgY29kZSByZXZpZXcgb2YgdGhlIGBicGZfdmVyaWZ5X3BrY3M3X3NpZ25hdHVyZWAgZnVuY3Rpb24gaXRzZWxmIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHVuZXhwZWN0ZWQgc2lkZSBlZmZlY3RzLlxuXG5cbiIsIklucHV0VG9rZW5zIjozNzM4MywiT3V0cHV0VG9rZW5zIjozOCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMyNCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE1OjEzOjE3Ljk4ODUzOTgwNloiLCJTZXEiOjI2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDUwNDgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvdmVyaWZpZXIuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAyMTA2NSxcbiAgXCJMaW5lQ291bnRcIjogNTBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjEwNjU6XFx0XFx0XFx0XFx0ZXJyID0gLUVJTlZBTDtcXG4yMTA2NjpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTA2NzpcXHRcXHRcXHR9XFxuMjEwNjg6XFx0XFx0XFx0aWYgKCFSRUFEX09OQ0UobWFwLVxcdTAwM2Vmcm96ZW4pKSB7XFxuMjEwNjk6XFx0XFx0XFx0XFx0dmVyYm9zZShlbnYsIFxcXCJzaWduZWQgcHJvZ3JhbSBtZXRhZGF0YSBtYXAgJyVzJyBtdXN0IGJlIGZyb3plblxcXFxuXFxcIixcXG4yMTA3MDpcXHRcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcbjIxMDcxOlxcdFxcdFxcdFxcdGVyciA9IC1FUEVSTTtcXG4yMTA3MjpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTA3MzpcXHRcXHRcXHR9XFxuMjEwNzQ6XFx0XFx0XFx0aWYgKGJwZl9tYXBfd3JpdGVfYWN0aXZlKG1hcCkpIHtcXG4yMTA3NTpcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAnJXMnIGhhcyBhY3RpdmUgd3JpdGVyc1xcXFxuXFxcIixcXG4yMTA3NjpcXHRcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUpO1xcbjIxMDc3OlxcdFxcdFxcdFxcdGVyciA9IC1FQlVTWTtcXG4yMTA3ODpcXHRcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTA3OTpcXHRcXHRcXHR9XFxuMjEwODA6XFx0XFx0XFx0aWYgKCFtYXAtXFx1MDAzZWV4Y2xfcHJvZ19zaGEpIHtcXG4yMTA4MTpcXHRcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcInNpZ25lZCBwcm9ncmFtIG1ldGFkYXRhIG1hcCAnJXMnIG11c3QgYmUgZXhjbHVzaXZlXFxcXG5cXFwiLFxcbjIxMDgyOlxcdFxcdFxcdFxcdFxcdG1hcC1cXHUwMDNlbmFtZSk7XFxuMjEwODM6XFx0XFx0XFx0XFx0ZXJyID0gLUVQRVJNO1xcbjIxMDg0OlxcdFxcdFxcdFxcdGdvdG8gb3V0O1xcbjIxMDg1OlxcdFxcdFxcdH1cXG4yMTA4NjpcXHRcXHRcXHRkYXRhX3N6ICs9IG1hcC1cXHUwMDNldmFsdWVfc2l6ZTtcXG4yMTA4NzpcXHRcXHR9XFxuMjEwODg6XFx0XFx0aWYgKGJwZl9keW5wdHJfY2hlY2tfc2l6ZShkYXRhX3N6KSkge1xcbjIxMDg5OlxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwic2lnbmVkIHBheWxvYWQgdG9vIGxhcmdlOiAlbGx1IGJ5dGVzXFxcXG5cXFwiLCBkYXRhX3N6KTtcXG4yMTA5MDpcXHRcXHRcXHRlcnIgPSAtRTJCSUc7XFxuMjEwOTE6XFx0XFx0XFx0Z290byBvdXQ7XFxuMjEwOTI6XFx0XFx0fVxcbjIxMDkzOlxcdFxcdGRhdGEgPSBrdm1hbGxvYyhkYXRhX3N6LCBHRlBfS0VSTkVMX0FDQ09VTlQgfCBfX0dGUF9aRVJPKTtcXG4yMTA5NDpcXHRcXHRpZiAoIWRhdGEpIHtcXG4yMTA5NTpcXHRcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbjIxMDk2OlxcdFxcdFxcdGdvdG8gb3V0O1xcbjIxMDk3OlxcdFxcdH1cXG4yMTA5ODpcXHRcXHRtZW1jcHkoZGF0YSwgcHJvZy1cXHUwMDNlaW5zbnNpLCBpbnNuc19zeik7XFxuMjEwOTk6XFx0XFx0b2ZmID0gaW5zbnNfc3o7XFxuMjExMDA6XFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIG1hcF9jbnQ7IGkrKykge1xcbjIxMTAxOlxcdFxcdFxcdHN0cnVjdCBicGZfbWFwICptYXAgPSBtYXBzW2ldO1xcbjIxMTAyOlxcdFxcdFxcdHU2NCBhZGRyO1xcbjIxMTAzOlxcdFxcbjIxMTA0OlxcdFxcdFxcdGVyciA9IG1hcC1cXHUwMDNlb3BzLVxcdTAwM2VtYXBfZGlyZWN0X3ZhbHVlX2FkZHIobWFwLCBcXHUwMDI2YWRkciwgMCk7XFxuMjExMDU6XFx0XFx0XFx0aWYgKGVycikge1xcbjIxMTA2OlxcdFxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiZmFpbGVkIHRvIHJlYWQgc2lnbmVkIG1ldGFkYXRhIG1hcCAnJXMnOiAlZFxcXFxuXFxcIixcXG4yMTEwNzpcXHRcXHRcXHRcXHRcXHRtYXAtXFx1MDAzZW5hbWUsIGVycik7XFxuMjExMDg6XFx0XFx0XFx0XFx0Z290byBvdXQ7XFxuMjExMDk6XFx0XFx0XFx0fVxcbjIxMTEwOlxcdFxcdFxcdG1lbWNweShkYXRhICsgb2ZmLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFkZHIsXFxuMjExMTE6XFx0XFx0XFx0ICAgICAgIG1hcC1cXHUwMDNldmFsdWVfc2l6ZSk7XFxuMjExMTI6XFx0XFx0XFx0b2ZmICs9IG1hcC1cXHUwMDNldmFsdWVfc2l6ZTtcXG4yMTExMzpcXHRcXHR9XFxuMjExMTQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE1OjEzOjE3Ljk4OTU5MTUzNVoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuMS1wcm8tcHJldmlldyIsIkR1cmF0aW9uIjoxNTc2MTc5NTQ1OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipNeSBBc3Nlc3NtZW50IG9mIHRoZSBQYXRjaCBTZXJpZXM6IE5vIEtNU0FOIEZ1enppbmcgTmVlZGVkKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBhbGxvY2F0ZWQgYSBgZGF0YWAgYnVmZmVyIHVzaW5nIGBrdm1hbGxvY2Agd2l0aCBgX19HRlBfWkVST2AuIFRoaXMgbWVhbnMgaXQncyBmdWxseSB6ZXJvZWQgcmlnaHQgb2ZmIHRoZSBiYXQsIGFuZCB0aGVuIEkgcG9wdWxhdGUgaXQgd2l0aCBgbWVtY3B5YC4gU3Vic2VxdWVudGx5LCBJIHBhc3MgdGhpcyBtZW1vcnkgdG8gYGJwZl92ZXJpZnlfcGtjczdfc2lnbmF0dXJlYC4gU28sIHRoZXJlJ3Mgbm8gd2F5IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIGxlYWtpbmcgdGhlcmUuXG5cbk5vdywgSSBjaGVja2VkIHRoZSBjaGFuZ2VzIHRvIGBpbmNsdWRlL2xpbnV4L2JwZi5oYCwgc3BlY2lmaWNhbGx5IHRoZSBhZGRpdGlvbiBvZiBgQlBGX1NJR19LRVlSSU5HX0JQRmAgdG8gdGhlIGBlbnVtIGJwZl9zaWdfa2V5cmluZ2AuIFRoYXQncyBhIHNpbXBsZSBlbnVtIGFkZGl0aW9uOyBubyBtZW1vcnkgY29uY2VybnMgdGhlcmUuXG5cbk5leHQsIEkgbG9va2VkIGF0IGBicGZfY2xhc3NpZnlfa2V5cmluZ2AgaW4gYGtlcm5lbC9icGYvdmVyaWZpZXIuY2AuIFRoaXMgaW52b2x2ZXMgYWRkaW5nIGEgY2FzZSBpbiBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0aGF0IGNsYXNzaWZpZXMgdGhlIG5ldyBrZXlyaW5nLiBBZ2Fpbiwgbm8gbWVtb3J5IGluaXRpYWxpemF0aW9uIGlzc3VlcyBhcmUgZXZpZGVudC5cblxuVGhlbiBJIGV4YW1pbmVkIHRoZSBgYnBmX2tleXJpbmdfaW5pdGAgZnVuY3Rpb24gaW4gYGtlcm5lbC9icGYva2V5cy5jYC4gVGhpcyBjcmVhdGVzIGEgbmV3IGtleXJpbmcgYW5kLCBpZiBpdCdzIG5vdCBzZWFsZWQsIGl0IGF0dGVtcHRzIHRvIHJlc3RyaWN0IGl0LiBUaGlzIGlzIHdoZXJlIEkgaGF2ZSB0byBiZSBwYXJ0aWN1bGFybHkgY2FyZWZ1bC4gSSBjaGVja2VkLCBhbmQgYGJwZl9rZXlyaW5nX2luaXRgIGlzbid0IGxlYWtpbmcgYW55IHVuaW5pdGlhbGl6ZWQgZGF0YS5cblxuSSBjb250aW51ZWQgd2l0aCBgYnBmX2tleXJpbmdfZW5mb3JjZWRgIGFuZCBgYnBmX2xvb2t1cF9rZXlyaW5nYCwgc2NydXRpbml6aW5nIHRoZW0gZm9yIGFueSBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMuIEJ1dCBmcm9tIHdoYXQgSSBjYW4gc2VlLCB0aGVzZSBmdW5jdGlvbnMgb25seSByZXR1cm4gcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmVzLCBubyB1bmluaXRpYWxpemVkIGRhdGEgaXMgZ29pbmcgdG8gYmUgbGVha2luZy5cblxuSSBhbHNvIGNoZWNrZWQgdGhlIGBicGZ0b29sYCBjaGFuZ2VzIHJlbGF0ZWQgdG8gdGhlIENNUyBzaWduYXR1cmUgaGFuZGxpbmcgYW5kIHRoZSBzZWxmdGVzdCBjaGFuZ2VzLiBUaG9zZSBkaWRuJ3QgcHJlc2VudCBhbnkgaW1tZWRpYXRlIGlzc3Vlcy5cblxuR2l2ZW4gdGhhdCB0aGlzIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIGEgbmV3IGtleXJpbmcgZm9yIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gYnV0IGRvZXNuJ3QgaW50cm9kdWNlIGFueSBuZXcgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UsIG9yIGFueSBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkIGxhdGVyLiBJIGFsc28gbWFkZSBzdXJlIHRoYXQgdGhlIGFsbG9jYXRpb24gb2YgYGJrZXkgPSBrbWFsbG9jX29iaigqYmtleSk7YCBpcyBpbml0aWFsaXplZC5cblxuVGhlcmVmb3JlLCBJJ20gY29uZmlkZW50IHRoYXQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzbid0IG5lZWRlZC4gVGhlIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgbGlrZSBLQVNBTiBhbmQgb3RoZXJzLCBzaG91bGQgYmUgc3VmZmljaWVudCB0byBjYXRjaCBhbnkgcG90ZW50aWFsIG1lbW9yeSBlcnJvcnMgbGlrZSBvdXQtb2YtYm91bmRzIGFjY2VzcyBvciB1c2UtYWZ0ZXItZnJlZSBpc3N1ZXMuXG5MZXQncyBqdXN0IGRvdWJsZSBjaGVjayBga3ZtZW1kdXBfYnBmcHRyYCB0byBtYWtlIHN1cmUhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjM5MTA2LCJPdXRwdXRUb2tlbnMiOjIxLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTU4NiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI1VDE1OjEzOjMzLjc1MTM4OTg2NVoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTY1MTQzNDMxMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJrdm1lbWR1cF9icGZwdHJcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9icGZwdHIuaD02Mj1zdGF0aWMgaW5saW5lIGludCBjb3B5X3RvX2JwZnB0cl9vZmZzZXQoYnBmcHRyX3QgZHN0LCBzaXplX3Qgb2Zmc2V0LFxcbi0tXFxuaW5jbHVkZS9saW51eC9icGZwdHIuaC02Ny1cXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oOjY4OnN0YXRpYyBpbmxpbmUgdm9pZCAqa3ZtZW1kdXBfYnBmcHRyX25vcHJvZihicGZwdHJfdCBzcmMsIHNpemVfdCBsZW4pXFxuaW5jbHVkZS9saW51eC9icGZwdHIuaC02OS17XFxuLS1cXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oLTc5LX1cXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oOjgwOiNkZWZpbmUga3ZtZW1kdXBfYnBmcHRyKC4uLilcXHRhbGxvY19ob29rcyhrdm1lbWR1cF9icGZwdHJfbm9wcm9mKF9fVkFfQVJHU19fKSlcXG5pbmNsdWRlL2xpbnV4L2JwZnB0ci5oLTgxLVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmM9MTc3Mj1zdGF0aWMgdm9pZCAqX19fYnBmX2NvcHlfa2V5KGJwZnB0cl90IHVrZXksIHU2NCBrZXlfc2l6ZSlcXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jLTE3NzQtXFx0aWYgKGtleV9zaXplKVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjE3NzU6XFx0XFx0cmV0dXJuIGt2bWVtZHVwX2JwZnB0cih1a2V5LCBrZXlfc2l6ZSk7XFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTc3Ni1cXG4tLVxcbmtlcm5lbC9icGYvc3lzY2FsbC5jPTE4NDc9c3RhdGljIGludCBtYXBfdXBkYXRlX2VsZW0odW5pb24gYnBmX2F0dHIgKmF0dHIsIGJwZnB0cl90IHVhdHRyKVxcbi0tXFxua2VybmVsL2JwZi9zeXNjYWxsLmMtMTg3OS1cXHR2YWx1ZV9zaXplID0gYnBmX21hcF92YWx1ZV9zaXplKG1hcCwgYXR0ci1cXHUwMDNlZmxhZ3MpO1xcbmtlcm5lbC9icGYvc3lzY2FsbC5jOjE4ODA6XFx0dmFsdWUgPSBrdm1lbWR1cF9icGZwdHIodXZhbHVlLCB2YWx1ZV9zaXplKTtcXG5rZXJuZWwvYnBmL3N5c2NhbGwuYy0xODgxLVxcdGlmIChJU19FUlIodmFsdWUpKSB7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjEwMDg9c3RhdGljIGludCBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjEwNDktXFxua2VybmVsL2JwZi92ZXJpZmllci5jOjIxMDUwOlxcdHNpZyA9IGt2bWVtZHVwX2JwZnB0cih1c2lnLCBhdHRyLVxcdTAwM2VzaWduYXR1cmVfc2l6ZSk7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIxMDUxLVxcdGlmIChJU19FUlIoc2lnKSkge1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yNVQxNToxMzozNS40MDI4MzEyMjhaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjEtcHJvLXByZXZpZXciLCJEdXJhdGlvbiI6MTcwMjE0NzcyMDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHlzaXMgb2YgdGhlIEJQRiBLZXlyaW5nIFBhdGNoIGZvciBVbmluaXRpYWxpemVkIE1lbW9yeSoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gVGhlIGNvcmUgY29uY2VybiBpcyB3aGV0aGVyIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhbnkgbmV3IGF2ZW51ZXMgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHRvIGxlYWsgaW5mb3JtYXRpb24gb3IgY2F1c2UgdnVsbmVyYWJpbGl0aWVzLiBJJ20gZ29pbmcgdGhyb3VnaCB0aGUgY29kZSBjaGFuZ2VzIG1ldGhvZGljYWxseS5cblxuRmlyc3QsIGBrdm1lbWR1cF9icGZwdHJgOiB0aGF0IG9uZSdzIHNvbGlkLiBJdCdzIGRlc2lnbmVkIHRvIGNvcHkgZGF0YSAqZnJvbSogdXNlcnNwYWNlLCBzbyB3aGF0ZXZlciBtZW1vcnkgaXQgcmV0dXJucyBpcyBndWFyYW50ZWVkIHRvIGJlIGluaXRpYWxpemVkIHdpdGggdXNlci1wcm92aWRlZCBkYXRhLiBBbmQgaWYgdGhlIGNvcHkgZmFpbHMsIGl0IGZyZWVzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBwcmV2ZW50aW5nIGFueSBwb3RlbnRpYWwgbGVhay4gR29vZC5cblxuTm93LCBgYnBmX2tleXJpbmdfaW5pdGAuIFRoaXMgaXMgY2FsbGVkIGF0IGBsYXRlX2luaXRjYWxsYCwgY3JlYXRpbmcgdGhlIGtleXJpbmcuIEl0IGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBrZXlyaW5nIHN0cnVjdCwgYW5kIHNwZWNpZmljYWxseSByZXN0cmljdHMgaXQgaWYgYGJwZl9rZXlyaW5nX3Vuc2VhbGVkYCBpcyBmYWxzZS4gTm8gaXNzdWVzIGhlcmU7IGV2ZXJ5dGhpbmcncyBwcm9wZXJseSBpbml0aWFsaXplZC5cblxuTW92aW5nIG9uIHRvIGBicGZfbG9va3VwX2tleXJpbmdgLiBUaGlzIGlzIHdoZXJlIGEgYHN0cnVjdCBicGZfa2V5YCBpcyBhbGxvY2F0ZWQgdXNpbmcgYGttYWxsb2Nfb2JqYC4gQ3J1Y2lhbGx5LCBhZnRlciB0aGUgYWxsb2NhdGlvbiwgaXQgZXhwbGljaXRseSBpbml0aWFsaXplcyBib3RoIGBia2V5LVx1MDAzZWtleWAgYW5kIGBia2V5LVx1MDAzZWhhc19yZWZgLiBUaGlzIGlzIGtleTogYWxsIHRoZSBmaWVsZHMgYXJlIGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpb24sIHByZXZlbnRpbmcgYW55IHBvdGVudGlhbCB1bmluaXRpYWxpemVkIG1lbW9yeSByZWFkcy5cblxuVGhlbiwgdGhlIGBicGZfcHJvZ192ZXJpZnlfc2lnbmF0dXJlYCBsb2dpYzogVGhpcyBpcyBqdXN0IGFib3V0IHNlbGVjdGluZyB0aGUgcmlnaHQga2V5cmluZy4gTm8gbWVtb3J5IGFsbG9jYXRpb24gaGFwcGVucyBoZXJlLCBqdXN0IGJyYW5jaGluZyBsb2dpYyB0byBkZXRlcm1pbmUgd2hpY2gga2V5cmluZyB0byB1c2UgYmFzZWQgb24gdGhlIGBhdHRyLVx1MDAzZWtleXJpbmdfaWRgLiBTbywgdGhpcyBzZWN0aW9uIGlzIGFsc28gY2xlYW4uXG5cbkFuZCBmaW5hbGx5LCBgYnBmX3ZlcmlmeV9wa2NzN19zaWduYXR1cmVgIGl0c2VsZi4gVGhpcyBpcyAqbm90KiBtb2RpZmllZCBpbiB0aGUgcGF0Y2gsIHNvIHRoZSBwYXRjaCBkb2Vzbid0IGltcGFjdCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LCBpdCBqdXN0IGNhbGxzIGl0LlxuXG5UaGVyZWZvcmUsIGFmdGVyIGEgY2FyZWZ1bCByZXZpZXcsIEknbSBjb25maWRlbnQgdGhhdCB0aGlzIHBhdGNoIGRvZXMgKm5vdCogaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gVGhlcmUgYXJlIG5vIGFsbG9jYXRpb25zIHdoZXJlIGZpZWxkcyBhcmUgbGVmdCB1bmluaXRpYWxpemVkLCBhbmQgbm8gbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBiZWluZyBjb3BpZWQgdG8gdXNlciBzcGFjZS4gSXQgaXMgYSBuZXcgQlBGIGtleXJpbmcgKGAuYnBmYCkgZm9yIEJQRiBwcm9ncmFtIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24sIGluY2x1ZGluZyBhIGtlcm5lbCBwYXJhbWV0ZXIgdG8gbWFuYWdlIGl0cyBzdGF0ZS4gVGhlIGNoYW5nZXMgYXJlIHN0cmFpZ2h0Zm9yd2FyZCBhbmQgZm9jdXMgb24ga2V5cmluZyBtYW5hZ2VtZW50IGFuZCB2ZXJpZmljYXRpb24gbG9naWMsIHdpdGhvdXQgaW50cm9kdWNpbmcgYW55IG9idmlvdXMgc291cmNlcyBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gS01TQU4gaXNuJ3QgbmVjZXNzYXJ5IGhlcmUsIGFzIHRoaXMgcGF0Y2ggZG9lcyBub3QgcG9zZSBhIHRocmVhdCB0byB0aGUgc2VjdXJpdHkgYW5kIGludGVncml0eSBvZiB0aGUgc3lzdGVtIGluIHRlcm1zIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBTdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGxpa2UgS0FTQU4gc2hvdWxkIGJlIG1vcmUgdGhhbiBzdWZmaWNpZW50IHRvIGNhdGNoIGFueSBpc3N1ZXMgcmVsYXRlZCB0byB0aGlzIHBhdGNoLiBUaGUga2V5IGFsbG9jYXRpb25zIGFuZCBjb3BpZXMgYXJlIGVpdGhlciBmcm9tIGEga25vd24gc291cmNlLCBvciBmdWxseSB6ZXJvZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQxODA2LCJPdXRwdXRUb2tlbnMiOjMyMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExNzMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjVUMTU6MTM6NTIuNDI0MzExNDY4WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MjE2MTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBzZXJpZXMgaW50cm9kdWNlcyBhIG5ldyBCUEYga2V5cmluZyAoYC5icGZgKSBmb3IgQlBGIHByb2dyYW0gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiwgYWxvbmcgd2l0aCBhIGtlcm5lbCBwYXJhbWV0ZXIgYGJwZi5rZXlyaW5nX3Vuc2VhbGVkYCB0byBtYW5hZ2UgaXRzIHN0YXRlLiBUaGUgY2hhbmdlcyBwcmltYXJpbHkgaW52b2x2ZSBhZGRpbmcgYSBuZXcga2V5cmluZyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiwgYWRkaW5nIGEgbG9va3VwIGZ1bmN0aW9uIGBicGZfbG9va3VwX2tleXJpbmdgIHdoaWNoIGFsbG9jYXRlcyBhIGBzdHJ1Y3QgYnBmX2tleWAgYW5kIGluaXRpYWxpemVzIGl0cyBmaWVsZHMsIGFuZCBtb2RpZnlpbmcgYGJwZl9wcm9nX3ZlcmlmeV9zaWduYXR1cmVgIHRvIGhhbmRsZSB0aGUgbmV3IGBWRVJJRllfVVNFX0JQRl9LRVlSSU5HYCBJRC5cXG5cXG5Ob25lIG9mIHRoZXNlIGNoYW5nZXMgaW50cm9kdWNlIG5ldyBrZXJuZWwgc3RydWN0dXJlcyB0aGF0IGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSwgbm9yIGRvIHRoZXkgaW50cm9kdWNlIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdpdGggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCBmaWVsZHMuIFRoZSBvbmx5IG5ldyBrZXJuZWwgYWxsb2NhdGlvbiBpcyBmb3IgYHN0cnVjdCBicGZfa2V5YCB2aWEgYGttYWxsb2Nfb2JqYCwgYW5kIGFsbCBpdHMgZmllbGRzIChga2V5YCBhbmQgYGhhc19yZWZgKSBhcmUgZXhwbGljaXRseSBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBhZnRlciBhbGxvY2F0aW9uLiBUaGUgc2lnbmF0dXJlIGFuZCBkYXRhIGJ1ZmZlcnMgdXNlZCBkdXJpbmcgdmVyaWZpY2F0aW9uIGFyZSBhbGxvY2F0ZWQgd2l0aCBga3ZtZW1kdXBfYnBmcHRyYCAod2hpY2ggY29waWVzIGZyb20gdXNlciBzcGFjZSkgYW5kIGBrdm1hbGxvYyguLi4sIF9fR0ZQX1pFUk8pYCAod2hpY2ggemVyby1pbml0aWFsaXplcyksIHJlc3BlY3RpdmVseS5cXG5cXG5BbnkgcG90ZW50aWFsIGJ1Z3MgaW50cm9kdWNlZCBieSB0aGVzZSBjaGFuZ2VzLCBzdWNoIGFzIG1lbW9yeSBsZWFrcywgb3V0LW9mLWJvdW5kcyBhY2Nlc3Nlcywgb3IgdXNlLWFmdGVyLWZyZWUgaXNzdWVzLCB3b3VsZCBiZSBlZmZlY3RpdmVseSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4gYW5kIG90aGVyIGRlZmF1bHQgYnVnIGRldGVjdG9ycy4gVGhlcmUgaXMgbm8gcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzIHRoYXQgd291bGQgbmVjZXNzaXRhdGUgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHNlcmllcyBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZXlyaW5nIChgLmJwZmApIGZvciBCUEYgcHJvZ3JhbSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBhbG9uZyB3aXRoIGEga2VybmVsIHBhcmFtZXRlciBgYnBmLmtleXJpbmdfdW5zZWFsZWRgIHRvIG1hbmFnZSBpdHMgc3RhdGUuIFRoZSBjaGFuZ2VzIHByaW1hcmlseSBpbnZvbHZlIGFkZGluZyBhIG5ldyBrZXlyaW5nIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLCBhZGRpbmcgYSBsb29rdXAgZnVuY3Rpb24gYGJwZl9sb29rdXBfa2V5cmluZ2Agd2hpY2ggYWxsb2NhdGVzIGEgYHN0cnVjdCBicGZfa2V5YCBhbmQgaW5pdGlhbGl6ZXMgaXRzIGZpZWxkcywgYW5kIG1vZGlmeWluZyBgYnBmX3Byb2dfdmVyaWZ5X3NpZ25hdHVyZWAgdG8gaGFuZGxlIHRoZSBuZXcgYFZFUklGWV9VU0VfQlBGX0tFWVJJTkdgIElELlxcblxcbk5vbmUgb2YgdGhlc2UgY2hhbmdlcyBpbnRyb2R1Y2UgbmV3IGtlcm5lbCBzdHJ1Y3R1cmVzIHRoYXQgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlLCBub3IgZG8gdGhleSBpbnRyb2R1Y2UgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIGZpZWxkcy4gVGhlIG9ubHkgbmV3IGtlcm5lbCBhbGxvY2F0aW9uIGlzIGZvciBgc3RydWN0IGJwZl9rZXlgIHZpYSBga21hbGxvY19vYmpgLCBhbmQgYWxsIGl0cyBmaWVsZHMgKGBrZXlgIGFuZCBgaGFzX3JlZmApIGFyZSBleHBsaWNpdGx5IGluaXRpYWxpemVkIGltbWVkaWF0ZWx5IGFmdGVyIGFsbG9jYXRpb24uIFRoZSBzaWduYXR1cmUgYW5kIGRhdGEgYnVmZmVycyB1c2VkIGR1cmluZyB2ZXJpZmljYXRpb24gYXJlIGFsbG9jYXRlZCB3aXRoIGBrdm1lbWR1cF9icGZwdHJgICh3aGljaCBjb3BpZXMgZnJvbSB1c2VyIHNwYWNlKSBhbmQgYGt2bWFsbG9jKC4uLiwgX19HRlBfWkVSTylgICh3aGljaCB6ZXJvLWluaXRpYWxpemVzKSwgcmVzcGVjdGl2ZWx5LlxcblxcbkFueSBwb3RlbnRpYWwgYnVncyBpbnRyb2R1Y2VkIGJ5IHRoZXNlIGNoYW5nZXMsIHN1Y2ggYXMgbWVtb3J5IGxlYWtzLCBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCBvciB1c2UtYWZ0ZXItZnJlZSBpc3N1ZXMsIHdvdWxkIGJlIGVmZmVjdGl2ZWx5IGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiBhbmQgb3RoZXIgZGVmYXVsdCBidWcgZGV0ZWN0b3JzLiBUaGVyZSBpcyBubyByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MgdGhhdCB3b3VsZCBuZWNlc3NpdGF0ZSBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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,}