Name: series-workflowcqnfz Phase: Succeeded StartedAt: 2026-09-11 16:42:27 +0000 UTC FinishedAt: 2026-09-11 21:21:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[0] Phase: Succeeded StartedAt: 2026-09-11 16:42:27 +0000 UTC FinishedAt: 2026-09-11 17:32:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[0].run-triage Phase: Succeeded StartedAt: 2026-09-11 16:42:27 +0000 UTC FinishedAt: 2026-09-11 17:32:55 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "78445023439506ebd83b86d40b1e428a3b309d4a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NETLINK_DIAG", "PROC_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "78445023439506ebd83b86d40b1e428a3b309d4a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NETLINK_DIAG", "PROC_FS" ], "series_id": "94f352df-b1f9-4e57-829f-510bf132863a" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "netlink_realloc_groups", "sk_diag_dump_groups", "netlink_native_seq_show" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "78445023439506ebd83b86d40b1e428a3b309d4a", "base_tree": "net" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05FVExJTktfRElBRyYjMzQ7LAogICAgJiMzNDtQUk9DX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmV0bGlua19yZWFsbG9jX2dyb3VwcyYjMzQ7LAogICAgJiMzNDtza19kaWFnX2R1bXBfZ3JvdXBzJiMzNDssCiAgICAmIzM0O25ldGxpbmtfbmF0aXZlX3NlcV9zaG93JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVzb2x2ZXMgYSBjb25jdXJyZW5jeSBidWcgd2hlcmUgYGtyZWFsbG9jKClgIGltbWVkaWF0ZWx5IGZyZWVkIGBubGstXHUwMDNlZ3JvdXBzYCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIHVuZGVyIFJDVSAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYCkgY291bGQgYWNjZXNzIGl0IGNvbmN1cnJlbnRseSwgcmlza2luZyB1c2UtYWZ0ZXItZnJlZSAoVUFGKSBhbmQgb3V0LW9mLWJvdW5kcyAoT09CKSByZWFkcy4gVGhlc2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgKFVBRiBhbmQgT09CIGhlYXAgcmVhZHMpIGZhbGwgc3RyaWN0bHkgdW5kZXIgS0FTQU4mIzM5O3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gXG5cbkZyb20gYSBLTVNBTiBwZXJzcGVjdGl2ZSwgdGhlIG5ldyBncm91cHMgYnVmZmVyIGlzIGFsbG9jYXRlZCB1c2luZyBga3phbGxvYygpYCB3aGljaCB6ZXJvZXMgdGhlIGVudGlyZSBhbGxvY2F0aW9uLCBmb2xsb3dlZCBieSBjb3B5aW5nIGV4aXN0aW5nIGdyb3VwIGRhdGE7IHRodXMsIGFsbCBieXRlcyBvZiB0aGUgYnVmZmVyIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgcHVibGljYXRpb24uIE5vIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIHN0cnVjdCBwYWRkaW5ncywgb3IgdW5pbml0aWFsaXplZCBkYXRhIGxlYWtzIHRvIHVzZXJzcGFjZSBhcmUgaW50cm9kdWNlZCBvciBleHBvc2VkLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzKSBhY3Jvc3MgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBza19kaWFnX2R1bXBfZ3JvdXBzKCksIGFuZCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nIGNvbmN1cnJlbmN5IGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgbmV0bGluayBzb2NrZXQgYmluZC9zZXRzb2Nrb3B0LCBzb2NrX2RpYWcgZHVtcCwgYW5kIC9wcm9jL25ldC9uZXRsaW5rIHJlYWRzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBkZXRlY3QgcG90ZW50aWFsIGRhdGEgcmFjZXMsIG1lbW9yeSBvcmRlcmluZyBpc3N1ZXMsIG9yIFVBRnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6Mjg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jXG5pbmRleCBlNmIxZDk3NThjOWM5Li45ZmRmOTY0MjI0YWI0IDEwMDY0NFxuLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcbkBAIC05MjIsOSAmIzQzOzkyMiw5IEBAIG5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcbiBcbiBzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XG4gXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xuIFx0dW5zaWduZWQgaW50IGdyb3Vwcztcbi1cdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHM7XG4gXHRpbnQgZXJyID0gMDtcbiBcbiBcdG5ldGxpbmtfdGFibGVfZ3JhYigpO1xuQEAgLTkzOCwxOCAmIzQzOzkzOCwzNyBAQCBzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIFx0aWYgKG5say1cdTAwM2VuZ3JvdXBzIFx1MDAzZT0gZ3JvdXBzKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4tXHRuZXdfZ3JvdXBzID0ga3JlYWxsb2MobmxrLVx1MDAzZWdyb3VwcywgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTtcbi1cdGlmIChuZXdfZ3JvdXBzID09IE5VTEwpIHtcbiYjNDM7XHQvKiBDYW4gbm90IHVzZSBrcmVhbGxvYygpLCBiZWNhdXNlIHRoZSBvbGQgYnVmZmVyIG1pZ2h0IGJlIGZyZWVkXG4mIzQzO1x0ICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZFxuJiM0MztcdCAqIC9wcm9jL25ldC9uZXRsaW5rKSBjYW4gc3RpbGwgYmUgbG9va2luZyBhdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuJiM0MztcdGlmICghbmV3X2dyb3Vwcykge1xuIFx0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXHR9XG4tXHRtZW1zZXQoKGNoYXIgKiluZXdfZ3JvdXBzICYjNDM7IE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpLCAwLFxuLVx0ICAgICAgIE5MR1JQU1ooZ3JvdXBzKSAtIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpKTtcbiYjNDM7XHRvbGRfZ3JvdXBzID0gbmxrLVx1MDAzZWdyb3VwcztcbiYjNDM7XHRpZiAob2xkX2dyb3VwcylcbiYjNDM7XHRcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4mIzQzO1xuJiM0MztcdC8qIFB1Ymxpc2ggdGhlIG5ldyBiaXRtYXAgYW5kIGl0cyBjb250ZW50OiBwYWlycyB3aXRoIHRoZSBhZGRyZXNzXG4mIzQzO1x0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcbiYjNDM7XHQgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLVx1MDAzZW5ncm91cHMuXG4mIzQzO1x0ICovXG4mIzQzO1x0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XG4mIzQzO1xuJiM0MztcdC8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb21cbiYjNDM7XHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG4mIzQzO1x0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZubGstXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcbiBcbi1cdG5say1cdTAwM2Vncm91cHMgPSBuZXdfZ3JvdXBzO1xuLVx0bmxrLVx1MDAzZW5ncm91cHMgPSBncm91cHM7XG4gIG91dF91bmxvY2s6XG4gXHRuZXRsaW5rX3RhYmxlX3VuZ3JhYigpO1xuJiM0MztcbiYjNDM7XHRpZiAob2xkX2dyb3VwcylcbiYjNDM7XHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xuJiM0MztcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTI3MDUsMTIgJiM0MzsyNzI0LDE5IEBAIHN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4gXHR9IGVsc2Uge1xuIFx0XHRzdHJ1Y3Qgc29jayAqcyA9IHY7XG4gXHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzKTtcbiYjNDM7XHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgKmdyb3VwcztcbiYjNDM7XG4mIzQzO1x0XHQvKiBMb2NrbGVzcyByZWFkIDogbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiBjaGFuZ2VcbiYjNDM7XHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG4mIzQzO1x0XHQgKiBSQ1UgZ3JhY2UgcGVyaW9kLCBhbmQgdGhpcyB3YWxrIGlzIFJDVSBwcm90ZWN0ZWQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbiBcbiBcdFx0c2VxX3ByaW50ZihzZXEsIFwmIzM0OyVwSyAlLTNkICUtMTB1ICUwOHggJS04ZCAlLThkICUtNWQgJS04ZCAlLTh1ICUtOGxsdVxcblwmIzM0OyxcbiBcdFx0XHQgICBzLFxuIFx0XHRcdCAgIHMtXHUwMDNlc2tfcHJvdG9jb2wsXG4gXHRcdFx0ICAgbmxrLVx1MDAzZXBvcnRpZCxcbi1cdFx0XHQgICBubGstXHUwMDNlZ3JvdXBzID8gKHUzMilubGstXHUwMDNlZ3JvdXBzWzBdIDogMCxcbiYjNDM7XHRcdFx0ICAgZ3JvdXBzID8gKHUzMilncm91cHNbMF0gOiAwLFxuIFx0XHRcdCAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIHNrX3dtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIFJFQURfT05DRShubGstXHUwMDNlY2JfcnVubmluZyksXG5kaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZGlhZy5jIGIvbmV0L25ldGxpbmsvZGlhZy5jXG5pbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NFxuLS0tIGEvbmV0L25ldGxpbmsvZGlhZy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvbmV0bGluay9kaWFnLmNcbkBAIC0xMiwxMiAmIzQzOzEyLDI0IEBAXG4gc3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuIHtcbiBcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4tXG4tXHRpZiAobmxrLVx1MDAzZWdyb3VwcyA9PSBOVUxMKVxuJiM0MztcdHVuc2lnbmVkIGxvbmcgKmdyb3VwcztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbmdyb3VwcztcbiYjNDM7XG4mIzQzO1x0LyogSGFzaGVkIHNvY2tldHMgYXJlIGR1bXBlZCBmcm9tIHRoZSByaGFzaHRhYmxlIHdhbGssIHdoaWNoIG9ubHlcbiYjNDM7XHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxuJiM0MztcdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG4mIzQzO1x0ICogZnJvbSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNvIHRoYXQgd2UgY2FuIG5vdCB1c2UgdGhlIG5ld1xuJiM0MztcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXG4mIzQzO1x0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRuZ3JvdXBzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZubGstXHUwMDNlbmdyb3Vwcyk7XG4mIzQzO1x0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuJiM0MztcdGlmICghZ3JvdXBzKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHJldHVybiBubGFfcHV0KG5sc2tiLCBORVRMSU5LX0RJQUdfR1JPVVBTLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSxcbi1cdFx0ICAgICAgIG5say1cdTAwM2Vncm91cHMpO1xuJiM0MztcdHJldHVybiBubGFfcHV0KG5sc2tiLCBORVRMSU5LX0RJQUdfR1JPVVBTLCBOTEdSUFNaKG5ncm91cHMpLCBncm91cHMpO1xuIH1cbiBcbiBzdGF0aWMgaW50IHNrX2RpYWdfcHV0X2ZsYWdzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORVRMSU5LX0RJQUcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25ldGxpbmtfcmVhbGxvY19ncm91cHMmIzM0OywKICAgICYjMzQ7c2tfZGlhZ19kdW1wX2dyb3VwcyYjMzQ7LAogICAgJiMzNDtuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzKSBhY3Jvc3MgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBza19kaWFnX2R1bXBfZ3JvdXBzKCksIGFuZCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nIGNvbmN1cnJlbmN5IGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgbmV0bGluayBzb2NrZXQgYmluZC9zZXRzb2Nrb3B0LCBzb2NrX2RpYWcgZHVtcCwgYW5kIC9wcm9jL25ldC9uZXRsaW5rIHJlYWRzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBkZXRlY3QgcG90ZW50aWFsIGRhdGEgcmFjZXMsIG1lbW9yeSBvcmRlcmluZyBpc3N1ZXMsIG9yIFVBRnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggZTZiMWQ5NzU4YzljOS4uOWZkZjk2NDIyNGFiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtOTIyLDkgJiM0Mzs5MjIsOSBAQCBuZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpCiAKIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCXVuc2lnbmVkIGludCBncm91cHM7Ci0JdW5zaWduZWQgbG9uZyAqbmV3X2dyb3VwczsKIAlpbnQgZXJyID0gMDsKIAogCW5ldGxpbmtfdGFibGVfZ3JhYigpOwpAQCAtOTM4LDE4ICYjNDM7OTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiAJaWYgKG5say0mZ3Q7bmdyb3VwcyAmZ3Q7PSBncm91cHMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCW5ld19ncm91cHMgPSBrcmVhbGxvYyhubGstJmd0O2dyb3VwcywgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTsKLQlpZiAobmV3X2dyb3VwcyA9PSBOVUxMKSB7CiYjNDM7CS8qIENhbiBub3QgdXNlIGtyZWFsbG9jKCksIGJlY2F1c2UgdGhlIG9sZCBidWZmZXIgbWlnaHQgYmUgZnJlZWQKJiM0MzsJICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZAomIzQzOwkgKiAvcHJvYy9uZXQvbmV0bGluaykgY2FuIHN0aWxsIGJlIGxvb2tpbmcgYXQgaXQuCiYjNDM7CSAqLwomIzQzOwluZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpOwomIzQzOwlpZiAoIW5ld19ncm91cHMpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQltZW1zZXQoKGNoYXIgKiluZXdfZ3JvdXBzICYjNDM7IE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwgMCwKLQkgICAgICAgTkxHUlBTWihncm91cHMpIC0gTkxHUlBTWihubGstJmd0O25ncm91cHMpKTsKJiM0MzsJb2xkX2dyb3VwcyA9IG5say0mZ3Q7Z3JvdXBzOwomIzQzOwlpZiAob2xkX2dyb3VwcykKJiM0MzsJCW1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say0mZ3Q7bmdyb3VwcykpOwomIzQzOwomIzQzOwkvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzcwomIzQzOwkgKiBkZXBlbmRlbmN5IGluIGxvY2tsZXNzIHJlYWRlcnMsIHdoaWNoIGNhbiBwaWNrIHVwIHRoZSBuZXcgcG9pbnRlcgomIzQzOwkgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLSZndDtuZ3JvdXBzLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O2dyb3VwcywgbmV3X2dyb3Vwcyk7CiYjNDM7CiYjNDM7CS8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb20KJiM0MzsJICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKQomIzQzOwkgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O25ncm91cHMsIGdyb3Vwcyk7CiAKLQlubGstJmd0O2dyb3VwcyA9IG5ld19ncm91cHM7Ci0JbmxrLSZndDtuZ3JvdXBzID0gZ3JvdXBzOwogIG91dF91bmxvY2s6CiAJbmV0bGlua190YWJsZV91bmdyYWIoKTsKJiM0MzsKJiM0MzsJaWYgKG9sZF9ncm91cHMpCiYjNDM7CQlrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKTsKJiM0MzsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzA1LDEyICYjNDM7MjcyNCwxOSBAQCBzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogCX0gZWxzZSB7CiAJCXN0cnVjdCBzb2NrICpzID0gdjsKIAkJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpOwomIzQzOwkJY29uc3QgdW5zaWduZWQgbG9uZyAqZ3JvdXBzOwomIzQzOwomIzQzOwkJLyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlCiYjNDM7CQkgKiBubGstJmd0O2dyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW4KJiM0MzsJCSAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC4KJiM0MzsJCSAqLwomIzQzOwkJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKIAogCQlzZXFfcHJpbnRmKHNlcSwgJiMzNDslcEsgJS0zZCAlLTEwdSAlMDh4ICUtOGQgJS04ZCAlLTVkICUtOGQgJS04dSAlLThsbHVcbiYjMzQ7LAogCQkJICAgcywKIAkJCSAgIHMtJmd0O3NrX3Byb3RvY29sLAogCQkJICAgbmxrLSZndDtwb3J0aWQsCi0JCQkgICBubGstJmd0O2dyb3VwcyA/ICh1MzIpbmxrLSZndDtncm91cHNbMF0gOiAwLAomIzQzOwkJCSAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCwKIAkJCSAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLAogCQkJICAgc2tfd21lbV9hbGxvY19nZXQocyksCiAJCQkgICBSRUFEX09OQ0UobmxrLSZndDtjYl9ydW5uaW5nKSwKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuYwppbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9kaWFnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L25ldGxpbmsvZGlhZy5jCkBAIC0xMiwxMiAmIzQzOzEyLDI0IEBACiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpCiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKLQotCWlmIChubGstJmd0O2dyb3VwcyA9PSBOVUxMKQomIzQzOwl1bnNpZ25lZCBsb25nICpncm91cHM7CiYjNDM7CXVuc2lnbmVkIGludCBuZ3JvdXBzOwomIzQzOwomIzQzOwkvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seQomIzQzOwkgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZQomIzQzOwkgKiBubGstJmd0O2dyb3VwcyBhbmQgbmxrLSZndDtuZ3JvdXBzIGF0IGFueSB0aW1lLgomIzQzOwkgKgomIzQzOwkgKiBSZWFkIG5say0mZ3Q7bmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpCiYjNDM7CSAqIGZyb20gbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBzbyB0aGF0IHdlIGNhbiBub3QgdXNlIHRoZSBuZXcKJiM0MzsJICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXMKJiM0MzsJICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC4KJiM0MzsJICovCiYjNDM7CW5ncm91cHMgPSBzbXBfbG9hZF9hY3F1aXJlKCZhbXA7bmxrLSZndDtuZ3JvdXBzKTsKJiM0MzsJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJaWYgKCFncm91cHMpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwKLQkJICAgICAgIG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7CiB9CiAKIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjA5CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgU3VpdGFiaWxpdHkgQW5hbHlzaXM6IE5ldGxpbmsgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2ggYW5kIGRlY2lkZSBpZiBpdCYjMzk7cyB3b3J0aCBvdXIgdGltZSBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBGcm9tIGEgc2FmZXR5IHBlcnNwZWN0aXZlLCB0aGlzIGlzIGEgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCB0cmlhZ2UgdGFzayDigJMgYmVuaWduIGRldmVsb3BlciBRQSwgcGFydCBvZiB0aGUgbm9ybWFsIG1haW50ZW5hbmNlIGFuZCBkZWZlbnNpdmUgc2VjdXJpdHkgd29ya2Zsb3cuCgpBbHJpZ2h0LCB0aGUgcGF0Y2ggbW9kaWZpZXMgYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AgYW5kIGBuZXQvbmV0bGluay9kaWFnLmNgLiBTcGVjaWZpY2FsbHksIEkgc2VlIGNoYW5nZXMgaW4gYG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKWAgcmVwbGFjaW5nIGBrcmVhbGxvYygpYCB3aXRoIGBremFsbG9jKClgLCBgbWVtY3B5KClgLCBhdG9taWMgc3RvcmVzIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAoKWAsIGFuZCByZWxhdGVkIGNoYW5nZXMgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYC4KClRoaXMgaXMgY29yZSBuZXR3b3JraW5nIGNvZGUsIHNwZWNpZmljYWxseSBOZXRsaW5rLiBOZXRsaW5rIGlzIGRlZmluaXRlbHkgYSBwcmltZSB0YXJnZXQsIGl0JiMzOTtzIHByZXR0eSBtdWNoIGV2ZXJ5d2hlcmUsIGFuZCByZWFjaGFibGUgdmlhIHVucHJpdmlsZWdlZCB1c2VyIHNvY2tldHMg4oCTIGBzb2NrZXQoQUZfTkVUTElOSywgLi4uKWAsIGRpYWcgaW50ZXJmYWNlcyAoYE5FVExJTktfSU5FVF9ESUFHYCwgYE5FVExJTktfRElBR2ApLCBldmVuIGFjY2Vzc2libGUgdmlhIGAvcHJvYy9uZXQvbmV0bGlua2AuCgpOb3csIGxldCYjMzk7cyBhcHBseSB0aGUgZnV6emluZyBjcml0ZXJpYS4gV2UgYXJlIGxvb2tpbmcgZm9yICYjMzQ7UmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSYjMzQ7IGFuZCBpdCBpczoKCi0gICBDb3JlIFN1YnN5c3RlbXM6ICoqQ29yZSBuZXR3b3JraW5nISoqCgotICAgUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOiAqKlJlc3RydWN0dXJpbmcgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb2RlIGZsb3chKioKCi0gICBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOiAqKk5ldGxpbmsgdmlhIHNvY2tldHMhKioKClllYWgsIGl0JiMzOTtzIGNsZWFyOiBgV29ydGhGdXp6aW5nID0gdHJ1ZWAhIEkgZG9uJiMzOTt0IG5lZWQgdG8gZGlnIGRlZXBlci4gVGhpcyBwYXRjaCBkZWZpbml0ZWx5IG1lZXRzIHRoZSBjcml0ZXJpYS4KCk5vdywgSSYjMzk7bGwgcHJvYmFibHkgZ28gdGhyb3VnaCBhbmQgdXNlIGdpdCBkaWZmIG9yIGdyZXAgb24gdGhlIHJlcG8gdG8gZG91YmxlLWNoZWNrIGV4YWN0IGZ1bmN0aW9uIGNhbGxlcnMsIGFuZCBtYXliZSBwb2tlIGFyb3VuZCBhdCBzb21lIHJlbGV2YW50IGNvbmZpZ3MganVzdCB0byBnZXQgYW4gb3ZlcmFsbCBzZW5zZSBmb3IgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmV0bGlua19yZWFsbG9jX2dyb3VwcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz05MTI9bmV0bGlua191cGRhdGVfc3Vic2NyaXB0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBzdWJzY3JpcHRpb25zKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjItXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6OTIzOnN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTI0LXtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTg5PXN0YXRpYyBpbnQgbmV0bGlua19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICphZGRyLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEwLVx0XHRcdHJldHVybiAtRVBFUk07XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTAxMTpcdFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTAxMi1cdFx0aWYgKGVycilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTY2Nz1zdGF0aWMgaW50IG5ldGxpbmtfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkxLVx0XHRcdHJldHVybiAtRVBFUk07XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTY5MjpcdFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY5My1cdFx0aWYgKGVycilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzI4LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3Mjk6XHRcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzAtXHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jPTEyPXN0YXRpYyBpbnQgc2tfZGlhZ19kdW1wX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpubHNrYilcbi0tXG5uZXQvbmV0bGluay9kaWFnLmMtMTgtXHQvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seVxubmV0L25ldGxpbmsvZGlhZy5jOjE5Olx0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2Vcbm5ldC9uZXRsaW5rL2RpYWcuYy0yMC1cdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYy0yMi1cdCAqIFJlYWQgbmxrLVx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxubmV0L25ldGxpbmsvZGlhZy5jOjIzOlx0ICogZnJvbSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNvIHRoYXQgd2UgY2FuIG5vdCB1c2UgdGhlIG5ld1xubmV0L25ldGxpbmsvZGlhZy5jLTI0LVx0ICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1OTA5CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBLY29uZmlnIGZpbGVzLCB0aGlua2luZyBsaWtlIGFuIGV4cGVydDoKCioqRGl2aW5nIGludG8gdGhlIE5ldGxpbmsgRGlhZ25vc3RpYyBQbHVtYmluZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgZm9yIG5ldGxpbmsgZGlhZ25vc3RpY3MuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiBgbmV0L25ldGxpbmsvZGlhZy5jYCBhbmQgYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AuIEkgZXhwZWN0IHRoZXNlIGZpbGVzIGNvbnRhaW4gdGhlIGNvcmUgbG9naWMgZm9yIHRoZSBOZXRsaW5rIGRpYWdub3N0aWMgaW50ZXJmYWNlLCBhbmQgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBmYW1pbHkgaW1wbGVtZW50YXRpb24uCgpJJiMzOTtsbCBiZSBsb29raW5nIGZvciB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgY29udHJvbCB0aGVpciBjb21waWxhdGlvbi4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gZGVwZW5kZW5jaWVzIG9uIG90aGVyIE5ldGxpbmsgZmVhdHVyZXMsIGxpa2UgdGhlIGNvcmUgTmV0bGluayBzdXBwb3J0IChgTkVUTElOS2ApIGl0c2VsZiwgZGlmZmVyZW50IE5ldGxpbmsgbWVzc2FnZSB0eXBlcywgYW5kIHBvdGVudGlhbGx5IGV2ZW4gc3BlY2lmaWMgc29ja2V0IHR5cGVzIG9yIHByb3RvY29scyBidWlsdCBvbiBOZXRsaW5rLiBJJiMzOTtsbCBhbHNvIGNoZWNrIGZvciBvcHRpb25zIHRoYXQgbWlnaHQgZW5hYmxlIG9yIGRpc2FibGUgc3BlY2lmaWMgZGlhZ25vc3RpYyBtZXNzYWdlIHR5cGVzIG9yIGZlYXR1cmVzIHdpdGhpbiB0aGVzZSBmaWxlcy4gSXQmIzM5O3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIGhvdyBkZWVwbHkgdGhlIGRpYWdub3N0aWMgY29kZSBpcyBpbnRlZ3JhdGVkIGFuZCB3aGF0IG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgYXJlIHJlcXVpcmVkIG9yIGltcGFjdGVkIHdoZW4gZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGRpYWdub3N0aWMgZnVuY3Rpb25hbGl0aWVzIGZvciBOZXRsaW5rLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2RpYWdcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvTWFrZWZpbGU9Nj1vYmoteSAgXHRcdFx0XHQ6PSBhZl9uZXRsaW5rLm8gZ2VuZXRsaW5rLm8gcG9saWN5Lm9cbm5ldC9uZXRsaW5rL01ha2VmaWxlLTctXG5uZXQvbmV0bGluay9NYWtlZmlsZTo4Om9iai0kKENPTkZJR19ORVRMSU5LX0RJQUcpXHQmIzQzOz0gbmV0bGlua19kaWFnLm9cbm5ldC9uZXRsaW5rL01ha2VmaWxlOjk6bmV0bGlua19kaWFnLXlcdFx0XHQ6PSBkaWFnLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2Mjc2CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBOZXRsaW5rIERpYWdub3N0aWNzKioKCk9rYXksIHNvIEkmIzM5O20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaWYgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBOZXRsaW5rIGRpYWdub3N0aWNzIGhlcmUuIFRoZSBmaXJzdCB0aGluZyBJJiMzOTtkIGRvIGlzIGltbWVkaWF0ZWx5IGNoZWNrIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIHNlZSBpZiBgQ09ORklHX05FVExJTktfRElBR2AgaXMgZXZlbiBlbmFibGVkLiBUaGF0JiMzOTtzIHRoZSBiYXNlbGluZSwgcmlnaHQ/IEl0JiMzOTtzIGxpa2UgY2hlY2tpbmcgdGhlIGZ1c2UgYm94IGJlZm9yZSBJIHN0YXJ0IHRyb3VibGVzaG9vdGluZyB0aGUgZWxlY3RyaWNhbCBzeXN0ZW0uIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBpbiBgbmV0L25ldGxpbmsvS2NvbmZpZ2Agb3IsIGhlY2ssIG1heWJlIGl0JiMzOTtzIGRlZmluZWQgZWxzZXdoZXJlLiBHb3R0YSBiZSB0aG9yb3VnaC4gVGltZSB0byBjcmFjayBvcGVuIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBzZWUgd2hhdCYjMzk7cyB3aGF0LiBHb3R0YSBtYWtlIHN1cmUgdGhpcyBkaWFnbm9zdGljIHN1cHBvcnQgaXMgYWN0dWFsbHkgY29tcGlsZWQgaW4gYmVmb3JlIEkgZ28gY2hhc2luZyBzaGFkb3dzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBORVRMSU5LX0RJQUcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvS2NvbmZpZy01LVxubmV0L25ldGxpbmsvS2NvbmZpZzo2OmNvbmZpZyBORVRMSU5LX0RJQUdcbm5ldC9uZXRsaW5rL0tjb25maWctNy1cdHRyaXN0YXRlIFwmIzM0O05FVExJTks6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY1NTEKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSBgbmV0L25ldGxpbmsvS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDYsIGFzIHRob3VnaCBJIHdlcmUgcG9uZGVyaW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgTmV0bGluayBDb25maWd1cmF0aW9uKioKCk9rYXksIHRpbWUgdG8gZ2V0IGEgZ29vZCBncmlwIG9uIGhvdyB0aGlzIE5ldGxpbmsgc3Vic3lzdGVtIGNvbmZpZ3VyZXMgaXRzZWxmLiBMZXQmIzM5O3Mgc2VlLi4uIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCB0aGF0IGBLY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNiwgdG8gZ2V0IHRoZSBsYXkgb2YgdGhlIGxhbmQuIEkga25vdyB0aGlzIGZpbGUgaG9sZHMgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG9wdGlvbnMsIHNvIHRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNyaXRpY2FsIGRlY2lzaW9ucyBhYm91dCB3aGljaCBOZXRsaW5rIGZlYXR1cmVzIGdldCBidWlsdCBpbnRvIHRoZSBrZXJuZWwgYXJlIG1hZGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIGNvcmUgZGVwZW5kZW5jaWVzIGFyZS4gSSYjMzk7bSBob3BpbmcgdG8gdW5kZXJzdGFuZCB3aGF0IGFyZSB0aGUgKmJhc2UqIGZlYXR1cmVzIGFuZCB3aGF0IGRlcGVuZHMgb24gd2hhdC4gVGhpcyBpcyBjcnVjaWFsIGZvciBjdXN0b21pemluZyBhIGtlcm5lbCBlZmZlY3RpdmVseSwgb3IgdHJvdWJsZXNob290aW5nIGJ1aWxkIGlzc3Vlcy4gV2hhdCBhcmUgdGhlIGtleSBzd2l0Y2hlcyBmb3IgaW5jbHVkaW5nIE5ldGxpbmsgc3VwcG9ydCwgYW5kIHdoYXQgYXJlIHRoZWlyIGRlcGVuZGVuY2llcz8gVW5kZXJzdGFuZGluZyB0aGVzZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaXMgYWJzb2x1dGVseSBmdW5kYW1lbnRhbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0I1xuICAgMzpcdCMgTmV0bGluayBTb2NrZXRzXG4gICA0Olx0I1xuICAgNTpcdFxuICAgNjpcdGNvbmZpZyBORVRMSU5LX0RJQUdcbiAgIDc6XHRcdHRyaXN0YXRlIFwmIzM0O05FVExJTks6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVwmIzM0O1xuICAgODpcdFx0ZGVmYXVsdCBuXG4gICA5Olx0XHRoZWxwXG4gIDEwOlx0XHQgIFN1cHBvcnQgZm9yIE5FVExJTksgc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNzIHRvb2wuXG4gIDExOlx0XHQgIElmIHVuc3VyZSwgc2F5IFkuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5MjcKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgTmV0bGluayBNb2R1bGUgRGVlcCBEaXZlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYnVpbGQgcHJvY2VzcyBmb3IgdGhlIE5ldGxpbmsgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYGFmX25ldGxpbmsuY2AuIEdvb2QsIGl0JiMzOTtzIGFsd2F5cyBpbmNsdWRlZDsgYG9iai15YCBtZWFucyB0aGF0IGZpbGUsIGFsb25nIHdpdGggYGdlbmV0bGluay5vYCBhbmQgYHBvbGljeS5vYCwgYXJlIGFsd2F5cyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIE5vIHN1cnByaXNlcyB0aGVyZS4KCk5vdywgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgZGlhZ25vc3RpYyBpbnRlcmZhY2UuIGBkaWFnLmNgIGlzIG9ubHkgYnVpbHQgaWYgYENPTkZJR19ORVRMSU5LX0RJQUdgIGlzIHNldC4gUmlnaHQsIGxldCYjMzk7cyBjb25maXJtLiBJdCYjMzk7cyBqdXN0IGEgY29uZmlnIG9wdGlvbiwgbm8gZGVwZW5kZW5jaWVzLiBDbGVhbiBhbmQgc2ltcGxlLiBCdXQgSSB3b25kZXIgYWJvdXQgcHJvY2ZzIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLi4uIEkga25vdyB0aGF0JiMzOTtzIHJlbGF0ZWQgdG8gZGlhZ25vc3RpY3MuIEkgdGhpbmsgSSYjMzk7bGwgaGF2ZSB0byBkZWx2ZSBpbnRvIGBhZl9uZXRsaW5rLmNgIG5lYXIgdGhlIGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd2AgZnVuY3Rpb24sIGFyb3VuZCBsaW5lcyAyNzAwLTI4MDAsIHRvIHNlZSBob3cgdGhhdCBob29rIHdvcmtzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI3MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjcwMDpcdFxuMjcwMTpcdHN0YXRpYyB2b2lkICpuZXRsaW5rX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcylcbjI3MDI6XHR7XG4yNzAzOlx0XHQmIzQzOyYjNDM7KnBvcztcbjI3MDQ6XHRcdHJldHVybiBfX25ldGxpbmtfc2VxX25leHQoc2VxKTtcbjI3MDU6XHR9XG4yNzA2Olx0XG4yNzA3Olx0c3RhdGljIHZvaWQgbmV0bGlua19uYXRpdmVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4yNzA4Olx0e1xuMjcwOTpcdFx0c3RydWN0IG5sX3NlcV9pdGVyICppdGVyID0gc2VxLVx1MDAzZXByaXZhdGU7XG4yNzEwOlx0XG4yNzExOlx0XHRpZiAoaXRlci1cdTAwM2VsaW5rIFx1MDAzZT0gTUFYX0xJTktTKVxuMjcxMjpcdFx0XHRyZXR1cm47XG4yNzEzOlx0XG4yNzE0Olx0XHRuZXRsaW5rX3dhbGtfc3RvcChpdGVyKTtcbjI3MTU6XHR9XG4yNzE2Olx0XG4yNzE3Olx0XG4yNzE4Olx0c3RhdGljIGludCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbjI3MTk6XHR7XG4yNzIwOlx0XHRpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHtcbjI3MjE6XHRcdFx0c2VxX3B1dHMoc2VxLFxuMjcyMjpcdFx0XHRcdCBcJiMzNDtzayAgICAgICAgICAgICAgIEV0aCBQaWQgICAgICAgIEdyb3VwcyAgIFwmIzM0O1xuMjcyMzpcdFx0XHRcdCBcJiMzNDtSbWVtICAgICBXbWVtICAgICBEdW1wICBMb2NrcyAgICBEcm9wcyAgICBJbm9kZVxcblwmIzM0Oyk7XG4yNzI0Olx0XHR9IGVsc2Uge1xuMjcyNTpcdFx0XHRzdHJ1Y3Qgc29jayAqcyA9IHY7XG4yNzI2Olx0XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzKTtcbjI3Mjc6XHRcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyAqZ3JvdXBzO1xuMjcyODpcdFxuMjcyOTpcdFx0XHQvKiBMb2NrbGVzcyByZWFkIDogbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiBjaGFuZ2VcbjI3MzA6XHRcdFx0ICogbmxrLVx1MDAzZWdyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW5cbjI3MzE6XHRcdFx0ICogUkNVIGdyYWNlIHBlcmlvZCwgYW5kIHRoaXMgd2FsayBpcyBSQ1UgcHJvdGVjdGVkLlxuMjczMjpcdFx0XHQgKi9cbjI3MzM6XHRcdFx0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuMjczNDpcdFxuMjczNTpcdFx0XHRzZXFfcHJpbnRmKHNlcSwgXCYjMzQ7JXBLICUtM2QgJS0xMHUgJTA4eCAlLThkICUtOGQgJS01ZCAlLThkICUtOHUgJS04bGx1XFxuXCYjMzQ7LFxuMjczNjpcdFx0XHRcdCAgIHMsXG4yNzM3Olx0XHRcdFx0ICAgcy1cdTAwM2Vza19wcm90b2NvbCxcbjI3Mzg6XHRcdFx0XHQgICBubGstXHUwMDNlcG9ydGlkLFxuMjczOTpcdFx0XHRcdCAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCxcbjI3NDA6XHRcdFx0XHQgICBza19ybWVtX2FsbG9jX2dldChzKSxcbjI3NDE6XHRcdFx0XHQgICBza193bWVtX2FsbG9jX2dldChzKSxcbjI3NDI6XHRcdFx0XHQgICBSRUFEX09OQ0UobmxrLVx1MDAzZWNiX3J1bm5pbmcpLFxuMjc0MzpcdFx0XHRcdCAgIHJlZmNvdW50X3JlYWQoXHUwMDI2cy1cdTAwM2Vza19yZWZjbnQpLFxuMjc0NDpcdFx0XHRcdCAgIHNrX2Ryb3BzX3JlYWQocyksXG4yNzQ1Olx0XHRcdFx0ICAgc29ja19pX2lubyhzKVxuMjc0NjpcdFx0XHRcdCk7XG4yNzQ3Olx0XG4yNzQ4Olx0XHR9XG4yNzQ5Olx0XHRyZXR1cm4gMDtcbjI3NTA6XHR9XG4yNzUxOlx0XG4yNzUyOlx0I2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuMjc1MzpcdHN0cnVjdCBicGZfaXRlcl9fbmV0bGluayB7XG4yNzU0Olx0XHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XG4yNzU1Olx0XHRfX2JwZl9tZF9wdHIoc3RydWN0IG5ldGxpbmtfc29jayAqLCBzayk7XG4yNzU2Olx0fTtcbjI3NTc6XHRcbjI3NTg6XHRERUZJTkVfQlBGX0lURVJfRlVOQyhuZXRsaW5rLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSwgc3RydWN0IG5ldGxpbmtfc29jayAqc2spXG4yNzU5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyNDQKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBVc2FnZSoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBrZXJuZWwgY29kZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSB1dGlsaXphdGlvbiBvZiBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgY29udGV4dHMgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSAqY2FsbGVkKi4gVGhlIG5hbWUgaXRzZWxmIHN1Z2dlc3RzIGEgc2VxdWVuY2UtYmFzZWQgZGlzcGxheSwgc28gaXQmIzM5O3MgcHJvYmFibHkgcmVsYXRlZCB0byBzb21lIHNvcnQgb2YgbmV0bGluayBkYXRhIHByZXNlbnRhdGlvbiwgcGVyaGFwcyBmb3IgbW9uaXRvcmluZyBvciBkZWJ1Z2dpbmcuIExldCYjMzk7cyBzZWUgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIHVzZWQ7IEkgbmVlZCB0byBmaW5kIHRoZSBjYWxsIHNpdGVzIHdpdGhpbiB0aGUga2VybmVsIHNvdXJjZS4gVGhhdCYjMzk7bGwgZ2l2ZSBtZSB0aGUgZXNzZW50aWFsIGNvbnRleHQgSSBuZWVkIHRvIHJlYWxseSB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlIGFuZCByb2xlIHdpdGhpbiB0aGUgd2lkZXIgbmV0bGluayBpbmZyYXN0cnVjdHVyZS4gVGhlbiBJIGNhbiB1bmRlcnN0YW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgYmlnZ2VyIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25ldGxpbmtfbmF0aXZlX3NlcV9zaG93JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3MDc9c3RhdGljIHZvaWQgbmV0bGlua19uYXRpdmVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MTctXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjcxODpzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MTkte1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzcyPXN0YXRpYyBpbnQgbmV0bGlua19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjc3OS1cdGlmICghcHJvZylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzgwOlx0XHRyZXR1cm4gbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc2VxLCB2KTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzgxLVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODAzPXN0YXRpYyBpbnQgbmV0bGlua19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODA1Olx0cmV0dXJuIG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHNlcSwgdik7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgwNi19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg4MjIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBOZXRsaW5rIFNlcXVlbmNlIFNob3cgRnVuY3Rpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGludG8gdGhlIGAvcHJvYy9uZXQvbmV0bGlua2AgaW50ZXJmYWNlLCB3aGljaCwgYXMgSSByZWNhbGwsIGlzIGNvbXBpbGVkIHdoZW4gYENPTkZJR19QUk9DX0ZTYCBpcyBlbmFibGVkLiBNeSBmb2N1cyBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoZSBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgIGZ1bmN0aW9uLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHBvcHVsYXRpbmcgdGhhdCBwcm9jIGVudHJ5LiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gc2VlIGhvdyBgbmV0bGlua19zZXFfc2hvd2AgaXMgdXNlZCBhbmQgd2hlcmUgd2l0aGluIGBhZl9uZXRsaW5rLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZXRsaW5rX3NlcV9zaG93JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3NjA9c3RhdGljIGludCBuZXRsaW5rX3Byb2dfc2VxX3Nob3coc3RydWN0IGJwZl9wcm9nICpwcm9nLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzcxLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3NzI6c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3NzMte1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzg4PXN0YXRpYyB2b2lkIG5ldGxpbmtfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4MDItI2Vsc2Vcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODAzOnN0YXRpYyBpbnQgbmV0bGlua19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjgxND1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5ldGxpbmtfc2VxX29wcyA9IHtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgxNy1cdC5zdG9wICAgPSBuZXRsaW5rX3NlcV9zdG9wLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MTg6XHQuc2hvdyAgID0gbmV0bGlua19zZXFfc2hvdyxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODE5LX07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkzOTIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZCwgaW4gdGhlIGZpcnN0IHBlcnNvbiBhbmQgdGFyZ2V0ZWQgdG93YXJkcyBhbiBleHBlcnQsIHN0YXJ0aW5nIHdpdGggdGhlIGJvbGRlZCBoZWFkZXI6CgoqKkRpdmluZyBpbnRvIGBuZXRsaW5rX3NlcV9vcHNgIGFuZCB0aGUgUHJvYyBGaWxlc3lzdGVtKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGBuZXRsaW5rX3NlcV9vcHNgIGFuZCB0aGUgcHJvYyBmaWxlc3lzdGVtLiBJdOKAmXMgYmVlbiBhIHdoaWxlIHNpbmNlIEkmIzM5O3ZlIHJlYWxseSBkdWcgaW50byB0aGlzIHNwZWNpZmljIGFyZWEgb2YgdGhlIGtlcm5lbCwgc28gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBxdWlja2x5IHB1dCB0aGUgcGllY2VzIHRvZ2V0aGVyLiBJIHN1c3BlY3QgdGhlcmUgbWlnaHQgYmUgc29tZSBpbnRlcmFjdGlvbiBhcm91bmQgZXhwb3J0aW5nIGtlcm5lbCBpbmZvcm1hdGlvbiBvciBjb25maWd1cmluZyBzb21lIGFzcGVjdHMgdGhyb3VnaCBwcm9jLCB1c2luZyBhIHNlcXVlbmNlIGZpbGUgaW50ZXJmYWNlIGJhY2tlZCBieSBOZXRsaW5rIHRvIGhhbmRsZSB1cGRhdGVzIG9yIHF1ZXJpZXMuIFRoYXQgd291bGQgbWFrZSBzZW5zZSwgYnV0IEkmIzM5O20ganVzdCBndWVzc2luZyBhdCB0aGlzIHBvaW50LgoKVGhlIGBuZXRsaW5rX3NlcV9vcHNgIHN0cnVjdHVyZSBpdHNlbGYgaXMgYSB2aXRhbCBjbHVlLCBwb2ludGluZyB0b3dhcmQgdGhlIHNlcXVlbmNlIGZpbGUgb3BlcmF0aW9ucy4gR2l2ZW4gTmV0bGluayYjMzk7cyBtZXNzYWdlLXBhc3NpbmcgbmF0dXJlLCBJJiMzOTttIGVudmlzaW9uaW5nIGEgc2V0dXAgd2hlcmUgcHJvYyBlbnRyaWVzIGxldmVyYWdlIGBuZXRsaW5rX3NlcV9vcHNgIHRvIGludGVyYWN0IHdpdGgga2VybmVsIGRhdGEgdGhhdCBpcyBkeW5hbWljLCB1cGRhdGVhYmxlLCBvciByZXF1aXJlcyByZWFsLXRpbWUgaW5mb3JtYXRpb24gZXhjaGFuZ2UuIFRoZSBwcm9jIGZpbGVzeXN0ZW0sIGFzIGEgdmlydHVhbCBmaWxlc3lzdGVtLCBhY3RzIGFzIHRoZSBpbnRlcmZhY2UsIGFuZCBgbmV0bGlua19zZXFfb3BzYCBoYW5kbGVzIHRoZSB1bmRlcmx5aW5nIGNvbW11bmljYXRpb24gYW5kIGRhdGEgbWFuaXB1bGF0aW9uLiBUaGUgcXVlc3Rpb24gaXMsIGhvdyBjbGVhbmx5IGludGVncmF0ZWQgYXJlIHRoZXk/IEFyZSB3ZSBkZWFsaW5nIHdpdGggYSB0aWdodCwgd2VsbC1kZWZpbmVkIGFyY2hpdGVjdHVyZSwgb3IgaXMgaXQgYSBtb3JlIGFkLWhvYyBhcnJhbmdlbWVudCB0aGF0IGV2b2x2ZWQgb3ZlciB0aW1lPyBJJiMzOTttIGN1cmlvdXMgYWJvdXQgdGhlIHNwZWNpZmljIHVzZSBjYXNlcy4gV2hhdCBraW5kIG9mIGRhdGEgYXJlIHRoZXkgZXhjaGFuZ2luZz8gSXMgaXQgbW9zdGx5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycywgbW9uaXRvcmluZyBzdGF0aXN0aWNzLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gVGltZSB0byBpbnZlc3RpZ2F0ZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZXRsaW5rX3NlcV9vcHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0bGluayYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjgwOD1zdGF0aWMgdm9pZCBuZXRsaW5rX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODEzLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MTQ6c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBuZXRsaW5rX3NlcV9vcHMgPSB7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgxNS1cdC5zdGFydCAgPSBuZXRsaW5rX3NlcV9zdGFydCxcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjg2MD1zdGF0aWMgaW50IF9fbmV0X2luaXQgbmV0bGlua19uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NjItI2lmZGVmIENPTkZJR19QUk9DX0ZTXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Mjg2MzpcdGlmICghcHJvY19jcmVhdGVfbmV0KFwmIzM0O25ldGxpbmtcJiMzNDssIDAsIG5ldC1cdTAwM2Vwcm9jX25ldCwgXHUwMDI2bmV0bGlua19zZXFfb3BzLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NjQtXHRcdFx0c2l6ZW9mKHN0cnVjdCBubF9zZXFfaXRlcikpKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yOTIyPXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gbmV0bGlua19zZXFfaW5mbyA9IHtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyOTIzOlx0LnNlcV9vcHNcdFx0PSBcdTAwMjZuZXRsaW5rX3NlcV9vcHMsXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjkyNC1cdC5pbml0X3NlcV9wcml2YXRlXHQ9IGJwZl9pdGVyX2luaXRfc2VxX25ldCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAxNjIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYXMgaWYgdGhleSB3ZXJlIG15IG93bjoKCioqTmF2aWdhdGluZyB0aGUgTmV0bGluayBMYW5kc2NhcGUqKgoKUmlnaHQsIGBDT05GSUdfUFJPQ19GU2AuLi4gdGhhdCByaW5ncyBhIGJlbGwuIEl0JiMzOTtzIG9idmlvdXNseSBsaW5rZWQgdG8gdGhhdCBgcHJvY19jcmVhdGVfbmV0KCYjMzQ7bmV0bGluayYjMzQ7LCAuLi4pYCBjYWxsIEkgcmVtZW1iZXIgc2VlaW5nLiBOb3csIEkmIzM5O20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IGEgcGFydGljdWxhciBuZXRsaW5rIHJlbGF0ZWQgY29kZSB3b3JrcyAtIGhvdyBkb2VzIGl0IHdvcmssIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBrZXJuZWw/IEFuZCBJICp0aGluayogaXQgaXMgcmVsYXRlZCB0byBob3cgdGhlIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gaXMgcmVwb3J0ZWQuIFNvLCB3aGF0IGFib3V0IGBkaWFnLmNgPyBUaGF0IGZlZWxzIGxpa2UgYSByZWxldmFudCBmaWxlLCBzcGVjaWZpY2FsbHkgaW4gYG5ldC9uZXRsaW5rL2RpYWcuY2AuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIHRoZXJlLiBMZXQmIzM5O3MgZGlnIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rL2RpYWcuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICAgMzpcdFxuICAgNDpcdCNpbmNsdWRlIFx1MDAzY25ldC9zb2NrLmhcdTAwM2VcbiAgIDU6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXRsaW5rLmhcdTAwM2VcbiAgIDY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9zb2NrX2RpYWcuaFx1MDAzZVxuICAgNzpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGxpbmtfZGlhZy5oXHUwMDNlXG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvcmhhc2h0YWJsZS5oXHUwMDNlXG4gICA5Olx0XG4gIDEwOlx0I2luY2x1ZGUgXCYjMzQ7YWZfbmV0bGluay5oXCYjMzQ7XG4gIDExOlx0XG4gIDEyOlx0c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuICAxMzpcdHtcbiAgMTQ6XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gIDE1Olx0XHR1bnNpZ25lZCBsb25nICpncm91cHM7XG4gIDE2Olx0XHR1bnNpZ25lZCBpbnQgbmdyb3VwcztcbiAgMTc6XHRcbiAgMTg6XHRcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XG4gIDE5Olx0XHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxuICAyMDpcdFx0ICogbmxrLVx1MDAzZWdyb3VwcyBhbmQgbmxrLVx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXG4gIDIxOlx0XHQgKlxuICAyMjpcdFx0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG4gIDIzOlx0XHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XG4gIDI0Olx0XHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xuICAyNTpcdFx0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cbiAgMjY6XHRcdCAqL1xuICAyNzpcdFx0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2bmxrLVx1MDAzZW5ncm91cHMpO1xuICAyODpcdFx0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuICAyOTpcdFx0aWYgKCFncm91cHMpXG4gIDMwOlx0XHRcdHJldHVybiAwO1xuICAzMTpcdFxuICAzMjpcdFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XG4gIDMzOlx0fVxuICAzNDpcdFxuICAzNTpcdHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuICAzNjpcdHtcbiAgMzc6XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gIDM4Olx0XHR1MzIgZmxhZ3MgPSAwO1xuICAzOTpcdFxuICA0MDpcdFx0aWYgKG5say1cdTAwM2VjYl9ydW5uaW5nKVxuICA0MTpcdFx0XHRmbGFncyB8PSBORElBR19GTEFHX0NCX1JVTk5JTkc7XG4gIDQyOlx0XHRpZiAobmxrX3Rlc3RfYml0KFJFQ1ZfUEtUSU5GTywgc2spKVxuICA0MzpcdFx0XHRmbGFncyB8PSBORElBR19GTEFHX1BLVElORk87XG4gIDQ0Olx0XHRpZiAobmxrX3Rlc3RfYml0KEJST0FEQ0FTVF9TRU5EX0VSUk9SLCBzaykpXG4gIDQ1Olx0XHRcdGZsYWdzIHw9IE5ESUFHX0ZMQUdfQlJPQURDQVNUX0VSUk9SO1xuICA0NjpcdFx0aWYgKG5sa190ZXN0X2JpdChSRUNWX05PX0VOT0JVRlMsIHNrKSlcbiAgNDc6XHRcdFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19OT19FTk9CVUZTO1xuICA0ODpcdFx0aWYgKG5sa190ZXN0X2JpdChMSVNURU5fQUxMX05TSUQsIHNrKSlcbiAgNDk6XHRcdFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19MSVNURU5fQUxMX05TSUQ7XG4gIDUwOlx0XHRpZiAobmxrX3Rlc3RfYml0KENBUF9BQ0ssIHNrKSlcbiAgNTE6XHRcdFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19DQVBfQUNLO1xuICA1MjpcdFxuICA1MzpcdFx0cmV0dXJuIG5sYV9wdXRfdTMyKHNrYiwgTkVUTElOS19ESUFHX0ZMQUdTLCBmbGFncyk7XG4gIDU0Olx0fVxuICA1NTpcdFxuICA1NjpcdHN0YXRpYyBpbnQgc2tfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAgNTc6XHRcdFx0XHRzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSAqcmVxLFxuICA1ODpcdFx0XHRcdHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUzMiBmbGFncywgdTY0IHNrX2lubylcbiAgNTk6XHR7XG4gIDYwOlx0XHRzdHJ1Y3Qgbmxtc2doZHIgKm5saDtcbiAgNjE6XHRcdHN0cnVjdCBuZXRsaW5rX2RpYWdfbXNnICpyZXA7XG4gIDYyOlx0XHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xuICA2MzpcdFxuICA2NDpcdFx0bmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIFNPQ0tfRElBR19CWV9GQU1JTFksIHNpemVvZigqcmVwKSxcbiAgNjU6XHRcdFx0XHRmbGFncyk7XG4gIDY2Olx0XHRpZiAoIW5saClcbiAgNjc6XHRcdFx0cmV0dXJuIC1FTVNHU0laRTtcbiAgNjg6XHRcbiAgNjk6XHRcdHJlcCA9IG5sbXNnX2RhdGEobmxoKTtcbiAgNzA6XHRcdHJlcC1cdTAwM2VuZGlhZ19mYW1pbHlcdD0gQUZfTkVUTElOSztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE1NTcKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkmIzM5O3JlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyB0aGUgbmV0bGluayBEaWFnbm9zaXMgQ29kZSoqCgpBbHJpZ2h0LCBJJiMzOTttIGF0IGEgcG9pbnQgd2hlcmUgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBuZXQvbmV0bGluay9kaWFnLmNgIGlzIGFjdHVhbGx5ICp1c2VkKi4gSnVzdCByZWFkaW5nIHRoZSBmdW5jdGlvbnMgaW4gaXNvbGF0aW9uIGlzbiYjMzk7dCBlbm91Z2g7IEkgbmVlZCB0aGUgY29udGV4dC4gV2hlcmUgYXJlIHRoZSBlbnRyeSBwb2ludHM/IFdoYXQgdHJpZ2dlcnMgdGhlc2UgZGlhZ25vc2lzIG1lY2hhbmlzbXM/IEkgbmVlZCB0byB0cmFjZSB0aGUgY2FsbHMsIHRoZSBjYWxsZXIgZnVuY3Rpb25zLCBhbmQgc2VlIGhvdyB0aGUgcGllY2VzIGZpdCB0b2dldGhlci4gU28sIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLCBJ4oCZbSBnb2luZyB0byBleGFtaW5lIHRoZSByZXN0IG9mIHRoZSBmaWxlIHRvIHNlZSBob3cgdGhvc2Ugc3BlY2lmaWMgZnVuY3Rpb25zIHdpdGhpbiBgZGlhZy5jYCBhcmUgaW52b2tlZCB3aXRoaW4gdGhlIE5ldGxpbmsgZnJhbWV3b3JrLiBLbm93aW5nIHRoZSBjYWxscyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGRpYWdub3N0aWMgcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9kaWFnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDcxOlx0XHRyZXAtXHUwMDNlbmRpYWdfdHlwZVx0XHQ9IHNrLVx1MDAzZXNrX3R5cGU7XG4gIDcyOlx0XHRyZXAtXHUwMDNlbmRpYWdfcHJvdG9jb2xcdD0gc2stXHUwMDNlc2tfcHJvdG9jb2w7XG4gIDczOlx0XHRyZXAtXHUwMDNlbmRpYWdfc3RhdGVcdD0gc2stXHUwMDNlc2tfc3RhdGU7XG4gIDc0Olx0XG4gIDc1Olx0XHRyZXAtXHUwMDNlbmRpYWdfaW5vXHRcdD0gc2tfaW5vO1xuICA3NjpcdFx0cmVwLVx1MDAzZW5kaWFnX3BvcnRpZFx0PSBubGstXHUwMDNlcG9ydGlkO1xuICA3NzpcdFx0cmVwLVx1MDAzZW5kaWFnX2RzdF9wb3J0aWRcdD0gbmxrLVx1MDAzZWRzdF9wb3J0aWQ7XG4gIDc4Olx0XHRyZXAtXHUwMDNlbmRpYWdfZHN0X2dyb3VwXHQ9IG5say1cdTAwM2Vkc3RfZ3JvdXA7XG4gIDc5Olx0XHRzb2NrX2RpYWdfc2F2ZV9jb29raWUoc2ssIHJlcC1cdTAwM2VuZGlhZ19jb29raWUpO1xuICA4MDpcdFxuICA4MTpcdFx0aWYgKChyZXEtXHUwMDNlbmRpYWdfc2hvdyBcdTAwMjYgTkRJQUdfU0hPV19HUk9VUFMpIFx1MDAyNlx1MDAyNlxuICA4MjpcdFx0ICAgIHNrX2RpYWdfZHVtcF9ncm91cHMoc2ssIHNrYikpXG4gIDgzOlx0XHRcdGdvdG8gb3V0X25sbXNnX3RyaW07XG4gIDg0Olx0XG4gIDg1Olx0XHRpZiAoKHJlcS1cdTAwM2VuZGlhZ19zaG93IFx1MDAyNiBORElBR19TSE9XX01FTUlORk8pIFx1MDAyNlx1MDAyNlxuICA4NjpcdFx0ICAgIHNvY2tfZGlhZ19wdXRfbWVtaW5mbyhzaywgc2tiLCBORVRMSU5LX0RJQUdfTUVNSU5GTykpXG4gIDg3Olx0XHRcdGdvdG8gb3V0X25sbXNnX3RyaW07XG4gIDg4Olx0XG4gIDg5Olx0XHRpZiAoKHJlcS1cdTAwM2VuZGlhZ19zaG93IFx1MDAyNiBORElBR19TSE9XX0ZMQUdTKSBcdTAwMjZcdTAwMjZcbiAgOTA6XHRcdCAgICBza19kaWFnX3B1dF9mbGFncyhzaywgc2tiKSlcbiAgOTE6XHRcdFx0Z290byBvdXRfbmxtc2dfdHJpbTtcbiAgOTI6XHRcbiAgOTM6XHRcdG5sbXNnX2VuZChza2IsIG5saCk7XG4gIDk0Olx0XHRyZXR1cm4gMDtcbiAgOTU6XHRcbiAgOTY6XHRvdXRfbmxtc2dfdHJpbTpcbiAgOTc6XHRcdG5sbXNnX2NhbmNlbChza2IsIG5saCk7XG4gIDk4Olx0XHRyZXR1cm4gLUVNU0dTSVpFO1xuICA5OTpcdH1cbiAxMDA6XHRcbiAxMDE6XHRzdGF0aWMgaW50IF9fbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLFxuIDEwMjpcdFx0XHRcdFx0aW50IHByb3RvY29sLCBpbnQgc19udW0pXG4gMTAzOlx0e1xuIDEwNDpcdFx0c3RydWN0IHJoYXNodGFibGVfaXRlciAqaHRpID0gKHZvaWQgKiljYi1cdTAwM2VhcmdzWzJdO1xuIDEwNTpcdFx0c3RydWN0IG5ldGxpbmtfdGFibGUgKnRibCA9IFx1MDAyNm5sX3RhYmxlW3Byb3RvY29sXTtcbiAxMDY6XHRcdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi1cdTAwM2Vzayk7XG4gMTA3Olx0XHRzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSAqcmVxO1xuIDEwODpcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxzaztcbiAxMDk6XHRcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG4gMTEwOlx0XHRzdHJ1Y3Qgc29jayAqc2s7XG4gMTExOlx0XHRpbnQgbnVtID0gMjtcbiAxMTI6XHRcdGludCByZXQgPSAwO1xuIDExMzpcdFxuIDExNDpcdFx0cmVxID0gbmxtc2dfZGF0YShjYi1cdTAwM2VubGgpO1xuIDExNTpcdFxuIDExNjpcdFx0aWYgKHNfbnVtIFx1MDAzZSAxKVxuIDExNzpcdFx0XHRnb3RvIG1jX2xpc3Q7XG4gMTE4Olx0XG4gMTE5Olx0XHRudW0tLTtcbiAxMjA6XHRcbiAxMjE6XHRcdGlmICghaHRpKSB7XG4gMTIyOlx0XHRcdGh0aSA9IGttYWxsb2Nfb2JqKCpodGkpO1xuIDEyMzpcdFx0XHRpZiAoIWh0aSlcbiAxMjQ6XHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMjU6XHRcbiAxMjY6XHRcdFx0Y2ItXHUwMDNlYXJnc1syXSA9IChsb25nKWh0aTtcbiAxMjc6XHRcdH1cbiAxMjg6XHRcbiAxMjk6XHRcdGlmICghc19udW0pXG4gMTMwOlx0XHRcdHJoYXNodGFibGVfd2Fsa19lbnRlcihcdTAwMjZ0YmwtXHUwMDNlaGFzaCwgaHRpKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI2ODcKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIGludG8gYGRpYWcuY2AqKgoKQWxyaWdodCwgSSYjMzk7bSBoZXJlLCByZWFkeSB0byBleGFtaW5lIHRoZSByZXN0IG9mIGBkaWFnLmNgLiBUaGUgaW5pdGlhbCBnbGltcHNlIHByb2JhYmx5IGlzbiYjMzk7dCBlbm91Z2gsIGFuZCB0aGVyZSYjMzk7cyBhIGdvb2QgY2hhbmNlIHRoYXQgd2hhdCYjMzk7cyBuZXh0IGlzIGtleSB0byB3aGF0ZXZlciYjMzk7cyBnb2luZyBvbi4gSSBrbm93IGZyb20gZXhwZXJpZW5jZSB0aGF0IGRpYWdub3N0aWNzIGNhbiBvZnRlbiBiZSBhIHJhYmJpdCBob2xlLCBidXQgYWxzbyB0aGUgYnJlYWRjcnVtYnMgdGhhdCBsZWFkIHRvIHRoZSBzb2x1dGlvbi4gTXkgZ3V0IHRlbGxzIG1lIHRoaXMgb25lJiMzOTtzIHByb2JhYmx5IGdvaW5nIHRvIHByb3ZpZGUgY29udGV4dCB0byBlYXJsaWVyIHByb2JsZW1zLiBMZXQmIzM5O3Mgc2VlIGlmIHRoZSByZXN0IG9mIGl0IHJldmVhbHMgdGhlIHJvb3QgY2F1c2UsIG9yLCBhdCB0aGUgdmVyeSBsZWFzdCwgZ2l2ZXMgbWUgc29tZSBzb2xpZCBjbHVlcyBmb3Igd2hlcmUgdG8gbG9vayBuZXh0LiBHb3R0YSBzdGF5IHNoYXJwIGFuZCBsb29rIGZvciBwYXR0ZXJucywgZGVwZW5kZW5jaWVzLCBhbmQgYW55IHVuZXhwZWN0ZWQgYmVoYXZpb3JzLiBMZXQmIzM5O3MgZGlnIGluIGFuZCBzZWUgd2hhdCBzZWNyZXRzIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSBob2xkcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9kaWFnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE4MDpcdFx0XHRcdFx0IE5FVExJTktfQ0IoY2ItXHUwMDNlc2tiKS5wb3J0aWQsXG4gMTgxOlx0XHRcdFx0XHQgY2ItXHUwMDNlbmxoLVx1MDAzZW5sbXNnX3NlcSxcbiAxODI6XHRcdFx0XHRcdCBOTE1fRl9NVUxUSSxcbiAxODM6XHRcdFx0XHRcdCBzb2NrX2lfaW5vKHNrKSkgXHUwMDNjIDApIHtcbiAxODQ6XHRcdFx0XHRyZXQgPSAxO1xuIDE4NTpcdFx0XHRcdGJyZWFrO1xuIDE4NjpcdFx0XHR9XG4gMTg3Olx0XHRcdG51bSYjNDM7JiM0Mzs7XG4gMTg4Olx0XHR9XG4gMTg5Olx0XHRyZWFkX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNm5sX3RhYmxlX2xvY2ssIGZsYWdzKTtcbiAxOTA6XHRcbiAxOTE6XHRkb25lOlxuIDE5MjpcdFx0Y2ItXHUwMDNlYXJnc1swXSA9IG51bTtcbiAxOTM6XHRcbiAxOTQ6XHRcdHJldHVybiByZXQ7XG4gMTk1Olx0fVxuIDE5NjpcdFxuIDE5NzpcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKVxuIDE5ODpcdHtcbiAxOTk6XHRcdHN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7XG4gMjAwOlx0XHRpbnQgc19udW0gPSBjYi1cdTAwM2VhcmdzWzBdO1xuIDIwMTpcdFx0aW50IGVyciA9IDA7XG4gMjAyOlx0XG4gMjAzOlx0XHRyZXEgPSBubG1zZ19kYXRhKGNiLVx1MDAzZW5saCk7XG4gMjA0Olx0XG4gMjA1Olx0XHRpZiAocmVxLVx1MDAzZXNkaWFnX3Byb3RvY29sID09IE5ESUFHX1BST1RPX0FMTCkge1xuIDIwNjpcdFx0XHRpbnQgaTtcbiAyMDc6XHRcbiAyMDg6XHRcdFx0Zm9yIChpID0gY2ItXHUwMDNlYXJnc1sxXTsgaSBcdTAwM2MgTUFYX0xJTktTOyBpJiM0MzsmIzQzOykge1xuIDIwOTpcdFx0XHRcdGVyciA9IF9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgaSwgc19udW0pO1xuIDIxMDpcdFx0XHRcdGlmIChlcnIpXG4gMjExOlx0XHRcdFx0XHRicmVhaztcbiAyMTI6XHRcdFx0XHRzX251bSA9IDA7XG4gMjEzOlx0XHRcdH1cbiAyMTQ6XHRcdFx0Y2ItXHUwMDNlYXJnc1sxXSA9IGk7XG4gMjE1Olx0XHR9IGVsc2Uge1xuIDIxNjpcdFx0XHRpZiAocmVxLVx1MDAzZXNkaWFnX3Byb3RvY29sIFx1MDAzZT0gTUFYX0xJTktTKVxuIDIxNzpcdFx0XHRcdHJldHVybiAtRU5PRU5UO1xuIDIxODpcdFxuIDIxOTpcdFx0XHRlcnIgPSBfX25ldGxpbmtfZGlhZ19kdW1wKHNrYiwgY2IsIHJlcS1cdTAwM2VzZGlhZ19wcm90b2NvbCwgc19udW0pO1xuIDIyMDpcdFx0fVxuIDIyMTpcdFxuIDIyMjpcdFx0cmV0dXJuIGVyciBcdTAwM2M9IDAgPyBlcnIgOiBza2ItXHUwMDNlbGVuO1xuIDIyMzpcdH1cbiAyMjQ6XHRcbiAyMjU6XHRzdGF0aWMgaW50IG5ldGxpbmtfZGlhZ19kdW1wX2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKVxuIDIyNjpcdHtcbiAyMjc6XHRcdHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKmh0aSA9ICh2b2lkICopY2ItXHUwMDNlYXJnc1syXTtcbiAyMjg6XHRcbiAyMjk6XHRcdGlmIChjYi1cdTAwM2VhcmdzWzBdID09IDEpXG4gMjMwOlx0XHRcdHJoYXNodGFibGVfd2Fsa19leGl0KGh0aSk7XG4gMjMxOlx0XG4gMjMyOlx0XHRrZnJlZShodGkpO1xuIDIzMzpcdFxuIDIzNDpcdFx0cmV0dXJuIDA7XG4gMjM1Olx0fVxuIDIzNjpcdFxuIDIzNzpcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2hhbmRsZXJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKmgpXG4gMjM4Olx0e1xuIDIzOTpcdFx0aW50IGhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNzY4CgkJCQkJCQlvdXRwdXQ6IDE4NgoJCQkJCQkJdGhvdWdodHM6IDE0NzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgYSBDb25jdXJyZW5jeSBCdWcgRml4IGluIE5ldGxpbmsgTXVsdGljYXN0IEdyb3VwIE1hbmFnZW1lbnQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBzY2FuIGZsYWdnZWQgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWUgd2l0aGluIHRoZSBOZXRsaW5rIHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBtdWx0aWNhc3QgZ3JvdXAgbWFuYWdlbWVudC4gVGhlIGNvZGUgcmV2ZWFscyBhIHN1YnRsZSByYWNlIGNvbmRpdGlvbiByZWxhdGVkIHRvIHJlYWxsb2NhdGlvbiBvZiB0aGUgbXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgYXJyYXkuIEkgc2VlIHRoYXQgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgIGlzIHRoZSBrZXkgZnVuY3Rpb24gaGVyZSwgY2FsbGVkIGZyb20gYG5ldGxpbmtfYmluZGAgYW5kIGBuZXRsaW5rX3NldHNvY2tvcHRgIHdoZW4gZGVhbGluZyB3aXRoIG1lbWJlcnNoaXAgY2hhbmdlcyAoYWRkL2Ryb3ApLiBUaGlzIGZ1bmN0aW9uJiMzOTtzIHJvbGUgaW4gcmVhbGxvY2F0aW5nIHRoZSB1bmRlcmx5aW5nIGBubGstJmd0O2dyb3Vwc2Agc3RydWN0dXJlIHJhaXNlcyBteSBjb25jZXJuLgoKVGhlIHBhdGNoIGl0c2VsZiByZXBsYWNlcyB0aGUgcHJvYmxlbWF0aWMgYGtyZWFsbG9jYCBjYWxsIHdpdGggYSBzYWZlciBzZXF1ZW5jZTogYGt6YWxsb2NgLCBgbWVtY3B5YCwgbWVtb3J5IGJhcnJpZXJzIHVzaW5nIGBzbXBfc3RvcmVfcmVsZWFzZWAsIGFuZCBmaW5hbGx5LCBhIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAuIFRoaXMgaXMgYSBjbGFzc2ljIHBhdHRlcm4gZm9yIGFkZHJlc3NpbmcgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyByZWFkcyBpbiBhIGxvY2tsZXNzIG9yIFJDVS1wcm90ZWN0ZWQgY29udGV4dC4gVGhlIGNvbW1lbnRzIGNvbmZpcm0gbXkgc3VzcGljaW9uLCB0aGF0IGNvbmN1cnJlbnQgcmVhZGVycywgbGlrZSB0aG9zZSBpbiB0aGUgZGlhZ25vc3RpYyBkdW1wIChgc2tfZGlhZ19kdW1wX2dyb3Vwc2ApIG9yIGAvcHJvYy9uZXQvbmV0bGlua2AgcmVhZGVycyAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCksIGRvbiYjMzk7dCBob2xkIHRoZSBuZWNlc3NhcnkgbG9ja3MsIGNyZWF0aW5nIGEgd2luZG93IGZvciB0aGUgcmFjZSBjb25kaXRpb24uCgpJ4oCZbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGZpeCBhZmZlY3RzIGNvbmN1cnJlbnQgYWNjZXNzLiBTcGVjaWZpY2FsbHksIGBza19kaWFnX2R1bXBfZ3JvdXBzYCBub3cgdXNlcyBgc21wX2xvYWRfYWNxdWlyZWAgYW5kIGBSRUFEX09OQ0VgIHRvIGFjY2VzcyBgbmxrLSZndDtuZ3JvdXBzYCBhbmQgYG5say0mZ3Q7Z3JvdXBzYCwgcmVzcGVjdGl2ZWx5LCBhbmQgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBub3cgdXRpbGl6ZXMgYFJFQURfT05DRWAgb24gYG5say0mZ3Q7Z3JvdXBzYC4gVGhpcyBpcyB0ZXh0Ym9vayBSQ1Ugc3luY2hyb25pemF0aW9uIGNvbWJpbmVkIHdpdGggbWVtb3J5IG9yZGVyaW5nLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyB0aGlzIGFzIGEgY2FuZGlkYXRlIGZvciBjb25jdXJyZW5jeSBmdXp6aW5nIGFuZCBLQ1NBTi9LQVNBTi4KCkNydWNpYWxseSwgdGhpcyB2dWxuZXJhYmlsaXR5IGlzIHJlYWRpbHkgcmVhY2hhYmxlLiBBIHVzZXItc3BhY2UgcHJvZ3JhbSBjYW4gY3JlYXRlIGEgTmV0bGluayBzb2NrZXQsIGJpbmQgaXQsIGFkZCBvciBkcm9wIG11bHRpY2FzdCBtZW1iZXJzaGlwcyB1c2luZyBgc2V0c29ja29wdGAgKHdpdGggYE5FVExJTktfQUREX01FTUJFUlNISVBgIG9yIGBORVRMSU5LX0RST1BfTUVNQkVSU0hJUGApLCBhbmQgdGhlbiBwb3RlbnRpYWxseSB0cmlnZ2VyIHRoZSBkaWFnbm9zdGljIGR1bXAgdmlhIGBzZW5kdG8oTkVUTElOS19JTkVUX0RJQUcsIC4uLilgIG9yIHJlYWRpbmcgYC9wcm9jL25ldC9uZXRsaW5rYC4gQWxsIHN0YW5kYXJkIE5ldGxpbmsgc29ja2V0IG9wZXJhdGlvbnMuIFRoaXMgbG93IGJhcnJpZXIgb2YgZW50cnkgbWFrZXMgaXQgYW4gaWRlYWwgdGFyZ2V0IGZvciBmdXp6aW5nIGNhbXBhaWducy4KClRoZSB3b3J0aGluZXNzIGlzIHByZXR0eSBjbGVhci4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZywgbGV2ZXJhZ2VzIFJDVSBtZW1vcnkgbWFuYWdlbWVudCwgaXMgdXNlci1zcGFjZSBhY2Nlc3NpYmxlICh3aGljaCBpcyBhbHdheXMgYSBib251cyksIGFuZCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIHRvIGZ1enogdXNpbmcgc29tZXRoaW5nIGxpa2Ugc3l6a2FsbGVyLgoKTXkgZm9jdXMgc2hvdWxkIGJlIG9uIHRoZSBtb2RpZmllZCBmdW5jdGlvbnMgdGhlbXNlbHZlczogYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgLCBgc2tfZGlhZ19kdW1wX2dyb3Vwc2AsIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLiBUaGVzZSBhcmUgdGhlIHByZWNpc2UgbG9jYXRpb25zIG9mIHRoZSBidWcgZml4IGFuZCB0aGUgY29yZSBsb2dpYyBpbnZvbHZlZCBpbiB0aGUgcmFjZS4KClRoZSBpZGVudGlmaWVkIGZ1bmN0aW9ucyBhcmVuJiMzOTt0IGp1c3QgZ2VuZXJpYyBsaWZlY3ljbGUgb25lczsgdGhleSBhcmUgdGhlIHNwZWNpZmljIGZlYXR1cmUgbG9naWMgZnVuY3Rpb25zIGRpcmVjdGx5IGltcGxlbWVudGluZyB0aGUgYWx0ZXJlZCBjb2RlIHBhdGhzLCBhbmQgdGh1cywgcHJpbWUgZnV6emluZyB0YXJnZXRzLgoKRmluYWxseSwgdGhlIGJ1aWxkIHJlcXVpcmVtZW50cyBsb29rIHNpbXBsZTogYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AgaXMgY29yZSBhbmQgYWx3YXlzIGVuYWJsZWQuIGBuZXQvbmV0bGluay9kaWFnLmNgIG5lZWRzIGBDT05GSUdfTkVUTElOS19ESUFHYCwgYW5kIGAvcHJvYy9uZXQvbmV0bGlua2AgcmVxdWlyZXMgYENPTkZJR19QUk9DX0ZTYC4gVGhlIGRlcGVuZGVuY2llcyBhcmUgc3RyYWlnaHRmb3J3YXJkLiBBbGwgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gbWFpbmxpbmUgYW5kIHNob3VsZCBiZSBlYXNpbHkgdGVzdGVkLgoKRXZlcnl0aGluZyBjaGVja3Mgb3V0LCBpdCYjMzk7cyB3b3J0aCBmdXp6aW5nIHdpdGggdGhvc2UgY29uZmlnIG9wdGlvbnMgYW5kIHRoZSBzcGVjaWZpYyBmb2N1cyBzeW1ib2xzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TkVUTElOS19ESUFHJiMzNDssCiAgICAmIzM0O1BST0NfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzJiMzNDssCiAgICAmIzM0O3NrX2RpYWdfZHVtcF9ncm91cHMmIzM0OywKICAgICYjMzQ7bmV0bGlua19uYXRpdmVfc2VxX3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBsb2NrbGVzcyBSQ1Ugc3luY2hyb25pemF0aW9uIGZvciBOZXRsaW5rIHNvY2tldCBtdWx0aWNhc3QgZ3JvdXBzIChubGstXHUwMDNlZ3JvdXBzIGFuZCBubGstXHUwMDNlbmdyb3VwcykgYWNyb3NzIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc2tfZGlhZ19kdW1wX2dyb3VwcygpLCBhbmQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKS4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZyBjb25jdXJyZW5jeSBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsgc29ja2V0IGJpbmQvc2V0c29ja29wdCwgc29ja19kaWFnIGR1bXAsIGFuZCAvcHJvYy9uZXQvbmV0bGluayByZWFkcy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBkYXRhIHJhY2VzLCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzLCBvciBVQUZzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORVRMSU5LX0RJQUcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25ldGxpbmtfcmVhbGxvY19ncm91cHMmIzM0OywKICAgICYjMzQ7c2tfZGlhZ19kdW1wX2dyb3VwcyYjMzQ7LAogICAgJiMzNDtuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzKSBhY3Jvc3MgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBza19kaWFnX2R1bXBfZ3JvdXBzKCksIGFuZCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nIGNvbmN1cnJlbmN5IGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgbmV0bGluayBzb2NrZXQgYmluZC9zZXRzb2Nrb3B0LCBzb2NrX2RpYWcgZHVtcCwgYW5kIC9wcm9jL25ldC9uZXRsaW5rIHJlYWRzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBkZXRlY3QgcG90ZW50aWFsIGRhdGEgcmFjZXMsIG1lbW9yeSBvcmRlcmluZyBpc3N1ZXMsIG9yIFVBRnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXNvbHZlcyBhIGNvbmN1cnJlbmN5IGJ1ZyB3aGVyZSBga3JlYWxsb2MoKWAgaW1tZWRpYXRlbHkgZnJlZWQgYG5say1cdTAwM2Vncm91cHNgIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgdW5kZXIgUkNVIChgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKWAgYW5kIGBza19kaWFnX2R1bXBfZ3JvdXBzKClgKSBjb3VsZCBhY2Nlc3MgaXQgY29uY3VycmVudGx5LCByaXNraW5nIHVzZS1hZnRlci1mcmVlIChVQUYpIGFuZCBvdXQtb2YtYm91bmRzIChPT0IpIHJlYWRzLiBUaGVzZSBtZW1vcnkgc2FmZXR5IGlzc3VlcyAoVUFGIGFuZCBPT0IgaGVhcCByZWFkcykgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiYjMzk7cyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBcblxuRnJvbSBhIEtNU0FOIHBlcnNwZWN0aXZlLCB0aGUgbmV3IGdyb3VwcyBidWZmZXIgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jKClgIHdoaWNoIHplcm9lcyB0aGUgZW50aXJlIGFsbG9jYXRpb24sIGZvbGxvd2VkIGJ5IGNvcHlpbmcgZXhpc3RpbmcgZ3JvdXAgZGF0YTsgdGh1cywgYWxsIGJ5dGVzIG9mIHRoZSBidWZmZXIgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBwdWJsaWNhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgc3RydWN0IHBhZGRpbmdzLCBvciB1bmluaXRpYWxpemVkIGRhdGEgbGVha3MgdG8gdXNlcnNwYWNlIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggZTZiMWQ5NzU4YzljOS4uOWZkZjk2NDIyNGFiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtOTIyLDkgJiM0Mzs5MjIsOSBAQCBuZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpCiAKIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCXVuc2lnbmVkIGludCBncm91cHM7Ci0JdW5zaWduZWQgbG9uZyAqbmV3X2dyb3VwczsKIAlpbnQgZXJyID0gMDsKIAogCW5ldGxpbmtfdGFibGVfZ3JhYigpOwpAQCAtOTM4LDE4ICYjNDM7OTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiAJaWYgKG5say0mZ3Q7bmdyb3VwcyAmZ3Q7PSBncm91cHMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCW5ld19ncm91cHMgPSBrcmVhbGxvYyhubGstJmd0O2dyb3VwcywgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTsKLQlpZiAobmV3X2dyb3VwcyA9PSBOVUxMKSB7CiYjNDM7CS8qIENhbiBub3QgdXNlIGtyZWFsbG9jKCksIGJlY2F1c2UgdGhlIG9sZCBidWZmZXIgbWlnaHQgYmUgZnJlZWQKJiM0MzsJICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZAomIzQzOwkgKiAvcHJvYy9uZXQvbmV0bGluaykgY2FuIHN0aWxsIGJlIGxvb2tpbmcgYXQgaXQuCiYjNDM7CSAqLwomIzQzOwluZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpOwomIzQzOwlpZiAoIW5ld19ncm91cHMpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQltZW1zZXQoKGNoYXIgKiluZXdfZ3JvdXBzICYjNDM7IE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwgMCwKLQkgICAgICAgTkxHUlBTWihncm91cHMpIC0gTkxHUlBTWihubGstJmd0O25ncm91cHMpKTsKJiM0MzsJb2xkX2dyb3VwcyA9IG5say0mZ3Q7Z3JvdXBzOwomIzQzOwlpZiAob2xkX2dyb3VwcykKJiM0MzsJCW1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say0mZ3Q7bmdyb3VwcykpOwomIzQzOwomIzQzOwkvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzcwomIzQzOwkgKiBkZXBlbmRlbmN5IGluIGxvY2tsZXNzIHJlYWRlcnMsIHdoaWNoIGNhbiBwaWNrIHVwIHRoZSBuZXcgcG9pbnRlcgomIzQzOwkgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLSZndDtuZ3JvdXBzLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O2dyb3VwcywgbmV3X2dyb3Vwcyk7CiYjNDM7CiYjNDM7CS8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb20KJiM0MzsJICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKQomIzQzOwkgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O25ncm91cHMsIGdyb3Vwcyk7CiAKLQlubGstJmd0O2dyb3VwcyA9IG5ld19ncm91cHM7Ci0JbmxrLSZndDtuZ3JvdXBzID0gZ3JvdXBzOwogIG91dF91bmxvY2s6CiAJbmV0bGlua190YWJsZV91bmdyYWIoKTsKJiM0MzsKJiM0MzsJaWYgKG9sZF9ncm91cHMpCiYjNDM7CQlrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKTsKJiM0MzsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzA1LDEyICYjNDM7MjcyNCwxOSBAQCBzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogCX0gZWxzZSB7CiAJCXN0cnVjdCBzb2NrICpzID0gdjsKIAkJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpOwomIzQzOwkJY29uc3QgdW5zaWduZWQgbG9uZyAqZ3JvdXBzOwomIzQzOwomIzQzOwkJLyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlCiYjNDM7CQkgKiBubGstJmd0O2dyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW4KJiM0MzsJCSAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC4KJiM0MzsJCSAqLwomIzQzOwkJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKIAogCQlzZXFfcHJpbnRmKHNlcSwgJiMzNDslcEsgJS0zZCAlLTEwdSAlMDh4ICUtOGQgJS04ZCAlLTVkICUtOGQgJS04dSAlLThsbHVcbiYjMzQ7LAogCQkJICAgcywKIAkJCSAgIHMtJmd0O3NrX3Byb3RvY29sLAogCQkJICAgbmxrLSZndDtwb3J0aWQsCi0JCQkgICBubGstJmd0O2dyb3VwcyA/ICh1MzIpbmxrLSZndDtncm91cHNbMF0gOiAwLAomIzQzOwkJCSAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCwKIAkJCSAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLAogCQkJICAgc2tfd21lbV9hbGxvY19nZXQocyksCiAJCQkgICBSRUFEX09OQ0UobmxrLSZndDtjYl9ydW5uaW5nKSwKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuYwppbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9kaWFnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L25ldGxpbmsvZGlhZy5jCkBAIC0xMiwxMiAmIzQzOzEyLDI0IEBACiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpCiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKLQotCWlmIChubGstJmd0O2dyb3VwcyA9PSBOVUxMKQomIzQzOwl1bnNpZ25lZCBsb25nICpncm91cHM7CiYjNDM7CXVuc2lnbmVkIGludCBuZ3JvdXBzOwomIzQzOwomIzQzOwkvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seQomIzQzOwkgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZQomIzQzOwkgKiBubGstJmd0O2dyb3VwcyBhbmQgbmxrLSZndDtuZ3JvdXBzIGF0IGFueSB0aW1lLgomIzQzOwkgKgomIzQzOwkgKiBSZWFkIG5say0mZ3Q7bmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpCiYjNDM7CSAqIGZyb20gbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBzbyB0aGF0IHdlIGNhbiBub3QgdXNlIHRoZSBuZXcKJiM0MzsJICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXMKJiM0MzsJICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC4KJiM0MzsJICovCiYjNDM7CW5ncm91cHMgPSBzbXBfbG9hZF9hY3F1aXJlKCZhbXA7bmxrLSZndDtuZ3JvdXBzKTsKJiM0MzsJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJaWYgKCFncm91cHMpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwKLQkJICAgICAgIG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7CiB9CiAKIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQyMQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDExMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBOZXRsaW5rIEdyb3VwIFJlYWxsb2NhdGlvbiBQYXRjaCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggbW9kaWZ5aW5nIGBuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNgIGFuZCBgbmV0L25ldGxpbmsvZGlhZy5jYC4gSSYjMzk7bSBzZWVpbmcgY2hhbmdlcyBpbiBob3cgTmV0bGluayBncm91cHMgYXJlIHJlYWxsb2NhdGVkLCB3aGljaCBhbHdheXMgd2FycmFudHMgYSBjbG9zZSBsb29rLgoKRmlyc3QsIGluIGBhZl9uZXRsaW5rLmNgIHdpdGhpbiBgbmV0bGlua19yZWFsbG9jX2dyb3Vwc2AsIHRoZSBhbGxvY2F0aW9uIHN0cmF0ZWd5IGhhcyBzaGlmdGVkLiBJbnN0ZWFkIG9mIGBrcmVhbGxvY2AsIHdlJiMzOTtyZSBub3cgdXNpbmcgYGt6YWxsb2NgLiBUaGF0JiMzOTtzIHNtYXJ0OyBga3phbGxvY2AgemVyb2VzIHRoZSBuZXcgbWVtb3J5LiBUaGVuLCBgbWVtY3B5YCBjb3BpZXMgdGhlIGV4aXN0aW5nIGdyb3VwIGluZm9ybWF0aW9uIGZyb20gdGhlIG9sZCBidWZmZXIgdG8gdGhlIHplcm9lZCBuZXcgYnVmZmVyLCBhbmQgdGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgdXNpbmcgUkNVIChga2ZyZWVfcmN1X21pZ2h0c2xlZXBgKS4gVGhpcyBpcyBhIHNvbGlkIGFwcHJvYWNoLCBndWFyYW50ZWVpbmcgYSBjbGVhbiBpbml0aWFsIHN0YXRlIGFuZCBsZXZlcmFnaW5nIFJDVSBmb3Igc2FmZSBkZWFsbG9jYXRpb24uIFRoaXMgcGF0dGVybiBpcyBmYWlybHkgY29tbW9uIG5vdywgYW5kIGF2b2lkcyBwb3RlbnRpYWxseSBleHBvc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoZSBjb2RlIHRoZW4gdXNlcyBgc21wX3N0b3JlX3JlbGVhc2VgIGZvciBib3RoIGBubGstJmd0O2dyb3Vwc2AgYW5kIGBubGstJmd0O25ncm91cHNgLiBBbmQgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBqdXN0IHJlYWRzIGBncm91cHNbMF1gIHNhZmVseS4KCk5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhlIGBza19kaWFnX2R1bXBfZ3JvdXBzYCBmdW5jdGlvbiBpbiBgbmV0L25ldGxpbmsvZGlhZy5jYC4gSXQgcmV0cmlldmVzIHRoZSBncm91cCBkYXRhIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLiBIZXJlLCBgbmdyb3Vwc2AgKHRoZSBudW1iZXIgb2YgZ3JvdXBzKSBpcyBsb2FkZWQgdXNpbmcgYHNtcF9sb2FkX2FjcXVpcmVgIGFuZCBgZ3JvdXBzYCAodGhlIGFjdHVhbCBncm91cCBhcnJheSkgaXMgcmVhZCB1c2luZyBgUkVBRF9PTkNFYC4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhlIGxvY2tsZXNzIGFjY2VzcyBhbmQgdGhlIG9yZGVyaW5nLgoKSSYjMzk7bSB0aGlua2luZzogQ291bGQgYG5ncm91cHNgIGFuZCBgZ3JvdXBzYCBiZSBtaXNtYXRjaGVkPyBMZXQmIzM5O3MgdHJhY2UgaXQuIFRoZSB3cml0ZXImIzM5O3Mgc2lkZSB1c2VzIGBzbXBfc3RvcmVfcmVsZWFzZWAgZm9yIGBncm91cHNgIGFuZCB0aGVuIGBuZ3JvdXBzYC4gQW5kIHRoZSByZWFkZXIgdXNlcyBgc21wX2xvYWRfYWNxdWlyZWAgZm9yIGBuZ3JvdXBzYCBhbmQgdGhlbiBgUkVBRF9PTkNFYCBmb3IgYGdyb3Vwc2AuCgpHaXZlbiB0aGF0IHdlIGFyZSB1c2luZyBhY3F1aXJlL3JlbGVhc2Ugc2VtYW50aWNzOiBpZiB0aGUgcmVhZGVyIHNlZXMgYSBuZXcgYG5ncm91cHNgLCBpdCBpcyAqZ3VhcmFudGVlZCogdG8gc2VlIHRoZSBjb3JyZXNwb25kaW5nIGBncm91cHNgIChvciBldmVuIGEgbmV3ZXIgdmVyc2lvbikuIElmIHRoZSByZWFkZXIgc2VlcyB0aGUgKm9sZCogYG5ncm91cHNgLCB0aGVuIGBncm91cHNgIGNvdWxkIGVpdGhlciBiZSB0aGUgYG9sZF9ncm91cHNgIG9yIHRoZSBgbmV3X2dyb3Vwc2AuIEJ1dCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZ3JvdXBzIGFycmF5IGhhcyBiZWVuIHJlYWxsb2NhdGVkLCB3ZSBhcmUgcmVhZGluZyBmcm9tIGBuZXdfZ3JvdXBzYCB1c2luZyB0aGUgc21hbGxlciBzaXplIGBOTEdSUFNaKG9sZF9uZ3JvdXBzKWAsIHNvIGl0JiMzOTtzIGd1YXJhbnRlZWQgdG8gYmUgd2l0aGluIGJvdW5kcy4gSWYgdGhlIHJlYWRlciBzZWVzIGBvbGRfZ3JvdXBzYCB0aGlzIGlzIGFsc28gdmFsaWQgYW5kIFJDVSBwcm90ZWN0ZWQuIFdlIGNhbiBlbnN1cmUgdGhlIGJhcnJpZXIgZW5zdXJlcyB0aGUgc2l6ZSByZWFkIGlzIHdpdGhpbiBib3VuZHMuIFRoaXMgbG9naWMgYXZvaWRzIGFueSBwb3NzaWJsZSBvdXQtb2YtYm91bmRzIHJlYWRzLgoKVGhlcmUgaXMgdGhlIGNhc2Ugb2YgaW5pdGlhbCBzdGF0ZSwgd2hlcmUgYGdyb3Vwc2Agc3RhcnRzIGFzIE5VTEwuIEkgd2lsbCBuZWVkIHRvIGNoZWNrIGhvdyBgbmxrLSZndDtncm91cHNgIGFuZCBgbmxrLSZndDtuZ3JvdXBzYCBhcmUgaW5pdGlhbGl6ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25say1cdTAwM2Vncm91cHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0bGluay8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTcwND1zdGF0aWMgdm9pZCBkZWZlcnJlZF9wdXRfbmxrX3NrKHN0cnVjdCByY3VfaGVhZCAqaGVhZClcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzA4LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjcwOTpcdGtmcmVlKG5say1cdTAwM2Vncm91cHMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjcxMDpcdG5say1cdTAwM2Vncm91cHMgPSBOVUxMO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTcxMS1cbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NzE4PXN0YXRpYyBpbnQgbmV0bGlua19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTczNC1cdGlmIChubGstXHUwMDNlbmV0bGlua19yZWxlYXNlKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjczNTpcdFx0bmxrLVx1MDAzZW5ldGxpbmtfcmVsZWFzZShzaywgbmxrLVx1MDAzZWdyb3Vwcyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzM2LVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy03NDMtXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5say1cdTAwM2VuZ3JvdXBzOyBpJiM0MzsmIzQzOylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo3NDQ6XHRcdFx0aWYgKHRlc3RfYml0KGksIG5say1cdTAwM2Vncm91cHMpKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTc0NS1cdFx0XHRcdG5say1cdTAwM2VuZXRsaW5rX3VuYmluZChzb2NrX25ldChzayksIGkgJiM0MzsgMSk7XG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkyMz1zdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NDktXHR9XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6OTUwOlx0b2xkX2dyb3VwcyA9IG5say1cdTAwM2Vncm91cHM7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTUxLVx0aWYgKG9sZF9ncm91cHMpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1Ny1cdCAqL1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1ODpcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNm5say1cdTAwM2Vncm91cHMsIG5ld19ncm91cHMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1OS1cbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTg5PXN0YXRpYyBpbnQgbmV0bGlua19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICphZGRyLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDU3LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwNTg6XHRpZiAoIWdyb3VwcyBcdTAwMjZcdTAwMjYgKG5say1cdTAwM2Vncm91cHMgPT0gTlVMTCB8fCAhKHUzMilubGstXHUwMDNlZ3JvdXBzWzBdKSlcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDU5LVx0XHRnb3RvIHVubG9jaztcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTA2NC1cdFx0XHRcdFx0IGh3ZWlnaHQzMihncm91cHMpIC1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxMDY1Olx0XHRcdFx0XHQgaHdlaWdodDMyKG5say1cdTAwM2Vncm91cHNbMF0pKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxMDY2Olx0bmxrLVx1MDAzZWdyb3Vwc1swXSA9IChubGstXHUwMDNlZ3JvdXBzWzBdIFx1MDAyNiB+MHhmZmZmZmZmZlVMKSB8IGdyb3Vwcztcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDY3LVx0bmV0bGlua191cGRhdGVfbGlzdGVuZXJzKHNrKTtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTEyND1zdGF0aWMgaW50IG5ldGxpbmtfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTExNDEtXHRcdG5ldGxpbmtfbG9ja190YWJsZSgpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjExNDI6XHRcdG5sYWRkci1cdTAwM2VubF9ncm91cHMgPSBubGstXHUwMDNlZ3JvdXBzID8gbmxrLVx1MDAzZWdyb3Vwc1swXSA6IDA7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTE0My1cdFx0bmV0bGlua191bmxvY2tfdGFibGUoKTtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTQ0Mj1zdGF0aWMgdm9pZCBkb19vbmVfYnJvYWRjYXN0KHN0cnVjdCBzb2NrICpzayxcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTQ1MS1cdGlmIChubGstXHUwMDNlcG9ydGlkID09IHAtXHUwMDNlcG9ydGlkIHx8IHAtXHUwMDNlZ3JvdXAgLSAxIFx1MDAzZT0gbmxrLVx1MDAzZW5ncm91cHMgfHxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNDUyOlx0ICAgICF0ZXN0X2JpdChwLVx1MDAzZWdyb3VwIC0gMSwgbmxrLVx1MDAzZWdyb3VwcykpXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTQ1My1cdFx0cmV0dXJuO1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNTk0PXN0YXRpYyBpbnQgZG9fb25lX3NldF9lcnIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgKnApXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2MDUtXHRpZiAobmxrLVx1MDAzZXBvcnRpZCA9PSBwLVx1MDAzZXBvcnRpZCB8fCBwLVx1MDAzZWdyb3VwIC0gMSBcdTAwM2U9IG5say1cdTAwM2VuZ3JvdXBzIHx8XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTYwNjpcdCAgICAhdGVzdF9iaXQocC1cdTAwM2Vncm91cCAtIDEsIG5say1cdTAwM2Vncm91cHMpKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2MDctXHRcdGdvdG8gb3V0O1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjU0PXN0YXRpYyB2b2lkIG5ldGxpbmtfdXBkYXRlX3NvY2tldF9tYyhzdHJ1Y3QgbmV0bGlua19zb2NrICpubGssXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2NTktXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTY2MDpcdG9sZCA9IHRlc3RfYml0KGdyb3VwIC0gMSwgbmxrLVx1MDAzZWdyb3Vwcyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY2MS1cdHN1YnNjcmlwdGlvbnMgPSBubGstXHUwMDNlc3Vic2NyaXB0aW9ucyAtIG9sZCAmIzQzOyBuZXc7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTY2MjpcdF9fYXNzaWduX2JpdChncm91cCAtIDEsIG5say1cdTAwM2Vncm91cHMsIG5ldyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY2My1cdG5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoXHUwMDI2bmxrLVx1MDAzZXNrLCBzdWJzY3JpcHRpb25zKTtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTc0Mz1zdGF0aWMgaW50IG5ldGxpbmtfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNzc4LVx0XHRcdHNoaWZ0ID0gKHBvcyAlIHNpemVvZih1bnNpZ25lZCBsb25nKSkgKiA4O1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjE3Nzk6XHRcdFx0Z3JvdXAgPSAodTMyKShubGstXHUwMDNlZ3JvdXBzW2lkeF0gXHUwMDNlXHUwMDNlIHNoaWZ0KTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNzgwLVx0XHRcdGlmIChjb3B5X3RvX2l0ZXIoXHUwMDI2Z3JvdXAsIHNpemVvZih1MzIpLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzE4PXN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjktXHRcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3MzA6XHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjczMS1cdFx0ICogUkNVIGdyYWNlIHBlcmlvZCwgYW5kIHRoaXMgd2FsayBpcyBSQ1UgcHJvdGVjdGVkLlxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzItXHRcdCAqL1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3MzM6XHRcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzM0LVxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYz0xMj1zdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jLTE5LVx0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2Vcbm5ldC9uZXRsaW5rL2RpYWcuYzoyMDpcdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxubmV0L25ldGxpbmsvZGlhZy5jLTIxLVx0ICpcbi0tXG5uZXQvbmV0bGluay9kaWFnLmMtMjctXHRuZ3JvdXBzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZubGstXHUwMDNlbmdyb3Vwcyk7XG5uZXQvbmV0bGluay9kaWFnLmM6Mjg6XHRncm91cHMgPSBSRUFEX09OQ0UobmxrLVx1MDAzZWdyb3Vwcyk7XG5uZXQvbmV0bGluay9kaWFnLmMtMjktXHRpZiAoIWdyb3VwcylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE3MAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGEgc2Vhc29uZWQgcHJvZmVzc2lvbmFsIGluIHRoZSBmaWVsZCwgc3BlYWtpbmcgZGlyZWN0bHkgdG8gbXlzZWxmOgoKKipEaXZpbmcgaW50byBOZXRsaW5rIFNvY2tldCBDcmVhdGlvbioqCgpBbHJpZ2h0LCB0aW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaXNzZWN0IHRoZSBuZXRsaW5rIHNvY2tldCBjcmVhdGlvbiBwcm9jZXNzLiBJdCYjMzk7cyBiZWVuIGEgd2hpbGUgc2luY2UgSSBsYXN0IGR1ZyBpbnRvIHRoZSBsb3ctbGV2ZWwgZGV0YWlscywgYW5kIGEgcXVpY2sgcmUtZXhhbWluYXRpb24gbmV2ZXIgaHVydHMuIEkgd2FudCB0byBtYWtlIHN1cmUgSSBoYXZlIGEgc29saWQgZ3Jhc3Agb24gaG93IHRoZXNlIHNvY2tldHMgYXJlIGFjdHVhbGx5IGJyb3VnaHQgdG8gbGlmZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWwgc2V0dXAsIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBjYWxscywgYW5kIHRoZSB0eXBpY2FsIGZsb3cgb2YgZGF0YS4gV2hhdCBwYXJhbWV0ZXJzIGFyZSBpbnZvbHZlZD8gQXJlIHRoZXJlIGFueSBzdWJ0bGUgbnVhbmNlcyBvciBwb3RlbnRpYWwgcGl0ZmFsbHMgaW4gdGhlIHNldHVwIHRoYXQgSSBzaG91bGQgYmUgbWluZGZ1bCBvZiwgZnJvbSBhIHBlcmZvcm1hbmNlIG9yIHNlY3VyaXR5IHN0YW5kcG9pbnQ/IFRoZSBkZXZpbCYjMzk7cyBvZnRlbiBpbiB0aGUgZGV0YWlscywgc28gbGV0JiMzOTtzIHN0YXJ0IHdpdGggYSBzeXN0ZW1hdGljIGFwcHJvYWNoIGFuZCB3b3JrIG91ciB3YXkgdGhyb3VnaCBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TkxHUlBTWiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTIzPXN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk0NC1cdCAqL1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk0NTpcdG5ld19ncm91cHMgPSBremFsbG9jKE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTQ2LVx0aWYgKCFuZXdfZ3JvdXBzKSB7XG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1MS1cdGlmIChvbGRfZ3JvdXBzKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1MjpcdFx0bWVtY3B5KG5ld19ncm91cHMsIG9sZF9ncm91cHMsIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NTMtXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk2MC1cdC8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb21cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NjE6XHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTYyLVx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjAyNj1fX25ldGxpbmtfa2VybmVsX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIGludCB1bml0LCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIwNTItXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjA1MzpcdGxpc3RlbmVycyA9IGt6YWxsb2Moc2l6ZW9mKCpsaXN0ZW5lcnMpICYjNDM7IE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjA1NC1cdGlmICghbGlzdGVuZXJzKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMTA3PWludCBfX25ldGxpbmtfY2hhbmdlX25ncm91cHMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgZ3JvdXBzKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTE0LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMTU6XHRpZiAoTkxHUlBTWih0YmwtXHUwMDNlZ3JvdXBzKSBcdTAwM2MgTkxHUlBTWihncm91cHMpKSB7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjExNjpcdFx0bmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldykgJiM0MzsgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTE3LVx0XHRpZiAoIW5ldylcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjExOS1cdFx0b2xkID0gbmxfZGVyZWZfcHJvdGVjdGVkKHRibC1cdTAwM2VsaXN0ZW5lcnMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMjA6XHRcdG1lbWNweShuZXctXHUwMDNlbWFza3MsIG9sZC1cdTAwM2VtYXNrcywgTkxHUlBTWih0YmwtXHUwMDNlZ3JvdXBzKSk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjEyMS1cdFx0cmN1X2Fzc2lnbl9wb2ludGVyKHRibC1cdTAwM2VsaXN0ZW5lcnMsIG5ldyk7XG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI4Nzc9c3RhdGljIHZvaWQgX19pbml0IG5ldGxpbmtfYWRkX3VzZXJzb2NrX2VudHJ5KHZvaWQpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4ODEtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Mjg4MjpcdGxpc3RlbmVycyA9IGt6YWxsb2Moc2l6ZW9mKCpsaXN0ZW5lcnMpICYjNDM7IE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjg4My1cdGlmICghbGlzdGVuZXJzKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuaD0xMD1lbnVtIHtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmgtMjAtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmg6MjE6I2RlZmluZSBOTEdSUFNaKHgpXHQoQUxJR04oeCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgLyA4KVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oOjIyOiNkZWZpbmUgTkxHUlBMT05HUyh4KVx0KE5MR1JQU1ooeCkvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oLTIzLVxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYz0xMj1zdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jLTMxLVxubmV0L25ldGxpbmsvZGlhZy5jOjMyOlx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XG5uZXQvbmV0bGluay9kaWFnLmMtMzMtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NDUyCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IGltbWVkaWF0ZSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIE5ldGxpbmsgR3JvdXAgTWFuYWdlbWVudCoqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyBOZXRsaW5rIGdyb3VwIG1lbWJlcnNoaXAgaXMgaGFuZGxlZCB3aGVuIGEgc29ja2V0IGlzIGZpcnN0IGNyZWF0ZWQuIE15IGluc3RpbmN0IGlzIHRvIHplcm8gaW4gb24gYG5ldGxpbmtfY3JlYXRlYCBhbmQgdGhlIHNvY2tldCBhbGxvY2F0aW9uIGl0c2VsZi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8ga25vdyB0aGUgKmluaXRpYWwqIHN0YXRlIG9mIGBubGstJmd0O2dyb3Vwc2AgaW4gdGhhdCBmcmVzaGx5IG1pbnRlZCBzb2NrZXQuIFRoYXQmIzM5O3MgdGhlIGtleSBzdGFydGluZyBwb2ludCB0byB1bmRlcnN0YW5kIGhvdyBncm91cHMgYXJlIGFkZGVkIGFuZCByZW1vdmVkIGxhdGVyLiBJJiMzOTtsbCBuZWVkIHRvIHRyYWNlIHRoZSBjb2RlIGluIGBuZXRsaW5rX2NyZWF0ZWAgYW5kIHRoZSByZWxhdGVkIHNvY2tldCBpbml0aWFsaXphdGlvbiByb3V0aW5lcywgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZ3JvdXBzIGFyZSBpbml0aWFsaXplZCwgd2hhdCB0aGUgZGVmYXVsdCBpcywgaWYgdGhlcmUgaXMgYSBkZWZhdWx0IGF0IGFsbCwgYW5kIHBlcmhhcHMgd2hldGhlciB0aGlzIGlzIGEgc3RhdGljIG9yIGR5bmFtaWMgYWxsb2NhdGlvbi4gSSBleHBlY3QgdGhlcmUgdG8gYmUgYXQgbGVhc3Qgc29tZSByZWxldmFudCBpbml0aWFsaXphdGlvbiBpbiB0aGlzIHNwYWNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZXRsaW5rX2NyZWF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NjEzPXN0YXRpYyBzdHJ1Y3QgcHJvdG8gbmV0bGlua19wcm90byA9IHtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjE4LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjYxOTpzdGF0aWMgaW50IF9fbmV0bGlua19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTYyMC1cdFx0XHQgICAgaW50IHByb3RvY29sLCBpbnQga2Vybilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjQ0LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjY0NTpzdGF0aWMgaW50IG5ldGxpbmtfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTY0Ni1cdFx0XHQgIGludCBrZXJuKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02ODQtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Njg1Olx0ZXJyID0gX19uZXRsaW5rX2NyZWF0ZShuZXQsIHNvY2ssIHByb3RvY29sLCBrZXJuKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02ODYtXHRpZiAoZXJyIFx1MDAzYyAwKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMDI2PV9fbmV0bGlua19rZXJuZWxfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgaW50IHVuaXQsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSxcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjA0Mi1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyMDQzOlx0aWYgKF9fbmV0bGlua19jcmVhdGUobmV0LCBzb2NrLCB1bml0LCAxKSBcdTAwM2MgMClcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMDQ0LVx0XHRnb3RvIG91dF9zb2NrX3JlbGVhc2Vfbm9zaztcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjg1ND1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgbmV0bGlua19mYW1pbHlfb3BzID0ge1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NTUtXHQuZmFtaWx5ID0gUEZfTkVUTElOSyxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODU2Olx0LmNyZWF0ZSA9IG5ldGxpbmtfY3JlYXRlLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NTctXHQub3duZXJcdD0gVEhJU19NT0RVTEUsXHQvKiBmb3IgY29uc2lzdGVuY3kgOCkgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTIwNQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHJlYWRpbmcgYW5kIHRoaW5raW5nIGFib3V0IHRoZSBjb2RlOgoKKipEaXZpbmcgaW50byBgX19uZXRsaW5rX2NyZWF0ZWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGl0LiBUaW1lIHRvIGRpc3NlY3QgYF9fbmV0bGlua19jcmVhdGVgIGluIGBuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNgLiBJJiMzOTttIGN1cmlvdXMgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGluaXRpYWwgY3JlYXRpb24gb2YgYSBOZXRsaW5rIHNvY2tldC4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgdGhlIGxvdy1sZXZlbCBzdHVmZiBoZXJlLCBzZXR0aW5nIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgdGhlIE5ldGxpbmsgY29tbXVuaWNhdGlvbiB0aGF0JiMzOTtzIGdvaW5nIHRvIGhhcHBlbi4gSSBleHBlY3QgdG8gc2VlIHRoZSBrZXJuZWwgY29uZmlndXJpbmcgdGhlIHNvY2tldCYjMzk7cyBiYXNpYyBzdHJ1Y3R1cmUsIGFsbG9jYXRpbmcgbWVtb3J5LCBhbmQgcHJvYmFibHkgc2V0dGluZyB1cCBzb21lIGluaXRpYWwgc3RhdGUgb3IgcXVldWVzLiBLbm93aW5nIHRoZSBpbnRlcm5hbHMgaGVyZSBpcyBjcml0aWNhbCB0byB1bmRlcnN0YW5kaW5nIGhvdyBtb3JlIGFkdmFuY2VkIHNvY2tldCBmdW5jdGlvbmFsaXRpZXMgYXJlIGltcGxlbWVudGVkIGxhdGVyIG9uIGluIHRoZSBOZXRsaW5rIHN1YnN5c3RlbS4gSG9wZWZ1bGx5LCBJJiMzOTtsbCBzZWUgc29tZSBvYnZpb3VzIGNvbm5lY3Rpb24gdG8gdGhlIE5ldGxpbmsgZmFtaWx5IHN0cnVjdHVyZXMgYW5kIGFkZHJlc3MgZmFtaWxpZXMsIGFzIHdlbGwuIExldCYjMzk7cyBzZWUgaWYgdGhpcyBjb2RlIGNvbmZpcm1zIHdoYXQgSSBhbHJlYWR5IGtub3cgYWJvdXQgbmV0bGluaywgb3IgYWRkcyBzb21lIHdyaW5rbGVzIHRvIG15IG1lbnRhbCBtb2RlbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MTgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYxODpcdFxuIDYxOTpcdHN0YXRpYyBpbnQgX19uZXRsaW5rX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssXG4gNjIwOlx0XHRcdFx0ICAgIGludCBwcm90b2NvbCwgaW50IGtlcm4pXG4gNjIxOlx0e1xuIDYyMjpcdFx0c3RydWN0IHNvY2sgKnNrO1xuIDYyMzpcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrO1xuIDYyNDpcdFxuIDYyNTpcdFx0c29jay1cdTAwM2VvcHMgPSBcdTAwMjZuZXRsaW5rX29wcztcbiA2MjY6XHRcbiA2Mjc6XHRcdHNrID0gc2tfYWxsb2MobmV0LCBQRl9ORVRMSU5LLCBHRlBfS0VSTkVMLCBcdTAwMjZuZXRsaW5rX3Byb3RvLCBrZXJuKTtcbiA2Mjg6XHRcdGlmICghc2spXG4gNjI5Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDYzMDpcdFxuIDYzMTpcdFx0c29ja19pbml0X2RhdGEoc29jaywgc2spO1xuIDYzMjpcdFxuIDYzMzpcdFx0bmxrID0gbmxrX3NrKHNrKTtcbiA2MzQ6XHRcdG11dGV4X2luaXQoXHUwMDI2bmxrLVx1MDAzZW5sX2NiX211dGV4KTtcbiA2MzU6XHRcdGxvY2tkZXBfc2V0X2NsYXNzX2FuZF9uYW1lKFx1MDAyNm5say1cdTAwM2VubF9jYl9tdXRleCxcbiA2MzY6XHRcdFx0XHRcdFx0ICAgbmxrX2NiX211dGV4X2tleXMgJiM0MzsgcHJvdG9jb2wsXG4gNjM3Olx0XHRcdFx0XHRcdCAgIG5sa19jYl9tdXRleF9rZXlfc3RyaW5nc1twcm90b2NvbF0pO1xuIDYzODpcdFx0aW5pdF93YWl0cXVldWVfaGVhZChcdTAwMjZubGstXHUwMDNld2FpdCk7XG4gNjM5Olx0XG4gNjQwOlx0XHRzay1cdTAwM2Vza19kZXN0cnVjdCA9IG5ldGxpbmtfc29ja19kZXN0cnVjdDtcbiA2NDE6XHRcdHNrLVx1MDAzZXNrX3Byb3RvY29sID0gcHJvdG9jb2w7XG4gNjQyOlx0XHRyZXR1cm4gMDtcbiA2NDM6XHR9XG4gNjQ0Olx0XG4gNjQ1Olx0c3RhdGljIGludCBuZXRsaW5rX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCxcbiA2NDY6XHRcdFx0XHQgIGludCBrZXJuKVxuIDY0NzpcdHtcbiA2NDg6XHRcdHN0cnVjdCBtb2R1bGUgKm1vZHVsZSA9IE5VTEw7XG4gNjQ5Olx0XHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7XG4gNjUwOlx0XHRpbnQgKCpiaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XG4gNjUxOlx0XHR2b2lkICgqdW5iaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XG4gNjUyOlx0XHR2b2lkICgqcmVsZWFzZSkoc3RydWN0IHNvY2sgKnNvY2ssIHVuc2lnbmVkIGxvbmcgKmdyb3Vwcyk7XG4gNjUzOlx0XHRpbnQgZXJyID0gMDtcbiA2NTQ6XHRcbiA2NTU6XHRcdHNvY2stXHUwMDNlc3RhdGUgPSBTU19VTkNPTk5FQ1RFRDtcbiA2NTY6XHRcbiA2NTc6XHRcdGlmIChzb2NrLVx1MDAzZXR5cGUgIT0gU09DS19SQVcgXHUwMDI2XHUwMDI2IHNvY2stXHUwMDNldHlwZSAhPSBTT0NLX0RHUkFNKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDA5MAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDgyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBOZXRsaW5rIEdyb3VwIEFsbG9jYXRpb24qKgoKT2theSwgc28gYHNrX2FsbG9jYCBkb2VzIGl0cyB0aGluZyBhbmQgemVyb3Mgb3V0IHRoZSBlbnRpcmUgc29ja2V0IHN0cnVjdHVyZS4gVGhhdCBpbmNsdWRlcyB0aGUgYG5ldGxpbmtfc29ja2AgcGFydCwgd2hpY2ggbWVhbnMgYG5say0mZ3Q7Z3JvdXBzYCBzdGFydHMgYXMgTlVMTCBhbmQgYG5say0mZ3Q7bmdyb3Vwc2AgaXMsIG5hdHVyYWxseSwgemVyby4gR29vZC4gVGhhdCYjMzk7cyBhIGNsZWFuIHNsYXRlLgoKTm93LCB0aGUgaW50ZXJlc3RpbmcgcGFydDogaG93IGRvIHdlIGFsbG9jYXRlIHRob3NlIE5ldGxpbmsgZ3JvdXBzPyBMZXQmIzM5O3MgdHJhY2UgaXQgdGhyb3VnaC4gV2hlcmUgZG9lcyBgbmV0bGlua19yZWFsbG9jX2dyb3Vwc2AgZ2V0IGNhbGxlZCBmcm9tPyBUaW1lIHRvIGdvIGh1bnRpbmcgZm9yIHRoZSBjYWxsIHNpdGVzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVuIGFuZCB3aHkgdGhlIGtlcm5lbCBkZWNpZGVzIHRvIGV4cGFuZCB0aGUgZ3JvdXAgbGlzdC4gVGhpcyBpcyBhIGNyaXRpY2FsIHBvaW50IHRvIHBpbnBvaW50IHRoZSBiZWhhdmlvciBzdXJyb3VuZGluZyBncm91cCBtZW1iZXJzaGlwIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25ldGxpbmtfcmVhbGxvY19ncm91cHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0bGluay8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkxMj1uZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTkyMi1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5MjM6c3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjQte1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz05ODk9c3RhdGljIGludCBuZXRsaW5rX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKmFkZHIsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwMTAtXHRcdFx0cmV0dXJuIC1FUEVSTTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxMDExOlx0XHRlcnIgPSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHNrKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEyLVx0XHRpZiAoZXJyKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjY3PXN0YXRpYyBpbnQgbmV0bGlua19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2OTEtXHRcdFx0cmV0dXJuIC1FUEVSTTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjkyOlx0XHRlcnIgPSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHNrKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkzLVx0XHRpZiAoZXJyKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzE4PXN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjgtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjcyOTpcdFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjczMC1cdFx0ICogbmxrLVx1MDAzZWdyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW5cbi0tXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYy0xOC1cdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XG5uZXQvbmV0bGluay9kaWFnLmM6MTk6XHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxubmV0L25ldGxpbmsvZGlhZy5jLTIwLVx0ICogbmxrLVx1MDAzZWdyb3VwcyBhbmQgbmxrLVx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jLTIyLVx0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG5uZXQvbmV0bGluay9kaWFnLmM6MjM6XHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XG5uZXQvbmV0bGluay9kaWFnLmMtMjQtXHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4OQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYC4gSSBuZWVkIHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24sIGl0cyBwdXJwb3NlLCBhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiBpdHMgb3BlcmF0aW9uIHdpdGhpbiB0aGUgYnJvYWRlciBuZXRsaW5rIGZyYW1ld29yay4gSSYjMzk7bSBnb2luZyB0byBicmVhayBpdCBkb3duLCBwaWVjZSBieSBwaWVjZSwgY29uc2lkZXJpbmcgdGhlIHBvc3NpYmxlIGVkZ2UgY2FzZXMgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBuZXRsaW5rIGNvbXBvbmVudHMuIEkmIzM5O2xsIG5lZWQgdG8gdGhpbmsgYWJvdXQgbWVtb3J5IG1hbmFnZW1lbnQsIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGFuZCBlcnJvciBoYW5kbGluZyDigJMgZXZlcnl0aGluZyB0aGF0IGNvdWxkIGdvIHdyb25nIG9yIHRoYXQgbmVlZHMgdG8gYmUgcHJvcGVybHkgaGFuZGxlZCBmb3Igcm9idXN0IGJlaGF2aW9yLiBJJiMzOTtsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIGV4ZWN1dGlvbiBmbG93LCB0cmFjaW5nIHRoZSBkYXRhJiMzOTtzIHBhdGggYW5kIHdoYXQgdGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwcm90ZWN0aW5nIGFuZCBlbnN1cmluZy4gSSYjMzk7bGwgZm9jdXMgcGFydGljdWxhcmx5IG9uIGhvdyBpdCBoYW5kbGVzIGdyb3VwIG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaW4gZHluYW1pYyBlbnZpcm9ubWVudHMsIGFuZCBob3cgaXQgZGVhbHMgd2l0aCBmYWlsdXJlcyBhbmQgcmVzb3VyY2UgZXhoYXVzdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGltcGFjdCBvbiBuZXRsaW5rJiMzOTtzIHJlbGlhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZS4gVGhpcyBpc24mIzM5O3QganVzdCBhYm91dCByZWFkaW5nIHRoZSBjb2RlOyBpdCYjMzk7cyBhYm91dCBidWlsZGluZyBhIHNvbGlkIG1lbnRhbCBtb2RlbCBvZiBpdHMgYmVoYXZpb3Igd2l0aGluIHRoZSBiaWdnZXIgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDkyMDpcdFx0bmxrLVx1MDAzZXN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zO1xuIDkyMTpcdH1cbiA5MjI6XHRcbiA5MjM6XHRzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIDkyNDpcdHtcbiA5MjU6XHRcdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDtcbiA5MjY6XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gOTI3Olx0XHR1bnNpZ25lZCBpbnQgZ3JvdXBzO1xuIDkyODpcdFx0aW50IGVyciA9IDA7XG4gOTI5Olx0XG4gOTMwOlx0XHRuZXRsaW5rX3RhYmxlX2dyYWIoKTtcbiA5MzE6XHRcbiA5MzI6XHRcdGdyb3VwcyA9IG5sX3RhYmxlW3NrLVx1MDAzZXNrX3Byb3RvY29sXS5ncm91cHM7XG4gOTMzOlx0XHRpZiAoIW5sX3RhYmxlW3NrLVx1MDAzZXNrX3Byb3RvY29sXS5yZWdpc3RlcmVkKSB7XG4gOTM0Olx0XHRcdGVyciA9IC1FTk9FTlQ7XG4gOTM1Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA5MzY6XHRcdH1cbiA5Mzc6XHRcbiA5Mzg6XHRcdGlmIChubGstXHUwMDNlbmdyb3VwcyBcdTAwM2U9IGdyb3VwcylcbiA5Mzk6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDk0MDpcdFxuIDk0MTpcdFx0LyogQ2FuIG5vdCB1c2Uga3JlYWxsb2MoKSwgYmVjYXVzZSB0aGUgb2xkIGJ1ZmZlciBtaWdodCBiZSBmcmVlZFxuIDk0MjpcdFx0ICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZFxuIDk0MzpcdFx0ICogL3Byb2MvbmV0L25ldGxpbmspIGNhbiBzdGlsbCBiZSBsb29raW5nIGF0IGl0LlxuIDk0NDpcdFx0ICovXG4gOTQ1Olx0XHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuIDk0NjpcdFx0aWYgKCFuZXdfZ3JvdXBzKSB7XG4gOTQ3Olx0XHRcdGVyciA9IC1FTk9NRU07XG4gOTQ4Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA5NDk6XHRcdH1cbiA5NTA6XHRcdG9sZF9ncm91cHMgPSBubGstXHUwMDNlZ3JvdXBzO1xuIDk1MTpcdFx0aWYgKG9sZF9ncm91cHMpXG4gOTUyOlx0XHRcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4gOTUzOlx0XG4gOTU0Olx0XHQvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzc1xuIDk1NTpcdFx0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcbiA5NTY6XHRcdCAqIHdoaWxlIHN0aWxsIHNlZWluZyB0aGUgb2xkIChzbWFsbGVyKSBubGstXHUwMDNlbmdyb3Vwcy5cbiA5NTc6XHRcdCAqL1xuIDk1ODpcdFx0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XG4gOTU5Olx0XG4gOTYwOlx0XHQvKiBUaGVuIHB1Ymxpc2ggdGhlIG5ldyBzaXplOiBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tXG4gOTYxOlx0XHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG4gOTYyOlx0XHQgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLlxuIDk2MzpcdFx0ICovXG4gOTY0Olx0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZubGstXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcbiA5NjU6XHRcbiA5NjY6XHQgb3V0X3VubG9jazpcbiA5Njc6XHRcdG5ldGxpbmtfdGFibGVfdW5ncmFiKCk7XG4gOTY4Olx0XG4gOTY5Olx0XHRpZiAob2xkX2dyb3VwcylcbiA5NzA6XHRcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX2dyb3Vwcyk7XG4gOTcxOlx0XG4gOTcyOlx0XHRyZXR1cm4gZXJyO1xuIDk3MzpcdH1cbiA5NzQ6XHRcbiA5NzU6XHRzdGF0aWMgdm9pZCBuZXRsaW5rX3VuZG9fYmluZChpbnQgZ3JvdXAsIGxvbmcgdW5zaWduZWQgaW50IGdyb3VwcyxcbiA5NzY6XHRcdFx0XHQgICAgICBzdHJ1Y3Qgc29jayAqc2spXG4gOTc3Olx0e1xuIDk3ODpcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcbiA5Nzk6XHRcdGludCB1bmRvO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjIyMAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDE5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgS2VybmVsIE1lbW9yeSBEZWFsbG9jYXRpb24gd2l0aCBSQ1UqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKWAgY2FsbC4gRmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgdHlwZSBvZiBgb2xkX2dyb3Vwc2AuIElzIGl0IGFuIGB1bnNpZ25lZCBsb25nICpgIGFzIEkgc3VzcGVjdD8gVGhpcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGludGVuZGVkIGJlaGF2aW9yLgoKTm93LCBob3cgZG9lcyB0aGlzIGZ1bmN0aW9uLCBga2ZyZWVfcmN1X21pZ2h0c2xlZXBgLCBhY3R1YWxseSBvcGVyYXRlIHdpdGhpbiB0aGUga2VybmVsPyBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nLiBEb2VzIGl0IG1hbmRhdGUgdGhlIHByZXNlbmNlIG9mIGFuIGByY3VfaGVhZGAgc3RydWN0dXJlLCBvciBjYW4gaXQgaGFuZGxlIGEgYGttYWxsb2NgIGFsbG9jYXRlZCBwb2ludGVyIGRpcmVjdGx5PyBUaGVyZSYjMzk7cyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGRpZmZlcmVuY2UgaGVyZS4KCkFoLCB0aGF0JiMzOTtzIHJpZ2h0LiBJdCYjMzk7cyBhIGtleSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGBrZnJlZV9yY3UocHRyLCByY3VfaGVhZClgIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKWAuIEluIG1vZGVybiBrZXJuZWwgdmVyc2lvbnMsIHNwZWNpZmljYWxseSB0aG9zZSBpbiB0aGUgNS54IGFuZCA2Lnggc2VyaWVzLCB0aGUgc2luZ2xlLWFyZ3VtZW50IHZlcnNpb25zIGxpa2UgYGt2ZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGFuZCBhbHNvIGBrZnJlZV9yY3UocHRyKWAgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlLiBUaGVzZSB3b3JrIHBlcmZlY3RseSB3aXRoIHBvaW50ZXJzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2NgLCB3aXRob3V0IG5lZWRpbmcgYW4gZXhwbGljaXQgb2Zmc2V0IG9yIGByY3VfaGVhZGAgc3RydWN0dXJlLiBUaGF0JiMzOTtzIGEgc2lnbmlmaWNhbnQgYWR2YW5jZW1lbnQgaW4gdGhlIFJDVSBtZW1vcnkgbWFuYWdlbWVudCBBUEkuCgpUbyBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaXRzIHByYWN0aWNhbCB1c2FnZSwgSSYjMzk7bGwgcGVyZm9ybSBhIHF1aWNrIGBncmVwYCBzZWFyY2ggZm9yIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIGNvZGUuIFNlZWluZyBpdCBpbiBjb250ZXh0IHdpbGwgcHJvdmlkZSB2YWx1YWJsZSBjbHVlcyBhYm91dCBpdHMgaW50ZW5kZWQgcHVycG9zZSBhbmQgdXNhZ2UgcGF0dGVybnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tmcmVlX3JjdV9taWdodHNsZWVwJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q9NjIwPWJlIHVzZWQsIG9taXR0aW5nIHRoZSByY3VfaGVhZCBzdHJ1Y3R1cmUgZnJvbSBzdHJ1Y3QgZm9vLlxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC02MjEtXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0OjYyMjpcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9mcCk7XG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0LTYyMy1cbi0tXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0PTEwNzY9UkNVOjpcbi0tXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0LTEwODctXHRyY3VfcmVhZF9sb2NrX2hlbGRcdFx0a3ZmcmVlX3JjdVxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdDoxMDg4Olx0cmN1X3JlYWRfbG9ja19hbnlfaGVsZFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC0xMDg5LVx0cmN1X3BvaW50ZXJfaGFuZG9mZlx0XHRjb25kX3N5bmNocm9uaXplX3JjdVxuLS1cbmJsb2NrL2Jsay1tcS5jPTQ1Mzk9c3RhdGljIHZvaWQgX19ibGtfbXFfcmVhbGxvY19od19jdHhzKHN0cnVjdCBibGtfbXFfdGFnX3NldCAqc2V0LFxuLS1cbmJsb2NrL2Jsay1tcS5jLTQ1NjAtXHRcdCAqL1xuYmxvY2svYmxrLW1xLmM6NDU2MTpcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaGN0eHMpO1xuYmxvY2svYmxrLW1xLmMtNDU2Mi1cdFx0aGN0eHMgPSBuZXdfaGN0eHM7XG4tLVxuYmxvY2svYmxrLXpvbmVkLmM9MTk2Nj1zdGF0aWMgdm9pZCBkaXNrX3NldF96b25lc19jb25kX2FycmF5KHN0cnVjdCBnZW5kaXNrICpkaXNrLCB1OCAqem9uZXNfY29uZClcbi0tXG5ibG9jay9ibGstem9uZWQuYy0xOTc0LVxuYmxvY2svYmxrLXpvbmVkLmM6MTk3NTpcdGtmcmVlX3JjdV9taWdodHNsZWVwKHpvbmVzX2NvbmQpO1xuYmxvY2svYmxrLXpvbmVkLmMtMTk3Ni19XG4tLVxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmM9MTE4PXN0YXRpYyB2b2lkIGVycm9yX2luamVjdF9yZW1vdmVhbGwoc3RydWN0IGdlbmRpc2sgKmRpc2spXG4tLVxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmMtMTI3LVx0XHRsaXN0X2RlbF9yY3UoXHUwMDI2aW5qLVx1MDAzZWVudHJ5KTtcbmJsb2NrL2Vycm9yLWluamVjdGlvbi5jOjEyODpcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaW5qKTtcbmJsb2NrL2Vycm9yLWluamVjdGlvbi5jLTEyOS1cdH1cbi0tXG5kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV92ZXJicy5jPTEzOTg9c3RhdGljIGludCByeGVfZGVyZWdfbXIoc3RydWN0IGliX21yICppYm1yLCBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKVxuLS1cbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmMtMTQxMy1cbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmM6MTQxNDpcdGtmcmVlX3JjdV9taWdodHNsZWVwKG1yKTtcbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmMtMTQxNS1cdHJldHVybiAwO1xuLS1cbmRyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUuYz0xNDc3PXN0YXRpYyB2b2lkIHJpc2N2X2lvbW11X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldilcbi0tXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4MC1cbmRyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUuYzoxNDgxOlx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaW5mbyk7XG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4Mi19XG4tLVxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuL3RjL2ludF9wb3J0LmM9MjI3PW1seDVlX2ludF9wb3J0X3JlbW92ZShzdHJ1Y3QgbWx4NWVfdGNfaW50X3BvcnRfcHJpdiAqcHJpdixcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW4vdGMvaW50X3BvcnQuYy0yNDQtXHRtbHg1ZV9pbnRfcG9ydF9tZXRhZGF0YV9mcmVlKHByaXYsIGludF9wb3J0LVx1MDAzZW1hdGNoX21ldGFkYXRhKTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi90Yy9pbnRfcG9ydC5jOjI0NTpcdGtmcmVlX3JjdV9taWdodHNsZWVwKGludF9wb3J0KTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi90Yy9pbnRfcG9ydC5jLTI0Ni1cdHByaXYtXHUwMDNlbnVtX3BvcnRzLS07XG4tLVxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jPTYzOT1zdGF0aWMgaW50IG1seDVlX21hY3NlY19kZWxfdHhzYShzdHJ1Y3QgbWFjc2VjX2NvbnRleHQgKmN0eClcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY1LVx0bWx4NV9kZXN0cm95X2VuY3J5cHRpb25fa2V5KG1hY3NlYy1cdTAwM2VtZGV2LCB0eF9zYS1cdTAwM2VlbmNfa2V5X2lkKTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9hY2NlbC9tYWNzZWMuYzo2NjY6XHRrZnJlZV9yY3VfbWlnaHRzbGVlcCh0eF9zYSk7XG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY3LVx0bWFjc2VjX2RldmljZS1cdTAwM2V0eF9zYVthc3NvY19udW1dID0gTlVMTDtcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmM9ODE1PXN0YXRpYyB2b2lkIG1hY3NlY19kZWxfcnhzY19jdHgoc3RydWN0IG1seDVlX21hY3NlYyAqbWFjc2VjLCBzdHJ1Y3QgbWx4NWVfbWFjc2VjX3J4X3NjICpyeF9zYyxcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtODQyLVx0a2ZyZWUocnhfc2MtXHUwMDNlc2NfeGFycmF5X2VsZW1lbnQpO1xuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jOjg0MzpcdGtmcmVlX3JjdV9taWdodHNsZWVwKHJ4X3NjKTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9hY2NlbC9tYWNzZWMuYy04NDQtfVxuLS1cbmZzL2J0cmZzL3ZvbHVtZXMuYz03NTk9c3RhdGljIG5vaW5saW5lIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZV9saXN0X2FkZChjb25zdCBjaGFyICpwYXRoLFxuLS1cbmZzL2J0cmZzL3ZvbHVtZXMuYy05NTUtXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtXHUwMDNlbmFtZSwgbmFtZSk7XG5mcy9idHJmcy92b2x1bWVzLmM6OTU2Olx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfbmFtZSk7XG5mcy9idHJmcy92b2x1bWVzLmMtOTU3LVxuLS1cbmZzL2V4dDQvc3VwZXIuYz0yNTgyPXN0YXRpYyB2b2lkIGV4dDRfYXBwbHlfcXVvdGFfb3B0aW9ucyhzdHJ1Y3QgZnNfY29udGV4dCAqZmMsXG4tLVxuZnMvZXh0NC9zdXBlci5jLTI2MDYtXHRcdFx0aWYgKHFuYW1lKVxuZnMvZXh0NC9zdXBlci5jOjI2MDc6XHRcdFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChxbmFtZSk7XG5mcy9leHQ0L3N1cGVyLmMtMjYwOC1cdFx0fVxuLS1cbmZzL2tlcm5mcy9kaXIuYz0xODE5PWludCBrZXJuZnNfcmVuYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIHN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTg5Ny1cdGlmIChuZXdfbmFtZSBcdTAwMjZcdTAwMjYgIWlzX2tlcm5lbF9yb2RhdGEoKHVuc2lnbmVkIGxvbmcpb2xkX25hbWUpKVxuZnMva2VybmZzL2Rpci5jOjE4OTg6XHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9uYW1lKTtcbmZzL2tlcm5mcy9kaXIuYy0xODk5LVxuLS1cbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmM9MTU0PXhmc19ncm91cF9mcmVlKFxuLS1cbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmMtMTc2LVx0WEZTX0lTX0NPUlJVUFQobXAsIGF0b21pY19yZWFkKFx1MDAyNnhnLVx1MDAzZXhnX2FjdGl2ZV9yZWYpIFx1MDAzYyAwKTtcbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmM6MTc3Olx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoeGcpO1xuZnMveGZzL2xpYnhmcy94ZnNfZ3JvdXAuYy0xNzgtfVxuLS1cbmZzL3hmcy94ZnNfaGVhbHRobW9uLmM9ODY9eGZzX2hlYWx0aG1vbl9wdXQoXG4tLVxuZnMveGZzL3hmc19oZWFsdGhtb24uYy0xMDEtXHRcdG11dGV4X2Rlc3Ryb3koXHUwMDI2aG0tXHUwMDNlbG9jayk7XG5mcy94ZnMveGZzX2hlYWx0aG1vbi5jOjEwMjpcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaG0pO1xuZnMveGZzL3hmc19oZWFsdGhtb24uYy0xMDMtXHR9XG4tLVxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oPTk5ND1zdGF0aWMgaW5saW5lIHZvaWQgcmN1X3JlYWRfdW5sb2NrX21pZ3JhdGUodm9pZClcbi0tXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA4Ny0vKipcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMDg4OiAqIGtmcmVlX3JjdV9taWdodHNsZWVwKCkgLSBrZnJlZSBhbiBvYmplY3QgYWZ0ZXIgYSBncmFjZSBwZXJpb2QuXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA4OS0gKiBAcHRyOiBwb2ludGVyIHRvIGtmcmVlIGZvciBzaW5nbGUtYXJndW1lbnQgaW52b2NhdGlvbnMuXG4tLVxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTEwOTQtICpcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMDk1OiAqICAgICBrZnJlZV9yY3VfbWlnaHRzbGVlcChwdHIpO1xuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTEwOTYtICpcbi0tXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTEwMy0gKi9cbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMTA0OiNkZWZpbmUga2ZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKSBrdmZyZWVfcmN1X2FyZ18xKHB0cilcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaC0xMTA1LSNkZWZpbmUga3ZmcmVlX3JjdV9taWdodHNsZWVwKHB0cikga3ZmcmVlX3JjdV9hcmdfMShwdHIpXG4tLVxua2VybmVsL3JjdS9yY3VzY2FsZS5jPTc1OD1rZnJlZV9zY2FsZV90aHJlYWQodm9pZCAqYXJnKVxuLS1cbmtlcm5lbC9yY3UvcmN1c2NhbGUuYy04MDQtXHRcdFx0XHRcdChrZnJlZV9yY3VfdGVzdF9ib3RoIFx1MDAyNlx1MDAyNiB0b3J0dXJlX3JhbmRvbShcdTAwMjZ0cikgXHUwMDI2IDB4ODAwKSlcbmtlcm5lbC9yY3UvcmN1c2NhbGUuYzo4MDU6XHRcdFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChhbGxvY19wdHIpO1xua2VybmVsL3JjdS9yY3VzY2FsZS5jLTgwNi1cdFx0XHRlbHNlXG4tLVxubmV0L2Nhbi9ndy5jPTEwNzc9c3RhdGljIGludCBjZ3dfY3JlYXRlX2pvYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgc3RydWN0IG5sbXNnaGRyICpubGgsXG4tLVxubmV0L2Nhbi9ndy5jLTExMjctXHRcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGd3ai1cdTAwM2VjZl9tb2QsIG1vZCk7XG5uZXQvY2FuL2d3LmM6MTEyODpcdFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfY2YpO1xubmV0L2Nhbi9ndy5jLTExMjktXHRcdFx0cmV0dXJuIDA7XG4tLVxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jPTMxNT1pbnQgbXB0Y3BfcG1fbmxfcmVtb3ZlX2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbi0tXG5uZXQvbXB0Y3AvcG1fdXNlcnNwYWNlLmMtMzU3LVxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jOjM1ODpcdGtmcmVlX3JjdV9taWdodHNsZWVwKG1hdGNoKTtcbm5ldC9tcHRjcC9wbV91c2Vyc3BhY2UuYy0zNTktXHQvKiBBZGp1c3Qgc2tfb21lbV9hbGxvYyBsaWtlIHNvY2tfa2ZyZWVfcygpIGRvZXMsIHRvIG1hdGNoXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkyMz1zdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NjktXHRpZiAob2xkX2dyb3Vwcylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NzA6XHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk3MS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1NjcKCQkJCQkJCW91dHB1dDogMjA3CgkJCQkJCQl0aG91Z2h0czogMTkzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBBc3Nlc3NtZW50OiBUaGlzIFBhdGNoIERvZXNuJiMzOTt0IE5lZWQgSXQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBuZWNlc3NpdGF0ZXMgYSBLTVNBTiBydW4uIEZyb20gdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uLCB0aGUgcGF0Y2ggcHJpbWFyaWx5IGFkZHJlc3NlcyBjb25jdXJyZW5jeSBpc3N1ZXMgaW4gaG93IG5ldGxpbmsgZ3JvdXAgYml0bWFwcyBhcmUgcmVhbGxvY2F0ZWQgYW5kIGFjY2Vzc2VkLiBTcGVjaWZpY2FsbHksIHRoZSBvcmlnaW5hbCB1c2Ugb2YgYGtyZWFsbG9jYCBwcmVzZW50ZWQgYSBwb3RlbnRpYWwgVXNlLUFmdGVyLUZyZWUgKFVBRikgc2l0dWF0aW9uIGZvciBsb2NrbGVzcyBSQ1UgcmVhZGVycy4gQWRkaXRpb25hbGx5LCB3aXRob3V0IG1lbW9yeSBiYXJyaWVycywgdGhlcmUgd2FzIGEgcmlzayBvZiBPdXQtb2YtQm91bmRzIChPT0IpIHJlYWRzIGR1ZSB0byBpbmNvbnNpc3RlbnQgdmlld3Mgb2YgYnVmZmVyIHNpemVzLgoKVGhlIGNvcmUgb2YgdGhlIGZpeCBpbnZvbHZlcyByZXBsYWNpbmcgYGtyZWFsbG9jYCB3aXRoIGEgYGt6YWxsb2NgLWJhc2VkIGFwcHJvYWNoLiBUaGlzIG1lYW5zIHRoZSBuZXcgYnVmZmVyLCBgbmV3X2dyb3Vwc2AsIGlzIGd1YXJhbnRlZWQgdG8gYmUgemVyby1pbml0aWFsaXplZC4gVGhlIHByZXZpb3VzIGNvbnRlbnRzIGFyZSB0aGVuIGNvcGllZCBpbi4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgdmlhIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAuIE1lbW9yeSBiYXJyaWVycyBhcmUgdXNlZCB0byBlbnN1cmUgcmVhZGVycyBzZWUgY29uc2lzdGVudCBzdGF0ZS4KCk5vdywgY29uc2lkZXJpbmcgdGhlIEtNU0FOIGd1aWRlbGluZXMsIHRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgZXhwb3NlcyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gTGV0JiMzOTtzIGFuYWx5emUgZWFjaCBjb21wb25lbnQ6CgoxLiAgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgOiBUaGUgY3JpdGljYWwgY2hhbmdlIGhlcmUgaXMgYGt6YWxsb2NgLiBUaGlzIGd1YXJhbnRlZXMgYSBmdWxseSBpbml0aWFsaXplZCBidWZmZXIsIGVsaW1pbmF0aW5nIHRoZSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBFdmVuIHRoZSBwcmV2aW91cyBga3JlYWxsb2NgICYjNDM7IGBtZW1zZXRgIGFwcHJvYWNoLCB3aGlsZSBsZXNzIGVsZWdhbnQsIHdhcyBzdGlsbCBmdWxseSBpbml0aWFsaXppbmcgdGhlIG1lbW9yeS4gVGhlIGNvcHkgZnJvbSBgb2xkX2dyb3Vwc2AgaXMgYWxzbyBzYWZlIGJlY2F1c2UgdGhhdCBtZW1vcnkgd2FzIGVpdGhlciBpbml0aWFsaXplZCBmcm9tIGBremFsbG9jYCBvciBzb21lIGVxdWl2YWxlbnQgYXQgc29tZSB0aW1lIGluIHRoZSBwYXN0LgoKMi4gIGBza19kaWFnX2R1bXBfZ3JvdXBzYDogVGhpcyBmdW5jdGlvbiBub3cgY29ycmVjdGx5IGxvYWRzIGBuZ3JvdXBzYCBhbmQgYGdyb3Vwc2AuICBUaGUgYGdyb3Vwc2AgYnVmZmVyIGhlcmUsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCYjMzk7cyB0aGUgb2xkIG9yIHRoZSBuZXcgb25lLCBpcyBhbHdheXMgc291cmNlZCBmcm9tIGBremFsbG9jYCAob3Iga2VybmVsLWludGVybmFsIGluaXQpLCBndWFyYW50ZWVpbmcgaW5pdGlhbGl6YXRpb24uIEV2ZW4gaWYgdGhlIGNvZGUgd2VyZSBmbGF3ZWQgYW5kIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBvY2N1cnJlZCwgdGhhdCYjMzk7cyBhIEtBU0FOIGlzc3VlLiBUaGUgbWVtb3J5IGJhcnJpZXJzIHByZXZlbnQgdGhlIE9PQi4KCjMuICBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgOiBUaGlzIHJlYWRzIGZyb20gYFJFQURfT05DRShubGstJmd0O2dyb3VwcylgLiBTaW5jZSB0aGUgYnVmZmVyIHRoYXQgYG5say0mZ3Q7Z3JvdXBzYCBwb2ludHMgdG8gaXMgYWx3YXlzIGFsbG9jYXRlZCB2aWEgYGt6YWxsb2NgLCB0aGlzIHJlYWQgaXMgYWxzbyBzYWZlLgoKNC4gIFRoZSBmdW5kYW1lbnRhbCBpc3N1ZSB0aGlzIHBhdGNoIHJlc29sdmVzOiBUaGUgb3JpZ2luYWwgcHJvYmxlbSBvZiBVQUYgYW5kIE9PQiBhcmlzZXMgZnJvbSBjb25jdXJyZW50IGFjY2VzcyBhbmQgaW1wcm9wZXIgbWVtb3J5IGJhcnJpZXJzIHdpdGggYGtyZWFsbG9jYC4gVGhlc2UgYXJlIGJ1Z3MgdGhhdCBLQVNBTiBleGNlbHMgYXQgZGV0ZWN0aW5nLiBUaGUgbmV3IGFwcHJvYWNoIHJlc29sdmVzIHRoaXMgYnkgZW5zdXJpbmcgYSBjb25zaXN0ZW50LCBpbml0aWFsaXplZCB2aWV3IG9mIHRoZSBtZW1vcnksIGFuZCBwcm9wZXJseSBzeW5jaHJvbml6aW5nLgoKVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGNyZWF0ZSAqYW55KiBuZXcgcmlza3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiB0byAqYXZvaWQqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBObyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBhcmUgcmVhZCwgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzIGFyZSBpbnZvbHZlZCwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHNlbnQgdG8gdXNlcnNwYWNlLiBUaGUgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBVQUYgYW5kIE9PQiwgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4uCgpUaGUgS01TQU4gZ3VpZGVsaW5lcyBhcmUgY2xlYXI6IGlmIEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGNhdGNoIHRoZSBwcm9ibGVtLCB0aGVyZSYjMzk7cyBubyBuZWVkIGZvciBhIHJlc291cmNlLWludGVuc2l2ZSBLTVNBTiBydW4uIFRoaXMgcGF0Y2ggZmFsbHMgc3F1YXJlbHkgaW50byB0aGF0IGNhdGVnb3J5LiBIZW5jZSwgYE5lZWRzS01TQU4gPSBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc29sdmVzIGEgY29uY3VycmVuY3kgYnVnIHdoZXJlIGBrcmVhbGxvYygpYCBpbW1lZGlhdGVseSBmcmVlZCBgbmxrLVx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJiMzOTtzIGRldGVjdGlvbiBjYXBhYmlsaXRpZXMuIFxuXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc29sdmVzIGEgY29uY3VycmVuY3kgYnVnIHdoZXJlIGBrcmVhbGxvYygpYCBpbW1lZGlhdGVseSBmcmVlZCBgbmxrLVx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJiMzOTtzIGRldGVjdGlvbiBjYXBhYmlsaXRpZXMuIFxuXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjg6NTAuNDQ4NzQ5MTk3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk4MjM4MTIxOTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5FVExJTktfRElBR1wiLFxuICAgIFwiUFJPQ19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm5ldGxpbmtfcmVhbGxvY19ncm91cHNcIixcbiAgICBcInNrX2RpYWdfZHVtcF9ncm91cHNcIixcbiAgICBcIm5ldGxpbmtfbmF0aXZlX3NlcV9zaG93XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXNvbHZlcyBhIGNvbmN1cnJlbmN5IGJ1ZyB3aGVyZSBga3JlYWxsb2MoKWAgaW1tZWRpYXRlbHkgZnJlZWQgYG5say1cXHUwMDNlZ3JvdXBzYCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIHVuZGVyIFJDVSAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYCkgY291bGQgYWNjZXNzIGl0IGNvbmN1cnJlbnRseSwgcmlza2luZyB1c2UtYWZ0ZXItZnJlZSAoVUFGKSBhbmQgb3V0LW9mLWJvdW5kcyAoT09CKSByZWFkcy4gVGhlc2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgKFVBRiBhbmQgT09CIGhlYXAgcmVhZHMpIGZhbGwgc3RyaWN0bHkgdW5kZXIgS0FTQU4ncyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBcXG5cXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMpIGFjcm9zcyBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNrX2RpYWdfZHVtcF9ncm91cHMoKSwgYW5kIG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KCkuIFRoaXMgdG91Y2hlcyBjb3JlIG5ldHdvcmtpbmcgY29uY3VycmVuY3kgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBuZXRsaW5rIHNvY2tldCBiaW5kL3NldHNvY2tvcHQsIHNvY2tfZGlhZyBkdW1wLCBhbmQgL3Byb2MvbmV0L25ldGxpbmsgcmVhZHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGRldGVjdCBwb3RlbnRpYWwgZGF0YSByYWNlcywgbWVtb3J5IG9yZGVyaW5nIGlzc3Vlcywgb3IgVUFGcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjg6NTAuNDQ4NzU0MjU3WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDY3MjU4MzMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNDk1MDVmY2FiMDg0NTMzYTRhY2ExZWUwNTU5MGMxZTU4YjkzN2NhMlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNzoyODo0OCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcXG5pbmRleCBlNmIxZDk3NThjOWM5Li45ZmRmOTY0MjI0YWI0IDEwMDY0NFxcbi0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xcbisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xcbkBAIC05MjIsOSArOTIyLDkgQEAgbmV0bGlua191cGRhdGVfc3Vic2NyaXB0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBzdWJzY3JpcHRpb25zKVxcbiBcXG4gc3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcXG4ge1xcbitcXHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XFxuIFxcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XFxuIFxcdHVuc2lnbmVkIGludCBncm91cHM7XFxuLVxcdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHM7XFxuIFxcdGludCBlcnIgPSAwO1xcbiBcXG4gXFx0bmV0bGlua190YWJsZV9ncmFiKCk7XFxuQEAgLTkzOCwxOCArOTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXFxuIFxcdGlmIChubGstXFx1MDAzZW5ncm91cHMgXFx1MDAzZT0gZ3JvdXBzKVxcbiBcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIFxcbi1cXHRuZXdfZ3JvdXBzID0ga3JlYWxsb2MobmxrLVxcdTAwM2Vncm91cHMsIE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XFxuLVxcdGlmIChuZXdfZ3JvdXBzID09IE5VTEwpIHtcXG4rXFx0LyogQ2FuIG5vdCB1c2Uga3JlYWxsb2MoKSwgYmVjYXVzZSB0aGUgb2xkIGJ1ZmZlciBtaWdodCBiZSBmcmVlZFxcbitcXHQgKiBpbW1lZGlhdGVseSwgd2hpbGUgbG9ja2xlc3MgcmVhZGVycyAobmV0bGluayBkaWFnIGR1bXAgYW5kXFxuK1xcdCAqIC9wcm9jL25ldC9uZXRsaW5rKSBjYW4gc3RpbGwgYmUgbG9va2luZyBhdCBpdC5cXG4rXFx0ICovXFxuK1xcdG5ld19ncm91cHMgPSBremFsbG9jKE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XFxuK1xcdGlmICghbmV3X2dyb3Vwcykge1xcbiBcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiBcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIFxcdH1cXG4tXFx0bWVtc2V0KChjaGFyICopbmV3X2dyb3VwcyArIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSwgMCxcXG4tXFx0ICAgICAgIE5MR1JQU1ooZ3JvdXBzKSAtIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSk7XFxuK1xcdG9sZF9ncm91cHMgPSBubGstXFx1MDAzZWdyb3VwcztcXG4rXFx0aWYgKG9sZF9ncm91cHMpXFxuK1xcdFxcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cXHUwMDNlbmdyb3VwcykpO1xcbitcXG4rXFx0LyogUHVibGlzaCB0aGUgbmV3IGJpdG1hcCBhbmQgaXRzIGNvbnRlbnQ6IHBhaXJzIHdpdGggdGhlIGFkZHJlc3NcXG4rXFx0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcXG4rXFx0ICogd2hpbGUgc3RpbGwgc2VlaW5nIHRoZSBvbGQgKHNtYWxsZXIpIG5say1cXHUwMDNlbmdyb3Vwcy5cXG4rXFx0ICovXFxuK1xcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZubGstXFx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XFxuK1xcbitcXHQvKiBUaGVuIHB1Ymxpc2ggdGhlIG5ldyBzaXplOiBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tXFxuK1xcdCAqIGxvY2tsZXNzIHJlYWRlcnMsIHNvIHRoYXQgdGhleSBjYW4gbm90IHJlYWQgTkxHUlBTWihuZXcgbmdyb3VwcylcXG4rXFx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cXG4rXFx0ICovXFxuK1xcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZubGstXFx1MDAzZW5ncm91cHMsIGdyb3Vwcyk7XFxuIFxcbi1cXHRubGstXFx1MDAzZWdyb3VwcyA9IG5ld19ncm91cHM7XFxuLVxcdG5say1cXHUwMDNlbmdyb3VwcyA9IGdyb3VwcztcXG4gIG91dF91bmxvY2s6XFxuIFxcdG5ldGxpbmtfdGFibGVfdW5ncmFiKCk7XFxuK1xcbitcXHRpZiAob2xkX2dyb3VwcylcXG4rXFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX2dyb3Vwcyk7XFxuK1xcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbkBAIC0yNzA1LDEyICsyNzI0LDE5IEBAIHN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHN0cnVjdCBzb2NrICpzID0gdjtcXG4gXFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpO1xcbitcXHRcXHRjb25zdCB1bnNpZ25lZCBsb25nICpncm91cHM7XFxuK1xcbitcXHRcXHQvKiBMb2NrbGVzcyByZWFkIDogbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiBjaGFuZ2VcXG4rXFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuK1xcdFxcdCAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxuIFxcbiBcXHRcXHRzZXFfcHJpbnRmKHNlcSwgXFxcIiVwSyAlLTNkICUtMTB1ICUwOHggJS04ZCAlLThkICUtNWQgJS04ZCAlLTh1ICUtOGxsdVxcXFxuXFxcIixcXG4gXFx0XFx0XFx0ICAgcyxcXG4gXFx0XFx0XFx0ICAgcy1cXHUwMDNlc2tfcHJvdG9jb2wsXFxuIFxcdFxcdFxcdCAgIG5say1cXHUwMDNlcG9ydGlkLFxcbi1cXHRcXHRcXHQgICBubGstXFx1MDAzZWdyb3VwcyA/ICh1MzIpbmxrLVxcdTAwM2Vncm91cHNbMF0gOiAwLFxcbitcXHRcXHRcXHQgICBncm91cHMgPyAodTMyKWdyb3Vwc1swXSA6IDAsXFxuIFxcdFxcdFxcdCAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLFxcbiBcXHRcXHRcXHQgICBza193bWVtX2FsbG9jX2dldChzKSxcXG4gXFx0XFx0XFx0ICAgUkVBRF9PTkNFKG5say1cXHUwMDNlY2JfcnVubmluZyksXFxuZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuY1xcbmluZGV4IDBiM2UwMjFiZDBlZDIuLjc5NzliZDliMjYwNjAgMTAwNjQ0XFxuLS0tIGEvbmV0L25ldGxpbmsvZGlhZy5jXFxuKysrIGIvbmV0L25ldGxpbmsvZGlhZy5jXFxuQEAgLTEyLDEyICsxMiwyNCBAQFxcbiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXFxuIHtcXG4gXFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcXG4tXFxuLVxcdGlmIChubGstXFx1MDAzZWdyb3VwcyA9PSBOVUxMKVxcbitcXHR1bnNpZ25lZCBsb25nICpncm91cHM7XFxuK1xcdHVuc2lnbmVkIGludCBuZ3JvdXBzO1xcbitcXG4rXFx0LyogSGFzaGVkIHNvY2tldHMgYXJlIGR1bXBlZCBmcm9tIHRoZSByaGFzaHRhYmxlIHdhbGssIHdoaWNoIG9ubHlcXG4rXFx0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2VcXG4rXFx0ICogbmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcyBhdCBhbnkgdGltZS5cXG4rXFx0ICpcXG4rXFx0ICogUmVhZCBubGstXFx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxcbitcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxuK1xcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXFxuK1xcdCAqIGZyZWVkIGFmdGVyIGFuIFJDVSBncmFjZSBwZXJpb2QuXFxuK1xcdCAqL1xcbitcXHRuZ3JvdXBzID0gc21wX2xvYWRfYWNxdWlyZShcXHUwMDI2bmxrLVxcdTAwM2VuZ3JvdXBzKTtcXG4rXFx0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cXHUwMDNlZ3JvdXBzKTtcXG4rXFx0aWYgKCFncm91cHMpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSxcXG4tXFx0XFx0ICAgICAgIG5say1cXHUwMDNlZ3JvdXBzKTtcXG4rXFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyODo1MS45MTY2MTk3MzlaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjExMDQyMTA5MTQ0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJORVRMSU5LX0RJQUdcIixcbiAgICBcIlBST0NfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzXCIsXG4gICAgXCJza19kaWFnX2R1bXBfZ3JvdXBzXCIsXG4gICAgXCJuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgbG9ja2xlc3MgUkNVIHN5bmNocm9uaXphdGlvbiBmb3IgTmV0bGluayBzb2NrZXQgbXVsdGljYXN0IGdyb3VwcyAobmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcykgYWNyb3NzIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc2tfZGlhZ19kdW1wX2dyb3VwcygpLCBhbmQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKS4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZyBjb25jdXJyZW5jeSBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsgc29ja2V0IGJpbmQvc2V0c29ja29wdCwgc29ja19kaWFnIGR1bXAsIGFuZCAvcHJvYy9uZXQvbmV0bGluayByZWFkcy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBkYXRhIHJhY2VzLCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzLCBvciBVQUZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDQ5NTA1ZmNhYjA4NDUzM2E0YWNhMWVlMDU1OTBjMWU1OGI5MzdjYTJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNzoyODo0OCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xuaW5kZXggZTZiMWQ5NzU4YzljOS4uOWZkZjk2NDIyNGFiNCAxMDA2NDRcbi0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xuKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jXG5AQCAtOTIyLDkgKzkyMiw5IEBAIG5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcbiBcbiBzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIHtcbitcdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDtcbiBcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gXHR1bnNpZ25lZCBpbnQgZ3JvdXBzO1xuLVx0dW5zaWduZWQgbG9uZyAqbmV3X2dyb3VwcztcbiBcdGludCBlcnIgPSAwO1xuIFxuIFx0bmV0bGlua190YWJsZV9ncmFiKCk7XG5AQCAtOTM4LDE4ICs5MzgsMzcgQEAgc3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcbiBcdGlmIChubGstXHUwMDNlbmdyb3VwcyBcdTAwM2U9IGdyb3VwcylcbiBcdFx0Z290byBvdXRfdW5sb2NrO1xuIFxuLVx0bmV3X2dyb3VwcyA9IGtyZWFsbG9jKG5say1cdTAwM2Vncm91cHMsIE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XG4tXHRpZiAobmV3X2dyb3VwcyA9PSBOVUxMKSB7XG4rXHQvKiBDYW4gbm90IHVzZSBrcmVhbGxvYygpLCBiZWNhdXNlIHRoZSBvbGQgYnVmZmVyIG1pZ2h0IGJlIGZyZWVkXG4rXHQgKiBpbW1lZGlhdGVseSwgd2hpbGUgbG9ja2xlc3MgcmVhZGVycyAobmV0bGluayBkaWFnIGR1bXAgYW5kXG4rXHQgKiAvcHJvYy9uZXQvbmV0bGluaykgY2FuIHN0aWxsIGJlIGxvb2tpbmcgYXQgaXQuXG4rXHQgKi9cbitcdG5ld19ncm91cHMgPSBremFsbG9jKE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XG4rXHRpZiAoIW5ld19ncm91cHMpIHtcbiBcdFx0ZXJyID0gLUVOT01FTTtcbiBcdFx0Z290byBvdXRfdW5sb2NrO1xuIFx0fVxuLVx0bWVtc2V0KChjaGFyICopbmV3X2dyb3VwcyArIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpLCAwLFxuLVx0ICAgICAgIE5MR1JQU1ooZ3JvdXBzKSAtIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpKTtcbitcdG9sZF9ncm91cHMgPSBubGstXHUwMDNlZ3JvdXBzO1xuK1x0aWYgKG9sZF9ncm91cHMpXG4rXHRcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4rXG4rXHQvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzc1xuK1x0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcbitcdCAqIHdoaWxlIHN0aWxsIHNlZWluZyB0aGUgb2xkIChzbWFsbGVyKSBubGstXHUwMDNlbmdyb3Vwcy5cbitcdCAqL1xuK1x0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XG4rXG4rXHQvKiBUaGVuIHB1Ymxpc2ggdGhlIG5ldyBzaXplOiBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tXG4rXHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG4rXHQgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLlxuK1x0ICovXG4rXHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZubGstXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcbiBcbi1cdG5say1cdTAwM2Vncm91cHMgPSBuZXdfZ3JvdXBzO1xuLVx0bmxrLVx1MDAzZW5ncm91cHMgPSBncm91cHM7XG4gIG91dF91bmxvY2s6XG4gXHRuZXRsaW5rX3RhYmxlX3VuZ3JhYigpO1xuK1xuK1x0aWYgKG9sZF9ncm91cHMpXG4rXHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xuK1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtMjcwNSwxMiArMjcyNCwxOSBAQCBzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuIFx0fSBlbHNlIHtcbiBcdFx0c3RydWN0IHNvY2sgKnMgPSB2O1xuIFx0XHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2socyk7XG4rXHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgKmdyb3VwcztcbitcbitcdFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXG4rXHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG4rXHRcdCAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC5cbitcdFx0ICovXG4rXHRcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbiBcbiBcdFx0c2VxX3ByaW50ZihzZXEsIFwiJXBLICUtM2QgJS0xMHUgJTA4eCAlLThkICUtOGQgJS01ZCAlLThkICUtOHUgJS04bGx1XFxuXCIsXG4gXHRcdFx0ICAgcyxcbiBcdFx0XHQgICBzLVx1MDAzZXNrX3Byb3RvY29sLFxuIFx0XHRcdCAgIG5say1cdTAwM2Vwb3J0aWQsXG4tXHRcdFx0ICAgbmxrLVx1MDAzZWdyb3VwcyA/ICh1MzIpbmxrLVx1MDAzZWdyb3Vwc1swXSA6IDAsXG4rXHRcdFx0ICAgZ3JvdXBzID8gKHUzMilncm91cHNbMF0gOiAwLFxuIFx0XHRcdCAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIHNrX3dtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIFJFQURfT05DRShubGstXHUwMDNlY2JfcnVubmluZyksXG5kaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZGlhZy5jIGIvbmV0L25ldGxpbmsvZGlhZy5jXG5pbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NFxuLS0tIGEvbmV0L25ldGxpbmsvZGlhZy5jXG4rKysgYi9uZXQvbmV0bGluay9kaWFnLmNcbkBAIC0xMiwxMiArMTIsMjQgQEBcbiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXG4ge1xuIFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcbi1cbi1cdGlmIChubGstXHUwMDNlZ3JvdXBzID09IE5VTEwpXG4rXHR1bnNpZ25lZCBsb25nICpncm91cHM7XG4rXHR1bnNpZ25lZCBpbnQgbmdyb3VwcztcbitcbitcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XG4rXHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxuK1x0ICogbmxrLVx1MDAzZWdyb3VwcyBhbmQgbmxrLVx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXG4rXHQgKlxuK1x0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG4rXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XG4rXHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xuK1x0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cbitcdCAqL1xuK1x0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2bmxrLVx1MDAzZW5ncm91cHMpO1xuK1x0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuK1x0aWYgKCFncm91cHMpXG4gXHRcdHJldHVybiAwO1xuIFxuLVx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpLFxuLVx0XHQgICAgICAgbmxrLVx1MDAzZWdyb3Vwcyk7XG4rXHRyZXR1cm4gbmxhX3B1dChubHNrYiwgTkVUTElOS19ESUFHX0dST1VQUywgTkxHUlBTWihuZ3JvdXBzKSwgZ3JvdXBzKTtcbiB9XG4gXG4gc3RhdGljIGludCBza19kaWFnX3B1dF9mbGFncyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyODo1MS45MTY2MjEyNDlaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMjY2NzQ0MDIxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIFN1aXRhYmlsaXR5IEFuYWx5c2lzOiBOZXRsaW5rIFBhdGNoKipcblxuT2theSwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaCBhbmQgZGVjaWRlIGlmIGl0J3Mgd29ydGggb3VyIHRpbWUgZnV6emluZyB3aXRoIHN5emthbGxlci4gRnJvbSBhIHNhZmV0eSBwZXJzcGVjdGl2ZSwgdGhpcyBpcyBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgdHJpYWdlIHRhc2sg4oCTIGJlbmlnbiBkZXZlbG9wZXIgUUEsIHBhcnQgb2YgdGhlIG5vcm1hbCBtYWludGVuYW5jZSBhbmQgZGVmZW5zaXZlIHNlY3VyaXR5IHdvcmtmbG93LlxuXG5BbHJpZ2h0LCB0aGUgcGF0Y2ggbW9kaWZpZXMgYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AgYW5kIGBuZXQvbmV0bGluay9kaWFnLmNgLiBTcGVjaWZpY2FsbHksIEkgc2VlIGNoYW5nZXMgaW4gYG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKWAgcmVwbGFjaW5nIGBrcmVhbGxvYygpYCB3aXRoIGBremFsbG9jKClgLCBgbWVtY3B5KClgLCBhdG9taWMgc3RvcmVzIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAoKWAsIGFuZCByZWxhdGVkIGNoYW5nZXMgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYC5cblxuVGhpcyBpcyBjb3JlIG5ldHdvcmtpbmcgY29kZSwgc3BlY2lmaWNhbGx5IE5ldGxpbmsuIE5ldGxpbmsgaXMgZGVmaW5pdGVseSBhIHByaW1lIHRhcmdldCwgaXQncyBwcmV0dHkgbXVjaCBldmVyeXdoZXJlLCBhbmQgcmVhY2hhYmxlIHZpYSB1bnByaXZpbGVnZWQgdXNlciBzb2NrZXRzIOKAkyBgc29ja2V0KEFGX05FVExJTkssIC4uLilgLCBkaWFnIGludGVyZmFjZXMgKGBORVRMSU5LX0lORVRfRElBR2AsIGBORVRMSU5LX0RJQUdgKSwgZXZlbiBhY2Nlc3NpYmxlIHZpYSBgL3Byb2MvbmV0L25ldGxpbmtgLlxuXG5Ob3csIGxldCdzIGFwcGx5IHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBXZSBhcmUgbG9va2luZyBmb3IgXCJSZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlXCIgYW5kIGl0IGlzOlxuXG4tICAgQ29yZSBTdWJzeXN0ZW1zOiAqKkNvcmUgbmV0d29ya2luZyEqKlxuXG4tICAgUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOiAqKlJlc3RydWN0dXJpbmcgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb2RlIGZsb3chKipcblxuLSAgIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6ICoqTmV0bGluayB2aWEgc29ja2V0cyEqKlxuXG5ZZWFoLCBpdCdzIGNsZWFyOiBgV29ydGhGdXp6aW5nID0gdHJ1ZWAhIEkgZG9uJ3QgbmVlZCB0byBkaWcgZGVlcGVyLiBUaGlzIHBhdGNoIGRlZmluaXRlbHkgbWVldHMgdGhlIGNyaXRlcmlhLlxuXG5Ob3csIEknbGwgcHJvYmFibHkgZ28gdGhyb3VnaCBhbmQgdXNlIGdpdCBkaWZmIG9yIGdyZXAgb24gdGhlIHJlcG8gdG8gZG91YmxlLWNoZWNrIGV4YWN0IGZ1bmN0aW9uIGNhbGxlcnMsIGFuZCBtYXliZSBwb2tlIGFyb3VuZCBhdCBzb21lIHJlbGV2YW50IGNvbmZpZ3MganVzdCB0byBnZXQgYW4gb3ZlcmFsbCBzZW5zZSBmb3IgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyMDksIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyOToxNC41ODQwNjUyMjRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODU1MjkxNjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmV0bGlua19yZWFsbG9jX2dyb3Vwc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0bGlua1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTEyPW5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjItXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjkyMzpzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjQte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTk4OT1zdGF0aWMgaW50IG5ldGxpbmtfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqYWRkcixcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEwLVxcdFxcdFxcdHJldHVybiAtRVBFUk07XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwMTE6XFx0XFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwMTItXFx0XFx0aWYgKGVycilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjY3PXN0YXRpYyBpbnQgbmV0bGlua19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY5MS1cXHRcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjkyOlxcdFxcdGVyciA9IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc2spO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkzLVxcdFxcdGlmIChlcnIpXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjgtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3Mjk6XFx0XFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzAtXFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jLTE4LVxcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XFxubmV0L25ldGxpbmsvZGlhZy5jOjE5OlxcdCAqIGhvbGRzIHJjdV9yZWFkX2xvY2soKSwgd2hpbGUgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiByZXBsYWNlXFxubmV0L25ldGxpbmsvZGlhZy5jLTIwLVxcdCAqIG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmMtMjItXFx0ICogUmVhZCBubGstXFx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxcbm5ldC9uZXRsaW5rL2RpYWcuYzoyMzpcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxubmV0L25ldGxpbmsvZGlhZy5jLTI0LVxcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjE0LjY2OTU5ODcxWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzA5ODQ2MDEwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgS2NvbmZpZyBmaWxlcywgdGhpbmtpbmcgbGlrZSBhbiBleHBlcnQ6XG5cbioqRGl2aW5nIGludG8gdGhlIE5ldGxpbmsgRGlhZ25vc3RpYyBQbHVtYmluZyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyBmb3IgbmV0bGluayBkaWFnbm9zdGljcy4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIG9uIGBuZXQvbmV0bGluay9kaWFnLmNgIGFuZCBgbmV0L25ldGxpbmsvYWZfbmV0bGluay5jYC4gSSBleHBlY3QgdGhlc2UgZmlsZXMgY29udGFpbiB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIE5ldGxpbmsgZGlhZ25vc3RpYyBpbnRlcmZhY2UsIGFuZCB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzIGZhbWlseSBpbXBsZW1lbnRhdGlvbi5cblxuSSdsbCBiZSBsb29raW5nIGZvciB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgY29udHJvbCB0aGVpciBjb21waWxhdGlvbi4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBkZXBlbmRlbmNpZXMgb24gb3RoZXIgTmV0bGluayBmZWF0dXJlcywgbGlrZSB0aGUgY29yZSBOZXRsaW5rIHN1cHBvcnQgKGBORVRMSU5LYCkgaXRzZWxmLCBkaWZmZXJlbnQgTmV0bGluayBtZXNzYWdlIHR5cGVzLCBhbmQgcG90ZW50aWFsbHkgZXZlbiBzcGVjaWZpYyBzb2NrZXQgdHlwZXMgb3IgcHJvdG9jb2xzIGJ1aWx0IG9uIE5ldGxpbmsuIEknbGwgYWxzbyBjaGVjayBmb3Igb3B0aW9ucyB0aGF0IG1pZ2h0IGVuYWJsZSBvciBkaXNhYmxlIHNwZWNpZmljIGRpYWdub3N0aWMgbWVzc2FnZSB0eXBlcyBvciBmZWF0dXJlcyB3aXRoaW4gdGhlc2UgZmlsZXMuIEl0J3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIGhvdyBkZWVwbHkgdGhlIGRpYWdub3N0aWMgY29kZSBpcyBpbnRlZ3JhdGVkIGFuZCB3aGF0IG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgYXJlIHJlcXVpcmVkIG9yIGltcGFjdGVkIHdoZW4gZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGRpYWdub3N0aWMgZnVuY3Rpb25hbGl0aWVzIGZvciBOZXRsaW5rLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTA5LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MTcuNzY4MDYxODQxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMzY4NjIyMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJkaWFnXFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRsaW5rL01ha2VmaWxlPTY9b2JqLXkgIFxcdFxcdFxcdFxcdDo9IGFmX25ldGxpbmsubyBnZW5ldGxpbmsubyBwb2xpY3kub1xcbm5ldC9uZXRsaW5rL01ha2VmaWxlLTctXFxubmV0L25ldGxpbmsvTWFrZWZpbGU6ODpvYmotJChDT05GSUdfTkVUTElOS19ESUFHKVxcdCs9IG5ldGxpbmtfZGlhZy5vXFxubmV0L25ldGxpbmsvTWFrZWZpbGU6OTpuZXRsaW5rX2RpYWcteVxcdFxcdFxcdDo9IGRpYWcub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyOToxNy44NzE3NTQ3MDRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMTgxMDgwNDI0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBOZXRsaW5rIERpYWdub3N0aWNzKipcblxuT2theSwgc28gSSdtIHRyeWluZyB0byBmaWd1cmUgb3V0IGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBOZXRsaW5rIGRpYWdub3N0aWNzIGhlcmUuIFRoZSBmaXJzdCB0aGluZyBJJ2QgZG8gaXMgaW1tZWRpYXRlbHkgY2hlY2sgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBJIG5lZWQgdG8gc2VlIGlmIGBDT05GSUdfTkVUTElOS19ESUFHYCBpcyBldmVuIGVuYWJsZWQuIFRoYXQncyB0aGUgYmFzZWxpbmUsIHJpZ2h0PyBJdCdzIGxpa2UgY2hlY2tpbmcgdGhlIGZ1c2UgYm94IGJlZm9yZSBJIHN0YXJ0IHRyb3VibGVzaG9vdGluZyB0aGUgZWxlY3RyaWNhbCBzeXN0ZW0uIEknbGwgbmVlZCB0byBsb29rIGluIGBuZXQvbmV0bGluay9LY29uZmlnYCBvciwgaGVjaywgbWF5YmUgaXQncyBkZWZpbmVkIGVsc2V3aGVyZS4gR290dGEgYmUgdGhvcm91Z2guIFRpbWUgdG8gY3JhY2sgb3BlbiB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgc2VlIHdoYXQncyB3aGF0LiBHb3R0YSBtYWtlIHN1cmUgdGhpcyBkaWFnbm9zdGljIHN1cHBvcnQgaXMgYWN0dWFsbHkgY29tcGlsZWQgaW4gYmVmb3JlIEkgZ28gY2hhc2luZyBzaGFkb3dzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2Mjc2LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MjkuNjgyNTYyNjM2WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2MDQwODMyNDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5FVExJTktfRElBR1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9LY29uZmlnLTUtXFxubmV0L25ldGxpbmsvS2NvbmZpZzo2OmNvbmZpZyBORVRMSU5LX0RJQUdcXG5uZXQvbmV0bGluay9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIk5FVExJTks6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MzIuMjg2NjUxMjU1WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjE5MDQxNjU0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGBuZXQvbmV0bGluay9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNiwgYXMgdGhvdWdoIEkgd2VyZSBwb25kZXJpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gdGhlIE5ldGxpbmsgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IGEgZ29vZCBncmlwIG9uIGhvdyB0aGlzIE5ldGxpbmsgc3Vic3lzdGVtIGNvbmZpZ3VyZXMgaXRzZWxmLiBMZXQncyBzZWUuLi4gSSdtIGdvaW5nIHRvIHB1bGwgdXAgdGhhdCBgS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDYsIHRvIGdldCB0aGUgbGF5IG9mIHRoZSBsYW5kLiBJIGtub3cgdGhpcyBmaWxlIGhvbGRzIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBvcHRpb25zLCBzbyB0aGF0J3Mgd2hlcmUgdGhlIGNyaXRpY2FsIGRlY2lzaW9ucyBhYm91dCB3aGljaCBOZXRsaW5rIGZlYXR1cmVzIGdldCBidWlsdCBpbnRvIHRoZSBrZXJuZWwgYXJlIG1hZGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIGNvcmUgZGVwZW5kZW5jaWVzIGFyZS4gSSdtIGhvcGluZyB0byB1bmRlcnN0YW5kIHdoYXQgYXJlIHRoZSAqYmFzZSogZmVhdHVyZXMgYW5kIHdoYXQgZGVwZW5kcyBvbiB3aGF0LiBUaGlzIGlzIGNydWNpYWwgZm9yIGN1c3RvbWl6aW5nIGEga2VybmVsIGVmZmVjdGl2ZWx5LCBvciB0cm91Ymxlc2hvb3RpbmcgYnVpbGQgaXNzdWVzLiBXaGF0IGFyZSB0aGUga2V5IHN3aXRjaGVzIGZvciBpbmNsdWRpbmcgTmV0bGluayBzdXBwb3J0LCBhbmQgd2hhdCBhcmUgdGhlaXIgZGVwZW5kZW5jaWVzPyBVbmRlcnN0YW5kaW5nIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpcyBhYnNvbHV0ZWx5IGZ1bmRhbWVudGFsLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTUxLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MzQuNDc3MDcwOTIyWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg4MTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9uZXRsaW5rL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTmV0bGluayBTb2NrZXRzXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdGNvbmZpZyBORVRMSU5LX0RJQUdcXG4gICA3OlxcdFxcdHRyaXN0YXRlIFxcXCJORVRMSU5LOiBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2VcXFwiXFxuICAgODpcXHRcXHRkZWZhdWx0IG5cXG4gICA5OlxcdFxcdGhlbHBcXG4gIDEwOlxcdFxcdCAgU3VwcG9ydCBmb3IgTkVUTElOSyBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3MgdG9vbC5cXG4gIDExOlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgWS5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MzQuNDc3MTYyNjMyWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE0MzAzODgxODgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IE5ldGxpbmsgTW9kdWxlIERlZXAgRGl2ZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZSBidWlsZCBwcm9jZXNzIGZvciB0aGUgTmV0bGluayBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBgYWZfbmV0bGluay5jYC4gR29vZCwgaXQncyBhbHdheXMgaW5jbHVkZWQ7IGBvYmoteWAgbWVhbnMgdGhhdCBmaWxlLCBhbG9uZyB3aXRoIGBnZW5ldGxpbmsub2AgYW5kIGBwb2xpY3kub2AsIGFyZSBhbHdheXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLiBObyBzdXJwcmlzZXMgdGhlcmUuXG5cbk5vdywgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBkaWFnbm9zdGljIGludGVyZmFjZS4gYGRpYWcuY2AgaXMgb25seSBidWlsdCBpZiBgQ09ORklHX05FVExJTktfRElBR2AgaXMgc2V0LiBSaWdodCwgbGV0J3MgY29uZmlybS4gSXQncyBqdXN0IGEgY29uZmlnIG9wdGlvbiwgbm8gZGVwZW5kZW5jaWVzLiBDbGVhbiBhbmQgc2ltcGxlLiBCdXQgSSB3b25kZXIgYWJvdXQgcHJvY2ZzIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLi4uIEkga25vdyB0aGF0J3MgcmVsYXRlZCB0byBkaWFnbm9zdGljcy4gSSB0aGluayBJJ2xsIGhhdmUgdG8gZGVsdmUgaW50byBgYWZfbmV0bGluay5jYCBuZWFyIHRoZSBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgIGZ1bmN0aW9uLCBhcm91bmQgbGluZXMgMjcwMC0yODAwLCB0byBzZWUgaG93IHRoYXQgaG9vayB3b3Jrcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjkyNywiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzMiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjQ4Ljc4MTA0NzAwNVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDUzMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvYWZfbmV0bGluay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI3MDAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI3MDA6XFx0XFxuMjcwMTpcXHRzdGF0aWMgdm9pZCAqbmV0bGlua19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXFxuMjcwMjpcXHR7XFxuMjcwMzpcXHRcXHQrKypwb3M7XFxuMjcwNDpcXHRcXHRyZXR1cm4gX19uZXRsaW5rX3NlcV9uZXh0KHNlcSk7XFxuMjcwNTpcXHR9XFxuMjcwNjpcXHRcXG4yNzA3OlxcdHN0YXRpYyB2b2lkIG5ldGxpbmtfbmF0aXZlX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbjI3MDg6XFx0e1xcbjI3MDk6XFx0XFx0c3RydWN0IG5sX3NlcV9pdGVyICppdGVyID0gc2VxLVxcdTAwM2Vwcml2YXRlO1xcbjI3MTA6XFx0XFxuMjcxMTpcXHRcXHRpZiAoaXRlci1cXHUwMDNlbGluayBcXHUwMDNlPSBNQVhfTElOS1MpXFxuMjcxMjpcXHRcXHRcXHRyZXR1cm47XFxuMjcxMzpcXHRcXG4yNzE0OlxcdFxcdG5ldGxpbmtfd2Fsa19zdG9wKGl0ZXIpO1xcbjI3MTU6XFx0fVxcbjI3MTY6XFx0XFxuMjcxNzpcXHRcXG4yNzE4OlxcdHN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuMjcxOTpcXHR7XFxuMjcyMDpcXHRcXHRpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHtcXG4yNzIxOlxcdFxcdFxcdHNlcV9wdXRzKHNlcSxcXG4yNzIyOlxcdFxcdFxcdFxcdCBcXFwic2sgICAgICAgICAgICAgICBFdGggUGlkICAgICAgICBHcm91cHMgICBcXFwiXFxuMjcyMzpcXHRcXHRcXHRcXHQgXFxcIlJtZW0gICAgIFdtZW0gICAgIER1bXAgIExvY2tzICAgIERyb3BzICAgIElub2RlXFxcXG5cXFwiKTtcXG4yNzI0OlxcdFxcdH0gZWxzZSB7XFxuMjcyNTpcXHRcXHRcXHRzdHJ1Y3Qgc29jayAqcyA9IHY7XFxuMjcyNjpcXHRcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2socyk7XFxuMjcyNzpcXHRcXHRcXHRjb25zdCB1bnNpZ25lZCBsb25nICpncm91cHM7XFxuMjcyODpcXHRcXG4yNzI5OlxcdFxcdFxcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxcbjI3MzA6XFx0XFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuMjczMTpcXHRcXHRcXHQgKiBSQ1UgZ3JhY2UgcGVyaW9kLCBhbmQgdGhpcyB3YWxrIGlzIFJDVSBwcm90ZWN0ZWQuXFxuMjczMjpcXHRcXHRcXHQgKi9cXG4yNzMzOlxcdFxcdFxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxuMjczNDpcXHRcXG4yNzM1OlxcdFxcdFxcdHNlcV9wcmludGYoc2VxLCBcXFwiJXBLICUtM2QgJS0xMHUgJTA4eCAlLThkICUtOGQgJS01ZCAlLThkICUtOHUgJS04bGx1XFxcXG5cXFwiLFxcbjI3MzY6XFx0XFx0XFx0XFx0ICAgcyxcXG4yNzM3OlxcdFxcdFxcdFxcdCAgIHMtXFx1MDAzZXNrX3Byb3RvY29sLFxcbjI3Mzg6XFx0XFx0XFx0XFx0ICAgbmxrLVxcdTAwM2Vwb3J0aWQsXFxuMjczOTpcXHRcXHRcXHRcXHQgICBncm91cHMgPyAodTMyKWdyb3Vwc1swXSA6IDAsXFxuMjc0MDpcXHRcXHRcXHRcXHQgICBza19ybWVtX2FsbG9jX2dldChzKSxcXG4yNzQxOlxcdFxcdFxcdFxcdCAgIHNrX3dtZW1fYWxsb2NfZ2V0KHMpLFxcbjI3NDI6XFx0XFx0XFx0XFx0ICAgUkVBRF9PTkNFKG5say1cXHUwMDNlY2JfcnVubmluZyksXFxuMjc0MzpcXHRcXHRcXHRcXHQgICByZWZjb3VudF9yZWFkKFxcdTAwMjZzLVxcdTAwM2Vza19yZWZjbnQpLFxcbjI3NDQ6XFx0XFx0XFx0XFx0ICAgc2tfZHJvcHNfcmVhZChzKSxcXG4yNzQ1OlxcdFxcdFxcdFxcdCAgIHNvY2tfaV9pbm8ocylcXG4yNzQ2OlxcdFxcdFxcdFxcdCk7XFxuMjc0NzpcXHRcXG4yNzQ4OlxcdFxcdH1cXG4yNzQ5OlxcdFxcdHJldHVybiAwO1xcbjI3NTA6XFx0fVxcbjI3NTE6XFx0XFxuMjc1MjpcXHQjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxuMjc1MzpcXHRzdHJ1Y3QgYnBmX2l0ZXJfX25ldGxpbmsge1xcbjI3NTQ6XFx0XFx0X19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpO1xcbjI3NTU6XFx0XFx0X19icGZfbWRfcHRyKHN0cnVjdCBuZXRsaW5rX3NvY2sgKiwgc2spO1xcbjI3NTY6XFx0fTtcXG4yNzU3OlxcdFxcbjI3NTg6XFx0REVGSU5FX0JQRl9JVEVSX0ZVTkMobmV0bGluaywgc3RydWN0IGJwZl9pdGVyX21ldGEgKm1ldGEsIHN0cnVjdCBuZXRsaW5rX3NvY2sgKnNrKVxcbjI3NTk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjQ4Ljc4MTE5Mzg2NVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3NTEyMTUzMjE5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBVc2FnZSoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGUga2VybmVsIGNvZGUuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB0cmFjZSB0aGUgdXRpbGl6YXRpb24gb2YgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbnRleHRzIGluIHdoaWNoIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKmNhbGxlZCouIFRoZSBuYW1lIGl0c2VsZiBzdWdnZXN0cyBhIHNlcXVlbmNlLWJhc2VkIGRpc3BsYXksIHNvIGl0J3MgcHJvYmFibHkgcmVsYXRlZCB0byBzb21lIHNvcnQgb2YgbmV0bGluayBkYXRhIHByZXNlbnRhdGlvbiwgcGVyaGFwcyBmb3IgbW9uaXRvcmluZyBvciBkZWJ1Z2dpbmcuIExldCdzIHNlZSB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgdXNlZDsgSSBuZWVkIHRvIGZpbmQgdGhlIGNhbGwgc2l0ZXMgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlLiBUaGF0J2xsIGdpdmUgbWUgdGhlIGVzc2VudGlhbCBjb250ZXh0IEkgbmVlZCB0byByZWFsbHkgdW5kZXJzdGFuZCBpdHMgcHVycG9zZSBhbmQgcm9sZSB3aXRoaW4gdGhlIHdpZGVyIG5ldGxpbmsgaW5mcmFzdHJ1Y3R1cmUuIFRoZW4gSSBjYW4gdW5kZXJzdGFuZCBob3cgdGhpcyBmdW5jdGlvbiBmaXRzIGludG8gdGhlIGJpZ2dlciBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjQ0LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyOTo1Ni4yOTMzNTA1ODRaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MDgzODgyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0bGlua1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcwNz1zdGF0aWMgdm9pZCBuZXRsaW5rX25hdGl2ZV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzE3LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzE4OnN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MTkte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3NzI9c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3NzktXFx0aWYgKCFwcm9nKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzgwOlxcdFxcdHJldHVybiBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyhzZXEsIHYpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzgxLVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI4MDM9c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjgwNTpcXHRyZXR1cm4gbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc2VxLCB2KTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgwNi19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjU2Ljc0NDE5NDgzMVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3NTc5MjEzMjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZTpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBOZXRsaW5rIFNlcXVlbmNlIFNob3cgRnVuY3Rpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBpbnRvIHRoZSBgL3Byb2MvbmV0L25ldGxpbmtgIGludGVyZmFjZSwgd2hpY2gsIGFzIEkgcmVjYWxsLCBpcyBjb21waWxlZCB3aGVuIGBDT05GSUdfUFJPQ19GU2AgaXMgZW5hYmxlZC4gTXkgZm9jdXMgaXMgb24gdW5kZXJzdGFuZGluZyB0aGUgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSBpbiBwb3B1bGF0aW5nIHRoYXQgcHJvYyBlbnRyeS4gVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIHNlZSBob3cgYG5ldGxpbmtfc2VxX3Nob3dgIGlzIHVzZWQgYW5kIHdoZXJlIHdpdGhpbiBgYWZfbmV0bGluay5jYC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODgyMiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMwOjA0LjMyMzQxMjI3OVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUzOTUzMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmV0bGlua19zZXFfc2hvd1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0bGlua1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjc2MD1zdGF0aWMgaW50IG5ldGxpbmtfcHJvZ19zZXFfc2hvdyhzdHJ1Y3QgYnBmX3Byb2cgKnByb2csXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjc3MS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Mjc3MjpzdGF0aWMgaW50IG5ldGxpbmtfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3NzMte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3ODg9c3RhdGljIHZvaWQgbmV0bGlua19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODAyLSNlbHNlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MDM6c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODE0PXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmV0bGlua19zZXFfb3BzID0ge1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4MTctXFx0LnN0b3AgICA9IG5ldGxpbmtfc2VxX3N0b3AsXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MTg6XFx0LnNob3cgICA9IG5ldGxpbmtfc2VxX3Nob3csXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4MTktfTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6MDQuMzg4ODEzMzM5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMwMzQ2NDUwMDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZCwgaW4gdGhlIGZpcnN0IHBlcnNvbiBhbmQgdGFyZ2V0ZWQgdG93YXJkcyBhbiBleHBlcnQsIHN0YXJ0aW5nIHdpdGggdGhlIGJvbGRlZCBoZWFkZXI6XG5cbioqRGl2aW5nIGludG8gYG5ldGxpbmtfc2VxX29wc2AgYW5kIHRoZSBQcm9jIEZpbGVzeXN0ZW0qKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGBuZXRsaW5rX3NlcV9vcHNgIGFuZCB0aGUgcHJvYyBmaWxlc3lzdGVtLiBJdOKAmXMgYmVlbiBhIHdoaWxlIHNpbmNlIEkndmUgcmVhbGx5IGR1ZyBpbnRvIHRoaXMgc3BlY2lmaWMgYXJlYSBvZiB0aGUga2VybmVsLCBzbyBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIHF1aWNrbHkgcHV0IHRoZSBwaWVjZXMgdG9nZXRoZXIuIEkgc3VzcGVjdCB0aGVyZSBtaWdodCBiZSBzb21lIGludGVyYWN0aW9uIGFyb3VuZCBleHBvcnRpbmcga2VybmVsIGluZm9ybWF0aW9uIG9yIGNvbmZpZ3VyaW5nIHNvbWUgYXNwZWN0cyB0aHJvdWdoIHByb2MsIHVzaW5nIGEgc2VxdWVuY2UgZmlsZSBpbnRlcmZhY2UgYmFja2VkIGJ5IE5ldGxpbmsgdG8gaGFuZGxlIHVwZGF0ZXMgb3IgcXVlcmllcy4gVGhhdCB3b3VsZCBtYWtlIHNlbnNlLCBidXQgSSdtIGp1c3QgZ3Vlc3NpbmcgYXQgdGhpcyBwb2ludC5cblxuVGhlIGBuZXRsaW5rX3NlcV9vcHNgIHN0cnVjdHVyZSBpdHNlbGYgaXMgYSB2aXRhbCBjbHVlLCBwb2ludGluZyB0b3dhcmQgdGhlIHNlcXVlbmNlIGZpbGUgb3BlcmF0aW9ucy4gR2l2ZW4gTmV0bGluaydzIG1lc3NhZ2UtcGFzc2luZyBuYXR1cmUsIEknbSBlbnZpc2lvbmluZyBhIHNldHVwIHdoZXJlIHByb2MgZW50cmllcyBsZXZlcmFnZSBgbmV0bGlua19zZXFfb3BzYCB0byBpbnRlcmFjdCB3aXRoIGtlcm5lbCBkYXRhIHRoYXQgaXMgZHluYW1pYywgdXBkYXRlYWJsZSwgb3IgcmVxdWlyZXMgcmVhbC10aW1lIGluZm9ybWF0aW9uIGV4Y2hhbmdlLiBUaGUgcHJvYyBmaWxlc3lzdGVtLCBhcyBhIHZpcnR1YWwgZmlsZXN5c3RlbSwgYWN0cyBhcyB0aGUgaW50ZXJmYWNlLCBhbmQgYG5ldGxpbmtfc2VxX29wc2AgaGFuZGxlcyB0aGUgdW5kZXJseWluZyBjb21tdW5pY2F0aW9uIGFuZCBkYXRhIG1hbmlwdWxhdGlvbi4gVGhlIHF1ZXN0aW9uIGlzLCBob3cgY2xlYW5seSBpbnRlZ3JhdGVkIGFyZSB0aGV5PyBBcmUgd2UgZGVhbGluZyB3aXRoIGEgdGlnaHQsIHdlbGwtZGVmaW5lZCBhcmNoaXRlY3R1cmUsIG9yIGlzIGl0IGEgbW9yZSBhZC1ob2MgYXJyYW5nZW1lbnQgdGhhdCBldm9sdmVkIG92ZXIgdGltZT8gSSdtIGN1cmlvdXMgYWJvdXQgdGhlIHNwZWNpZmljIHVzZSBjYXNlcy4gV2hhdCBraW5kIG9mIGRhdGEgYXJlIHRoZXkgZXhjaGFuZ2luZz8gSXMgaXQgbW9zdGx5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycywgbW9uaXRvcmluZyBzdGF0aXN0aWNzLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gVGltZSB0byBpbnZlc3RpZ2F0ZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzkyLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6MDcuNDIzNDYxMjk5WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTMyOTYzMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXRsaW5rX3NlcV9vcHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L25ldGxpbmtcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI4MDg9c3RhdGljIHZvaWQgbmV0bGlua19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODEzLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODE0OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmV0bGlua19zZXFfb3BzID0ge1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODE1LVxcdC5zdGFydCAgPSBuZXRsaW5rX3NlcV9zdGFydCxcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODYwPXN0YXRpYyBpbnQgX19uZXRfaW5pdCBuZXRsaW5rX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldClcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODYyLSNpZmRlZiBDT05GSUdfUFJPQ19GU1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODYzOlxcdGlmICghcHJvY19jcmVhdGVfbmV0KFxcXCJuZXRsaW5rXFxcIiwgMCwgbmV0LVxcdTAwM2Vwcm9jX25ldCwgXFx1MDAyNm5ldGxpbmtfc2VxX29wcyxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjg2NC1cXHRcXHRcXHRzaXplb2Yoc3RydWN0IG5sX3NlcV9pdGVyKSkpXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjkyMj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIG5ldGxpbmtfc2VxX2luZm8gPSB7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI5MjM6XFx0LnNlcV9vcHNcXHRcXHQ9IFxcdTAwMjZuZXRsaW5rX3NlcV9vcHMsXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI5MjQtXFx0LmluaXRfc2VxX3ByaXZhdGVcXHQ9IGJwZl9pdGVyX2luaXRfc2VxX25ldCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6MDcuNDcyNzk5ODExWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIyNjExMTg4ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYXMgaWYgdGhleSB3ZXJlIG15IG93bjpcblxuKipOYXZpZ2F0aW5nIHRoZSBOZXRsaW5rIExhbmRzY2FwZSoqXG5cblJpZ2h0LCBgQ09ORklHX1BST0NfRlNgLi4uIHRoYXQgcmluZ3MgYSBiZWxsLiBJdCdzIG9idmlvdXNseSBsaW5rZWQgdG8gdGhhdCBgcHJvY19jcmVhdGVfbmV0KFwibmV0bGlua1wiLCAuLi4pYCBjYWxsIEkgcmVtZW1iZXIgc2VlaW5nLiBOb3csIEknbSB0cnlpbmcgdG8gZmlndXJlIG91dCBob3cgYSBwYXJ0aWN1bGFyIG5ldGxpbmsgcmVsYXRlZCBjb2RlIHdvcmtzIC0gaG93IGRvZXMgaXQgd29yaywgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGtlcm5lbD8gQW5kIEkgKnRoaW5rKiBpdCBpcyByZWxhdGVkIHRvIGhvdyB0aGUgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZC4gU28sIHdoYXQgYWJvdXQgYGRpYWcuY2A/IFRoYXQgZmVlbHMgbGlrZSBhIHJlbGV2YW50IGZpbGUsIHNwZWNpZmljYWxseSBpbiBgbmV0L25ldGxpbmsvZGlhZy5jYC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgdGhlcmUuIExldCdzIGRpZyBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxNjIsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDowOS43MzM5MjIzOTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTAwNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvZGlhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDcwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbiAgIDM6XFx0XFxuICAgNDpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L3NvY2suaFxcdTAwM2VcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9uZXRsaW5rLmhcXHUwMDNlXFxuICAgNjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc29ja19kaWFnLmhcXHUwMDNlXFxuICAgNzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbmV0bGlua19kaWFnLmhcXHUwMDNlXFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvcmhhc2h0YWJsZS5oXFx1MDAzZVxcbiAgIDk6XFx0XFxuICAxMDpcXHQjaW5jbHVkZSBcXFwiYWZfbmV0bGluay5oXFxcIlxcbiAgMTE6XFx0XFxuICAxMjpcXHRzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXFxuICAxMzpcXHR7XFxuICAxNDpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xcbiAgMTU6XFx0XFx0dW5zaWduZWQgbG9uZyAqZ3JvdXBzO1xcbiAgMTY6XFx0XFx0dW5zaWduZWQgaW50IG5ncm91cHM7XFxuICAxNzpcXHRcXG4gIDE4OlxcdFxcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XFxuICAxOTpcXHRcXHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxcbiAgMjA6XFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcyBhdCBhbnkgdGltZS5cXG4gIDIxOlxcdFxcdCAqXFxuICAyMjpcXHRcXHQgKiBSZWFkIG5say1cXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXFxuICAyMzpcXHRcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxuICAyNDpcXHRcXHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xcbiAgMjU6XFx0XFx0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cXG4gIDI2OlxcdFxcdCAqL1xcbiAgMjc6XFx0XFx0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNm5say1cXHUwMDNlbmdyb3Vwcyk7XFxuICAyODpcXHRcXHRncm91cHMgPSBSRUFEX09OQ0UobmxrLVxcdTAwM2Vncm91cHMpO1xcbiAgMjk6XFx0XFx0aWYgKCFncm91cHMpXFxuICAzMDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDMxOlxcdFxcbiAgMzI6XFx0XFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XFxuICAzMzpcXHR9XFxuICAzNDpcXHRcXG4gIDM1OlxcdHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbiAgMzY6XFx0e1xcbiAgMzc6XFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcXG4gIDM4OlxcdFxcdHUzMiBmbGFncyA9IDA7XFxuICAzOTpcXHRcXG4gIDQwOlxcdFxcdGlmIChubGstXFx1MDAzZWNiX3J1bm5pbmcpXFxuICA0MTpcXHRcXHRcXHRmbGFncyB8PSBORElBR19GTEFHX0NCX1JVTk5JTkc7XFxuICA0MjpcXHRcXHRpZiAobmxrX3Rlc3RfYml0KFJFQ1ZfUEtUSU5GTywgc2spKVxcbiAgNDM6XFx0XFx0XFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19QS1RJTkZPO1xcbiAgNDQ6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChCUk9BRENBU1RfU0VORF9FUlJPUiwgc2spKVxcbiAgNDU6XFx0XFx0XFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19CUk9BRENBU1RfRVJST1I7XFxuICA0NjpcXHRcXHRpZiAobmxrX3Rlc3RfYml0KFJFQ1ZfTk9fRU5PQlVGUywgc2spKVxcbiAgNDc6XFx0XFx0XFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19OT19FTk9CVUZTO1xcbiAgNDg6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChMSVNURU5fQUxMX05TSUQsIHNrKSlcXG4gIDQ5OlxcdFxcdFxcdGZsYWdzIHw9IE5ESUFHX0ZMQUdfTElTVEVOX0FMTF9OU0lEO1xcbiAgNTA6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChDQVBfQUNLLCBzaykpXFxuICA1MTpcXHRcXHRcXHRmbGFncyB8PSBORElBR19GTEFHX0NBUF9BQ0s7XFxuICA1MjpcXHRcXG4gIDUzOlxcdFxcdHJldHVybiBubGFfcHV0X3UzMihza2IsIE5FVExJTktfRElBR19GTEFHUywgZmxhZ3MpO1xcbiAgNTQ6XFx0fVxcbiAgNTU6XFx0XFxuICA1NjpcXHRzdGF0aWMgaW50IHNrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsXFxuICA1NzpcXHRcXHRcXHRcXHRzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSAqcmVxLFxcbiAgNTg6XFx0XFx0XFx0XFx0dTMyIHBvcnRpZCwgdTMyIHNlcSwgdTMyIGZsYWdzLCB1NjQgc2tfaW5vKVxcbiAgNTk6XFx0e1xcbiAgNjA6XFx0XFx0c3RydWN0IG5sbXNnaGRyICpubGg7XFxuICA2MTpcXHRcXHRzdHJ1Y3QgbmV0bGlua19kaWFnX21zZyAqcmVwO1xcbiAgNjI6XFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcXG4gIDYzOlxcdFxcbiAgNjQ6XFx0XFx0bmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIFNPQ0tfRElBR19CWV9GQU1JTFksIHNpemVvZigqcmVwKSxcXG4gIDY1OlxcdFxcdFxcdFxcdGZsYWdzKTtcXG4gIDY2OlxcdFxcdGlmICghbmxoKVxcbiAgNjc6XFx0XFx0XFx0cmV0dXJuIC1FTVNHU0laRTtcXG4gIDY4OlxcdFxcbiAgNjk6XFx0XFx0cmVwID0gbmxtc2dfZGF0YShubGgpO1xcbiAgNzA6XFx0XFx0cmVwLVxcdTAwM2VuZGlhZ19mYW1pbHlcXHQ9IEFGX05FVExJTks7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMwOjA5LjczNDAxNTM0NloiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDY4MjczMjc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkludmVzdGlnYXRpbmcgdGhlIG5ldGxpbmsgRGlhZ25vc2lzIENvZGUqKlxuXG5BbHJpZ2h0LCBJJ20gYXQgYSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG5ldC9uZXRsaW5rL2RpYWcuY2AgaXMgYWN0dWFsbHkgKnVzZWQqLiBKdXN0IHJlYWRpbmcgdGhlIGZ1bmN0aW9ucyBpbiBpc29sYXRpb24gaXNuJ3QgZW5vdWdoOyBJIG5lZWQgdGhlIGNvbnRleHQuIFdoZXJlIGFyZSB0aGUgZW50cnkgcG9pbnRzPyBXaGF0IHRyaWdnZXJzIHRoZXNlIGRpYWdub3NpcyBtZWNoYW5pc21zPyBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxzLCB0aGUgY2FsbGVyIGZ1bmN0aW9ucywgYW5kIHNlZSBob3cgdGhlIHBpZWNlcyBmaXQgdG9nZXRoZXIuIFNvLCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSwgSeKAmW0gZ29pbmcgdG8gZXhhbWluZSB0aGUgcmVzdCBvZiB0aGUgZmlsZSB0byBzZWUgaG93IHRob3NlIHNwZWNpZmljIGZ1bmN0aW9ucyB3aXRoaW4gYGRpYWcuY2AgYXJlIGludm9rZWQgd2l0aGluIHRoZSBOZXRsaW5rIGZyYW1ld29yay4gS25vd2luZyB0aGUgY2FsbHMgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkaWFnbm9zdGljIHByb2Nlc3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNTU3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDoxMS44MDIyOTIwMzJaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzA4MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvZGlhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDcxLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDcxOlxcdFxcdHJlcC1cXHUwMDNlbmRpYWdfdHlwZVxcdFxcdD0gc2stXFx1MDAzZXNrX3R5cGU7XFxuICA3MjpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX3Byb3RvY29sXFx0PSBzay1cXHUwMDNlc2tfcHJvdG9jb2w7XFxuICA3MzpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX3N0YXRlXFx0PSBzay1cXHUwMDNlc2tfc3RhdGU7XFxuICA3NDpcXHRcXG4gIDc1OlxcdFxcdHJlcC1cXHUwMDNlbmRpYWdfaW5vXFx0XFx0PSBza19pbm87XFxuICA3NjpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX3BvcnRpZFxcdD0gbmxrLVxcdTAwM2Vwb3J0aWQ7XFxuICA3NzpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX2RzdF9wb3J0aWRcXHQ9IG5say1cXHUwMDNlZHN0X3BvcnRpZDtcXG4gIDc4OlxcdFxcdHJlcC1cXHUwMDNlbmRpYWdfZHN0X2dyb3VwXFx0PSBubGstXFx1MDAzZWRzdF9ncm91cDtcXG4gIDc5OlxcdFxcdHNvY2tfZGlhZ19zYXZlX2Nvb2tpZShzaywgcmVwLVxcdTAwM2VuZGlhZ19jb29raWUpO1xcbiAgODA6XFx0XFxuICA4MTpcXHRcXHRpZiAoKHJlcS1cXHUwMDNlbmRpYWdfc2hvdyBcXHUwMDI2IE5ESUFHX1NIT1dfR1JPVVBTKSBcXHUwMDI2XFx1MDAyNlxcbiAgODI6XFx0XFx0ICAgIHNrX2RpYWdfZHVtcF9ncm91cHMoc2ssIHNrYikpXFxuICA4MzpcXHRcXHRcXHRnb3RvIG91dF9ubG1zZ190cmltO1xcbiAgODQ6XFx0XFxuICA4NTpcXHRcXHRpZiAoKHJlcS1cXHUwMDNlbmRpYWdfc2hvdyBcXHUwMDI2IE5ESUFHX1NIT1dfTUVNSU5GTykgXFx1MDAyNlxcdTAwMjZcXG4gIDg2OlxcdFxcdCAgICBzb2NrX2RpYWdfcHV0X21lbWluZm8oc2ssIHNrYiwgTkVUTElOS19ESUFHX01FTUlORk8pKVxcbiAgODc6XFx0XFx0XFx0Z290byBvdXRfbmxtc2dfdHJpbTtcXG4gIDg4OlxcdFxcbiAgODk6XFx0XFx0aWYgKChyZXEtXFx1MDAzZW5kaWFnX3Nob3cgXFx1MDAyNiBORElBR19TSE9XX0ZMQUdTKSBcXHUwMDI2XFx1MDAyNlxcbiAgOTA6XFx0XFx0ICAgIHNrX2RpYWdfcHV0X2ZsYWdzKHNrLCBza2IpKVxcbiAgOTE6XFx0XFx0XFx0Z290byBvdXRfbmxtc2dfdHJpbTtcXG4gIDkyOlxcdFxcbiAgOTM6XFx0XFx0bmxtc2dfZW5kKHNrYiwgbmxoKTtcXG4gIDk0OlxcdFxcdHJldHVybiAwO1xcbiAgOTU6XFx0XFxuICA5NjpcXHRvdXRfbmxtc2dfdHJpbTpcXG4gIDk3OlxcdFxcdG5sbXNnX2NhbmNlbChza2IsIG5saCk7XFxuICA5ODpcXHRcXHRyZXR1cm4gLUVNU0dTSVpFO1xcbiAgOTk6XFx0fVxcbiAxMDA6XFx0XFxuIDEwMTpcXHRzdGF0aWMgaW50IF9fbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLFxcbiAxMDI6XFx0XFx0XFx0XFx0XFx0aW50IHByb3RvY29sLCBpbnQgc19udW0pXFxuIDEwMzpcXHR7XFxuIDEwNDpcXHRcXHRzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICpodGkgPSAodm9pZCAqKWNiLVxcdTAwM2VhcmdzWzJdO1xcbiAxMDU6XFx0XFx0c3RydWN0IG5ldGxpbmtfdGFibGUgKnRibCA9IFxcdTAwMjZubF90YWJsZVtwcm90b2NvbF07XFxuIDEwNjpcXHRcXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItXFx1MDAzZXNrKTtcXG4gMTA3OlxcdFxcdHN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7XFxuIDEwODpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubHNrO1xcbiAxMDk6XFx0XFx0dW5zaWduZWQgbG9uZyBmbGFncztcXG4gMTEwOlxcdFxcdHN0cnVjdCBzb2NrICpzaztcXG4gMTExOlxcdFxcdGludCBudW0gPSAyO1xcbiAxMTI6XFx0XFx0aW50IHJldCA9IDA7XFxuIDExMzpcXHRcXG4gMTE0OlxcdFxcdHJlcSA9IG5sbXNnX2RhdGEoY2ItXFx1MDAzZW5saCk7XFxuIDExNTpcXHRcXG4gMTE2OlxcdFxcdGlmIChzX251bSBcXHUwMDNlIDEpXFxuIDExNzpcXHRcXHRcXHRnb3RvIG1jX2xpc3Q7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdG51bS0tO1xcbiAxMjA6XFx0XFxuIDEyMTpcXHRcXHRpZiAoIWh0aSkge1xcbiAxMjI6XFx0XFx0XFx0aHRpID0ga21hbGxvY19vYmooKmh0aSk7XFxuIDEyMzpcXHRcXHRcXHRpZiAoIWh0aSlcXG4gMTI0OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHRcXHRjYi1cXHUwMDNlYXJnc1syXSA9IChsb25nKWh0aTtcXG4gMTI3OlxcdFxcdH1cXG4gMTI4OlxcdFxcbiAxMjk6XFx0XFx0aWYgKCFzX251bSlcXG4gMTMwOlxcdFxcdFxcdHJoYXNodGFibGVfd2Fsa19lbnRlcihcXHUwMDI2dGJsLVxcdTAwM2VoYXNoLCBodGkpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDoxMS44MDIzNjQ1NDNaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzI5NTAzMDU3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkRpdmluZyBpbnRvIGBkaWFnLmNgKipcblxuQWxyaWdodCwgSSdtIGhlcmUsIHJlYWR5IHRvIGV4YW1pbmUgdGhlIHJlc3Qgb2YgYGRpYWcuY2AuIFRoZSBpbml0aWFsIGdsaW1wc2UgcHJvYmFibHkgaXNuJ3QgZW5vdWdoLCBhbmQgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoYXQgd2hhdCdzIG5leHQgaXMga2V5IHRvIHdoYXRldmVyJ3MgZ29pbmcgb24uIEkga25vdyBmcm9tIGV4cGVyaWVuY2UgdGhhdCBkaWFnbm9zdGljcyBjYW4gb2Z0ZW4gYmUgYSByYWJiaXQgaG9sZSwgYnV0IGFsc28gdGhlIGJyZWFkY3J1bWJzIHRoYXQgbGVhZCB0byB0aGUgc29sdXRpb24uIE15IGd1dCB0ZWxscyBtZSB0aGlzIG9uZSdzIHByb2JhYmx5IGdvaW5nIHRvIHByb3ZpZGUgY29udGV4dCB0byBlYXJsaWVyIHByb2JsZW1zLiBMZXQncyBzZWUgaWYgdGhlIHJlc3Qgb2YgaXQgcmV2ZWFscyB0aGUgcm9vdCBjYXVzZSwgb3IsIGF0IHRoZSB2ZXJ5IGxlYXN0LCBnaXZlcyBtZSBzb21lIHNvbGlkIGNsdWVzIGZvciB3aGVyZSB0byBsb29rIG5leHQuIEdvdHRhIHN0YXkgc2hhcnAgYW5kIGxvb2sgZm9yIHBhdHRlcm5zLCBkZXBlbmRlbmNpZXMsIGFuZCBhbnkgdW5leHBlY3RlZCBiZWhhdmlvcnMuIExldCdzIGRpZyBpbiBhbmQgc2VlIHdoYXQgc2VjcmV0cyB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgaG9sZHMhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNjg3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDoxOS4wOTczOTcyMzZaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzgwNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvZGlhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE4MCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE4MDpcXHRcXHRcXHRcXHRcXHQgTkVUTElOS19DQihjYi1cXHUwMDNlc2tiKS5wb3J0aWQsXFxuIDE4MTpcXHRcXHRcXHRcXHRcXHQgY2ItXFx1MDAzZW5saC1cXHUwMDNlbmxtc2dfc2VxLFxcbiAxODI6XFx0XFx0XFx0XFx0XFx0IE5MTV9GX01VTFRJLFxcbiAxODM6XFx0XFx0XFx0XFx0XFx0IHNvY2tfaV9pbm8oc2spKSBcXHUwMDNjIDApIHtcXG4gMTg0OlxcdFxcdFxcdFxcdHJldCA9IDE7XFxuIDE4NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTg2OlxcdFxcdFxcdH1cXG4gMTg3OlxcdFxcdFxcdG51bSsrO1xcbiAxODg6XFx0XFx0fVxcbiAxODk6XFx0XFx0cmVhZF91bmxvY2tfaXJxcmVzdG9yZShcXHUwMDI2bmxfdGFibGVfbG9jaywgZmxhZ3MpO1xcbiAxOTA6XFx0XFxuIDE5MTpcXHRkb25lOlxcbiAxOTI6XFx0XFx0Y2ItXFx1MDAzZWFyZ3NbMF0gPSBudW07XFxuIDE5MzpcXHRcXG4gMTk0OlxcdFxcdHJldHVybiByZXQ7XFxuIDE5NTpcXHR9XFxuIDE5NjpcXHRcXG4gMTk3OlxcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKVxcbiAxOTg6XFx0e1xcbiAxOTk6XFx0XFx0c3RydWN0IG5ldGxpbmtfZGlhZ19yZXEgKnJlcTtcXG4gMjAwOlxcdFxcdGludCBzX251bSA9IGNiLVxcdTAwM2VhcmdzWzBdO1xcbiAyMDE6XFx0XFx0aW50IGVyciA9IDA7XFxuIDIwMjpcXHRcXG4gMjAzOlxcdFxcdHJlcSA9IG5sbXNnX2RhdGEoY2ItXFx1MDAzZW5saCk7XFxuIDIwNDpcXHRcXG4gMjA1OlxcdFxcdGlmIChyZXEtXFx1MDAzZXNkaWFnX3Byb3RvY29sID09IE5ESUFHX1BST1RPX0FMTCkge1xcbiAyMDY6XFx0XFx0XFx0aW50IGk7XFxuIDIwNzpcXHRcXG4gMjA4OlxcdFxcdFxcdGZvciAoaSA9IGNiLVxcdTAwM2VhcmdzWzFdOyBpIFxcdTAwM2MgTUFYX0xJTktTOyBpKyspIHtcXG4gMjA5OlxcdFxcdFxcdFxcdGVyciA9IF9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgaSwgc19udW0pO1xcbiAyMTA6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMjExOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyMTI6XFx0XFx0XFx0XFx0c19udW0gPSAwO1xcbiAyMTM6XFx0XFx0XFx0fVxcbiAyMTQ6XFx0XFx0XFx0Y2ItXFx1MDAzZWFyZ3NbMV0gPSBpO1xcbiAyMTU6XFx0XFx0fSBlbHNlIHtcXG4gMjE2OlxcdFxcdFxcdGlmIChyZXEtXFx1MDAzZXNkaWFnX3Byb3RvY29sIFxcdTAwM2U9IE1BWF9MSU5LUylcXG4gMjE3OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbiAyMTg6XFx0XFxuIDIxOTpcXHRcXHRcXHRlcnIgPSBfX25ldGxpbmtfZGlhZ19kdW1wKHNrYiwgY2IsIHJlcS1cXHUwMDNlc2RpYWdfcHJvdG9jb2wsIHNfbnVtKTtcXG4gMjIwOlxcdFxcdH1cXG4gMjIxOlxcdFxcbiAyMjI6XFx0XFx0cmV0dXJuIGVyciBcXHUwMDNjPSAwID8gZXJyIDogc2tiLVxcdTAwM2VsZW47XFxuIDIyMzpcXHR9XFxuIDIyNDpcXHRcXG4gMjI1OlxcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXBfZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpXFxuIDIyNjpcXHR7XFxuIDIyNzpcXHRcXHRzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICpodGkgPSAodm9pZCAqKWNiLVxcdTAwM2VhcmdzWzJdO1xcbiAyMjg6XFx0XFxuIDIyOTpcXHRcXHRpZiAoY2ItXFx1MDAzZWFyZ3NbMF0gPT0gMSlcXG4gMjMwOlxcdFxcdFxcdHJoYXNodGFibGVfd2Fsa19leGl0KGh0aSk7XFxuIDIzMTpcXHRcXG4gMjMyOlxcdFxcdGtmcmVlKGh0aSk7XFxuIDIzMzpcXHRcXG4gMjM0OlxcdFxcdHJldHVybiAwO1xcbiAyMzU6XFx0fVxcbiAyMzY6XFx0XFxuIDIzNzpcXHRzdGF0aWMgaW50IG5ldGxpbmtfZGlhZ19oYW5kbGVyX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpoKVxcbiAyMzg6XFx0e1xcbiAyMzk6XFx0XFx0aW50IGhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMwOjE5LjA5NzQ3NzAyN1oiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMzE2NDA1NjkyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBhIENvbmN1cnJlbmN5IEJ1ZyBGaXggaW4gTmV0bGluayBNdWx0aWNhc3QgR3JvdXAgTWFuYWdlbWVudCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBzY2FuIGZsYWdnZWQgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWUgd2l0aGluIHRoZSBOZXRsaW5rIHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBtdWx0aWNhc3QgZ3JvdXAgbWFuYWdlbWVudC4gVGhlIGNvZGUgcmV2ZWFscyBhIHN1YnRsZSByYWNlIGNvbmRpdGlvbiByZWxhdGVkIHRvIHJlYWxsb2NhdGlvbiBvZiB0aGUgbXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgYXJyYXkuIEkgc2VlIHRoYXQgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgIGlzIHRoZSBrZXkgZnVuY3Rpb24gaGVyZSwgY2FsbGVkIGZyb20gYG5ldGxpbmtfYmluZGAgYW5kIGBuZXRsaW5rX3NldHNvY2tvcHRgIHdoZW4gZGVhbGluZyB3aXRoIG1lbWJlcnNoaXAgY2hhbmdlcyAoYWRkL2Ryb3ApLiBUaGlzIGZ1bmN0aW9uJ3Mgcm9sZSBpbiByZWFsbG9jYXRpbmcgdGhlIHVuZGVybHlpbmcgYG5say1cdTAwM2Vncm91cHNgIHN0cnVjdHVyZSByYWlzZXMgbXkgY29uY2Vybi5cblxuVGhlIHBhdGNoIGl0c2VsZiByZXBsYWNlcyB0aGUgcHJvYmxlbWF0aWMgYGtyZWFsbG9jYCBjYWxsIHdpdGggYSBzYWZlciBzZXF1ZW5jZTogYGt6YWxsb2NgLCBgbWVtY3B5YCwgbWVtb3J5IGJhcnJpZXJzIHVzaW5nIGBzbXBfc3RvcmVfcmVsZWFzZWAsIGFuZCBmaW5hbGx5LCBhIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAuIFRoaXMgaXMgYSBjbGFzc2ljIHBhdHRlcm4gZm9yIGFkZHJlc3NpbmcgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyByZWFkcyBpbiBhIGxvY2tsZXNzIG9yIFJDVS1wcm90ZWN0ZWQgY29udGV4dC4gVGhlIGNvbW1lbnRzIGNvbmZpcm0gbXkgc3VzcGljaW9uLCB0aGF0IGNvbmN1cnJlbnQgcmVhZGVycywgbGlrZSB0aG9zZSBpbiB0aGUgZGlhZ25vc3RpYyBkdW1wIChgc2tfZGlhZ19kdW1wX2dyb3Vwc2ApIG9yIGAvcHJvYy9uZXQvbmV0bGlua2AgcmVhZGVycyAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCksIGRvbid0IGhvbGQgdGhlIG5lY2Vzc2FyeSBsb2NrcywgY3JlYXRpbmcgYSB3aW5kb3cgZm9yIHRoZSByYWNlIGNvbmRpdGlvbi5cblxuSeKAmW0gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZSBmaXggYWZmZWN0cyBjb25jdXJyZW50IGFjY2Vzcy4gU3BlY2lmaWNhbGx5LCBgc2tfZGlhZ19kdW1wX2dyb3Vwc2Agbm93IHVzZXMgYHNtcF9sb2FkX2FjcXVpcmVgIGFuZCBgUkVBRF9PTkNFYCB0byBhY2Nlc3MgYG5say1cdTAwM2VuZ3JvdXBzYCBhbmQgYG5say1cdTAwM2Vncm91cHNgLCByZXNwZWN0aXZlbHksIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgIG5vdyB1dGlsaXplcyBgUkVBRF9PTkNFYCBvbiBgbmxrLVx1MDAzZWdyb3Vwc2AuIFRoaXMgaXMgdGV4dGJvb2sgUkNVIHN5bmNocm9uaXphdGlvbiBjb21iaW5lZCB3aXRoIG1lbW9yeSBvcmRlcmluZywgd2hpY2ggaW1tZWRpYXRlbHkgZmxhZ3MgdGhpcyBhcyBhIGNhbmRpZGF0ZSBmb3IgY29uY3VycmVuY3kgZnV6emluZyBhbmQgS0NTQU4vS0FTQU4uXG5cbkNydWNpYWxseSwgdGhpcyB2dWxuZXJhYmlsaXR5IGlzIHJlYWRpbHkgcmVhY2hhYmxlLiBBIHVzZXItc3BhY2UgcHJvZ3JhbSBjYW4gY3JlYXRlIGEgTmV0bGluayBzb2NrZXQsIGJpbmQgaXQsIGFkZCBvciBkcm9wIG11bHRpY2FzdCBtZW1iZXJzaGlwcyB1c2luZyBgc2V0c29ja29wdGAgKHdpdGggYE5FVExJTktfQUREX01FTUJFUlNISVBgIG9yIGBORVRMSU5LX0RST1BfTUVNQkVSU0hJUGApLCBhbmQgdGhlbiBwb3RlbnRpYWxseSB0cmlnZ2VyIHRoZSBkaWFnbm9zdGljIGR1bXAgdmlhIGBzZW5kdG8oTkVUTElOS19JTkVUX0RJQUcsIC4uLilgIG9yIHJlYWRpbmcgYC9wcm9jL25ldC9uZXRsaW5rYC4gQWxsIHN0YW5kYXJkIE5ldGxpbmsgc29ja2V0IG9wZXJhdGlvbnMuIFRoaXMgbG93IGJhcnJpZXIgb2YgZW50cnkgbWFrZXMgaXQgYW4gaWRlYWwgdGFyZ2V0IGZvciBmdXp6aW5nIGNhbXBhaWducy5cblxuVGhlIHdvcnRoaW5lc3MgaXMgcHJldHR5IGNsZWFyLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nLCBsZXZlcmFnZXMgUkNVIG1lbW9yeSBtYW5hZ2VtZW50LCBpcyB1c2VyLXNwYWNlIGFjY2Vzc2libGUgKHdoaWNoIGlzIGFsd2F5cyBhIGJvbnVzKSwgYW5kIHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgdG8gZnV6eiB1c2luZyBzb21ldGhpbmcgbGlrZSBzeXprYWxsZXIuXG5cbk15IGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zIHRoZW1zZWx2ZXM6IGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYCwgYHNrX2RpYWdfZHVtcF9ncm91cHNgLCBhbmQgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YC4gVGhlc2UgYXJlIHRoZSBwcmVjaXNlIGxvY2F0aW9ucyBvZiB0aGUgYnVnIGZpeCBhbmQgdGhlIGNvcmUgbG9naWMgaW52b2x2ZWQgaW4gdGhlIHJhY2UuXG5cblRoZSBpZGVudGlmaWVkIGZ1bmN0aW9ucyBhcmVuJ3QganVzdCBnZW5lcmljIGxpZmVjeWNsZSBvbmVzOyB0aGV5IGFyZSB0aGUgc3BlY2lmaWMgZmVhdHVyZSBsb2dpYyBmdW5jdGlvbnMgZGlyZWN0bHkgaW1wbGVtZW50aW5nIHRoZSBhbHRlcmVkIGNvZGUgcGF0aHMsIGFuZCB0aHVzLCBwcmltZSBmdXp6aW5nIHRhcmdldHMuXG5cbkZpbmFsbHksIHRoZSBidWlsZCByZXF1aXJlbWVudHMgbG9vayBzaW1wbGU6IGBuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNgIGlzIGNvcmUgYW5kIGFsd2F5cyBlbmFibGVkLiBgbmV0L25ldGxpbmsvZGlhZy5jYCBuZWVkcyBgQ09ORklHX05FVExJTktfRElBR2AsIGFuZCBgL3Byb2MvbmV0L25ldGxpbmtgIHJlcXVpcmVzIGBDT05GSUdfUFJPQ19GU2AuIFRoZSBkZXBlbmRlbmNpZXMgYXJlIHN0cmFpZ2h0Zm9yd2FyZC4gQWxsIHJlbGV2YW50IGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIG1haW5saW5lIGFuZCBzaG91bGQgYmUgZWFzaWx5IHRlc3RlZC5cblxuRXZlcnl0aGluZyBjaGVja3Mgb3V0LCBpdCdzIHdvcnRoIGZ1enppbmcgd2l0aCB0aG9zZSBjb25maWcgb3B0aW9ucyBhbmQgdGhlIHNwZWNpZmljIGZvY3VzIHN5bWJvbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNzY4LCJPdXRwdXRUb2tlbnMiOjE4NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0NzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo0Mi4yNjE1MzY3ODNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjE3MTE1OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkVUTElOS19ESUFHXCIsXG4gICAgXCJQUk9DX0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmV0bGlua19yZWFsbG9jX2dyb3Vwc1wiLFxuICAgIFwic2tfZGlhZ19kdW1wX2dyb3Vwc1wiLFxuICAgIFwibmV0bGlua19uYXRpdmVfc2VxX3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMpIGFjcm9zcyBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNrX2RpYWdfZHVtcF9ncm91cHMoKSwgYW5kIG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KCkuIFRoaXMgdG91Y2hlcyBjb3JlIG5ldHdvcmtpbmcgY29uY3VycmVuY3kgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBuZXRsaW5rIHNvY2tldCBiaW5kL3NldHNvY2tvcHQsIHNvY2tfZGlhZyBkdW1wLCBhbmQgL3Byb2MvbmV0L25ldGxpbmsgcmVhZHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGRldGVjdCBwb3RlbnRpYWwgZGF0YSByYWNlcywgbWVtb3J5IG9yZGVyaW5nIGlzc3Vlcywgb3IgVUFGcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJORVRMSU5LX0RJQUdcIixcbiAgICBcIlBST0NfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzXCIsXG4gICAgXCJza19kaWFnX2R1bXBfZ3JvdXBzXCIsXG4gICAgXCJuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgbG9ja2xlc3MgUkNVIHN5bmNocm9uaXphdGlvbiBmb3IgTmV0bGluayBzb2NrZXQgbXVsdGljYXN0IGdyb3VwcyAobmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcykgYWNyb3NzIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc2tfZGlhZ19kdW1wX2dyb3VwcygpLCBhbmQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKS4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZyBjb25jdXJyZW5jeSBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsgc29ja2V0IGJpbmQvc2V0c29ja29wdCwgc29ja19kaWFnIGR1bXAsIGFuZCAvcHJvYy9uZXQvbmV0bGluayByZWFkcy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBkYXRhIHJhY2VzLCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzLCBvciBVQUZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo0Mi4zMzc3MTQ3M1oiLCJTZXEiOjI3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODYzNDkxMzExMjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo0Mi4zMzgxODY1N1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjg2MzQ4NjMyMjU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXNvbHZlcyBhIGNvbmN1cnJlbmN5IGJ1ZyB3aGVyZSBga3JlYWxsb2MoKWAgaW1tZWRpYXRlbHkgZnJlZWQgYG5say1cXHUwMDNlZ3JvdXBzYCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIHVuZGVyIFJDVSAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYCkgY291bGQgYWNjZXNzIGl0IGNvbmN1cnJlbnRseSwgcmlza2luZyB1c2UtYWZ0ZXItZnJlZSAoVUFGKSBhbmQgb3V0LW9mLWJvdW5kcyAoT09CKSByZWFkcy4gVGhlc2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgKFVBRiBhbmQgT09CIGhlYXAgcmVhZHMpIGZhbGwgc3RyaWN0bHkgdW5kZXIgS0FTQU4ncyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBcXG5cXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcbmluZGV4IGU2YjFkOTc1OGM5YzkuLjlmZGY5NjQyMjRhYjQgMTAwNjQ0XG4tLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcbisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xuQEAgLTkyMiw5ICs5MjIsOSBAQCBuZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpXG4gXG4gc3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcbiB7XG4rXHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XG4gXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xuIFx0dW5zaWduZWQgaW50IGdyb3Vwcztcbi1cdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHM7XG4gXHRpbnQgZXJyID0gMDtcbiBcbiBcdG5ldGxpbmtfdGFibGVfZ3JhYigpO1xuQEAgLTkzOCwxOCArOTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXG4gXHRpZiAobmxrLVx1MDAzZW5ncm91cHMgXHUwMDNlPSBncm91cHMpXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcbi1cdG5ld19ncm91cHMgPSBrcmVhbGxvYyhubGstXHUwMDNlZ3JvdXBzLCBOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuLVx0aWYgKG5ld19ncm91cHMgPT0gTlVMTCkge1xuK1x0LyogQ2FuIG5vdCB1c2Uga3JlYWxsb2MoKSwgYmVjYXVzZSB0aGUgb2xkIGJ1ZmZlciBtaWdodCBiZSBmcmVlZFxuK1x0ICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZFxuK1x0ICogL3Byb2MvbmV0L25ldGxpbmspIGNhbiBzdGlsbCBiZSBsb29raW5nIGF0IGl0LlxuK1x0ICovXG4rXHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuK1x0aWYgKCFuZXdfZ3JvdXBzKSB7XG4gXHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbi1cdG1lbXNldCgoY2hhciAqKW5ld19ncm91cHMgKyBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSwgMCxcbi1cdCAgICAgICBOTEdSUFNaKGdyb3VwcykgLSBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4rXHRvbGRfZ3JvdXBzID0gbmxrLVx1MDAzZWdyb3VwcztcbitcdGlmIChvbGRfZ3JvdXBzKVxuK1x0XHRtZW1jcHkobmV3X2dyb3Vwcywgb2xkX2dyb3VwcywgTkxHUlBTWihubGstXHUwMDNlbmdyb3VwcykpO1xuK1xuK1x0LyogUHVibGlzaCB0aGUgbmV3IGJpdG1hcCBhbmQgaXRzIGNvbnRlbnQ6IHBhaXJzIHdpdGggdGhlIGFkZHJlc3NcbitcdCAqIGRlcGVuZGVuY3kgaW4gbG9ja2xlc3MgcmVhZGVycywgd2hpY2ggY2FuIHBpY2sgdXAgdGhlIG5ldyBwb2ludGVyXG4rXHQgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLVx1MDAzZW5ncm91cHMuXG4rXHQgKi9cbitcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNm5say1cdTAwM2Vncm91cHMsIG5ld19ncm91cHMpO1xuK1xuK1x0LyogVGhlbiBwdWJsaXNoIHRoZSBuZXcgc2l6ZTogcGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgZnJvbVxuK1x0ICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKVxuK1x0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cbitcdCAqL1xuK1x0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZW5ncm91cHMsIGdyb3Vwcyk7XG4gXG4tXHRubGstXHUwMDNlZ3JvdXBzID0gbmV3X2dyb3Vwcztcbi1cdG5say1cdTAwM2VuZ3JvdXBzID0gZ3JvdXBzO1xuICBvdXRfdW5sb2NrOlxuIFx0bmV0bGlua190YWJsZV91bmdyYWIoKTtcbitcbitcdGlmIChvbGRfZ3JvdXBzKVxuK1x0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKTtcbitcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTI3MDUsMTIgKzI3MjQsMTkgQEAgc3RhdGljIGludCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbiBcdH0gZWxzZSB7XG4gXHRcdHN0cnVjdCBzb2NrICpzID0gdjtcbiBcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpO1xuK1x0XHRjb25zdCB1bnNpZ25lZCBsb25nICpncm91cHM7XG4rXG4rXHRcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxuK1x0XHQgKiBubGstXHUwMDNlZ3JvdXBzIHVuZGVyIHVzLiBUaGUgb2xkIGJ1ZmZlciBpcyBmcmVlZCBhZnRlciBhblxuK1x0XHQgKiBSQ1UgZ3JhY2UgcGVyaW9kLCBhbmQgdGhpcyB3YWxrIGlzIFJDVSBwcm90ZWN0ZWQuXG4rXHRcdCAqL1xuK1x0XHRncm91cHMgPSBSRUFEX09OQ0UobmxrLVx1MDAzZWdyb3Vwcyk7XG4gXG4gXHRcdHNlcV9wcmludGYoc2VxLCBcIiVwSyAlLTNkICUtMTB1ICUwOHggJS04ZCAlLThkICUtNWQgJS04ZCAlLTh1ICUtOGxsdVxcblwiLFxuIFx0XHRcdCAgIHMsXG4gXHRcdFx0ICAgcy1cdTAwM2Vza19wcm90b2NvbCxcbiBcdFx0XHQgICBubGstXHUwMDNlcG9ydGlkLFxuLVx0XHRcdCAgIG5say1cdTAwM2Vncm91cHMgPyAodTMyKW5say1cdTAwM2Vncm91cHNbMF0gOiAwLFxuK1x0XHRcdCAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCxcbiBcdFx0XHQgICBza19ybWVtX2FsbG9jX2dldChzKSxcbiBcdFx0XHQgICBza193bWVtX2FsbG9jX2dldChzKSxcbiBcdFx0XHQgICBSRUFEX09OQ0UobmxrLVx1MDAzZWNiX3J1bm5pbmcpLFxuZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuY1xuaW5kZXggMGIzZTAyMWJkMGVkMi4uNzk3OWJkOWIyNjA2MCAxMDA2NDRcbi0tLSBhL25ldC9uZXRsaW5rL2RpYWcuY1xuKysrIGIvbmV0L25ldGxpbmsvZGlhZy5jXG5AQCAtMTIsMTIgKzEyLDI0IEBAXG4gc3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuIHtcbiBcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4tXG4tXHRpZiAobmxrLVx1MDAzZWdyb3VwcyA9PSBOVUxMKVxuK1x0dW5zaWduZWQgbG9uZyAqZ3JvdXBzO1xuK1x0dW5zaWduZWQgaW50IG5ncm91cHM7XG4rXG4rXHQvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seVxuK1x0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2VcbitcdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxuK1x0ICpcbitcdCAqIFJlYWQgbmxrLVx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxuK1x0ICogZnJvbSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNvIHRoYXQgd2UgY2FuIG5vdCB1c2UgdGhlIG5ld1xuK1x0ICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXNcbitcdCAqIGZyZWVkIGFmdGVyIGFuIFJDVSBncmFjZSBwZXJpb2QuXG4rXHQgKi9cbitcdG5ncm91cHMgPSBzbXBfbG9hZF9hY3F1aXJlKFx1MDAyNm5say1cdTAwM2VuZ3JvdXBzKTtcbitcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbitcdGlmICghZ3JvdXBzKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHJldHVybiBubGFfcHV0KG5sc2tiLCBORVRMSU5LX0RJQUdfR1JPVVBTLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSxcbi1cdFx0ICAgICAgIG5say1cdTAwM2Vncm91cHMpO1xuK1x0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6NDIuMzM4MTg5MzhaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTc0NTUyMjk5MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBOZXRsaW5rIEdyb3VwIFJlYWxsb2NhdGlvbiBQYXRjaCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIG1vZGlmeWluZyBgbmV0L25ldGxpbmsvYWZfbmV0bGluay5jYCBhbmQgYG5ldC9uZXRsaW5rL2RpYWcuY2AuIEknbSBzZWVpbmcgY2hhbmdlcyBpbiBob3cgTmV0bGluayBncm91cHMgYXJlIHJlYWxsb2NhdGVkLCB3aGljaCBhbHdheXMgd2FycmFudHMgYSBjbG9zZSBsb29rLlxuXG5GaXJzdCwgaW4gYGFmX25ldGxpbmsuY2Agd2l0aGluIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYCwgdGhlIGFsbG9jYXRpb24gc3RyYXRlZ3kgaGFzIHNoaWZ0ZWQuIEluc3RlYWQgb2YgYGtyZWFsbG9jYCwgd2UncmUgbm93IHVzaW5nIGBremFsbG9jYC4gVGhhdCdzIHNtYXJ0OyBga3phbGxvY2AgemVyb2VzIHRoZSBuZXcgbWVtb3J5LiBUaGVuLCBgbWVtY3B5YCBjb3BpZXMgdGhlIGV4aXN0aW5nIGdyb3VwIGluZm9ybWF0aW9uIGZyb20gdGhlIG9sZCBidWZmZXIgdG8gdGhlIHplcm9lZCBuZXcgYnVmZmVyLCBhbmQgdGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgdXNpbmcgUkNVIChga2ZyZWVfcmN1X21pZ2h0c2xlZXBgKS4gVGhpcyBpcyBhIHNvbGlkIGFwcHJvYWNoLCBndWFyYW50ZWVpbmcgYSBjbGVhbiBpbml0aWFsIHN0YXRlIGFuZCBsZXZlcmFnaW5nIFJDVSBmb3Igc2FmZSBkZWFsbG9jYXRpb24uIFRoaXMgcGF0dGVybiBpcyBmYWlybHkgY29tbW9uIG5vdywgYW5kIGF2b2lkcyBwb3RlbnRpYWxseSBleHBvc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhlIGNvZGUgdGhlbiB1c2VzIGBzbXBfc3RvcmVfcmVsZWFzZWAgZm9yIGJvdGggYG5say1cdTAwM2Vncm91cHNgIGFuZCBgbmxrLVx1MDAzZW5ncm91cHNgLiBBbmQgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBqdXN0IHJlYWRzIGBncm91cHNbMF1gIHNhZmVseS5cblxuTm93LCB0aGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUgYHNrX2RpYWdfZHVtcF9ncm91cHNgIGZ1bmN0aW9uIGluIGBuZXQvbmV0bGluay9kaWFnLmNgLiBJdCByZXRyaWV2ZXMgdGhlIGdyb3VwIGRhdGEgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuIEhlcmUsIGBuZ3JvdXBzYCAodGhlIG51bWJlciBvZiBncm91cHMpIGlzIGxvYWRlZCB1c2luZyBgc21wX2xvYWRfYWNxdWlyZWAgYW5kIGBncm91cHNgICh0aGUgYWN0dWFsIGdyb3VwIGFycmF5KSBpcyByZWFkIHVzaW5nIGBSRUFEX09OQ0VgLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGUgbG9ja2xlc3MgYWNjZXNzIGFuZCB0aGUgb3JkZXJpbmcuXG5cbkknbSB0aGlua2luZzogQ291bGQgYG5ncm91cHNgIGFuZCBgZ3JvdXBzYCBiZSBtaXNtYXRjaGVkPyBMZXQncyB0cmFjZSBpdC4gVGhlIHdyaXRlcidzIHNpZGUgdXNlcyBgc21wX3N0b3JlX3JlbGVhc2VgIGZvciBgZ3JvdXBzYCBhbmQgdGhlbiBgbmdyb3Vwc2AuIEFuZCB0aGUgcmVhZGVyIHVzZXMgYHNtcF9sb2FkX2FjcXVpcmVgIGZvciBgbmdyb3Vwc2AgYW5kIHRoZW4gYFJFQURfT05DRWAgZm9yIGBncm91cHNgLlxuXG5HaXZlbiB0aGF0IHdlIGFyZSB1c2luZyBhY3F1aXJlL3JlbGVhc2Ugc2VtYW50aWNzOiBpZiB0aGUgcmVhZGVyIHNlZXMgYSBuZXcgYG5ncm91cHNgLCBpdCBpcyAqZ3VhcmFudGVlZCogdG8gc2VlIHRoZSBjb3JyZXNwb25kaW5nIGBncm91cHNgIChvciBldmVuIGEgbmV3ZXIgdmVyc2lvbikuIElmIHRoZSByZWFkZXIgc2VlcyB0aGUgKm9sZCogYG5ncm91cHNgLCB0aGVuIGBncm91cHNgIGNvdWxkIGVpdGhlciBiZSB0aGUgYG9sZF9ncm91cHNgIG9yIHRoZSBgbmV3X2dyb3Vwc2AuIEJ1dCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZ3JvdXBzIGFycmF5IGhhcyBiZWVuIHJlYWxsb2NhdGVkLCB3ZSBhcmUgcmVhZGluZyBmcm9tIGBuZXdfZ3JvdXBzYCB1c2luZyB0aGUgc21hbGxlciBzaXplIGBOTEdSUFNaKG9sZF9uZ3JvdXBzKWAsIHNvIGl0J3MgZ3VhcmFudGVlZCB0byBiZSB3aXRoaW4gYm91bmRzLiBJZiB0aGUgcmVhZGVyIHNlZXMgYG9sZF9ncm91cHNgIHRoaXMgaXMgYWxzbyB2YWxpZCBhbmQgUkNVIHByb3RlY3RlZC4gV2UgY2FuIGVuc3VyZSB0aGUgYmFycmllciBlbnN1cmVzIHRoZSBzaXplIHJlYWQgaXMgd2l0aGluIGJvdW5kcy4gVGhpcyBsb2dpYyBhdm9pZHMgYW55IHBvc3NpYmxlIG91dC1vZi1ib3VuZHMgcmVhZHMuXG5cblRoZXJlIGlzIHRoZSBjYXNlIG9mIGluaXRpYWwgc3RhdGUsIHdoZXJlIGBncm91cHNgIHN0YXJ0cyBhcyBOVUxMLiBJIHdpbGwgbmVlZCB0byBjaGVjayBob3cgYG5say1cdTAwM2Vncm91cHNgIGFuZCBgbmxrLVx1MDAzZW5ncm91cHNgIGFyZSBpbml0aWFsaXplZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQyMSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMzcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo1OS43OTM0MjIzMzZaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mzg5NTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5say1cXHUwMDNlZ3JvdXBzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NzA0PXN0YXRpYyB2b2lkIGRlZmVycmVkX3B1dF9ubGtfc2soc3RydWN0IHJjdV9oZWFkICpoZWFkKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTcwOC1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6NzA5OlxcdGtmcmVlKG5say1cXHUwMDNlZ3JvdXBzKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6NzEwOlxcdG5say1cXHUwMDNlZ3JvdXBzID0gTlVMTDtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzExLVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTcxOD1zdGF0aWMgaW50IG5ldGxpbmtfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTczNC1cXHRpZiAobmxrLVxcdTAwM2VuZXRsaW5rX3JlbGVhc2UpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjczNTpcXHRcXHRubGstXFx1MDAzZW5ldGxpbmtfcmVsZWFzZShzaywgbmxrLVxcdTAwM2Vncm91cHMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy03MzYtXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzQzLVxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBubGstXFx1MDAzZW5ncm91cHM7IGkrKylcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6NzQ0OlxcdFxcdFxcdGlmICh0ZXN0X2JpdChpLCBubGstXFx1MDAzZWdyb3VwcykpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTc0NS1cXHRcXHRcXHRcXHRubGstXFx1MDAzZW5ldGxpbmtfdW5iaW5kKHNvY2tfbmV0KHNrKSwgaSArIDEpO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkyMz1zdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk0OS1cXHR9XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1MDpcXHRvbGRfZ3JvdXBzID0gbmxrLVxcdTAwM2Vncm91cHM7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1MS1cXHRpZiAob2xkX2dyb3VwcylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NTctXFx0ICovXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1ODpcXHRzbXBfc3RvcmVfcmVsZWFzZShcXHUwMDI2bmxrLVxcdTAwM2Vncm91cHMsIG5ld19ncm91cHMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NTktXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTg5PXN0YXRpYyBpbnQgbmV0bGlua19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICphZGRyLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwNTctXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwNTg6XFx0aWYgKCFncm91cHMgXFx1MDAyNlxcdTAwMjYgKG5say1cXHUwMDNlZ3JvdXBzID09IE5VTEwgfHwgISh1MzIpbmxrLVxcdTAwM2Vncm91cHNbMF0pKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDU5LVxcdFxcdGdvdG8gdW5sb2NrO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwNjQtXFx0XFx0XFx0XFx0XFx0IGh3ZWlnaHQzMihncm91cHMpIC1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTA2NTpcXHRcXHRcXHRcXHRcXHQgaHdlaWdodDMyKG5say1cXHUwMDNlZ3JvdXBzWzBdKSk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwNjY6XFx0bmxrLVxcdTAwM2Vncm91cHNbMF0gPSAobmxrLVxcdTAwM2Vncm91cHNbMF0gXFx1MDAyNiB+MHhmZmZmZmZmZlVMKSB8IGdyb3VwcztcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTA2Ny1cXHRuZXRsaW5rX3VwZGF0ZV9saXN0ZW5lcnMoc2spO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTExMjQ9c3RhdGljIGludCBuZXRsaW5rX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTExNDEtXFx0XFx0bmV0bGlua19sb2NrX3RhYmxlKCk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjExNDI6XFx0XFx0bmxhZGRyLVxcdTAwM2VubF9ncm91cHMgPSBubGstXFx1MDAzZWdyb3VwcyA/IG5say1cXHUwMDNlZ3JvdXBzWzBdIDogMDtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTE0My1cXHRcXHRuZXRsaW5rX3VubG9ja190YWJsZSgpO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTE0NDI9c3RhdGljIHZvaWQgZG9fb25lX2Jyb2FkY2FzdChzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTQ1MS1cXHRpZiAobmxrLVxcdTAwM2Vwb3J0aWQgPT0gcC1cXHUwMDNlcG9ydGlkIHx8IHAtXFx1MDAzZWdyb3VwIC0gMSBcXHUwMDNlPSBubGstXFx1MDAzZW5ncm91cHMgfHxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTQ1MjpcXHQgICAgIXRlc3RfYml0KHAtXFx1MDAzZWdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMpKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNDUzLVxcdFxcdHJldHVybjtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNTk0PXN0YXRpYyBpbnQgZG9fb25lX3NldF9lcnIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgKnApXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTYwNS1cXHRpZiAobmxrLVxcdTAwM2Vwb3J0aWQgPT0gcC1cXHUwMDNlcG9ydGlkIHx8IHAtXFx1MDAzZWdyb3VwIC0gMSBcXHUwMDNlPSBubGstXFx1MDAzZW5ncm91cHMgfHxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTYwNjpcXHQgICAgIXRlc3RfYml0KHAtXFx1MDAzZWdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMpKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjA3LVxcdFxcdGdvdG8gb3V0O1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTE2NTQ9c3RhdGljIHZvaWQgbmV0bGlua191cGRhdGVfc29ja2V0X21jKHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayxcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjU5LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjYwOlxcdG9sZCA9IHRlc3RfYml0KGdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjYxLVxcdHN1YnNjcmlwdGlvbnMgPSBubGstXFx1MDAzZXN1YnNjcmlwdGlvbnMgLSBvbGQgKyBuZXc7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjE2NjI6XFx0X19hc3NpZ25fYml0KGdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMsIG5ldyk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2NjMtXFx0bmV0bGlua191cGRhdGVfc3Vic2NyaXB0aW9ucyhcXHUwMDI2bmxrLVxcdTAwM2Vzaywgc3Vic2NyaXB0aW9ucyk7XFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTc0Mz1zdGF0aWMgaW50IG5ldGxpbmtfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE3NzgtXFx0XFx0XFx0c2hpZnQgPSAocG9zICUgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSAqIDg7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjE3Nzk6XFx0XFx0XFx0Z3JvdXAgPSAodTMyKShubGstXFx1MDAzZWdyb3Vwc1tpZHhdIFxcdTAwM2VcXHUwMDNlIHNoaWZ0KTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTc4MC1cXHRcXHRcXHRpZiAoY29weV90b19pdGVyKFxcdTAwMjZncm91cCwgc2l6ZW9mKHUzMiksXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjktXFx0XFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3MzA6XFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzEtXFx0XFx0ICogUkNVIGdyYWNlIHBlcmlvZCwgYW5kIHRoaXMgd2FsayBpcyBSQ1UgcHJvdGVjdGVkLlxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzMyLVxcdFxcdCAqL1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzMzOlxcdFxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzQtXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jLTE5LVxcdCAqIGhvbGRzIHJjdV9yZWFkX2xvY2soKSwgd2hpbGUgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiByZXBsYWNlXFxubmV0L25ldGxpbmsvZGlhZy5jOjIwOlxcdCAqIG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXFxubmV0L25ldGxpbmsvZGlhZy5jLTIxLVxcdCAqXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmMtMjctXFx0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNm5say1cXHUwMDNlbmdyb3Vwcyk7XFxubmV0L25ldGxpbmsvZGlhZy5jOjI4OlxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxubmV0L25ldGxpbmsvZGlhZy5jLTI5LVxcdGlmICghZ3JvdXBzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo1OS44Mzg4MTY5OTlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzUwMjE0NzYxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGEgc2Vhc29uZWQgcHJvZmVzc2lvbmFsIGluIHRoZSBmaWVsZCwgc3BlYWtpbmcgZGlyZWN0bHkgdG8gbXlzZWxmOlxuXG4qKkRpdmluZyBpbnRvIE5ldGxpbmsgU29ja2V0IENyZWF0aW9uKipcblxuQWxyaWdodCwgdGltZSB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgZGlzc2VjdCB0aGUgbmV0bGluayBzb2NrZXQgY3JlYXRpb24gcHJvY2Vzcy4gSXQncyBiZWVuIGEgd2hpbGUgc2luY2UgSSBsYXN0IGR1ZyBpbnRvIHRoZSBsb3ctbGV2ZWwgZGV0YWlscywgYW5kIGEgcXVpY2sgcmUtZXhhbWluYXRpb24gbmV2ZXIgaHVydHMuIEkgd2FudCB0byBtYWtlIHN1cmUgSSBoYXZlIGEgc29saWQgZ3Jhc3Agb24gaG93IHRoZXNlIHNvY2tldHMgYXJlIGFjdHVhbGx5IGJyb3VnaHQgdG8gbGlmZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWwgc2V0dXAsIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBjYWxscywgYW5kIHRoZSB0eXBpY2FsIGZsb3cgb2YgZGF0YS4gV2hhdCBwYXJhbWV0ZXJzIGFyZSBpbnZvbHZlZD8gQXJlIHRoZXJlIGFueSBzdWJ0bGUgbnVhbmNlcyBvciBwb3RlbnRpYWwgcGl0ZmFsbHMgaW4gdGhlIHNldHVwIHRoYXQgSSBzaG91bGQgYmUgbWluZGZ1bCBvZiwgZnJvbSBhIHBlcmZvcm1hbmNlIG9yIHNlY3VyaXR5IHN0YW5kcG9pbnQ/IFRoZSBkZXZpbCdzIG9mdGVuIGluIHRoZSBkZXRhaWxzLCBzbyBsZXQncyBzdGFydCB3aXRoIGEgc3lzdGVtYXRpYyBhcHByb2FjaCBhbmQgd29yayBvdXIgd2F5IHRocm91Z2ggaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcxNzAsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMTowNy4zNDA5Njg4MDZaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NzQ0NzAyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIk5MR1JQU1pcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L25ldGxpbmsvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz05MjM9c3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NDQtXFx0ICovXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk0NTpcXHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NDYtXFx0aWYgKCFuZXdfZ3JvdXBzKSB7XFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTUxLVxcdGlmIChvbGRfZ3JvdXBzKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NTI6XFx0XFx0bWVtY3B5KG5ld19ncm91cHMsIG9sZF9ncm91cHMsIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1My1cXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NjAtXFx0LyogVGhlbiBwdWJsaXNoIHRoZSBuZXcgc2l6ZTogcGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgZnJvbVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NjE6XFx0ICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NjItXFx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMDI2PV9fbmV0bGlua19rZXJuZWxfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgaW50IHVuaXQsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSxcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMDUyLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyMDUzOlxcdGxpc3RlbmVycyA9IGt6YWxsb2Moc2l6ZW9mKCpsaXN0ZW5lcnMpICsgTkxHUlBTWihncm91cHMpLCBHRlBfS0VSTkVMKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjA1NC1cXHRpZiAoIWxpc3RlbmVycylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMTA3PWludCBfX25ldGxpbmtfY2hhbmdlX25ncm91cHMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgZ3JvdXBzKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIxMTQtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMTU6XFx0aWYgKE5MR1JQU1oodGJsLVxcdTAwM2Vncm91cHMpIFxcdTAwM2MgTkxHUlBTWihncm91cHMpKSB7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMTY6XFx0XFx0bmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldykgKyBOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTE3LVxcdFxcdGlmICghbmV3KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIxMTktXFx0XFx0b2xkID0gbmxfZGVyZWZfcHJvdGVjdGVkKHRibC1cXHUwMDNlbGlzdGVuZXJzKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjEyMDpcXHRcXHRtZW1jcHkobmV3LVxcdTAwM2VtYXNrcywgb2xkLVxcdTAwM2VtYXNrcywgTkxHUlBTWih0YmwtXFx1MDAzZWdyb3VwcykpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTIxLVxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcih0YmwtXFx1MDAzZWxpc3RlbmVycywgbmV3KTtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODc3PXN0YXRpYyB2b2lkIF9faW5pdCBuZXRsaW5rX2FkZF91c2Vyc29ja19lbnRyeSh2b2lkKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4ODEtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4ODI6XFx0bGlzdGVuZXJzID0ga3phbGxvYyhzaXplb2YoKmxpc3RlbmVycykgKyBOTEdSUFNaKGdyb3VwcyksIEdGUF9LRVJORUwpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODgzLVxcdGlmICghbGlzdGVuZXJzKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oPTEwPWVudW0ge1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oLTIwLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuaDoyMTojZGVmaW5lIE5MR1JQU1ooeClcXHQoQUxJR04oeCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgLyA4KVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuaDoyMjojZGVmaW5lIE5MR1JQTE9OR1MoeClcXHQoTkxHUlBTWih4KS9zaXplb2YodW5zaWduZWQgbG9uZykpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oLTIzLVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jPTEyPXN0YXRpYyBpbnQgc2tfZGlhZ19kdW1wX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpubHNrYilcXG4tLVxcbm5ldC9uZXRsaW5rL2RpYWcuYy0zMS1cXG5uZXQvbmV0bGluay9kaWFnLmM6MzI6XFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XFxubmV0L25ldGxpbmsvZGlhZy5jLTMzLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6MDcuMzg3NzE5NTM4WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzNDE4MTM4NDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgaW1tZWRpYXRlIHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBOZXRsaW5rIEdyb3VwIE1hbmFnZW1lbnQqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgaG93IE5ldGxpbmsgZ3JvdXAgbWVtYmVyc2hpcCBpcyBoYW5kbGVkIHdoZW4gYSBzb2NrZXQgaXMgZmlyc3QgY3JlYXRlZC4gTXkgaW5zdGluY3QgaXMgdG8gemVybyBpbiBvbiBgbmV0bGlua19jcmVhdGVgIGFuZCB0aGUgc29ja2V0IGFsbG9jYXRpb24gaXRzZWxmLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBrbm93IHRoZSAqaW5pdGlhbCogc3RhdGUgb2YgYG5say1cdTAwM2Vncm91cHNgIGluIHRoYXQgZnJlc2hseSBtaW50ZWQgc29ja2V0LiBUaGF0J3MgdGhlIGtleSBzdGFydGluZyBwb2ludCB0byB1bmRlcnN0YW5kIGhvdyBncm91cHMgYXJlIGFkZGVkIGFuZCByZW1vdmVkIGxhdGVyLiBJJ2xsIG5lZWQgdG8gdHJhY2UgdGhlIGNvZGUgaW4gYG5ldGxpbmtfY3JlYXRlYCBhbmQgdGhlIHJlbGF0ZWQgc29ja2V0IGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLCB0byBkZXRlcm1pbmUgd2hldGhlciBncm91cHMgYXJlIGluaXRpYWxpemVkLCB3aGF0IHRoZSBkZWZhdWx0IGlzLCBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgYXQgYWxsLCBhbmQgcGVyaGFwcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgb3IgZHluYW1pYyBhbGxvY2F0aW9uLiBJIGV4cGVjdCB0aGVyZSB0byBiZSBhdCBsZWFzdCBzb21lIHJlbGV2YW50IGluaXRpYWxpemF0aW9uIGluIHRoaXMgc3BhY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0NTIsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMTowOS43Mjk1MzYyMTlaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3NTUxODkyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5ldGxpbmtfY3JlYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NjEzPXN0YXRpYyBzdHJ1Y3QgcHJvdG8gbmV0bGlua19wcm90byA9IHtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02MTgtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjYxOTpzdGF0aWMgaW50IF9fbmV0bGlua19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLFxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02MjAtXFx0XFx0XFx0ICAgIGludCBwcm90b2NvbCwgaW50IGtlcm4pXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjQ0LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo2NDU6c3RhdGljIGludCBuZXRsaW5rX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjQ2LVxcdFxcdFxcdCAgaW50IGtlcm4pXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjg0LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo2ODU6XFx0ZXJyID0gX19uZXRsaW5rX2NyZWF0ZShuZXQsIHNvY2ssIHByb3RvY29sLCBrZXJuKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjg2LVxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTIwMjY9X19uZXRsaW5rX2tlcm5lbF9jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBpbnQgdW5pdCwgc3RydWN0IG1vZHVsZSAqbW9kdWxlLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIwNDItXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIwNDM6XFx0aWYgKF9fbmV0bGlua19jcmVhdGUobmV0LCBzb2NrLCB1bml0LCAxKSBcXHUwMDNjIDApXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIwNDQtXFx0XFx0Z290byBvdXRfc29ja19yZWxlYXNlX25vc2s7XFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjg1ND1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgbmV0bGlua19mYW1pbHlfb3BzID0ge1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODU1LVxcdC5mYW1pbHkgPSBQRl9ORVRMSU5LLFxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODU2OlxcdC5jcmVhdGUgPSBuZXRsaW5rX2NyZWF0ZSxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjg1Ny1cXHQub3duZXJcXHQ9IFRISVNfTU9EVUxFLFxcdC8qIGZvciBjb25zaXN0ZW5jeSA4KSAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMTowOS43NzcwOTQzMzJaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjcwNDU2NjE0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcmVhZGluZyBhbmQgdGhpbmtpbmcgYWJvdXQgdGhlIGNvZGU6XG5cbioqRGl2aW5nIGludG8gYF9fbmV0bGlua19jcmVhdGVgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gaXQuIFRpbWUgdG8gZGlzc2VjdCBgX19uZXRsaW5rX2NyZWF0ZWAgaW4gYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AuIEknbSBjdXJpb3VzIHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBpbml0aWFsIGNyZWF0aW9uIG9mIGEgTmV0bGluayBzb2NrZXQuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIGxvdy1sZXZlbCBzdHVmZiBoZXJlLCBzZXR0aW5nIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgdGhlIE5ldGxpbmsgY29tbXVuaWNhdGlvbiB0aGF0J3MgZ29pbmcgdG8gaGFwcGVuLiBJIGV4cGVjdCB0byBzZWUgdGhlIGtlcm5lbCBjb25maWd1cmluZyB0aGUgc29ja2V0J3MgYmFzaWMgc3RydWN0dXJlLCBhbGxvY2F0aW5nIG1lbW9yeSwgYW5kIHByb2JhYmx5IHNldHRpbmcgdXAgc29tZSBpbml0aWFsIHN0YXRlIG9yIHF1ZXVlcy4gS25vd2luZyB0aGUgaW50ZXJuYWxzIGhlcmUgaXMgY3JpdGljYWwgdG8gdW5kZXJzdGFuZGluZyBob3cgbW9yZSBhZHZhbmNlZCBzb2NrZXQgZnVuY3Rpb25hbGl0aWVzIGFyZSBpbXBsZW1lbnRlZCBsYXRlciBvbiBpbiB0aGUgTmV0bGluayBzdWJzeXN0ZW0uIEhvcGVmdWxseSwgSSdsbCBzZWUgc29tZSBvYnZpb3VzIGNvbm5lY3Rpb24gdG8gdGhlIE5ldGxpbmsgZmFtaWx5IHN0cnVjdHVyZXMgYW5kIGFkZHJlc3MgZmFtaWxpZXMsIGFzIHdlbGwuIExldCdzIHNlZSBpZiB0aGlzIGNvZGUgY29uZmlybXMgd2hhdCBJIGFscmVhZHkga25vdyBhYm91dCBuZXRsaW5rLCBvciBhZGRzIHNvbWUgd3JpbmtsZXMgdG8gbXkgbWVudGFsIG1vZGVsLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MjA1LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6MTIuNDgxNjYzMTI0WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjE4LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjE4OlxcdFxcbiA2MTk6XFx0c3RhdGljIGludCBfX25ldGxpbmtfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jayxcXG4gNjIwOlxcdFxcdFxcdFxcdCAgICBpbnQgcHJvdG9jb2wsIGludCBrZXJuKVxcbiA2MjE6XFx0e1xcbiA2MjI6XFx0XFx0c3RydWN0IHNvY2sgKnNrO1xcbiA2MjM6XFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrO1xcbiA2MjQ6XFx0XFxuIDYyNTpcXHRcXHRzb2NrLVxcdTAwM2VvcHMgPSBcXHUwMDI2bmV0bGlua19vcHM7XFxuIDYyNjpcXHRcXG4gNjI3OlxcdFxcdHNrID0gc2tfYWxsb2MobmV0LCBQRl9ORVRMSU5LLCBHRlBfS0VSTkVMLCBcXHUwMDI2bmV0bGlua19wcm90bywga2Vybik7XFxuIDYyODpcXHRcXHRpZiAoIXNrKVxcbiA2Mjk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDYzMDpcXHRcXG4gNjMxOlxcdFxcdHNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTtcXG4gNjMyOlxcdFxcbiA2MzM6XFx0XFx0bmxrID0gbmxrX3NrKHNrKTtcXG4gNjM0OlxcdFxcdG11dGV4X2luaXQoXFx1MDAyNm5say1cXHUwMDNlbmxfY2JfbXV0ZXgpO1xcbiA2MzU6XFx0XFx0bG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUoXFx1MDAyNm5say1cXHUwMDNlbmxfY2JfbXV0ZXgsXFxuIDYzNjpcXHRcXHRcXHRcXHRcXHRcXHQgICBubGtfY2JfbXV0ZXhfa2V5cyArIHByb3RvY29sLFxcbiA2Mzc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgbmxrX2NiX211dGV4X2tleV9zdHJpbmdzW3Byb3RvY29sXSk7XFxuIDYzODpcXHRcXHRpbml0X3dhaXRxdWV1ZV9oZWFkKFxcdTAwMjZubGstXFx1MDAzZXdhaXQpO1xcbiA2Mzk6XFx0XFxuIDY0MDpcXHRcXHRzay1cXHUwMDNlc2tfZGVzdHJ1Y3QgPSBuZXRsaW5rX3NvY2tfZGVzdHJ1Y3Q7XFxuIDY0MTpcXHRcXHRzay1cXHUwMDNlc2tfcHJvdG9jb2wgPSBwcm90b2NvbDtcXG4gNjQyOlxcdFxcdHJldHVybiAwO1xcbiA2NDM6XFx0fVxcbiA2NDQ6XFx0XFxuIDY0NTpcXHRzdGF0aWMgaW50IG5ldGxpbmtfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sLFxcbiA2NDY6XFx0XFx0XFx0XFx0ICBpbnQga2VybilcXG4gNjQ3OlxcdHtcXG4gNjQ4OlxcdFxcdHN0cnVjdCBtb2R1bGUgKm1vZHVsZSA9IE5VTEw7XFxuIDY0OTpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7XFxuIDY1MDpcXHRcXHRpbnQgKCpiaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XFxuIDY1MTpcXHRcXHR2b2lkICgqdW5iaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XFxuIDY1MjpcXHRcXHR2b2lkICgqcmVsZWFzZSkoc3RydWN0IHNvY2sgKnNvY2ssIHVuc2lnbmVkIGxvbmcgKmdyb3Vwcyk7XFxuIDY1MzpcXHRcXHRpbnQgZXJyID0gMDtcXG4gNjU0OlxcdFxcbiA2NTU6XFx0XFx0c29jay1cXHUwMDNlc3RhdGUgPSBTU19VTkNPTk5FQ1RFRDtcXG4gNjU2OlxcdFxcbiA2NTc6XFx0XFx0aWYgKHNvY2stXFx1MDAzZXR5cGUgIT0gU09DS19SQVcgXFx1MDAyNlxcdTAwMjYgc29jay1cXHUwMDNldHlwZSAhPSBTT0NLX0RHUkFNKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMToxMi40ODE4OTI5MTRaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Mjg0ODgwMTY0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gTmV0bGluayBHcm91cCBBbGxvY2F0aW9uKipcblxuT2theSwgc28gYHNrX2FsbG9jYCBkb2VzIGl0cyB0aGluZyBhbmQgemVyb3Mgb3V0IHRoZSBlbnRpcmUgc29ja2V0IHN0cnVjdHVyZS4gVGhhdCBpbmNsdWRlcyB0aGUgYG5ldGxpbmtfc29ja2AgcGFydCwgd2hpY2ggbWVhbnMgYG5say1cdTAwM2Vncm91cHNgIHN0YXJ0cyBhcyBOVUxMIGFuZCBgbmxrLVx1MDAzZW5ncm91cHNgIGlzLCBuYXR1cmFsbHksIHplcm8uIEdvb2QuIFRoYXQncyBhIGNsZWFuIHNsYXRlLlxuXG5Ob3csIHRoZSBpbnRlcmVzdGluZyBwYXJ0OiBob3cgZG8gd2UgYWxsb2NhdGUgdGhvc2UgTmV0bGluayBncm91cHM/IExldCdzIHRyYWNlIGl0IHRocm91Z2guIFdoZXJlIGRvZXMgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgIGdldCBjYWxsZWQgZnJvbT8gVGltZSB0byBnbyBodW50aW5nIGZvciB0aGUgY2FsbCBzaXRlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlbiBhbmQgd2h5IHRoZSBrZXJuZWwgZGVjaWRlcyB0byBleHBhbmQgdGhlIGdyb3VwIGxpc3QuIFRoaXMgaXMgYSBjcml0aWNhbCBwb2ludCB0byBwaW5wb2ludCB0aGUgYmVoYXZpb3Igc3Vycm91bmRpbmcgZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDA5MCwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6MTUuMzMwNjk4MDUzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjM4Mzc5MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTEyPW5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjItXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjkyMzpzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjQte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTk4OT1zdGF0aWMgaW50IG5ldGxpbmtfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqYWRkcixcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEwLVxcdFxcdFxcdHJldHVybiAtRVBFUk07XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwMTE6XFx0XFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwMTItXFx0XFx0aWYgKGVycilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjY3PXN0YXRpYyBpbnQgbmV0bGlua19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY5MS1cXHRcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjkyOlxcdFxcdGVyciA9IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc2spO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkzLVxcdFxcdGlmIChlcnIpXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjgtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3Mjk6XFx0XFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzAtXFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jLTE4LVxcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XFxubmV0L25ldGxpbmsvZGlhZy5jOjE5OlxcdCAqIGhvbGRzIHJjdV9yZWFkX2xvY2soKSwgd2hpbGUgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiByZXBsYWNlXFxubmV0L25ldGxpbmsvZGlhZy5jLTIwLVxcdCAqIG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmMtMjItXFx0ICogUmVhZCBubGstXFx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxcbm5ldC9uZXRsaW5rL2RpYWcuYzoyMzpcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxubmV0L25ldGxpbmsvZGlhZy5jLTI0LVxcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMxOjE1LjM3NzA4ODE2NVoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNzg3NTY1MDYwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYC4gSSBuZWVkIHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24sIGl0cyBwdXJwb3NlLCBhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiBpdHMgb3BlcmF0aW9uIHdpdGhpbiB0aGUgYnJvYWRlciBuZXRsaW5rIGZyYW1ld29yay4gSSdtIGdvaW5nIHRvIGJyZWFrIGl0IGRvd24sIHBpZWNlIGJ5IHBpZWNlLCBjb25zaWRlcmluZyB0aGUgcG9zc2libGUgZWRnZSBjYXNlcyBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIG90aGVyIG5ldGxpbmsgY29tcG9uZW50cy4gSSdsbCBuZWVkIHRvIHRoaW5rIGFib3V0IG1lbW9yeSBtYW5hZ2VtZW50LCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBhbmQgZXJyb3IgaGFuZGxpbmcg4oCTIGV2ZXJ5dGhpbmcgdGhhdCBjb3VsZCBnbyB3cm9uZyBvciB0aGF0IG5lZWRzIHRvIGJlIHByb3Blcmx5IGhhbmRsZWQgZm9yIHJvYnVzdCBiZWhhdmlvci4gSSdsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIGV4ZWN1dGlvbiBmbG93LCB0cmFjaW5nIHRoZSBkYXRhJ3MgcGF0aCBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHByb3RlY3RpbmcgYW5kIGVuc3VyaW5nLiBJJ2xsIGZvY3VzIHBhcnRpY3VsYXJseSBvbiBob3cgaXQgaGFuZGxlcyBncm91cCBtYW5hZ2VtZW50LCBlc3BlY2lhbGx5IGluIGR5bmFtaWMgZW52aXJvbm1lbnRzLCBhbmQgaG93IGl0IGRlYWxzIHdpdGggZmFpbHVyZXMgYW5kIHJlc291cmNlIGV4aGF1c3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBpbXBhY3Qgb24gbmV0bGluaydzIHJlbGlhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZS4gVGhpcyBpc24ndCBqdXN0IGFib3V0IHJlYWRpbmcgdGhlIGNvZGU7IGl0J3MgYWJvdXQgYnVpbGRpbmcgYSBzb2xpZCBtZW50YWwgbW9kZWwgb2YgaXRzIGJlaGF2aW9yIHdpdGhpbiB0aGUgYmlnZ2VyIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMDg5LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NDMuMjUyNzQyNTg4WiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4ODg0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTIwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTIwOlxcdFxcdG5say1cXHUwMDNlc3Vic2NyaXB0aW9ucyA9IHN1YnNjcmlwdGlvbnM7XFxuIDkyMTpcXHR9XFxuIDkyMjpcXHRcXG4gOTIzOlxcdHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXFxuIDkyNDpcXHR7XFxuIDkyNTpcXHRcXHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XFxuIDkyNjpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xcbiA5Mjc6XFx0XFx0dW5zaWduZWQgaW50IGdyb3VwcztcXG4gOTI4OlxcdFxcdGludCBlcnIgPSAwO1xcbiA5Mjk6XFx0XFxuIDkzMDpcXHRcXHRuZXRsaW5rX3RhYmxlX2dyYWIoKTtcXG4gOTMxOlxcdFxcbiA5MzI6XFx0XFx0Z3JvdXBzID0gbmxfdGFibGVbc2stXFx1MDAzZXNrX3Byb3RvY29sXS5ncm91cHM7XFxuIDkzMzpcXHRcXHRpZiAoIW5sX3RhYmxlW3NrLVxcdTAwM2Vza19wcm90b2NvbF0ucmVnaXN0ZXJlZCkge1xcbiA5MzQ6XFx0XFx0XFx0ZXJyID0gLUVOT0VOVDtcXG4gOTM1OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gOTM2OlxcdFxcdH1cXG4gOTM3OlxcdFxcbiA5Mzg6XFx0XFx0aWYgKG5say1cXHUwMDNlbmdyb3VwcyBcXHUwMDNlPSBncm91cHMpXFxuIDkzOTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDk0MDpcXHRcXG4gOTQxOlxcdFxcdC8qIENhbiBub3QgdXNlIGtyZWFsbG9jKCksIGJlY2F1c2UgdGhlIG9sZCBidWZmZXIgbWlnaHQgYmUgZnJlZWRcXG4gOTQyOlxcdFxcdCAqIGltbWVkaWF0ZWx5LCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIChuZXRsaW5rIGRpYWcgZHVtcCBhbmRcXG4gOTQzOlxcdFxcdCAqIC9wcm9jL25ldC9uZXRsaW5rKSBjYW4gc3RpbGwgYmUgbG9va2luZyBhdCBpdC5cXG4gOTQ0OlxcdFxcdCAqL1xcbiA5NDU6XFx0XFx0bmV3X2dyb3VwcyA9IGt6YWxsb2MoTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTtcXG4gOTQ2OlxcdFxcdGlmICghbmV3X2dyb3Vwcykge1xcbiA5NDc6XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4gOTQ4OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gOTQ5OlxcdFxcdH1cXG4gOTUwOlxcdFxcdG9sZF9ncm91cHMgPSBubGstXFx1MDAzZWdyb3VwcztcXG4gOTUxOlxcdFxcdGlmIChvbGRfZ3JvdXBzKVxcbiA5NTI6XFx0XFx0XFx0bWVtY3B5KG5ld19ncm91cHMsIG9sZF9ncm91cHMsIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSk7XFxuIDk1MzpcXHRcXG4gOTU0OlxcdFxcdC8qIFB1Ymxpc2ggdGhlIG5ldyBiaXRtYXAgYW5kIGl0cyBjb250ZW50OiBwYWlycyB3aXRoIHRoZSBhZGRyZXNzXFxuIDk1NTpcXHRcXHQgKiBkZXBlbmRlbmN5IGluIGxvY2tsZXNzIHJlYWRlcnMsIHdoaWNoIGNhbiBwaWNrIHVwIHRoZSBuZXcgcG9pbnRlclxcbiA5NTY6XFx0XFx0ICogd2hpbGUgc3RpbGwgc2VlaW5nIHRoZSBvbGQgKHNtYWxsZXIpIG5say1cXHUwMDNlbmdyb3Vwcy5cXG4gOTU3OlxcdFxcdCAqL1xcbiA5NTg6XFx0XFx0c21wX3N0b3JlX3JlbGVhc2UoXFx1MDAyNm5say1cXHUwMDNlZ3JvdXBzLCBuZXdfZ3JvdXBzKTtcXG4gOTU5OlxcdFxcbiA5NjA6XFx0XFx0LyogVGhlbiBwdWJsaXNoIHRoZSBuZXcgc2l6ZTogcGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgZnJvbVxcbiA5NjE6XFx0XFx0ICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKVxcbiA5NjI6XFx0XFx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cXG4gOTYzOlxcdFxcdCAqL1xcbiA5NjQ6XFx0XFx0c21wX3N0b3JlX3JlbGVhc2UoXFx1MDAyNm5say1cXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcXG4gOTY1OlxcdFxcbiA5NjY6XFx0IG91dF91bmxvY2s6XFxuIDk2NzpcXHRcXHRuZXRsaW5rX3RhYmxlX3VuZ3JhYigpO1xcbiA5Njg6XFx0XFxuIDk2OTpcXHRcXHRpZiAob2xkX2dyb3VwcylcXG4gOTcwOlxcdFxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xcbiA5NzE6XFx0XFxuIDk3MjpcXHRcXHRyZXR1cm4gZXJyO1xcbiA5NzM6XFx0fVxcbiA5NzQ6XFx0XFxuIDk3NTpcXHRzdGF0aWMgdm9pZCBuZXRsaW5rX3VuZG9fYmluZChpbnQgZ3JvdXAsIGxvbmcgdW5zaWduZWQgaW50IGdyb3VwcyxcXG4gOTc2OlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBzb2NrICpzaylcXG4gOTc3OlxcdHtcXG4gOTc4OlxcdFxcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XFxuIDk3OTpcXHRcXHRpbnQgdW5kbztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NDMuMjUzMDMzOTE4WiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk0OTUzNzAwMzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEtlcm5lbCBNZW1vcnkgRGVhbGxvY2F0aW9uIHdpdGggUkNVKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpYCBjYWxsLiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoZSB0eXBlIG9mIGBvbGRfZ3JvdXBzYC4gSXMgaXQgYW4gYHVuc2lnbmVkIGxvbmcgKmAgYXMgSSBzdXNwZWN0PyBUaGlzIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IuXG5cbk5vdywgaG93IGRvZXMgdGhpcyBmdW5jdGlvbiwgYGtmcmVlX3JjdV9taWdodHNsZWVwYCwgYWN0dWFsbHkgb3BlcmF0ZSB3aXRoaW4gdGhlIGtlcm5lbD8gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZy4gRG9lcyBpdCBtYW5kYXRlIHRoZSBwcmVzZW5jZSBvZiBhbiBgcmN1X2hlYWRgIHN0cnVjdHVyZSwgb3IgY2FuIGl0IGhhbmRsZSBhIGBrbWFsbG9jYCBhbGxvY2F0ZWQgcG9pbnRlciBkaXJlY3RseT8gVGhlcmUncyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGRpZmZlcmVuY2UgaGVyZS5cblxuQWgsIHRoYXQncyByaWdodC4gSXQncyBhIGtleSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGBrZnJlZV9yY3UocHRyLCByY3VfaGVhZClgIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKWAuIEluIG1vZGVybiBrZXJuZWwgdmVyc2lvbnMsIHNwZWNpZmljYWxseSB0aG9zZSBpbiB0aGUgNS54IGFuZCA2Lnggc2VyaWVzLCB0aGUgc2luZ2xlLWFyZ3VtZW50IHZlcnNpb25zIGxpa2UgYGt2ZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGFuZCBhbHNvIGBrZnJlZV9yY3UocHRyKWAgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlLiBUaGVzZSB3b3JrIHBlcmZlY3RseSB3aXRoIHBvaW50ZXJzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2NgLCB3aXRob3V0IG5lZWRpbmcgYW4gZXhwbGljaXQgb2Zmc2V0IG9yIGByY3VfaGVhZGAgc3RydWN0dXJlLiBUaGF0J3MgYSBzaWduaWZpY2FudCBhZHZhbmNlbWVudCBpbiB0aGUgUkNVIG1lbW9yeSBtYW5hZ2VtZW50IEFQSS5cblxuVG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIGl0cyBwcmFjdGljYWwgdXNhZ2UsIEknbGwgcGVyZm9ybSBhIHF1aWNrIGBncmVwYCBzZWFyY2ggZm9yIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIGNvZGUuIFNlZWluZyBpdCBpbiBjb250ZXh0IHdpbGwgcHJvdmlkZSB2YWx1YWJsZSBjbHVlcyBhYm91dCBpdHMgaW50ZW5kZWQgcHVycG9zZSBhbmQgdXNhZ2UgcGF0dGVybnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMjIwLCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NTIuNzQ4NDIzMjMyWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDgyNDk4NjI2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtmcmVlX3JjdV9taWdodHNsZWVwXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q9NjIwPWJlIHVzZWQsIG9taXR0aW5nIHRoZSByY3VfaGVhZCBzdHJ1Y3R1cmUgZnJvbSBzdHJ1Y3QgZm9vLlxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtNjIxLVxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q6NjIyOlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9mcCk7XFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC02MjMtXFxuLS1cXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0PTEwNzY9UkNVOjpcXG4tLVxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtMTA4Ny1cXHRyY3VfcmVhZF9sb2NrX2hlbGRcXHRcXHRrdmZyZWVfcmN1XFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdDoxMDg4OlxcdHJjdV9yZWFkX2xvY2tfYW55X2hlbGRcXHRcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcFxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtMTA4OS1cXHRyY3VfcG9pbnRlcl9oYW5kb2ZmXFx0XFx0Y29uZF9zeW5jaHJvbml6ZV9yY3VcXG4tLVxcbmJsb2NrL2Jsay1tcS5jPTQ1Mzk9c3RhdGljIHZvaWQgX19ibGtfbXFfcmVhbGxvY19od19jdHhzKHN0cnVjdCBibGtfbXFfdGFnX3NldCAqc2V0LFxcbi0tXFxuYmxvY2svYmxrLW1xLmMtNDU2MC1cXHRcXHQgKi9cXG5ibG9jay9ibGstbXEuYzo0NTYxOlxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGhjdHhzKTtcXG5ibG9jay9ibGstbXEuYy00NTYyLVxcdFxcdGhjdHhzID0gbmV3X2hjdHhzO1xcbi0tXFxuYmxvY2svYmxrLXpvbmVkLmM9MTk2Nj1zdGF0aWMgdm9pZCBkaXNrX3NldF96b25lc19jb25kX2FycmF5KHN0cnVjdCBnZW5kaXNrICpkaXNrLCB1OCAqem9uZXNfY29uZClcXG4tLVxcbmJsb2NrL2Jsay16b25lZC5jLTE5NzQtXFxuYmxvY2svYmxrLXpvbmVkLmM6MTk3NTpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcCh6b25lc19jb25kKTtcXG5ibG9jay9ibGstem9uZWQuYy0xOTc2LX1cXG4tLVxcbmJsb2NrL2Vycm9yLWluamVjdGlvbi5jPTExOD1zdGF0aWMgdm9pZCBlcnJvcl9pbmplY3RfcmVtb3ZlYWxsKHN0cnVjdCBnZW5kaXNrICpkaXNrKVxcbi0tXFxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmMtMTI3LVxcdFxcdGxpc3RfZGVsX3JjdShcXHUwMDI2aW5qLVxcdTAwM2VlbnRyeSk7XFxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmM6MTI4OlxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGluaik7XFxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmMtMTI5LVxcdH1cXG4tLVxcbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmM9MTM5OD1zdGF0aWMgaW50IHJ4ZV9kZXJlZ19tcihzdHJ1Y3QgaWJfbXIgKmlibXIsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpXFxuLS1cXG5kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV92ZXJicy5jLTE0MTMtXFxuZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfdmVyYnMuYzoxNDE0OlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKG1yKTtcXG5kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV92ZXJicy5jLTE0MTUtXFx0cmV0dXJuIDA7XFxuLS1cXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmM9MTQ3Nz1zdGF0aWMgdm9pZCByaXNjdl9pb21tdV9yZWxlYXNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuLS1cXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4MC1cXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmM6MTQ4MTpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChpbmZvKTtcXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4Mi19XFxuLS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW4vdGMvaW50X3BvcnQuYz0yMjc9bWx4NWVfaW50X3BvcnRfcmVtb3ZlKHN0cnVjdCBtbHg1ZV90Y19pbnRfcG9ydF9wcml2ICpwcml2LFxcbi0tXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuL3RjL2ludF9wb3J0LmMtMjQ0LVxcdG1seDVlX2ludF9wb3J0X21ldGFkYXRhX2ZyZWUocHJpdiwgaW50X3BvcnQtXFx1MDAzZW1hdGNoX21ldGFkYXRhKTtcXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW4vdGMvaW50X3BvcnQuYzoyNDU6XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaW50X3BvcnQpO1xcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi90Yy9pbnRfcG9ydC5jLTI0Ni1cXHRwcml2LVxcdTAwM2VudW1fcG9ydHMtLTtcXG4tLVxcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9hY2NlbC9tYWNzZWMuYz02Mzk9c3RhdGljIGludCBtbHg1ZV9tYWNzZWNfZGVsX3R4c2Eoc3RydWN0IG1hY3NlY19jb250ZXh0ICpjdHgpXFxuLS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY1LVxcdG1seDVfZGVzdHJveV9lbmNyeXB0aW9uX2tleShtYWNzZWMtXFx1MDAzZW1kZXYsIHR4X3NhLVxcdTAwM2VlbmNfa2V5X2lkKTtcXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmM6NjY2OlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKHR4X3NhKTtcXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY3LVxcdG1hY3NlY19kZXZpY2UtXFx1MDAzZXR4X3NhW2Fzc29jX251bV0gPSBOVUxMO1xcbi0tXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jPTgxNT1zdGF0aWMgdm9pZCBtYWNzZWNfZGVsX3J4c2NfY3R4KHN0cnVjdCBtbHg1ZV9tYWNzZWMgKm1hY3NlYywgc3RydWN0IG1seDVlX21hY3NlY19yeF9zYyAqcnhfc2MsXFxuLS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtODQyLVxcdGtmcmVlKHJ4X3NjLVxcdTAwM2VzY194YXJyYXlfZWxlbWVudCk7XFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jOjg0MzpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChyeF9zYyk7XFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jLTg0NC19XFxuLS1cXG5mcy9idHJmcy92b2x1bWVzLmM9NzU5PXN0YXRpYyBub2lubGluZSBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2VfbGlzdF9hZGQoY29uc3QgY2hhciAqcGF0aCxcXG4tLVxcbmZzL2J0cmZzL3ZvbHVtZXMuYy05NTUtXFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS1cXHUwMDNlbmFtZSwgbmFtZSk7XFxuZnMvYnRyZnMvdm9sdW1lcy5jOjk1NjpcXHRcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfbmFtZSk7XFxuZnMvYnRyZnMvdm9sdW1lcy5jLTk1Ny1cXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0yNTgyPXN0YXRpYyB2b2lkIGV4dDRfYXBwbHlfcXVvdGFfb3B0aW9ucyhzdHJ1Y3QgZnNfY29udGV4dCAqZmMsXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMjYwNi1cXHRcXHRcXHRpZiAocW5hbWUpXFxuZnMvZXh0NC9zdXBlci5jOjI2MDc6XFx0XFx0XFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAocW5hbWUpO1xcbmZzL2V4dDQvc3VwZXIuYy0yNjA4LVxcdFxcdH1cXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz0xODE5PWludCBrZXJuZnNfcmVuYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIHN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xODk3LVxcdGlmIChuZXdfbmFtZSBcXHUwMDI2XFx1MDAyNiAhaXNfa2VybmVsX3JvZGF0YSgodW5zaWduZWQgbG9uZylvbGRfbmFtZSkpXFxuZnMva2VybmZzL2Rpci5jOjE4OTg6XFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX25hbWUpO1xcbmZzL2tlcm5mcy9kaXIuYy0xODk5LVxcbi0tXFxuZnMveGZzL2xpYnhmcy94ZnNfZ3JvdXAuYz0xNTQ9eGZzX2dyb3VwX2ZyZWUoXFxuLS1cXG5mcy94ZnMvbGlieGZzL3hmc19ncm91cC5jLTE3Ni1cXHRYRlNfSVNfQ09SUlVQVChtcCwgYXRvbWljX3JlYWQoXFx1MDAyNnhnLVxcdTAwM2V4Z19hY3RpdmVfcmVmKSBcXHUwMDNjIDApO1xcbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmM6MTc3OlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKHhnKTtcXG5mcy94ZnMvbGlieGZzL3hmc19ncm91cC5jLTE3OC19XFxuLS1cXG5mcy94ZnMveGZzX2hlYWx0aG1vbi5jPTg2PXhmc19oZWFsdGhtb25fcHV0KFxcbi0tXFxuZnMveGZzL3hmc19oZWFsdGhtb24uYy0xMDEtXFx0XFx0bXV0ZXhfZGVzdHJveShcXHUwMDI2aG0tXFx1MDAzZWxvY2spO1xcbmZzL3hmcy94ZnNfaGVhbHRobW9uLmM6MTAyOlxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGhtKTtcXG5mcy94ZnMveGZzX2hlYWx0aG1vbi5jLTEwMy1cXHR9XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmg9OTk0PXN0YXRpYyBpbmxpbmUgdm9pZCByY3VfcmVhZF91bmxvY2tfbWlncmF0ZSh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTEwODctLyoqXFxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oOjEwODg6ICoga2ZyZWVfcmN1X21pZ2h0c2xlZXAoKSAtIGtmcmVlIGFuIG9iamVjdCBhZnRlciBhIGdyYWNlIHBlcmlvZC5cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA4OS0gKiBAcHRyOiBwb2ludGVyIHRvIGtmcmVlIGZvciBzaW5nbGUtYXJndW1lbnQgaW52b2NhdGlvbnMuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA5NC0gKlxcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMDk1OiAqICAgICBrZnJlZV9yY3VfbWlnaHRzbGVlcChwdHIpO1xcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaC0xMDk2LSAqXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTEwMy0gKi9cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmg6MTEwNDojZGVmaW5lIGtmcmVlX3JjdV9taWdodHNsZWVwKHB0cikga3ZmcmVlX3JjdV9hcmdfMShwdHIpXFxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTExMDUtI2RlZmluZSBrdmZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKSBrdmZyZWVfcmN1X2FyZ18xKHB0cilcXG4tLVxcbmtlcm5lbC9yY3UvcmN1c2NhbGUuYz03NTg9a2ZyZWVfc2NhbGVfdGhyZWFkKHZvaWQgKmFyZylcXG4tLVxcbmtlcm5lbC9yY3UvcmN1c2NhbGUuYy04MDQtXFx0XFx0XFx0XFx0XFx0KGtmcmVlX3JjdV90ZXN0X2JvdGggXFx1MDAyNlxcdTAwMjYgdG9ydHVyZV9yYW5kb20oXFx1MDAyNnRyKSBcXHUwMDI2IDB4ODAwKSlcXG5rZXJuZWwvcmN1L3JjdXNjYWxlLmM6ODA1OlxcdFxcdFxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGFsbG9jX3B0cik7XFxua2VybmVsL3JjdS9yY3VzY2FsZS5jLTgwNi1cXHRcXHRcXHRlbHNlXFxuLS1cXG5uZXQvY2FuL2d3LmM9MTA3Nz1zdGF0aWMgaW50IGNnd19jcmVhdGVfam9iKHN0cnVjdCBza19idWZmICpza2IsICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCxcXG4tLVxcbm5ldC9jYW4vZ3cuYy0xMTI3LVxcdFxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcihnd2otXFx1MDAzZWNmX21vZCwgbW9kKTtcXG5uZXQvY2FuL2d3LmM6MTEyODpcXHRcXHRcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfY2YpO1xcbm5ldC9jYW4vZ3cuYy0xMTI5LVxcdFxcdFxcdHJldHVybiAwO1xcbi0tXFxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jPTMxNT1pbnQgbXB0Y3BfcG1fbmxfcmVtb3ZlX2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4tLVxcbm5ldC9tcHRjcC9wbV91c2Vyc3BhY2UuYy0zNTctXFxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jOjM1ODpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChtYXRjaCk7XFxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jLTM1OS1cXHQvKiBBZGp1c3Qgc2tfb21lbV9hbGxvYyBsaWtlIHNvY2tfa2ZyZWVfcygpIGRvZXMsIHRvIG1hdGNoXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTIzPXN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTY5LVxcdGlmIChvbGRfZ3JvdXBzKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NzA6XFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX2dyb3Vwcyk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk3MS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NTYuMjMwOTI3MDg5WiIsIlNlcSI6NDMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyNDU1ODQ3NTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFRoaXMgUGF0Y2ggRG9lc24ndCBOZWVkIEl0KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoIG5lY2Vzc2l0YXRlcyBhIEtNU0FOIHJ1bi4gRnJvbSB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb24sIHRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGNvbmN1cnJlbmN5IGlzc3VlcyBpbiBob3cgbmV0bGluayBncm91cCBiaXRtYXBzIGFyZSByZWFsbG9jYXRlZCBhbmQgYWNjZXNzZWQuIFNwZWNpZmljYWxseSwgdGhlIG9yaWdpbmFsIHVzZSBvZiBga3JlYWxsb2NgIHByZXNlbnRlZCBhIHBvdGVudGlhbCBVc2UtQWZ0ZXItRnJlZSAoVUFGKSBzaXR1YXRpb24gZm9yIGxvY2tsZXNzIFJDVSByZWFkZXJzLiBBZGRpdGlvbmFsbHksIHdpdGhvdXQgbWVtb3J5IGJhcnJpZXJzLCB0aGVyZSB3YXMgYSByaXNrIG9mIE91dC1vZi1Cb3VuZHMgKE9PQikgcmVhZHMgZHVlIHRvIGluY29uc2lzdGVudCB2aWV3cyBvZiBidWZmZXIgc2l6ZXMuXG5cblRoZSBjb3JlIG9mIHRoZSBmaXggaW52b2x2ZXMgcmVwbGFjaW5nIGBrcmVhbGxvY2Agd2l0aCBhIGBremFsbG9jYC1iYXNlZCBhcHByb2FjaC4gVGhpcyBtZWFucyB0aGUgbmV3IGJ1ZmZlciwgYG5ld19ncm91cHNgLCBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZSBwcmV2aW91cyBjb250ZW50cyBhcmUgdGhlbiBjb3BpZWQgaW4uIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIHZpYSBga2ZyZWVfcmN1X21pZ2h0c2xlZXBgLiBNZW1vcnkgYmFycmllcnMgYXJlIHVzZWQgdG8gZW5zdXJlIHJlYWRlcnMgc2VlIGNvbnNpc3RlbnQgc3RhdGUuXG5cbk5vdywgY29uc2lkZXJpbmcgdGhlIEtNU0FOIGd1aWRlbGluZXMsIHRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgZXhwb3NlcyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gTGV0J3MgYW5hbHl6ZSBlYWNoIGNvbXBvbmVudDpcblxuMS4gIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYDogVGhlIGNyaXRpY2FsIGNoYW5nZSBoZXJlIGlzIGBremFsbG9jYC4gVGhpcyBndWFyYW50ZWVzIGEgZnVsbHkgaW5pdGlhbGl6ZWQgYnVmZmVyLCBlbGltaW5hdGluZyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRXZlbiB0aGUgcHJldmlvdXMgYGtyZWFsbG9jYCArIGBtZW1zZXRgIGFwcHJvYWNoLCB3aGlsZSBsZXNzIGVsZWdhbnQsIHdhcyBzdGlsbCBmdWxseSBpbml0aWFsaXppbmcgdGhlIG1lbW9yeS4gVGhlIGNvcHkgZnJvbSBgb2xkX2dyb3Vwc2AgaXMgYWxzbyBzYWZlIGJlY2F1c2UgdGhhdCBtZW1vcnkgd2FzIGVpdGhlciBpbml0aWFsaXplZCBmcm9tIGBremFsbG9jYCBvciBzb21lIGVxdWl2YWxlbnQgYXQgc29tZSB0aW1lIGluIHRoZSBwYXN0LlxuXG4yLiAgYHNrX2RpYWdfZHVtcF9ncm91cHNgOiBUaGlzIGZ1bmN0aW9uIG5vdyBjb3JyZWN0bHkgbG9hZHMgYG5ncm91cHNgIGFuZCBgZ3JvdXBzYC4gIFRoZSBgZ3JvdXBzYCBidWZmZXIgaGVyZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0J3MgdGhlIG9sZCBvciB0aGUgbmV3IG9uZSwgaXMgYWx3YXlzIHNvdXJjZWQgZnJvbSBga3phbGxvY2AgKG9yIGtlcm5lbC1pbnRlcm5hbCBpbml0KSwgZ3VhcmFudGVlaW5nIGluaXRpYWxpemF0aW9uLiBFdmVuIGlmIHRoZSBjb2RlIHdlcmUgZmxhd2VkIGFuZCBhbiBvdXQtb2YtYm91bmRzIHJlYWQgb2NjdXJyZWQsIHRoYXQncyBhIEtBU0FOIGlzc3VlLiBUaGUgbWVtb3J5IGJhcnJpZXJzIHByZXZlbnQgdGhlIE9PQi5cblxuMy4gIGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd2A6IFRoaXMgcmVhZHMgZnJvbSBgUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpYC4gU2luY2UgdGhlIGJ1ZmZlciB0aGF0IGBubGstXHUwMDNlZ3JvdXBzYCBwb2ludHMgdG8gaXMgYWx3YXlzIGFsbG9jYXRlZCB2aWEgYGt6YWxsb2NgLCB0aGlzIHJlYWQgaXMgYWxzbyBzYWZlLlxuXG40LiAgVGhlIGZ1bmRhbWVudGFsIGlzc3VlIHRoaXMgcGF0Y2ggcmVzb2x2ZXM6IFRoZSBvcmlnaW5hbCBwcm9ibGVtIG9mIFVBRiBhbmQgT09CIGFyaXNlcyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzIGFuZCBpbXByb3BlciBtZW1vcnkgYmFycmllcnMgd2l0aCBga3JlYWxsb2NgLiBUaGVzZSBhcmUgYnVncyB0aGF0IEtBU0FOIGV4Y2VscyBhdCBkZXRlY3RpbmcuIFRoZSBuZXcgYXBwcm9hY2ggcmVzb2x2ZXMgdGhpcyBieSBlbnN1cmluZyBhIGNvbnNpc3RlbnQsIGluaXRpYWxpemVkIHZpZXcgb2YgdGhlIG1lbW9yeSwgYW5kIHByb3Blcmx5IHN5bmNocm9uaXppbmcuXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBkb2Vzbid0IGNyZWF0ZSAqYW55KiBuZXcgcmlza3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiB0byAqYXZvaWQqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBObyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBhcmUgcmVhZCwgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzIGFyZSBpbnZvbHZlZCwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHNlbnQgdG8gdXNlcnNwYWNlLiBUaGUgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBVQUYgYW5kIE9PQiwgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4uXG5cblRoZSBLTVNBTiBndWlkZWxpbmVzIGFyZSBjbGVhcjogaWYgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgY2F0Y2ggdGhlIHByb2JsZW0sIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYSByZXNvdXJjZS1pbnRlbnNpdmUgS01TQU4gcnVuLiBUaGlzIHBhdGNoIGZhbGxzIHNxdWFyZWx5IGludG8gdGhhdCBjYXRlZ29yeS4gSGVuY2UsIGBOZWVkc0tNU0FOID0gZmFsc2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTU2NywiT3V0cHV0VG9rZW5zIjoyMDcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTMxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMyOjA4LjY4Njc3NzE0NloiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzb2x2ZXMgYSBjb25jdXJyZW5jeSBidWcgd2hlcmUgYGtyZWFsbG9jKClgIGltbWVkaWF0ZWx5IGZyZWVkIGBubGstXFx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJ3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gXFxuXFxuRnJvbSBhIEtNU0FOIHBlcnNwZWN0aXZlLCB0aGUgbmV3IGdyb3VwcyBidWZmZXIgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jKClgIHdoaWNoIHplcm9lcyB0aGUgZW50aXJlIGFsbG9jYXRpb24sIGZvbGxvd2VkIGJ5IGNvcHlpbmcgZXhpc3RpbmcgZ3JvdXAgZGF0YTsgdGh1cywgYWxsIGJ5dGVzIG9mIHRoZSBidWZmZXIgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBwdWJsaWNhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgc3RydWN0IHBhZGRpbmdzLCBvciB1bmluaXRpYWxpemVkIGRhdGEgbGVha3MgdG8gdXNlcnNwYWNlIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzb2x2ZXMgYSBjb25jdXJyZW5jeSBidWcgd2hlcmUgYGtyZWFsbG9jKClgIGltbWVkaWF0ZWx5IGZyZWVkIGBubGstXFx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJ3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gXFxuXFxuRnJvbSBhIEtNU0FOIHBlcnNwZWN0aXZlLCB0aGUgbmV3IGdyb3VwcyBidWZmZXIgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jKClgIHdoaWNoIHplcm9lcyB0aGUgZW50aXJlIGFsbG9jYXRpb24sIGZvbGxvd2VkIGJ5IGNvcHlpbmcgZXhpc3RpbmcgZ3JvdXAgZGF0YTsgdGh1cywgYWxsIGJ5dGVzIG9mIHRoZSBidWZmZXIgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBwdWJsaWNhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgc3RydWN0IHBhZGRpbmdzLCBvciB1bmluaXRpYWxpemVkIGRhdGEgbGVha3MgdG8gdXNlcnNwYWNlIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-11 16:42:27 +0000 UTC FinishedAt: 2026-09-11 17:32:10 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "78445023439506ebd83b86d40b1e428a3b309d4a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NETLINK_DIAG", "PROC_FS" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "net", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git", "commit_hash": "78445023439506ebd83b86d40b1e428a3b309d4a", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "NETLINK_DIAG", "PROC_FS" ], "series_id": "94f352df-b1f9-4e57-829f-510bf132863a" }, "track": "KASAN", "fuzz": { "focus": [ "net" ], "focus_symbols": [ "netlink_realloc_groups", "sk_diag_dump_groups", "netlink_native_seq_show" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db" ], "skip_cover_check": false, "bug_title_re": "", "base_commit": "78445023439506ebd83b86d40b1e428a3b309d4a", "base_tree": "net" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI4PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+M208L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O05FVExJTktfRElBRyYjMzQ7LAogICAgJiMzNDtQUk9DX0ZTJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7bmV0bGlua19yZWFsbG9jX2dyb3VwcyYjMzQ7LAogICAgJiMzNDtza19kaWFnX2R1bXBfZ3JvdXBzJiMzNDssCiAgICAmIzM0O25ldGxpbmtfbmF0aXZlX3NlcV9zaG93JiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVzb2x2ZXMgYSBjb25jdXJyZW5jeSBidWcgd2hlcmUgYGtyZWFsbG9jKClgIGltbWVkaWF0ZWx5IGZyZWVkIGBubGstXHUwMDNlZ3JvdXBzYCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIHVuZGVyIFJDVSAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYCkgY291bGQgYWNjZXNzIGl0IGNvbmN1cnJlbnRseSwgcmlza2luZyB1c2UtYWZ0ZXItZnJlZSAoVUFGKSBhbmQgb3V0LW9mLWJvdW5kcyAoT09CKSByZWFkcy4gVGhlc2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgKFVBRiBhbmQgT09CIGhlYXAgcmVhZHMpIGZhbGwgc3RyaWN0bHkgdW5kZXIgS0FTQU4mIzM5O3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gXG5cbkZyb20gYSBLTVNBTiBwZXJzcGVjdGl2ZSwgdGhlIG5ldyBncm91cHMgYnVmZmVyIGlzIGFsbG9jYXRlZCB1c2luZyBga3phbGxvYygpYCB3aGljaCB6ZXJvZXMgdGhlIGVudGlyZSBhbGxvY2F0aW9uLCBmb2xsb3dlZCBieSBjb3B5aW5nIGV4aXN0aW5nIGdyb3VwIGRhdGE7IHRodXMsIGFsbCBieXRlcyBvZiB0aGUgYnVmZmVyIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgcHVibGljYXRpb24uIE5vIHVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnksIHN0cnVjdCBwYWRkaW5ncywgb3IgdW5pbml0aWFsaXplZCBkYXRhIGxlYWtzIHRvIHVzZXJzcGFjZSBhcmUgaW50cm9kdWNlZCBvciBleHBvc2VkLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzKSBhY3Jvc3MgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBza19kaWFnX2R1bXBfZ3JvdXBzKCksIGFuZCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nIGNvbmN1cnJlbmN5IGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgbmV0bGluayBzb2NrZXQgYmluZC9zZXRzb2Nrb3B0LCBzb2NrX2RpYWcgZHVtcCwgYW5kIC9wcm9jL25ldC9uZXRsaW5rIHJlYWRzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBkZXRlY3QgcG90ZW50aWFsIGRhdGEgcmFjZXMsIG1lbW9yeSBvcmRlcmluZyBpc3N1ZXMsIG9yIFVBRnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6Mjg8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jXG5pbmRleCBlNmIxZDk3NThjOWM5Li45ZmRmOTY0MjI0YWI0IDEwMDY0NFxuLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcbkBAIC05MjIsOSAmIzQzOzkyMiw5IEBAIG5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcbiBcbiBzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIHtcbiYjNDM7XHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XG4gXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xuIFx0dW5zaWduZWQgaW50IGdyb3Vwcztcbi1cdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHM7XG4gXHRpbnQgZXJyID0gMDtcbiBcbiBcdG5ldGxpbmtfdGFibGVfZ3JhYigpO1xuQEAgLTkzOCwxOCAmIzQzOzkzOCwzNyBAQCBzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIFx0aWYgKG5say1cdTAwM2VuZ3JvdXBzIFx1MDAzZT0gZ3JvdXBzKVxuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXG4tXHRuZXdfZ3JvdXBzID0ga3JlYWxsb2MobmxrLVx1MDAzZWdyb3VwcywgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTtcbi1cdGlmIChuZXdfZ3JvdXBzID09IE5VTEwpIHtcbiYjNDM7XHQvKiBDYW4gbm90IHVzZSBrcmVhbGxvYygpLCBiZWNhdXNlIHRoZSBvbGQgYnVmZmVyIG1pZ2h0IGJlIGZyZWVkXG4mIzQzO1x0ICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZFxuJiM0MztcdCAqIC9wcm9jL25ldC9uZXRsaW5rKSBjYW4gc3RpbGwgYmUgbG9va2luZyBhdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuJiM0MztcdGlmICghbmV3X2dyb3Vwcykge1xuIFx0XHRlcnIgPSAtRU5PTUVNO1xuIFx0XHRnb3RvIG91dF91bmxvY2s7XG4gXHR9XG4tXHRtZW1zZXQoKGNoYXIgKiluZXdfZ3JvdXBzICYjNDM7IE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpLCAwLFxuLVx0ICAgICAgIE5MR1JQU1ooZ3JvdXBzKSAtIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpKTtcbiYjNDM7XHRvbGRfZ3JvdXBzID0gbmxrLVx1MDAzZWdyb3VwcztcbiYjNDM7XHRpZiAob2xkX2dyb3VwcylcbiYjNDM7XHRcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4mIzQzO1xuJiM0MztcdC8qIFB1Ymxpc2ggdGhlIG5ldyBiaXRtYXAgYW5kIGl0cyBjb250ZW50OiBwYWlycyB3aXRoIHRoZSBhZGRyZXNzXG4mIzQzO1x0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcbiYjNDM7XHQgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLVx1MDAzZW5ncm91cHMuXG4mIzQzO1x0ICovXG4mIzQzO1x0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XG4mIzQzO1xuJiM0MztcdC8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb21cbiYjNDM7XHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG4mIzQzO1x0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cbiYjNDM7XHQgKi9cbiYjNDM7XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZubGstXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcbiBcbi1cdG5say1cdTAwM2Vncm91cHMgPSBuZXdfZ3JvdXBzO1xuLVx0bmxrLVx1MDAzZW5ncm91cHMgPSBncm91cHM7XG4gIG91dF91bmxvY2s6XG4gXHRuZXRsaW5rX3RhYmxlX3VuZ3JhYigpO1xuJiM0MztcbiYjNDM7XHRpZiAob2xkX2dyb3VwcylcbiYjNDM7XHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xuJiM0MztcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTI3MDUsMTIgJiM0MzsyNzI0LDE5IEBAIHN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4gXHR9IGVsc2Uge1xuIFx0XHRzdHJ1Y3Qgc29jayAqcyA9IHY7XG4gXHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzKTtcbiYjNDM7XHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgKmdyb3VwcztcbiYjNDM7XG4mIzQzO1x0XHQvKiBMb2NrbGVzcyByZWFkIDogbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiBjaGFuZ2VcbiYjNDM7XHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG4mIzQzO1x0XHQgKiBSQ1UgZ3JhY2UgcGVyaW9kLCBhbmQgdGhpcyB3YWxrIGlzIFJDVSBwcm90ZWN0ZWQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbiBcbiBcdFx0c2VxX3ByaW50ZihzZXEsIFwmIzM0OyVwSyAlLTNkICUtMTB1ICUwOHggJS04ZCAlLThkICUtNWQgJS04ZCAlLTh1ICUtOGxsdVxcblwmIzM0OyxcbiBcdFx0XHQgICBzLFxuIFx0XHRcdCAgIHMtXHUwMDNlc2tfcHJvdG9jb2wsXG4gXHRcdFx0ICAgbmxrLVx1MDAzZXBvcnRpZCxcbi1cdFx0XHQgICBubGstXHUwMDNlZ3JvdXBzID8gKHUzMilubGstXHUwMDNlZ3JvdXBzWzBdIDogMCxcbiYjNDM7XHRcdFx0ICAgZ3JvdXBzID8gKHUzMilncm91cHNbMF0gOiAwLFxuIFx0XHRcdCAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIHNrX3dtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIFJFQURfT05DRShubGstXHUwMDNlY2JfcnVubmluZyksXG5kaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZGlhZy5jIGIvbmV0L25ldGxpbmsvZGlhZy5jXG5pbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NFxuLS0tIGEvbmV0L25ldGxpbmsvZGlhZy5jXG4mIzQzOyYjNDM7JiM0MzsgYi9uZXQvbmV0bGluay9kaWFnLmNcbkBAIC0xMiwxMiAmIzQzOzEyLDI0IEBAXG4gc3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuIHtcbiBcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4tXG4tXHRpZiAobmxrLVx1MDAzZWdyb3VwcyA9PSBOVUxMKVxuJiM0MztcdHVuc2lnbmVkIGxvbmcgKmdyb3VwcztcbiYjNDM7XHR1bnNpZ25lZCBpbnQgbmdyb3VwcztcbiYjNDM7XG4mIzQzO1x0LyogSGFzaGVkIHNvY2tldHMgYXJlIGR1bXBlZCBmcm9tIHRoZSByaGFzaHRhYmxlIHdhbGssIHdoaWNoIG9ubHlcbiYjNDM7XHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxuJiM0MztcdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG4mIzQzO1x0ICogZnJvbSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNvIHRoYXQgd2UgY2FuIG5vdCB1c2UgdGhlIG5ld1xuJiM0MztcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXG4mIzQzO1x0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRuZ3JvdXBzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZubGstXHUwMDNlbmdyb3Vwcyk7XG4mIzQzO1x0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuJiM0MztcdGlmICghZ3JvdXBzKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHJldHVybiBubGFfcHV0KG5sc2tiLCBORVRMSU5LX0RJQUdfR1JPVVBTLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSxcbi1cdFx0ICAgICAgIG5say1cdTAwM2Vncm91cHMpO1xuJiM0MztcdHJldHVybiBubGFfcHV0KG5sc2tiLCBORVRMSU5LX0RJQUdfR1JPVVBTLCBOTEdSUFNaKG5ncm91cHMpLCBncm91cHMpO1xuIH1cbiBcbiBzdGF0aWMgaW50IHNrX2RpYWdfcHV0X2ZsYWdzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYilcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyODwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4xbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORVRMSU5LX0RJQUcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25ldGxpbmtfcmVhbGxvY19ncm91cHMmIzM0OywKICAgICYjMzQ7c2tfZGlhZ19kdW1wX2dyb3VwcyYjMzQ7LAogICAgJiMzNDtuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzKSBhY3Jvc3MgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBza19kaWFnX2R1bXBfZ3JvdXBzKCksIGFuZCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nIGNvbmN1cnJlbmN5IGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgbmV0bGluayBzb2NrZXQgYmluZC9zZXRzb2Nrb3B0LCBzb2NrX2RpYWcgZHVtcCwgYW5kIC9wcm9jL25ldC9uZXRsaW5rIHJlYWRzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBkZXRlY3QgcG90ZW50aWFsIGRhdGEgcmFjZXMsIG1lbW9yeSBvcmRlcmluZyBpc3N1ZXMsIG9yIFVBRnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci4KWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBldmFsdWF0ZSB3aGV0aGVyIGl0IHdhcnJhbnRzIGZ1enppbmcgd2l0aCBzeXprYWxsZXIuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIGludGVybmFsIGFzc3VtcHRpb25zLiBZb3UgbXVzdCBhY3RpdmVseSB1c2UgeW91ciBjb2RlIGFjY2Vzcwp0b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGUgZ29hbCBvZiBwYXRjaCBmdXp6aW5nIGlzIHRvIGRpc2NvdmVyIGNyYXNoZXMsIHJlZ3Jlc3Npb25zLCBleHBvc2VkIGxhdGVudCBidWdzLAphbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLgoKLSBSRUFDSEFCSUxJVFkgSVMgVEhFIFBSSU1BUlkgR0FURToKICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkCiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS4KICBJZiB0aGUgbW9kaWZpZWQgY29kZSBpcyBzdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgKHNlZSBTZWN0aW9uIDIpLCBpdCBNVVNUIE5PVCBiZSBmdXp6ZWQsCiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLgoKLSBETyBOT1QgQkxJTkRMWSBUUlVTVCAmIzM0O05PIEZVTkNUSU9OQUwgQ0hBTkdFJiMzNDsgKE5GQ0kpIE9SICYjMzQ7UkVGQUNUT1JJTkcmIzM0OyBDTEFJTVM6CiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyAmIzM0O2NsZWFudXBzJiMzNDssICYjMzQ7cmVmYWN0b3JpbmdzJiMzNDssIG9yIHN0YXRlCiAgJiMzNDtObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZCYjMzQ7LiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS4KICBDb2RlIHJlZmFjdG9yaW5ncyB0aGF0IHJlYXJyYW5nZSBsb2dpYywgaW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbnMsIG9yIGFsdGVyIHN0YXRlIG1hbmFnZW1lbnQKICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy4KICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLgoKLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDoKICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosCiAgQlVHX09OKiwgbG9ja2RlcF9hc3NlcnQqKSBpbiByZWFjaGFibGUgY29kZSBwYXRocywgaXQgZW5mb3JjZXMgbmV3IG9yIHN0cmljdGVyIGludmFyaWFudHMuCiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlcgogIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6CgotIE5vbi1rZXJuZWwgYW5kIG5vbi1leGVjdXRhYmxlIGNoYW5nZXM6CiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuCiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLykKICAgIHRoYXQgZG8gbm90IGFmZmVjdCB0aGUgY29tcGlsZWQga2VybmVsIGltYWdlICh2bWxpbnV4KSBvciBrZXJuZWwgbW9kdWxlcy4KICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzCiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLgogICogQnVpbGQgc3lzdGVtIG9yIEtjb25maWcgY2hhbmdlcyB0aGF0IGRvIG5vdCBhbHRlciBjb21waWxlZCBDIGxvZ2ljLgotIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZToKICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCwKICAgIGlvbmljLCBhbWRncHUpIHJlcXVpcmluZyBwaHlzaWNhbCBBU0lDL1BDSWUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOgogICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nCiAgICBwaHlzaWNhbCBQQ0kgaG90LXVucGx1ZyBvciBtYW51YWwgc3lzZnMgZHJpdmVyIHVuYmluZGluZy4KICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz10cnVlIHdoZW5ldmVyIHRoZSBwYXRjaCB0b3VjaGVzIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUsIGluY2x1ZGluZzoKLSBDb3JlIFN1YnN5c3RlbXM6CiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksCiAgICBCUEYsIHNjaGVkdWxlciwgY29yZSBuZXR3b3JraW5nLCBWRlMsIG9yIHN5c2NhbGwgaGFuZGxpbmcuCi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOgogICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLgotIFJ1bnRpbWUgQXNzZXJ0aW9ucyBhbmQgRGVmZW5zaXZlIENoZWNrczoKICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy4KLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOgogICogRHJpdmVycyBhY2Nlc3NpYmxlIHZpYSB2aXJ0dWFsIGJ1c2VzICh2aXJ0aW8sIFVTQiBnYWRnZXQsIGxvb3BiYWNrLCBuZXRsaW5rLCBiaW5kZXIsIHNvY2tldHMsIGV0Yy4pLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNC4gRVhUUkFDVElORyBGb2N1c1N5bWJvbHMgKFBSRVZFTlRJTkcgRElMVVRJT04pCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOgoKLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6CiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXMKICAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGdlbmVyYWwgbWVtb3J5IGFsbG9jYXRvcnMgYW5kIGRlYWxsb2NhdG9ycywgcGFnZSBmYXVsdAogIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLgogIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyAmIzM0O2ZvY3VzZWQmIzM0OywKICB3aGljaCBzZXZlcmVseSBkaWx1dGVzIGZ1enppbmcgZWZmb3J0IGF3YXkgZnJvbSB0aGUgYWN0dWFsIGNoYW5nZXMuCgotIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzoKICBMaXN0IGZ1bmN0aW9ucyB0aGF0IHNwZWNpZmljYWxseSBpbXBsZW1lbnQgdGhlIGxvZ2ljIGJlaW5nIGFkZGVkIG9yIGFsdGVyZWQsIG9yIGRpcmVjdCBBUEkgZW50cnlwb2ludHMKICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy4KCi0gSEFORExJTkcgU1RBVElDIElOTElORSBGVU5DVElPTlMgSU4gSEVBREVSUyAoLmgpOgogIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2sKICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy4KICBJZiB0aGUgY2hhbmdlcyBhcmUgcHJpbWFyaWx5IGluIHN0YXRpYyBpbmxpbmUgaGVscGVycywgaWRlbnRpZnkgbm9uLXN0YXRpYywgZmVhdHVyZS1zcGVjaWZpYyBjYWxsZXIKICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo1LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CklkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgY29tcGlsZSBhbmQgcmVhY2ggdGhlIG1vZGlmaWVkIGNvZGU6Ci0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy4KLSBDaGVjayAmIzM0O2RlcGVuZHMgb24mIzM0OyBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLgotIFN0cmlwIGFueSAmIzM5O0NPTkZJR18mIzM5OyBwcmVmaXggKGUuZy4sIHJldHVybiAmIzM0O05FVF9JUFY0JiMzNDsgaW5zdGVhZCBvZiAmIzM0O0NPTkZJR19ORVRfSVBWNCYjMzQ7KS4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggZTZiMWQ5NzU4YzljOS4uOWZkZjk2NDIyNGFiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtOTIyLDkgJiM0Mzs5MjIsOSBAQCBuZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpCiAKIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCXVuc2lnbmVkIGludCBncm91cHM7Ci0JdW5zaWduZWQgbG9uZyAqbmV3X2dyb3VwczsKIAlpbnQgZXJyID0gMDsKIAogCW5ldGxpbmtfdGFibGVfZ3JhYigpOwpAQCAtOTM4LDE4ICYjNDM7OTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiAJaWYgKG5say0mZ3Q7bmdyb3VwcyAmZ3Q7PSBncm91cHMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCW5ld19ncm91cHMgPSBrcmVhbGxvYyhubGstJmd0O2dyb3VwcywgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTsKLQlpZiAobmV3X2dyb3VwcyA9PSBOVUxMKSB7CiYjNDM7CS8qIENhbiBub3QgdXNlIGtyZWFsbG9jKCksIGJlY2F1c2UgdGhlIG9sZCBidWZmZXIgbWlnaHQgYmUgZnJlZWQKJiM0MzsJICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZAomIzQzOwkgKiAvcHJvYy9uZXQvbmV0bGluaykgY2FuIHN0aWxsIGJlIGxvb2tpbmcgYXQgaXQuCiYjNDM7CSAqLwomIzQzOwluZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpOwomIzQzOwlpZiAoIW5ld19ncm91cHMpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQltZW1zZXQoKGNoYXIgKiluZXdfZ3JvdXBzICYjNDM7IE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwgMCwKLQkgICAgICAgTkxHUlBTWihncm91cHMpIC0gTkxHUlBTWihubGstJmd0O25ncm91cHMpKTsKJiM0MzsJb2xkX2dyb3VwcyA9IG5say0mZ3Q7Z3JvdXBzOwomIzQzOwlpZiAob2xkX2dyb3VwcykKJiM0MzsJCW1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say0mZ3Q7bmdyb3VwcykpOwomIzQzOwomIzQzOwkvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzcwomIzQzOwkgKiBkZXBlbmRlbmN5IGluIGxvY2tsZXNzIHJlYWRlcnMsIHdoaWNoIGNhbiBwaWNrIHVwIHRoZSBuZXcgcG9pbnRlcgomIzQzOwkgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLSZndDtuZ3JvdXBzLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O2dyb3VwcywgbmV3X2dyb3Vwcyk7CiYjNDM7CiYjNDM7CS8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb20KJiM0MzsJICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKQomIzQzOwkgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O25ncm91cHMsIGdyb3Vwcyk7CiAKLQlubGstJmd0O2dyb3VwcyA9IG5ld19ncm91cHM7Ci0JbmxrLSZndDtuZ3JvdXBzID0gZ3JvdXBzOwogIG91dF91bmxvY2s6CiAJbmV0bGlua190YWJsZV91bmdyYWIoKTsKJiM0MzsKJiM0MzsJaWYgKG9sZF9ncm91cHMpCiYjNDM7CQlrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKTsKJiM0MzsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzA1LDEyICYjNDM7MjcyNCwxOSBAQCBzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogCX0gZWxzZSB7CiAJCXN0cnVjdCBzb2NrICpzID0gdjsKIAkJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpOwomIzQzOwkJY29uc3QgdW5zaWduZWQgbG9uZyAqZ3JvdXBzOwomIzQzOwomIzQzOwkJLyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlCiYjNDM7CQkgKiBubGstJmd0O2dyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW4KJiM0MzsJCSAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC4KJiM0MzsJCSAqLwomIzQzOwkJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKIAogCQlzZXFfcHJpbnRmKHNlcSwgJiMzNDslcEsgJS0zZCAlLTEwdSAlMDh4ICUtOGQgJS04ZCAlLTVkICUtOGQgJS04dSAlLThsbHVcbiYjMzQ7LAogCQkJICAgcywKIAkJCSAgIHMtJmd0O3NrX3Byb3RvY29sLAogCQkJICAgbmxrLSZndDtwb3J0aWQsCi0JCQkgICBubGstJmd0O2dyb3VwcyA/ICh1MzIpbmxrLSZndDtncm91cHNbMF0gOiAwLAomIzQzOwkJCSAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCwKIAkJCSAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLAogCQkJICAgc2tfd21lbV9hbGxvY19nZXQocyksCiAJCQkgICBSRUFEX09OQ0UobmxrLSZndDtjYl9ydW5uaW5nKSwKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuYwppbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9kaWFnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L25ldGxpbmsvZGlhZy5jCkBAIC0xMiwxMiAmIzQzOzEyLDI0IEBACiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpCiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKLQotCWlmIChubGstJmd0O2dyb3VwcyA9PSBOVUxMKQomIzQzOwl1bnNpZ25lZCBsb25nICpncm91cHM7CiYjNDM7CXVuc2lnbmVkIGludCBuZ3JvdXBzOwomIzQzOwomIzQzOwkvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seQomIzQzOwkgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZQomIzQzOwkgKiBubGstJmd0O2dyb3VwcyBhbmQgbmxrLSZndDtuZ3JvdXBzIGF0IGFueSB0aW1lLgomIzQzOwkgKgomIzQzOwkgKiBSZWFkIG5say0mZ3Q7bmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpCiYjNDM7CSAqIGZyb20gbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBzbyB0aGF0IHdlIGNhbiBub3QgdXNlIHRoZSBuZXcKJiM0MzsJICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXMKJiM0MzsJICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC4KJiM0MzsJICovCiYjNDM7CW5ncm91cHMgPSBzbXBfbG9hZF9hY3F1aXJlKCZhbXA7bmxrLSZndDtuZ3JvdXBzKTsKJiM0MzsJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJaWYgKCFncm91cHMpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwKLQkJICAgICAgIG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7CiB9CiAKIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyODwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MjA5CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgU3VpdGFiaWxpdHkgQW5hbHlzaXM6IE5ldGxpbmsgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIHRha2UgYSBsb29rIGF0IHRoaXMgcGF0Y2ggYW5kIGRlY2lkZSBpZiBpdCYjMzk7cyB3b3J0aCBvdXIgdGltZSBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLiBGcm9tIGEgc2FmZXR5IHBlcnNwZWN0aXZlLCB0aGlzIGlzIGEgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCB0cmlhZ2UgdGFzayDigJMgYmVuaWduIGRldmVsb3BlciBRQSwgcGFydCBvZiB0aGUgbm9ybWFsIG1haW50ZW5hbmNlIGFuZCBkZWZlbnNpdmUgc2VjdXJpdHkgd29ya2Zsb3cuCgpBbHJpZ2h0LCB0aGUgcGF0Y2ggbW9kaWZpZXMgYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AgYW5kIGBuZXQvbmV0bGluay9kaWFnLmNgLiBTcGVjaWZpY2FsbHksIEkgc2VlIGNoYW5nZXMgaW4gYG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKWAgcmVwbGFjaW5nIGBrcmVhbGxvYygpYCB3aXRoIGBremFsbG9jKClgLCBgbWVtY3B5KClgLCBhdG9taWMgc3RvcmVzIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAoKWAsIGFuZCByZWxhdGVkIGNoYW5nZXMgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYC4KClRoaXMgaXMgY29yZSBuZXR3b3JraW5nIGNvZGUsIHNwZWNpZmljYWxseSBOZXRsaW5rLiBOZXRsaW5rIGlzIGRlZmluaXRlbHkgYSBwcmltZSB0YXJnZXQsIGl0JiMzOTtzIHByZXR0eSBtdWNoIGV2ZXJ5d2hlcmUsIGFuZCByZWFjaGFibGUgdmlhIHVucHJpdmlsZWdlZCB1c2VyIHNvY2tldHMg4oCTIGBzb2NrZXQoQUZfTkVUTElOSywgLi4uKWAsIGRpYWcgaW50ZXJmYWNlcyAoYE5FVExJTktfSU5FVF9ESUFHYCwgYE5FVExJTktfRElBR2ApLCBldmVuIGFjY2Vzc2libGUgdmlhIGAvcHJvYy9uZXQvbmV0bGlua2AuCgpOb3csIGxldCYjMzk7cyBhcHBseSB0aGUgZnV6emluZyBjcml0ZXJpYS4gV2UgYXJlIGxvb2tpbmcgZm9yICYjMzQ7UmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSYjMzQ7IGFuZCBpdCBpczoKCi0gICBDb3JlIFN1YnN5c3RlbXM6ICoqQ29yZSBuZXR3b3JraW5nISoqCgotICAgUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOiAqKlJlc3RydWN0dXJpbmcgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb2RlIGZsb3chKioKCi0gICBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOiAqKk5ldGxpbmsgdmlhIHNvY2tldHMhKioKClllYWgsIGl0JiMzOTtzIGNsZWFyOiBgV29ydGhGdXp6aW5nID0gdHJ1ZWAhIEkgZG9uJiMzOTt0IG5lZWQgdG8gZGlnIGRlZXBlci4gVGhpcyBwYXRjaCBkZWZpbml0ZWx5IG1lZXRzIHRoZSBjcml0ZXJpYS4KCk5vdywgSSYjMzk7bGwgcHJvYmFibHkgZ28gdGhyb3VnaCBhbmQgdXNlIGdpdCBkaWZmIG9yIGdyZXAgb24gdGhlIHJlcG8gdG8gZG91YmxlLWNoZWNrIGV4YWN0IGZ1bmN0aW9uIGNhbGxlcnMsIGFuZCBtYXliZSBwb2tlIGFyb3VuZCBhdCBzb21lIHJlbGV2YW50IGNvbmZpZ3MganVzdCB0byBnZXQgYW4gb3ZlcmFsbCBzZW5zZSBmb3IgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7bmV0bGlua19yZWFsbG9jX2dyb3VwcyYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz05MTI9bmV0bGlua191cGRhdGVfc3Vic2NyaXB0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBzdWJzY3JpcHRpb25zKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjItXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6OTIzOnN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTI0LXtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTg5PXN0YXRpYyBpbnQgbmV0bGlua19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICphZGRyLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEwLVx0XHRcdHJldHVybiAtRVBFUk07XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTAxMTpcdFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTAxMi1cdFx0aWYgKGVycilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTY2Nz1zdGF0aWMgaW50IG5ldGxpbmtfc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkxLVx0XHRcdHJldHVybiAtRVBFUk07XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTY5MjpcdFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY5My1cdFx0aWYgKGVycilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzI4LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3Mjk6XHRcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzAtXHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jPTEyPXN0YXRpYyBpbnQgc2tfZGlhZ19kdW1wX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpubHNrYilcbi0tXG5uZXQvbmV0bGluay9kaWFnLmMtMTgtXHQvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seVxubmV0L25ldGxpbmsvZGlhZy5jOjE5Olx0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2Vcbm5ldC9uZXRsaW5rL2RpYWcuYy0yMC1cdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYy0yMi1cdCAqIFJlYWQgbmxrLVx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxubmV0L25ldGxpbmsvZGlhZy5jOjIzOlx0ICogZnJvbSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNvIHRoYXQgd2UgY2FuIG5vdCB1c2UgdGhlIG5ld1xubmV0L25ldGxpbmsvZGlhZy5jLTI0LVx0ICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXNcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA1OTA5CgkJCQkJCQlvdXRwdXQ6IDI3CgkJCQkJCQl0aG91Z2h0czogMjgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSBLY29uZmlnIGZpbGVzLCB0aGlua2luZyBsaWtlIGFuIGV4cGVydDoKCioqRGl2aW5nIGludG8gdGhlIE5ldGxpbmsgRGlhZ25vc3RpYyBQbHVtYmluZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29uZmlndXJhdGlvbiBkZXBlbmRlbmNpZXMgZm9yIG5ldGxpbmsgZGlhZ25vc3RpY3MuIE15IGltbWVkaWF0ZSBmb2N1cyBpcyBvbiBgbmV0L25ldGxpbmsvZGlhZy5jYCBhbmQgYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AuIEkgZXhwZWN0IHRoZXNlIGZpbGVzIGNvbnRhaW4gdGhlIGNvcmUgbG9naWMgZm9yIHRoZSBOZXRsaW5rIGRpYWdub3N0aWMgaW50ZXJmYWNlLCBhbmQgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBmYW1pbHkgaW1wbGVtZW50YXRpb24uCgpJJiMzOTtsbCBiZSBsb29raW5nIGZvciB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgY29udHJvbCB0aGVpciBjb21waWxhdGlvbi4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gZGVwZW5kZW5jaWVzIG9uIG90aGVyIE5ldGxpbmsgZmVhdHVyZXMsIGxpa2UgdGhlIGNvcmUgTmV0bGluayBzdXBwb3J0IChgTkVUTElOS2ApIGl0c2VsZiwgZGlmZmVyZW50IE5ldGxpbmsgbWVzc2FnZSB0eXBlcywgYW5kIHBvdGVudGlhbGx5IGV2ZW4gc3BlY2lmaWMgc29ja2V0IHR5cGVzIG9yIHByb3RvY29scyBidWlsdCBvbiBOZXRsaW5rLiBJJiMzOTtsbCBhbHNvIGNoZWNrIGZvciBvcHRpb25zIHRoYXQgbWlnaHQgZW5hYmxlIG9yIGRpc2FibGUgc3BlY2lmaWMgZGlhZ25vc3RpYyBtZXNzYWdlIHR5cGVzIG9yIGZlYXR1cmVzIHdpdGhpbiB0aGVzZSBmaWxlcy4gSXQmIzM5O3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIGhvdyBkZWVwbHkgdGhlIGRpYWdub3N0aWMgY29kZSBpcyBpbnRlZ3JhdGVkIGFuZCB3aGF0IG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgYXJlIHJlcXVpcmVkIG9yIGltcGFjdGVkIHdoZW4gZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGRpYWdub3N0aWMgZnVuY3Rpb25hbGl0aWVzIGZvciBOZXRsaW5rLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2RpYWdcXC5vJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvTWFrZWZpbGU9Nj1vYmoteSAgXHRcdFx0XHQ6PSBhZl9uZXRsaW5rLm8gZ2VuZXRsaW5rLm8gcG9saWN5Lm9cbm5ldC9uZXRsaW5rL01ha2VmaWxlLTctXG5uZXQvbmV0bGluay9NYWtlZmlsZTo4Om9iai0kKENPTkZJR19ORVRMSU5LX0RJQUcpXHQmIzQzOz0gbmV0bGlua19kaWFnLm9cbm5ldC9uZXRsaW5rL01ha2VmaWxlOjk6bmV0bGlua19kaWFnLXlcdFx0XHQ6PSBkaWFnLm9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA2Mjc2CgkJCQkJCQlvdXRwdXQ6IDIwCgkJCQkJCQl0aG91Z2h0czogMjYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyBOZXRsaW5rIERpYWdub3N0aWNzKioKCk9rYXksIHNvIEkmIzM5O20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaWYgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBOZXRsaW5rIGRpYWdub3N0aWNzIGhlcmUuIFRoZSBmaXJzdCB0aGluZyBJJiMzOTtkIGRvIGlzIGltbWVkaWF0ZWx5IGNoZWNrIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gSSBuZWVkIHRvIHNlZSBpZiBgQ09ORklHX05FVExJTktfRElBR2AgaXMgZXZlbiBlbmFibGVkLiBUaGF0JiMzOTtzIHRoZSBiYXNlbGluZSwgcmlnaHQ/IEl0JiMzOTtzIGxpa2UgY2hlY2tpbmcgdGhlIGZ1c2UgYm94IGJlZm9yZSBJIHN0YXJ0IHRyb3VibGVzaG9vdGluZyB0aGUgZWxlY3RyaWNhbCBzeXN0ZW0uIEkmIzM5O2xsIG5lZWQgdG8gbG9vayBpbiBgbmV0L25ldGxpbmsvS2NvbmZpZ2Agb3IsIGhlY2ssIG1heWJlIGl0JiMzOTtzIGRlZmluZWQgZWxzZXdoZXJlLiBHb3R0YSBiZSB0aG9yb3VnaC4gVGltZSB0byBjcmFjayBvcGVuIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBzZWUgd2hhdCYjMzk7cyB3aGF0LiBHb3R0YSBtYWtlIHN1cmUgdGhpcyBkaWFnbm9zdGljIHN1cHBvcnQgaXMgYWN0dWFsbHkgY29tcGlsZWQgaW4gYmVmb3JlIEkgZ28gY2hhc2luZyBzaGFkb3dzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBORVRMSU5LX0RJQUcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvS2NvbmZpZy01LVxubmV0L25ldGxpbmsvS2NvbmZpZzo2OmNvbmZpZyBORVRMSU5LX0RJQUdcbm5ldC9uZXRsaW5rL0tjb25maWctNy1cdHRyaXN0YXRlIFwmIzM0O05FVExJTks6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY1NTEKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSBgbmV0L25ldGxpbmsvS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDYsIGFzIHRob3VnaCBJIHdlcmUgcG9uZGVyaW5nIGl0OgoKKipEaXZpbmcgaW50byB0aGUgTmV0bGluayBDb25maWd1cmF0aW9uKioKCk9rYXksIHRpbWUgdG8gZ2V0IGEgZ29vZCBncmlwIG9uIGhvdyB0aGlzIE5ldGxpbmsgc3Vic3lzdGVtIGNvbmZpZ3VyZXMgaXRzZWxmLiBMZXQmIzM5O3Mgc2VlLi4uIEkmIzM5O20gZ29pbmcgdG8gcHVsbCB1cCB0aGF0IGBLY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNiwgdG8gZ2V0IHRoZSBsYXkgb2YgdGhlIGxhbmQuIEkga25vdyB0aGlzIGZpbGUgaG9sZHMgdGhlIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIG9wdGlvbnMsIHNvIHRoYXQmIzM5O3Mgd2hlcmUgdGhlIGNyaXRpY2FsIGRlY2lzaW9ucyBhYm91dCB3aGljaCBOZXRsaW5rIGZlYXR1cmVzIGdldCBidWlsdCBpbnRvIHRoZSBrZXJuZWwgYXJlIG1hZGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIGNvcmUgZGVwZW5kZW5jaWVzIGFyZS4gSSYjMzk7bSBob3BpbmcgdG8gdW5kZXJzdGFuZCB3aGF0IGFyZSB0aGUgKmJhc2UqIGZlYXR1cmVzIGFuZCB3aGF0IGRlcGVuZHMgb24gd2hhdC4gVGhpcyBpcyBjcnVjaWFsIGZvciBjdXN0b21pemluZyBhIGtlcm5lbCBlZmZlY3RpdmVseSwgb3IgdHJvdWJsZXNob290aW5nIGJ1aWxkIGlzc3Vlcy4gV2hhdCBhcmUgdGhlIGtleSBzd2l0Y2hlcyBmb3IgaW5jbHVkaW5nIE5ldGxpbmsgc3VwcG9ydCwgYW5kIHdoYXQgYXJlIHRoZWlyIGRlcGVuZGVuY2llcz8gVW5kZXJzdGFuZGluZyB0aGVzZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgaXMgYWJzb2x1dGVseSBmdW5kYW1lbnRhbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6Mjk8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAzMAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5XG4gICAyOlx0I1xuICAgMzpcdCMgTmV0bGluayBTb2NrZXRzXG4gICA0Olx0I1xuICAgNTpcdFxuICAgNjpcdGNvbmZpZyBORVRMSU5LX0RJQUdcbiAgIDc6XHRcdHRyaXN0YXRlIFwmIzM0O05FVExJTks6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVwmIzM0O1xuICAgODpcdFx0ZGVmYXVsdCBuXG4gICA5Olx0XHRoZWxwXG4gIDEwOlx0XHQgIFN1cHBvcnQgZm9yIE5FVExJTksgc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNzIHRvb2wuXG4gIDExOlx0XHQgIElmIHVuc3VyZSwgc2F5IFkuXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY5MjcKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAxMzIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgTmV0bGluayBNb2R1bGUgRGVlcCBEaXZlKioKCk9rYXksIHNvIEkmIzM5O20gbG9va2luZyBhdCB0aGUgYnVpbGQgcHJvY2VzcyBmb3IgdGhlIE5ldGxpbmsgc3Vic3lzdGVtLCBzcGVjaWZpY2FsbHkgYGFmX25ldGxpbmsuY2AuIEdvb2QsIGl0JiMzOTtzIGFsd2F5cyBpbmNsdWRlZDsgYG9iai15YCBtZWFucyB0aGF0IGZpbGUsIGFsb25nIHdpdGggYGdlbmV0bGluay5vYCBhbmQgYHBvbGljeS5vYCwgYXJlIGFsd2F5cyBjb21waWxlZCBpbnRvIHRoZSBrZXJuZWwuIE5vIHN1cnByaXNlcyB0aGVyZS4KCk5vdywgSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgZGlhZ25vc3RpYyBpbnRlcmZhY2UuIGBkaWFnLmNgIGlzIG9ubHkgYnVpbHQgaWYgYENPTkZJR19ORVRMSU5LX0RJQUdgIGlzIHNldC4gUmlnaHQsIGxldCYjMzk7cyBjb25maXJtLiBJdCYjMzk7cyBqdXN0IGEgY29uZmlnIG9wdGlvbiwgbm8gZGVwZW5kZW5jaWVzLiBDbGVhbiBhbmQgc2ltcGxlLiBCdXQgSSB3b25kZXIgYWJvdXQgcHJvY2ZzIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLi4uIEkga25vdyB0aGF0JiMzOTtzIHJlbGF0ZWQgdG8gZGlhZ25vc3RpY3MuIEkgdGhpbmsgSSYjMzk7bGwgaGF2ZSB0byBkZWx2ZSBpbnRvIGBhZl9uZXRsaW5rLmNgIG5lYXIgdGhlIGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd2AgZnVuY3Rpb24sIGFyb3VuZCBsaW5lcyAyNzAwLTI4MDAsIHRvIHNlZSBob3cgdGhhdCBob29rIHdvcmtzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzoyOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDI3MDAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MjcwMDpcdFxuMjcwMTpcdHN0YXRpYyB2b2lkICpuZXRsaW5rX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcylcbjI3MDI6XHR7XG4yNzAzOlx0XHQmIzQzOyYjNDM7KnBvcztcbjI3MDQ6XHRcdHJldHVybiBfX25ldGxpbmtfc2VxX25leHQoc2VxKTtcbjI3MDU6XHR9XG4yNzA2Olx0XG4yNzA3Olx0c3RhdGljIHZvaWQgbmV0bGlua19uYXRpdmVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4yNzA4Olx0e1xuMjcwOTpcdFx0c3RydWN0IG5sX3NlcV9pdGVyICppdGVyID0gc2VxLVx1MDAzZXByaXZhdGU7XG4yNzEwOlx0XG4yNzExOlx0XHRpZiAoaXRlci1cdTAwM2VsaW5rIFx1MDAzZT0gTUFYX0xJTktTKVxuMjcxMjpcdFx0XHRyZXR1cm47XG4yNzEzOlx0XG4yNzE0Olx0XHRuZXRsaW5rX3dhbGtfc3RvcChpdGVyKTtcbjI3MTU6XHR9XG4yNzE2Olx0XG4yNzE3Olx0XG4yNzE4Olx0c3RhdGljIGludCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbjI3MTk6XHR7XG4yNzIwOlx0XHRpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHtcbjI3MjE6XHRcdFx0c2VxX3B1dHMoc2VxLFxuMjcyMjpcdFx0XHRcdCBcJiMzNDtzayAgICAgICAgICAgICAgIEV0aCBQaWQgICAgICAgIEdyb3VwcyAgIFwmIzM0O1xuMjcyMzpcdFx0XHRcdCBcJiMzNDtSbWVtICAgICBXbWVtICAgICBEdW1wICBMb2NrcyAgICBEcm9wcyAgICBJbm9kZVxcblwmIzM0Oyk7XG4yNzI0Olx0XHR9IGVsc2Uge1xuMjcyNTpcdFx0XHRzdHJ1Y3Qgc29jayAqcyA9IHY7XG4yNzI2Olx0XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzKTtcbjI3Mjc6XHRcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyAqZ3JvdXBzO1xuMjcyODpcdFxuMjcyOTpcdFx0XHQvKiBMb2NrbGVzcyByZWFkIDogbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiBjaGFuZ2VcbjI3MzA6XHRcdFx0ICogbmxrLVx1MDAzZWdyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW5cbjI3MzE6XHRcdFx0ICogUkNVIGdyYWNlIHBlcmlvZCwgYW5kIHRoaXMgd2FsayBpcyBSQ1UgcHJvdGVjdGVkLlxuMjczMjpcdFx0XHQgKi9cbjI3MzM6XHRcdFx0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuMjczNDpcdFxuMjczNTpcdFx0XHRzZXFfcHJpbnRmKHNlcSwgXCYjMzQ7JXBLICUtM2QgJS0xMHUgJTA4eCAlLThkICUtOGQgJS01ZCAlLThkICUtOHUgJS04bGx1XFxuXCYjMzQ7LFxuMjczNjpcdFx0XHRcdCAgIHMsXG4yNzM3Olx0XHRcdFx0ICAgcy1cdTAwM2Vza19wcm90b2NvbCxcbjI3Mzg6XHRcdFx0XHQgICBubGstXHUwMDNlcG9ydGlkLFxuMjczOTpcdFx0XHRcdCAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCxcbjI3NDA6XHRcdFx0XHQgICBza19ybWVtX2FsbG9jX2dldChzKSxcbjI3NDE6XHRcdFx0XHQgICBza193bWVtX2FsbG9jX2dldChzKSxcbjI3NDI6XHRcdFx0XHQgICBSRUFEX09OQ0UobmxrLVx1MDAzZWNiX3J1bm5pbmcpLFxuMjc0MzpcdFx0XHRcdCAgIHJlZmNvdW50X3JlYWQoXHUwMDI2cy1cdTAwM2Vza19yZWZjbnQpLFxuMjc0NDpcdFx0XHRcdCAgIHNrX2Ryb3BzX3JlYWQocyksXG4yNzQ1Olx0XHRcdFx0ICAgc29ja19pX2lubyhzKVxuMjc0NjpcdFx0XHRcdCk7XG4yNzQ3Olx0XG4yNzQ4Olx0XHR9XG4yNzQ5Olx0XHRyZXR1cm4gMDtcbjI3NTA6XHR9XG4yNzUxOlx0XG4yNzUyOlx0I2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxuMjc1MzpcdHN0cnVjdCBicGZfaXRlcl9fbmV0bGluayB7XG4yNzU0Olx0XHRfX2JwZl9tZF9wdHIoc3RydWN0IGJwZl9pdGVyX21ldGEgKiwgbWV0YSk7XG4yNzU1Olx0XHRfX2JwZl9tZF9wdHIoc3RydWN0IG5ldGxpbmtfc29jayAqLCBzayk7XG4yNzU2Olx0fTtcbjI3NTc6XHRcbjI3NTg6XHRERUZJTkVfQlBGX0lURVJfRlVOQyhuZXRsaW5rLCBzdHJ1Y3QgYnBmX2l0ZXJfbWV0YSAqbWV0YSwgc3RydWN0IG5ldGxpbmtfc29jayAqc2spXG4yNzU5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDgyNDQKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAxOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIHRhaWxvcmVkIGZvciBhbiBleHBlcnQgYXVkaWVuY2U6CgoqKkludmVzdGlnYXRpbmcgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBVc2FnZSoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBrZXJuZWwgY29kZS4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSB1dGlsaXphdGlvbiBvZiBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgY29udGV4dHMgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSAqY2FsbGVkKi4gVGhlIG5hbWUgaXRzZWxmIHN1Z2dlc3RzIGEgc2VxdWVuY2UtYmFzZWQgZGlzcGxheSwgc28gaXQmIzM5O3MgcHJvYmFibHkgcmVsYXRlZCB0byBzb21lIHNvcnQgb2YgbmV0bGluayBkYXRhIHByZXNlbnRhdGlvbiwgcGVyaGFwcyBmb3IgbW9uaXRvcmluZyBvciBkZWJ1Z2dpbmcuIExldCYjMzk7cyBzZWUgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIHVzZWQ7IEkgbmVlZCB0byBmaW5kIHRoZSBjYWxsIHNpdGVzIHdpdGhpbiB0aGUga2VybmVsIHNvdXJjZS4gVGhhdCYjMzk7bGwgZ2l2ZSBtZSB0aGUgZXNzZW50aWFsIGNvbnRleHQgSSBuZWVkIHRvIHJlYWxseSB1bmRlcnN0YW5kIGl0cyBwdXJwb3NlIGFuZCByb2xlIHdpdGhpbiB0aGUgd2lkZXIgbmV0bGluayBpbmZyYXN0cnVjdHVyZS4gVGhlbiBJIGNhbiB1bmRlcnN0YW5kIGhvdyB0aGlzIGZ1bmN0aW9uIGZpdHMgaW50byB0aGUgYmlnZ2VyIHBpY3R1cmUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25ldGxpbmtfbmF0aXZlX3NlcV9zaG93JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3MDc9c3RhdGljIHZvaWQgbmV0bGlua19uYXRpdmVfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MTctXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjcxODpzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MTkte1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzcyPXN0YXRpYyBpbnQgbmV0bGlua19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjc3OS1cdGlmICghcHJvZylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzgwOlx0XHRyZXR1cm4gbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc2VxLCB2KTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzgxLVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODAzPXN0YXRpYyBpbnQgbmV0bGlua19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODA1Olx0cmV0dXJuIG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHNlcSwgdik7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgwNi19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjI5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg4MjIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiA2NAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBOZXRsaW5rIFNlcXVlbmNlIFNob3cgRnVuY3Rpb24qKgoKT2theSwgc28gSSYjMzk7bSBsb29raW5nIGludG8gdGhlIGAvcHJvYy9uZXQvbmV0bGlua2AgaW50ZXJmYWNlLCB3aGljaCwgYXMgSSByZWNhbGwsIGlzIGNvbXBpbGVkIHdoZW4gYENPTkZJR19QUk9DX0ZTYCBpcyBlbmFibGVkLiBNeSBmb2N1cyBpcyBvbiB1bmRlcnN0YW5kaW5nIHRoZSBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgIGZ1bmN0aW9uLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyByb2xlIGluIHBvcHVsYXRpbmcgdGhhdCBwcm9jIGVudHJ5LiBUaGUgbmV4dCBsb2dpY2FsIHN0ZXAgaXMgdG8gc2VlIGhvdyBgbmV0bGlua19zZXFfc2hvd2AgaXMgdXNlZCBhbmQgd2hlcmUgd2l0aGluIGBhZl9uZXRsaW5rLmNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZXRsaW5rX3NlcV9zaG93JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3NjA9c3RhdGljIGludCBuZXRsaW5rX3Byb2dfc2VxX3Nob3coc3RydWN0IGJwZl9wcm9nICpwcm9nLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzcxLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3NzI6c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3NzMte1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzg4PXN0YXRpYyB2b2lkIG5ldGxpbmtfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4MDItI2Vsc2Vcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODAzOnN0YXRpYyBpbnQgbmV0bGlua19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjgxND1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5ldGxpbmtfc2VxX29wcyA9IHtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgxNy1cdC5zdG9wICAgPSBuZXRsaW5rX3NlcV9zdG9wLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MTg6XHQuc2hvdyAgID0gbmV0bGlua19zZXFfc2hvdyxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODE5LX07XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTcvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDkzOTIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAxOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZCwgaW4gdGhlIGZpcnN0IHBlcnNvbiBhbmQgdGFyZ2V0ZWQgdG93YXJkcyBhbiBleHBlcnQsIHN0YXJ0aW5nIHdpdGggdGhlIGJvbGRlZCBoZWFkZXI6CgoqKkRpdmluZyBpbnRvIGBuZXRsaW5rX3NlcV9vcHNgIGFuZCB0aGUgUHJvYyBGaWxlc3lzdGVtKioKCkFscmlnaHQsIGxldCYjMzk7cyBnZXQgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGBuZXRsaW5rX3NlcV9vcHNgIGFuZCB0aGUgcHJvYyBmaWxlc3lzdGVtLiBJdOKAmXMgYmVlbiBhIHdoaWxlIHNpbmNlIEkmIzM5O3ZlIHJlYWxseSBkdWcgaW50byB0aGlzIHNwZWNpZmljIGFyZWEgb2YgdGhlIGtlcm5lbCwgc28gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBxdWlja2x5IHB1dCB0aGUgcGllY2VzIHRvZ2V0aGVyLiBJIHN1c3BlY3QgdGhlcmUgbWlnaHQgYmUgc29tZSBpbnRlcmFjdGlvbiBhcm91bmQgZXhwb3J0aW5nIGtlcm5lbCBpbmZvcm1hdGlvbiBvciBjb25maWd1cmluZyBzb21lIGFzcGVjdHMgdGhyb3VnaCBwcm9jLCB1c2luZyBhIHNlcXVlbmNlIGZpbGUgaW50ZXJmYWNlIGJhY2tlZCBieSBOZXRsaW5rIHRvIGhhbmRsZSB1cGRhdGVzIG9yIHF1ZXJpZXMuIFRoYXQgd291bGQgbWFrZSBzZW5zZSwgYnV0IEkmIzM5O20ganVzdCBndWVzc2luZyBhdCB0aGlzIHBvaW50LgoKVGhlIGBuZXRsaW5rX3NlcV9vcHNgIHN0cnVjdHVyZSBpdHNlbGYgaXMgYSB2aXRhbCBjbHVlLCBwb2ludGluZyB0b3dhcmQgdGhlIHNlcXVlbmNlIGZpbGUgb3BlcmF0aW9ucy4gR2l2ZW4gTmV0bGluayYjMzk7cyBtZXNzYWdlLXBhc3NpbmcgbmF0dXJlLCBJJiMzOTttIGVudmlzaW9uaW5nIGEgc2V0dXAgd2hlcmUgcHJvYyBlbnRyaWVzIGxldmVyYWdlIGBuZXRsaW5rX3NlcV9vcHNgIHRvIGludGVyYWN0IHdpdGgga2VybmVsIGRhdGEgdGhhdCBpcyBkeW5hbWljLCB1cGRhdGVhYmxlLCBvciByZXF1aXJlcyByZWFsLXRpbWUgaW5mb3JtYXRpb24gZXhjaGFuZ2UuIFRoZSBwcm9jIGZpbGVzeXN0ZW0sIGFzIGEgdmlydHVhbCBmaWxlc3lzdGVtLCBhY3RzIGFzIHRoZSBpbnRlcmZhY2UsIGFuZCBgbmV0bGlua19zZXFfb3BzYCBoYW5kbGVzIHRoZSB1bmRlcmx5aW5nIGNvbW11bmljYXRpb24gYW5kIGRhdGEgbWFuaXB1bGF0aW9uLiBUaGUgcXVlc3Rpb24gaXMsIGhvdyBjbGVhbmx5IGludGVncmF0ZWQgYXJlIHRoZXk/IEFyZSB3ZSBkZWFsaW5nIHdpdGggYSB0aWdodCwgd2VsbC1kZWZpbmVkIGFyY2hpdGVjdHVyZSwgb3IgaXMgaXQgYSBtb3JlIGFkLWhvYyBhcnJhbmdlbWVudCB0aGF0IGV2b2x2ZWQgb3ZlciB0aW1lPyBJJiMzOTttIGN1cmlvdXMgYWJvdXQgdGhlIHNwZWNpZmljIHVzZSBjYXNlcy4gV2hhdCBraW5kIG9mIGRhdGEgYXJlIHRoZXkgZXhjaGFuZ2luZz8gSXMgaXQgbW9zdGx5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycywgbW9uaXRvcmluZyBzdGF0aXN0aWNzLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gVGltZSB0byBpbnZlc3RpZ2F0ZS4uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZXRsaW5rX3NlcV9vcHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0bGluayYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjgwOD1zdGF0aWMgdm9pZCBuZXRsaW5rX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODEzLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MTQ6c3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBuZXRsaW5rX3NlcV9vcHMgPSB7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgxNS1cdC5zdGFydCAgPSBuZXRsaW5rX3NlcV9zdGFydCxcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjg2MD1zdGF0aWMgaW50IF9fbmV0X2luaXQgbmV0bGlua19uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NjItI2lmZGVmIENPTkZJR19QUk9DX0ZTXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Mjg2MzpcdGlmICghcHJvY19jcmVhdGVfbmV0KFwmIzM0O25ldGxpbmtcJiMzNDssIDAsIG5ldC1cdTAwM2Vwcm9jX25ldCwgXHUwMDI2bmV0bGlua19zZXFfb3BzLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NjQtXHRcdFx0c2l6ZW9mKHN0cnVjdCBubF9zZXFfaXRlcikpKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yOTIyPXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2l0ZXJfc2VxX2luZm8gbmV0bGlua19zZXFfaW5mbyA9IHtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyOTIzOlx0LnNlcV9vcHNcdFx0PSBcdTAwMjZuZXRsaW5rX3NlcV9vcHMsXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjkyNC1cdC5pbml0X3NlcV9wcml2YXRlXHQ9IGJwZl9pdGVyX2luaXRfc2VxX25ldCxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTAxNjIKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA0NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYXMgaWYgdGhleSB3ZXJlIG15IG93bjoKCioqTmF2aWdhdGluZyB0aGUgTmV0bGluayBMYW5kc2NhcGUqKgoKUmlnaHQsIGBDT05GSUdfUFJPQ19GU2AuLi4gdGhhdCByaW5ncyBhIGJlbGwuIEl0JiMzOTtzIG9idmlvdXNseSBsaW5rZWQgdG8gdGhhdCBgcHJvY19jcmVhdGVfbmV0KCYjMzQ7bmV0bGluayYjMzQ7LCAuLi4pYCBjYWxsIEkgcmVtZW1iZXIgc2VlaW5nLiBOb3csIEkmIzM5O20gdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgaG93IGEgcGFydGljdWxhciBuZXRsaW5rIHJlbGF0ZWQgY29kZSB3b3JrcyAtIGhvdyBkb2VzIGl0IHdvcmssIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBrZXJuZWw/IEFuZCBJICp0aGluayogaXQgaXMgcmVsYXRlZCB0byBob3cgdGhlIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gaXMgcmVwb3J0ZWQuIFNvLCB3aGF0IGFib3V0IGBkaWFnLmNgPyBUaGF0IGZlZWxzIGxpa2UgYSByZWxldmFudCBmaWxlLCBzcGVjaWZpY2FsbHkgaW4gYG5ldC9uZXRsaW5rL2RpYWcuY2AuIEkgbmVlZCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIHRoZXJlLiBMZXQmIzM5O3MgZGlnIGluLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rL2RpYWcuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNzAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcbiAgIDI6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9tb2R1bGUuaFx1MDAzZVxuICAgMzpcdFxuICAgNDpcdCNpbmNsdWRlIFx1MDAzY25ldC9zb2NrLmhcdTAwM2VcbiAgIDU6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9uZXRsaW5rLmhcdTAwM2VcbiAgIDY6XHQjaW5jbHVkZSBcdTAwM2NsaW51eC9zb2NrX2RpYWcuaFx1MDAzZVxuICAgNzpcdCNpbmNsdWRlIFx1MDAzY2xpbnV4L25ldGxpbmtfZGlhZy5oXHUwMDNlXG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvcmhhc2h0YWJsZS5oXHUwMDNlXG4gICA5Olx0XG4gIDEwOlx0I2luY2x1ZGUgXCYjMzQ7YWZfbmV0bGluay5oXCYjMzQ7XG4gIDExOlx0XG4gIDEyOlx0c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuICAxMzpcdHtcbiAgMTQ6XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gIDE1Olx0XHR1bnNpZ25lZCBsb25nICpncm91cHM7XG4gIDE2Olx0XHR1bnNpZ25lZCBpbnQgbmdyb3VwcztcbiAgMTc6XHRcbiAgMTg6XHRcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XG4gIDE5Olx0XHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxuICAyMDpcdFx0ICogbmxrLVx1MDAzZWdyb3VwcyBhbmQgbmxrLVx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXG4gIDIxOlx0XHQgKlxuICAyMjpcdFx0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG4gIDIzOlx0XHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XG4gIDI0Olx0XHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xuICAyNTpcdFx0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cbiAgMjY6XHRcdCAqL1xuICAyNzpcdFx0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2bmxrLVx1MDAzZW5ncm91cHMpO1xuICAyODpcdFx0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuICAyOTpcdFx0aWYgKCFncm91cHMpXG4gIDMwOlx0XHRcdHJldHVybiAwO1xuICAzMTpcdFxuICAzMjpcdFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XG4gIDMzOlx0fVxuICAzNDpcdFxuICAzNTpcdHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuICAzNjpcdHtcbiAgMzc6XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gIDM4Olx0XHR1MzIgZmxhZ3MgPSAwO1xuICAzOTpcdFxuICA0MDpcdFx0aWYgKG5say1cdTAwM2VjYl9ydW5uaW5nKVxuICA0MTpcdFx0XHRmbGFncyB8PSBORElBR19GTEFHX0NCX1JVTk5JTkc7XG4gIDQyOlx0XHRpZiAobmxrX3Rlc3RfYml0KFJFQ1ZfUEtUSU5GTywgc2spKVxuICA0MzpcdFx0XHRmbGFncyB8PSBORElBR19GTEFHX1BLVElORk87XG4gIDQ0Olx0XHRpZiAobmxrX3Rlc3RfYml0KEJST0FEQ0FTVF9TRU5EX0VSUk9SLCBzaykpXG4gIDQ1Olx0XHRcdGZsYWdzIHw9IE5ESUFHX0ZMQUdfQlJPQURDQVNUX0VSUk9SO1xuICA0NjpcdFx0aWYgKG5sa190ZXN0X2JpdChSRUNWX05PX0VOT0JVRlMsIHNrKSlcbiAgNDc6XHRcdFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19OT19FTk9CVUZTO1xuICA0ODpcdFx0aWYgKG5sa190ZXN0X2JpdChMSVNURU5fQUxMX05TSUQsIHNrKSlcbiAgNDk6XHRcdFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19MSVNURU5fQUxMX05TSUQ7XG4gIDUwOlx0XHRpZiAobmxrX3Rlc3RfYml0KENBUF9BQ0ssIHNrKSlcbiAgNTE6XHRcdFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19DQVBfQUNLO1xuICA1MjpcdFxuICA1MzpcdFx0cmV0dXJuIG5sYV9wdXRfdTMyKHNrYiwgTkVUTElOS19ESUFHX0ZMQUdTLCBmbGFncyk7XG4gIDU0Olx0fVxuICA1NTpcdFxuICA1NjpcdHN0YXRpYyBpbnQgc2tfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYixcbiAgNTc6XHRcdFx0XHRzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSAqcmVxLFxuICA1ODpcdFx0XHRcdHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUzMiBmbGFncywgdTY0IHNrX2lubylcbiAgNTk6XHR7XG4gIDYwOlx0XHRzdHJ1Y3Qgbmxtc2doZHIgKm5saDtcbiAgNjE6XHRcdHN0cnVjdCBuZXRsaW5rX2RpYWdfbXNnICpyZXA7XG4gIDYyOlx0XHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xuICA2MzpcdFxuICA2NDpcdFx0bmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIFNPQ0tfRElBR19CWV9GQU1JTFksIHNpemVvZigqcmVwKSxcbiAgNjU6XHRcdFx0XHRmbGFncyk7XG4gIDY2Olx0XHRpZiAoIW5saClcbiAgNjc6XHRcdFx0cmV0dXJuIC1FTVNHU0laRTtcbiAgNjg6XHRcbiAgNjk6XHRcdHJlcCA9IG5sbXNnX2RhdGEobmxoKTtcbiAgNzA6XHRcdHJlcC1cdTAwM2VuZGlhZ19mYW1pbHlcdD0gQUZfTkVUTElOSztcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTE1NTcKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBIZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkmIzM5O3JlIG15IG93bjoKCioqSW52ZXN0aWdhdGluZyB0aGUgbmV0bGluayBEaWFnbm9zaXMgQ29kZSoqCgpBbHJpZ2h0LCBJJiMzOTttIGF0IGEgcG9pbnQgd2hlcmUgSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBuZXQvbmV0bGluay9kaWFnLmNgIGlzIGFjdHVhbGx5ICp1c2VkKi4gSnVzdCByZWFkaW5nIHRoZSBmdW5jdGlvbnMgaW4gaXNvbGF0aW9uIGlzbiYjMzk7dCBlbm91Z2g7IEkgbmVlZCB0aGUgY29udGV4dC4gV2hlcmUgYXJlIHRoZSBlbnRyeSBwb2ludHM/IFdoYXQgdHJpZ2dlcnMgdGhlc2UgZGlhZ25vc2lzIG1lY2hhbmlzbXM/IEkgbmVlZCB0byB0cmFjZSB0aGUgY2FsbHMsIHRoZSBjYWxsZXIgZnVuY3Rpb25zLCBhbmQgc2VlIGhvdyB0aGUgcGllY2VzIGZpdCB0b2dldGhlci4gU28sIHRvIGdldCB0aGUgZnVsbCBwaWN0dXJlLCBJ4oCZbSBnb2luZyB0byBleGFtaW5lIHRoZSByZXN0IG9mIHRoZSBmaWxlIHRvIHNlZSBob3cgdGhvc2Ugc3BlY2lmaWMgZnVuY3Rpb25zIHdpdGhpbiBgZGlhZy5jYCBhcmUgaW52b2tlZCB3aXRoaW4gdGhlIE5ldGxpbmsgZnJhbWV3b3JrLiBLbm93aW5nIHRoZSBjYWxscyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGRpYWdub3N0aWMgcHJvY2Vzcy4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9kaWFnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA3MSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA2MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDcxOlx0XHRyZXAtXHUwMDNlbmRpYWdfdHlwZVx0XHQ9IHNrLVx1MDAzZXNrX3R5cGU7XG4gIDcyOlx0XHRyZXAtXHUwMDNlbmRpYWdfcHJvdG9jb2xcdD0gc2stXHUwMDNlc2tfcHJvdG9jb2w7XG4gIDczOlx0XHRyZXAtXHUwMDNlbmRpYWdfc3RhdGVcdD0gc2stXHUwMDNlc2tfc3RhdGU7XG4gIDc0Olx0XG4gIDc1Olx0XHRyZXAtXHUwMDNlbmRpYWdfaW5vXHRcdD0gc2tfaW5vO1xuICA3NjpcdFx0cmVwLVx1MDAzZW5kaWFnX3BvcnRpZFx0PSBubGstXHUwMDNlcG9ydGlkO1xuICA3NzpcdFx0cmVwLVx1MDAzZW5kaWFnX2RzdF9wb3J0aWRcdD0gbmxrLVx1MDAzZWRzdF9wb3J0aWQ7XG4gIDc4Olx0XHRyZXAtXHUwMDNlbmRpYWdfZHN0X2dyb3VwXHQ9IG5say1cdTAwM2Vkc3RfZ3JvdXA7XG4gIDc5Olx0XHRzb2NrX2RpYWdfc2F2ZV9jb29raWUoc2ssIHJlcC1cdTAwM2VuZGlhZ19jb29raWUpO1xuICA4MDpcdFxuICA4MTpcdFx0aWYgKChyZXEtXHUwMDNlbmRpYWdfc2hvdyBcdTAwMjYgTkRJQUdfU0hPV19HUk9VUFMpIFx1MDAyNlx1MDAyNlxuICA4MjpcdFx0ICAgIHNrX2RpYWdfZHVtcF9ncm91cHMoc2ssIHNrYikpXG4gIDgzOlx0XHRcdGdvdG8gb3V0X25sbXNnX3RyaW07XG4gIDg0Olx0XG4gIDg1Olx0XHRpZiAoKHJlcS1cdTAwM2VuZGlhZ19zaG93IFx1MDAyNiBORElBR19TSE9XX01FTUlORk8pIFx1MDAyNlx1MDAyNlxuICA4NjpcdFx0ICAgIHNvY2tfZGlhZ19wdXRfbWVtaW5mbyhzaywgc2tiLCBORVRMSU5LX0RJQUdfTUVNSU5GTykpXG4gIDg3Olx0XHRcdGdvdG8gb3V0X25sbXNnX3RyaW07XG4gIDg4Olx0XG4gIDg5Olx0XHRpZiAoKHJlcS1cdTAwM2VuZGlhZ19zaG93IFx1MDAyNiBORElBR19TSE9XX0ZMQUdTKSBcdTAwMjZcdTAwMjZcbiAgOTA6XHRcdCAgICBza19kaWFnX3B1dF9mbGFncyhzaywgc2tiKSlcbiAgOTE6XHRcdFx0Z290byBvdXRfbmxtc2dfdHJpbTtcbiAgOTI6XHRcbiAgOTM6XHRcdG5sbXNnX2VuZChza2IsIG5saCk7XG4gIDk0Olx0XHRyZXR1cm4gMDtcbiAgOTU6XHRcbiAgOTY6XHRvdXRfbmxtc2dfdHJpbTpcbiAgOTc6XHRcdG5sbXNnX2NhbmNlbChza2IsIG5saCk7XG4gIDk4Olx0XHRyZXR1cm4gLUVNU0dTSVpFO1xuICA5OTpcdH1cbiAxMDA6XHRcbiAxMDE6XHRzdGF0aWMgaW50IF9fbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLFxuIDEwMjpcdFx0XHRcdFx0aW50IHByb3RvY29sLCBpbnQgc19udW0pXG4gMTAzOlx0e1xuIDEwNDpcdFx0c3RydWN0IHJoYXNodGFibGVfaXRlciAqaHRpID0gKHZvaWQgKiljYi1cdTAwM2VhcmdzWzJdO1xuIDEwNTpcdFx0c3RydWN0IG5ldGxpbmtfdGFibGUgKnRibCA9IFx1MDAyNm5sX3RhYmxlW3Byb3RvY29sXTtcbiAxMDY6XHRcdHN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi1cdTAwM2Vzayk7XG4gMTA3Olx0XHRzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSAqcmVxO1xuIDEwODpcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxzaztcbiAxMDk6XHRcdHVuc2lnbmVkIGxvbmcgZmxhZ3M7XG4gMTEwOlx0XHRzdHJ1Y3Qgc29jayAqc2s7XG4gMTExOlx0XHRpbnQgbnVtID0gMjtcbiAxMTI6XHRcdGludCByZXQgPSAwO1xuIDExMzpcdFxuIDExNDpcdFx0cmVxID0gbmxtc2dfZGF0YShjYi1cdTAwM2VubGgpO1xuIDExNTpcdFxuIDExNjpcdFx0aWYgKHNfbnVtIFx1MDAzZSAxKVxuIDExNzpcdFx0XHRnb3RvIG1jX2xpc3Q7XG4gMTE4Olx0XG4gMTE5Olx0XHRudW0tLTtcbiAxMjA6XHRcbiAxMjE6XHRcdGlmICghaHRpKSB7XG4gMTIyOlx0XHRcdGh0aSA9IGttYWxsb2Nfb2JqKCpodGkpO1xuIDEyMzpcdFx0XHRpZiAoIWh0aSlcbiAxMjQ6XHRcdFx0XHRyZXR1cm4gLUVOT01FTTtcbiAxMjU6XHRcbiAxMjY6XHRcdFx0Y2ItXHUwMDNlYXJnc1syXSA9IChsb25nKWh0aTtcbiAxMjc6XHRcdH1cbiAxMjg6XHRcbiAxMjk6XHRcdGlmICghc19udW0pXG4gMTMwOlx0XHRcdHJoYXNodGFibGVfd2Fsa19lbnRlcihcdTAwMjZ0YmwtXHUwMDNlaGFzaCwgaHRpKTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTI2ODcKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAxMgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYW5kIHdyaXR0ZW4gaW4gdGhlIGZpcnN0IHBlcnNvbjoKCioqRGl2aW5nIGludG8gYGRpYWcuY2AqKgoKQWxyaWdodCwgSSYjMzk7bSBoZXJlLCByZWFkeSB0byBleGFtaW5lIHRoZSByZXN0IG9mIGBkaWFnLmNgLiBUaGUgaW5pdGlhbCBnbGltcHNlIHByb2JhYmx5IGlzbiYjMzk7dCBlbm91Z2gsIGFuZCB0aGVyZSYjMzk7cyBhIGdvb2QgY2hhbmNlIHRoYXQgd2hhdCYjMzk7cyBuZXh0IGlzIGtleSB0byB3aGF0ZXZlciYjMzk7cyBnb2luZyBvbi4gSSBrbm93IGZyb20gZXhwZXJpZW5jZSB0aGF0IGRpYWdub3N0aWNzIGNhbiBvZnRlbiBiZSBhIHJhYmJpdCBob2xlLCBidXQgYWxzbyB0aGUgYnJlYWRjcnVtYnMgdGhhdCBsZWFkIHRvIHRoZSBzb2x1dGlvbi4gTXkgZ3V0IHRlbGxzIG1lIHRoaXMgb25lJiMzOTtzIHByb2JhYmx5IGdvaW5nIHRvIHByb3ZpZGUgY29udGV4dCB0byBlYXJsaWVyIHByb2JsZW1zLiBMZXQmIzM5O3Mgc2VlIGlmIHRoZSByZXN0IG9mIGl0IHJldmVhbHMgdGhlIHJvb3QgY2F1c2UsIG9yLCBhdCB0aGUgdmVyeSBsZWFzdCwgZ2l2ZXMgbWUgc29tZSBzb2xpZCBjbHVlcyBmb3Igd2hlcmUgdG8gbG9vayBuZXh0LiBHb3R0YSBzdGF5IHNoYXJwIGFuZCBsb29rIGZvciBwYXR0ZXJucywgZGVwZW5kZW5jaWVzLCBhbmQgYW55IHVuZXhwZWN0ZWQgYmVoYXZpb3JzLiBMZXQmIzM5O3MgZGlnIGluIGFuZCBzZWUgd2hhdCBzZWNyZXRzIHRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSBob2xkcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9kaWFnLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAxODAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDE4MDpcdFx0XHRcdFx0IE5FVExJTktfQ0IoY2ItXHUwMDNlc2tiKS5wb3J0aWQsXG4gMTgxOlx0XHRcdFx0XHQgY2ItXHUwMDNlbmxoLVx1MDAzZW5sbXNnX3NlcSxcbiAxODI6XHRcdFx0XHRcdCBOTE1fRl9NVUxUSSxcbiAxODM6XHRcdFx0XHRcdCBzb2NrX2lfaW5vKHNrKSkgXHUwMDNjIDApIHtcbiAxODQ6XHRcdFx0XHRyZXQgPSAxO1xuIDE4NTpcdFx0XHRcdGJyZWFrO1xuIDE4NjpcdFx0XHR9XG4gMTg3Olx0XHRcdG51bSYjNDM7JiM0Mzs7XG4gMTg4Olx0XHR9XG4gMTg5Olx0XHRyZWFkX3VubG9ja19pcnFyZXN0b3JlKFx1MDAyNm5sX3RhYmxlX2xvY2ssIGZsYWdzKTtcbiAxOTA6XHRcbiAxOTE6XHRkb25lOlxuIDE5MjpcdFx0Y2ItXHUwMDNlYXJnc1swXSA9IG51bTtcbiAxOTM6XHRcbiAxOTQ6XHRcdHJldHVybiByZXQ7XG4gMTk1Olx0fVxuIDE5NjpcdFxuIDE5NzpcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKVxuIDE5ODpcdHtcbiAxOTk6XHRcdHN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7XG4gMjAwOlx0XHRpbnQgc19udW0gPSBjYi1cdTAwM2VhcmdzWzBdO1xuIDIwMTpcdFx0aW50IGVyciA9IDA7XG4gMjAyOlx0XG4gMjAzOlx0XHRyZXEgPSBubG1zZ19kYXRhKGNiLVx1MDAzZW5saCk7XG4gMjA0Olx0XG4gMjA1Olx0XHRpZiAocmVxLVx1MDAzZXNkaWFnX3Byb3RvY29sID09IE5ESUFHX1BST1RPX0FMTCkge1xuIDIwNjpcdFx0XHRpbnQgaTtcbiAyMDc6XHRcbiAyMDg6XHRcdFx0Zm9yIChpID0gY2ItXHUwMDNlYXJnc1sxXTsgaSBcdTAwM2MgTUFYX0xJTktTOyBpJiM0MzsmIzQzOykge1xuIDIwOTpcdFx0XHRcdGVyciA9IF9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgaSwgc19udW0pO1xuIDIxMDpcdFx0XHRcdGlmIChlcnIpXG4gMjExOlx0XHRcdFx0XHRicmVhaztcbiAyMTI6XHRcdFx0XHRzX251bSA9IDA7XG4gMjEzOlx0XHRcdH1cbiAyMTQ6XHRcdFx0Y2ItXHUwMDNlYXJnc1sxXSA9IGk7XG4gMjE1Olx0XHR9IGVsc2Uge1xuIDIxNjpcdFx0XHRpZiAocmVxLVx1MDAzZXNkaWFnX3Byb3RvY29sIFx1MDAzZT0gTUFYX0xJTktTKVxuIDIxNzpcdFx0XHRcdHJldHVybiAtRU5PRU5UO1xuIDIxODpcdFxuIDIxOTpcdFx0XHRlcnIgPSBfX25ldGxpbmtfZGlhZ19kdW1wKHNrYiwgY2IsIHJlcS1cdTAwM2VzZGlhZ19wcm90b2NvbCwgc19udW0pO1xuIDIyMDpcdFx0fVxuIDIyMTpcdFxuIDIyMjpcdFx0cmV0dXJuIGVyciBcdTAwM2M9IDAgPyBlcnIgOiBza2ItXHUwMDNlbGVuO1xuIDIyMzpcdH1cbiAyMjQ6XHRcbiAyMjU6XHRzdGF0aWMgaW50IG5ldGxpbmtfZGlhZ19kdW1wX2RvbmUoc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKVxuIDIyNjpcdHtcbiAyMjc6XHRcdHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKmh0aSA9ICh2b2lkICopY2ItXHUwMDNlYXJnc1syXTtcbiAyMjg6XHRcbiAyMjk6XHRcdGlmIChjYi1cdTAwM2VhcmdzWzBdID09IDEpXG4gMjMwOlx0XHRcdHJoYXNodGFibGVfd2Fsa19leGl0KGh0aSk7XG4gMjMxOlx0XG4gMjMyOlx0XHRrZnJlZShodGkpO1xuIDIzMzpcdFxuIDIzNDpcdFx0cmV0dXJuIDA7XG4gMjM1Olx0fVxuIDIzNjpcdFxuIDIzNzpcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2hhbmRsZXJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKmgpXG4gMjM4Olx0e1xuIDIzOTpcdFx0aW50IGhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy44LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDEzNzY4CgkJCQkJCQlvdXRwdXQ6IDE4NgoJCQkJCQkJdGhvdWdodHM6IDE0NzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHlzaXMgb2YgYSBDb25jdXJyZW5jeSBCdWcgRml4IGluIE5ldGxpbmsgTXVsdGljYXN0IEdyb3VwIE1hbmFnZW1lbnQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBzY2FuIGZsYWdnZWQgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWUgd2l0aGluIHRoZSBOZXRsaW5rIHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBtdWx0aWNhc3QgZ3JvdXAgbWFuYWdlbWVudC4gVGhlIGNvZGUgcmV2ZWFscyBhIHN1YnRsZSByYWNlIGNvbmRpdGlvbiByZWxhdGVkIHRvIHJlYWxsb2NhdGlvbiBvZiB0aGUgbXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgYXJyYXkuIEkgc2VlIHRoYXQgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgIGlzIHRoZSBrZXkgZnVuY3Rpb24gaGVyZSwgY2FsbGVkIGZyb20gYG5ldGxpbmtfYmluZGAgYW5kIGBuZXRsaW5rX3NldHNvY2tvcHRgIHdoZW4gZGVhbGluZyB3aXRoIG1lbWJlcnNoaXAgY2hhbmdlcyAoYWRkL2Ryb3ApLiBUaGlzIGZ1bmN0aW9uJiMzOTtzIHJvbGUgaW4gcmVhbGxvY2F0aW5nIHRoZSB1bmRlcmx5aW5nIGBubGstJmd0O2dyb3Vwc2Agc3RydWN0dXJlIHJhaXNlcyBteSBjb25jZXJuLgoKVGhlIHBhdGNoIGl0c2VsZiByZXBsYWNlcyB0aGUgcHJvYmxlbWF0aWMgYGtyZWFsbG9jYCBjYWxsIHdpdGggYSBzYWZlciBzZXF1ZW5jZTogYGt6YWxsb2NgLCBgbWVtY3B5YCwgbWVtb3J5IGJhcnJpZXJzIHVzaW5nIGBzbXBfc3RvcmVfcmVsZWFzZWAsIGFuZCBmaW5hbGx5LCBhIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAuIFRoaXMgaXMgYSBjbGFzc2ljIHBhdHRlcm4gZm9yIGFkZHJlc3NpbmcgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyByZWFkcyBpbiBhIGxvY2tsZXNzIG9yIFJDVS1wcm90ZWN0ZWQgY29udGV4dC4gVGhlIGNvbW1lbnRzIGNvbmZpcm0gbXkgc3VzcGljaW9uLCB0aGF0IGNvbmN1cnJlbnQgcmVhZGVycywgbGlrZSB0aG9zZSBpbiB0aGUgZGlhZ25vc3RpYyBkdW1wIChgc2tfZGlhZ19kdW1wX2dyb3Vwc2ApIG9yIGAvcHJvYy9uZXQvbmV0bGlua2AgcmVhZGVycyAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCksIGRvbiYjMzk7dCBob2xkIHRoZSBuZWNlc3NhcnkgbG9ja3MsIGNyZWF0aW5nIGEgd2luZG93IGZvciB0aGUgcmFjZSBjb25kaXRpb24uCgpJ4oCZbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBob3cgdGhlIGZpeCBhZmZlY3RzIGNvbmN1cnJlbnQgYWNjZXNzLiBTcGVjaWZpY2FsbHksIGBza19kaWFnX2R1bXBfZ3JvdXBzYCBub3cgdXNlcyBgc21wX2xvYWRfYWNxdWlyZWAgYW5kIGBSRUFEX09OQ0VgIHRvIGFjY2VzcyBgbmxrLSZndDtuZ3JvdXBzYCBhbmQgYG5say0mZ3Q7Z3JvdXBzYCwgcmVzcGVjdGl2ZWx5LCBhbmQgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBub3cgdXRpbGl6ZXMgYFJFQURfT05DRWAgb24gYG5say0mZ3Q7Z3JvdXBzYC4gVGhpcyBpcyB0ZXh0Ym9vayBSQ1Ugc3luY2hyb25pemF0aW9uIGNvbWJpbmVkIHdpdGggbWVtb3J5IG9yZGVyaW5nLCB3aGljaCBpbW1lZGlhdGVseSBmbGFncyB0aGlzIGFzIGEgY2FuZGlkYXRlIGZvciBjb25jdXJyZW5jeSBmdXp6aW5nIGFuZCBLQ1NBTi9LQVNBTi4KCkNydWNpYWxseSwgdGhpcyB2dWxuZXJhYmlsaXR5IGlzIHJlYWRpbHkgcmVhY2hhYmxlLiBBIHVzZXItc3BhY2UgcHJvZ3JhbSBjYW4gY3JlYXRlIGEgTmV0bGluayBzb2NrZXQsIGJpbmQgaXQsIGFkZCBvciBkcm9wIG11bHRpY2FzdCBtZW1iZXJzaGlwcyB1c2luZyBgc2V0c29ja29wdGAgKHdpdGggYE5FVExJTktfQUREX01FTUJFUlNISVBgIG9yIGBORVRMSU5LX0RST1BfTUVNQkVSU0hJUGApLCBhbmQgdGhlbiBwb3RlbnRpYWxseSB0cmlnZ2VyIHRoZSBkaWFnbm9zdGljIGR1bXAgdmlhIGBzZW5kdG8oTkVUTElOS19JTkVUX0RJQUcsIC4uLilgIG9yIHJlYWRpbmcgYC9wcm9jL25ldC9uZXRsaW5rYC4gQWxsIHN0YW5kYXJkIE5ldGxpbmsgc29ja2V0IG9wZXJhdGlvbnMuIFRoaXMgbG93IGJhcnJpZXIgb2YgZW50cnkgbWFrZXMgaXQgYW4gaWRlYWwgdGFyZ2V0IGZvciBmdXp6aW5nIGNhbXBhaWducy4KClRoZSB3b3J0aGluZXNzIGlzIHByZXR0eSBjbGVhci4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZywgbGV2ZXJhZ2VzIFJDVSBtZW1vcnkgbWFuYWdlbWVudCwgaXMgdXNlci1zcGFjZSBhY2Nlc3NpYmxlICh3aGljaCBpcyBhbHdheXMgYSBib251cyksIGFuZCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIHRvIGZ1enogdXNpbmcgc29tZXRoaW5nIGxpa2Ugc3l6a2FsbGVyLgoKTXkgZm9jdXMgc2hvdWxkIGJlIG9uIHRoZSBtb2RpZmllZCBmdW5jdGlvbnMgdGhlbXNlbHZlczogYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgLCBgc2tfZGlhZ19kdW1wX2dyb3Vwc2AsIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLiBUaGVzZSBhcmUgdGhlIHByZWNpc2UgbG9jYXRpb25zIG9mIHRoZSBidWcgZml4IGFuZCB0aGUgY29yZSBsb2dpYyBpbnZvbHZlZCBpbiB0aGUgcmFjZS4KClRoZSBpZGVudGlmaWVkIGZ1bmN0aW9ucyBhcmVuJiMzOTt0IGp1c3QgZ2VuZXJpYyBsaWZlY3ljbGUgb25lczsgdGhleSBhcmUgdGhlIHNwZWNpZmljIGZlYXR1cmUgbG9naWMgZnVuY3Rpb25zIGRpcmVjdGx5IGltcGxlbWVudGluZyB0aGUgYWx0ZXJlZCBjb2RlIHBhdGhzLCBhbmQgdGh1cywgcHJpbWUgZnV6emluZyB0YXJnZXRzLgoKRmluYWxseSwgdGhlIGJ1aWxkIHJlcXVpcmVtZW50cyBsb29rIHNpbXBsZTogYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AgaXMgY29yZSBhbmQgYWx3YXlzIGVuYWJsZWQuIGBuZXQvbmV0bGluay9kaWFnLmNgIG5lZWRzIGBDT05GSUdfTkVUTElOS19ESUFHYCwgYW5kIGAvcHJvYy9uZXQvbmV0bGlua2AgcmVxdWlyZXMgYENPTkZJR19QUk9DX0ZTYC4gVGhlIGRlcGVuZGVuY2llcyBhcmUgc3RyYWlnaHRmb3J3YXJkLiBBbGwgcmVsZXZhbnQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gbWFpbmxpbmUgYW5kIHNob3VsZCBiZSBlYXNpbHkgdGVzdGVkLgoKRXZlcnl0aGluZyBjaGVja3Mgb3V0LCBpdCYjMzk7cyB3b3J0aCBmdXp6aW5nIHdpdGggdGhvc2UgY29uZmlnIG9wdGlvbnMgYW5kIHRoZSBzcGVjaWZpYyBmb2N1cyBzeW1ib2xzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7TkVUTElOS19ESUFHJiMzNDssCiAgICAmIzM0O1BST0NfRlMmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzJiMzNDssCiAgICAmIzM0O3NrX2RpYWdfZHVtcF9ncm91cHMmIzM0OywKICAgICYjMzQ7bmV0bGlua19uYXRpdmVfc2VxX3Nob3cmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBsb2NrbGVzcyBSQ1Ugc3luY2hyb25pemF0aW9uIGZvciBOZXRsaW5rIHNvY2tldCBtdWx0aWNhc3QgZ3JvdXBzIChubGstXHUwMDNlZ3JvdXBzIGFuZCBubGstXHUwMDNlbmdyb3VwcykgYWNyb3NzIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc2tfZGlhZ19kdW1wX2dyb3VwcygpLCBhbmQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKS4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZyBjb25jdXJyZW5jeSBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsgc29ja2V0IGJpbmQvc2V0c29ja29wdCwgc29ja19kaWFnIGR1bXAsIGFuZCAvcHJvYy9uZXQvbmV0bGluayByZWFkcy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBkYXRhIHJhY2VzLCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzLCBvciBVQUZzLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtORVRMSU5LX0RJQUcmIzM0OywKICAgICYjMzQ7UFJPQ19GUyYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O25ldGxpbmtfcmVhbGxvY19ncm91cHMmIzM0OywKICAgICYjMzQ7c2tfZGlhZ19kdW1wX2dyb3VwcyYjMzQ7LAogICAgJiMzNDtuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzKSBhY3Jvc3MgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBza19kaWFnX2R1bXBfZ3JvdXBzKCksIGFuZCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nIGNvbmN1cnJlbmN5IGxvZ2ljIHJlYWNoYWJsZSBmcm9tIHVzZXJzcGFjZSB2aWEgbmV0bGluayBzb2NrZXQgYmluZC9zZXRzb2Nrb3B0LCBzb2NrX2RpYWcgZHVtcCwgYW5kIC9wcm9jL25ldC9uZXRsaW5rIHJlYWRzLiBGdXp6aW5nIGlzIHdhcnJhbnRlZCB0byBkZXRlY3QgcG90ZW50aWFsIGRhdGEgcmFjZXMsIG1lbW9yeSBvcmRlcmluZyBpc3N1ZXMsIG9yIFVBRnMuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjcvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjFtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZXNvbHZlcyBhIGNvbmN1cnJlbmN5IGJ1ZyB3aGVyZSBga3JlYWxsb2MoKWAgaW1tZWRpYXRlbHkgZnJlZWQgYG5say1cdTAwM2Vncm91cHNgIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgdW5kZXIgUkNVIChgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKWAgYW5kIGBza19kaWFnX2R1bXBfZ3JvdXBzKClgKSBjb3VsZCBhY2Nlc3MgaXQgY29uY3VycmVudGx5LCByaXNraW5nIHVzZS1hZnRlci1mcmVlIChVQUYpIGFuZCBvdXQtb2YtYm91bmRzIChPT0IpIHJlYWRzLiBUaGVzZSBtZW1vcnkgc2FmZXR5IGlzc3VlcyAoVUFGIGFuZCBPT0IgaGVhcCByZWFkcykgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiYjMzk7cyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBcblxuRnJvbSBhIEtNU0FOIHBlcnNwZWN0aXZlLCB0aGUgbmV3IGdyb3VwcyBidWZmZXIgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jKClgIHdoaWNoIHplcm9lcyB0aGUgZW50aXJlIGFsbG9jYXRpb24sIGZvbGxvd2VkIGJ5IGNvcHlpbmcgZXhpc3RpbmcgZ3JvdXAgZGF0YTsgdGh1cywgYWxsIGJ5dGVzIG9mIHRoZSBidWZmZXIgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBwdWJsaWNhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgc3RydWN0IHBhZGRpbmdzLCBvciB1bmluaXRpYWxpemVkIGRhdGEgbGVha3MgdG8gdXNlcnNwYWNlIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5CmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kCmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikKZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuCgpDUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjoKLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlCiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOCiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUAogIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuCi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsCiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLgoKUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTiwKTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy4KQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWQpzZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrcwp0aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLgoKTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3QKdW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsCmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5cwp0aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZwp1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2wKZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLApjYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy4KClNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczoKMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2IKICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHMKICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC4KMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlcwogICBvciBzdHJ1Y3QgZmllbGRzLgozLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzCiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuCjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzCiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy4KClNldCBOZWVkc0tNU0FOPWZhbHNlIElGOgotIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyCiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0CiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLgotIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkCiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLgotIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy4KClVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGUKZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC4KUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuCgoKVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy4KSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuCklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC4KPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Qcm9tcHQ6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5UYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NAoKRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKaW5kZXggZTZiMWQ5NzU4YzljOS4uOWZkZjk2NDIyNGFiNCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCiYjNDM7JiM0MzsmIzQzOyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYwpAQCAtOTIyLDkgJiM0Mzs5MjIsOSBAQCBuZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpCiAKIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiB7CiYjNDM7CXVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spOwogCXVuc2lnbmVkIGludCBncm91cHM7Ci0JdW5zaWduZWQgbG9uZyAqbmV3X2dyb3VwczsKIAlpbnQgZXJyID0gMDsKIAogCW5ldGxpbmtfdGFibGVfZ3JhYigpOwpAQCAtOTM4LDE4ICYjNDM7OTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spCiAJaWYgKG5say0mZ3Q7bmdyb3VwcyAmZ3Q7PSBncm91cHMpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCW5ld19ncm91cHMgPSBrcmVhbGxvYyhubGstJmd0O2dyb3VwcywgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTsKLQlpZiAobmV3X2dyb3VwcyA9PSBOVUxMKSB7CiYjNDM7CS8qIENhbiBub3QgdXNlIGtyZWFsbG9jKCksIGJlY2F1c2UgdGhlIG9sZCBidWZmZXIgbWlnaHQgYmUgZnJlZWQKJiM0MzsJICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZAomIzQzOwkgKiAvcHJvYy9uZXQvbmV0bGluaykgY2FuIHN0aWxsIGJlIGxvb2tpbmcgYXQgaXQuCiYjNDM7CSAqLwomIzQzOwluZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpOwomIzQzOwlpZiAoIW5ld19ncm91cHMpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQltZW1zZXQoKGNoYXIgKiluZXdfZ3JvdXBzICYjNDM7IE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwgMCwKLQkgICAgICAgTkxHUlBTWihncm91cHMpIC0gTkxHUlBTWihubGstJmd0O25ncm91cHMpKTsKJiM0MzsJb2xkX2dyb3VwcyA9IG5say0mZ3Q7Z3JvdXBzOwomIzQzOwlpZiAob2xkX2dyb3VwcykKJiM0MzsJCW1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say0mZ3Q7bmdyb3VwcykpOwomIzQzOwomIzQzOwkvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzcwomIzQzOwkgKiBkZXBlbmRlbmN5IGluIGxvY2tsZXNzIHJlYWRlcnMsIHdoaWNoIGNhbiBwaWNrIHVwIHRoZSBuZXcgcG9pbnRlcgomIzQzOwkgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLSZndDtuZ3JvdXBzLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O2dyb3VwcywgbmV3X2dyb3Vwcyk7CiYjNDM7CiYjNDM7CS8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb20KJiM0MzsJICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKQomIzQzOwkgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLgomIzQzOwkgKi8KJiM0MzsJc21wX3N0b3JlX3JlbGVhc2UoJmFtcDtubGstJmd0O25ncm91cHMsIGdyb3Vwcyk7CiAKLQlubGstJmd0O2dyb3VwcyA9IG5ld19ncm91cHM7Ci0JbmxrLSZndDtuZ3JvdXBzID0gZ3JvdXBzOwogIG91dF91bmxvY2s6CiAJbmV0bGlua190YWJsZV91bmdyYWIoKTsKJiM0MzsKJiM0MzsJaWYgKG9sZF9ncm91cHMpCiYjNDM7CQlrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKTsKJiM0MzsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzA1LDEyICYjNDM7MjcyNCwxOSBAQCBzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogCX0gZWxzZSB7CiAJCXN0cnVjdCBzb2NrICpzID0gdjsKIAkJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpOwomIzQzOwkJY29uc3QgdW5zaWduZWQgbG9uZyAqZ3JvdXBzOwomIzQzOwomIzQzOwkJLyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlCiYjNDM7CQkgKiBubGstJmd0O2dyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW4KJiM0MzsJCSAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC4KJiM0MzsJCSAqLwomIzQzOwkJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKIAogCQlzZXFfcHJpbnRmKHNlcSwgJiMzNDslcEsgJS0zZCAlLTEwdSAlMDh4ICUtOGQgJS04ZCAlLTVkICUtOGQgJS04dSAlLThsbHVcbiYjMzQ7LAogCQkJICAgcywKIAkJCSAgIHMtJmd0O3NrX3Byb3RvY29sLAogCQkJICAgbmxrLSZndDtwb3J0aWQsCi0JCQkgICBubGstJmd0O2dyb3VwcyA/ICh1MzIpbmxrLSZndDtncm91cHNbMF0gOiAwLAomIzQzOwkJCSAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCwKIAkJCSAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLAogCQkJICAgc2tfd21lbV9hbGxvY19nZXQocyksCiAJCQkgICBSRUFEX09OQ0UobmxrLSZndDtjYl9ydW5uaW5nKSwKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuYwppbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NAotLS0gYS9uZXQvbmV0bGluay9kaWFnLmMKJiM0MzsmIzQzOyYjNDM7IGIvbmV0L25ldGxpbmsvZGlhZy5jCkBAIC0xMiwxMiAmIzQzOzEyLDI0IEBACiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpCiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKLQotCWlmIChubGstJmd0O2dyb3VwcyA9PSBOVUxMKQomIzQzOwl1bnNpZ25lZCBsb25nICpncm91cHM7CiYjNDM7CXVuc2lnbmVkIGludCBuZ3JvdXBzOwomIzQzOwomIzQzOwkvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seQomIzQzOwkgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZQomIzQzOwkgKiBubGstJmd0O2dyb3VwcyBhbmQgbmxrLSZndDtuZ3JvdXBzIGF0IGFueSB0aW1lLgomIzQzOwkgKgomIzQzOwkgKiBSZWFkIG5say0mZ3Q7bmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpCiYjNDM7CSAqIGZyb20gbmV0bGlua19yZWFsbG9jX2dyb3VwcygpLCBzbyB0aGF0IHdlIGNhbiBub3QgdXNlIHRoZSBuZXcKJiM0MzsJICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXMKJiM0MzsJICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC4KJiM0MzsJICovCiYjNDM7CW5ncm91cHMgPSBzbXBfbG9hZF9hY3F1aXJlKCZhbXA7bmxrLSZndDtuZ3JvdXBzKTsKJiM0MzsJZ3JvdXBzID0gUkVBRF9PTkNFKG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJaWYgKCFncm91cHMpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLSZndDtuZ3JvdXBzKSwKLQkJICAgICAgIG5say0mZ3Q7Z3JvdXBzKTsKJiM0MzsJcmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7CiB9CiAKIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMzQyMQoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDExMzcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBOZXRsaW5rIEdyb3VwIFJlYWxsb2NhdGlvbiBQYXRjaCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgcGF0Y2ggbW9kaWZ5aW5nIGBuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNgIGFuZCBgbmV0L25ldGxpbmsvZGlhZy5jYC4gSSYjMzk7bSBzZWVpbmcgY2hhbmdlcyBpbiBob3cgTmV0bGluayBncm91cHMgYXJlIHJlYWxsb2NhdGVkLCB3aGljaCBhbHdheXMgd2FycmFudHMgYSBjbG9zZSBsb29rLgoKRmlyc3QsIGluIGBhZl9uZXRsaW5rLmNgIHdpdGhpbiBgbmV0bGlua19yZWFsbG9jX2dyb3Vwc2AsIHRoZSBhbGxvY2F0aW9uIHN0cmF0ZWd5IGhhcyBzaGlmdGVkLiBJbnN0ZWFkIG9mIGBrcmVhbGxvY2AsIHdlJiMzOTtyZSBub3cgdXNpbmcgYGt6YWxsb2NgLiBUaGF0JiMzOTtzIHNtYXJ0OyBga3phbGxvY2AgemVyb2VzIHRoZSBuZXcgbWVtb3J5LiBUaGVuLCBgbWVtY3B5YCBjb3BpZXMgdGhlIGV4aXN0aW5nIGdyb3VwIGluZm9ybWF0aW9uIGZyb20gdGhlIG9sZCBidWZmZXIgdG8gdGhlIHplcm9lZCBuZXcgYnVmZmVyLCBhbmQgdGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgdXNpbmcgUkNVIChga2ZyZWVfcmN1X21pZ2h0c2xlZXBgKS4gVGhpcyBpcyBhIHNvbGlkIGFwcHJvYWNoLCBndWFyYW50ZWVpbmcgYSBjbGVhbiBpbml0aWFsIHN0YXRlIGFuZCBsZXZlcmFnaW5nIFJDVSBmb3Igc2FmZSBkZWFsbG9jYXRpb24uIFRoaXMgcGF0dGVybiBpcyBmYWlybHkgY29tbW9uIG5vdywgYW5kIGF2b2lkcyBwb3RlbnRpYWxseSBleHBvc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KClRoZSBjb2RlIHRoZW4gdXNlcyBgc21wX3N0b3JlX3JlbGVhc2VgIGZvciBib3RoIGBubGstJmd0O2dyb3Vwc2AgYW5kIGBubGstJmd0O25ncm91cHNgLiBBbmQgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBqdXN0IHJlYWRzIGBncm91cHNbMF1gIHNhZmVseS4KCk5vdywgdGhlIGludGVyZXN0aW5nIHBhcnQgaXMgdGhlIGBza19kaWFnX2R1bXBfZ3JvdXBzYCBmdW5jdGlvbiBpbiBgbmV0L25ldGxpbmsvZGlhZy5jYC4gSXQgcmV0cmlldmVzIHRoZSBncm91cCBkYXRhIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLiBIZXJlLCBgbmdyb3Vwc2AgKHRoZSBudW1iZXIgb2YgZ3JvdXBzKSBpcyBsb2FkZWQgdXNpbmcgYHNtcF9sb2FkX2FjcXVpcmVgIGFuZCBgZ3JvdXBzYCAodGhlIGFjdHVhbCBncm91cCBhcnJheSkgaXMgcmVhZCB1c2luZyBgUkVBRF9PTkNFYC4gTXkgaW1tZWRpYXRlIGNvbmNlcm4gaXMgdGhlIGxvY2tsZXNzIGFjY2VzcyBhbmQgdGhlIG9yZGVyaW5nLgoKSSYjMzk7bSB0aGlua2luZzogQ291bGQgYG5ncm91cHNgIGFuZCBgZ3JvdXBzYCBiZSBtaXNtYXRjaGVkPyBMZXQmIzM5O3MgdHJhY2UgaXQuIFRoZSB3cml0ZXImIzM5O3Mgc2lkZSB1c2VzIGBzbXBfc3RvcmVfcmVsZWFzZWAgZm9yIGBncm91cHNgIGFuZCB0aGVuIGBuZ3JvdXBzYC4gQW5kIHRoZSByZWFkZXIgdXNlcyBgc21wX2xvYWRfYWNxdWlyZWAgZm9yIGBuZ3JvdXBzYCBhbmQgdGhlbiBgUkVBRF9PTkNFYCBmb3IgYGdyb3Vwc2AuCgpHaXZlbiB0aGF0IHdlIGFyZSB1c2luZyBhY3F1aXJlL3JlbGVhc2Ugc2VtYW50aWNzOiBpZiB0aGUgcmVhZGVyIHNlZXMgYSBuZXcgYG5ncm91cHNgLCBpdCBpcyAqZ3VhcmFudGVlZCogdG8gc2VlIHRoZSBjb3JyZXNwb25kaW5nIGBncm91cHNgIChvciBldmVuIGEgbmV3ZXIgdmVyc2lvbikuIElmIHRoZSByZWFkZXIgc2VlcyB0aGUgKm9sZCogYG5ncm91cHNgLCB0aGVuIGBncm91cHNgIGNvdWxkIGVpdGhlciBiZSB0aGUgYG9sZF9ncm91cHNgIG9yIHRoZSBgbmV3X2dyb3Vwc2AuIEJ1dCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZ3JvdXBzIGFycmF5IGhhcyBiZWVuIHJlYWxsb2NhdGVkLCB3ZSBhcmUgcmVhZGluZyBmcm9tIGBuZXdfZ3JvdXBzYCB1c2luZyB0aGUgc21hbGxlciBzaXplIGBOTEdSUFNaKG9sZF9uZ3JvdXBzKWAsIHNvIGl0JiMzOTtzIGd1YXJhbnRlZWQgdG8gYmUgd2l0aGluIGJvdW5kcy4gSWYgdGhlIHJlYWRlciBzZWVzIGBvbGRfZ3JvdXBzYCB0aGlzIGlzIGFsc28gdmFsaWQgYW5kIFJDVSBwcm90ZWN0ZWQuIFdlIGNhbiBlbnN1cmUgdGhlIGJhcnJpZXIgZW5zdXJlcyB0aGUgc2l6ZSByZWFkIGlzIHdpdGhpbiBib3VuZHMuIFRoaXMgbG9naWMgYXZvaWRzIGFueSBwb3NzaWJsZSBvdXQtb2YtYm91bmRzIHJlYWRzLgoKVGhlcmUgaXMgdGhlIGNhc2Ugb2YgaW5pdGlhbCBzdGF0ZSwgd2hlcmUgYGdyb3Vwc2Agc3RhcnRzIGFzIE5VTEwuIEkgd2lsbCBuZWVkIHRvIGNoZWNrIGhvdyBgbmxrLSZndDtncm91cHNgIGFuZCBgbmxrLSZndDtuZ3JvdXBzYCBhcmUgaW5pdGlhbGl6ZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzAvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25say1cdTAwM2Vncm91cHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0bGluay8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTcwND1zdGF0aWMgdm9pZCBkZWZlcnJlZF9wdXRfbmxrX3NrKHN0cnVjdCByY3VfaGVhZCAqaGVhZClcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzA4LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjcwOTpcdGtmcmVlKG5say1cdTAwM2Vncm91cHMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjcxMDpcdG5say1cdTAwM2Vncm91cHMgPSBOVUxMO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTcxMS1cbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NzE4PXN0YXRpYyBpbnQgbmV0bGlua19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTczNC1cdGlmIChubGstXHUwMDNlbmV0bGlua19yZWxlYXNlKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjczNTpcdFx0bmxrLVx1MDAzZW5ldGxpbmtfcmVsZWFzZShzaywgbmxrLVx1MDAzZWdyb3Vwcyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzM2LVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy03NDMtXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIG5say1cdTAwM2VuZ3JvdXBzOyBpJiM0MzsmIzQzOylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo3NDQ6XHRcdFx0aWYgKHRlc3RfYml0KGksIG5say1cdTAwM2Vncm91cHMpKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTc0NS1cdFx0XHRcdG5say1cdTAwM2VuZXRsaW5rX3VuYmluZChzb2NrX25ldChzayksIGkgJiM0MzsgMSk7XG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkyMz1zdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NDktXHR9XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6OTUwOlx0b2xkX2dyb3VwcyA9IG5say1cdTAwM2Vncm91cHM7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTUxLVx0aWYgKG9sZF9ncm91cHMpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1Ny1cdCAqL1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1ODpcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNm5say1cdTAwM2Vncm91cHMsIG5ld19ncm91cHMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1OS1cbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTg5PXN0YXRpYyBpbnQgbmV0bGlua19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICphZGRyLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDU3LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwNTg6XHRpZiAoIWdyb3VwcyBcdTAwMjZcdTAwMjYgKG5say1cdTAwM2Vncm91cHMgPT0gTlVMTCB8fCAhKHUzMilubGstXHUwMDNlZ3JvdXBzWzBdKSlcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDU5LVx0XHRnb3RvIHVubG9jaztcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTA2NC1cdFx0XHRcdFx0IGh3ZWlnaHQzMihncm91cHMpIC1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxMDY1Olx0XHRcdFx0XHQgaHdlaWdodDMyKG5say1cdTAwM2Vncm91cHNbMF0pKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxMDY2Olx0bmxrLVx1MDAzZWdyb3Vwc1swXSA9IChubGstXHUwMDNlZ3JvdXBzWzBdIFx1MDAyNiB+MHhmZmZmZmZmZlVMKSB8IGdyb3Vwcztcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDY3LVx0bmV0bGlua191cGRhdGVfbGlzdGVuZXJzKHNrKTtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTEyND1zdGF0aWMgaW50IG5ldGxpbmtfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTExNDEtXHRcdG5ldGxpbmtfbG9ja190YWJsZSgpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjExNDI6XHRcdG5sYWRkci1cdTAwM2VubF9ncm91cHMgPSBubGstXHUwMDNlZ3JvdXBzID8gbmxrLVx1MDAzZWdyb3Vwc1swXSA6IDA7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTE0My1cdFx0bmV0bGlua191bmxvY2tfdGFibGUoKTtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTQ0Mj1zdGF0aWMgdm9pZCBkb19vbmVfYnJvYWRjYXN0KHN0cnVjdCBzb2NrICpzayxcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTQ1MS1cdGlmIChubGstXHUwMDNlcG9ydGlkID09IHAtXHUwMDNlcG9ydGlkIHx8IHAtXHUwMDNlZ3JvdXAgLSAxIFx1MDAzZT0gbmxrLVx1MDAzZW5ncm91cHMgfHxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNDUyOlx0ICAgICF0ZXN0X2JpdChwLVx1MDAzZWdyb3VwIC0gMSwgbmxrLVx1MDAzZWdyb3VwcykpXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTQ1My1cdFx0cmV0dXJuO1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNTk0PXN0YXRpYyBpbnQgZG9fb25lX3NldF9lcnIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgKnApXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2MDUtXHRpZiAobmxrLVx1MDAzZXBvcnRpZCA9PSBwLVx1MDAzZXBvcnRpZCB8fCBwLVx1MDAzZWdyb3VwIC0gMSBcdTAwM2U9IG5say1cdTAwM2VuZ3JvdXBzIHx8XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTYwNjpcdCAgICAhdGVzdF9iaXQocC1cdTAwM2Vncm91cCAtIDEsIG5say1cdTAwM2Vncm91cHMpKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2MDctXHRcdGdvdG8gb3V0O1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjU0PXN0YXRpYyB2b2lkIG5ldGxpbmtfdXBkYXRlX3NvY2tldF9tYyhzdHJ1Y3QgbmV0bGlua19zb2NrICpubGssXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2NTktXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTY2MDpcdG9sZCA9IHRlc3RfYml0KGdyb3VwIC0gMSwgbmxrLVx1MDAzZWdyb3Vwcyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY2MS1cdHN1YnNjcmlwdGlvbnMgPSBubGstXHUwMDNlc3Vic2NyaXB0aW9ucyAtIG9sZCAmIzQzOyBuZXc7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTY2MjpcdF9fYXNzaWduX2JpdChncm91cCAtIDEsIG5say1cdTAwM2Vncm91cHMsIG5ldyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY2My1cdG5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoXHUwMDI2bmxrLVx1MDAzZXNrLCBzdWJzY3JpcHRpb25zKTtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTc0Mz1zdGF0aWMgaW50IG5ldGxpbmtfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNzc4LVx0XHRcdHNoaWZ0ID0gKHBvcyAlIHNpemVvZih1bnNpZ25lZCBsb25nKSkgKiA4O1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjE3Nzk6XHRcdFx0Z3JvdXAgPSAodTMyKShubGstXHUwMDNlZ3JvdXBzW2lkeF0gXHUwMDNlXHUwMDNlIHNoaWZ0KTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNzgwLVx0XHRcdGlmIChjb3B5X3RvX2l0ZXIoXHUwMDI2Z3JvdXAsIHNpemVvZih1MzIpLFxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzE4PXN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjktXHRcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3MzA6XHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjczMS1cdFx0ICogUkNVIGdyYWNlIHBlcmlvZCwgYW5kIHRoaXMgd2FsayBpcyBSQ1UgcHJvdGVjdGVkLlxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzItXHRcdCAqL1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3MzM6XHRcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzM0LVxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYz0xMj1zdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jLTE5LVx0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2Vcbm5ldC9uZXRsaW5rL2RpYWcuYzoyMDpcdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxubmV0L25ldGxpbmsvZGlhZy5jLTIxLVx0ICpcbi0tXG5uZXQvbmV0bGluay9kaWFnLmMtMjctXHRuZ3JvdXBzID0gc21wX2xvYWRfYWNxdWlyZShcdTAwMjZubGstXHUwMDNlbmdyb3Vwcyk7XG5uZXQvbmV0bGluay9kaWFnLmM6Mjg6XHRncm91cHMgPSBSRUFEX09OQ0UobmxrLVx1MDAzZWdyb3Vwcyk7XG5uZXQvbmV0bGluay9kaWFnLmMtMjktXHRpZiAoIWdyb3VwcylcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzE3MAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDExCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBoZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGEgc2Vhc29uZWQgcHJvZmVzc2lvbmFsIGluIHRoZSBmaWVsZCwgc3BlYWtpbmcgZGlyZWN0bHkgdG8gbXlzZWxmOgoKKipEaXZpbmcgaW50byBOZXRsaW5rIFNvY2tldCBDcmVhdGlvbioqCgpBbHJpZ2h0LCB0aW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaXNzZWN0IHRoZSBuZXRsaW5rIHNvY2tldCBjcmVhdGlvbiBwcm9jZXNzLiBJdCYjMzk7cyBiZWVuIGEgd2hpbGUgc2luY2UgSSBsYXN0IGR1ZyBpbnRvIHRoZSBsb3ctbGV2ZWwgZGV0YWlscywgYW5kIGEgcXVpY2sgcmUtZXhhbWluYXRpb24gbmV2ZXIgaHVydHMuIEkgd2FudCB0byBtYWtlIHN1cmUgSSBoYXZlIGEgc29saWQgZ3Jhc3Agb24gaG93IHRoZXNlIHNvY2tldHMgYXJlIGFjdHVhbGx5IGJyb3VnaHQgdG8gbGlmZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWwgc2V0dXAsIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBjYWxscywgYW5kIHRoZSB0eXBpY2FsIGZsb3cgb2YgZGF0YS4gV2hhdCBwYXJhbWV0ZXJzIGFyZSBpbnZvbHZlZD8gQXJlIHRoZXJlIGFueSBzdWJ0bGUgbnVhbmNlcyBvciBwb3RlbnRpYWwgcGl0ZmFsbHMgaW4gdGhlIHNldHVwIHRoYXQgSSBzaG91bGQgYmUgbWluZGZ1bCBvZiwgZnJvbSBhIHBlcmZvcm1hbmNlIG9yIHNlY3VyaXR5IHN0YW5kcG9pbnQ/IFRoZSBkZXZpbCYjMzk7cyBvZnRlbiBpbiB0aGUgZGV0YWlscywgc28gbGV0JiMzOTtzIHN0YXJ0IHdpdGggYSBzeXN0ZW1hdGljIGFwcHJvYWNoIGFuZCB3b3JrIG91ciB3YXkgdGhyb3VnaCBpdC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7TkxHUlBTWiYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTIzPXN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk0NC1cdCAqL1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk0NTpcdG5ld19ncm91cHMgPSBremFsbG9jKE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTQ2LVx0aWYgKCFuZXdfZ3JvdXBzKSB7XG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1MS1cdGlmIChvbGRfZ3JvdXBzKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1MjpcdFx0bWVtY3B5KG5ld19ncm91cHMsIG9sZF9ncm91cHMsIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NTMtXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk2MC1cdC8qIFRoZW4gcHVibGlzaCB0aGUgbmV3IHNpemU6IHBhaXJzIHdpdGggc21wX2xvYWRfYWNxdWlyZSgpIGZyb21cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NjE6XHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTYyLVx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjAyNj1fX25ldGxpbmtfa2VybmVsX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIGludCB1bml0LCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIwNTItXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjA1MzpcdGxpc3RlbmVycyA9IGt6YWxsb2Moc2l6ZW9mKCpsaXN0ZW5lcnMpICYjNDM7IE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjA1NC1cdGlmICghbGlzdGVuZXJzKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMTA3PWludCBfX25ldGxpbmtfY2hhbmdlX25ncm91cHMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgZ3JvdXBzKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTE0LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMTU6XHRpZiAoTkxHUlBTWih0YmwtXHUwMDNlZ3JvdXBzKSBcdTAwM2MgTkxHUlBTWihncm91cHMpKSB7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjExNjpcdFx0bmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldykgJiM0MzsgTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTE3LVx0XHRpZiAoIW5ldylcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjExOS1cdFx0b2xkID0gbmxfZGVyZWZfcHJvdGVjdGVkKHRibC1cdTAwM2VsaXN0ZW5lcnMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMjA6XHRcdG1lbWNweShuZXctXHUwMDNlbWFza3MsIG9sZC1cdTAwM2VtYXNrcywgTkxHUlBTWih0YmwtXHUwMDNlZ3JvdXBzKSk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjEyMS1cdFx0cmN1X2Fzc2lnbl9wb2ludGVyKHRibC1cdTAwM2VsaXN0ZW5lcnMsIG5ldyk7XG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI4Nzc9c3RhdGljIHZvaWQgX19pbml0IG5ldGxpbmtfYWRkX3VzZXJzb2NrX2VudHJ5KHZvaWQpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4ODEtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Mjg4MjpcdGxpc3RlbmVycyA9IGt6YWxsb2Moc2l6ZW9mKCpsaXN0ZW5lcnMpICYjNDM7IE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7XG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjg4My1cdGlmICghbGlzdGVuZXJzKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuaD0xMD1lbnVtIHtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmgtMjAtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmg6MjE6I2RlZmluZSBOTEdSUFNaKHgpXHQoQUxJR04oeCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgLyA4KVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oOjIyOiNkZWZpbmUgTkxHUlBMT05HUyh4KVx0KE5MR1JQU1ooeCkvc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oLTIzLVxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYz0xMj1zdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jLTMxLVxubmV0L25ldGxpbmsvZGlhZy5jOjMyOlx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XG5uZXQvbmV0bGluay9kaWFnLmMtMzMtfVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMzLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA4NDUyCgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogMjUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgYSBzdW1tYXJ5IG9mIG15IGltbWVkaWF0ZSB0aG91Z2h0IHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIE5ldGxpbmsgR3JvdXAgTWFuYWdlbWVudCoqCgpPa2F5LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IGhvdyBOZXRsaW5rIGdyb3VwIG1lbWJlcnNoaXAgaXMgaGFuZGxlZCB3aGVuIGEgc29ja2V0IGlzIGZpcnN0IGNyZWF0ZWQuIE15IGluc3RpbmN0IGlzIHRvIHplcm8gaW4gb24gYG5ldGxpbmtfY3JlYXRlYCBhbmQgdGhlIHNvY2tldCBhbGxvY2F0aW9uIGl0c2VsZi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8ga25vdyB0aGUgKmluaXRpYWwqIHN0YXRlIG9mIGBubGstJmd0O2dyb3Vwc2AgaW4gdGhhdCBmcmVzaGx5IG1pbnRlZCBzb2NrZXQuIFRoYXQmIzM5O3MgdGhlIGtleSBzdGFydGluZyBwb2ludCB0byB1bmRlcnN0YW5kIGhvdyBncm91cHMgYXJlIGFkZGVkIGFuZCByZW1vdmVkIGxhdGVyLiBJJiMzOTtsbCBuZWVkIHRvIHRyYWNlIHRoZSBjb2RlIGluIGBuZXRsaW5rX2NyZWF0ZWAgYW5kIHRoZSByZWxhdGVkIHNvY2tldCBpbml0aWFsaXphdGlvbiByb3V0aW5lcywgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZ3JvdXBzIGFyZSBpbml0aWFsaXplZCwgd2hhdCB0aGUgZGVmYXVsdCBpcywgaWYgdGhlcmUgaXMgYSBkZWZhdWx0IGF0IGFsbCwgYW5kIHBlcmhhcHMgd2hldGhlciB0aGlzIGlzIGEgc3RhdGljIG9yIGR5bmFtaWMgYWxsb2NhdGlvbi4gSSBleHBlY3QgdGhlcmUgdG8gYmUgYXQgbGVhc3Qgc29tZSByZWxldmFudCBpbml0aWFsaXphdGlvbiBpbiB0aGlzIHNwYWNlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM0LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtuZXRsaW5rX2NyZWF0ZSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O25ldC9uZXRsaW5rLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NjEzPXN0YXRpYyBzdHJ1Y3QgcHJvdG8gbmV0bGlua19wcm90byA9IHtcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjE4LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjYxOTpzdGF0aWMgaW50IF9fbmV0bGlua19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTYyMC1cdFx0XHQgICAgaW50IHByb3RvY29sLCBpbnQga2Vybilcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjQ0LVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjY0NTpzdGF0aWMgaW50IG5ldGxpbmtfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTY0Ni1cdFx0XHQgIGludCBrZXJuKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02ODQtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Njg1Olx0ZXJyID0gX19uZXRsaW5rX2NyZWF0ZShuZXQsIHNvY2ssIHByb3RvY29sLCBrZXJuKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02ODYtXHRpZiAoZXJyIFx1MDAzYyAwKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMDI2PV9fbmV0bGlua19rZXJuZWxfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgaW50IHVuaXQsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSxcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjA0Mi1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyMDQzOlx0aWYgKF9fbmV0bGlua19jcmVhdGUobmV0LCBzb2NrLCB1bml0LCAxKSBcdTAwM2MgMClcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMDQ0LVx0XHRnb3RvIG91dF9zb2NrX3JlbGVhc2Vfbm9zaztcbi0tXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjg1ND1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgbmV0bGlua19mYW1pbHlfb3BzID0ge1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NTUtXHQuZmFtaWx5ID0gUEZfTkVUTElOSyxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODU2Olx0LmNyZWF0ZSA9IG5ldGxpbmtfY3JlYXRlLFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4NTctXHQub3duZXJcdD0gVEhJU19NT0RVTEUsXHQvKiBmb3IgY29uc2lzdGVuY3kgOCkgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogOTIwNQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDI1CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHJlYWRpbmcgYW5kIHRoaW5raW5nIGFib3V0IHRoZSBjb2RlOgoKKipEaXZpbmcgaW50byBgX19uZXRsaW5rX2NyZWF0ZWAqKgoKQWxyaWdodCwgbGV0JiMzOTtzIGdldCBkb3duIHRvIGl0LiBUaW1lIHRvIGRpc3NlY3QgYF9fbmV0bGlua19jcmVhdGVgIGluIGBuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNgLiBJJiMzOTttIGN1cmlvdXMgdG8gc2VlIGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGluaXRpYWwgY3JlYXRpb24gb2YgYSBOZXRsaW5rIHNvY2tldC4gV2UmIzM5O3JlIHRhbGtpbmcgYWJvdXQgdGhlIGxvdy1sZXZlbCBzdHVmZiBoZXJlLCBzZXR0aW5nIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgdGhlIE5ldGxpbmsgY29tbXVuaWNhdGlvbiB0aGF0JiMzOTtzIGdvaW5nIHRvIGhhcHBlbi4gSSBleHBlY3QgdG8gc2VlIHRoZSBrZXJuZWwgY29uZmlndXJpbmcgdGhlIHNvY2tldCYjMzk7cyBiYXNpYyBzdHJ1Y3R1cmUsIGFsbG9jYXRpbmcgbWVtb3J5LCBhbmQgcHJvYmFibHkgc2V0dGluZyB1cCBzb21lIGluaXRpYWwgc3RhdGUgb3IgcXVldWVzLiBLbm93aW5nIHRoZSBpbnRlcm5hbHMgaGVyZSBpcyBjcml0aWNhbCB0byB1bmRlcnN0YW5kaW5nIGhvdyBtb3JlIGFkdmFuY2VkIHNvY2tldCBmdW5jdGlvbmFsaXRpZXMgYXJlIGltcGxlbWVudGVkIGxhdGVyIG9uIGluIHRoZSBOZXRsaW5rIHN1YnN5c3RlbS4gSG9wZWZ1bGx5LCBJJiMzOTtsbCBzZWUgc29tZSBvYnZpb3VzIGNvbm5lY3Rpb24gdG8gdGhlIE5ldGxpbmsgZmFtaWx5IHN0cnVjdHVyZXMgYW5kIGFkZHJlc3MgZmFtaWxpZXMsIGFzIHdlbGwuIExldCYjMzk7cyBzZWUgaWYgdGhpcyBjb2RlIGNvbmZpcm1zIHdoYXQgSSBhbHJlYWR5IGtub3cgYWJvdXQgbmV0bGluaywgb3IgYWRkcyBzb21lIHdyaW5rbGVzIHRvIG15IG1lbnRhbCBtb2RlbC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zNi8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA2MTgsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDYxODpcdFxuIDYxOTpcdHN0YXRpYyBpbnQgX19uZXRsaW5rX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssXG4gNjIwOlx0XHRcdFx0ICAgIGludCBwcm90b2NvbCwgaW50IGtlcm4pXG4gNjIxOlx0e1xuIDYyMjpcdFx0c3RydWN0IHNvY2sgKnNrO1xuIDYyMzpcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrO1xuIDYyNDpcdFxuIDYyNTpcdFx0c29jay1cdTAwM2VvcHMgPSBcdTAwMjZuZXRsaW5rX29wcztcbiA2MjY6XHRcbiA2Mjc6XHRcdHNrID0gc2tfYWxsb2MobmV0LCBQRl9ORVRMSU5LLCBHRlBfS0VSTkVMLCBcdTAwMjZuZXRsaW5rX3Byb3RvLCBrZXJuKTtcbiA2Mjg6XHRcdGlmICghc2spXG4gNjI5Olx0XHRcdHJldHVybiAtRU5PTUVNO1xuIDYzMDpcdFxuIDYzMTpcdFx0c29ja19pbml0X2RhdGEoc29jaywgc2spO1xuIDYzMjpcdFxuIDYzMzpcdFx0bmxrID0gbmxrX3NrKHNrKTtcbiA2MzQ6XHRcdG11dGV4X2luaXQoXHUwMDI2bmxrLVx1MDAzZW5sX2NiX211dGV4KTtcbiA2MzU6XHRcdGxvY2tkZXBfc2V0X2NsYXNzX2FuZF9uYW1lKFx1MDAyNm5say1cdTAwM2VubF9jYl9tdXRleCxcbiA2MzY6XHRcdFx0XHRcdFx0ICAgbmxrX2NiX211dGV4X2tleXMgJiM0MzsgcHJvdG9jb2wsXG4gNjM3Olx0XHRcdFx0XHRcdCAgIG5sa19jYl9tdXRleF9rZXlfc3RyaW5nc1twcm90b2NvbF0pO1xuIDYzODpcdFx0aW5pdF93YWl0cXVldWVfaGVhZChcdTAwMjZubGstXHUwMDNld2FpdCk7XG4gNjM5Olx0XG4gNjQwOlx0XHRzay1cdTAwM2Vza19kZXN0cnVjdCA9IG5ldGxpbmtfc29ja19kZXN0cnVjdDtcbiA2NDE6XHRcdHNrLVx1MDAzZXNrX3Byb3RvY29sID0gcHJvdG9jb2w7XG4gNjQyOlx0XHRyZXR1cm4gMDtcbiA2NDM6XHR9XG4gNjQ0Olx0XG4gNjQ1Olx0c3RhdGljIGludCBuZXRsaW5rX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCxcbiA2NDY6XHRcdFx0XHQgIGludCBrZXJuKVxuIDY0NzpcdHtcbiA2NDg6XHRcdHN0cnVjdCBtb2R1bGUgKm1vZHVsZSA9IE5VTEw7XG4gNjQ5Olx0XHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7XG4gNjUwOlx0XHRpbnQgKCpiaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XG4gNjUxOlx0XHR2b2lkICgqdW5iaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XG4gNjUyOlx0XHR2b2lkICgqcmVsZWFzZSkoc3RydWN0IHNvY2sgKnNvY2ssIHVuc2lnbmVkIGxvbmcgKmdyb3Vwcyk7XG4gNjUzOlx0XHRpbnQgZXJyID0gMDtcbiA2NTQ6XHRcbiA2NTU6XHRcdHNvY2stXHUwMDNlc3RhdGUgPSBTU19VTkNPTk5FQ1RFRDtcbiA2NTY6XHRcbiA2NTc6XHRcdGlmIChzb2NrLVx1MDAzZXR5cGUgIT0gU09DS19SQVcgXHUwMDI2XHUwMDI2IHNvY2stXHUwMDNldHlwZSAhPSBTT0NLX0RHUkFNKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDA5MAoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDgyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBOZXRsaW5rIEdyb3VwIEFsbG9jYXRpb24qKgoKT2theSwgc28gYHNrX2FsbG9jYCBkb2VzIGl0cyB0aGluZyBhbmQgemVyb3Mgb3V0IHRoZSBlbnRpcmUgc29ja2V0IHN0cnVjdHVyZS4gVGhhdCBpbmNsdWRlcyB0aGUgYG5ldGxpbmtfc29ja2AgcGFydCwgd2hpY2ggbWVhbnMgYG5say0mZ3Q7Z3JvdXBzYCBzdGFydHMgYXMgTlVMTCBhbmQgYG5say0mZ3Q7bmdyb3Vwc2AgaXMsIG5hdHVyYWxseSwgemVyby4gR29vZC4gVGhhdCYjMzk7cyBhIGNsZWFuIHNsYXRlLgoKTm93LCB0aGUgaW50ZXJlc3RpbmcgcGFydDogaG93IGRvIHdlIGFsbG9jYXRlIHRob3NlIE5ldGxpbmsgZ3JvdXBzPyBMZXQmIzM5O3MgdHJhY2UgaXQgdGhyb3VnaC4gV2hlcmUgZG9lcyBgbmV0bGlua19yZWFsbG9jX2dyb3Vwc2AgZ2V0IGNhbGxlZCBmcm9tPyBUaW1lIHRvIGdvIGh1bnRpbmcgZm9yIHRoZSBjYWxsIHNpdGVzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGVuIGFuZCB3aHkgdGhlIGtlcm5lbCBkZWNpZGVzIHRvIGV4cGFuZCB0aGUgZ3JvdXAgbGlzdC4gVGhpcyBpcyBhIGNyaXRpY2FsIHBvaW50IHRvIHBpbnBvaW50IHRoZSBiZWhhdmlvciBzdXJyb3VuZGluZyBncm91cCBtZW1iZXJzaGlwIGNoYW5nZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O25ldGxpbmtfcmVhbGxvY19ncm91cHMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtuZXQvbmV0bGluay8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkxMj1uZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTkyMi1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5MjM6c3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjQte1xuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz05ODk9c3RhdGljIGludCBuZXRsaW5rX2JpbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyX3Vuc2l6ZWQgKmFkZHIsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwMTAtXHRcdFx0cmV0dXJuIC1FUEVSTTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxMDExOlx0XHRlcnIgPSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHNrKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEyLVx0XHRpZiAoZXJyKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjY3PXN0YXRpYyBpbnQgbmV0bGlua19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2OTEtXHRcdFx0cmV0dXJuIC1FUEVSTTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjkyOlx0XHRlcnIgPSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHNrKTtcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkzLVx0XHRpZiAoZXJyKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yNzE4PXN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjgtXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjcyOTpcdFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjczMC1cdFx0ICogbmxrLVx1MDAzZWdyb3VwcyB1bmRlciB1cy4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgYWZ0ZXIgYW5cbi0tXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuLS1cbm5ldC9uZXRsaW5rL2RpYWcuYy0xOC1cdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XG5uZXQvbmV0bGluay9kaWFnLmM6MTk6XHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxubmV0L25ldGxpbmsvZGlhZy5jLTIwLVx0ICogbmxrLVx1MDAzZWdyb3VwcyBhbmQgbmxrLVx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXG4tLVxubmV0L25ldGxpbmsvZGlhZy5jLTIyLVx0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG5uZXQvbmV0bGluay9kaWFnLmM6MjM6XHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XG5uZXQvbmV0bGluay9kaWFnLmMtMjQtXHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM5LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTA4OQoJCQkJCQkJb3V0cHV0OiAzOQoJCQkJCQkJdGhvdWdodHM6IDE2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYC4gSSBuZWVkIHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24sIGl0cyBwdXJwb3NlLCBhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiBpdHMgb3BlcmF0aW9uIHdpdGhpbiB0aGUgYnJvYWRlciBuZXRsaW5rIGZyYW1ld29yay4gSSYjMzk7bSBnb2luZyB0byBicmVhayBpdCBkb3duLCBwaWVjZSBieSBwaWVjZSwgY29uc2lkZXJpbmcgdGhlIHBvc3NpYmxlIGVkZ2UgY2FzZXMgYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCBvdGhlciBuZXRsaW5rIGNvbXBvbmVudHMuIEkmIzM5O2xsIG5lZWQgdG8gdGhpbmsgYWJvdXQgbWVtb3J5IG1hbmFnZW1lbnQsIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMsIGFuZCBlcnJvciBoYW5kbGluZyDigJMgZXZlcnl0aGluZyB0aGF0IGNvdWxkIGdvIHdyb25nIG9yIHRoYXQgbmVlZHMgdG8gYmUgcHJvcGVybHkgaGFuZGxlZCBmb3Igcm9idXN0IGJlaGF2aW9yLiBJJiMzOTtsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIGV4ZWN1dGlvbiBmbG93LCB0cmFjaW5nIHRoZSBkYXRhJiMzOTtzIHBhdGggYW5kIHdoYXQgdGhlIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBwcm90ZWN0aW5nIGFuZCBlbnN1cmluZy4gSSYjMzk7bGwgZm9jdXMgcGFydGljdWxhcmx5IG9uIGhvdyBpdCBoYW5kbGVzIGdyb3VwIG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaW4gZHluYW1pYyBlbnZpcm9ubWVudHMsIGFuZCBob3cgaXQgZGVhbHMgd2l0aCBmYWlsdXJlcyBhbmQgcmVzb3VyY2UgZXhoYXVzdGlvbi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaXRzIGltcGFjdCBvbiBuZXRsaW5rJiMzOTtzIHJlbGlhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZS4gVGhpcyBpc24mIzM5O3QganVzdCBhYm91dCByZWFkaW5nIHRoZSBjb2RlOyBpdCYjMzk7cyBhYm91dCBidWlsZGluZyBhIHNvbGlkIG1lbnRhbCBtb2RlbCBvZiBpdHMgYmVoYXZpb3Igd2l0aGluIHRoZSBiaWdnZXIgcGljdHVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40MC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtuZXQvbmV0bGluay9hZl9uZXRsaW5rLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA5MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDkyMDpcdFx0bmxrLVx1MDAzZXN1YnNjcmlwdGlvbnMgPSBzdWJzY3JpcHRpb25zO1xuIDkyMTpcdH1cbiA5MjI6XHRcbiA5MjM6XHRzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIDkyNDpcdHtcbiA5MjU6XHRcdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDtcbiA5MjY6XHRcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gOTI3Olx0XHR1bnNpZ25lZCBpbnQgZ3JvdXBzO1xuIDkyODpcdFx0aW50IGVyciA9IDA7XG4gOTI5Olx0XG4gOTMwOlx0XHRuZXRsaW5rX3RhYmxlX2dyYWIoKTtcbiA5MzE6XHRcbiA5MzI6XHRcdGdyb3VwcyA9IG5sX3RhYmxlW3NrLVx1MDAzZXNrX3Byb3RvY29sXS5ncm91cHM7XG4gOTMzOlx0XHRpZiAoIW5sX3RhYmxlW3NrLVx1MDAzZXNrX3Byb3RvY29sXS5yZWdpc3RlcmVkKSB7XG4gOTM0Olx0XHRcdGVyciA9IC1FTk9FTlQ7XG4gOTM1Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA5MzY6XHRcdH1cbiA5Mzc6XHRcbiA5Mzg6XHRcdGlmIChubGstXHUwMDNlbmdyb3VwcyBcdTAwM2U9IGdyb3VwcylcbiA5Mzk6XHRcdFx0Z290byBvdXRfdW5sb2NrO1xuIDk0MDpcdFxuIDk0MTpcdFx0LyogQ2FuIG5vdCB1c2Uga3JlYWxsb2MoKSwgYmVjYXVzZSB0aGUgb2xkIGJ1ZmZlciBtaWdodCBiZSBmcmVlZFxuIDk0MjpcdFx0ICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZFxuIDk0MzpcdFx0ICogL3Byb2MvbmV0L25ldGxpbmspIGNhbiBzdGlsbCBiZSBsb29raW5nIGF0IGl0LlxuIDk0NDpcdFx0ICovXG4gOTQ1Olx0XHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuIDk0NjpcdFx0aWYgKCFuZXdfZ3JvdXBzKSB7XG4gOTQ3Olx0XHRcdGVyciA9IC1FTk9NRU07XG4gOTQ4Olx0XHRcdGdvdG8gb3V0X3VubG9jaztcbiA5NDk6XHRcdH1cbiA5NTA6XHRcdG9sZF9ncm91cHMgPSBubGstXHUwMDNlZ3JvdXBzO1xuIDk1MTpcdFx0aWYgKG9sZF9ncm91cHMpXG4gOTUyOlx0XHRcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4gOTUzOlx0XG4gOTU0Olx0XHQvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzc1xuIDk1NTpcdFx0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcbiA5NTY6XHRcdCAqIHdoaWxlIHN0aWxsIHNlZWluZyB0aGUgb2xkIChzbWFsbGVyKSBubGstXHUwMDNlbmdyb3Vwcy5cbiA5NTc6XHRcdCAqL1xuIDk1ODpcdFx0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XG4gOTU5Olx0XG4gOTYwOlx0XHQvKiBUaGVuIHB1Ymxpc2ggdGhlIG5ldyBzaXplOiBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tXG4gOTYxOlx0XHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG4gOTYyOlx0XHQgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLlxuIDk2MzpcdFx0ICovXG4gOTY0Olx0XHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZubGstXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcbiA5NjU6XHRcbiA5NjY6XHQgb3V0X3VubG9jazpcbiA5Njc6XHRcdG5ldGxpbmtfdGFibGVfdW5ncmFiKCk7XG4gOTY4Olx0XG4gOTY5Olx0XHRpZiAob2xkX2dyb3VwcylcbiA5NzA6XHRcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX2dyb3Vwcyk7XG4gOTcxOlx0XG4gOTcyOlx0XHRyZXR1cm4gZXJyO1xuIDk3MzpcdH1cbiA5NzQ6XHRcbiA5NzU6XHRzdGF0aWMgdm9pZCBuZXRsaW5rX3VuZG9fYmluZChpbnQgZ3JvdXAsIGxvbmcgdW5zaWduZWQgaW50IGdyb3VwcyxcbiA5NzY6XHRcdFx0XHQgICAgICBzdHJ1Y3Qgc29jayAqc2spXG4gOTc3Olx0e1xuIDk3ODpcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcbiA5Nzk6XHRcdGludCB1bmRvO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAxNzozMTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuOC1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMjIyMAoJCQkJCQkJb3V0cHV0OiAyMwoJCQkJCQkJdGhvdWdodHM6IDE5MwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgS2VybmVsIE1lbW9yeSBEZWFsbG9jYXRpb24gd2l0aCBSQ1UqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzIGBrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKWAgY2FsbC4gRmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgdG8gY29uZmlybSB0aGUgdHlwZSBvZiBgb2xkX2dyb3Vwc2AuIElzIGl0IGFuIGB1bnNpZ25lZCBsb25nICpgIGFzIEkgc3VzcGVjdD8gVGhpcyBpcyBjcnVjaWFsIHRvIHVuZGVyc3RhbmRpbmcgdGhlIGludGVuZGVkIGJlaGF2aW9yLgoKTm93LCBob3cgZG9lcyB0aGlzIGZ1bmN0aW9uLCBga2ZyZWVfcmN1X21pZ2h0c2xlZXBgLCBhY3R1YWxseSBvcGVyYXRlIHdpdGhpbiB0aGUga2VybmVsPyBJIG5lZWQgdG8gcmVmcmVzaCBteSB1bmRlcnN0YW5kaW5nLiBEb2VzIGl0IG1hbmRhdGUgdGhlIHByZXNlbmNlIG9mIGFuIGByY3VfaGVhZGAgc3RydWN0dXJlLCBvciBjYW4gaXQgaGFuZGxlIGEgYGttYWxsb2NgIGFsbG9jYXRlZCBwb2ludGVyIGRpcmVjdGx5PyBUaGVyZSYjMzk7cyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGRpZmZlcmVuY2UgaGVyZS4KCkFoLCB0aGF0JiMzOTtzIHJpZ2h0LiBJdCYjMzk7cyBhIGtleSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGBrZnJlZV9yY3UocHRyLCByY3VfaGVhZClgIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKWAuIEluIG1vZGVybiBrZXJuZWwgdmVyc2lvbnMsIHNwZWNpZmljYWxseSB0aG9zZSBpbiB0aGUgNS54IGFuZCA2Lnggc2VyaWVzLCB0aGUgc2luZ2xlLWFyZ3VtZW50IHZlcnNpb25zIGxpa2UgYGt2ZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGFuZCBhbHNvIGBrZnJlZV9yY3UocHRyKWAgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlLiBUaGVzZSB3b3JrIHBlcmZlY3RseSB3aXRoIHBvaW50ZXJzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2NgLCB3aXRob3V0IG5lZWRpbmcgYW4gZXhwbGljaXQgb2Zmc2V0IG9yIGByY3VfaGVhZGAgc3RydWN0dXJlLiBUaGF0JiMzOTtzIGEgc2lnbmlmaWNhbnQgYWR2YW5jZW1lbnQgaW4gdGhlIFJDVSBtZW1vcnkgbWFuYWdlbWVudCBBUEkuCgpUbyBnZXQgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaXRzIHByYWN0aWNhbCB1c2FnZSwgSSYjMzk7bGwgcGVyZm9ybSBhIHF1aWNrIGBncmVwYCBzZWFyY2ggZm9yIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIGNvZGUuIFNlZWluZyBpdCBpbiBjb250ZXh0IHdpbGwgcHJvdmlkZSB2YWx1YWJsZSBjbHVlcyBhYm91dCBpdHMgaW50ZW5kZWQgcHVycG9zZSBhbmQgdXNhZ2UgcGF0dGVybnMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2tmcmVlX3JjdV9taWdodHNsZWVwJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q9NjIwPWJlIHVzZWQsIG9taXR0aW5nIHRoZSByY3VfaGVhZCBzdHJ1Y3R1cmUgZnJvbSBzdHJ1Y3QgZm9vLlxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC02MjEtXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0OjYyMjpcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9mcCk7XG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0LTYyMy1cbi0tXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0PTEwNzY9UkNVOjpcbi0tXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0LTEwODctXHRyY3VfcmVhZF9sb2NrX2hlbGRcdFx0a3ZmcmVlX3JjdVxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdDoxMDg4Olx0cmN1X3JlYWRfbG9ja19hbnlfaGVsZFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC0xMDg5LVx0cmN1X3BvaW50ZXJfaGFuZG9mZlx0XHRjb25kX3N5bmNocm9uaXplX3JjdVxuLS1cbmJsb2NrL2Jsay1tcS5jPTQ1Mzk9c3RhdGljIHZvaWQgX19ibGtfbXFfcmVhbGxvY19od19jdHhzKHN0cnVjdCBibGtfbXFfdGFnX3NldCAqc2V0LFxuLS1cbmJsb2NrL2Jsay1tcS5jLTQ1NjAtXHRcdCAqL1xuYmxvY2svYmxrLW1xLmM6NDU2MTpcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaGN0eHMpO1xuYmxvY2svYmxrLW1xLmMtNDU2Mi1cdFx0aGN0eHMgPSBuZXdfaGN0eHM7XG4tLVxuYmxvY2svYmxrLXpvbmVkLmM9MTk2Nj1zdGF0aWMgdm9pZCBkaXNrX3NldF96b25lc19jb25kX2FycmF5KHN0cnVjdCBnZW5kaXNrICpkaXNrLCB1OCAqem9uZXNfY29uZClcbi0tXG5ibG9jay9ibGstem9uZWQuYy0xOTc0LVxuYmxvY2svYmxrLXpvbmVkLmM6MTk3NTpcdGtmcmVlX3JjdV9taWdodHNsZWVwKHpvbmVzX2NvbmQpO1xuYmxvY2svYmxrLXpvbmVkLmMtMTk3Ni19XG4tLVxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmM9MTE4PXN0YXRpYyB2b2lkIGVycm9yX2luamVjdF9yZW1vdmVhbGwoc3RydWN0IGdlbmRpc2sgKmRpc2spXG4tLVxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmMtMTI3LVx0XHRsaXN0X2RlbF9yY3UoXHUwMDI2aW5qLVx1MDAzZWVudHJ5KTtcbmJsb2NrL2Vycm9yLWluamVjdGlvbi5jOjEyODpcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaW5qKTtcbmJsb2NrL2Vycm9yLWluamVjdGlvbi5jLTEyOS1cdH1cbi0tXG5kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV92ZXJicy5jPTEzOTg9c3RhdGljIGludCByeGVfZGVyZWdfbXIoc3RydWN0IGliX21yICppYm1yLCBzdHJ1Y3QgaWJfdWRhdGEgKnVkYXRhKVxuLS1cbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmMtMTQxMy1cbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmM6MTQxNDpcdGtmcmVlX3JjdV9taWdodHNsZWVwKG1yKTtcbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmMtMTQxNS1cdHJldHVybiAwO1xuLS1cbmRyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUuYz0xNDc3PXN0YXRpYyB2b2lkIHJpc2N2X2lvbW11X3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldilcbi0tXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4MC1cbmRyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUuYzoxNDgxOlx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaW5mbyk7XG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4Mi19XG4tLVxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuL3RjL2ludF9wb3J0LmM9MjI3PW1seDVlX2ludF9wb3J0X3JlbW92ZShzdHJ1Y3QgbWx4NWVfdGNfaW50X3BvcnRfcHJpdiAqcHJpdixcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW4vdGMvaW50X3BvcnQuYy0yNDQtXHRtbHg1ZV9pbnRfcG9ydF9tZXRhZGF0YV9mcmVlKHByaXYsIGludF9wb3J0LVx1MDAzZW1hdGNoX21ldGFkYXRhKTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi90Yy9pbnRfcG9ydC5jOjI0NTpcdGtmcmVlX3JjdV9taWdodHNsZWVwKGludF9wb3J0KTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi90Yy9pbnRfcG9ydC5jLTI0Ni1cdHByaXYtXHUwMDNlbnVtX3BvcnRzLS07XG4tLVxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jPTYzOT1zdGF0aWMgaW50IG1seDVlX21hY3NlY19kZWxfdHhzYShzdHJ1Y3QgbWFjc2VjX2NvbnRleHQgKmN0eClcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY1LVx0bWx4NV9kZXN0cm95X2VuY3J5cHRpb25fa2V5KG1hY3NlYy1cdTAwM2VtZGV2LCB0eF9zYS1cdTAwM2VlbmNfa2V5X2lkKTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9hY2NlbC9tYWNzZWMuYzo2NjY6XHRrZnJlZV9yY3VfbWlnaHRzbGVlcCh0eF9zYSk7XG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY3LVx0bWFjc2VjX2RldmljZS1cdTAwM2V0eF9zYVthc3NvY19udW1dID0gTlVMTDtcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmM9ODE1PXN0YXRpYyB2b2lkIG1hY3NlY19kZWxfcnhzY19jdHgoc3RydWN0IG1seDVlX21hY3NlYyAqbWFjc2VjLCBzdHJ1Y3QgbWx4NWVfbWFjc2VjX3J4X3NjICpyeF9zYyxcbi0tXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtODQyLVx0a2ZyZWUocnhfc2MtXHUwMDNlc2NfeGFycmF5X2VsZW1lbnQpO1xuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jOjg0MzpcdGtmcmVlX3JjdV9taWdodHNsZWVwKHJ4X3NjKTtcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9hY2NlbC9tYWNzZWMuYy04NDQtfVxuLS1cbmZzL2J0cmZzL3ZvbHVtZXMuYz03NTk9c3RhdGljIG5vaW5saW5lIHN0cnVjdCBidHJmc19kZXZpY2UgKmRldmljZV9saXN0X2FkZChjb25zdCBjaGFyICpwYXRoLFxuLS1cbmZzL2J0cmZzL3ZvbHVtZXMuYy05NTUtXHRcdHJjdV9hc3NpZ25fcG9pbnRlcihkZXZpY2UtXHUwMDNlbmFtZSwgbmFtZSk7XG5mcy9idHJmcy92b2x1bWVzLmM6OTU2Olx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfbmFtZSk7XG5mcy9idHJmcy92b2x1bWVzLmMtOTU3LVxuLS1cbmZzL2V4dDQvc3VwZXIuYz0yNTgyPXN0YXRpYyB2b2lkIGV4dDRfYXBwbHlfcXVvdGFfb3B0aW9ucyhzdHJ1Y3QgZnNfY29udGV4dCAqZmMsXG4tLVxuZnMvZXh0NC9zdXBlci5jLTI2MDYtXHRcdFx0aWYgKHFuYW1lKVxuZnMvZXh0NC9zdXBlci5jOjI2MDc6XHRcdFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChxbmFtZSk7XG5mcy9leHQ0L3N1cGVyLmMtMjYwOC1cdFx0fVxuLS1cbmZzL2tlcm5mcy9kaXIuYz0xODE5PWludCBrZXJuZnNfcmVuYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIHN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCxcbi0tXG5mcy9rZXJuZnMvZGlyLmMtMTg5Ny1cdGlmIChuZXdfbmFtZSBcdTAwMjZcdTAwMjYgIWlzX2tlcm5lbF9yb2RhdGEoKHVuc2lnbmVkIGxvbmcpb2xkX25hbWUpKVxuZnMva2VybmZzL2Rpci5jOjE4OTg6XHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9uYW1lKTtcbmZzL2tlcm5mcy9kaXIuYy0xODk5LVxuLS1cbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmM9MTU0PXhmc19ncm91cF9mcmVlKFxuLS1cbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmMtMTc2LVx0WEZTX0lTX0NPUlJVUFQobXAsIGF0b21pY19yZWFkKFx1MDAyNnhnLVx1MDAzZXhnX2FjdGl2ZV9yZWYpIFx1MDAzYyAwKTtcbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmM6MTc3Olx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoeGcpO1xuZnMveGZzL2xpYnhmcy94ZnNfZ3JvdXAuYy0xNzgtfVxuLS1cbmZzL3hmcy94ZnNfaGVhbHRobW9uLmM9ODY9eGZzX2hlYWx0aG1vbl9wdXQoXG4tLVxuZnMveGZzL3hmc19oZWFsdGhtb24uYy0xMDEtXHRcdG11dGV4X2Rlc3Ryb3koXHUwMDI2aG0tXHUwMDNlbG9jayk7XG5mcy94ZnMveGZzX2hlYWx0aG1vbi5jOjEwMjpcdFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaG0pO1xuZnMveGZzL3hmc19oZWFsdGhtb24uYy0xMDMtXHR9XG4tLVxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oPTk5ND1zdGF0aWMgaW5saW5lIHZvaWQgcmN1X3JlYWRfdW5sb2NrX21pZ3JhdGUodm9pZClcbi0tXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA4Ny0vKipcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMDg4OiAqIGtmcmVlX3JjdV9taWdodHNsZWVwKCkgLSBrZnJlZSBhbiBvYmplY3QgYWZ0ZXIgYSBncmFjZSBwZXJpb2QuXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA4OS0gKiBAcHRyOiBwb2ludGVyIHRvIGtmcmVlIGZvciBzaW5nbGUtYXJndW1lbnQgaW52b2NhdGlvbnMuXG4tLVxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTEwOTQtICpcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMDk1OiAqICAgICBrZnJlZV9yY3VfbWlnaHRzbGVlcChwdHIpO1xuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTEwOTYtICpcbi0tXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTEwMy0gKi9cbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMTA0OiNkZWZpbmUga2ZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKSBrdmZyZWVfcmN1X2FyZ18xKHB0cilcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaC0xMTA1LSNkZWZpbmUga3ZmcmVlX3JjdV9taWdodHNsZWVwKHB0cikga3ZmcmVlX3JjdV9hcmdfMShwdHIpXG4tLVxua2VybmVsL3JjdS9yY3VzY2FsZS5jPTc1OD1rZnJlZV9zY2FsZV90aHJlYWQodm9pZCAqYXJnKVxuLS1cbmtlcm5lbC9yY3UvcmN1c2NhbGUuYy04MDQtXHRcdFx0XHRcdChrZnJlZV9yY3VfdGVzdF9ib3RoIFx1MDAyNlx1MDAyNiB0b3J0dXJlX3JhbmRvbShcdTAwMjZ0cikgXHUwMDI2IDB4ODAwKSlcbmtlcm5lbC9yY3UvcmN1c2NhbGUuYzo4MDU6XHRcdFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChhbGxvY19wdHIpO1xua2VybmVsL3JjdS9yY3VzY2FsZS5jLTgwNi1cdFx0XHRlbHNlXG4tLVxubmV0L2Nhbi9ndy5jPTEwNzc9c3RhdGljIGludCBjZ3dfY3JlYXRlX2pvYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgc3RydWN0IG5sbXNnaGRyICpubGgsXG4tLVxubmV0L2Nhbi9ndy5jLTExMjctXHRcdFx0cmN1X2Fzc2lnbl9wb2ludGVyKGd3ai1cdTAwM2VjZl9tb2QsIG1vZCk7XG5uZXQvY2FuL2d3LmM6MTEyODpcdFx0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfY2YpO1xubmV0L2Nhbi9ndy5jLTExMjktXHRcdFx0cmV0dXJuIDA7XG4tLVxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jPTMxNT1pbnQgbXB0Y3BfcG1fbmxfcmVtb3ZlX2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcbi0tXG5uZXQvbXB0Y3AvcG1fdXNlcnNwYWNlLmMtMzU3LVxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jOjM1ODpcdGtmcmVlX3JjdV9taWdodHNsZWVwKG1hdGNoKTtcbm5ldC9tcHRjcC9wbV91c2Vyc3BhY2UuYy0zNTktXHQvKiBBZGp1c3Qgc2tfb21lbV9hbGxvYyBsaWtlIHNvY2tfa2ZyZWVfcygpIGRvZXMsIHRvIG1hdGNoXG4tLVxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkyMz1zdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuLS1cbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NjktXHRpZiAob2xkX2dyb3Vwcylcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NzA6XHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk3MS1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD40My8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMTc6MzE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjgtZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1NjcKCQkJCQkJCW91dHB1dDogMjA3CgkJCQkJCQl0aG91Z2h0czogMTkzMQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLTVNBTiBBc3Nlc3NtZW50OiBUaGlzIFBhdGNoIERvZXNuJiMzOTt0IE5lZWQgSXQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgaWYgdGhpcyBwYXRjaCBuZWNlc3NpdGF0ZXMgYSBLTVNBTiBydW4uIEZyb20gdGhlIHByb3ZpZGVkIGluZm9ybWF0aW9uLCB0aGUgcGF0Y2ggcHJpbWFyaWx5IGFkZHJlc3NlcyBjb25jdXJyZW5jeSBpc3N1ZXMgaW4gaG93IG5ldGxpbmsgZ3JvdXAgYml0bWFwcyBhcmUgcmVhbGxvY2F0ZWQgYW5kIGFjY2Vzc2VkLiBTcGVjaWZpY2FsbHksIHRoZSBvcmlnaW5hbCB1c2Ugb2YgYGtyZWFsbG9jYCBwcmVzZW50ZWQgYSBwb3RlbnRpYWwgVXNlLUFmdGVyLUZyZWUgKFVBRikgc2l0dWF0aW9uIGZvciBsb2NrbGVzcyBSQ1UgcmVhZGVycy4gQWRkaXRpb25hbGx5LCB3aXRob3V0IG1lbW9yeSBiYXJyaWVycywgdGhlcmUgd2FzIGEgcmlzayBvZiBPdXQtb2YtQm91bmRzIChPT0IpIHJlYWRzIGR1ZSB0byBpbmNvbnNpc3RlbnQgdmlld3Mgb2YgYnVmZmVyIHNpemVzLgoKVGhlIGNvcmUgb2YgdGhlIGZpeCBpbnZvbHZlcyByZXBsYWNpbmcgYGtyZWFsbG9jYCB3aXRoIGEgYGt6YWxsb2NgLWJhc2VkIGFwcHJvYWNoLiBUaGlzIG1lYW5zIHRoZSBuZXcgYnVmZmVyLCBgbmV3X2dyb3Vwc2AsIGlzIGd1YXJhbnRlZWQgdG8gYmUgemVyby1pbml0aWFsaXplZC4gVGhlIHByZXZpb3VzIGNvbnRlbnRzIGFyZSB0aGVuIGNvcGllZCBpbi4gVGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgdmlhIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAuIE1lbW9yeSBiYXJyaWVycyBhcmUgdXNlZCB0byBlbnN1cmUgcmVhZGVycyBzZWUgY29uc2lzdGVudCBzdGF0ZS4KCk5vdywgY29uc2lkZXJpbmcgdGhlIEtNU0FOIGd1aWRlbGluZXMsIHRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgZXhwb3NlcyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gTGV0JiMzOTtzIGFuYWx5emUgZWFjaCBjb21wb25lbnQ6CgoxLiAgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgOiBUaGUgY3JpdGljYWwgY2hhbmdlIGhlcmUgaXMgYGt6YWxsb2NgLiBUaGlzIGd1YXJhbnRlZXMgYSBmdWxseSBpbml0aWFsaXplZCBidWZmZXIsIGVsaW1pbmF0aW5nIHRoZSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBFdmVuIHRoZSBwcmV2aW91cyBga3JlYWxsb2NgICYjNDM7IGBtZW1zZXRgIGFwcHJvYWNoLCB3aGlsZSBsZXNzIGVsZWdhbnQsIHdhcyBzdGlsbCBmdWxseSBpbml0aWFsaXppbmcgdGhlIG1lbW9yeS4gVGhlIGNvcHkgZnJvbSBgb2xkX2dyb3Vwc2AgaXMgYWxzbyBzYWZlIGJlY2F1c2UgdGhhdCBtZW1vcnkgd2FzIGVpdGhlciBpbml0aWFsaXplZCBmcm9tIGBremFsbG9jYCBvciBzb21lIGVxdWl2YWxlbnQgYXQgc29tZSB0aW1lIGluIHRoZSBwYXN0LgoKMi4gIGBza19kaWFnX2R1bXBfZ3JvdXBzYDogVGhpcyBmdW5jdGlvbiBub3cgY29ycmVjdGx5IGxvYWRzIGBuZ3JvdXBzYCBhbmQgYGdyb3Vwc2AuICBUaGUgYGdyb3Vwc2AgYnVmZmVyIGhlcmUsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCYjMzk7cyB0aGUgb2xkIG9yIHRoZSBuZXcgb25lLCBpcyBhbHdheXMgc291cmNlZCBmcm9tIGBremFsbG9jYCAob3Iga2VybmVsLWludGVybmFsIGluaXQpLCBndWFyYW50ZWVpbmcgaW5pdGlhbGl6YXRpb24uIEV2ZW4gaWYgdGhlIGNvZGUgd2VyZSBmbGF3ZWQgYW5kIGFuIG91dC1vZi1ib3VuZHMgcmVhZCBvY2N1cnJlZCwgdGhhdCYjMzk7cyBhIEtBU0FOIGlzc3VlLiBUaGUgbWVtb3J5IGJhcnJpZXJzIHByZXZlbnQgdGhlIE9PQi4KCjMuICBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgOiBUaGlzIHJlYWRzIGZyb20gYFJFQURfT05DRShubGstJmd0O2dyb3VwcylgLiBTaW5jZSB0aGUgYnVmZmVyIHRoYXQgYG5say0mZ3Q7Z3JvdXBzYCBwb2ludHMgdG8gaXMgYWx3YXlzIGFsbG9jYXRlZCB2aWEgYGt6YWxsb2NgLCB0aGlzIHJlYWQgaXMgYWxzbyBzYWZlLgoKNC4gIFRoZSBmdW5kYW1lbnRhbCBpc3N1ZSB0aGlzIHBhdGNoIHJlc29sdmVzOiBUaGUgb3JpZ2luYWwgcHJvYmxlbSBvZiBVQUYgYW5kIE9PQiBhcmlzZXMgZnJvbSBjb25jdXJyZW50IGFjY2VzcyBhbmQgaW1wcm9wZXIgbWVtb3J5IGJhcnJpZXJzIHdpdGggYGtyZWFsbG9jYC4gVGhlc2UgYXJlIGJ1Z3MgdGhhdCBLQVNBTiBleGNlbHMgYXQgZGV0ZWN0aW5nLiBUaGUgbmV3IGFwcHJvYWNoIHJlc29sdmVzIHRoaXMgYnkgZW5zdXJpbmcgYSBjb25zaXN0ZW50LCBpbml0aWFsaXplZCB2aWV3IG9mIHRoZSBtZW1vcnksIGFuZCBwcm9wZXJseSBzeW5jaHJvbml6aW5nLgoKVGhlcmVmb3JlLCB0aGlzIHBhdGNoIGRvZXNuJiMzOTt0IGNyZWF0ZSAqYW55KiBuZXcgcmlza3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiB0byAqYXZvaWQqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBObyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBhcmUgcmVhZCwgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzIGFyZSBpbnZvbHZlZCwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHNlbnQgdG8gdXNlcnNwYWNlLiBUaGUgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBVQUYgYW5kIE9PQiwgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4uCgpUaGUgS01TQU4gZ3VpZGVsaW5lcyBhcmUgY2xlYXI6IGlmIEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzIGNhdGNoIHRoZSBwcm9ibGVtLCB0aGVyZSYjMzk7cyBubyBuZWVkIGZvciBhIHJlc291cmNlLWludGVuc2l2ZSBLTVNBTiBydW4uIFRoaXMgcGF0Y2ggZmFsbHMgc3F1YXJlbHkgaW50byB0aGF0IGNhdGVnb3J5LiBIZW5jZSwgYE5lZWRzS01TQU4gPSBmYWxzZWAuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NDQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDE3OjMyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc29sdmVzIGEgY29uY3VycmVuY3kgYnVnIHdoZXJlIGBrcmVhbGxvYygpYCBpbW1lZGlhdGVseSBmcmVlZCBgbmxrLVx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJiMzOTtzIGRldGVjdGlvbiBjYXBhYmlsaXRpZXMuIFxuXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlc29sdmVzIGEgY29uY3VycmVuY3kgYnVnIHdoZXJlIGBrcmVhbGxvYygpYCBpbW1lZGlhdGVseSBmcmVlZCBgbmxrLVx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJiMzOTtzIGRldGVjdGlvbiBjYXBhYmlsaXRpZXMuIFxuXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjg6NTAuNDQ4NzQ5MTk3WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTk4MjM4MTIxOTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIk5FVExJTktfRElBR1wiLFxuICAgIFwiUFJPQ19GU1wiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcIm5ldGxpbmtfcmVhbGxvY19ncm91cHNcIixcbiAgICBcInNrX2RpYWdfZHVtcF9ncm91cHNcIixcbiAgICBcIm5ldGxpbmtfbmF0aXZlX3NlcV9zaG93XCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXNvbHZlcyBhIGNvbmN1cnJlbmN5IGJ1ZyB3aGVyZSBga3JlYWxsb2MoKWAgaW1tZWRpYXRlbHkgZnJlZWQgYG5say1cXHUwMDNlZ3JvdXBzYCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIHVuZGVyIFJDVSAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYCkgY291bGQgYWNjZXNzIGl0IGNvbmN1cnJlbnRseSwgcmlza2luZyB1c2UtYWZ0ZXItZnJlZSAoVUFGKSBhbmQgb3V0LW9mLWJvdW5kcyAoT09CKSByZWFkcy4gVGhlc2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgKFVBRiBhbmQgT09CIGhlYXAgcmVhZHMpIGZhbGwgc3RyaWN0bHkgdW5kZXIgS0FTQU4ncyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBcXG5cXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMpIGFjcm9zcyBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNrX2RpYWdfZHVtcF9ncm91cHMoKSwgYW5kIG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KCkuIFRoaXMgdG91Y2hlcyBjb3JlIG5ldHdvcmtpbmcgY29uY3VycmVuY3kgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBuZXRsaW5rIHNvY2tldCBiaW5kL3NldHNvY2tvcHQsIHNvY2tfZGlhZyBkdW1wLCBhbmQgL3Byb2MvbmV0L25ldGxpbmsgcmVhZHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGRldGVjdCBwb3RlbnRpYWwgZGF0YSByYWNlcywgbWVtb3J5IG9yZGVyaW5nIGlzc3Vlcywgb3IgVUFGcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjg6NTAuNDQ4NzU0MjU3WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDY3MjU4MzMzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgNDk1MDVmY2FiMDg0NTMzYTRhY2ExZWUwNTU5MGMxZTU4YjkzN2NhMlxcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNzoyODo0OCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcXG5pbmRleCBlNmIxZDk3NThjOWM5Li45ZmRmOTY0MjI0YWI0IDEwMDY0NFxcbi0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xcbisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xcbkBAIC05MjIsOSArOTIyLDkgQEAgbmV0bGlua191cGRhdGVfc3Vic2NyaXB0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBzdWJzY3JpcHRpb25zKVxcbiBcXG4gc3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcXG4ge1xcbitcXHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XFxuIFxcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XFxuIFxcdHVuc2lnbmVkIGludCBncm91cHM7XFxuLVxcdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHM7XFxuIFxcdGludCBlcnIgPSAwO1xcbiBcXG4gXFx0bmV0bGlua190YWJsZV9ncmFiKCk7XFxuQEAgLTkzOCwxOCArOTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXFxuIFxcdGlmIChubGstXFx1MDAzZW5ncm91cHMgXFx1MDAzZT0gZ3JvdXBzKVxcbiBcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIFxcbi1cXHRuZXdfZ3JvdXBzID0ga3JlYWxsb2MobmxrLVxcdTAwM2Vncm91cHMsIE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XFxuLVxcdGlmIChuZXdfZ3JvdXBzID09IE5VTEwpIHtcXG4rXFx0LyogQ2FuIG5vdCB1c2Uga3JlYWxsb2MoKSwgYmVjYXVzZSB0aGUgb2xkIGJ1ZmZlciBtaWdodCBiZSBmcmVlZFxcbitcXHQgKiBpbW1lZGlhdGVseSwgd2hpbGUgbG9ja2xlc3MgcmVhZGVycyAobmV0bGluayBkaWFnIGR1bXAgYW5kXFxuK1xcdCAqIC9wcm9jL25ldC9uZXRsaW5rKSBjYW4gc3RpbGwgYmUgbG9va2luZyBhdCBpdC5cXG4rXFx0ICovXFxuK1xcdG5ld19ncm91cHMgPSBremFsbG9jKE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XFxuK1xcdGlmICghbmV3X2dyb3Vwcykge1xcbiBcXHRcXHRlcnIgPSAtRU5PTUVNO1xcbiBcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIFxcdH1cXG4tXFx0bWVtc2V0KChjaGFyICopbmV3X2dyb3VwcyArIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSwgMCxcXG4tXFx0ICAgICAgIE5MR1JQU1ooZ3JvdXBzKSAtIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSk7XFxuK1xcdG9sZF9ncm91cHMgPSBubGstXFx1MDAzZWdyb3VwcztcXG4rXFx0aWYgKG9sZF9ncm91cHMpXFxuK1xcdFxcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cXHUwMDNlbmdyb3VwcykpO1xcbitcXG4rXFx0LyogUHVibGlzaCB0aGUgbmV3IGJpdG1hcCBhbmQgaXRzIGNvbnRlbnQ6IHBhaXJzIHdpdGggdGhlIGFkZHJlc3NcXG4rXFx0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcXG4rXFx0ICogd2hpbGUgc3RpbGwgc2VlaW5nIHRoZSBvbGQgKHNtYWxsZXIpIG5say1cXHUwMDNlbmdyb3Vwcy5cXG4rXFx0ICovXFxuK1xcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZubGstXFx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XFxuK1xcbitcXHQvKiBUaGVuIHB1Ymxpc2ggdGhlIG5ldyBzaXplOiBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tXFxuK1xcdCAqIGxvY2tsZXNzIHJlYWRlcnMsIHNvIHRoYXQgdGhleSBjYW4gbm90IHJlYWQgTkxHUlBTWihuZXcgbmdyb3VwcylcXG4rXFx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cXG4rXFx0ICovXFxuK1xcdHNtcF9zdG9yZV9yZWxlYXNlKFxcdTAwMjZubGstXFx1MDAzZW5ncm91cHMsIGdyb3Vwcyk7XFxuIFxcbi1cXHRubGstXFx1MDAzZWdyb3VwcyA9IG5ld19ncm91cHM7XFxuLVxcdG5say1cXHUwMDNlbmdyb3VwcyA9IGdyb3VwcztcXG4gIG91dF91bmxvY2s6XFxuIFxcdG5ldGxpbmtfdGFibGVfdW5ncmFiKCk7XFxuK1xcbitcXHRpZiAob2xkX2dyb3VwcylcXG4rXFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX2dyb3Vwcyk7XFxuK1xcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuIFxcbkBAIC0yNzA1LDEyICsyNzI0LDE5IEBAIHN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuIFxcdH0gZWxzZSB7XFxuIFxcdFxcdHN0cnVjdCBzb2NrICpzID0gdjtcXG4gXFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpO1xcbitcXHRcXHRjb25zdCB1bnNpZ25lZCBsb25nICpncm91cHM7XFxuK1xcbitcXHRcXHQvKiBMb2NrbGVzcyByZWFkIDogbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiBjaGFuZ2VcXG4rXFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuK1xcdFxcdCAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC5cXG4rXFx0XFx0ICovXFxuK1xcdFxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxuIFxcbiBcXHRcXHRzZXFfcHJpbnRmKHNlcSwgXFxcIiVwSyAlLTNkICUtMTB1ICUwOHggJS04ZCAlLThkICUtNWQgJS04ZCAlLTh1ICUtOGxsdVxcXFxuXFxcIixcXG4gXFx0XFx0XFx0ICAgcyxcXG4gXFx0XFx0XFx0ICAgcy1cXHUwMDNlc2tfcHJvdG9jb2wsXFxuIFxcdFxcdFxcdCAgIG5say1cXHUwMDNlcG9ydGlkLFxcbi1cXHRcXHRcXHQgICBubGstXFx1MDAzZWdyb3VwcyA/ICh1MzIpbmxrLVxcdTAwM2Vncm91cHNbMF0gOiAwLFxcbitcXHRcXHRcXHQgICBncm91cHMgPyAodTMyKWdyb3Vwc1swXSA6IDAsXFxuIFxcdFxcdFxcdCAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLFxcbiBcXHRcXHRcXHQgICBza193bWVtX2FsbG9jX2dldChzKSxcXG4gXFx0XFx0XFx0ICAgUkVBRF9PTkNFKG5say1cXHUwMDNlY2JfcnVubmluZyksXFxuZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuY1xcbmluZGV4IDBiM2UwMjFiZDBlZDIuLjc5NzliZDliMjYwNjAgMTAwNjQ0XFxuLS0tIGEvbmV0L25ldGxpbmsvZGlhZy5jXFxuKysrIGIvbmV0L25ldGxpbmsvZGlhZy5jXFxuQEAgLTEyLDEyICsxMiwyNCBAQFxcbiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXFxuIHtcXG4gXFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcXG4tXFxuLVxcdGlmIChubGstXFx1MDAzZWdyb3VwcyA9PSBOVUxMKVxcbitcXHR1bnNpZ25lZCBsb25nICpncm91cHM7XFxuK1xcdHVuc2lnbmVkIGludCBuZ3JvdXBzO1xcbitcXG4rXFx0LyogSGFzaGVkIHNvY2tldHMgYXJlIGR1bXBlZCBmcm9tIHRoZSByaGFzaHRhYmxlIHdhbGssIHdoaWNoIG9ubHlcXG4rXFx0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2VcXG4rXFx0ICogbmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcyBhdCBhbnkgdGltZS5cXG4rXFx0ICpcXG4rXFx0ICogUmVhZCBubGstXFx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxcbitcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxuK1xcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXFxuK1xcdCAqIGZyZWVkIGFmdGVyIGFuIFJDVSBncmFjZSBwZXJpb2QuXFxuK1xcdCAqL1xcbitcXHRuZ3JvdXBzID0gc21wX2xvYWRfYWNxdWlyZShcXHUwMDI2bmxrLVxcdTAwM2VuZ3JvdXBzKTtcXG4rXFx0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cXHUwMDNlZ3JvdXBzKTtcXG4rXFx0aWYgKCFncm91cHMpXFxuIFxcdFxcdHJldHVybiAwO1xcbiBcXG4tXFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSxcXG4tXFx0XFx0ICAgICAgIG5say1cXHUwMDNlZ3JvdXBzKTtcXG4rXFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XFxuIH1cXG4gXFxuIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyODo1MS45MTY2MTk3MzlaIiwiU2VxIjoyLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjExMDQyMTA5MTQ0MSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJORVRMSU5LX0RJQUdcIixcbiAgICBcIlBST0NfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzXCIsXG4gICAgXCJza19kaWFnX2R1bXBfZ3JvdXBzXCIsXG4gICAgXCJuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgbG9ja2xlc3MgUkNVIHN5bmNocm9uaXphdGlvbiBmb3IgTmV0bGluayBzb2NrZXQgbXVsdGljYXN0IGdyb3VwcyAobmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcykgYWNyb3NzIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc2tfZGlhZ19kdW1wX2dyb3VwcygpLCBhbmQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKS4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZyBjb25jdXJyZW5jeSBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsgc29ja2V0IGJpbmQvc2V0c29ja29wdCwgc29ja19kaWFnIGR1bXAsIGFuZCAvcHJvYy9uZXQvbmV0bGluayByZWFkcy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBkYXRhIHJhY2VzLCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzLCBvciBVQUZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuXG5Zb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzXG50b29scyB0byBpbnNwZWN0IHRoZSBhY3R1YWwgc291cmNlIGNvZGUsIGNhbGxlcnMsIGFuZCBzdXJyb3VuZGluZyBjb250ZXh0LlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMS4gQ09SRSBUUklBR0UgUEhJTE9TT1BIWVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsXG5hbmQgbmV3bHkgdHJpZ2dlcmVkIGFzc2VydGlvbnMgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggc2VyaWVzLlxuXG4tIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOlxuICBGdXp6aW5nIGNhbiBvbmx5IGRpc2NvdmVyIGJ1Z3MgaW4gY29kZSB0aGF0IGNhbiBhY3R1YWxseSBleGVjdXRlIGluIHN0YW5kYXJkIHZpcnR1YWxpemVkXG4gIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuXG4gIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCxcbiAgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGFkZHMgYXNzZXJ0aW9ucyBvciBjb21wbGV4IGxvZ2ljLlxuXG4tIERPIE5PVCBCTElORExZIFRSVVNUIFwiTk8gRlVOQ1RJT05BTCBDSEFOR0VcIiAoTkZDSSkgT1IgXCJSRUZBQ1RPUklOR1wiIENMQUlNUzpcbiAgUGF0Y2ggYXV0aG9ycyByb3V0aW5lbHkgbGFiZWwgY2hhbmdlcyBhcyBcImNsZWFudXBzXCIsIFwicmVmYWN0b3JpbmdzXCIsIG9yIHN0YXRlXG4gIFwiTm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWRcIi4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuXG4gIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudFxuICBpbiBjb3JlIHN1YnN5c3RlbXMgZnJlcXVlbnRseSBpbnRyb2R1Y2Ugc3VidGxlIHNlbWFudGljIHNoaWZ0cyBvciB1bmNvdmVyIGxhdGVudCBrZXJuZWwgYnVncy5cbiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC5cblxuLSBORVcgT1IgTU9ESUZJRUQgQVNTRVJUSU9OUyBJTiBSRUFDSEFCTEUgQ09ERSBNVVNUIEJFIEZVWlpFRDpcbiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLFxuICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy5cbiAgRXZlbiBpZiB0aGUgYXV0aG9yIGJlbGlldmVzIHRoZSBpbnZhcmlhbnQgYWx3YXlzIGhvbGRzLCBmdXp6aW5nIGlzIGVzc2VudGlhbCB0byB2ZXJpZnkgd2hldGhlclxuICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4yLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgT05MWSBJRiBhbGwgbW9kaWZpZWQgY29kZSBmYWxscyBzdHJpY3RseSBpbnRvIG9uZSBvciBtb3JlIG9mIHRoZXNlIGNhdGVnb3JpZXM6XG5cbi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczpcbiAgKiBNb2RpZmljYXRpb25zIHRvIERvY3VtZW50YXRpb24vLCBjb21tZW50cywgb3Igc3BlbGxpbmcgZml4ZXMuXG4gICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pXG4gICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLlxuICAqIFB1cmVseSBkZWNvcmF0aXZlIGxvZ2dpbmcgKGUuZy4sIG1lc3NhZ2Ugc3RyaW5ncyBpbiBwcl9lcnIsIHByaW50aywgZGV2X2luZm8pIG9yIHRyYWNlcG9pbnRzXG4gICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy5cbiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuXG4tIFN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSBoYXJkd2FyZTpcbiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsXG4gICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS5cbi0gVW5yZWFjaGFibGUgZXhlY3V0aW9uIHBhdGhzOlxuICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZ1xuICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLlxuICAqIENvZGUgcGF0aHMgZXhjbHVzaXZlIHRvIGFyY2hpdGVjdHVyZXMgb3RoZXIgdGhhbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjMuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz10cnVlIChQT1NJVElWRSBDUklURVJJQSlcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5SZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOlxuLSBDb3JlIFN1YnN5c3RlbXM6XG4gICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLFxuICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy5cbi0gUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOlxuICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy5cbi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOlxuICAqIEFueSBpbnRyb2R1Y3Rpb24gb3IgYWx0ZXJhdGlvbiBvZiBhc3NlcnRpb25zIChXQVJOX09OKiwgVk1fV0FSTl9PTiosIEJVR19PTiosIGV0Yy4pIGluIHJlYWNoYWJsZSBwYXRocy5cbi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczpcbiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG40LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTilcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5XaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjpcblxuLSBBVk9JRCBVQklRVUlUT1VTIExJRkVDWUNMRSBIT1QtUEFUSFM6XG4gIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzXG4gIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0XG4gIGFuZCB0cmFwIGhhbmRsZXJzLCBvciBjb3JlIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzOyB0aGlzIGlzIG5vdCBhbiBleGhhdXN0aXZlIGxpc3QpLlxuICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgXCJmb2N1c2VkXCIsXG4gIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy5cblxuLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6XG4gIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50c1xuICBmb3IgdGhlIHN1YnN5c3RlbSBmZWF0dXJlIHVuZGVyIHJldmlldy5cblxuLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6XG4gIENvbXBpbGVyLWlubGluZWQgc3RhdGljIGZ1bmN0aW9ucyAoc3VjaCBhcyBzdGF0aWMgaW5saW5lcyBpbiBtbS8qLmggb3IgaW5jbHVkZS9saW51eC8qLmgpIGxhY2tcbiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuXG4gIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlclxuICBmdW5jdGlvbnMgaW4gLmMgZmlsZXMgdGhhdCBleGVyY2lzZSB0aGVtIChhdm9pZGluZyB1YmlxdWl0b3VzIGxpZmVjeWNsZSB3cmFwcGVycykuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG41LiBJREVOVElGWUlORyBFbmFibGVDb25maWdzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZTpcbi0gSW5zcGVjdCBLY29uZmlnIGZpbGVzIGFuZCAjaWZkZWYgZ3VhcmRzOyBkbyBub3QgbWFrZSBhc3N1bXB0aW9ucy5cbi0gQ2hlY2sgXCJkZXBlbmRzIG9uXCIgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC5cbi0gU3RyaXAgYW55ICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0XG5cbkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDQ5NTA1ZmNhYjA4NDUzM2E0YWNhMWVlMDU1OTBjMWU1OGI5MzdjYTJcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIFNlcCAxMSAxNzoyODo0OCAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xuaW5kZXggZTZiMWQ5NzU4YzljOS4uOWZkZjk2NDIyNGFiNCAxMDA2NDRcbi0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xuKysrIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jXG5AQCAtOTIyLDkgKzkyMiw5IEBAIG5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcbiBcbiBzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxuIHtcbitcdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHMsICpvbGRfZ3JvdXBzID0gTlVMTDtcbiBcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4gXHR1bnNpZ25lZCBpbnQgZ3JvdXBzO1xuLVx0dW5zaWduZWQgbG9uZyAqbmV3X2dyb3VwcztcbiBcdGludCBlcnIgPSAwO1xuIFxuIFx0bmV0bGlua190YWJsZV9ncmFiKCk7XG5AQCAtOTM4LDE4ICs5MzgsMzcgQEAgc3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcbiBcdGlmIChubGstXHUwMDNlbmdyb3VwcyBcdTAwM2U9IGdyb3VwcylcbiBcdFx0Z290byBvdXRfdW5sb2NrO1xuIFxuLVx0bmV3X2dyb3VwcyA9IGtyZWFsbG9jKG5say1cdTAwM2Vncm91cHMsIE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XG4tXHRpZiAobmV3X2dyb3VwcyA9PSBOVUxMKSB7XG4rXHQvKiBDYW4gbm90IHVzZSBrcmVhbGxvYygpLCBiZWNhdXNlIHRoZSBvbGQgYnVmZmVyIG1pZ2h0IGJlIGZyZWVkXG4rXHQgKiBpbW1lZGlhdGVseSwgd2hpbGUgbG9ja2xlc3MgcmVhZGVycyAobmV0bGluayBkaWFnIGR1bXAgYW5kXG4rXHQgKiAvcHJvYy9uZXQvbmV0bGluaykgY2FuIHN0aWxsIGJlIGxvb2tpbmcgYXQgaXQuXG4rXHQgKi9cbitcdG5ld19ncm91cHMgPSBremFsbG9jKE5MR1JQU1ooZ3JvdXBzKSwgR0ZQX0FUT01JQyk7XG4rXHRpZiAoIW5ld19ncm91cHMpIHtcbiBcdFx0ZXJyID0gLUVOT01FTTtcbiBcdFx0Z290byBvdXRfdW5sb2NrO1xuIFx0fVxuLVx0bWVtc2V0KChjaGFyICopbmV3X2dyb3VwcyArIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpLCAwLFxuLVx0ICAgICAgIE5MR1JQU1ooZ3JvdXBzKSAtIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpKTtcbitcdG9sZF9ncm91cHMgPSBubGstXHUwMDNlZ3JvdXBzO1xuK1x0aWYgKG9sZF9ncm91cHMpXG4rXHRcdG1lbWNweShuZXdfZ3JvdXBzLCBvbGRfZ3JvdXBzLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4rXG4rXHQvKiBQdWJsaXNoIHRoZSBuZXcgYml0bWFwIGFuZCBpdHMgY29udGVudDogcGFpcnMgd2l0aCB0aGUgYWRkcmVzc1xuK1x0ICogZGVwZW5kZW5jeSBpbiBsb2NrbGVzcyByZWFkZXJzLCB3aGljaCBjYW4gcGljayB1cCB0aGUgbmV3IHBvaW50ZXJcbitcdCAqIHdoaWxlIHN0aWxsIHNlZWluZyB0aGUgb2xkIChzbWFsbGVyKSBubGstXHUwMDNlbmdyb3Vwcy5cbitcdCAqL1xuK1x0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZWdyb3VwcywgbmV3X2dyb3Vwcyk7XG4rXG4rXHQvKiBUaGVuIHB1Ymxpc2ggdGhlIG5ldyBzaXplOiBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tXG4rXHQgKiBsb2NrbGVzcyByZWFkZXJzLCBzbyB0aGF0IHRoZXkgY2FuIG5vdCByZWFkIE5MR1JQU1oobmV3IG5ncm91cHMpXG4rXHQgKiBieXRlcyBmcm9tIHRoZSBvbGQgYnVmZmVyLlxuK1x0ICovXG4rXHRzbXBfc3RvcmVfcmVsZWFzZShcdTAwMjZubGstXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcbiBcbi1cdG5say1cdTAwM2Vncm91cHMgPSBuZXdfZ3JvdXBzO1xuLVx0bmxrLVx1MDAzZW5ncm91cHMgPSBncm91cHM7XG4gIG91dF91bmxvY2s6XG4gXHRuZXRsaW5rX3RhYmxlX3VuZ3JhYigpO1xuK1xuK1x0aWYgKG9sZF9ncm91cHMpXG4rXHRcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xuK1xuIFx0cmV0dXJuIGVycjtcbiB9XG4gXG5AQCAtMjcwNSwxMiArMjcyNCwxOSBAQCBzdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxuIFx0fSBlbHNlIHtcbiBcdFx0c3RydWN0IHNvY2sgKnMgPSB2O1xuIFx0XHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2socyk7XG4rXHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgKmdyb3VwcztcbitcbitcdFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXG4rXHRcdCAqIG5say1cdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXG4rXHRcdCAqIFJDVSBncmFjZSBwZXJpb2QsIGFuZCB0aGlzIHdhbGsgaXMgUkNVIHByb3RlY3RlZC5cbitcdFx0ICovXG4rXHRcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbiBcbiBcdFx0c2VxX3ByaW50ZihzZXEsIFwiJXBLICUtM2QgJS0xMHUgJTA4eCAlLThkICUtOGQgJS01ZCAlLThkICUtOHUgJS04bGx1XFxuXCIsXG4gXHRcdFx0ICAgcyxcbiBcdFx0XHQgICBzLVx1MDAzZXNrX3Byb3RvY29sLFxuIFx0XHRcdCAgIG5say1cdTAwM2Vwb3J0aWQsXG4tXHRcdFx0ICAgbmxrLVx1MDAzZWdyb3VwcyA/ICh1MzIpbmxrLVx1MDAzZWdyb3Vwc1swXSA6IDAsXG4rXHRcdFx0ICAgZ3JvdXBzID8gKHUzMilncm91cHNbMF0gOiAwLFxuIFx0XHRcdCAgIHNrX3JtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIHNrX3dtZW1fYWxsb2NfZ2V0KHMpLFxuIFx0XHRcdCAgIFJFQURfT05DRShubGstXHUwMDNlY2JfcnVubmluZyksXG5kaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvZGlhZy5jIGIvbmV0L25ldGxpbmsvZGlhZy5jXG5pbmRleCAwYjNlMDIxYmQwZWQyLi43OTc5YmQ5YjI2MDYwIDEwMDY0NFxuLS0tIGEvbmV0L25ldGxpbmsvZGlhZy5jXG4rKysgYi9uZXQvbmV0bGluay9kaWFnLmNcbkBAIC0xMiwxMiArMTIsMjQgQEBcbiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXG4ge1xuIFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcbi1cbi1cdGlmIChubGstXHUwMDNlZ3JvdXBzID09IE5VTEwpXG4rXHR1bnNpZ25lZCBsb25nICpncm91cHM7XG4rXHR1bnNpZ25lZCBpbnQgbmdyb3VwcztcbitcbitcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XG4rXHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxuK1x0ICogbmxrLVx1MDAzZWdyb3VwcyBhbmQgbmxrLVx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXG4rXHQgKlxuK1x0ICogUmVhZCBubGstXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXG4rXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XG4rXHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xuK1x0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cbitcdCAqL1xuK1x0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXHUwMDI2bmxrLVx1MDAzZW5ncm91cHMpO1xuK1x0Z3JvdXBzID0gUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpO1xuK1x0aWYgKCFncm91cHMpXG4gXHRcdHJldHVybiAwO1xuIFxuLVx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmxrLVx1MDAzZW5ncm91cHMpLFxuLVx0XHQgICAgICAgbmxrLVx1MDAzZWdyb3Vwcyk7XG4rXHRyZXR1cm4gbmxhX3B1dChubHNrYiwgTkVUTElOS19ESUFHX0dST1VQUywgTkxHUlBTWihuZ3JvdXBzKSwgZ3JvdXBzKTtcbiB9XG4gXG4gc3RhdGljIGludCBza19kaWFnX3B1dF9mbGFncyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpXG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyODo1MS45MTY2MjEyNDlaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMjY2NzQ0MDIxNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipGdXp6aW5nIFN1aXRhYmlsaXR5IEFuYWx5c2lzOiBOZXRsaW5rIFBhdGNoKipcblxuT2theSwgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhpcyBwYXRjaCBhbmQgZGVjaWRlIGlmIGl0J3Mgd29ydGggb3VyIHRpbWUgZnV6emluZyB3aXRoIHN5emthbGxlci4gRnJvbSBhIHNhZmV0eSBwZXJzcGVjdGl2ZSwgdGhpcyBpcyBhIHByZXR0eSBzdHJhaWdodGZvcndhcmQgdHJpYWdlIHRhc2sg4oCTIGJlbmlnbiBkZXZlbG9wZXIgUUEsIHBhcnQgb2YgdGhlIG5vcm1hbCBtYWludGVuYW5jZSBhbmQgZGVmZW5zaXZlIHNlY3VyaXR5IHdvcmtmbG93LlxuXG5BbHJpZ2h0LCB0aGUgcGF0Y2ggbW9kaWZpZXMgYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AgYW5kIGBuZXQvbmV0bGluay9kaWFnLmNgLiBTcGVjaWZpY2FsbHksIEkgc2VlIGNoYW5nZXMgaW4gYG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKWAgcmVwbGFjaW5nIGBrcmVhbGxvYygpYCB3aXRoIGBremFsbG9jKClgLCBgbWVtY3B5KClgLCBhdG9taWMgc3RvcmVzIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAoKWAsIGFuZCByZWxhdGVkIGNoYW5nZXMgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYC5cblxuVGhpcyBpcyBjb3JlIG5ldHdvcmtpbmcgY29kZSwgc3BlY2lmaWNhbGx5IE5ldGxpbmsuIE5ldGxpbmsgaXMgZGVmaW5pdGVseSBhIHByaW1lIHRhcmdldCwgaXQncyBwcmV0dHkgbXVjaCBldmVyeXdoZXJlLCBhbmQgcmVhY2hhYmxlIHZpYSB1bnByaXZpbGVnZWQgdXNlciBzb2NrZXRzIOKAkyBgc29ja2V0KEFGX05FVExJTkssIC4uLilgLCBkaWFnIGludGVyZmFjZXMgKGBORVRMSU5LX0lORVRfRElBR2AsIGBORVRMSU5LX0RJQUdgKSwgZXZlbiBhY2Nlc3NpYmxlIHZpYSBgL3Byb2MvbmV0L25ldGxpbmtgLlxuXG5Ob3csIGxldCdzIGFwcGx5IHRoZSBmdXp6aW5nIGNyaXRlcmlhLiBXZSBhcmUgbG9va2luZyBmb3IgXCJSZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlXCIgYW5kIGl0IGlzOlxuXG4tICAgQ29yZSBTdWJzeXN0ZW1zOiAqKkNvcmUgbmV0d29ya2luZyEqKlxuXG4tICAgUmVmYWN0b3JpbmdzIGFuZCBDb2RlIENsZWFudXBzOiAqKlJlc3RydWN0dXJpbmcgb2YgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBjb2RlIGZsb3chKipcblxuLSAgIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6ICoqTmV0bGluayB2aWEgc29ja2V0cyEqKlxuXG5ZZWFoLCBpdCdzIGNsZWFyOiBgV29ydGhGdXp6aW5nID0gdHJ1ZWAhIEkgZG9uJ3QgbmVlZCB0byBkaWcgZGVlcGVyLiBUaGlzIHBhdGNoIGRlZmluaXRlbHkgbWVldHMgdGhlIGNyaXRlcmlhLlxuXG5Ob3csIEknbGwgcHJvYmFibHkgZ28gdGhyb3VnaCBhbmQgdXNlIGdpdCBkaWZmIG9yIGdyZXAgb24gdGhlIHJlcG8gdG8gZG91YmxlLWNoZWNrIGV4YWN0IGZ1bmN0aW9uIGNhbGxlcnMsIGFuZCBtYXliZSBwb2tlIGFyb3VuZCBhdCBzb21lIHJlbGV2YW50IGNvbmZpZ3MganVzdCB0byBnZXQgYW4gb3ZlcmFsbCBzZW5zZSBmb3IgdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQyMDksIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NTYsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyOToxNC41ODQwNjUyMjRaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODU1MjkxNjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmV0bGlua19yZWFsbG9jX2dyb3Vwc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0bGlua1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTEyPW5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjItXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjkyMzpzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjQte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTk4OT1zdGF0aWMgaW50IG5ldGxpbmtfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqYWRkcixcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEwLVxcdFxcdFxcdHJldHVybiAtRVBFUk07XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwMTE6XFx0XFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwMTItXFx0XFx0aWYgKGVycilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjY3PXN0YXRpYyBpbnQgbmV0bGlua19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY5MS1cXHRcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjkyOlxcdFxcdGVyciA9IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc2spO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkzLVxcdFxcdGlmIChlcnIpXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjgtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3Mjk6XFx0XFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzAtXFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jLTE4LVxcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XFxubmV0L25ldGxpbmsvZGlhZy5jOjE5OlxcdCAqIGhvbGRzIHJjdV9yZWFkX2xvY2soKSwgd2hpbGUgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiByZXBsYWNlXFxubmV0L25ldGxpbmsvZGlhZy5jLTIwLVxcdCAqIG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmMtMjItXFx0ICogUmVhZCBubGstXFx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxcbm5ldC9uZXRsaW5rL2RpYWcuYzoyMzpcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxubmV0L25ldGxpbmsvZGlhZy5jLTI0LVxcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjE0LjY2OTU5ODcxWiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MzA5ODQ2MDEwMSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgS2NvbmZpZyBmaWxlcywgdGhpbmtpbmcgbGlrZSBhbiBleHBlcnQ6XG5cbioqRGl2aW5nIGludG8gdGhlIE5ldGxpbmsgRGlhZ25vc3RpYyBQbHVtYmluZyoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBjb25maWd1cmF0aW9uIGRlcGVuZGVuY2llcyBmb3IgbmV0bGluayBkaWFnbm9zdGljcy4gTXkgaW1tZWRpYXRlIGZvY3VzIGlzIG9uIGBuZXQvbmV0bGluay9kaWFnLmNgIGFuZCBgbmV0L25ldGxpbmsvYWZfbmV0bGluay5jYC4gSSBleHBlY3QgdGhlc2UgZmlsZXMgY29udGFpbiB0aGUgY29yZSBsb2dpYyBmb3IgdGhlIE5ldGxpbmsgZGlhZ25vc3RpYyBpbnRlcmZhY2UsIGFuZCB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzIGZhbWlseSBpbXBsZW1lbnRhdGlvbi5cblxuSSdsbCBiZSBsb29raW5nIGZvciB0aGUgS2NvbmZpZyBvcHRpb25zIHRoYXQgY29udHJvbCB0aGVpciBjb21waWxhdGlvbi4gSSdtIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiBkZXBlbmRlbmNpZXMgb24gb3RoZXIgTmV0bGluayBmZWF0dXJlcywgbGlrZSB0aGUgY29yZSBOZXRsaW5rIHN1cHBvcnQgKGBORVRMSU5LYCkgaXRzZWxmLCBkaWZmZXJlbnQgTmV0bGluayBtZXNzYWdlIHR5cGVzLCBhbmQgcG90ZW50aWFsbHkgZXZlbiBzcGVjaWZpYyBzb2NrZXQgdHlwZXMgb3IgcHJvdG9jb2xzIGJ1aWx0IG9uIE5ldGxpbmsuIEknbGwgYWxzbyBjaGVjayBmb3Igb3B0aW9ucyB0aGF0IG1pZ2h0IGVuYWJsZSBvciBkaXNhYmxlIHNwZWNpZmljIGRpYWdub3N0aWMgbWVzc2FnZSB0eXBlcyBvciBmZWF0dXJlcyB3aXRoaW4gdGhlc2UgZmlsZXMuIEl0J3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIGhvdyBkZWVwbHkgdGhlIGRpYWdub3N0aWMgY29kZSBpcyBpbnRlZ3JhdGVkIGFuZCB3aGF0IG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgYXJlIHJlcXVpcmVkIG9yIGltcGFjdGVkIHdoZW4gZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGRpYWdub3N0aWMgZnVuY3Rpb25hbGl0aWVzIGZvciBOZXRsaW5rLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1OTA5LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MTcuNzY4MDYxODQxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEwMzY4NjIyMywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJkaWFnXFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRsaW5rL01ha2VmaWxlPTY9b2JqLXkgIFxcdFxcdFxcdFxcdDo9IGFmX25ldGxpbmsubyBnZW5ldGxpbmsubyBwb2xpY3kub1xcbm5ldC9uZXRsaW5rL01ha2VmaWxlLTctXFxubmV0L25ldGxpbmsvTWFrZWZpbGU6ODpvYmotJChDT05GSUdfTkVUTElOS19ESUFHKVxcdCs9IG5ldGxpbmtfZGlhZy5vXFxubmV0L25ldGxpbmsvTWFrZWZpbGU6OTpuZXRsaW5rX2RpYWcteVxcdFxcdFxcdDo9IGRpYWcub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyOToxNy44NzE3NTQ3MDRaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoxMTgxMDgwNDI0MiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgaXQgd2VyZSBteSBvd246XG5cbioqSW52ZXN0aWdhdGluZyBOZXRsaW5rIERpYWdub3N0aWNzKipcblxuT2theSwgc28gSSdtIHRyeWluZyB0byBmaWd1cmUgb3V0IGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBOZXRsaW5rIGRpYWdub3N0aWNzIGhlcmUuIFRoZSBmaXJzdCB0aGluZyBJJ2QgZG8gaXMgaW1tZWRpYXRlbHkgY2hlY2sgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLiBJIG5lZWQgdG8gc2VlIGlmIGBDT05GSUdfTkVUTElOS19ESUFHYCBpcyBldmVuIGVuYWJsZWQuIFRoYXQncyB0aGUgYmFzZWxpbmUsIHJpZ2h0PyBJdCdzIGxpa2UgY2hlY2tpbmcgdGhlIGZ1c2UgYm94IGJlZm9yZSBJIHN0YXJ0IHRyb3VibGVzaG9vdGluZyB0aGUgZWxlY3RyaWNhbCBzeXN0ZW0uIEknbGwgbmVlZCB0byBsb29rIGluIGBuZXQvbmV0bGluay9LY29uZmlnYCBvciwgaGVjaywgbWF5YmUgaXQncyBkZWZpbmVkIGVsc2V3aGVyZS4gR290dGEgYmUgdGhvcm91Z2guIFRpbWUgdG8gY3JhY2sgb3BlbiB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgc2VlIHdoYXQncyB3aGF0LiBHb3R0YSBtYWtlIHN1cmUgdGhpcyBkaWFnbm9zdGljIHN1cHBvcnQgaXMgYWN0dWFsbHkgY29tcGlsZWQgaW4gYmVmb3JlIEkgZ28gY2hhc2luZyBzaGFkb3dzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2Mjc2LCJPdXRwdXRUb2tlbnMiOjIwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MjkuNjgyNTYyNjM2WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI2MDQwODMyNDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIE5FVExJTktfRElBR1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9LY29uZmlnLTUtXFxubmV0L25ldGxpbmsvS2NvbmZpZzo2OmNvbmZpZyBORVRMSU5LX0RJQUdcXG5uZXQvbmV0bGluay9LY29uZmlnLTctXFx0dHJpc3RhdGUgXFxcIk5FVExJTks6IHNvY2tldCBtb25pdG9yaW5nIGludGVyZmFjZVxcXCJcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MzIuMjg2NjUxMjU1WiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjE5MDQxNjU0NywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhlIGBuZXQvbmV0bGluay9LY29uZmlnYCBmaWxlLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgNiwgYXMgdGhvdWdoIEkgd2VyZSBwb25kZXJpbmcgaXQ6XG5cbioqRGl2aW5nIGludG8gdGhlIE5ldGxpbmsgQ29uZmlndXJhdGlvbioqXG5cbk9rYXksIHRpbWUgdG8gZ2V0IGEgZ29vZCBncmlwIG9uIGhvdyB0aGlzIE5ldGxpbmsgc3Vic3lzdGVtIGNvbmZpZ3VyZXMgaXRzZWxmLiBMZXQncyBzZWUuLi4gSSdtIGdvaW5nIHRvIHB1bGwgdXAgdGhhdCBgS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDYsIHRvIGdldCB0aGUgbGF5IG9mIHRoZSBsYW5kLiBJIGtub3cgdGhpcyBmaWxlIGhvbGRzIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBvcHRpb25zLCBzbyB0aGF0J3Mgd2hlcmUgdGhlIGNyaXRpY2FsIGRlY2lzaW9ucyBhYm91dCB3aGljaCBOZXRsaW5rIGZlYXR1cmVzIGdldCBidWlsdCBpbnRvIHRoZSBrZXJuZWwgYXJlIG1hZGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIGNvcmUgZGVwZW5kZW5jaWVzIGFyZS4gSSdtIGhvcGluZyB0byB1bmRlcnN0YW5kIHdoYXQgYXJlIHRoZSAqYmFzZSogZmVhdHVyZXMgYW5kIHdoYXQgZGVwZW5kcyBvbiB3aGF0LiBUaGlzIGlzIGNydWNpYWwgZm9yIGN1c3RvbWl6aW5nIGEga2VybmVsIGVmZmVjdGl2ZWx5LCBvciB0cm91Ymxlc2hvb3RpbmcgYnVpbGQgaXNzdWVzLiBXaGF0IGFyZSB0aGUga2V5IHN3aXRjaGVzIGZvciBpbmNsdWRpbmcgTmV0bGluayBzdXBwb3J0LCBhbmQgd2hhdCBhcmUgdGhlaXIgZGVwZW5kZW5jaWVzPyBVbmRlcnN0YW5kaW5nIHRoZXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpcyBhYnNvbHV0ZWx5IGZ1bmRhbWVudGFsLlxuXG5cbiIsIklucHV0VG9rZW5zIjo2NTUxLCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MzQuNDc3MDcwOTIyWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjg4MTQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm5ldC9uZXRsaW5rL0tjb25maWdcIixcbiAgXCJGaXJzdExpbmVcIjogMSxcbiAgXCJMaW5lQ291bnRcIjogMzBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAgMTpcXHQjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHlcXG4gICAyOlxcdCNcXG4gICAzOlxcdCMgTmV0bGluayBTb2NrZXRzXFxuICAgNDpcXHQjXFxuICAgNTpcXHRcXG4gICA2OlxcdGNvbmZpZyBORVRMSU5LX0RJQUdcXG4gICA3OlxcdFxcdHRyaXN0YXRlIFxcXCJORVRMSU5LOiBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2VcXFwiXFxuICAgODpcXHRcXHRkZWZhdWx0IG5cXG4gICA5OlxcdFxcdGhlbHBcXG4gIDEwOlxcdFxcdCAgU3VwcG9ydCBmb3IgTkVUTElOSyBzb2NrZXQgbW9uaXRvcmluZyBpbnRlcmZhY2UgdXNlZCBieSB0aGUgc3MgdG9vbC5cXG4gIDExOlxcdFxcdCAgSWYgdW5zdXJlLCBzYXkgWS5cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6Mjk6MzQuNDc3MTYyNjMyWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjE0MzAzODgxODgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IE5ldGxpbmsgTW9kdWxlIERlZXAgRGl2ZSoqXG5cbk9rYXksIHNvIEknbSBsb29raW5nIGF0IHRoZSBidWlsZCBwcm9jZXNzIGZvciB0aGUgTmV0bGluayBzdWJzeXN0ZW0sIHNwZWNpZmljYWxseSBgYWZfbmV0bGluay5jYC4gR29vZCwgaXQncyBhbHdheXMgaW5jbHVkZWQ7IGBvYmoteWAgbWVhbnMgdGhhdCBmaWxlLCBhbG9uZyB3aXRoIGBnZW5ldGxpbmsub2AgYW5kIGBwb2xpY3kub2AsIGFyZSBhbHdheXMgY29tcGlsZWQgaW50byB0aGUga2VybmVsLiBObyBzdXJwcmlzZXMgdGhlcmUuXG5cbk5vdywgSSdtIHRoaW5raW5nIGFib3V0IHRoZSBkaWFnbm9zdGljIGludGVyZmFjZS4gYGRpYWcuY2AgaXMgb25seSBidWlsdCBpZiBgQ09ORklHX05FVExJTktfRElBR2AgaXMgc2V0LiBSaWdodCwgbGV0J3MgY29uZmlybS4gSXQncyBqdXN0IGEgY29uZmlnIG9wdGlvbiwgbm8gZGVwZW5kZW5jaWVzLiBDbGVhbiBhbmQgc2ltcGxlLiBCdXQgSSB3b25kZXIgYWJvdXQgcHJvY2ZzIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgLi4uIEkga25vdyB0aGF0J3MgcmVsYXRlZCB0byBkaWFnbm9zdGljcy4gSSB0aGluayBJJ2xsIGhhdmUgdG8gZGVsdmUgaW50byBgYWZfbmV0bGluay5jYCBuZWFyIHRoZSBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgIGZ1bmN0aW9uLCBhcm91bmQgbGluZXMgMjcwMC0yODAwLCB0byBzZWUgaG93IHRoYXQgaG9vayB3b3Jrcy5cblxuXG4iLCJJbnB1dFRva2VucyI6NjkyNywiT3V0cHV0VG9rZW5zIjo0MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEzMiwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjQ4Ljc4MTA0NzAwNVoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNDUzMDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvYWZfbmV0bGluay5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDI3MDAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjI3MDA6XFx0XFxuMjcwMTpcXHRzdGF0aWMgdm9pZCAqbmV0bGlua19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpXFxuMjcwMjpcXHR7XFxuMjcwMzpcXHRcXHQrKypwb3M7XFxuMjcwNDpcXHRcXHRyZXR1cm4gX19uZXRsaW5rX3NlcV9uZXh0KHNlcSk7XFxuMjcwNTpcXHR9XFxuMjcwNjpcXHRcXG4yNzA3OlxcdHN0YXRpYyB2b2lkIG5ldGxpbmtfbmF0aXZlX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbjI3MDg6XFx0e1xcbjI3MDk6XFx0XFx0c3RydWN0IG5sX3NlcV9pdGVyICppdGVyID0gc2VxLVxcdTAwM2Vwcml2YXRlO1xcbjI3MTA6XFx0XFxuMjcxMTpcXHRcXHRpZiAoaXRlci1cXHUwMDNlbGluayBcXHUwMDNlPSBNQVhfTElOS1MpXFxuMjcxMjpcXHRcXHRcXHRyZXR1cm47XFxuMjcxMzpcXHRcXG4yNzE0OlxcdFxcdG5ldGxpbmtfd2Fsa19zdG9wKGl0ZXIpO1xcbjI3MTU6XFx0fVxcbjI3MTY6XFx0XFxuMjcxNzpcXHRcXG4yNzE4OlxcdHN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxuMjcxOTpcXHR7XFxuMjcyMDpcXHRcXHRpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHtcXG4yNzIxOlxcdFxcdFxcdHNlcV9wdXRzKHNlcSxcXG4yNzIyOlxcdFxcdFxcdFxcdCBcXFwic2sgICAgICAgICAgICAgICBFdGggUGlkICAgICAgICBHcm91cHMgICBcXFwiXFxuMjcyMzpcXHRcXHRcXHRcXHQgXFxcIlJtZW0gICAgIFdtZW0gICAgIER1bXAgIExvY2tzICAgIERyb3BzICAgIElub2RlXFxcXG5cXFwiKTtcXG4yNzI0OlxcdFxcdH0gZWxzZSB7XFxuMjcyNTpcXHRcXHRcXHRzdHJ1Y3Qgc29jayAqcyA9IHY7XFxuMjcyNjpcXHRcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2socyk7XFxuMjcyNzpcXHRcXHRcXHRjb25zdCB1bnNpZ25lZCBsb25nICpncm91cHM7XFxuMjcyODpcXHRcXG4yNzI5OlxcdFxcdFxcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxcbjI3MzA6XFx0XFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuMjczMTpcXHRcXHRcXHQgKiBSQ1UgZ3JhY2UgcGVyaW9kLCBhbmQgdGhpcyB3YWxrIGlzIFJDVSBwcm90ZWN0ZWQuXFxuMjczMjpcXHRcXHRcXHQgKi9cXG4yNzMzOlxcdFxcdFxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxuMjczNDpcXHRcXG4yNzM1OlxcdFxcdFxcdHNlcV9wcmludGYoc2VxLCBcXFwiJXBLICUtM2QgJS0xMHUgJTA4eCAlLThkICUtOGQgJS01ZCAlLThkICUtOHUgJS04bGx1XFxcXG5cXFwiLFxcbjI3MzY6XFx0XFx0XFx0XFx0ICAgcyxcXG4yNzM3OlxcdFxcdFxcdFxcdCAgIHMtXFx1MDAzZXNrX3Byb3RvY29sLFxcbjI3Mzg6XFx0XFx0XFx0XFx0ICAgbmxrLVxcdTAwM2Vwb3J0aWQsXFxuMjczOTpcXHRcXHRcXHRcXHQgICBncm91cHMgPyAodTMyKWdyb3Vwc1swXSA6IDAsXFxuMjc0MDpcXHRcXHRcXHRcXHQgICBza19ybWVtX2FsbG9jX2dldChzKSxcXG4yNzQxOlxcdFxcdFxcdFxcdCAgIHNrX3dtZW1fYWxsb2NfZ2V0KHMpLFxcbjI3NDI6XFx0XFx0XFx0XFx0ICAgUkVBRF9PTkNFKG5say1cXHUwMDNlY2JfcnVubmluZyksXFxuMjc0MzpcXHRcXHRcXHRcXHQgICByZWZjb3VudF9yZWFkKFxcdTAwMjZzLVxcdTAwM2Vza19yZWZjbnQpLFxcbjI3NDQ6XFx0XFx0XFx0XFx0ICAgc2tfZHJvcHNfcmVhZChzKSxcXG4yNzQ1OlxcdFxcdFxcdFxcdCAgIHNvY2tfaV9pbm8ocylcXG4yNzQ2OlxcdFxcdFxcdFxcdCk7XFxuMjc0NzpcXHRcXG4yNzQ4OlxcdFxcdH1cXG4yNzQ5OlxcdFxcdHJldHVybiAwO1xcbjI3NTA6XFx0fVxcbjI3NTE6XFx0XFxuMjc1MjpcXHQjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXFxuMjc1MzpcXHRzdHJ1Y3QgYnBmX2l0ZXJfX25ldGxpbmsge1xcbjI3NTQ6XFx0XFx0X19icGZfbWRfcHRyKHN0cnVjdCBicGZfaXRlcl9tZXRhICosIG1ldGEpO1xcbjI3NTU6XFx0XFx0X19icGZfbWRfcHRyKHN0cnVjdCBuZXRsaW5rX3NvY2sgKiwgc2spO1xcbjI3NTY6XFx0fTtcXG4yNzU3OlxcdFxcbjI3NTg6XFx0REVGSU5FX0JQRl9JVEVSX0ZVTkMobmV0bGluaywgc3RydWN0IGJwZl9pdGVyX21ldGEgKm1ldGEsIHN0cnVjdCBuZXRsaW5rX3NvY2sgKnNrKVxcbjI3NTk6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjQ4Ljc4MTE5Mzg2NVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3NTEyMTUzMjE5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBVc2FnZSoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGUga2VybmVsIGNvZGUuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byB0cmFjZSB0aGUgdXRpbGl6YXRpb24gb2YgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YC4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbnRleHRzIGluIHdoaWNoIHRoaXMgZnVuY3Rpb24gaXMgYWN0dWFsbHkgKmNhbGxlZCouIFRoZSBuYW1lIGl0c2VsZiBzdWdnZXN0cyBhIHNlcXVlbmNlLWJhc2VkIGRpc3BsYXksIHNvIGl0J3MgcHJvYmFibHkgcmVsYXRlZCB0byBzb21lIHNvcnQgb2YgbmV0bGluayBkYXRhIHByZXNlbnRhdGlvbiwgcGVyaGFwcyBmb3IgbW9uaXRvcmluZyBvciBkZWJ1Z2dpbmcuIExldCdzIHNlZSB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgdXNlZDsgSSBuZWVkIHRvIGZpbmQgdGhlIGNhbGwgc2l0ZXMgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlLiBUaGF0J2xsIGdpdmUgbWUgdGhlIGVzc2VudGlhbCBjb250ZXh0IEkgbmVlZCB0byByZWFsbHkgdW5kZXJzdGFuZCBpdHMgcHVycG9zZSBhbmQgcm9sZSB3aXRoaW4gdGhlIHdpZGVyIG5ldGxpbmsgaW5mcmFzdHJ1Y3R1cmUuIFRoZW4gSSBjYW4gdW5kZXJzdGFuZCBob3cgdGhpcyBmdW5jdGlvbiBmaXRzIGludG8gdGhlIGJpZ2dlciBwaWN0dXJlLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4MjQ0LCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzoyOTo1Ni4yOTMzNTA1ODRaIiwiU2VxIjoxNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1MDgzODgyNywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0bGlua1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcwNz1zdGF0aWMgdm9pZCBuZXRsaW5rX25hdGl2ZV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzE3LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzE4OnN0YXRpYyBpbnQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MTkte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3NzI9c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3NzktXFx0aWYgKCFwcm9nKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzgwOlxcdFxcdHJldHVybiBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyhzZXEsIHYpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzgxLVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI4MDM9c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjgwNTpcXHRyZXR1cm4gbmV0bGlua19uYXRpdmVfc2VxX3Nob3coc2VxLCB2KTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjgwNi19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjI5OjU2Ljc0NDE5NDgzMVoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjo3NTc5MjEzMjQ4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZTpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBOZXRsaW5rIFNlcXVlbmNlIFNob3cgRnVuY3Rpb24qKlxuXG5Pa2F5LCBzbyBJJ20gbG9va2luZyBpbnRvIHRoZSBgL3Byb2MvbmV0L25ldGxpbmtgIGludGVyZmFjZSwgd2hpY2gsIGFzIEkgcmVjYWxsLCBpcyBjb21waWxlZCB3aGVuIGBDT05GSUdfUFJPQ19GU2AgaXMgZW5hYmxlZC4gTXkgZm9jdXMgaXMgb24gdW5kZXJzdGFuZGluZyB0aGUgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBmdW5jdGlvbi4gU3BlY2lmaWNhbGx5LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpdHMgcm9sZSBpbiBwb3B1bGF0aW5nIHRoYXQgcHJvYyBlbnRyeS4gVGhlIG5leHQgbG9naWNhbCBzdGVwIGlzIHRvIHNlZSBob3cgYG5ldGxpbmtfc2VxX3Nob3dgIGlzIHVzZWQgYW5kIHdoZXJlIHdpdGhpbiBgYWZfbmV0bGluay5jYC5cblxuXG4iLCJJbnB1dFRva2VucyI6ODgyMiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMwOjA0LjMyMzQxMjI3OVoiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUzOTUzMDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwibmV0bGlua19zZXFfc2hvd1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJuZXQvbmV0bGlua1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjc2MD1zdGF0aWMgaW50IG5ldGxpbmtfcHJvZ19zZXFfc2hvdyhzdHJ1Y3QgYnBmX3Byb2cgKnByb2csXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjc3MS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6Mjc3MjpzdGF0aWMgaW50IG5ldGxpbmtfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3NzMte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI3ODg9c3RhdGljIHZvaWQgbmV0bGlua19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODAyLSNlbHNlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MDM6c3RhdGljIGludCBuZXRsaW5rX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODA0LXtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODE0PXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmV0bGlua19zZXFfb3BzID0ge1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4MTctXFx0LnN0b3AgICA9IG5ldGxpbmtfc2VxX3N0b3AsXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4MTg6XFx0LnNob3cgICA9IG5ldGxpbmtfc2VxX3Nob3csXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4MTktfTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6MDQuMzg4ODEzMzM5WiIsIlNlcSI6MTcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjMwMzQ2NDUwMDAsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZCwgaW4gdGhlIGZpcnN0IHBlcnNvbiBhbmQgdGFyZ2V0ZWQgdG93YXJkcyBhbiBleHBlcnQsIHN0YXJ0aW5nIHdpdGggdGhlIGJvbGRlZCBoZWFkZXI6XG5cbioqRGl2aW5nIGludG8gYG5ldGxpbmtfc2VxX29wc2AgYW5kIHRoZSBQcm9jIEZpbGVzeXN0ZW0qKlxuXG5BbHJpZ2h0LCBsZXQncyBnZXQgaW50byB0aGlzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIGBuZXRsaW5rX3NlcV9vcHNgIGFuZCB0aGUgcHJvYyBmaWxlc3lzdGVtLiBJdOKAmXMgYmVlbiBhIHdoaWxlIHNpbmNlIEkndmUgcmVhbGx5IGR1ZyBpbnRvIHRoaXMgc3BlY2lmaWMgYXJlYSBvZiB0aGUga2VybmVsLCBzbyBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgYW5kIHF1aWNrbHkgcHV0IHRoZSBwaWVjZXMgdG9nZXRoZXIuIEkgc3VzcGVjdCB0aGVyZSBtaWdodCBiZSBzb21lIGludGVyYWN0aW9uIGFyb3VuZCBleHBvcnRpbmcga2VybmVsIGluZm9ybWF0aW9uIG9yIGNvbmZpZ3VyaW5nIHNvbWUgYXNwZWN0cyB0aHJvdWdoIHByb2MsIHVzaW5nIGEgc2VxdWVuY2UgZmlsZSBpbnRlcmZhY2UgYmFja2VkIGJ5IE5ldGxpbmsgdG8gaGFuZGxlIHVwZGF0ZXMgb3IgcXVlcmllcy4gVGhhdCB3b3VsZCBtYWtlIHNlbnNlLCBidXQgSSdtIGp1c3QgZ3Vlc3NpbmcgYXQgdGhpcyBwb2ludC5cblxuVGhlIGBuZXRsaW5rX3NlcV9vcHNgIHN0cnVjdHVyZSBpdHNlbGYgaXMgYSB2aXRhbCBjbHVlLCBwb2ludGluZyB0b3dhcmQgdGhlIHNlcXVlbmNlIGZpbGUgb3BlcmF0aW9ucy4gR2l2ZW4gTmV0bGluaydzIG1lc3NhZ2UtcGFzc2luZyBuYXR1cmUsIEknbSBlbnZpc2lvbmluZyBhIHNldHVwIHdoZXJlIHByb2MgZW50cmllcyBsZXZlcmFnZSBgbmV0bGlua19zZXFfb3BzYCB0byBpbnRlcmFjdCB3aXRoIGtlcm5lbCBkYXRhIHRoYXQgaXMgZHluYW1pYywgdXBkYXRlYWJsZSwgb3IgcmVxdWlyZXMgcmVhbC10aW1lIGluZm9ybWF0aW9uIGV4Y2hhbmdlLiBUaGUgcHJvYyBmaWxlc3lzdGVtLCBhcyBhIHZpcnR1YWwgZmlsZXN5c3RlbSwgYWN0cyBhcyB0aGUgaW50ZXJmYWNlLCBhbmQgYG5ldGxpbmtfc2VxX29wc2AgaGFuZGxlcyB0aGUgdW5kZXJseWluZyBjb21tdW5pY2F0aW9uIGFuZCBkYXRhIG1hbmlwdWxhdGlvbi4gVGhlIHF1ZXN0aW9uIGlzLCBob3cgY2xlYW5seSBpbnRlZ3JhdGVkIGFyZSB0aGV5PyBBcmUgd2UgZGVhbGluZyB3aXRoIGEgdGlnaHQsIHdlbGwtZGVmaW5lZCBhcmNoaXRlY3R1cmUsIG9yIGlzIGl0IGEgbW9yZSBhZC1ob2MgYXJyYW5nZW1lbnQgdGhhdCBldm9sdmVkIG92ZXIgdGltZT8gSSdtIGN1cmlvdXMgYWJvdXQgdGhlIHNwZWNpZmljIHVzZSBjYXNlcy4gV2hhdCBraW5kIG9mIGRhdGEgYXJlIHRoZXkgZXhjaGFuZ2luZz8gSXMgaXQgbW9zdGx5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycywgbW9uaXRvcmluZyBzdGF0aXN0aWNzLCBvciBzb21ldGhpbmcgZWxzZSBlbnRpcmVseT8gVGltZSB0byBpbnZlc3RpZ2F0ZS4uLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MzkyLCJPdXRwdXRUb2tlbnMiOjMwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6MDcuNDIzNDYxMjk5WiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0OTMyOTYzMiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXRsaW5rX3NlcV9vcHNcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L25ldGxpbmtcIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTI4MDg9c3RhdGljIHZvaWQgbmV0bGlua19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODEzLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODE0OnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmV0bGlua19zZXFfb3BzID0ge1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODE1LVxcdC5zdGFydCAgPSBuZXRsaW5rX3NlcV9zdGFydCxcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODYwPXN0YXRpYyBpbnQgX19uZXRfaW5pdCBuZXRsaW5rX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldClcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODYyLSNpZmRlZiBDT05GSUdfUFJPQ19GU1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODYzOlxcdGlmICghcHJvY19jcmVhdGVfbmV0KFxcXCJuZXRsaW5rXFxcIiwgMCwgbmV0LVxcdTAwM2Vwcm9jX25ldCwgXFx1MDAyNm5ldGxpbmtfc2VxX29wcyxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjg2NC1cXHRcXHRcXHRzaXplb2Yoc3RydWN0IG5sX3NlcV9pdGVyKSkpXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjkyMj1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9pdGVyX3NlcV9pbmZvIG5ldGxpbmtfc2VxX2luZm8gPSB7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI5MjM6XFx0LnNlcV9vcHNcXHRcXHQ9IFxcdTAwMjZuZXRsaW5rX3NlcV9vcHMsXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI5MjQtXFx0LmluaXRfc2VxX3ByaXZhdGVcXHQ9IGJwZl9pdGVyX2luaXRfc2VxX25ldCxcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6MDcuNDcyNzk5ODExWiIsIlNlcSI6MTksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIyNjExMTg4ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZSwgYXMgaWYgdGhleSB3ZXJlIG15IG93bjpcblxuKipOYXZpZ2F0aW5nIHRoZSBOZXRsaW5rIExhbmRzY2FwZSoqXG5cblJpZ2h0LCBgQ09ORklHX1BST0NfRlNgLi4uIHRoYXQgcmluZ3MgYSBiZWxsLiBJdCdzIG9idmlvdXNseSBsaW5rZWQgdG8gdGhhdCBgcHJvY19jcmVhdGVfbmV0KFwibmV0bGlua1wiLCAuLi4pYCBjYWxsIEkgcmVtZW1iZXIgc2VlaW5nLiBOb3csIEknbSB0cnlpbmcgdG8gZmlndXJlIG91dCBob3cgYSBwYXJ0aWN1bGFyIG5ldGxpbmsgcmVsYXRlZCBjb2RlIHdvcmtzIC0gaG93IGRvZXMgaXQgd29yaywgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGtlcm5lbD8gQW5kIEkgKnRoaW5rKiBpdCBpcyByZWxhdGVkIHRvIGhvdyB0aGUgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBpcyByZXBvcnRlZC4gU28sIHdoYXQgYWJvdXQgYGRpYWcuY2A/IFRoYXQgZmVlbHMgbGlrZSBhIHJlbGV2YW50IGZpbGUsIHNwZWNpZmljYWxseSBpbiBgbmV0L25ldGxpbmsvZGlhZy5jYC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgdGhlcmUuIExldCdzIGRpZyBpbi5cblxuXG4iLCJJbnB1dFRva2VucyI6MTAxNjIsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDowOS43MzM5MjIzOTZaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6OTAwNTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvZGlhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDcwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seVxcbiAgIDI6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L21vZHVsZS5oXFx1MDAzZVxcbiAgIDM6XFx0XFxuICAgNDpcXHQjaW5jbHVkZSBcXHUwMDNjbmV0L3NvY2suaFxcdTAwM2VcXG4gICA1OlxcdCNpbmNsdWRlIFxcdTAwM2NsaW51eC9uZXRsaW5rLmhcXHUwMDNlXFxuICAgNjpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvc29ja19kaWFnLmhcXHUwMDNlXFxuICAgNzpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbmV0bGlua19kaWFnLmhcXHUwMDNlXFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvcmhhc2h0YWJsZS5oXFx1MDAzZVxcbiAgIDk6XFx0XFxuICAxMDpcXHQjaW5jbHVkZSBcXFwiYWZfbmV0bGluay5oXFxcIlxcbiAgMTE6XFx0XFxuICAxMjpcXHRzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9ncm91cHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpXFxuICAxMzpcXHR7XFxuICAxNDpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xcbiAgMTU6XFx0XFx0dW5zaWduZWQgbG9uZyAqZ3JvdXBzO1xcbiAgMTY6XFx0XFx0dW5zaWduZWQgaW50IG5ncm91cHM7XFxuICAxNzpcXHRcXG4gIDE4OlxcdFxcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XFxuICAxOTpcXHRcXHQgKiBob2xkcyByY3VfcmVhZF9sb2NrKCksIHdoaWxlIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gcmVwbGFjZVxcbiAgMjA6XFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcyBhdCBhbnkgdGltZS5cXG4gIDIxOlxcdFxcdCAqXFxuICAyMjpcXHRcXHQgKiBSZWFkIG5say1cXHUwMDNlbmdyb3VwcyBmaXJzdCA6IHRoaXMgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpXFxuICAyMzpcXHRcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxuICAyNDpcXHRcXHQgKiAoYmlnZ2VyKSBzaXplIHdpdGggdGhlIG9sZCAoc21hbGxlcikgYnVmZmVyLiBUaGUgb2xkIGJ1ZmZlciBpc1xcbiAgMjU6XFx0XFx0ICogZnJlZWQgYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZC5cXG4gIDI2OlxcdFxcdCAqL1xcbiAgMjc6XFx0XFx0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNm5say1cXHUwMDNlbmdyb3Vwcyk7XFxuICAyODpcXHRcXHRncm91cHMgPSBSRUFEX09OQ0UobmxrLVxcdTAwM2Vncm91cHMpO1xcbiAgMjk6XFx0XFx0aWYgKCFncm91cHMpXFxuICAzMDpcXHRcXHRcXHRyZXR1cm4gMDtcXG4gIDMxOlxcdFxcbiAgMzI6XFx0XFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XFxuICAzMzpcXHR9XFxuICAzNDpcXHRcXG4gIDM1OlxcdHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxcbiAgMzY6XFx0e1xcbiAgMzc6XFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcXG4gIDM4OlxcdFxcdHUzMiBmbGFncyA9IDA7XFxuICAzOTpcXHRcXG4gIDQwOlxcdFxcdGlmIChubGstXFx1MDAzZWNiX3J1bm5pbmcpXFxuICA0MTpcXHRcXHRcXHRmbGFncyB8PSBORElBR19GTEFHX0NCX1JVTk5JTkc7XFxuICA0MjpcXHRcXHRpZiAobmxrX3Rlc3RfYml0KFJFQ1ZfUEtUSU5GTywgc2spKVxcbiAgNDM6XFx0XFx0XFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19QS1RJTkZPO1xcbiAgNDQ6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChCUk9BRENBU1RfU0VORF9FUlJPUiwgc2spKVxcbiAgNDU6XFx0XFx0XFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19CUk9BRENBU1RfRVJST1I7XFxuICA0NjpcXHRcXHRpZiAobmxrX3Rlc3RfYml0KFJFQ1ZfTk9fRU5PQlVGUywgc2spKVxcbiAgNDc6XFx0XFx0XFx0ZmxhZ3MgfD0gTkRJQUdfRkxBR19OT19FTk9CVUZTO1xcbiAgNDg6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChMSVNURU5fQUxMX05TSUQsIHNrKSlcXG4gIDQ5OlxcdFxcdFxcdGZsYWdzIHw9IE5ESUFHX0ZMQUdfTElTVEVOX0FMTF9OU0lEO1xcbiAgNTA6XFx0XFx0aWYgKG5sa190ZXN0X2JpdChDQVBfQUNLLCBzaykpXFxuICA1MTpcXHRcXHRcXHRmbGFncyB8PSBORElBR19GTEFHX0NBUF9BQ0s7XFxuICA1MjpcXHRcXG4gIDUzOlxcdFxcdHJldHVybiBubGFfcHV0X3UzMihza2IsIE5FVExJTktfRElBR19GTEFHUywgZmxhZ3MpO1xcbiAgNTQ6XFx0fVxcbiAgNTU6XFx0XFxuICA1NjpcXHRzdGF0aWMgaW50IHNrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsXFxuICA1NzpcXHRcXHRcXHRcXHRzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSAqcmVxLFxcbiAgNTg6XFx0XFx0XFx0XFx0dTMyIHBvcnRpZCwgdTMyIHNlcSwgdTMyIGZsYWdzLCB1NjQgc2tfaW5vKVxcbiAgNTk6XFx0e1xcbiAgNjA6XFx0XFx0c3RydWN0IG5sbXNnaGRyICpubGg7XFxuICA2MTpcXHRcXHRzdHJ1Y3QgbmV0bGlua19kaWFnX21zZyAqcmVwO1xcbiAgNjI6XFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTtcXG4gIDYzOlxcdFxcbiAgNjQ6XFx0XFx0bmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIFNPQ0tfRElBR19CWV9GQU1JTFksIHNpemVvZigqcmVwKSxcXG4gIDY1OlxcdFxcdFxcdFxcdGZsYWdzKTtcXG4gIDY2OlxcdFxcdGlmICghbmxoKVxcbiAgNjc6XFx0XFx0XFx0cmV0dXJuIC1FTVNHU0laRTtcXG4gIDY4OlxcdFxcbiAgNjk6XFx0XFx0cmVwID0gbmxtc2dfZGF0YShubGgpO1xcbiAgNzA6XFx0XFx0cmVwLVxcdTAwM2VuZGlhZ19mYW1pbHlcXHQ9IEFGX05FVExJTks7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMwOjA5LjczNDAxNTM0NloiLCJTZXEiOjIxLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMDY4MjczMjc2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcy4gSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGFzIGlmIHRoZXkncmUgbXkgb3duOlxuXG4qKkludmVzdGlnYXRpbmcgdGhlIG5ldGxpbmsgRGlhZ25vc2lzIENvZGUqKlxuXG5BbHJpZ2h0LCBJJ20gYXQgYSBwb2ludCB3aGVyZSBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgYG5ldC9uZXRsaW5rL2RpYWcuY2AgaXMgYWN0dWFsbHkgKnVzZWQqLiBKdXN0IHJlYWRpbmcgdGhlIGZ1bmN0aW9ucyBpbiBpc29sYXRpb24gaXNuJ3QgZW5vdWdoOyBJIG5lZWQgdGhlIGNvbnRleHQuIFdoZXJlIGFyZSB0aGUgZW50cnkgcG9pbnRzPyBXaGF0IHRyaWdnZXJzIHRoZXNlIGRpYWdub3NpcyBtZWNoYW5pc21zPyBJIG5lZWQgdG8gdHJhY2UgdGhlIGNhbGxzLCB0aGUgY2FsbGVyIGZ1bmN0aW9ucywgYW5kIHNlZSBob3cgdGhlIHBpZWNlcyBmaXQgdG9nZXRoZXIuIFNvLCB0byBnZXQgdGhlIGZ1bGwgcGljdHVyZSwgSeKAmW0gZ29pbmcgdG8gZXhhbWluZSB0aGUgcmVzdCBvZiB0aGUgZmlsZSB0byBzZWUgaG93IHRob3NlIHNwZWNpZmljIGZ1bmN0aW9ucyB3aXRoaW4gYGRpYWcuY2AgYXJlIGludm9rZWQgd2l0aGluIHRoZSBOZXRsaW5rIGZyYW1ld29yay4gS25vd2luZyB0aGUgY2FsbHMgaXMgY3J1Y2lhbCB0byB1bmRlcnN0YW5kaW5nIHRoZSBkaWFnbm9zdGljIHByb2Nlc3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExNTU3LCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDoxMS44MDIyOTIwMzJaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzA4MzEsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvZGlhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDcxLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgIDcxOlxcdFxcdHJlcC1cXHUwMDNlbmRpYWdfdHlwZVxcdFxcdD0gc2stXFx1MDAzZXNrX3R5cGU7XFxuICA3MjpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX3Byb3RvY29sXFx0PSBzay1cXHUwMDNlc2tfcHJvdG9jb2w7XFxuICA3MzpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX3N0YXRlXFx0PSBzay1cXHUwMDNlc2tfc3RhdGU7XFxuICA3NDpcXHRcXG4gIDc1OlxcdFxcdHJlcC1cXHUwMDNlbmRpYWdfaW5vXFx0XFx0PSBza19pbm87XFxuICA3NjpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX3BvcnRpZFxcdD0gbmxrLVxcdTAwM2Vwb3J0aWQ7XFxuICA3NzpcXHRcXHRyZXAtXFx1MDAzZW5kaWFnX2RzdF9wb3J0aWRcXHQ9IG5say1cXHUwMDNlZHN0X3BvcnRpZDtcXG4gIDc4OlxcdFxcdHJlcC1cXHUwMDNlbmRpYWdfZHN0X2dyb3VwXFx0PSBubGstXFx1MDAzZWRzdF9ncm91cDtcXG4gIDc5OlxcdFxcdHNvY2tfZGlhZ19zYXZlX2Nvb2tpZShzaywgcmVwLVxcdTAwM2VuZGlhZ19jb29raWUpO1xcbiAgODA6XFx0XFxuICA4MTpcXHRcXHRpZiAoKHJlcS1cXHUwMDNlbmRpYWdfc2hvdyBcXHUwMDI2IE5ESUFHX1NIT1dfR1JPVVBTKSBcXHUwMDI2XFx1MDAyNlxcbiAgODI6XFx0XFx0ICAgIHNrX2RpYWdfZHVtcF9ncm91cHMoc2ssIHNrYikpXFxuICA4MzpcXHRcXHRcXHRnb3RvIG91dF9ubG1zZ190cmltO1xcbiAgODQ6XFx0XFxuICA4NTpcXHRcXHRpZiAoKHJlcS1cXHUwMDNlbmRpYWdfc2hvdyBcXHUwMDI2IE5ESUFHX1NIT1dfTUVNSU5GTykgXFx1MDAyNlxcdTAwMjZcXG4gIDg2OlxcdFxcdCAgICBzb2NrX2RpYWdfcHV0X21lbWluZm8oc2ssIHNrYiwgTkVUTElOS19ESUFHX01FTUlORk8pKVxcbiAgODc6XFx0XFx0XFx0Z290byBvdXRfbmxtc2dfdHJpbTtcXG4gIDg4OlxcdFxcbiAgODk6XFx0XFx0aWYgKChyZXEtXFx1MDAzZW5kaWFnX3Nob3cgXFx1MDAyNiBORElBR19TSE9XX0ZMQUdTKSBcXHUwMDI2XFx1MDAyNlxcbiAgOTA6XFx0XFx0ICAgIHNrX2RpYWdfcHV0X2ZsYWdzKHNrLCBza2IpKVxcbiAgOTE6XFx0XFx0XFx0Z290byBvdXRfbmxtc2dfdHJpbTtcXG4gIDkyOlxcdFxcbiAgOTM6XFx0XFx0bmxtc2dfZW5kKHNrYiwgbmxoKTtcXG4gIDk0OlxcdFxcdHJldHVybiAwO1xcbiAgOTU6XFx0XFxuICA5NjpcXHRvdXRfbmxtc2dfdHJpbTpcXG4gIDk3OlxcdFxcdG5sbXNnX2NhbmNlbChza2IsIG5saCk7XFxuICA5ODpcXHRcXHRyZXR1cm4gLUVNU0dTSVpFO1xcbiAgOTk6XFx0fVxcbiAxMDA6XFx0XFxuIDEwMTpcXHRzdGF0aWMgaW50IF9fbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLFxcbiAxMDI6XFx0XFx0XFx0XFx0XFx0aW50IHByb3RvY29sLCBpbnQgc19udW0pXFxuIDEwMzpcXHR7XFxuIDEwNDpcXHRcXHRzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICpodGkgPSAodm9pZCAqKWNiLVxcdTAwM2VhcmdzWzJdO1xcbiAxMDU6XFx0XFx0c3RydWN0IG5ldGxpbmtfdGFibGUgKnRibCA9IFxcdTAwMjZubF90YWJsZVtwcm90b2NvbF07XFxuIDEwNjpcXHRcXHRzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItXFx1MDAzZXNrKTtcXG4gMTA3OlxcdFxcdHN0cnVjdCBuZXRsaW5rX2RpYWdfcmVxICpyZXE7XFxuIDEwODpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubHNrO1xcbiAxMDk6XFx0XFx0dW5zaWduZWQgbG9uZyBmbGFncztcXG4gMTEwOlxcdFxcdHN0cnVjdCBzb2NrICpzaztcXG4gMTExOlxcdFxcdGludCBudW0gPSAyO1xcbiAxMTI6XFx0XFx0aW50IHJldCA9IDA7XFxuIDExMzpcXHRcXG4gMTE0OlxcdFxcdHJlcSA9IG5sbXNnX2RhdGEoY2ItXFx1MDAzZW5saCk7XFxuIDExNTpcXHRcXG4gMTE2OlxcdFxcdGlmIChzX251bSBcXHUwMDNlIDEpXFxuIDExNzpcXHRcXHRcXHRnb3RvIG1jX2xpc3Q7XFxuIDExODpcXHRcXG4gMTE5OlxcdFxcdG51bS0tO1xcbiAxMjA6XFx0XFxuIDEyMTpcXHRcXHRpZiAoIWh0aSkge1xcbiAxMjI6XFx0XFx0XFx0aHRpID0ga21hbGxvY19vYmooKmh0aSk7XFxuIDEyMzpcXHRcXHRcXHRpZiAoIWh0aSlcXG4gMTI0OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbiAxMjU6XFx0XFxuIDEyNjpcXHRcXHRcXHRjYi1cXHUwMDNlYXJnc1syXSA9IChsb25nKWh0aTtcXG4gMTI3OlxcdFxcdH1cXG4gMTI4OlxcdFxcbiAxMjk6XFx0XFx0aWYgKCFzX251bSlcXG4gMTMwOlxcdFxcdFxcdHJoYXNodGFibGVfd2Fsa19lbnRlcihcXHUwMDI2dGJsLVxcdTAwM2VoYXNoLCBodGkpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDoxMS44MDIzNjQ1NDNaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzI5NTAzMDU3NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGludGVycHJldGF0aW9uIG9mIHRoYXQgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlLCBhbmQgd3JpdHRlbiBpbiB0aGUgZmlyc3QgcGVyc29uOlxuXG4qKkRpdmluZyBpbnRvIGBkaWFnLmNgKipcblxuQWxyaWdodCwgSSdtIGhlcmUsIHJlYWR5IHRvIGV4YW1pbmUgdGhlIHJlc3Qgb2YgYGRpYWcuY2AuIFRoZSBpbml0aWFsIGdsaW1wc2UgcHJvYmFibHkgaXNuJ3QgZW5vdWdoLCBhbmQgdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoYXQgd2hhdCdzIG5leHQgaXMga2V5IHRvIHdoYXRldmVyJ3MgZ29pbmcgb24uIEkga25vdyBmcm9tIGV4cGVyaWVuY2UgdGhhdCBkaWFnbm9zdGljcyBjYW4gb2Z0ZW4gYmUgYSByYWJiaXQgaG9sZSwgYnV0IGFsc28gdGhlIGJyZWFkY3J1bWJzIHRoYXQgbGVhZCB0byB0aGUgc29sdXRpb24uIE15IGd1dCB0ZWxscyBtZSB0aGlzIG9uZSdzIHByb2JhYmx5IGdvaW5nIHRvIHByb3ZpZGUgY29udGV4dCB0byBlYXJsaWVyIHByb2JsZW1zLiBMZXQncyBzZWUgaWYgdGhlIHJlc3Qgb2YgaXQgcmV2ZWFscyB0aGUgcm9vdCBjYXVzZSwgb3IsIGF0IHRoZSB2ZXJ5IGxlYXN0LCBnaXZlcyBtZSBzb21lIHNvbGlkIGNsdWVzIGZvciB3aGVyZSB0byBsb29rIG5leHQuIEdvdHRhIHN0YXkgc2hhcnAgYW5kIGxvb2sgZm9yIHBhdHRlcm5zLCBkZXBlbmRlbmNpZXMsIGFuZCBhbnkgdW5leHBlY3RlZCBiZWhhdmlvcnMuIExldCdzIGRpZyBpbiBhbmQgc2VlIHdoYXQgc2VjcmV0cyB0aGlzIHNlY3Rpb24gb2YgdGhlIGNvZGUgaG9sZHMhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyNjg3LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTIsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDoxOS4wOTczOTcyMzZaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzgwNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibmV0L25ldGxpbmsvZGlhZy5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDE4MCxcbiAgXCJMaW5lQ291bnRcIjogNjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDE4MDpcXHRcXHRcXHRcXHRcXHQgTkVUTElOS19DQihjYi1cXHUwMDNlc2tiKS5wb3J0aWQsXFxuIDE4MTpcXHRcXHRcXHRcXHRcXHQgY2ItXFx1MDAzZW5saC1cXHUwMDNlbmxtc2dfc2VxLFxcbiAxODI6XFx0XFx0XFx0XFx0XFx0IE5MTV9GX01VTFRJLFxcbiAxODM6XFx0XFx0XFx0XFx0XFx0IHNvY2tfaV9pbm8oc2spKSBcXHUwMDNjIDApIHtcXG4gMTg0OlxcdFxcdFxcdFxcdHJldCA9IDE7XFxuIDE4NTpcXHRcXHRcXHRcXHRicmVhaztcXG4gMTg2OlxcdFxcdFxcdH1cXG4gMTg3OlxcdFxcdFxcdG51bSsrO1xcbiAxODg6XFx0XFx0fVxcbiAxODk6XFx0XFx0cmVhZF91bmxvY2tfaXJxcmVzdG9yZShcXHUwMDI2bmxfdGFibGVfbG9jaywgZmxhZ3MpO1xcbiAxOTA6XFx0XFxuIDE5MTpcXHRkb25lOlxcbiAxOTI6XFx0XFx0Y2ItXFx1MDAzZWFyZ3NbMF0gPSBudW07XFxuIDE5MzpcXHRcXG4gMTk0OlxcdFxcdHJldHVybiByZXQ7XFxuIDE5NTpcXHR9XFxuIDE5NjpcXHRcXG4gMTk3OlxcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKVxcbiAxOTg6XFx0e1xcbiAxOTk6XFx0XFx0c3RydWN0IG5ldGxpbmtfZGlhZ19yZXEgKnJlcTtcXG4gMjAwOlxcdFxcdGludCBzX251bSA9IGNiLVxcdTAwM2VhcmdzWzBdO1xcbiAyMDE6XFx0XFx0aW50IGVyciA9IDA7XFxuIDIwMjpcXHRcXG4gMjAzOlxcdFxcdHJlcSA9IG5sbXNnX2RhdGEoY2ItXFx1MDAzZW5saCk7XFxuIDIwNDpcXHRcXG4gMjA1OlxcdFxcdGlmIChyZXEtXFx1MDAzZXNkaWFnX3Byb3RvY29sID09IE5ESUFHX1BST1RPX0FMTCkge1xcbiAyMDY6XFx0XFx0XFx0aW50IGk7XFxuIDIwNzpcXHRcXG4gMjA4OlxcdFxcdFxcdGZvciAoaSA9IGNiLVxcdTAwM2VhcmdzWzFdOyBpIFxcdTAwM2MgTUFYX0xJTktTOyBpKyspIHtcXG4gMjA5OlxcdFxcdFxcdFxcdGVyciA9IF9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgaSwgc19udW0pO1xcbiAyMTA6XFx0XFx0XFx0XFx0aWYgKGVycilcXG4gMjExOlxcdFxcdFxcdFxcdFxcdGJyZWFrO1xcbiAyMTI6XFx0XFx0XFx0XFx0c19udW0gPSAwO1xcbiAyMTM6XFx0XFx0XFx0fVxcbiAyMTQ6XFx0XFx0XFx0Y2ItXFx1MDAzZWFyZ3NbMV0gPSBpO1xcbiAyMTU6XFx0XFx0fSBlbHNlIHtcXG4gMjE2OlxcdFxcdFxcdGlmIChyZXEtXFx1MDAzZXNkaWFnX3Byb3RvY29sIFxcdTAwM2U9IE1BWF9MSU5LUylcXG4gMjE3OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PRU5UO1xcbiAyMTg6XFx0XFxuIDIxOTpcXHRcXHRcXHRlcnIgPSBfX25ldGxpbmtfZGlhZ19kdW1wKHNrYiwgY2IsIHJlcS1cXHUwMDNlc2RpYWdfcHJvdG9jb2wsIHNfbnVtKTtcXG4gMjIwOlxcdFxcdH1cXG4gMjIxOlxcdFxcbiAyMjI6XFx0XFx0cmV0dXJuIGVyciBcXHUwMDNjPSAwID8gZXJyIDogc2tiLVxcdTAwM2VsZW47XFxuIDIyMzpcXHR9XFxuIDIyNDpcXHRcXG4gMjI1OlxcdHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2R1bXBfZG9uZShzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpXFxuIDIyNjpcXHR7XFxuIDIyNzpcXHRcXHRzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICpodGkgPSAodm9pZCAqKWNiLVxcdTAwM2VhcmdzWzJdO1xcbiAyMjg6XFx0XFxuIDIyOTpcXHRcXHRpZiAoY2ItXFx1MDAzZWFyZ3NbMF0gPT0gMSlcXG4gMjMwOlxcdFxcdFxcdHJoYXNodGFibGVfd2Fsa19leGl0KGh0aSk7XFxuIDIzMTpcXHRcXG4gMjMyOlxcdFxcdGtmcmVlKGh0aSk7XFxuIDIzMzpcXHRcXG4gMjM0OlxcdFxcdHJldHVybiAwO1xcbiAyMzU6XFx0fVxcbiAyMzY6XFx0XFxuIDIzNzpcXHRzdGF0aWMgaW50IG5ldGxpbmtfZGlhZ19oYW5kbGVyX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpoKVxcbiAyMzg6XFx0e1xcbiAyMzk6XFx0XFx0aW50IGhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgbmV0bGlua19kaWFnX3JlcSk7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMwOjE5LjA5NzQ3NzAyN1oiLCJTZXEiOjI1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyMzE2NDA1NjkyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXNpcyBvZiBhIENvbmN1cnJlbmN5IEJ1ZyBGaXggaW4gTmV0bGluayBNdWx0aWNhc3QgR3JvdXAgTWFuYWdlbWVudCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCBzY2FuIGZsYWdnZWQgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgaXNzdWUgd2l0aGluIHRoZSBOZXRsaW5rIHN1YnN5c3RlbSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBtdWx0aWNhc3QgZ3JvdXAgbWFuYWdlbWVudC4gVGhlIGNvZGUgcmV2ZWFscyBhIHN1YnRsZSByYWNlIGNvbmRpdGlvbiByZWxhdGVkIHRvIHJlYWxsb2NhdGlvbiBvZiB0aGUgbXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgYXJyYXkuIEkgc2VlIHRoYXQgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgIGlzIHRoZSBrZXkgZnVuY3Rpb24gaGVyZSwgY2FsbGVkIGZyb20gYG5ldGxpbmtfYmluZGAgYW5kIGBuZXRsaW5rX3NldHNvY2tvcHRgIHdoZW4gZGVhbGluZyB3aXRoIG1lbWJlcnNoaXAgY2hhbmdlcyAoYWRkL2Ryb3ApLiBUaGlzIGZ1bmN0aW9uJ3Mgcm9sZSBpbiByZWFsbG9jYXRpbmcgdGhlIHVuZGVybHlpbmcgYG5say1cdTAwM2Vncm91cHNgIHN0cnVjdHVyZSByYWlzZXMgbXkgY29uY2Vybi5cblxuVGhlIHBhdGNoIGl0c2VsZiByZXBsYWNlcyB0aGUgcHJvYmxlbWF0aWMgYGtyZWFsbG9jYCBjYWxsIHdpdGggYSBzYWZlciBzZXF1ZW5jZTogYGt6YWxsb2NgLCBgbWVtY3B5YCwgbWVtb3J5IGJhcnJpZXJzIHVzaW5nIGBzbXBfc3RvcmVfcmVsZWFzZWAsIGFuZCBmaW5hbGx5LCBhIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAuIFRoaXMgaXMgYSBjbGFzc2ljIHBhdHRlcm4gZm9yIGFkZHJlc3NpbmcgdXNlLWFmdGVyLWZyZWUgb3Igb3V0LW9mLWJvdW5kcyByZWFkcyBpbiBhIGxvY2tsZXNzIG9yIFJDVS1wcm90ZWN0ZWQgY29udGV4dC4gVGhlIGNvbW1lbnRzIGNvbmZpcm0gbXkgc3VzcGljaW9uLCB0aGF0IGNvbmN1cnJlbnQgcmVhZGVycywgbGlrZSB0aG9zZSBpbiB0aGUgZGlhZ25vc3RpYyBkdW1wIChgc2tfZGlhZ19kdW1wX2dyb3Vwc2ApIG9yIGAvcHJvYy9uZXQvbmV0bGlua2AgcmVhZGVycyAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCksIGRvbid0IGhvbGQgdGhlIG5lY2Vzc2FyeSBsb2NrcywgY3JlYXRpbmcgYSB3aW5kb3cgZm9yIHRoZSByYWNlIGNvbmRpdGlvbi5cblxuSeKAmW0gcGFydGljdWxhcmx5IGludGVyZXN0ZWQgaW4gaG93IHRoZSBmaXggYWZmZWN0cyBjb25jdXJyZW50IGFjY2Vzcy4gU3BlY2lmaWNhbGx5LCBgc2tfZGlhZ19kdW1wX2dyb3Vwc2Agbm93IHVzZXMgYHNtcF9sb2FkX2FjcXVpcmVgIGFuZCBgUkVBRF9PTkNFYCB0byBhY2Nlc3MgYG5say1cdTAwM2VuZ3JvdXBzYCBhbmQgYG5say1cdTAwM2Vncm91cHNgLCByZXNwZWN0aXZlbHksIGFuZCBgbmV0bGlua19uYXRpdmVfc2VxX3Nob3dgIG5vdyB1dGlsaXplcyBgUkVBRF9PTkNFYCBvbiBgbmxrLVx1MDAzZWdyb3Vwc2AuIFRoaXMgaXMgdGV4dGJvb2sgUkNVIHN5bmNocm9uaXphdGlvbiBjb21iaW5lZCB3aXRoIG1lbW9yeSBvcmRlcmluZywgd2hpY2ggaW1tZWRpYXRlbHkgZmxhZ3MgdGhpcyBhcyBhIGNhbmRpZGF0ZSBmb3IgY29uY3VycmVuY3kgZnV6emluZyBhbmQgS0NTQU4vS0FTQU4uXG5cbkNydWNpYWxseSwgdGhpcyB2dWxuZXJhYmlsaXR5IGlzIHJlYWRpbHkgcmVhY2hhYmxlLiBBIHVzZXItc3BhY2UgcHJvZ3JhbSBjYW4gY3JlYXRlIGEgTmV0bGluayBzb2NrZXQsIGJpbmQgaXQsIGFkZCBvciBkcm9wIG11bHRpY2FzdCBtZW1iZXJzaGlwcyB1c2luZyBgc2V0c29ja29wdGAgKHdpdGggYE5FVExJTktfQUREX01FTUJFUlNISVBgIG9yIGBORVRMSU5LX0RST1BfTUVNQkVSU0hJUGApLCBhbmQgdGhlbiBwb3RlbnRpYWxseSB0cmlnZ2VyIHRoZSBkaWFnbm9zdGljIGR1bXAgdmlhIGBzZW5kdG8oTkVUTElOS19JTkVUX0RJQUcsIC4uLilgIG9yIHJlYWRpbmcgYC9wcm9jL25ldC9uZXRsaW5rYC4gQWxsIHN0YW5kYXJkIE5ldGxpbmsgc29ja2V0IG9wZXJhdGlvbnMuIFRoaXMgbG93IGJhcnJpZXIgb2YgZW50cnkgbWFrZXMgaXQgYW4gaWRlYWwgdGFyZ2V0IGZvciBmdXp6aW5nIGNhbXBhaWducy5cblxuVGhlIHdvcnRoaW5lc3MgaXMgcHJldHR5IGNsZWFyLiBUaGlzIHRvdWNoZXMgY29yZSBuZXR3b3JraW5nLCBsZXZlcmFnZXMgUkNVIG1lbW9yeSBtYW5hZ2VtZW50LCBpcyB1c2VyLXNwYWNlIGFjY2Vzc2libGUgKHdoaWNoIGlzIGFsd2F5cyBhIGJvbnVzKSwgYW5kIHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgdG8gZnV6eiB1c2luZyBzb21ldGhpbmcgbGlrZSBzeXprYWxsZXIuXG5cbk15IGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zIHRoZW1zZWx2ZXM6IGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYCwgYHNrX2RpYWdfZHVtcF9ncm91cHNgLCBhbmQgYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YC4gVGhlc2UgYXJlIHRoZSBwcmVjaXNlIGxvY2F0aW9ucyBvZiB0aGUgYnVnIGZpeCBhbmQgdGhlIGNvcmUgbG9naWMgaW52b2x2ZWQgaW4gdGhlIHJhY2UuXG5cblRoZSBpZGVudGlmaWVkIGZ1bmN0aW9ucyBhcmVuJ3QganVzdCBnZW5lcmljIGxpZmVjeWNsZSBvbmVzOyB0aGV5IGFyZSB0aGUgc3BlY2lmaWMgZmVhdHVyZSBsb2dpYyBmdW5jdGlvbnMgZGlyZWN0bHkgaW1wbGVtZW50aW5nIHRoZSBhbHRlcmVkIGNvZGUgcGF0aHMsIGFuZCB0aHVzLCBwcmltZSBmdXp6aW5nIHRhcmdldHMuXG5cbkZpbmFsbHksIHRoZSBidWlsZCByZXF1aXJlbWVudHMgbG9vayBzaW1wbGU6IGBuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNgIGlzIGNvcmUgYW5kIGFsd2F5cyBlbmFibGVkLiBgbmV0L25ldGxpbmsvZGlhZy5jYCBuZWVkcyBgQ09ORklHX05FVExJTktfRElBR2AsIGFuZCBgL3Byb2MvbmV0L25ldGxpbmtgIHJlcXVpcmVzIGBDT05GSUdfUFJPQ19GU2AuIFRoZSBkZXBlbmRlbmNpZXMgYXJlIHN0cmFpZ2h0Zm9yd2FyZC4gQWxsIHJlbGV2YW50IGZ1bmN0aW9uYWxpdHkgaXMgYXZhaWxhYmxlIGluIG1haW5saW5lIGFuZCBzaG91bGQgYmUgZWFzaWx5IHRlc3RlZC5cblxuRXZlcnl0aGluZyBjaGVja3Mgb3V0LCBpdCdzIHdvcnRoIGZ1enppbmcgd2l0aCB0aG9zZSBjb25maWcgb3B0aW9ucyBhbmQgdGhlIHNwZWNpZmljIGZvY3VzIHN5bWJvbHMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNzY4LCJPdXRwdXRUb2tlbnMiOjE4NiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE0NzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo0Mi4yNjE1MzY3ODNaIiwiU2VxIjoyNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NjE3MTE1OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiTkVUTElOS19ESUFHXCIsXG4gICAgXCJQUk9DX0ZTXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwibmV0bGlua19yZWFsbG9jX2dyb3Vwc1wiLFxuICAgIFwic2tfZGlhZ19kdW1wX2dyb3Vwc1wiLFxuICAgIFwibmV0bGlua19uYXRpdmVfc2VxX3Nob3dcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGxvY2tsZXNzIFJDVSBzeW5jaHJvbml6YXRpb24gZm9yIE5ldGxpbmsgc29ja2V0IG11bHRpY2FzdCBncm91cHMgKG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMpIGFjcm9zcyBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNrX2RpYWdfZHVtcF9ncm91cHMoKSwgYW5kIG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KCkuIFRoaXMgdG91Y2hlcyBjb3JlIG5ldHdvcmtpbmcgY29uY3VycmVuY3kgbG9naWMgcmVhY2hhYmxlIGZyb20gdXNlcnNwYWNlIHZpYSBuZXRsaW5rIHNvY2tldCBiaW5kL3NldHNvY2tvcHQsIHNvY2tfZGlhZyBkdW1wLCBhbmQgL3Byb2MvbmV0L25ldGxpbmsgcmVhZHMuIEZ1enppbmcgaXMgd2FycmFudGVkIHRvIGRldGVjdCBwb3RlbnRpYWwgZGF0YSByYWNlcywgbWVtb3J5IG9yZGVyaW5nIGlzc3Vlcywgb3IgVUFGcy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJORVRMSU5LX0RJQUdcIixcbiAgICBcIlBST0NfRlNcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzXCIsXG4gICAgXCJza19kaWFnX2R1bXBfZ3JvdXBzXCIsXG4gICAgXCJuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgbG9ja2xlc3MgUkNVIHN5bmNocm9uaXphdGlvbiBmb3IgTmV0bGluayBzb2NrZXQgbXVsdGljYXN0IGdyb3VwcyAobmxrLVxcdTAwM2Vncm91cHMgYW5kIG5say1cXHUwMDNlbmdyb3VwcykgYWNyb3NzIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc2tfZGlhZ19kdW1wX2dyb3VwcygpLCBhbmQgbmV0bGlua19uYXRpdmVfc2VxX3Nob3coKS4gVGhpcyB0b3VjaGVzIGNvcmUgbmV0d29ya2luZyBjb25jdXJyZW5jeSBsb2dpYyByZWFjaGFibGUgZnJvbSB1c2Vyc3BhY2UgdmlhIG5ldGxpbmsgc29ja2V0IGJpbmQvc2V0c29ja29wdCwgc29ja19kaWFnIGR1bXAsIGFuZCAvcHJvYy9uZXQvbmV0bGluayByZWFkcy4gRnV6emluZyBpcyB3YXJyYW50ZWQgdG8gZGV0ZWN0IHBvdGVudGlhbCBkYXRhIHJhY2VzLCBtZW1vcnkgb3JkZXJpbmcgaXNzdWVzLCBvciBVQUZzLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo0Mi4zMzc3MTQ3M1oiLCJTZXEiOjI3LCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODYzNDkxMzExMjYsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo0Mi4zMzgxODY1N1oiLCJTZXEiOjI4LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjg2MzQ4NjMyMjU2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZXNvbHZlcyBhIGNvbmN1cnJlbmN5IGJ1ZyB3aGVyZSBga3JlYWxsb2MoKWAgaW1tZWRpYXRlbHkgZnJlZWQgYG5say1cXHUwMDNlZ3JvdXBzYCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIHVuZGVyIFJDVSAoYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KClgIGFuZCBgc2tfZGlhZ19kdW1wX2dyb3VwcygpYCkgY291bGQgYWNjZXNzIGl0IGNvbmN1cnJlbnRseSwgcmlza2luZyB1c2UtYWZ0ZXItZnJlZSAoVUFGKSBhbmQgb3V0LW9mLWJvdW5kcyAoT09CKSByZWFkcy4gVGhlc2UgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgKFVBRiBhbmQgT09CIGhlYXAgcmVhZHMpIGZhbGwgc3RyaWN0bHkgdW5kZXIgS0FTQU4ncyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzLiBcXG5cXG5Gcm9tIGEgS01TQU4gcGVyc3BlY3RpdmUsIHRoZSBuZXcgZ3JvdXBzIGJ1ZmZlciBpcyBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2MoKWAgd2hpY2ggemVyb2VzIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiwgZm9sbG93ZWQgYnkgY29weWluZyBleGlzdGluZyBncm91cCBkYXRhOyB0aHVzLCBhbGwgYnl0ZXMgb2YgdGhlIGJ1ZmZlciBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHB1YmxpY2F0aW9uLiBObyB1bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5LCBzdHJ1Y3QgcGFkZGluZ3MsIG9yIHVuaW5pdGlhbGl6ZWQgZGF0YSBsZWFrcyB0byB1c2Vyc3BhY2UgYXJlIGludHJvZHVjZWQgb3IgZXhwb3NlZC4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCA0OTUwNWZjYWIwODQ1MzNhNGFjYTFlZTA1NTkwYzFlNThiOTM3Y2EyXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMTc6Mjg6NDggMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcbmluZGV4IGU2YjFkOTc1OGM5YzkuLjlmZGY5NjQyMjRhYjQgMTAwNjQ0XG4tLS0gYS9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcbisrKyBiL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuY1xuQEAgLTkyMiw5ICs5MjIsOSBAQCBuZXRsaW5rX3VwZGF0ZV9zdWJzY3JpcHRpb25zKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IHN1YnNjcmlwdGlvbnMpXG4gXG4gc3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcbiB7XG4rXHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XG4gXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xuIFx0dW5zaWduZWQgaW50IGdyb3Vwcztcbi1cdHVuc2lnbmVkIGxvbmcgKm5ld19ncm91cHM7XG4gXHRpbnQgZXJyID0gMDtcbiBcbiBcdG5ldGxpbmtfdGFibGVfZ3JhYigpO1xuQEAgLTkzOCwxOCArOTM4LDM3IEBAIHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXG4gXHRpZiAobmxrLVx1MDAzZW5ncm91cHMgXHUwMDNlPSBncm91cHMpXG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcbi1cdG5ld19ncm91cHMgPSBrcmVhbGxvYyhubGstXHUwMDNlZ3JvdXBzLCBOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuLVx0aWYgKG5ld19ncm91cHMgPT0gTlVMTCkge1xuK1x0LyogQ2FuIG5vdCB1c2Uga3JlYWxsb2MoKSwgYmVjYXVzZSB0aGUgb2xkIGJ1ZmZlciBtaWdodCBiZSBmcmVlZFxuK1x0ICogaW1tZWRpYXRlbHksIHdoaWxlIGxvY2tsZXNzIHJlYWRlcnMgKG5ldGxpbmsgZGlhZyBkdW1wIGFuZFxuK1x0ICogL3Byb2MvbmV0L25ldGxpbmspIGNhbiBzdGlsbCBiZSBsb29raW5nIGF0IGl0LlxuK1x0ICovXG4rXHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xuK1x0aWYgKCFuZXdfZ3JvdXBzKSB7XG4gXHRcdGVyciA9IC1FTk9NRU07XG4gXHRcdGdvdG8gb3V0X3VubG9jaztcbiBcdH1cbi1cdG1lbXNldCgoY2hhciAqKW5ld19ncm91cHMgKyBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSwgMCxcbi1cdCAgICAgICBOTEdSUFNaKGdyb3VwcykgLSBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSk7XG4rXHRvbGRfZ3JvdXBzID0gbmxrLVx1MDAzZWdyb3VwcztcbitcdGlmIChvbGRfZ3JvdXBzKVxuK1x0XHRtZW1jcHkobmV3X2dyb3Vwcywgb2xkX2dyb3VwcywgTkxHUlBTWihubGstXHUwMDNlbmdyb3VwcykpO1xuK1xuK1x0LyogUHVibGlzaCB0aGUgbmV3IGJpdG1hcCBhbmQgaXRzIGNvbnRlbnQ6IHBhaXJzIHdpdGggdGhlIGFkZHJlc3NcbitcdCAqIGRlcGVuZGVuY3kgaW4gbG9ja2xlc3MgcmVhZGVycywgd2hpY2ggY2FuIHBpY2sgdXAgdGhlIG5ldyBwb2ludGVyXG4rXHQgKiB3aGlsZSBzdGlsbCBzZWVpbmcgdGhlIG9sZCAoc21hbGxlcikgbmxrLVx1MDAzZW5ncm91cHMuXG4rXHQgKi9cbitcdHNtcF9zdG9yZV9yZWxlYXNlKFx1MDAyNm5say1cdTAwM2Vncm91cHMsIG5ld19ncm91cHMpO1xuK1xuK1x0LyogVGhlbiBwdWJsaXNoIHRoZSBuZXcgc2l6ZTogcGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgZnJvbVxuK1x0ICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKVxuK1x0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cbitcdCAqL1xuK1x0c21wX3N0b3JlX3JlbGVhc2UoXHUwMDI2bmxrLVx1MDAzZW5ncm91cHMsIGdyb3Vwcyk7XG4gXG4tXHRubGstXHUwMDNlZ3JvdXBzID0gbmV3X2dyb3Vwcztcbi1cdG5say1cdTAwM2VuZ3JvdXBzID0gZ3JvdXBzO1xuICBvdXRfdW5sb2NrOlxuIFx0bmV0bGlua190YWJsZV91bmdyYWIoKTtcbitcbitcdGlmIChvbGRfZ3JvdXBzKVxuK1x0XHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfZ3JvdXBzKTtcbitcbiBcdHJldHVybiBlcnI7XG4gfVxuIFxuQEAgLTI3MDUsMTIgKzI3MjQsMTkgQEAgc3RhdGljIGludCBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdilcbiBcdH0gZWxzZSB7XG4gXHRcdHN0cnVjdCBzb2NrICpzID0gdjtcbiBcdFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHMpO1xuK1x0XHRjb25zdCB1bnNpZ25lZCBsb25nICpncm91cHM7XG4rXG4rXHRcdC8qIExvY2tsZXNzIHJlYWQgOiBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIGNoYW5nZVxuK1x0XHQgKiBubGstXHUwMDNlZ3JvdXBzIHVuZGVyIHVzLiBUaGUgb2xkIGJ1ZmZlciBpcyBmcmVlZCBhZnRlciBhblxuK1x0XHQgKiBSQ1UgZ3JhY2UgcGVyaW9kLCBhbmQgdGhpcyB3YWxrIGlzIFJDVSBwcm90ZWN0ZWQuXG4rXHRcdCAqL1xuK1x0XHRncm91cHMgPSBSRUFEX09OQ0UobmxrLVx1MDAzZWdyb3Vwcyk7XG4gXG4gXHRcdHNlcV9wcmludGYoc2VxLCBcIiVwSyAlLTNkICUtMTB1ICUwOHggJS04ZCAlLThkICUtNWQgJS04ZCAlLTh1ICUtOGxsdVxcblwiLFxuIFx0XHRcdCAgIHMsXG4gXHRcdFx0ICAgcy1cdTAwM2Vza19wcm90b2NvbCxcbiBcdFx0XHQgICBubGstXHUwMDNlcG9ydGlkLFxuLVx0XHRcdCAgIG5say1cdTAwM2Vncm91cHMgPyAodTMyKW5say1cdTAwM2Vncm91cHNbMF0gOiAwLFxuK1x0XHRcdCAgIGdyb3VwcyA/ICh1MzIpZ3JvdXBzWzBdIDogMCxcbiBcdFx0XHQgICBza19ybWVtX2FsbG9jX2dldChzKSxcbiBcdFx0XHQgICBza193bWVtX2FsbG9jX2dldChzKSxcbiBcdFx0XHQgICBSRUFEX09OQ0UobmxrLVx1MDAzZWNiX3J1bm5pbmcpLFxuZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2RpYWcuYyBiL25ldC9uZXRsaW5rL2RpYWcuY1xuaW5kZXggMGIzZTAyMWJkMGVkMi4uNzk3OWJkOWIyNjA2MCAxMDA2NDRcbi0tLSBhL25ldC9uZXRsaW5rL2RpYWcuY1xuKysrIGIvbmV0L25ldGxpbmsvZGlhZy5jXG5AQCAtMTIsMTIgKzEyLDI0IEBAXG4gc3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxuIHtcbiBcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XG4tXG4tXHRpZiAobmxrLVx1MDAzZWdyb3VwcyA9PSBOVUxMKVxuK1x0dW5zaWduZWQgbG9uZyAqZ3JvdXBzO1xuK1x0dW5zaWduZWQgaW50IG5ncm91cHM7XG4rXG4rXHQvKiBIYXNoZWQgc29ja2V0cyBhcmUgZHVtcGVkIGZyb20gdGhlIHJoYXNodGFibGUgd2Fsaywgd2hpY2ggb25seVxuK1x0ICogaG9sZHMgcmN1X3JlYWRfbG9jaygpLCB3aGlsZSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCkgY2FuIHJlcGxhY2VcbitcdCAqIG5say1cdTAwM2Vncm91cHMgYW5kIG5say1cdTAwM2VuZ3JvdXBzIGF0IGFueSB0aW1lLlxuK1x0ICpcbitcdCAqIFJlYWQgbmxrLVx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxuK1x0ICogZnJvbSBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKCksIHNvIHRoYXQgd2UgY2FuIG5vdCB1c2UgdGhlIG5ld1xuK1x0ICogKGJpZ2dlcikgc2l6ZSB3aXRoIHRoZSBvbGQgKHNtYWxsZXIpIGJ1ZmZlci4gVGhlIG9sZCBidWZmZXIgaXNcbitcdCAqIGZyZWVkIGFmdGVyIGFuIFJDVSBncmFjZSBwZXJpb2QuXG4rXHQgKi9cbitcdG5ncm91cHMgPSBzbXBfbG9hZF9hY3F1aXJlKFx1MDAyNm5say1cdTAwM2VuZ3JvdXBzKTtcbitcdGdyb3VwcyA9IFJFQURfT05DRShubGstXHUwMDNlZ3JvdXBzKTtcbitcdGlmICghZ3JvdXBzKVxuIFx0XHRyZXR1cm4gMDtcbiBcbi1cdHJldHVybiBubGFfcHV0KG5sc2tiLCBORVRMSU5LX0RJQUdfR1JPVVBTLCBOTEdSUFNaKG5say1cdTAwM2VuZ3JvdXBzKSxcbi1cdFx0ICAgICAgIG5say1cdTAwM2Vncm91cHMpO1xuK1x0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XG4gfVxuIFxuIHN0YXRpYyBpbnQgc2tfZGlhZ19wdXRfZmxhZ3Moc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKVxuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzA6NDIuMzM4MTg5MzhaIiwiU2VxIjoyOSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MTc0NTUyMjk5MDcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBOZXRsaW5rIEdyb3VwIFJlYWxsb2NhdGlvbiBQYXRjaCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGlzIHBhdGNoIG1vZGlmeWluZyBgbmV0L25ldGxpbmsvYWZfbmV0bGluay5jYCBhbmQgYG5ldC9uZXRsaW5rL2RpYWcuY2AuIEknbSBzZWVpbmcgY2hhbmdlcyBpbiBob3cgTmV0bGluayBncm91cHMgYXJlIHJlYWxsb2NhdGVkLCB3aGljaCBhbHdheXMgd2FycmFudHMgYSBjbG9zZSBsb29rLlxuXG5GaXJzdCwgaW4gYGFmX25ldGxpbmsuY2Agd2l0aGluIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYCwgdGhlIGFsbG9jYXRpb24gc3RyYXRlZ3kgaGFzIHNoaWZ0ZWQuIEluc3RlYWQgb2YgYGtyZWFsbG9jYCwgd2UncmUgbm93IHVzaW5nIGBremFsbG9jYC4gVGhhdCdzIHNtYXJ0OyBga3phbGxvY2AgemVyb2VzIHRoZSBuZXcgbWVtb3J5LiBUaGVuLCBgbWVtY3B5YCBjb3BpZXMgdGhlIGV4aXN0aW5nIGdyb3VwIGluZm9ybWF0aW9uIGZyb20gdGhlIG9sZCBidWZmZXIgdG8gdGhlIHplcm9lZCBuZXcgYnVmZmVyLCBhbmQgdGhlIG9sZCBidWZmZXIgaXMgZnJlZWQgdXNpbmcgUkNVIChga2ZyZWVfcmN1X21pZ2h0c2xlZXBgKS4gVGhpcyBpcyBhIHNvbGlkIGFwcHJvYWNoLCBndWFyYW50ZWVpbmcgYSBjbGVhbiBpbml0aWFsIHN0YXRlIGFuZCBsZXZlcmFnaW5nIFJDVSBmb3Igc2FmZSBkZWFsbG9jYXRpb24uIFRoaXMgcGF0dGVybiBpcyBmYWlybHkgY29tbW9uIG5vdywgYW5kIGF2b2lkcyBwb3RlbnRpYWxseSBleHBvc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeS5cblxuVGhlIGNvZGUgdGhlbiB1c2VzIGBzbXBfc3RvcmVfcmVsZWFzZWAgZm9yIGJvdGggYG5say1cdTAwM2Vncm91cHNgIGFuZCBgbmxrLVx1MDAzZW5ncm91cHNgLiBBbmQgaW4gYG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93YCBqdXN0IHJlYWRzIGBncm91cHNbMF1gIHNhZmVseS5cblxuTm93LCB0aGUgaW50ZXJlc3RpbmcgcGFydCBpcyB0aGUgYHNrX2RpYWdfZHVtcF9ncm91cHNgIGZ1bmN0aW9uIGluIGBuZXQvbmV0bGluay9kaWFnLmNgLiBJdCByZXRyaWV2ZXMgdGhlIGdyb3VwIGRhdGEgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuIEhlcmUsIGBuZ3JvdXBzYCAodGhlIG51bWJlciBvZiBncm91cHMpIGlzIGxvYWRlZCB1c2luZyBgc21wX2xvYWRfYWNxdWlyZWAgYW5kIGBncm91cHNgICh0aGUgYWN0dWFsIGdyb3VwIGFycmF5KSBpcyByZWFkIHVzaW5nIGBSRUFEX09OQ0VgLiBNeSBpbW1lZGlhdGUgY29uY2VybiBpcyB0aGUgbG9ja2xlc3MgYWNjZXNzIGFuZCB0aGUgb3JkZXJpbmcuXG5cbkknbSB0aGlua2luZzogQ291bGQgYG5ncm91cHNgIGFuZCBgZ3JvdXBzYCBiZSBtaXNtYXRjaGVkPyBMZXQncyB0cmFjZSBpdC4gVGhlIHdyaXRlcidzIHNpZGUgdXNlcyBgc21wX3N0b3JlX3JlbGVhc2VgIGZvciBgZ3JvdXBzYCBhbmQgdGhlbiBgbmdyb3Vwc2AuIEFuZCB0aGUgcmVhZGVyIHVzZXMgYHNtcF9sb2FkX2FjcXVpcmVgIGZvciBgbmdyb3Vwc2AgYW5kIHRoZW4gYFJFQURfT05DRWAgZm9yIGBncm91cHNgLlxuXG5HaXZlbiB0aGF0IHdlIGFyZSB1c2luZyBhY3F1aXJlL3JlbGVhc2Ugc2VtYW50aWNzOiBpZiB0aGUgcmVhZGVyIHNlZXMgYSBuZXcgYG5ncm91cHNgLCBpdCBpcyAqZ3VhcmFudGVlZCogdG8gc2VlIHRoZSBjb3JyZXNwb25kaW5nIGBncm91cHNgIChvciBldmVuIGEgbmV3ZXIgdmVyc2lvbikuIElmIHRoZSByZWFkZXIgc2VlcyB0aGUgKm9sZCogYG5ncm91cHNgLCB0aGVuIGBncm91cHNgIGNvdWxkIGVpdGhlciBiZSB0aGUgYG9sZF9ncm91cHNgIG9yIHRoZSBgbmV3X2dyb3Vwc2AuIEJ1dCBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZ3JvdXBzIGFycmF5IGhhcyBiZWVuIHJlYWxsb2NhdGVkLCB3ZSBhcmUgcmVhZGluZyBmcm9tIGBuZXdfZ3JvdXBzYCB1c2luZyB0aGUgc21hbGxlciBzaXplIGBOTEdSUFNaKG9sZF9uZ3JvdXBzKWAsIHNvIGl0J3MgZ3VhcmFudGVlZCB0byBiZSB3aXRoaW4gYm91bmRzLiBJZiB0aGUgcmVhZGVyIHNlZXMgYG9sZF9ncm91cHNgIHRoaXMgaXMgYWxzbyB2YWxpZCBhbmQgUkNVIHByb3RlY3RlZC4gV2UgY2FuIGVuc3VyZSB0aGUgYmFycmllciBlbnN1cmVzIHRoZSBzaXplIHJlYWQgaXMgd2l0aGluIGJvdW5kcy4gVGhpcyBsb2dpYyBhdm9pZHMgYW55IHBvc3NpYmxlIG91dC1vZi1ib3VuZHMgcmVhZHMuXG5cblRoZXJlIGlzIHRoZSBjYXNlIG9mIGluaXRpYWwgc3RhdGUsIHdoZXJlIGBncm91cHNgIHN0YXJ0cyBhcyBOVUxMLiBJIHdpbGwgbmVlZCB0byBjaGVjayBob3cgYG5say1cdTAwM2Vncm91cHNgIGFuZCBgbmxrLVx1MDAzZW5ncm91cHNgIGFyZSBpbml0aWFsaXplZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MzQyMSwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjExMzcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo1OS43OTM0MjIzMzZaIiwiU2VxIjozMCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1Mzg5NTMyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5say1cXHUwMDNlZ3JvdXBzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NzA0PXN0YXRpYyB2b2lkIGRlZmVycmVkX3B1dF9ubGtfc2soc3RydWN0IHJjdV9oZWFkICpoZWFkKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTcwOC1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6NzA5OlxcdGtmcmVlKG5say1cXHUwMDNlZ3JvdXBzKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6NzEwOlxcdG5say1cXHUwMDNlZ3JvdXBzID0gTlVMTDtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzExLVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTcxOD1zdGF0aWMgaW50IG5ldGxpbmtfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTczNC1cXHRpZiAobmxrLVxcdTAwM2VuZXRsaW5rX3JlbGVhc2UpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjczNTpcXHRcXHRubGstXFx1MDAzZW5ldGxpbmtfcmVsZWFzZShzaywgbmxrLVxcdTAwM2Vncm91cHMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy03MzYtXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNzQzLVxcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBubGstXFx1MDAzZW5ncm91cHM7IGkrKylcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6NzQ0OlxcdFxcdFxcdGlmICh0ZXN0X2JpdChpLCBubGstXFx1MDAzZWdyb3VwcykpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTc0NS1cXHRcXHRcXHRcXHRubGstXFx1MDAzZW5ldGxpbmtfdW5iaW5kKHNvY2tfbmV0KHNrKSwgaSArIDEpO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTkyMz1zdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk0OS1cXHR9XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1MDpcXHRvbGRfZ3JvdXBzID0gbmxrLVxcdTAwM2Vncm91cHM7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1MS1cXHRpZiAob2xkX2dyb3VwcylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NTctXFx0ICovXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk1ODpcXHRzbXBfc3RvcmVfcmVsZWFzZShcXHUwMDI2bmxrLVxcdTAwM2Vncm91cHMsIG5ld19ncm91cHMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NTktXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTg5PXN0YXRpYyBpbnQgbmV0bGlua19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkcl91bnNpemVkICphZGRyLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwNTctXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwNTg6XFx0aWYgKCFncm91cHMgXFx1MDAyNlxcdTAwMjYgKG5say1cXHUwMDNlZ3JvdXBzID09IE5VTEwgfHwgISh1MzIpbmxrLVxcdTAwM2Vncm91cHNbMF0pKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDU5LVxcdFxcdGdvdG8gdW5sb2NrO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwNjQtXFx0XFx0XFx0XFx0XFx0IGh3ZWlnaHQzMihncm91cHMpIC1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTA2NTpcXHRcXHRcXHRcXHRcXHQgaHdlaWdodDMyKG5say1cXHUwMDNlZ3JvdXBzWzBdKSk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwNjY6XFx0bmxrLVxcdTAwM2Vncm91cHNbMF0gPSAobmxrLVxcdTAwM2Vncm91cHNbMF0gXFx1MDAyNiB+MHhmZmZmZmZmZlVMKSB8IGdyb3VwcztcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTA2Ny1cXHRuZXRsaW5rX3VwZGF0ZV9saXN0ZW5lcnMoc2spO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTExMjQ9c3RhdGljIGludCBuZXRsaW5rX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICphZGRyLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTExNDEtXFx0XFx0bmV0bGlua19sb2NrX3RhYmxlKCk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjExNDI6XFx0XFx0bmxhZGRyLVxcdTAwM2VubF9ncm91cHMgPSBubGstXFx1MDAzZWdyb3VwcyA/IG5say1cXHUwMDNlZ3JvdXBzWzBdIDogMDtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTE0My1cXHRcXHRuZXRsaW5rX3VubG9ja190YWJsZSgpO1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTE0NDI9c3RhdGljIHZvaWQgZG9fb25lX2Jyb2FkY2FzdChzdHJ1Y3Qgc29jayAqc2ssXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTQ1MS1cXHRpZiAobmxrLVxcdTAwM2Vwb3J0aWQgPT0gcC1cXHUwMDNlcG9ydGlkIHx8IHAtXFx1MDAzZWdyb3VwIC0gMSBcXHUwMDNlPSBubGstXFx1MDAzZW5ncm91cHMgfHxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTQ1MjpcXHQgICAgIXRlc3RfYml0KHAtXFx1MDAzZWdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMpKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNDUzLVxcdFxcdHJldHVybjtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNTk0PXN0YXRpYyBpbnQgZG9fb25lX3NldF9lcnIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgKnApXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTYwNS1cXHRpZiAobmxrLVxcdTAwM2Vwb3J0aWQgPT0gcC1cXHUwMDNlcG9ydGlkIHx8IHAtXFx1MDAzZWdyb3VwIC0gMSBcXHUwMDNlPSBubGstXFx1MDAzZW5ncm91cHMgfHxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MTYwNjpcXHQgICAgIXRlc3RfYml0KHAtXFx1MDAzZWdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMpKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjA3LVxcdFxcdGdvdG8gb3V0O1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTE2NTQ9c3RhdGljIHZvaWQgbmV0bGlua191cGRhdGVfc29ja2V0X21jKHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayxcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjU5LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjYwOlxcdG9sZCA9IHRlc3RfYml0KGdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjYxLVxcdHN1YnNjcmlwdGlvbnMgPSBubGstXFx1MDAzZXN1YnNjcmlwdGlvbnMgLSBvbGQgKyBuZXc7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjE2NjI6XFx0X19hc3NpZ25fYml0KGdyb3VwIC0gMSwgbmxrLVxcdTAwM2Vncm91cHMsIG5ldyk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE2NjMtXFx0bmV0bGlua191cGRhdGVfc3Vic2NyaXB0aW9ucyhcXHUwMDI2bmxrLVxcdTAwM2Vzaywgc3Vic2NyaXB0aW9ucyk7XFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MTc0Mz1zdGF0aWMgaW50IG5ldGxpbmtfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTE3NzgtXFx0XFx0XFx0c2hpZnQgPSAocG9zICUgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSAqIDg7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjE3Nzk6XFx0XFx0XFx0Z3JvdXAgPSAodTMyKShubGstXFx1MDAzZWdyb3Vwc1tpZHhdIFxcdTAwM2VcXHUwMDNlIHNoaWZ0KTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTc4MC1cXHRcXHRcXHRpZiAoY29weV90b19pdGVyKFxcdTAwMjZncm91cCwgc2l6ZW9mKHUzMiksXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjktXFx0XFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3MzA6XFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzEtXFx0XFx0ICogUkNVIGdyYWNlIHBlcmlvZCwgYW5kIHRoaXMgd2FsayBpcyBSQ1UgcHJvdGVjdGVkLlxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yNzMyLVxcdFxcdCAqL1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyNzMzOlxcdFxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzQtXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jLTE5LVxcdCAqIGhvbGRzIHJjdV9yZWFkX2xvY2soKSwgd2hpbGUgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiByZXBsYWNlXFxubmV0L25ldGxpbmsvZGlhZy5jOjIwOlxcdCAqIG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXFxubmV0L25ldGxpbmsvZGlhZy5jLTIxLVxcdCAqXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmMtMjctXFx0bmdyb3VwcyA9IHNtcF9sb2FkX2FjcXVpcmUoXFx1MDAyNm5say1cXHUwMDNlbmdyb3Vwcyk7XFxubmV0L25ldGxpbmsvZGlhZy5jOjI4OlxcdGdyb3VwcyA9IFJFQURfT05DRShubGstXFx1MDAzZWdyb3Vwcyk7XFxubmV0L25ldGxpbmsvZGlhZy5jLTI5LVxcdGlmICghZ3JvdXBzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMDo1OS44Mzg4MTY5OTlaIiwiU2VxIjozMSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6NzUwMjE0NzYxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGEgc2Vhc29uZWQgcHJvZmVzc2lvbmFsIGluIHRoZSBmaWVsZCwgc3BlYWtpbmcgZGlyZWN0bHkgdG8gbXlzZWxmOlxuXG4qKkRpdmluZyBpbnRvIE5ldGxpbmsgU29ja2V0IENyZWF0aW9uKipcblxuQWxyaWdodCwgdGltZSB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgZGlzc2VjdCB0aGUgbmV0bGluayBzb2NrZXQgY3JlYXRpb24gcHJvY2Vzcy4gSXQncyBiZWVuIGEgd2hpbGUgc2luY2UgSSBsYXN0IGR1ZyBpbnRvIHRoZSBsb3ctbGV2ZWwgZGV0YWlscywgYW5kIGEgcXVpY2sgcmUtZXhhbWluYXRpb24gbmV2ZXIgaHVydHMuIEkgd2FudCB0byBtYWtlIHN1cmUgSSBoYXZlIGEgc29saWQgZ3Jhc3Agb24gaG93IHRoZXNlIHNvY2tldHMgYXJlIGFjdHVhbGx5IGJyb3VnaHQgdG8gbGlmZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGluaXRpYWwgc2V0dXAsIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBjYWxscywgYW5kIHRoZSB0eXBpY2FsIGZsb3cgb2YgZGF0YS4gV2hhdCBwYXJhbWV0ZXJzIGFyZSBpbnZvbHZlZD8gQXJlIHRoZXJlIGFueSBzdWJ0bGUgbnVhbmNlcyBvciBwb3RlbnRpYWwgcGl0ZmFsbHMgaW4gdGhlIHNldHVwIHRoYXQgSSBzaG91bGQgYmUgbWluZGZ1bCBvZiwgZnJvbSBhIHBlcmZvcm1hbmNlIG9yIHNlY3VyaXR5IHN0YW5kcG9pbnQ/IFRoZSBkZXZpbCdzIG9mdGVuIGluIHRoZSBkZXRhaWxzLCBzbyBsZXQncyBzdGFydCB3aXRoIGEgc3lzdGVtYXRpYyBhcHByb2FjaCBhbmQgd29yayBvdXIgd2F5IHRocm91Z2ggaXQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjcxNzAsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMTowNy4zNDA5Njg4MDZaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NzQ0NzAyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIk5MR1JQU1pcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibmV0L25ldGxpbmsvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz05MjM9c3RhdGljIGludCBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NDQtXFx0ICovXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjk0NTpcXHRuZXdfZ3JvdXBzID0ga3phbGxvYyhOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NDYtXFx0aWYgKCFuZXdfZ3JvdXBzKSB7XFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTUxLVxcdGlmIChvbGRfZ3JvdXBzKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NTI6XFx0XFx0bWVtY3B5KG5ld19ncm91cHMsIG9sZF9ncm91cHMsIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk1My1cXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NjAtXFx0LyogVGhlbiBwdWJsaXNoIHRoZSBuZXcgc2l6ZTogcGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgZnJvbVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NjE6XFx0ICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05NjItXFx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMDI2PV9fbmV0bGlua19rZXJuZWxfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgaW50IHVuaXQsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSxcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMDUyLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyMDUzOlxcdGxpc3RlbmVycyA9IGt6YWxsb2Moc2l6ZW9mKCpsaXN0ZW5lcnMpICsgTkxHUlBTWihncm91cHMpLCBHRlBfS0VSTkVMKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjA1NC1cXHRpZiAoIWxpc3RlbmVycylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yMTA3PWludCBfX25ldGxpbmtfY2hhbmdlX25ncm91cHMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgZ3JvdXBzKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIxMTQtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMTU6XFx0aWYgKE5MR1JQU1oodGJsLVxcdTAwM2Vncm91cHMpIFxcdTAwM2MgTkxHUlBTWihncm91cHMpKSB7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIxMTY6XFx0XFx0bmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldykgKyBOTEdSUFNaKGdyb3VwcyksIEdGUF9BVE9NSUMpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTE3LVxcdFxcdGlmICghbmV3KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIxMTktXFx0XFx0b2xkID0gbmxfZGVyZWZfcHJvdGVjdGVkKHRibC1cXHUwMDNlbGlzdGVuZXJzKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM6MjEyMDpcXHRcXHRtZW1jcHkobmV3LVxcdTAwM2VtYXNrcywgb2xkLVxcdTAwM2VtYXNrcywgTkxHUlBTWih0YmwtXFx1MDAzZWdyb3VwcykpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yMTIxLVxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcih0YmwtXFx1MDAzZWxpc3RlbmVycywgbmV3KTtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0yODc3PXN0YXRpYyB2b2lkIF9faW5pdCBuZXRsaW5rX2FkZF91c2Vyc29ja19lbnRyeSh2b2lkKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI4ODEtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI4ODI6XFx0bGlzdGVuZXJzID0ga3phbGxvYyhzaXplb2YoKmxpc3RlbmVycykgKyBOTEdSUFNaKGdyb3VwcyksIEdGUF9LRVJORUwpO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODgzLVxcdGlmICghbGlzdGVuZXJzKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oPTEwPWVudW0ge1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oLTIwLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuaDoyMTojZGVmaW5lIE5MR1JQU1ooeClcXHQoQUxJR04oeCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgLyA4KVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuaDoyMjojZGVmaW5lIE5MR1JQTE9OR1MoeClcXHQoTkxHUlBTWih4KS9zaXplb2YodW5zaWduZWQgbG9uZykpXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5oLTIzLVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jPTEyPXN0YXRpYyBpbnQgc2tfZGlhZ19kdW1wX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpubHNrYilcXG4tLVxcbm5ldC9uZXRsaW5rL2RpYWcuYy0zMS1cXG5uZXQvbmV0bGluay9kaWFnLmM6MzI6XFx0cmV0dXJuIG5sYV9wdXQobmxza2IsIE5FVExJTktfRElBR19HUk9VUFMsIE5MR1JQU1oobmdyb3VwcyksIGdyb3Vwcyk7XFxubmV0L25ldGxpbmsvZGlhZy5jLTMzLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6MDcuMzg3NzE5NTM4WiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjIzNDE4MTM4NDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBhIHN1bW1hcnkgb2YgbXkgaW1tZWRpYXRlIHRob3VnaHQgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBOZXRsaW5rIEdyb3VwIE1hbmFnZW1lbnQqKlxuXG5Pa2F5LCBzbyBJJ20gdGhpbmtpbmcgYWJvdXQgaG93IE5ldGxpbmsgZ3JvdXAgbWVtYmVyc2hpcCBpcyBoYW5kbGVkIHdoZW4gYSBzb2NrZXQgaXMgZmlyc3QgY3JlYXRlZC4gTXkgaW5zdGluY3QgaXMgdG8gemVybyBpbiBvbiBgbmV0bGlua19jcmVhdGVgIGFuZCB0aGUgc29ja2V0IGFsbG9jYXRpb24gaXRzZWxmLiBTcGVjaWZpY2FsbHksIEkgbmVlZCB0byBrbm93IHRoZSAqaW5pdGlhbCogc3RhdGUgb2YgYG5say1cdTAwM2Vncm91cHNgIGluIHRoYXQgZnJlc2hseSBtaW50ZWQgc29ja2V0LiBUaGF0J3MgdGhlIGtleSBzdGFydGluZyBwb2ludCB0byB1bmRlcnN0YW5kIGhvdyBncm91cHMgYXJlIGFkZGVkIGFuZCByZW1vdmVkIGxhdGVyLiBJJ2xsIG5lZWQgdG8gdHJhY2UgdGhlIGNvZGUgaW4gYG5ldGxpbmtfY3JlYXRlYCBhbmQgdGhlIHJlbGF0ZWQgc29ja2V0IGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLCB0byBkZXRlcm1pbmUgd2hldGhlciBncm91cHMgYXJlIGluaXRpYWxpemVkLCB3aGF0IHRoZSBkZWZhdWx0IGlzLCBpZiB0aGVyZSBpcyBhIGRlZmF1bHQgYXQgYWxsLCBhbmQgcGVyaGFwcyB3aGV0aGVyIHRoaXMgaXMgYSBzdGF0aWMgb3IgZHluYW1pYyBhbGxvY2F0aW9uLiBJIGV4cGVjdCB0aGVyZSB0byBiZSBhdCBsZWFzdCBzb21lIHJlbGV2YW50IGluaXRpYWxpemF0aW9uIGluIHRoaXMgc3BhY2UuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjg0NTIsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMTowOS43Mjk1MzYyMTlaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3NTUxODkyLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIm5ldGxpbmtfY3JlYXRlXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9NjEzPXN0YXRpYyBzdHJ1Y3QgcHJvdG8gbmV0bGlua19wcm90byA9IHtcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02MTgtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjYxOTpzdGF0aWMgaW50IF9fbmV0bGlua19jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLFxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy02MjAtXFx0XFx0XFx0ICAgIGludCBwcm90b2NvbCwgaW50IGtlcm4pXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjQ0LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo2NDU6c3RhdGljIGludCBuZXRsaW5rX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBwcm90b2NvbCxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjQ2LVxcdFxcdFxcdCAgaW50IGtlcm4pXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjg0LVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo2ODU6XFx0ZXJyID0gX19uZXRsaW5rX2NyZWF0ZShuZXQsIHNvY2ssIHByb3RvY29sLCBrZXJuKTtcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtNjg2LVxcdGlmIChlcnIgXFx1MDAzYyAwKVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTIwMjY9X19uZXRsaW5rX2tlcm5lbF9jcmVhdGUoc3RydWN0IG5ldCAqbmV0LCBpbnQgdW5pdCwgc3RydWN0IG1vZHVsZSAqbW9kdWxlLFxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIwNDItXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjIwNDM6XFx0aWYgKF9fbmV0bGlua19jcmVhdGUobmV0LCBzb2NrLCB1bml0LCAxKSBcXHUwMDNjIDApXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTIwNDQtXFx0XFx0Z290byBvdXRfc29ja19yZWxlYXNlX25vc2s7XFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9Mjg1ND1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9wcm90b19mYW1pbHkgbmV0bGlua19mYW1pbHlfb3BzID0ge1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0yODU1LVxcdC5mYW1pbHkgPSBQRl9ORVRMSU5LLFxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoyODU2OlxcdC5jcmVhdGUgPSBuZXRsaW5rX2NyZWF0ZSxcXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMjg1Ny1cXHQub3duZXJcXHQ9IFRISVNfTU9EVUxFLFxcdC8qIGZvciBjb25zaXN0ZW5jeSA4KSAqL1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMTowOS43NzcwOTQzMzJaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6MjcwNDU2NjE0MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gcmVhZGluZyBhbmQgdGhpbmtpbmcgYWJvdXQgdGhlIGNvZGU6XG5cbioqRGl2aW5nIGludG8gYF9fbmV0bGlua19jcmVhdGVgKipcblxuQWxyaWdodCwgbGV0J3MgZ2V0IGRvd24gdG8gaXQuIFRpbWUgdG8gZGlzc2VjdCBgX19uZXRsaW5rX2NyZWF0ZWAgaW4gYG5ldC9uZXRsaW5rL2FmX25ldGxpbmsuY2AuIEknbSBjdXJpb3VzIHRvIHNlZSBob3cgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBpbml0aWFsIGNyZWF0aW9uIG9mIGEgTmV0bGluayBzb2NrZXQuIFdlJ3JlIHRhbGtpbmcgYWJvdXQgdGhlIGxvdy1sZXZlbCBzdHVmZiBoZXJlLCBzZXR0aW5nIHRoZSBmb3VuZGF0aW9uIGZvciBhbGwgdGhlIE5ldGxpbmsgY29tbXVuaWNhdGlvbiB0aGF0J3MgZ29pbmcgdG8gaGFwcGVuLiBJIGV4cGVjdCB0byBzZWUgdGhlIGtlcm5lbCBjb25maWd1cmluZyB0aGUgc29ja2V0J3MgYmFzaWMgc3RydWN0dXJlLCBhbGxvY2F0aW5nIG1lbW9yeSwgYW5kIHByb2JhYmx5IHNldHRpbmcgdXAgc29tZSBpbml0aWFsIHN0YXRlIG9yIHF1ZXVlcy4gS25vd2luZyB0aGUgaW50ZXJuYWxzIGhlcmUgaXMgY3JpdGljYWwgdG8gdW5kZXJzdGFuZGluZyBob3cgbW9yZSBhZHZhbmNlZCBzb2NrZXQgZnVuY3Rpb25hbGl0aWVzIGFyZSBpbXBsZW1lbnRlZCBsYXRlciBvbiBpbiB0aGUgTmV0bGluayBzdWJzeXN0ZW0uIEhvcGVmdWxseSwgSSdsbCBzZWUgc29tZSBvYnZpb3VzIGNvbm5lY3Rpb24gdG8gdGhlIE5ldGxpbmsgZmFtaWx5IHN0cnVjdHVyZXMgYW5kIGFkZHJlc3MgZmFtaWxpZXMsIGFzIHdlbGwuIExldCdzIHNlZSBpZiB0aGlzIGNvZGUgY29uZmlybXMgd2hhdCBJIGFscmVhZHkga25vdyBhYm91dCBuZXRsaW5rLCBvciBhZGRzIHNvbWUgd3JpbmtsZXMgdG8gbXkgbWVudGFsIG1vZGVsLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5MjA1LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6MTIuNDgxNjYzMTI0WiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjQwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjE4LFxuICBcIkxpbmVDb3VudFwiOiA0MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNjE4OlxcdFxcbiA2MTk6XFx0c3RhdGljIGludCBfX25ldGxpbmtfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jayxcXG4gNjIwOlxcdFxcdFxcdFxcdCAgICBpbnQgcHJvdG9jb2wsIGludCBrZXJuKVxcbiA2MjE6XFx0e1xcbiA2MjI6XFx0XFx0c3RydWN0IHNvY2sgKnNrO1xcbiA2MjM6XFx0XFx0c3RydWN0IG5ldGxpbmtfc29jayAqbmxrO1xcbiA2MjQ6XFx0XFxuIDYyNTpcXHRcXHRzb2NrLVxcdTAwM2VvcHMgPSBcXHUwMDI2bmV0bGlua19vcHM7XFxuIDYyNjpcXHRcXG4gNjI3OlxcdFxcdHNrID0gc2tfYWxsb2MobmV0LCBQRl9ORVRMSU5LLCBHRlBfS0VSTkVMLCBcXHUwMDI2bmV0bGlua19wcm90bywga2Vybik7XFxuIDYyODpcXHRcXHRpZiAoIXNrKVxcbiA2Mjk6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuIDYzMDpcXHRcXG4gNjMxOlxcdFxcdHNvY2tfaW5pdF9kYXRhKHNvY2ssIHNrKTtcXG4gNjMyOlxcdFxcbiA2MzM6XFx0XFx0bmxrID0gbmxrX3NrKHNrKTtcXG4gNjM0OlxcdFxcdG11dGV4X2luaXQoXFx1MDAyNm5say1cXHUwMDNlbmxfY2JfbXV0ZXgpO1xcbiA2MzU6XFx0XFx0bG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUoXFx1MDAyNm5say1cXHUwMDNlbmxfY2JfbXV0ZXgsXFxuIDYzNjpcXHRcXHRcXHRcXHRcXHRcXHQgICBubGtfY2JfbXV0ZXhfa2V5cyArIHByb3RvY29sLFxcbiA2Mzc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgbmxrX2NiX211dGV4X2tleV9zdHJpbmdzW3Byb3RvY29sXSk7XFxuIDYzODpcXHRcXHRpbml0X3dhaXRxdWV1ZV9oZWFkKFxcdTAwMjZubGstXFx1MDAzZXdhaXQpO1xcbiA2Mzk6XFx0XFxuIDY0MDpcXHRcXHRzay1cXHUwMDNlc2tfZGVzdHJ1Y3QgPSBuZXRsaW5rX3NvY2tfZGVzdHJ1Y3Q7XFxuIDY0MTpcXHRcXHRzay1cXHUwMDNlc2tfcHJvdG9jb2wgPSBwcm90b2NvbDtcXG4gNjQyOlxcdFxcdHJldHVybiAwO1xcbiA2NDM6XFx0fVxcbiA2NDQ6XFx0XFxuIDY0NTpcXHRzdGF0aWMgaW50IG5ldGxpbmtfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sLFxcbiA2NDY6XFx0XFx0XFx0XFx0ICBpbnQga2VybilcXG4gNjQ3OlxcdHtcXG4gNjQ4OlxcdFxcdHN0cnVjdCBtb2R1bGUgKm1vZHVsZSA9IE5VTEw7XFxuIDY0OTpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGs7XFxuIDY1MDpcXHRcXHRpbnQgKCpiaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XFxuIDY1MTpcXHRcXHR2b2lkICgqdW5iaW5kKShzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCk7XFxuIDY1MjpcXHRcXHR2b2lkICgqcmVsZWFzZSkoc3RydWN0IHNvY2sgKnNvY2ssIHVuc2lnbmVkIGxvbmcgKmdyb3Vwcyk7XFxuIDY1MzpcXHRcXHRpbnQgZXJyID0gMDtcXG4gNjU0OlxcdFxcbiA2NTU6XFx0XFx0c29jay1cXHUwMDNlc3RhdGUgPSBTU19VTkNPTk5FQ1RFRDtcXG4gNjU2OlxcdFxcbiA2NTc6XFx0XFx0aWYgKHNvY2stXFx1MDAzZXR5cGUgIT0gU09DS19SQVcgXFx1MDAyNlxcdTAwMjYgc29jay1cXHUwMDNldHlwZSAhPSBTT0NLX0RHUkFNKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQxNzozMToxMi40ODE4OTI5MTRaIiwiU2VxIjozNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjgtZmxhc2giLCJEdXJhdGlvbiI6Mjg0ODgwMTY0OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJ20gdGhpbmtpbmcgdGhyb3VnaCB0aGlzIHByb2Nlc3M6XG5cbioqRGl2aW5nIGludG8gTmV0bGluayBHcm91cCBBbGxvY2F0aW9uKipcblxuT2theSwgc28gYHNrX2FsbG9jYCBkb2VzIGl0cyB0aGluZyBhbmQgemVyb3Mgb3V0IHRoZSBlbnRpcmUgc29ja2V0IHN0cnVjdHVyZS4gVGhhdCBpbmNsdWRlcyB0aGUgYG5ldGxpbmtfc29ja2AgcGFydCwgd2hpY2ggbWVhbnMgYG5say1cdTAwM2Vncm91cHNgIHN0YXJ0cyBhcyBOVUxMIGFuZCBgbmxrLVx1MDAzZW5ncm91cHNgIGlzLCBuYXR1cmFsbHksIHplcm8uIEdvb2QuIFRoYXQncyBhIGNsZWFuIHNsYXRlLlxuXG5Ob3csIHRoZSBpbnRlcmVzdGluZyBwYXJ0OiBob3cgZG8gd2UgYWxsb2NhdGUgdGhvc2UgTmV0bGluayBncm91cHM/IExldCdzIHRyYWNlIGl0IHRocm91Z2guIFdoZXJlIGRvZXMgYG5ldGxpbmtfcmVhbGxvY19ncm91cHNgIGdldCBjYWxsZWQgZnJvbT8gVGltZSB0byBnbyBodW50aW5nIGZvciB0aGUgY2FsbCBzaXRlcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hlbiBhbmQgd2h5IHRoZSBrZXJuZWwgZGVjaWRlcyB0byBleHBhbmQgdGhlIGdyb3VwIGxpc3QuIFRoaXMgaXMgYSBjcml0aWNhbCBwb2ludCB0byBwaW5wb2ludCB0aGUgYmVoYXZpb3Igc3Vycm91bmRpbmcgZ3JvdXAgbWVtYmVyc2hpcCBjaGFuZ2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDA5MCwiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjgyLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6MTUuMzMwNjk4MDUzWiIsIlNlcSI6MzgsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjM4Mzc5MiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm5ldC9uZXRsaW5rL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTEyPW5ldGxpbmtfdXBkYXRlX3N1YnNjcmlwdGlvbnMoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBpbnQgc3Vic2NyaXB0aW9ucylcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjItXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjkyMzpzdGF0aWMgaW50IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc3RydWN0IHNvY2sgKnNrKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy05MjQte1xcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jPTk4OT1zdGF0aWMgaW50IG5ldGxpbmtfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHJfdW5zaXplZCAqYWRkcixcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xMDEwLVxcdFxcdFxcdHJldHVybiAtRVBFUk07XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjEwMTE6XFx0XFx0ZXJyID0gbmV0bGlua19yZWFsbG9jX2dyb3Vwcyhzayk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTEwMTItXFx0XFx0aWYgKGVycilcXG4tLVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYz0xNjY3PXN0YXRpYyBpbnQgbmV0bGlua19zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtMTY5MS1cXHRcXHRcXHRyZXR1cm4gLUVQRVJNO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzoxNjkyOlxcdFxcdGVyciA9IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoc2spO1xcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYy0xNjkzLVxcdFxcdGlmIChlcnIpXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9MjcxOD1zdGF0aWMgaW50IG5ldGxpbmtfbmF0aXZlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KVxcbi0tXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MjgtXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jOjI3Mjk6XFx0XFx0LyogTG9ja2xlc3MgcmVhZCA6IG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSBjYW4gY2hhbmdlXFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTI3MzAtXFx0XFx0ICogbmxrLVxcdTAwM2Vncm91cHMgdW5kZXIgdXMuIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIGFmdGVyIGFuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmM9MTI9c3RhdGljIGludCBza19kaWFnX2R1bXBfZ3JvdXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKVxcbi0tXFxubmV0L25ldGxpbmsvZGlhZy5jLTE4LVxcdC8qIEhhc2hlZCBzb2NrZXRzIGFyZSBkdW1wZWQgZnJvbSB0aGUgcmhhc2h0YWJsZSB3YWxrLCB3aGljaCBvbmx5XFxubmV0L25ldGxpbmsvZGlhZy5jOjE5OlxcdCAqIGhvbGRzIHJjdV9yZWFkX2xvY2soKSwgd2hpbGUgbmV0bGlua19yZWFsbG9jX2dyb3VwcygpIGNhbiByZXBsYWNlXFxubmV0L25ldGxpbmsvZGlhZy5jLTIwLVxcdCAqIG5say1cXHUwMDNlZ3JvdXBzIGFuZCBubGstXFx1MDAzZW5ncm91cHMgYXQgYW55IHRpbWUuXFxuLS1cXG5uZXQvbmV0bGluay9kaWFnLmMtMjItXFx0ICogUmVhZCBubGstXFx1MDAzZW5ncm91cHMgZmlyc3QgOiB0aGlzIHBhaXJzIHdpdGggc21wX3N0b3JlX3JlbGVhc2UoKVxcbm5ldC9uZXRsaW5rL2RpYWcuYzoyMzpcXHQgKiBmcm9tIG5ldGxpbmtfcmVhbGxvY19ncm91cHMoKSwgc28gdGhhdCB3ZSBjYW4gbm90IHVzZSB0aGUgbmV3XFxubmV0L25ldGxpbmsvZGlhZy5jLTI0LVxcdCAqIChiaWdnZXIpIHNpemUgd2l0aCB0aGUgb2xkIChzbWFsbGVyKSBidWZmZXIuIFRoZSBvbGQgYnVmZmVyIGlzXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMxOjE1LjM3NzA4ODE2NVoiLCJTZXEiOjM5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuOC1mbGFzaCIsIkR1cmF0aW9uIjoyNzg3NTY1MDYwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYC4gSSBuZWVkIHRvIHJlYWxseSB1bmRlcnN0YW5kIHRoaXMgZnVuY3Rpb24sIGl0cyBwdXJwb3NlLCBhbmQgdGhlIGltcGxpY2F0aW9ucyBvZiBpdHMgb3BlcmF0aW9uIHdpdGhpbiB0aGUgYnJvYWRlciBuZXRsaW5rIGZyYW1ld29yay4gSSdtIGdvaW5nIHRvIGJyZWFrIGl0IGRvd24sIHBpZWNlIGJ5IHBpZWNlLCBjb25zaWRlcmluZyB0aGUgcG9zc2libGUgZWRnZSBjYXNlcyBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIG90aGVyIG5ldGxpbmsgY29tcG9uZW50cy4gSSdsbCBuZWVkIHRvIHRoaW5rIGFib3V0IG1lbW9yeSBtYW5hZ2VtZW50LCBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb25zLCBhbmQgZXJyb3IgaGFuZGxpbmcg4oCTIGV2ZXJ5dGhpbmcgdGhhdCBjb3VsZCBnbyB3cm9uZyBvciB0aGF0IG5lZWRzIHRvIGJlIHByb3Blcmx5IGhhbmRsZWQgZm9yIHJvYnVzdCBiZWhhdmlvci4gSSdsbCBtZW50YWxseSBzdGVwIHRocm91Z2ggdGhlIGV4ZWN1dGlvbiBmbG93LCB0cmFjaW5nIHRoZSBkYXRhJ3MgcGF0aCBhbmQgd2hhdCB0aGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHByb3RlY3RpbmcgYW5kIGVuc3VyaW5nLiBJJ2xsIGZvY3VzIHBhcnRpY3VsYXJseSBvbiBob3cgaXQgaGFuZGxlcyBncm91cCBtYW5hZ2VtZW50LCBlc3BlY2lhbGx5IGluIGR5bmFtaWMgZW52aXJvbm1lbnRzLCBhbmQgaG93IGl0IGRlYWxzIHdpdGggZmFpbHVyZXMgYW5kIHJlc291cmNlIGV4aGF1c3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGl0cyBpbXBhY3Qgb24gbmV0bGluaydzIHJlbGlhYmlsaXR5IGFuZCBwZXJmb3JtYW5jZS4gVGhpcyBpc24ndCBqdXN0IGFib3V0IHJlYWRpbmcgdGhlIGNvZGU7IGl0J3MgYWJvdXQgYnVpbGRpbmcgYSBzb2xpZCBtZW50YWwgbW9kZWwgb2YgaXRzIGJlaGF2aW9yIHdpdGhpbiB0aGUgYmlnZ2VyIHBpY3R1cmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMDg5LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NDMuMjUyNzQyNTg4WiIsIlNlcSI6NDAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI4ODg0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJuZXQvbmV0bGluay9hZl9uZXRsaW5rLmNcIixcbiAgXCJGaXJzdExpbmVcIjogOTIwLFxuICBcIkxpbmVDb3VudFwiOiA2MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgOTIwOlxcdFxcdG5say1cXHUwMDNlc3Vic2NyaXB0aW9ucyA9IHN1YnNjcmlwdGlvbnM7XFxuIDkyMTpcXHR9XFxuIDkyMjpcXHRcXG4gOTIzOlxcdHN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXFxuIDkyNDpcXHR7XFxuIDkyNTpcXHRcXHR1bnNpZ25lZCBsb25nICpuZXdfZ3JvdXBzLCAqb2xkX2dyb3VwcyA9IE5VTEw7XFxuIDkyNjpcXHRcXHRzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBubGtfc2soc2spO1xcbiA5Mjc6XFx0XFx0dW5zaWduZWQgaW50IGdyb3VwcztcXG4gOTI4OlxcdFxcdGludCBlcnIgPSAwO1xcbiA5Mjk6XFx0XFxuIDkzMDpcXHRcXHRuZXRsaW5rX3RhYmxlX2dyYWIoKTtcXG4gOTMxOlxcdFxcbiA5MzI6XFx0XFx0Z3JvdXBzID0gbmxfdGFibGVbc2stXFx1MDAzZXNrX3Byb3RvY29sXS5ncm91cHM7XFxuIDkzMzpcXHRcXHRpZiAoIW5sX3RhYmxlW3NrLVxcdTAwM2Vza19wcm90b2NvbF0ucmVnaXN0ZXJlZCkge1xcbiA5MzQ6XFx0XFx0XFx0ZXJyID0gLUVOT0VOVDtcXG4gOTM1OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gOTM2OlxcdFxcdH1cXG4gOTM3OlxcdFxcbiA5Mzg6XFx0XFx0aWYgKG5say1cXHUwMDNlbmdyb3VwcyBcXHUwMDNlPSBncm91cHMpXFxuIDkzOTpcXHRcXHRcXHRnb3RvIG91dF91bmxvY2s7XFxuIDk0MDpcXHRcXG4gOTQxOlxcdFxcdC8qIENhbiBub3QgdXNlIGtyZWFsbG9jKCksIGJlY2F1c2UgdGhlIG9sZCBidWZmZXIgbWlnaHQgYmUgZnJlZWRcXG4gOTQyOlxcdFxcdCAqIGltbWVkaWF0ZWx5LCB3aGlsZSBsb2NrbGVzcyByZWFkZXJzIChuZXRsaW5rIGRpYWcgZHVtcCBhbmRcXG4gOTQzOlxcdFxcdCAqIC9wcm9jL25ldC9uZXRsaW5rKSBjYW4gc3RpbGwgYmUgbG9va2luZyBhdCBpdC5cXG4gOTQ0OlxcdFxcdCAqL1xcbiA5NDU6XFx0XFx0bmV3X2dyb3VwcyA9IGt6YWxsb2MoTkxHUlBTWihncm91cHMpLCBHRlBfQVRPTUlDKTtcXG4gOTQ2OlxcdFxcdGlmICghbmV3X2dyb3Vwcykge1xcbiA5NDc6XFx0XFx0XFx0ZXJyID0gLUVOT01FTTtcXG4gOTQ4OlxcdFxcdFxcdGdvdG8gb3V0X3VubG9jaztcXG4gOTQ5OlxcdFxcdH1cXG4gOTUwOlxcdFxcdG9sZF9ncm91cHMgPSBubGstXFx1MDAzZWdyb3VwcztcXG4gOTUxOlxcdFxcdGlmIChvbGRfZ3JvdXBzKVxcbiA5NTI6XFx0XFx0XFx0bWVtY3B5KG5ld19ncm91cHMsIG9sZF9ncm91cHMsIE5MR1JQU1oobmxrLVxcdTAwM2VuZ3JvdXBzKSk7XFxuIDk1MzpcXHRcXG4gOTU0OlxcdFxcdC8qIFB1Ymxpc2ggdGhlIG5ldyBiaXRtYXAgYW5kIGl0cyBjb250ZW50OiBwYWlycyB3aXRoIHRoZSBhZGRyZXNzXFxuIDk1NTpcXHRcXHQgKiBkZXBlbmRlbmN5IGluIGxvY2tsZXNzIHJlYWRlcnMsIHdoaWNoIGNhbiBwaWNrIHVwIHRoZSBuZXcgcG9pbnRlclxcbiA5NTY6XFx0XFx0ICogd2hpbGUgc3RpbGwgc2VlaW5nIHRoZSBvbGQgKHNtYWxsZXIpIG5say1cXHUwMDNlbmdyb3Vwcy5cXG4gOTU3OlxcdFxcdCAqL1xcbiA5NTg6XFx0XFx0c21wX3N0b3JlX3JlbGVhc2UoXFx1MDAyNm5say1cXHUwMDNlZ3JvdXBzLCBuZXdfZ3JvdXBzKTtcXG4gOTU5OlxcdFxcbiA5NjA6XFx0XFx0LyogVGhlbiBwdWJsaXNoIHRoZSBuZXcgc2l6ZTogcGFpcnMgd2l0aCBzbXBfbG9hZF9hY3F1aXJlKCkgZnJvbVxcbiA5NjE6XFx0XFx0ICogbG9ja2xlc3MgcmVhZGVycywgc28gdGhhdCB0aGV5IGNhbiBub3QgcmVhZCBOTEdSUFNaKG5ldyBuZ3JvdXBzKVxcbiA5NjI6XFx0XFx0ICogYnl0ZXMgZnJvbSB0aGUgb2xkIGJ1ZmZlci5cXG4gOTYzOlxcdFxcdCAqL1xcbiA5NjQ6XFx0XFx0c21wX3N0b3JlX3JlbGVhc2UoXFx1MDAyNm5say1cXHUwMDNlbmdyb3VwcywgZ3JvdXBzKTtcXG4gOTY1OlxcdFxcbiA5NjY6XFx0IG91dF91bmxvY2s6XFxuIDk2NzpcXHRcXHRuZXRsaW5rX3RhYmxlX3VuZ3JhYigpO1xcbiA5Njg6XFx0XFxuIDk2OTpcXHRcXHRpZiAob2xkX2dyb3VwcylcXG4gOTcwOlxcdFxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpO1xcbiA5NzE6XFx0XFxuIDk3MjpcXHRcXHRyZXR1cm4gZXJyO1xcbiA5NzM6XFx0fVxcbiA5NzQ6XFx0XFxuIDk3NTpcXHRzdGF0aWMgdm9pZCBuZXRsaW5rX3VuZG9fYmluZChpbnQgZ3JvdXAsIGxvbmcgdW5zaWduZWQgaW50IGdyb3VwcyxcXG4gOTc2OlxcdFxcdFxcdFxcdCAgICAgIHN0cnVjdCBzb2NrICpzaylcXG4gOTc3OlxcdHtcXG4gOTc4OlxcdFxcdHN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7XFxuIDk3OTpcXHRcXHRpbnQgdW5kbztcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NDMuMjUzMDMzOTE4WiIsIlNlcSI6NDEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjk0OTUzNzAwMzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEtlcm5lbCBNZW1vcnkgRGVhbGxvY2F0aW9uIHdpdGggUkNVKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgYGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9ncm91cHMpYCBjYWxsLiBGaXJzdCB0aGluZ3MgZmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoZSB0eXBlIG9mIGBvbGRfZ3JvdXBzYC4gSXMgaXQgYW4gYHVuc2lnbmVkIGxvbmcgKmAgYXMgSSBzdXNwZWN0PyBUaGlzIGlzIGNydWNpYWwgdG8gdW5kZXJzdGFuZGluZyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IuXG5cbk5vdywgaG93IGRvZXMgdGhpcyBmdW5jdGlvbiwgYGtmcmVlX3JjdV9taWdodHNsZWVwYCwgYWN0dWFsbHkgb3BlcmF0ZSB3aXRoaW4gdGhlIGtlcm5lbD8gSSBuZWVkIHRvIHJlZnJlc2ggbXkgdW5kZXJzdGFuZGluZy4gRG9lcyBpdCBtYW5kYXRlIHRoZSBwcmVzZW5jZSBvZiBhbiBgcmN1X2hlYWRgIHN0cnVjdHVyZSwgb3IgY2FuIGl0IGhhbmRsZSBhIGBrbWFsbG9jYCBhbGxvY2F0ZWQgcG9pbnRlciBkaXJlY3RseT8gVGhlcmUncyBhIHN1YnRsZSBidXQgaW1wb3J0YW50IGRpZmZlcmVuY2UgaGVyZS5cblxuQWgsIHRoYXQncyByaWdodC4gSXQncyBhIGtleSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGBrZnJlZV9yY3UocHRyLCByY3VfaGVhZClgIGFuZCBga2ZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKWAuIEluIG1vZGVybiBrZXJuZWwgdmVyc2lvbnMsIHNwZWNpZmljYWxseSB0aG9zZSBpbiB0aGUgNS54IGFuZCA2Lnggc2VyaWVzLCB0aGUgc2luZ2xlLWFyZ3VtZW50IHZlcnNpb25zIGxpa2UgYGt2ZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAsIGFuZCBhbHNvIGBrZnJlZV9yY3UocHRyKWAgaGF2ZSBiZWNvbWUgYXZhaWxhYmxlLiBUaGVzZSB3b3JrIHBlcmZlY3RseSB3aXRoIHBvaW50ZXJzIGFsbG9jYXRlZCB2aWEgYGttYWxsb2NgLCB3aXRob3V0IG5lZWRpbmcgYW4gZXhwbGljaXQgb2Zmc2V0IG9yIGByY3VfaGVhZGAgc3RydWN0dXJlLiBUaGF0J3MgYSBzaWduaWZpY2FudCBhZHZhbmNlbWVudCBpbiB0aGUgUkNVIG1lbW9yeSBtYW5hZ2VtZW50IEFQSS5cblxuVG8gZ2V0IGEgY2xlYXJlciBwaWN0dXJlIG9mIGl0cyBwcmFjdGljYWwgdXNhZ2UsIEknbGwgcGVyZm9ybSBhIHF1aWNrIGBncmVwYCBzZWFyY2ggZm9yIGBrZnJlZV9yY3VfbWlnaHRzbGVlcGAgd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIGNvZGUuIFNlZWluZyBpdCBpbiBjb250ZXh0IHdpbGwgcHJvdmlkZSB2YWx1YWJsZSBjbHVlcyBhYm91dCBpdHMgaW50ZW5kZWQgcHVycG9zZSBhbmQgdXNhZ2UgcGF0dGVybnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEyMjIwLCJPdXRwdXRUb2tlbnMiOjIzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTkzLCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NTIuNzQ4NDIzMjMyWiIsIlNlcSI6NDIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozNDgyNDk4NjI2LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImtmcmVlX3JjdV9taWdodHNsZWVwXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q9NjIwPWJlIHVzZWQsIG9taXR0aW5nIHRoZSByY3VfaGVhZCBzdHJ1Y3R1cmUgZnJvbSBzdHJ1Y3QgZm9vLlxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtNjIxLVxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3Q6NjIyOlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKG9sZF9mcCk7XFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdC02MjMtXFxuLS1cXG5Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UucnN0PTEwNzY9UkNVOjpcXG4tLVxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtMTA4Ny1cXHRyY3VfcmVhZF9sb2NrX2hlbGRcXHRcXHRrdmZyZWVfcmN1XFxuRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnJzdDoxMDg4OlxcdHJjdV9yZWFkX2xvY2tfYW55X2hlbGRcXHRcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcFxcbkRvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS5yc3QtMTA4OS1cXHRyY3VfcG9pbnRlcl9oYW5kb2ZmXFx0XFx0Y29uZF9zeW5jaHJvbml6ZV9yY3VcXG4tLVxcbmJsb2NrL2Jsay1tcS5jPTQ1Mzk9c3RhdGljIHZvaWQgX19ibGtfbXFfcmVhbGxvY19od19jdHhzKHN0cnVjdCBibGtfbXFfdGFnX3NldCAqc2V0LFxcbi0tXFxuYmxvY2svYmxrLW1xLmMtNDU2MC1cXHRcXHQgKi9cXG5ibG9jay9ibGstbXEuYzo0NTYxOlxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGhjdHhzKTtcXG5ibG9jay9ibGstbXEuYy00NTYyLVxcdFxcdGhjdHhzID0gbmV3X2hjdHhzO1xcbi0tXFxuYmxvY2svYmxrLXpvbmVkLmM9MTk2Nj1zdGF0aWMgdm9pZCBkaXNrX3NldF96b25lc19jb25kX2FycmF5KHN0cnVjdCBnZW5kaXNrICpkaXNrLCB1OCAqem9uZXNfY29uZClcXG4tLVxcbmJsb2NrL2Jsay16b25lZC5jLTE5NzQtXFxuYmxvY2svYmxrLXpvbmVkLmM6MTk3NTpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcCh6b25lc19jb25kKTtcXG5ibG9jay9ibGstem9uZWQuYy0xOTc2LX1cXG4tLVxcbmJsb2NrL2Vycm9yLWluamVjdGlvbi5jPTExOD1zdGF0aWMgdm9pZCBlcnJvcl9pbmplY3RfcmVtb3ZlYWxsKHN0cnVjdCBnZW5kaXNrICpkaXNrKVxcbi0tXFxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmMtMTI3LVxcdFxcdGxpc3RfZGVsX3JjdShcXHUwMDI2aW5qLVxcdTAwM2VlbnRyeSk7XFxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmM6MTI4OlxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGluaik7XFxuYmxvY2svZXJyb3ItaW5qZWN0aW9uLmMtMTI5LVxcdH1cXG4tLVxcbmRyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3ZlcmJzLmM9MTM5OD1zdGF0aWMgaW50IHJ4ZV9kZXJlZ19tcihzdHJ1Y3QgaWJfbXIgKmlibXIsIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpXFxuLS1cXG5kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV92ZXJicy5jLTE0MTMtXFxuZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfdmVyYnMuYzoxNDE0OlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKG1yKTtcXG5kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV92ZXJicy5jLTE0MTUtXFx0cmV0dXJuIDA7XFxuLS1cXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmM9MTQ3Nz1zdGF0aWMgdm9pZCByaXNjdl9pb21tdV9yZWxlYXNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpXFxuLS1cXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4MC1cXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmM6MTQ4MTpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChpbmZvKTtcXG5kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmMtMTQ4Mi19XFxuLS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW4vdGMvaW50X3BvcnQuYz0yMjc9bWx4NWVfaW50X3BvcnRfcmVtb3ZlKHN0cnVjdCBtbHg1ZV90Y19pbnRfcG9ydF9wcml2ICpwcml2LFxcbi0tXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuL3RjL2ludF9wb3J0LmMtMjQ0LVxcdG1seDVlX2ludF9wb3J0X21ldGFkYXRhX2ZyZWUocHJpdiwgaW50X3BvcnQtXFx1MDAzZW1hdGNoX21ldGFkYXRhKTtcXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW4vdGMvaW50X3BvcnQuYzoyNDU6XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAoaW50X3BvcnQpO1xcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbi90Yy9pbnRfcG9ydC5jLTI0Ni1cXHRwcml2LVxcdTAwM2VudW1fcG9ydHMtLTtcXG4tLVxcbmRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl9hY2NlbC9tYWNzZWMuYz02Mzk9c3RhdGljIGludCBtbHg1ZV9tYWNzZWNfZGVsX3R4c2Eoc3RydWN0IG1hY3NlY19jb250ZXh0ICpjdHgpXFxuLS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY1LVxcdG1seDVfZGVzdHJveV9lbmNyeXB0aW9uX2tleShtYWNzZWMtXFx1MDAzZW1kZXYsIHR4X3NhLVxcdTAwM2VlbmNfa2V5X2lkKTtcXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmM6NjY2OlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKHR4X3NhKTtcXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtNjY3LVxcdG1hY3NlY19kZXZpY2UtXFx1MDAzZXR4X3NhW2Fzc29jX251bV0gPSBOVUxMO1xcbi0tXFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jPTgxNT1zdGF0aWMgdm9pZCBtYWNzZWNfZGVsX3J4c2NfY3R4KHN0cnVjdCBtbHg1ZV9tYWNzZWMgKm1hY3NlYywgc3RydWN0IG1seDVlX21hY3NlY19yeF9zYyAqcnhfc2MsXFxuLS1cXG5kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fYWNjZWwvbWFjc2VjLmMtODQyLVxcdGtmcmVlKHJ4X3NjLVxcdTAwM2VzY194YXJyYXlfZWxlbWVudCk7XFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jOjg0MzpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChyeF9zYyk7XFxuZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX2FjY2VsL21hY3NlYy5jLTg0NC19XFxuLS1cXG5mcy9idHJmcy92b2x1bWVzLmM9NzU5PXN0YXRpYyBub2lubGluZSBzdHJ1Y3QgYnRyZnNfZGV2aWNlICpkZXZpY2VfbGlzdF9hZGQoY29uc3QgY2hhciAqcGF0aCxcXG4tLVxcbmZzL2J0cmZzL3ZvbHVtZXMuYy05NTUtXFx0XFx0cmN1X2Fzc2lnbl9wb2ludGVyKGRldmljZS1cXHUwMDNlbmFtZSwgbmFtZSk7XFxuZnMvYnRyZnMvdm9sdW1lcy5jOjk1NjpcXHRcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfbmFtZSk7XFxuZnMvYnRyZnMvdm9sdW1lcy5jLTk1Ny1cXG4tLVxcbmZzL2V4dDQvc3VwZXIuYz0yNTgyPXN0YXRpYyB2b2lkIGV4dDRfYXBwbHlfcXVvdGFfb3B0aW9ucyhzdHJ1Y3QgZnNfY29udGV4dCAqZmMsXFxuLS1cXG5mcy9leHQ0L3N1cGVyLmMtMjYwNi1cXHRcXHRcXHRpZiAocW5hbWUpXFxuZnMvZXh0NC9zdXBlci5jOjI2MDc6XFx0XFx0XFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAocW5hbWUpO1xcbmZzL2V4dDQvc3VwZXIuYy0yNjA4LVxcdFxcdH1cXG4tLVxcbmZzL2tlcm5mcy9kaXIuYz0xODE5PWludCBrZXJuZnNfcmVuYW1lX25zKHN0cnVjdCBrZXJuZnNfbm9kZSAqa24sIHN0cnVjdCBrZXJuZnNfbm9kZSAqbmV3X3BhcmVudCxcXG4tLVxcbmZzL2tlcm5mcy9kaXIuYy0xODk3LVxcdGlmIChuZXdfbmFtZSBcXHUwMDI2XFx1MDAyNiAhaXNfa2VybmVsX3JvZGF0YSgodW5zaWduZWQgbG9uZylvbGRfbmFtZSkpXFxuZnMva2VybmZzL2Rpci5jOjE4OTg6XFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX25hbWUpO1xcbmZzL2tlcm5mcy9kaXIuYy0xODk5LVxcbi0tXFxuZnMveGZzL2xpYnhmcy94ZnNfZ3JvdXAuYz0xNTQ9eGZzX2dyb3VwX2ZyZWUoXFxuLS1cXG5mcy94ZnMvbGlieGZzL3hmc19ncm91cC5jLTE3Ni1cXHRYRlNfSVNfQ09SUlVQVChtcCwgYXRvbWljX3JlYWQoXFx1MDAyNnhnLVxcdTAwM2V4Z19hY3RpdmVfcmVmKSBcXHUwMDNjIDApO1xcbmZzL3hmcy9saWJ4ZnMveGZzX2dyb3VwLmM6MTc3OlxcdGtmcmVlX3JjdV9taWdodHNsZWVwKHhnKTtcXG5mcy94ZnMvbGlieGZzL3hmc19ncm91cC5jLTE3OC19XFxuLS1cXG5mcy94ZnMveGZzX2hlYWx0aG1vbi5jPTg2PXhmc19oZWFsdGhtb25fcHV0KFxcbi0tXFxuZnMveGZzL3hmc19oZWFsdGhtb24uYy0xMDEtXFx0XFx0bXV0ZXhfZGVzdHJveShcXHUwMDI2aG0tXFx1MDAzZWxvY2spO1xcbmZzL3hmcy94ZnNfaGVhbHRobW9uLmM6MTAyOlxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGhtKTtcXG5mcy94ZnMveGZzX2hlYWx0aG1vbi5jLTEwMy1cXHR9XFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmg9OTk0PXN0YXRpYyBpbmxpbmUgdm9pZCByY3VfcmVhZF91bmxvY2tfbWlncmF0ZSh2b2lkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTEwODctLyoqXFxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oOjEwODg6ICoga2ZyZWVfcmN1X21pZ2h0c2xlZXAoKSAtIGtmcmVlIGFuIG9iamVjdCBhZnRlciBhIGdyYWNlIHBlcmlvZC5cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA4OS0gKiBAcHRyOiBwb2ludGVyIHRvIGtmcmVlIGZvciBzaW5nbGUtYXJndW1lbnQgaW52b2NhdGlvbnMuXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTA5NC0gKlxcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaDoxMDk1OiAqICAgICBrZnJlZV9yY3VfbWlnaHRzbGVlcChwdHIpO1xcbmluY2x1ZGUvbGludXgvcmN1cGRhdGUuaC0xMDk2LSAqXFxuLS1cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgtMTEwMy0gKi9cXG5pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmg6MTEwNDojZGVmaW5lIGtmcmVlX3JjdV9taWdodHNsZWVwKHB0cikga3ZmcmVlX3JjdV9hcmdfMShwdHIpXFxuaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oLTExMDUtI2RlZmluZSBrdmZyZWVfcmN1X21pZ2h0c2xlZXAocHRyKSBrdmZyZWVfcmN1X2FyZ18xKHB0cilcXG4tLVxcbmtlcm5lbC9yY3UvcmN1c2NhbGUuYz03NTg9a2ZyZWVfc2NhbGVfdGhyZWFkKHZvaWQgKmFyZylcXG4tLVxcbmtlcm5lbC9yY3UvcmN1c2NhbGUuYy04MDQtXFx0XFx0XFx0XFx0XFx0KGtmcmVlX3JjdV90ZXN0X2JvdGggXFx1MDAyNlxcdTAwMjYgdG9ydHVyZV9yYW5kb20oXFx1MDAyNnRyKSBcXHUwMDI2IDB4ODAwKSlcXG5rZXJuZWwvcmN1L3JjdXNjYWxlLmM6ODA1OlxcdFxcdFxcdFxcdGtmcmVlX3JjdV9taWdodHNsZWVwKGFsbG9jX3B0cik7XFxua2VybmVsL3JjdS9yY3VzY2FsZS5jLTgwNi1cXHRcXHRcXHRlbHNlXFxuLS1cXG5uZXQvY2FuL2d3LmM9MTA3Nz1zdGF0aWMgaW50IGNnd19jcmVhdGVfam9iKHN0cnVjdCBza19idWZmICpza2IsICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCxcXG4tLVxcbm5ldC9jYW4vZ3cuYy0xMTI3LVxcdFxcdFxcdHJjdV9hc3NpZ25fcG9pbnRlcihnd2otXFx1MDAzZWNmX21vZCwgbW9kKTtcXG5uZXQvY2FuL2d3LmM6MTEyODpcXHRcXHRcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChvbGRfY2YpO1xcbm5ldC9jYW4vZ3cuYy0xMTI5LVxcdFxcdFxcdHJldHVybiAwO1xcbi0tXFxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jPTMxNT1pbnQgbXB0Y3BfcG1fbmxfcmVtb3ZlX2RvaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbylcXG4tLVxcbm5ldC9tcHRjcC9wbV91c2Vyc3BhY2UuYy0zNTctXFxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jOjM1ODpcXHRrZnJlZV9yY3VfbWlnaHRzbGVlcChtYXRjaCk7XFxubmV0L21wdGNwL3BtX3VzZXJzcGFjZS5jLTM1OS1cXHQvKiBBZGp1c3Qgc2tfb21lbV9hbGxvYyBsaWtlIHNvY2tfa2ZyZWVfcygpIGRvZXMsIHRvIG1hdGNoXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmM9OTIzPXN0YXRpYyBpbnQgbmV0bGlua19yZWFsbG9jX2dyb3VwcyhzdHJ1Y3Qgc29jayAqc2spXFxuLS1cXG5uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMtOTY5LVxcdGlmIChvbGRfZ3JvdXBzKVxcbm5ldC9uZXRsaW5rL2FmX25ldGxpbmsuYzo5NzA6XFx0XFx0a2ZyZWVfcmN1X21pZ2h0c2xlZXAob2xkX2dyb3Vwcyk7XFxubmV0L25ldGxpbmsvYWZfbmV0bGluay5jLTk3MS1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMTc6MzE6NTYuMjMwOTI3MDg5WiIsIlNlcSI6NDMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy44LWZsYXNoIiwiRHVyYXRpb24iOjEyNDU1ODQ3NTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFzc2Vzc21lbnQ6IFRoaXMgUGF0Y2ggRG9lc24ndCBOZWVkIEl0KipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGlzIHRvIGRldGVybWluZSBpZiB0aGlzIHBhdGNoIG5lY2Vzc2l0YXRlcyBhIEtNU0FOIHJ1bi4gRnJvbSB0aGUgcHJvdmlkZWQgaW5mb3JtYXRpb24sIHRoZSBwYXRjaCBwcmltYXJpbHkgYWRkcmVzc2VzIGNvbmN1cnJlbmN5IGlzc3VlcyBpbiBob3cgbmV0bGluayBncm91cCBiaXRtYXBzIGFyZSByZWFsbG9jYXRlZCBhbmQgYWNjZXNzZWQuIFNwZWNpZmljYWxseSwgdGhlIG9yaWdpbmFsIHVzZSBvZiBga3JlYWxsb2NgIHByZXNlbnRlZCBhIHBvdGVudGlhbCBVc2UtQWZ0ZXItRnJlZSAoVUFGKSBzaXR1YXRpb24gZm9yIGxvY2tsZXNzIFJDVSByZWFkZXJzLiBBZGRpdGlvbmFsbHksIHdpdGhvdXQgbWVtb3J5IGJhcnJpZXJzLCB0aGVyZSB3YXMgYSByaXNrIG9mIE91dC1vZi1Cb3VuZHMgKE9PQikgcmVhZHMgZHVlIHRvIGluY29uc2lzdGVudCB2aWV3cyBvZiBidWZmZXIgc2l6ZXMuXG5cblRoZSBjb3JlIG9mIHRoZSBmaXggaW52b2x2ZXMgcmVwbGFjaW5nIGBrcmVhbGxvY2Agd2l0aCBhIGBremFsbG9jYC1iYXNlZCBhcHByb2FjaC4gVGhpcyBtZWFucyB0aGUgbmV3IGJ1ZmZlciwgYG5ld19ncm91cHNgLCBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZSBwcmV2aW91cyBjb250ZW50cyBhcmUgdGhlbiBjb3BpZWQgaW4uIFRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkIHZpYSBga2ZyZWVfcmN1X21pZ2h0c2xlZXBgLiBNZW1vcnkgYmFycmllcnMgYXJlIHVzZWQgdG8gZW5zdXJlIHJlYWRlcnMgc2VlIGNvbnNpc3RlbnQgc3RhdGUuXG5cbk5vdywgY29uc2lkZXJpbmcgdGhlIEtNU0FOIGd1aWRlbGluZXMsIHRoZSBrZXkgcXVlc3Rpb24gaXMgd2hldGhlciB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgZXhwb3NlcyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gTGV0J3MgYW5hbHl6ZSBlYWNoIGNvbXBvbmVudDpcblxuMS4gIGBuZXRsaW5rX3JlYWxsb2NfZ3JvdXBzYDogVGhlIGNyaXRpY2FsIGNoYW5nZSBoZXJlIGlzIGBremFsbG9jYC4gVGhpcyBndWFyYW50ZWVzIGEgZnVsbHkgaW5pdGlhbGl6ZWQgYnVmZmVyLCBlbGltaW5hdGluZyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4gRXZlbiB0aGUgcHJldmlvdXMgYGtyZWFsbG9jYCArIGBtZW1zZXRgIGFwcHJvYWNoLCB3aGlsZSBsZXNzIGVsZWdhbnQsIHdhcyBzdGlsbCBmdWxseSBpbml0aWFsaXppbmcgdGhlIG1lbW9yeS4gVGhlIGNvcHkgZnJvbSBgb2xkX2dyb3Vwc2AgaXMgYWxzbyBzYWZlIGJlY2F1c2UgdGhhdCBtZW1vcnkgd2FzIGVpdGhlciBpbml0aWFsaXplZCBmcm9tIGBremFsbG9jYCBvciBzb21lIGVxdWl2YWxlbnQgYXQgc29tZSB0aW1lIGluIHRoZSBwYXN0LlxuXG4yLiAgYHNrX2RpYWdfZHVtcF9ncm91cHNgOiBUaGlzIGZ1bmN0aW9uIG5vdyBjb3JyZWN0bHkgbG9hZHMgYG5ncm91cHNgIGFuZCBgZ3JvdXBzYC4gIFRoZSBgZ3JvdXBzYCBidWZmZXIgaGVyZSwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0J3MgdGhlIG9sZCBvciB0aGUgbmV3IG9uZSwgaXMgYWx3YXlzIHNvdXJjZWQgZnJvbSBga3phbGxvY2AgKG9yIGtlcm5lbC1pbnRlcm5hbCBpbml0KSwgZ3VhcmFudGVlaW5nIGluaXRpYWxpemF0aW9uLiBFdmVuIGlmIHRoZSBjb2RlIHdlcmUgZmxhd2VkIGFuZCBhbiBvdXQtb2YtYm91bmRzIHJlYWQgb2NjdXJyZWQsIHRoYXQncyBhIEtBU0FOIGlzc3VlLiBUaGUgbWVtb3J5IGJhcnJpZXJzIHByZXZlbnQgdGhlIE9PQi5cblxuMy4gIGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvd2A6IFRoaXMgcmVhZHMgZnJvbSBgUkVBRF9PTkNFKG5say1cdTAwM2Vncm91cHMpYC4gU2luY2UgdGhlIGJ1ZmZlciB0aGF0IGBubGstXHUwMDNlZ3JvdXBzYCBwb2ludHMgdG8gaXMgYWx3YXlzIGFsbG9jYXRlZCB2aWEgYGt6YWxsb2NgLCB0aGlzIHJlYWQgaXMgYWxzbyBzYWZlLlxuXG40LiAgVGhlIGZ1bmRhbWVudGFsIGlzc3VlIHRoaXMgcGF0Y2ggcmVzb2x2ZXM6IFRoZSBvcmlnaW5hbCBwcm9ibGVtIG9mIFVBRiBhbmQgT09CIGFyaXNlcyBmcm9tIGNvbmN1cnJlbnQgYWNjZXNzIGFuZCBpbXByb3BlciBtZW1vcnkgYmFycmllcnMgd2l0aCBga3JlYWxsb2NgLiBUaGVzZSBhcmUgYnVncyB0aGF0IEtBU0FOIGV4Y2VscyBhdCBkZXRlY3RpbmcuIFRoZSBuZXcgYXBwcm9hY2ggcmVzb2x2ZXMgdGhpcyBieSBlbnN1cmluZyBhIGNvbnNpc3RlbnQsIGluaXRpYWxpemVkIHZpZXcgb2YgdGhlIG1lbW9yeSwgYW5kIHByb3Blcmx5IHN5bmNocm9uaXppbmcuXG5cblRoZXJlZm9yZSwgdGhpcyBwYXRjaCBkb2Vzbid0IGNyZWF0ZSAqYW55KiBuZXcgcmlza3Mgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkuIFRoZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiB0byAqYXZvaWQqIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiBObyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcyBhcmUgcmVhZCwgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzIGFyZSBpbnZvbHZlZCwgYW5kIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzIHNlbnQgdG8gdXNlcnNwYWNlLiBUaGUgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBVQUYgYW5kIE9PQiwgd2hpY2ggYXJlIGhhbmRsZWQgYnkgS0FTQU4uXG5cblRoZSBLTVNBTiBndWlkZWxpbmVzIGFyZSBjbGVhcjogaWYgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMgY2F0Y2ggdGhlIHByb2JsZW0sIHRoZXJlJ3Mgbm8gbmVlZCBmb3IgYSByZXNvdXJjZS1pbnRlbnNpdmUgS01TQU4gcnVuLiBUaGlzIHBhdGNoIGZhbGxzIHNxdWFyZWx5IGludG8gdGhhdCBjYXRlZ29yeS4gSGVuY2UsIGBOZWVkc0tNU0FOID0gZmFsc2VgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTU2NywiT3V0cHV0VG9rZW5zIjoyMDcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxOTMxLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDE3OjMyOjA4LjY4Njc3NzE0NloiLCJTZXEiOjQ0LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjM3NTEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzb2x2ZXMgYSBjb25jdXJyZW5jeSBidWcgd2hlcmUgYGtyZWFsbG9jKClgIGltbWVkaWF0ZWx5IGZyZWVkIGBubGstXFx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJ3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gXFxuXFxuRnJvbSBhIEtNU0FOIHBlcnNwZWN0aXZlLCB0aGUgbmV3IGdyb3VwcyBidWZmZXIgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jKClgIHdoaWNoIHplcm9lcyB0aGUgZW50aXJlIGFsbG9jYXRpb24sIGZvbGxvd2VkIGJ5IGNvcHlpbmcgZXhpc3RpbmcgZ3JvdXAgZGF0YTsgdGh1cywgYWxsIGJ5dGVzIG9mIHRoZSBidWZmZXIgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBwdWJsaWNhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgc3RydWN0IHBhZGRpbmdzLCBvciB1bmluaXRpYWxpemVkIGRhdGEgbGVha3MgdG8gdXNlcnNwYWNlIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVzb2x2ZXMgYSBjb25jdXJyZW5jeSBidWcgd2hlcmUgYGtyZWFsbG9jKClgIGltbWVkaWF0ZWx5IGZyZWVkIGBubGstXFx1MDAzZWdyb3Vwc2Agd2hpbGUgbG9ja2xlc3MgcmVhZGVycyB1bmRlciBSQ1UgKGBuZXRsaW5rX25hdGl2ZV9zZXFfc2hvdygpYCBhbmQgYHNrX2RpYWdfZHVtcF9ncm91cHMoKWApIGNvdWxkIGFjY2VzcyBpdCBjb25jdXJyZW50bHksIHJpc2tpbmcgdXNlLWFmdGVyLWZyZWUgKFVBRikgYW5kIG91dC1vZi1ib3VuZHMgKE9PQikgcmVhZHMuIFRoZXNlIG1lbW9yeSBzYWZldHkgaXNzdWVzIChVQUYgYW5kIE9PQiBoZWFwIHJlYWRzKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOJ3MgZGV0ZWN0aW9uIGNhcGFiaWxpdGllcy4gXFxuXFxuRnJvbSBhIEtNU0FOIHBlcnNwZWN0aXZlLCB0aGUgbmV3IGdyb3VwcyBidWZmZXIgaXMgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jKClgIHdoaWNoIHplcm9lcyB0aGUgZW50aXJlIGFsbG9jYXRpb24sIGZvbGxvd2VkIGJ5IGNvcHlpbmcgZXhpc3RpbmcgZ3JvdXAgZGF0YTsgdGh1cywgYWxsIGJ5dGVzIG9mIHRoZSBidWZmZXIgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSBwdWJsaWNhdGlvbi4gTm8gdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSwgc3RydWN0IHBhZGRpbmdzLCBvciB1bmluaXRpYWxpemVkIGRhdGEgbGVha3MgdG8gdXNlcnNwYWNlIGFyZSBpbnRyb2R1Y2VkIG9yIGV4cG9zZWQuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[1] Phase: Succeeded StartedAt: 2026-09-11 17:32:55 +0000 UTC FinishedAt: 2026-09-11 17:32:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-11 17:32:55 +0000 UTC FinishedAt: 2026-09-11 17:32:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2] Phase: Succeeded StartedAt: 2026-09-11 17:32:55 +0000 UTC FinishedAt: 2026-09-11 21:21:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-11 17:32:55 +0000 UTC FinishedAt: 2026-09-11 21:21:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"fuzz":{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-11 17:32:55 +0000 UTC FinishedAt: 2026-09-11 17:33:05 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-11 17:32:55 +0000 UTC FinishedAt: 2026-09-11 17:33:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-1314370315/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-11 17:33:05 +0000 UTC FinishedAt: 2026-09-11 17:52:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-11 17:33:05 +0000 UTC FinishedAt: 2026-09-11 17:52:45 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b83623ad-9fcc-4f3b-9410-4f8120eee395,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-1314370315/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "390cbda4-4841-4295-b128-74a6131641e8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-3818630665/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-11 17:33:05 +0000 UTC FinishedAt: 2026-09-11 17:52:35 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b83623ad-9fcc-4f3b-9410-4f8120eee395,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-1314370315/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "390cbda4-4841-4295-b128-74a6131641e8", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-3818630665/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-11 17:52:45 +0000 UTC FinishedAt: 2026-09-11 17:52:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-11 17:52:45 +0000 UTC FinishedAt: 2026-09-11 17:52:45 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-11 17:52:45 +0000 UTC FinishedAt: 2026-09-11 17:52:55 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-11 17:52:45 +0000 UTC FinishedAt: 2026-09-11 17:52:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-1145748066/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-11 17:52:55 +0000 UTC FinishedAt: 2026-09-11 17:55:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-11 17:52:55 +0000 UTC FinishedAt: 2026-09-11 17:55:13 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*390cbda4-4841-4295-b128-74a6131641e8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Base,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-3818630665/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-11 17:55:23 +0000 UTC FinishedAt: 2026-09-11 17:55:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-11 17:55:23 +0000 UTC FinishedAt: 2026-09-11 17:55:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-11 17:55:23 +0000 UTC FinishedAt: 2026-09-11 18:15:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-11 17:55:23 +0000 UTC FinishedAt: 2026-09-11 18:15:14 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b83623ad-9fcc-4f3b-9410-4f8120eee395,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-1145748066/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "e0c6426d-1076-4eae-8cb2-cbf1ecae90dd", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-2756519606/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-11 17:55:23 +0000 UTC FinishedAt: 2026-09-11 18:15:04 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Build Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:smoke-build,Default:nil,Value:*false,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:session-id,Default:nil,Value:*b83623ad-9fcc-4f3b-9410-4f8120eee395,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:request,Path:/tmp/request.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-1145748066/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "build_id": "e0c6426d-1076-4eae-8cb2-cbf1ecae90dd", "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:*,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/output,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-2756519606/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-11 18:15:14 +0000 UTC FinishedAt: 2026-09-11 18:15:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-11 18:15:14 +0000 UTC FinishedAt: 2026-09-11 18:15:14 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-11 18:15:14 +0000 UTC FinishedAt: 2026-09-11 18:17:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-11 18:15:14 +0000 UTC FinishedAt: 2026-09-11 18:16:39 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*e0c6426d-1076-4eae-8cb2-cbf1ecae90dd,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Boot test: Patched,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:report-findings,Default:nil,Value:*true,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-2756519606/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "success": true },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-11 18:17:10 +0000 UTC FinishedAt: 2026-09-11 21:21:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-11 18:17:10 +0000 UTC FinishedAt: 2026-09-11 21:21:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*390cbda4-4841-4295-b128-74a6131641e8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*e0c6426d-1076-4eae-8cb2-cbf1ecae90dd,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-3818630665/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-2756519606/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-11 18:17:10 +0000 UTC FinishedAt: 2026-09-11 18:17:33 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-11 18:17:10 +0000 UTC FinishedAt: 2026-09-11 18:17:26 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-3923489175/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-11 18:17:10 +0000 UTC FinishedAt: 2026-09-11 18:17:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-11 18:17:10 +0000 UTC FinishedAt: 2026-09-11 18:17:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-11 18:17:10 +0000 UTC FinishedAt: 2026-09-11 18:17:10 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-11 18:17:33 +0000 UTC FinishedAt: 2026-09-11 21:21:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowcqnfz[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},fuzz:{"base_commit":"78445023439506ebd83b86d40b1e428a3b309d4a","base_tree":"net","bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-net-kasan-gce-corpus.db"],"focus":["net"],"focus_symbols":["netlink_realloc_groups","sk_diag_dump_groups","netlink_native_seq_show"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"78445023439506ebd83b86d40b1e428a3b309d4a","config_name":"upstream-apparmor-kasan.config","enable_configs":["NETLINK_DIAG","PROC_FS"],"series_id":"94f352df-b1f9-4e57-829f-510bf132863a","tree_name":"net","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/netdev/net.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-11 18:17:33 +0000 UTC FinishedAt: 2026-09-11 21:21:08 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*390cbda4-4841-4295-b128-74a6131641e8,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*e0c6426d-1076-4eae-8cb2-cbf1ecae90dd,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-3818630665/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-build-action-2756519606/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowcqnfz/series-workflowcqnfz-convert-artifact-3923489175/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}