Name: series-workflowmkb67 Phase: Running StartedAt: 2026-09-05 19:36:54 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[0] Phase: Succeeded StartedAt: 2026-09-05 19:36:54 +0000 UTC FinishedAt: 2026-09-05 20:42:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[0].run-triage Phase: Succeeded StartedAt: 2026-09-05 19:36:54 +0000 UTC FinishedAt: 2026-09-05 20:42:21 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "series_id": "43142361-e717-4509-a429-70ce312f5eb2" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgQlBGIGtmdW5jIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbmQgYXNzb2NpYXRlZCBCUEYgc2VsZnRlc3RzLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBgc2l6ZWAgcGFyYW1ldGVyLCBjaGVja3MgdGhlIGV4ZWN1dGlvbiBjb250ZXh0LCBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYCwgYW5kIHJldHVybnMgYSBzY2FsYXIgYHVuc2lnbmVkIGxvbmdgIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMuXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgYWxsb3dpbmcgc2xlZXBhYmxlIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gdmlhIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKS4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBjb2RlIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyZjM1YmE2NjMwOWUgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtNiw2ICYjNDM7Niw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICYjNDM7MTYwLDc0IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4mIzQzOyAqIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxuJiM0MzsgKiByZWNsYWltIHN0YXRlLiBSZWNsYWltIHdpbmRvd3MgYXJlIG1hcmtlZCB3aXRoIFBGX01FTUFMTE9DO1xuJiM0MzsgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuJiM0MzsgKiBiZWZvcmUgUEZfTUVNQUxMT0MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX01FTUFMTE9DKSB8fCBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuJiM0MzsgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuXG4mIzQzOyAqXG4mIzQzOyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuJiM0MzsgKiB0aGUgbWVtb3J5LmhpZ2ggd29ya3F1ZXVlIGZhbGxiYWNrIGluIGhpZ2hfd29ya19mdW5jKCkuIFRvIHJlY2xhaW1cbiYjNDM7ICogbW9yZSwgY2FsbCB0aGlzIGtmdW5jIHJlcGVhdGVkbHkgaW5zdGVhZCBvZiBwYXNzaW5nIGEgbGFyZ2VyIEBzaXplLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGtmdW5jIGlzIHJlc3RyaWN0ZWQgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHRvIGVuc3VyZSBpdCBydW5zXG4mIzQzOyAqIGluIGEgY2xlYW4gcHJvY2VzcyBjb250ZXh0LiBUaGUgU1lTQ0FMTCBwcm9ncmFtIGNhbiBzY2hlZHVsZSB0aGVcbiYjNDM7ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4mIzQzOyAqIHNhZmUgcHJvY2VzcyBjb250ZXh0ICh3b3JrcXVldWUsIHRhc2tfd29yaykuXG4mIzQzOyAqXG4mIzQzOyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4mIzQzOyAqIGNhbGxiYWNrIGFuZCByZXF1ZXVlIHRoZSBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgYmF0Y2ggcmF0aGVyXG4mIzQzOyAqIHRoYW4gbG9vcGluZyBpbnNpZGUgdGhlIGNhbGxiYWNrOiBhIGxvbmctcnVubmluZyBjYWxsYmFjayBzdGFsbHNcbiYjNDM7ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4mIzQzOyAqIGludGVycnVwdHMgZGlzYWJsZWQgdGhlIHJlc3VsdGluZyBjb250ZW50aW9uIGFsc28gZGVsYXlzIElQSVxuJiM0MzsgKiBoYW5kbGluZy4gR2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIGJwZl93cSBpdGVtLCBzbyB0aGF0XG4mIzQzOyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuJiM0MzsgKiBhbm90aGVyLiBEZWNpZGluZyB3aGV0aGVyIHRvIHN1Ym1pdCB0aGUgbmV4dCBiYXRjaCBpcyB1cCB0byB0aGUgQlBGXG4mIzQzOyAqIHByb2dyYW0sIHdoaWNoIGNhbiBzdG9wIGF0IGFueSBwb2ludCwgZS5nLiBvbmNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzXG4mIzQzOyAqIGR5aW5nLlxuJiM0MzsgKlxuJiM0MzsgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoXG4mIzQzOyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpc1xuJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4mIzQzO1xuJiM0MztcdGlmIChzaXplIFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xuJiM0MztcbiYjNDM7XHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgTlVMTCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XG4mIzQzO31cbiYjNDM7XG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzEsMjIgJiM0MzsyNDAsNDQgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX21lbW9yeV9ldmVudHMpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuLVxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbiYjNDM7LypcbiYjNDM7ICogUHJvYWN0aXZlIHJlY2xhaW0gbmVlZHMgYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQsIHNvIGl0IGlzIHJlc3RyaWN0ZWRcbiYjNDM7ICogdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMLiBUaGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIHRoYXQgYVxuJiM0MzsgKiBTWVNDQUxMIHByb2dyYW0gc2NoZWR1bGVzIHJ1biBhcyB0aGUgc2FtZSBwcm9ncmFtIHR5cGUsIHNvIHRoZXkgY2FuXG4mIzQzOyAqIHN0aWxsIGludm9rZSBpdDsgZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgKGUuZy4gZmVudHJ5IG9uIHJlY2xhaW1cbiYjNDM7ICogcGF0aHMsIGlub2RlX3JtZGlyKSBjYW5ub3QuXG4mIzQzOyAqL1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4mIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuJiM0MztcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuJiM0Mzt9O1xuJiM0MztcbiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXG4ge1xuIFx0aW50IGVycjtcbiBcbiBcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXG4gXHRcdFx0XHRcdFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7XG4tXHRpZiAoZXJyKVxuJiM0MztcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkXCYjMzQ7LCBlcnIpO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuJiM0MztcdFx0XHRcdFx0XHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRwcl93YXJuKFwmIzM0O2Vycm9yIHJlZ2lzdGVyaW5nIGJwZiByZWNsYWltIGtmdW5jczogJWRcJiMzNDssIGVycik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDY4NiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaGVscGVycy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuJiM0MzsjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuJiM0MztcbiYjNDM7I2RlZmluZSBDR19ESVIgXCYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW1cJiMzNDtcbiYjNDM7I2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCYjMzQ7L2hpZ2hcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcJiMzNDsvbG93XCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiBcJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1wmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiBcJiMzNDsvdHJpZ2dlclwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFwmIzM0Oy90YXJnZXRcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4mIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRpbWluZyBmb3IgdGhlIGR5aW5nIHRlc3Q6IGFmdGVyIHRoZSB0YXJnZXQgY2dyb3VwIGlzIHJlbW92ZWQsIGdpdmVcbiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kXG4mIzQzOyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyXG4mIzQzOyAqIGNncm91cCByZWZhdWx0aW5nLCBhbmQgdGhlIHRpbWVyIGZpcmVzIGV2ZXJ5IENIRUNLX1BFUklPRF9OUywgc29cbiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgRFlJTkdfU0VUVExFX1VTICgyMDAgKiAxMDAwKVxuJiM0MzsjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwXG4mIzQzOyNkZWZpbmUgRFlJTkdfUE9MTF9JTlRFUlZBTF9VUyAoMTAgKiAxMDAwKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4mIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuJiM0MztcbiYjNDM7XHRpZiAoIXN0YXRmcyhcJiMzNDsvdG1wXCYjMzQ7LCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuXCYjMzQ7O1xuJiM0MztcdHJldHVybiBcJiMzNDsvdG1wXCYjMzQ7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4mIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4mIzQzO1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4mIzQzO1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbiYjNDM7XHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKGNvZGUpIHtcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfT0s6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7c3VjY2Vzc1wmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7am9pbiBjZ3JvdXBcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7cmVhZCBkYXRhIGZpbGVcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt3cml0ZSB0aW1lIGZpbGVcJiMzNDs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt1bmtub3duXCYjMzQ7O1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwmIzM0O21lbW9yeVwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtlbmFibGVfY29udHJvbGxlcnNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcJiMzNDslbHVcJiMzNDssIENHX0xJTUlUKTtcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5tYXhcJiMzNDssIGxpbWl0X2J1Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbiYjNDM7XHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuJiM0MztcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7L3Byb2Mvc3dhcHNcJiMzNDssIEZfT0spKSB7XG4mIzQzO1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5zd2FwLm1heFwmIzM0OywgXCYjMzQ7MFwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0hJR0hfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0xPV19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzXG4mIzQzOyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4mIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuJiM0MzsgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJiMzOTtzXG4mIzQzOyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4mIzQzO1xuJiM0MztcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0RZSU5HX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2VuYWJsZV9jb250cm9sbGVyc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwmIzM0OyVsdVwmIzM0OywgQ0dfTElNSVQpO1xuJiM0MztcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5Lm1heFwmIzM0OywgbGltaXRfYnVmKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHQvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi9cbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgRl9PSykpIHtcbiYjNDM7XHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5LnN3YXAubWF4XCYjMzQ7LCBcJiMzNDswXCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0YXJnZXRfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbiYjNDM7XHRcdFx0KHZvaWQpdjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7XG4mIzQzO1x0ZG91YmxlIGVsYXBzZWQ7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4mIzQzO1xuJiM0MztcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4mIzQzO1xuJiM0MztcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNmVuZCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX09LO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuJiM0MztcdHByaW50ZihcJiMzNDslLjZmXFxuXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDt3XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuJiM0MztcdGZwcmludGYoZnAsIFwmIzM0OyUuNmZcJiMzNDssIGVsYXBzZWQpO1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBDSElMRF9FWElUX09LO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XHRjaGFyIGJ1Zls2NF07XG4mIzQzO1xuJiM0MztcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcJiMzNDtmb3BlblwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgXCYjMzQ7ZmdldHNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRpZiAoc3NjYW5mKGJ1ZiwgXCYjMzQ7JWxmXCYjMzQ7LCB0aW1lKSAhPSAxKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O3NzY2FuZiAlc1wmIzM0OywgYnVmKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbiYjNDM7e1xuJiM0MztcdGNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbiYjNDM7XHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4mIzQzO1x0cGlkX3Qgd2FpdF9yZXQ7XG4mIzQzO1x0aW50IGZkLCBzdGF0dXM7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRsb3dfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwmIzM0O2ZvcmsgbG93XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAobG93X3BpZCA9PSAwKVxuJiM0MztcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHRoaWdoX3BpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCYjMzQ7Zm9yayBoaWdoXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoaGlnaF9waWQgPT0gMClcbiYjNDM7XHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwmIzM0O2xvdyB3YWl0cGlkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuJiM0MztcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxuJiM0MztcdCAqL1xuJiM0MztcdGxvd19waWQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtsb3cgZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuJiM0MztcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCYjMzQ7aGlnaCB3YWl0cGlkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHQvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi9cbiYjNDM7XHRoaWdoX3BpZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2hpZ2ggZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbiYjNDM7XHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRpZiAoaGlnaF9waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbiYjNDM7XHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2FyZ3MgYXJncyA9IHtcbiYjNDM7XHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuJiM0MztcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbiYjNDM7XHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbiYjNDM7XHR9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbiYjNDM7XHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuJiM0MztcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTtcbiYjNDM7XHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwmIzM0O3Byb2dfaW5pdCByZXR2YWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJvcl9vdXQ7XG4mIzQzO1xuJiM0MztcdCpza2VsX3B0ciA9IHNrZWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJvcl9vdXQ6XG4mIzQzO1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2JwZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbiYjNDM7XHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbiYjNDM7XHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwmIzM0O3JlY2xhaW1lZF9ieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQ6IGhpZ2g9JWYgbG93PSVmXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAoc2tlbClcbiYjNDM7XHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzXG4mIzQzOyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuJiM0MzsgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHlcbiYjNDM7ICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4mIzQzO3tcbiYjNDM7XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4mIzQzO1xuJiM0MztcdGlmIChwaWQgIT0gMClcbiYjNDM7XHRcdHJldHVybiBwaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0X2V4aXQoQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCk7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbiYjNDM7XHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuJiM0MztcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZW1vdmUgdGhlIHJlY2xhaW0gdGFyZ2V0IHdoaWxlIHRoZSBCUEYgcHJvZ3JhbSBrZWVwcyBydW5uaW5nIGFuZFxuJiM0MzsgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mXG4mIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmRcbiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZyxcbiYjNDM7ICogYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZC4gcmVjbGFpbV9jYWxscyBncm93aW5nXG4mIzQzOyAqIHdoaWxlIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuJiM0MzsgKiByZXR1cm5zIDAgb24gdGhlIGVtcHR5IHRhcmdldCwgYnV0IHRoZSBjYWxsIGlzIHN0aWxsIGNvdW50ZWQpLCBhbmRcbiYjNDM7ICogYWZ0ZXIgdGhlIHJlbW92YWwgdGhlIHNraXAgY291bnRlcnMgbXVzdCBncm93IHdoaWxlIHJlY2xhaW1fY2FsbHNcbiYjNDM7ICogYW5kIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgdHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlO1xuJiM0MztcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwmIzM0O1wmIzM0OztcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0cGlkX3QgcmVhZGVyX3BpZCA9IC0xO1xuJiM0MztcdGludCBlcnIsIGZkLCBpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9keWluZ19jZ3JvdXBzKFx1MDAyNnRyaWdnZXJfY2dyb3VwX2lkLCBcdTAwMjZ0YXJnZXRfY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2R5aW5nX2Nncm91cHNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwmIzM0Oywgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuJiM0MztcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcJiMzNDtmb3JrIGtlZXBhbGl2ZSByZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX2NhbGxzIFx1MDAzZSAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0cmVtb3ZlX2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbiYjNDM7XG4mIzQzO1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbiYjNDM7XHR1c2xlZXAoRFlJTkdfU0VUVExFX1VTKTtcbiYjNDM7XG4mIzQzO1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbiYjNDM7XHRieXRlc19iZWZvcmUgPSBza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXM7XG4mIzQzO1xuJiM0MztcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIHx8XG4mIzQzO1x0XHQgICAgc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9za2lwcGVkX2R5aW5nKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZykge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSlcJiMzNDssXG4mIzQzO1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbiYjNDM7XHRcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuJiM0MztcdCAqIGNhdWdodCB0aGUgY2dyb3VwIG1pZC10ZWFyZG93bi4gV2hldGhlciBpdCBpcyBoaXQgaXMgdGltaW5nXG4mIzQzO1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4mIzQzO1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwcmludGYoXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWxsdSwgZHlpbmc9JWxsdVxcblwmIzM0OyxcbiYjNDM7XHQgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lLFxuJiM0MztcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4mIzQzO1xuJiM0MztcdC8qIE5vdGhpbmcgbWF5IGhhdmUgYmVlbiByZWNsYWltZWQgZnJvbSB0aGUgcmVtb3ZlZCB0YXJnZXQuICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCBcJiMzNDtyZWNsYWltX2NhbGxzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3JlY2xhaW1lZF9ieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAocmVhZGVyX3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0a2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChkYXRhX2ZpbGVbMF0pXG4mIzQzO1x0XHR1bmxpbmsoZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoc2tlbClcbiYjNDM7XHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTY4MzlhZGU0NzJiYlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCAmIzQzOzEsMjU5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4mIzQzOyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuJiM0MzsvKlxuJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkVcbiYjNDM7ICogZWFjaC4gRWFjaCBicGZfd3EgY2FsbGJhY2sgcmVjbGFpbXMgYSBzaW5nbGUgYmF0Y2ggYW5kIHJlcXVldWVzIHRoZVxuJiM0MzsgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XG4mIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxuJiM0MzsgKi9cbiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7XG4mIzQzO3U2NCByZWNsYWltZWRfYnl0ZXM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlY2xhaW0gYXR0ZW1wdHMgc2tpcHBlZCBiZWNhdXNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nIG9yIGhhc1xuJiM0MzsgKiBiZWVuIHJlbW92ZWQuIHJlY2xhaW1fc2tpcHBlZF9keWluZyBjb3VudHMgbG9va3VwcyB0aGF0IHN0aWxsIGZvdW5kXG4mIzQzOyAqIHRoZSBjZ3JvdXAgd2hpbGUgaXQgaXMgYmVpbmcgdG9ybiBkb3duLCByZWNsYWltX3RhcmdldF9nb25lIGNvdW50c1xuJiM0MzsgKiBsb29rdXBzIHRoYXQgZm91bmQgbm90aGluZy4gVGhlIHRlc3QgcmVtb3ZlcyB0aGUgdGFyZ2V0IGNncm91cCB3aGlsZVxuJiM0MzsgKiByZWNsYWltIGlzIHJ1bm5pbmcgYW5kIGNoZWNrcyB0aGF0IHJlY2xhaW0gc3RvcHMgdmlhIHRoZXNlIGNvdW50ZXJzLlxuJiM0MzsgKi9cbiYjNDM7dTY0IHJlY2xhaW1fc2tpcHBlZF9keWluZztcbiYjNDM7dTY0IHJlY2xhaW1fdGFyZ2V0X2dvbmU7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZWNncnApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuJiM0MztcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuJiM0MztcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4mIzQzO1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4mIzQzO1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4mIzQzO1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXG4mIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4mIzQzOyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbiYjNDM7ICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXG4mIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuJiM0MzsgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4mIzQzOyAqXG4mIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuJiM0MzsgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbiYjNDM7ICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcbiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzb1xuJiM0MzsgKiB0aGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggdGhlIHRhcmdldCBrZXJuZWwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChmbGFncyBcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFx1MDAyNiBDU1NfT05MSU5FKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4mIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbiYjNDM7ICogcmVjbGFpbWVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1x0dTY0IG5yID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSkge1xuJiM0MztcdFx0cmVjbGFpbV90YXJnZXRfZ29uZSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbiYjNDM7XHRcdHJlY2xhaW1fc2tpcHBlZF9keWluZyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmVjbGFpbV9jYWxscyYjNDM7JiM0Mzs7XG4mIzQzO1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUpO1xuJiM0MztcdHJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7XG4mIzQzO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gbnI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0cnVjdCB3cV9lbGVtIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuJiM0MztcdHN0cnVjdCBicGZfd3Egd29yaztcbiYjNDM7XHR1NjQgcHJldl9ldmVudDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4mIzQzO1x0ICogcmVxdWV1ZXMuIDAgbWVhbnMgbm8gcm91bmQgaXMgaW4gcHJvZ3Jlc3M7IHRoZSB0aW1lciBwYXRoXG4mIzQzO1x0ICogc3RhcnRzIGEgbmV3IHJvdW5kIGJ5IHJlc2V0dGluZyBpdCwgcmVxdWV1ZWQgd29yayBvbmx5IGxvb2tzXG4mIzQzO1x0ICogYXQgaXQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dTY0IHJlbWFpbmluZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4mIzQzO1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCBfX3UzMik7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4mIzQzO30gd3FfbWFwIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4mIzQzO1x0dTY0IG5yLCBzaXplO1xuJiM0MztcbiYjNDM7XHRpZiAoIWVsZW0tXHUwMDNlcmVtYWluaW5nKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4mIzQzO1x0XHQgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzXG4mIzQzO1x0XHQgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGFcbiYjNDM7XHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdFx0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogT25lIGJvdW5kZWQgcmVjbGFpbSBwYXNzIHBlciBjYWxsYmFjayAqL1xuJiM0MztcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4mIzQzO1x0bnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTtcbiYjNDM7XHRpZiAoIW5yKSB7XG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovXG4mIzQzO1x0aWYgKG5yIFx1MDAzZT0gZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZWxlbS1cdTAwM2VyZW1haW5pbmcgLT0gbnI7XG4mIzQzO1xuJiM0MztcdC8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqL1xuJiM0MztcdGlmIChlbGVtLVx1MDAzZXJlbWFpbmluZylcbiYjNDM7XHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbiYjNDM7e1xuJiM0MztcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gMDtcbiYjNDM7XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbiYjNDM7XG4mIzQzO1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgYWxsb3dpbmcgc2xlZXBhYmxlIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gdmlhIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKS4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBjb2RlIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuYwppbmRleCA3MTZkZjQ5ZDc2NDc3Li45MmYzNWJhNjYzMDllIDEwMDY0NAotLS0gYS9tbS9icGZfbWVtY29udHJvbC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmMKQEAgLTYsNiAmIzQzOzYsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKIAogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwpAQCAtMTU5LDYgJiM0MzsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiAJbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXMKJiM0MzsgKiBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyCiYjNDM7ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQzsKJiM0MzsgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseQomIzQzOyAqIGJlZm9yZSBQRl9NRU1BTExPQy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKGN1cnJlbnQtJmd0O2ZsYWdzICZhbXA7IFBGX01FTUFMTE9DKSB8fCBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0bwomIzQzOyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcykKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKgomIzQzOyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZwomIzQzOyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbQomIzQzOyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS4KJiM0MzsgKgomIzQzOyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnMKJiM0MzsgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlCiYjNDM7ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluCiYjNDM7ICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS4KJiM0MzsgKgomIzQzOyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyCiYjNDM7ICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXIKJiM0MzsgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzCiYjNDM7ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoCiYjNDM7ICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJCiYjNDM7ICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdAomIzQzOyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZgomIzQzOyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYKJiM0MzsgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcwomIzQzOyAqIGR5aW5nLgomIzQzOyAqCiYjNDM7ICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXMKJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwomIzQzOwomIzQzOwlpZiAoc2l6ZSAmbHQ7IFBBR0VfU0laRSB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BhZ2VzID0gbWluKHNpemUgLyBQQUdFX1NJWkUsICh1bnNpZ25lZCBsb25nKU1FTUNHX0NIQVJHRV9CQVRDSCk7CiYjNDM7CiYjNDM7CW5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLAomIzQzOwkJCQkJCSAgICBHRlBfS0VSTkVMLAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsCiYjNDM7CQkJCQkJICAgIE5VTEwpOwomIzQzOwomIzQzOwlyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTcxLDIyICYjNDM7MjQwLDQ0IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9tZW1vcnlfZXZlbnRzKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKLQogQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQogCiYjNDM7LyoKJiM0MzsgKiBQcm9hY3RpdmUgcmVjbGFpbSBuZWVkcyBhIGNsZWFuIHByb2Nlc3MgY29udGV4dCwgc28gaXQgaXMgcmVzdHJpY3RlZAomIzQzOyAqIHRvIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTC4gVGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyB0aGF0IGEKJiM0MzsgKiBTWVNDQUxMIHByb2dyYW0gc2NoZWR1bGVzIHJ1biBhcyB0aGUgc2FtZSBwcm9ncmFtIHR5cGUsIHNvIHRoZXkgY2FuCiYjNDM7ICogc3RpbGwgaW52b2tlIGl0OyBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyAoZS5nLiBmZW50cnkgb24gcmVjbGFpbQomIzQzOyAqIHBhdGhzLCBpbm9kZV9ybWRpcikgY2Fubm90LgomIzQzOyAqLwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jcywKIH07CiAKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7CiYjNDM7CS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLAomIzQzO307CiYjNDM7CiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiAJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTsKLQlpZiAoZXJyKQomIzQzOwlpZiAoZXJyKSB7CiAJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkJiMzNDssIGVycik7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl93YXJuKCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDY4NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSICYjMzQ7L3RhcmdldCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlCiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kCiYjNDM7ICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXIKJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvCiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMCkKJiM0MzsjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwCiYjNDM7I2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHMKJiM0MzsgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcAomIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZQomIzQzOyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjImIzM5O3MKJiM0MzsgKiBuby1pbnRlcm5hbC1wcm9jZXNzIGNvbnN0cmFpbnQga2VlcHMgdGhlIHJlZmF1bHRpbmcgd29ya2xvYWQgb3V0IG9mCiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzZXR1cF9keWluZ19jZ3JvdXBzKHU2NCAqdHJpZ2dlcl9jZ3JvdXBfaWQsIHU2NCAqdGFyZ2V0X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHMKJiM0MzsgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGUKJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzbwomIzQzOyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseQomIzQzOyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3AKJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkICE9IDApCiYjNDM7CQlyZXR1cm4gcGlkOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKQomIzQzOwkJX2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKQomIzQzOwkJCV9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kCiYjNDM7ICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZgomIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC4KJiM0MzsgKgomIzQzOyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kCiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZywKJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiByZWNsYWltX2NhbGxzIGdyb3dpbmcKJiM0MzsgKiB3aGlsZSB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmMKJiM0MzsgKiByZXR1cm5zIDAgb24gdGhlIGVtcHR5IHRhcmdldCwgYnV0IHRoZSBjYWxsIGlzIHN0aWxsIGNvdW50ZWQpLCBhbmQKJiM0MzsgKiBhZnRlciB0aGUgcmVtb3ZhbCB0aGUgc2tpcCBjb3VudGVycyBtdXN0IGdyb3cgd2hpbGUgcmVjbGFpbV9jYWxscwomIzQzOyAqIGFuZCByZWNsYWltZWRfYnl0ZXMgc3RheSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDsKJiM0MzsJdTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlOwomIzQzOwljaGFyIGRhdGFfZmlsZVtQQVRIX01BWF0gPSAmIzM0OyYjMzQ7OwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CXBpZF90IHJlYWRlcl9waWQgPSAtMTsKJiM0MzsJaW50IGVyciwgZmQsIGk7CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoJmFtcDt0cmlnZ2VyX2Nncm91cF9pZCwgJmFtcDt0YXJnZXRfY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2R5aW5nX2Nncm91cHMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfZHlpbmdfWFhYWFhYJiMzNDssIHdvcmtsb2FkX2ZpbGVzX2RpcigpKTsKJiM0MzsJZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlyZWFkZXJfcGlkID0gc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihkYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCAmIzM0O2Zvcmsga2VlcGFsaXZlIHJlYWRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMgJmd0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CiYjNDM7CS8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovCiYjNDM7CXVzbGVlcChEWUlOR19TRVRUTEVfVVMpOwomIzQzOwomIzQzOwljYWxsc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHM7CiYjNDM7CWJ5dGVzX2JlZm9yZSA9IHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUgfHwKJiM0MzsJCSAgICBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fc2tpcHBlZF9keWluZykKJiM0MzsJCQlicmVhazsKJiM0MzsJCXVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX3NraXBwZWRfZHlpbmcpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSkmIzM0OywKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSwKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVjawomIzQzOwkgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgaXQgaXMgaGl0IGlzIHRpbWluZwomIzQzOwkgKiBkZXBlbmRlbnQsIGJlY2F1c2UgdGhlIGNncm91cCBtYXkgYWxyZWFkeSBiZSBmdWxseSByZWxlYXNlZCwgc28KJiM0MzsJICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC4KJiM0MzsJICovCiYjNDM7CXByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVsbHUsIGR5aW5nPSVsbHVcbiYjMzQ7LAomIzQzOwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUsCiYjNDM7CSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsKJiM0MzsJLyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi8KJiM0MzsJaWYgKCFBU1NFUlRfRVEoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsICYjMzQ7cmVjbGFpbV9jYWxscyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLAomIzQzOwkJICAgICAgICYjMzQ7cmVjbGFpbWVkX2J5dGVzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAocmVhZGVyX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkodm9pZCl3YWl0cGlkKHJlYWRlcl9waWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CWlmIChkYXRhX2ZpbGVbMF0pCiYjNDM7CQl1bmxpbmsoZGF0YV9maWxlKTsKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDI1OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7LyoKJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkUKJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlCiYjNDM7ICogc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IG9uZSwgc28gbm8gY2FsbGJhY2sgcnVucyBsb25nZXIgdGhhbiBvbmUKJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJncyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5CiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7CiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlczsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gYXR0ZW1wdHMgc2tpcHBlZCBiZWNhdXNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nIG9yIGhhcwomIzQzOyAqIGJlZW4gcmVtb3ZlZC4gcmVjbGFpbV9za2lwcGVkX2R5aW5nIGNvdW50cyBsb29rdXBzIHRoYXQgc3RpbGwgZm91bmQKJiM0MzsgKiB0aGUgY2dyb3VwIHdoaWxlIGl0IGlzIGJlaW5nIHRvcm4gZG93biwgcmVjbGFpbV90YXJnZXRfZ29uZSBjb3VudHMKJiM0MzsgKiBsb29rdXBzIHRoYXQgZm91bmQgbm90aGluZy4gVGhlIHRlc3QgcmVtb3ZlcyB0aGUgdGFyZ2V0IGNncm91cCB3aGlsZQomIzQzOyAqIHJlY2xhaW0gaXMgcnVubmluZyBhbmQgY2hlY2tzIHRoYXQgcmVjbGFpbSBzdG9wcyB2aWEgdGhlc2UgY291bnRlcnMuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fc2tpcHBlZF9keWluZzsKJiM0Mzt1NjQgcmVjbGFpbV90YXJnZXRfZ29uZTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLAomIzQzOwkJYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLAomIzQzOwkJCQkgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvcgomIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpCiYjNDM7ICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFjawomIzQzOyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlbgomIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvbgomIzQzOyAqIHRoZSBsb29rdXAgZmFpbGluZy4KJiM0MzsgKgomIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbQomIzQzOyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0bwomIzQzOyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oCiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzbwomIzQzOyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtJmd0O3NlbGYuZmxhZ3M7CiYjNDM7CiYjNDM7CXJldHVybiAoZmxhZ3MgJmFtcDsgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzICZhbXA7IENTU19PTkxJTkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXMKJiM0MzsgKiByZWNsYWltZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CXU2NCBuciA9IDA7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkgewomIzQzOwkJcmVjbGFpbV90YXJnZXRfZ29uZSYjNDM7JiM0Mzs7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2dyb3VwX2lzX2R5aW5nKGNtLmNncnApKSB7CiYjNDM7CQlyZWNsYWltX3NraXBwZWRfZHlpbmcmIzQzOyYjNDM7OwomIzQzOwkJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwluciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgc2l6ZSk7CiYjNDM7CXJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7CS8qCiYjNDM7CSAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzCiYjNDM7CSAqIHJlcXVldWVzLiAwIG1lYW5zIG5vIHJvdW5kIGlzIGluIHByb2dyZXNzOyB0aGUgdGltZXIgcGF0aAomIzQzOwkgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3MKJiM0MzsJICogYXQgaXQuCiYjNDM7CSAqLwomIzQzOwl1NjQgcmVtYWluaW5nOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwl1NjQgbnIsIHNpemU7CiYjNDM7CiYjNDM7CWlmICghZWxlbS0mZ3Q7cmVtYWluaW5nKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlCiYjNDM7CQkgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzCiYjNDM7CQkgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGEKJiM0MzsJCSAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi8KJiM0MzsJc2l6ZSA9IGVsZW0tJmd0O3JlbWFpbmluZyAmbHQ7IFJFQ0xBSU1fU0laRSA/IGVsZW0tJmd0O3JlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTsKJiM0MzsJbnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTsKJiM0MzsJaWYgKCFucikgewomIzQzOwkJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovCiYjNDM7CWlmIChuciAmZ3Q7PSBlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwllbHNlCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgLT0gbnI7CiYjNDM7CiYjNDM7CS8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqLwomIzQzOwlpZiAoZWxlbS0mZ3Q7cmVtYWluaW5nKQomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ4ODkKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxMTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQb3RlbnRpYWwgZm9yIEZ1enppbmc6IEEgU3RyYXRlZ2ljIEFzc2Vzc21lbnQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBuZXcgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAga2Z1bmMgaXMgZXZlbiBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLCBhbmQgaWYgc28sIGhvdyB0byBhcHByb2FjaCBpdC4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIHBhdGNoLgoKUmlnaHQsIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYyB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBOb3csIEkgbmVlZCB0byBjaGVjayB0aGUgY29kZWJhc2UgdG8gdW5kZXJzdGFuZCB3aGF0ICplbmFibGVzKiB0aGlzIGZ1bmN0aW9uYWxpdHkuIEkmIzM5O2xsIG5lZWQgdG8gZXhhbWluZSBgbW0vYnBmX21lbWNvbnRyb2wuY2AgaXRzZWxmLCBhbmQgcXVpY2tseSBkaXZlIGludG8gdGhlIHJlbGV2YW50IGBNYWtlZmlsZWAgYW5kIGBLY29uZmlnYCBmaWxlcyB3aXRoaW4gdGhlIGBtbWAgZGlyZWN0b3J5LiBUaGF0IHdpbGwgdGVsbCBtZSB3aGljaCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdHJpZ2dlciB0aGUgaW5jbHVzaW9uIG9mIGBtbS9icGZfbWVtY29udHJvbC5jYCwgdGh1cyBhbHNvIGluZm9ybWluZyB3aGF0IGNvbmZpZ3VyYXRpb25zIEkmIzM5O2xsIG5lZWQgdG8gZW5hYmxlIGR1cmluZyBmdXp6aW5nIHRvIGV2ZW4gbWFrZSB0aGlzIGNvZGUgcGF0aCBhY3RpdmUuIE9uY2UgSSBrbm93IHdoYXQgdHJpZ2dlcnMgdGhlIGluY2x1c2lvbiBvZiB0aGUgbmV3IGNvZGUsIEkmIzM5O2xsIHRoZW4gZGV0ZXJtaW5lIHdoaWNoIHN5bWJvbHMgYXJlIGdvb2QgZm9jdXMgcG9pbnRzIHRvIGV4dHJhY3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX21lbWNvbnRyb2wmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmM9MjMxPV9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTIzMi1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjMzOkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yMzQtQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDI9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG5tbS9icGZfbWVtY29udHJvbC5jOjI0MzpCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5tbS9icGZfbWVtY29udHJvbC5jLTI0NC1cbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTI1MS0gKi9cbm1tL2JwZl9tZW1jb250cm9sLmM6MjUyOkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXG5tbS9icGZfbWVtY29udHJvbC5jLTI1My1CVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG5tbS9icGZfbWVtY29udHJvbC5jOjI1NDpCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU1LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTY6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU3LVx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG5tbS9icGZfbWVtY29udHJvbC5jOjI1ODpcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU5LX07XG5tbS9icGZfbWVtY29udHJvbC5jLTI2MC1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjYxOnN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCA9IHtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjYyLVx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG5tbS9icGZfbWVtY29udHJvbC5jOjI2MzpcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjQtfTtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjY1LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNjY6c3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjcte1xuLS1cbm1tL2JwZl9tZW1jb250cm9sLmMtMjcwLVx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjcxOlx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNzItXHRpZiAoZXJyKSB7XG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNzctXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcbm1tL2JwZl9tZW1jb250cm9sLmM6Mjc4Olx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTI3OS1cdGlmIChlcnIpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yODMtfVxubW0vYnBmX21lbWNvbnRyb2wuYzoyODQ6bGF0ZV9pbml0Y2FsbChicGZfbWVtY29udHJvbF9pbml0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjIyMgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1tL2JwZl9tZW1jb250cm9sLmNgKioKCk9rYXksIHRpbWUgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgYnkgZGlnZ2luZyBpbnRvIGBtbS9icGZfbWVtY29udHJvbC5jYC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGUgQlBGIGludGVncmF0aW9uIHdpdGggbWVtb3J5IGNvbnRyb2wgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQuIEkmIzM5O20gZXNwZWNpYWxseSBjdXJpb3VzIGFib3V0IGhvdyB0aGUgaG9va3MgYXJlIHNldCB1cCBhbmQgaG93IHRoZSBCUEYgcHJvZ3JhbXMgaW50ZXJhY3Qgd2l0aCB0aGUgbWVtY2cgZGF0YSBzdHJ1Y3R1cmVzLiBJJiMzOTttIGV4cGVjdGluZyB0byBzZWUgY2FsbHMgcmVsYXRlZCB0byBgbWVtY2dfY3NzX2AsIGBtZW1fY2dyb3VwX2AsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIHBlci1jcHUgc3RhdHMuIEkmIzM5O20ga2VlbiB0byBzZWUgdGhlIHNwZWNpZmljIHBvaW50cyBvZiBpbmplY3Rpb246IGFsbG9jYXRpb24gcGF0aHMsIHJlY2xhaW0sIG1pZ3JhdGlvbiwgZXRjLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQmIzM5O3Mgc2VlIGhvdyB0aGUgQlBGIGhvb2tzIGludG8gdGhlc2UgY3JpdGljYWwgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtcy4gVWx0aW1hdGVseSwgSSYjMzk7bSB0cnlpbmcgdG8gZ3JvayB0aGUgb3ZlcmhlYWQgaW50cm9kdWNlZCBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHRoZSBsZXZlbCBvZiBjb250cm9sIGFmZm9yZGVkIGJ5IHRoaXMgaW50ZWdyYXRpb24uIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vYnBmX21lbWNvbnRyb2wuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTUwOlx0fVxuIDE1MTpcdFxuIDE1MjpcdC8qKlxuIDE1MzpcdCAqIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzIC0gRmx1c2ggbWVtb3J5IGNncm91cCYjMzk7cyBzdGF0aXN0aWNzXG4gMTU0Olx0ICogQG1lbWNnOiBtZW1vcnkgY2dyb3VwXG4gMTU1Olx0ICpcbiAxNTY6XHQgKiBQcm9wYWdhdGUgbWVtb3J5IGNncm91cCYjMzk7cyBzdGF0aXN0aWNzIHVwIHRoZSBjZ3JvdXAgdHJlZS5cbiAxNTc6XHQgKi9cbiAxNTg6XHRfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbiAxNTk6XHR7XG4gMTYwOlx0XHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiAxNjE6XHR9XG4gMTYyOlx0XG4gMTYzOlx0LypcbiAxNjQ6XHQgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4gMTY1Olx0ICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4gMTY2Olx0ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbiAxNjc6XHQgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuIDE2ODpcdCAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbiAxNjk6XHQgKi9cbiAxNzA6XHRzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4gMTcxOlx0e1xuIDE3MjpcdFx0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuIDE3MzpcdH1cbiAxNzQ6XHRcbiAxNzU6XHQvKipcbiAxNzY6XHQgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4gMTc3Olx0ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4gMTc4Olx0ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4gMTc5Olx0ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuIDE4MDpcdCAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcbiAxODE6XHQgKlxuIDE4MjpcdCAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiAxODM6XHQgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cbiAxODQ6XHQgKlxuIDE4NTpcdCAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuIDE4NjpcdCAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxuIDE4NzpcdCAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cbiAxODg6XHQgKlxuIDE4OTpcdCAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcbiAxOTA6XHQgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlXG4gMTkxOlx0ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4gMTkyOlx0ICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cbiAxOTM6XHQgKlxuIDE5NDpcdCAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4gMTk1Olx0ICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcbiAxOTY6XHQgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzXG4gMTk3Olx0ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4gMTk4Olx0ICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXG4gMTk5Olx0ICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdFxuIDIwMDpcdCAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuIDIwMTpcdCAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcbiAyMDI6XHQgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpc1xuIDIwMzpcdCAqIGR5aW5nLlxuIDIwNDpcdCAqXG4gMjA1Olx0ICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aFxuIDIwNjpcdCAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4gMjA3Olx0ICpcbiAyMDg6XHQgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbiAyMDk6XHQgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4gMjEwOlx0ICovXG4gMjExOlx0X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIDIxMjpcdFx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiAyMTM6XHR7XG4gMjE0Olx0XHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbiAyMTU6XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4gMjE2Olx0XG4gMjE3Olx0XHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4gMjE4Olx0XHRcdHJldHVybiAwO1xuIDIxOTpcdFxuIDIyMDpcdFx0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbiAyMjE6XHRcbiAyMjI6XHRcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxuIDIyMzpcdFx0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuIDIyNDpcdFx0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbiAyMjU6XHRcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4gMjI2Olx0XHRcdFx0XHRcdFx0ICAgIE5VTEwpO1xuIDIyNzpcdFxuIDIyODpcdFx0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbiAyMjk6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc4NTEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzMDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgUHJvYWN0aXZlIFJlY2xhaW0gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93biBzeXN0ZW1hdGljYWxseS4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGlzIGNoYW5nZS4gSXQgYXBwZWFycyB3ZSYjMzk7cmUgaW50cm9kdWNpbmcgYSBuZXcgQlBGIGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgLCB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGF0IGluIGl0c2VsZiBpcyBpbnRlcmVzdGluZy4gVGhpcyBrZnVuYywgY2FsbGFibGUgZnJvbSBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCDigJMgYW5kIGNydWNpYWxseSwgZnJvbSBhIHNsZWVwYWJsZSBjb250ZXh0IOKAkyB0aGVuIHByb2NlZWRzIHRvIGNhbGwgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuCgpOZXh0LCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGFwcGxpY2FiaWxpdHkuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQmIzM5O3MgZXZlbiAqcmVsZXZhbnQqIHRvIHN0YW5kYXJkIHZpcnR1YWxpemF0aW9uIHNldHVwcyBsaWtlIFFFTVU/IFRoZSBhbnN3ZXIsIEkgcXVpY2tseSBhc3Nlc3MsIGlzIGEgZGVmaW5pdGUgeWVzLiBUaGUgQlBGIHN1YnN5c3RlbSBpcyBlbnRpcmVseSByZWFjaGFibGUgdGhyb3VnaCBzeXNjYWxscyBsaWtlIGBicGYoQlBGX1BST0dfTE9BRClgIGFuZCBgYnBmKEJQRl9QUk9HX1RFU1RfUlVOKWAsIGFuZCBtZW1vcnkgY2dyb3VwcyBhcmUsIG9mIGNvdXJzZSwgZXF1YWxseSBhY2Nlc3NpYmxlLiBHaXZlbiB0aGF0IGJvdGggbWVtb3J5IG1hbmFnZW1lbnQgYW5kIEJQRiBrZnVuY3MgYXJlIGNvcmUgc3Vic3lzdGVtcywgdGhpcyBhcmVhIGlzIHNjcmVhbWluZyBmb3IgZnV6emluZy4gSXQmIzM5O3MgYSBwcmltZSB0YXJnZXQgZm9yIGZpbmRpbmcgc3VidGxlLCBwb3RlbnRpYWxseSBleHBsb2l0YWJsZSB2dWxuZXJhYmlsaXRpZXMuCgpOb3csIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIHByZXJlcXVpc2l0ZXMuIExvb2tpbmcgYXQgYG1tL01ha2VmaWxlYCwgdGhlIGluY2x1c2lvbiBvZiBgYnBmX21lbWNvbnRyb2wub2AgaGluZ2VzIG9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCwgaW1wbGljaXRseSwgYENPTkZJR19NRU1DR2AuIEZ1cnRoZXJtb3JlLCBgREVCVUdfSU5GT19CVEZgIGlzIHVzdWFsbHkgYSBuZWNlc3NhcnkgaW5ncmVkaWVudCBmb3IgQlRGIGtmdW5jcywgd2hpY2ggYXJlIGhlYXZpbHkgcmVsYXRlZCB0byBCUEYga2Z1bmMgc3VwcG9ydCwgYXMgd2VsbCBhcyBgQlBGX1NZU0NBTExgIGFuZCwgYWdhaW4sIGBNRU1DR2AuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnIG9wdGlvbnMgYXJvdW5kIEJURiwga2Z1bmNzLCBgQlBGX1NZU0NBTExgLCBhbmQgYE1FTUNHYCB0byBtYWtlIHN1cmUgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNldCBjb3JyZWN0bHksIGJ1dCB0aGlzIGFsbCBzZWVtcyBxdWl0ZSBwbGF1c2libGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYXJlbmEuYz0xMTMxPXN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcbmtlcm5lbC9icGYvYXJlbmEuYy0xMTMyLXtcbmtlcm5lbC9icGYvYXJlbmEuYzoxMTMzOlx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNmNvbW1vbl9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9hcmVuYS5jLTExMzQtfVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODkxOT1zdGF0aWMgaW50IGJ0Zl9wb3B1bGF0ZV9rZnVuY19zZXQoc3RydWN0IGJ0ZiAqYnRmLCBlbnVtIGJ0Zl9rZnVuY19ob29rIGhvb2ssXG4tLVxua2VybmVsL2JwZi9idGYuYy04OTY1LVx0c2V0ID0gdGFiLVx1MDAzZXNldHNbaG9va107XG5rZXJuZWwvYnBmL2J0Zi5jOjg5NjY6XHQvKiBXYXJuIHdoZW4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldCBpcyBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGhvb2tcbmtlcm5lbC9icGYvYnRmLmMtODk2Ny1cdCAqIGZvciBtb2R1bGUgc2V0cy5cbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTkxOTA9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXG4tLVxua2VybmVsL2JwZi9idGYuYy05MTk4LVxua2VybmVsL2JwZi9idGYuYzo5MTk5OnN0YXRpYyBpbnQgX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcbmtlcm5lbC9icGYvYnRmLmMtOTIwMC1cdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjUtLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgb25seSBmcm9tIGluaXRjYWxscy9tb2R1bGUgaW5pdCBmdW5jdGlvbnMgKi9cbmtlcm5lbC9icGYvYnRmLmM6OTIyNjppbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxua2VybmVsL2JwZi9idGYuYy05MjI3LVx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtOTIzOS1cdGhvb2sgPSBicGZfcHJvZ190eXBlX3RvX2tmdW5jX2hvb2socHJvZ190eXBlKTtcbmtlcm5lbC9icGYvYnRmLmM6OTI0MDpcdHJldHVybiBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoaG9vaywga3NldCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTkyNDEtfVxua2VybmVsL2JwZi9idGYuYzo5MjQyOkVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQpO1xua2VybmVsL2JwZi9idGYuYy05MjQzLVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9OTI0NT1pbnQgcmVnaXN0ZXJfYnRmX2Ztb2RyZXRfaWRfc2V0KGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxua2VybmVsL2JwZi9idGYuYy05MjQ2LXtcbmtlcm5lbC9icGYvYnRmLmM6OTI0NzpcdHJldHVybiBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlRGX0tGVU5DX0hPT0tfRk1PRFJFVCwga3NldCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTkyNDgtfVxuLS1cbmtlcm5lbC9icGYvY3B1bWFzay5jPTUxNT1zdGF0aWMgaW50IF9faW5pdCBjcHVtYXNrX2tmdW5jX2luaXQodm9pZClcbi0tXG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjUtXHRyZXQgPSBicGZfbWVtX2FsbG9jX2luaXQoXHUwMDI2YnBmX2NwdW1hc2tfbWEsIHNpemVvZihzdHJ1Y3QgYnBmX2NwdW1hc2spLCBmYWxzZSk7XG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1MjY6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsIFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNzpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI4Olx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjktXHRyZXR1cm4gIHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoY3B1bWFza19kdG9ycyxcbi0tXG5rZXJuZWwvYnBmL2NyeXB0by5jPTM3OT1zdGF0aWMgaW50IF9faW5pdCBjcnlwdG9fa2Z1bmNfaW5pdCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvY3J5cHRvLmMtMzg4LVxua2VybmVsL2JwZi9jcnlwdG8uYzozODk6XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcnlwdG8uYzozOTA6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkxOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MjpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcbmtlcm5lbC9icGYvY3J5cHRvLmMtMzkzLVx0XHRcdFx0XHQgICAgICAgXHUwMDI2Y3J5cHRfaW5pdF9rZnVuY19zZXQpO1xuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTQ5ODI9c3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQ5OTctXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0OTk4Olx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ5OTk6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMDpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfWERQLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAxOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TVFJVQ1RfT1BTLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAyOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAzOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU0tCLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA0LVx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhnZW5lcmljX2R0b3JzLFxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDYtXHRcdFx0XHRcdFx0ICBUSElTX01PRFVMRSk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDA3Olx0cmV0dXJuIHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcdTAwMjZjb21tb25fa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDgtfVxuLS1cbmtlcm5lbC9icGYvbWFwX2l0ZXIuYz0yMzA9c3RhdGljIGludCBpbml0X3N1YnN5c3RlbSh2b2lkKVxua2VybmVsL2JwZi9tYXBfaXRlci5jLTIzMS17XG5rZXJuZWwvYnBmL21hcF9pdGVyLmM6MjMyOlx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNmJwZl9tYXBfaXRlcl9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9tYXBfaXRlci5jLTIzMy19XG4tLVxua2VybmVsL2JwZi9ycXNwaW5sb2NrLmM9NzU5PXN0YXRpYyBfX2luaXQgaW50IHJxc3BpbmxvY2tfcmVnaXN0ZXJfa2Z1bmNzKHZvaWQpXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYy03NjAte1xua2VybmVsL2JwZi9ycXNwaW5sb2NrLmM6NzYxOlx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNnJxc3BpbmxvY2tfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2Mi19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2MjUKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgZm9jdXNpbmcgb24gdGhlIGltcGxpZWQgcmVhc29uaW5nOgoKKipDaGVja2luZyBLY29uZmlnIGZvciBDcnVjaWFsIEtlcm5lbCBGZWF0dXJlcyoqCgpSaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gc3RhdGUuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB3aGV0aGVyIGBNRU1DR2AgKG1lbW9yeSBjZ3JvdXBzKSBpcyBlbmFibGVkLiBJdCYjMzk7cyBhbG1vc3QgYSBnaXZlbiB0aGF0IGl0JiMzOTtzIGltcG9ydGFudCBmb3IgdGhpcyBraW5kIG9mIHdvcmssIGJ1dCBJIGFsd2F5cyB3YW50IHRvIGNvbmZpcm0uIEl0JiMzOTtzIGxpa2VseSBpbnZvbHZlZCBpbiByZXNvdXJjZSBtYW5hZ2VtZW50IGZvciB3aGF0ZXZlciBJJiMzOTttIHRyb3VibGVzaG9vdGluZyBvciBkZXZlbG9waW5nLiBUaGVuLCBJIG5lZWQgdG8gdmVyaWZ5IGBCUEZfU1lTQ0FMTGAgYXMgd2VsbCwgYmVjYXVzZSBJJiMzOTttIGJldHRpbmcgSSYjMzk7bGwgYmUgdG91Y2hpbmcgZUJQRiBhdCBzb21lIHBvaW50LCBlaXRoZXIgZm9yIGluc3RydW1lbnRhdGlvbiBvciBmb3IgZmlsdGVyaW5nLiBDaGVja2luZyB0aGVzZSBpbiBLY29uZmlnIHdpbGwgbGV0IG1lIGtub3cgd2hldGhlciBJIG5lZWQgdG8gcmVjb21waWxlIHRoZSBrZXJuZWwsIG9yIGlmIHRoZXNlIGFyZSBhbHJlYWR5IGVuYWJsZWQgb24gdGhlIHN5c3RlbSBJIGFtIHdvcmtpbmcgd2l0aC4gTWFraW5nIHN1cmUgdGhlc2UgYXJlIHNldCBjb3JyZWN0bHkgaXMgYSBmb3VuZGF0aW9uYWwgc3RlcCBiZWZvcmUgZGlnZ2luZyBpbnRvIHRoZSBkZXRhaWxzLiBUaW1lIHRvIGdldCB0aGUgbGF5IG9mIHRoZSBsYW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTUVNQ0cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTEwNjc9Y29uZmlnIENHUk9VUF9GQVZPUl9EWU5NT0RTXG4tLVxuaW5pdC9LY29uZmlnLTEwNzYtXG5pbml0L0tjb25maWc6MTA3Nzpjb25maWcgTUVNQ0dcbmluaXQvS2NvbmZpZy0xMDc4LVx0Ym9vbCBcJiMzNDtNZW1vcnkgY29udHJvbGxlclwmIzM0O1xuLS1cbmluaXQvS2NvbmZpZy0xMDg1LVxuaW5pdC9LY29uZmlnOjEwODY6Y29uZmlnIE1FTUNHX05NSV9VTlNBRkVcbmluaXQvS2NvbmZpZy0xMDg3LVx0Ym9vbFxuLS1cbmluaXQvS2NvbmZpZy0xMDkyLVxuaW5pdC9LY29uZmlnOjEwOTM6Y29uZmlnIE1FTUNHX05NSV9TQUZFVFlfUkVRVUlSRVNfQVRPTUlDXG5pbml0L0tjb25maWctMTA5NC1cdGJvb2xcbi0tXG5pbml0L0tjb25maWctMTA5OS1cbmluaXQvS2NvbmZpZzoxMTAwOmNvbmZpZyBNRU1DR19WMVxuaW5pdC9LY29uZmlnLTExMDEtXHRib29sIFwmIzM0O0xlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXJcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjExMTMKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIEJQRiBTeXNjYWxsIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgSSBuZWVkIHRvIHBpbnBvaW50IHdoZXJlIHRoZSBgQlBGX1NZU0NBTExgIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIGRlZmluZWQuIEtub3dpbmcgdGhlIGtlcm5lbCYjMzk7cyBLY29uZmlnIHN0cnVjdHVyZSBsaWtlIHRoZSBiYWNrIG9mIG15IGhhbmQsIG15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGNoZWNrIGVpdGhlciBgaW5pdC9LY29uZmlnYCBvciBga2VybmVsL2JwZi9LY29uZmlnYC4gVGhvc2UgYXJlIHRoZSB0d28gbW9zdCBsb2dpY2FsIHBsYWNlcyB0byBzdGFydCBsb29raW5nIGZvciBhIEJQRi1yZWxhdGVkIHNldHRpbmcuIEl0JiMzOTtzIGFsbW9zdCBjZXJ0YWluIGl0JiMzOTtsbCBiZSBpbiBvbmUgb2YgdGhvc2UsIG9yIHBlcmhhcHMgY3Jvc3MtcmVmZXJlbmNlZCBiZXR3ZWVuIHRoZW0uIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgQlBGIHN5c2NhbGwgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGF0IGJ1aWxkIHRpbWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5pdC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTMzNAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSHVudGluZyBmb3IgQlBGX1NZU0NBTEwgaW4gdGhlIENvbmZpZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIGBCUEZfU1lTQ0FMTGAuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgYXNzdW1pbmcgaXQmIzM5O3MgbGlrZWx5IGEga2VybmVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLCBwcm9iYWJseSB1bmRlciBvbmUgb2YgdGhlIGJyb2FkZXIgQlBGIG9yIHNlY3VyaXR5LXJlbGF0ZWQgc2VjdGlvbnMuIFNpbmNlIGl0JiMzOTtzIGEgc3lzY2FsbC1yZWxhdGVkIGZlYXR1cmUsIEkgY2FuIGFsbW9zdCBndWFyYW50ZWUgaXRzIGV4aXN0ZW5jZS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGl0JiMzOTtzIGRlZmluZWQgYW5kIHdoYXQgZGVwZW5kZW5jaWVzIGl0IG1pZ2h0IGhhdmUuIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIHVzZSB0aGUgc3RhbmRhcmQgdG9vbHM7IGEgYGdyZXBgIHRocm91Z2ggdGhlIGtlcm5lbCYjMzk7cyBgS2NvbmZpZ2AgZmlsZXMgc2hvdWxkIGRvIHRoZSB0cmljaywgbWF5YmUgc3RhcnRpbmcgd2l0aCBhIHdpbGRjYXJkIHNlYXJjaCBsaWtlIGBLY29uZmlnKiBCUEZfU1lTQ0FMTGAuIE9yIHBlcmhhcHMgSSB3aWxsIHVzZSAmIzM5O2ZpbmQmIzM5OyBhbmQgJiMzOTtncmVwJiMzOTsgY29tbWFuZHMgdG8gc2VhcmNoLiBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvZGViYXNlLCBJIG1pZ2h0IG5lZWQgdG8gcmVmaW5lIHRoYXQgc2VhcmNoIGlmIGl0JiMzOTtzIHRvbyBicm9hZCBpbml0aWFsbHkuIEkmIzM5O2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgY29udGV4dCBhcm91bmQgdGhhdCBvcHRpb24g4oCTIHdoYXQgb3RoZXIgZmVhdHVyZXMgZG9lcyBpdCBlbmFibGUgb3IgZGlzYWJsZT8gQXJlIHRoZXJlIGFueSBwcmVyZXF1aXNpdGVzIEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQW5kIG1vcmUgaW1wb3J0YW50bHksIHdoYXQmIzM5O3MgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBJJiMzOTtsbCBwcm9iYWJseSBhbHNvIGNoZWNrIHJlbGV2YW50IGBNYWtlZmlsZWBzIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgY29uZmlnIG9wdGlvbiB0cmFuc2xhdGVzIGludG8gYnVpbGQgZmxhZ3MgYW5kIHVsdGltYXRlbHksIGhvdyBpdCBhZmZlY3RzIHRoZSBnZW5lcmF0ZWQga2VybmVsIGNvZGUuIElkZWFsbHksIEkmIzM5O2xsIGZpbmQgYSBjb25jaXNlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIG9wdGlvbiBhY3R1YWxseSAqZG9lcyogYWxvbmcgdGhlIHdheS4gVGhhdCYjMzk7cyB0aGUgcHJpb3JpdHkgcmlnaHQgbm93LCBmaW5kaW5nIGl0cyBkZWZpbml0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNzgzCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKkludmVzdGlnYXRpbmcgdGhlIERFQlVHX0lORk9fQlRGIERlcGVuZGVuY3kgZm9yIEJURiBLZnVuY3MqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkmIzM5O20gdGFraW5nIGEgbG9vayBhdCBob3cgYERFQlVHX0lORk9fQlRGYCB0aWVzIGludG8gQlRGIGtmdW5jcy4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzOiAqaXMqIGl0IGEgaGFyZCBkZXBlbmRlbmN5PyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiBgREVCVUdfSU5GT19CVEZgIGlzIHN0cmljdGx5ICpyZXF1aXJlZCogZm9yIHRoZSBwcm9wZXIgZnVuY3Rpb25hbGl0eSBhbmQgZ2VuZXJhdGlvbiBvZiBCVEYgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBrZnVuY3MsIG9yIGlmIHRoZXJlJiMzOTtzIHNvbWUgbGV2ZWwgb2YgZmxleGliaWxpdHkgaGVyZS4gVGhpcyBoYXMgaW1wbGljYXRpb25zIGZvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9ucyBhbmQgaG93IHdlIGNhbiBhcHByb2FjaCB0b29saW5nLiBJJiMzOTt2ZSBnb3QgYSBtZW50YWwgY2hlY2tsaXN0IGFscmVhZHk6IElzIGl0IG5lY2Vzc2FyeSBmb3IgdGhlICpjcmVhdGlvbiogb2Yga2Z1bmMgQlRGLCBvciBqdXN0IGZvciBtb3JlIGRldGFpbGVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbj8gRG9lcyBpdCBpbXBhY3QgcnVudGltZSBwZXJmb3JtYW5jZSBvciBvbmx5IGNvbXBpbGF0aW9uIHRpbWU/IEkgbmVlZCB0byBkaWcgaW50byB0aGUgcmVsZXZhbnQgY29kZSBwYXRocyBhbmQgYnVpbGQgcHJvY2Vzc2VzLiBHb3R0YSBzdGFydCB3aXRoIHRoZSBCVEYgZ2VuZXJhdGlvbiBhbmQgc3ltYm9sIHRhYmxlIGFuYWx5c2lzIGFuZCBzZWUgd2hlcmUgdGhhdCBiaXQgb2YgaW5mb3JtYXRpb24gcGx1Z3MgaW4uIEVzc2VudGlhbGx5LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcHJlY2lzZSBzY29wZSBvZiB0aGlzIGRlcGVuZGVuY3kuIEl0JiMzOTtzIHRpbWUgdG8gZmlyZSB1cCB0aGUgdG9vbHMgYW5kIHRyYWNlIHRoZSBmbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9idGYuaD01ODg9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTU4OS1cdFx0XHRcdGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjU5MDppbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxuaW5jbHVkZS9saW51eC9idGYuaC01OTEtXHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKnMpO1xuLS1cbmluY2x1ZGUvbGludXgvYnRmLmg9NjQ4PXN0YXRpYyBpbmxpbmUgdTMyICpidGZfa2Z1bmNfaWRfc2V0X2NvbnRhaW5zKGNvbnN0IHN0cnVjdCBidGYgKmJ0Zixcbi0tXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTY1NC19XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjY1NTpzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTY1Ni1cdFx0XHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjM2MQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKk5hdmlnYXRpbmcgdGhlIEJURiBNYXplKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHNvbWV0aGluZyByZWxhdGVkIHRvIEJURiAoQmVya2VsZXkgZUJQRiBUeXBlIEZvcm1hdCkgYW5kIHRyeWluZyB0byBmaWd1cmUgb3V0IGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gcGF0aC4gTXkgaW50dWl0aW9uIGlzIHRlbGxpbmcgbWUgdGhhdCB0aGUgcmVsZXZhbnQgY29kZSBtaWdodCBoaW5nZSBvbiBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19ERUJVR19JTkZPX0JURmAgYmVpbmcgZGVmaW5lZC4gU28sIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBhbmQgc2VlIGhvdyB0aGV5IGludGVyYWN0LiBNeSBtZW50YWwgbWFwIHBvaW50cyBtZSB0b3dhcmRzIGBpbmNsdWRlL2xpbnV4L2J0Zi5oYCBhcyB0aGUgbGlrZWx5IGxvY2F0aW9uLCBhbmQgc2luY2UgdGhlc2Ugc29ydHMgb2YgY29uZGl0aW9uYWxzIG9mdGVuIGNsdXN0ZXIgdG9nZXRoZXIsIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIGxpbmVzIHJvdWdobHkgYmV0d2VlbiA1ODAgYW5kIDY2MC4gSG9wZWZ1bGx5LCBpdCYjMzk7cyBsYWlkIG91dCBpbiBhIHdheSB0aGF0JiMzOTtzIGVhc3kgdG8gcmVhZCBhbmQgSSBjYW4gcXVpY2tseSBhc2NlcnRhaW4gd2hldGhlciBteSBodW5jaCBpcyByaWdodCBhbmQgd2hhdCB0aGUgbG9naWMgZmxvdyBpcy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZmluZCBlaXRoZXIgYW4gYCNpZmAgYmxvY2sgb3Igc29tZXRoaW5nIHNpbWlsYXIgdGhhdCBhZGRyZXNzZXMgdGhvc2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuIFRoaXMgc2hvdWxkIGJlIGEgcXVpY2sgY2hlY2ssIGhvcGVmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2J0Zi5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDgwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1ODA6XHRcbiA1ODE6XHRjb25zdCBjaGFyICpidGZfbmFtZV9ieV9vZmZzZXQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgb2Zmc2V0KTtcbiA1ODI6XHRjb25zdCBjaGFyICpidGZfc3RyX2J5X29mZnNldChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBvZmZzZXQpO1xuIDU4MzpcdHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV92bWxpbnV4KHZvaWQpO1xuIDU4NDpcdHN0cnVjdCBidGYgKmJwZl9wcm9nX2dldF90YXJnZXRfYnRmKGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XG4gNTg1Olx0dTMyICpidGZfa2Z1bmNfZmxhZ3MoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIga2Z1bmNfYnRmX2lkLCBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpO1xuIDU4NjpcdGludCBidGZfa2Z1bmNfY2hlY2tfZmxhZyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsIHUzMiBmbGFnKTtcbiA1ODc6XHRib29sIGJ0Zl9rZnVuY19pc19hbGxvd2VkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCwgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nKTtcbiA1ODg6XHR1MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcbiA1ODk6XHRcdFx0XHRcdGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XG4gNTkwOlx0aW50IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcbiA1OTE6XHRcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqcyk7XG4gNTkyOlx0aW50IHJlZ2lzdGVyX2J0Zl9mbW9kcmV0X2lkX3NldChjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldCk7XG4gNTkzOlx0czMyIGJ0Zl9maW5kX2R0b3Jfa2Z1bmMoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKTtcbiA1OTQ6XHRpbnQgcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGNvbnN0IHN0cnVjdCBidGZfaWRfZHRvcl9rZnVuYyAqZHRvcnMsIHUzMiBhZGRfY250LFxuIDU5NTpcdFx0XHRcdFx0c3RydWN0IG1vZHVsZSAqb3duZXIpO1xuIDU5NjpcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKmJ0Zl9maW5kX3N0cnVjdF9tZXRhKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZCk7XG4gNTk3Olx0Ym9vbCBidGZfaXNfcHJvamVjdGlvbl9vZihjb25zdCBjaGFyICpwbmFtZSwgY29uc3QgY2hhciAqdG5hbWUpO1xuIDU5ODpcdGJvb2wgYnRmX2lzX3Byb2dfY3R4X3R5cGUoc3RydWN0IGJwZl92ZXJpZmllcl9sb2cgKmxvZywgY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIDU5OTpcdFx0XHRcdCAgIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCwgZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcbiA2MDA6XHRcdFx0XHQgICBpbnQgYXJnKTtcbiA2MDE6XHRpbnQgZ2V0X2tlcm5fY3R4X2J0Zl9pZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLCBlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlKTtcbiA2MDI6XHRib29sIGJ0Zl90eXBlc19hcmVfc2FtZShjb25zdCBzdHJ1Y3QgYnRmICpidGYxLCB1MzIgaWQxLFxuIDYwMzpcdFx0XHRcdGNvbnN0IHN0cnVjdCBidGYgKmJ0ZjIsIHUzMiBpZDIpO1xuIDYwNDpcdGludCBidGZfY2hlY2tfaXRlcl9hcmcoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmZ1bmMsIGludCBhcmdfaWR4KTtcbiA2MDU6XHRcbiA2MDY6XHRzdGF0aWMgaW5saW5lIGJvb2wgYnRmX3R5cGVfaXNfc3RydWN0X3B0cihzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdClcbiA2MDc6XHR7XG4gNjA4Olx0XHRpZiAoIWJ0Zl90eXBlX2lzX3B0cih0KSlcbiA2MDk6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDYxMDpcdFxuIDYxMTpcdFx0dCA9IGJ0Zl90eXBlX3NraXBfbW9kaWZpZXJzKGJ0ZiwgdC1cdTAwM2V0eXBlLCBOVUxMKTtcbiA2MTI6XHRcbiA2MTM6XHRcdHJldHVybiBidGZfdHlwZV9pc19zdHJ1Y3QodCk7XG4gNjE0Olx0fVxuIDYxNTpcdCNlbHNlXG4gNjE2Olx0c3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmJ0Zl90eXBlX2J5X2lkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiA2MTc6XHRcdFx0XHRcdFx0XHQgICAgdTMyIHR5cGVfaWQpXG4gNjE4Olx0e1xuIDYxOTpcdFx0cmV0dXJuIE5VTEw7XG4gNjIwOlx0fVxuIDYyMTpcdFxuIDYyMjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBidGZfc2V0X2Jhc2VfYnRmKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0ZiAqYmFzZV9idGYpXG4gNjIzOlx0e1xuIDYyNDpcdH1cbiA2MjU6XHRcbiA2MjY6XHRzdGF0aWMgaW5saW5lIGludCBidGZfcmVsb2NhdGUodm9pZCAqbG9nLCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGYgKmJhc2VfYnRmLFxuIDYyNzpcdFx0XHRcdCAgICAgICBfX3UzMiAqKm1hcF9pZHMpXG4gNjI4Olx0e1xuIDYyOTpcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDYzMDpcdH1cbiA2MzE6XHRcbiA2MzI6XHRzdGF0aWMgaW5saW5lIGludCBidGZfZmllbGRfaXRlcl9pbml0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQsIHN0cnVjdCBidGZfdHlwZSAqdCxcbiA2MzM6XHRcdFx0XHRcdCAgICAgIGVudW0gYnRmX2ZpZWxkX2l0ZXJfa2luZCBpdGVyX2tpbmQpXG4gNjM0Olx0e1xuIDYzNTpcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDYzNjpcdH1cbiA2Mzc6XHRcbiA2Mzg6XHRzdGF0aWMgaW5saW5lIF9fdTMyICpidGZfZmllbGRfaXRlcl9uZXh0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQpXG4gNjM5Olx0e1xuIDY0MDpcdFx0cmV0dXJuIE5VTEw7XG4gNjQxOlx0fVxuIDY0MjpcdFxuIDY0MzpcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYnRmX25hbWVfYnlfb2Zmc2V0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiA2NDQ6XHRcdFx0XHRcdFx0ICAgICB1MzIgb2Zmc2V0KVxuIDY0NTpcdHtcbiA2NDY6XHRcdHJldHVybiBOVUxMO1xuIDY0NzpcdH1cbiA2NDg6XHRzdGF0aWMgaW5saW5lIHUzMiAqYnRmX2tmdW5jX2lkX3NldF9jb250YWlucyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4gNjQ5Olx0XHRcdFx0XHRcdCAgICAgdTMyIGtmdW5jX2J0Zl9pZCxcbiA2NTA6XHRcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXG4gNjUxOlx0XG4gNjUyOlx0e1xuIDY1MzpcdFx0cmV0dXJuIE5VTEw7XG4gNjU0Olx0fVxuIDY1NTpcdHN0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcbiA2NTY6XHRcdFx0XHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxuIDY1NzpcdHtcbiA2NTg6XHRcdHJldHVybiAwO1xuIDY1OTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQyNzQKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoYXQgY29kZSBzbmlwcGV0OgoKKipEaXZpbmcgaW50byBgYnRmLmhgJiMzOTtzIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gZ2V0dGluZyByZWFkeSB0byBwb2tlIGFyb3VuZCBpbiB0aGUgYGluY2x1ZGUvbGludXgvYnRmLmhgIGZpbGUsIHNwZWNpZmljYWxseSB0aGUgYCNpZmRlZmAgYmxvY2tzLiBJIHdhbnQgdG8gc2VlIHdoYXQmIzM5O3MgYmVpbmcgY29uZGl0aW9uYWxseSBjb21waWxlZCBhbmQgd2h5LiBUaGlzIGlzIGxpa2VseSB3aGVyZSB0aGUgY29yZSBvZiB0aGUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIGRlZmluaXRpb25zIGFuZCByZWxhdGVkIHN0cnVjdHVyZXMgYXJlIGRlY2xhcmVkLCBvciBtYXliZSBpdCBzZXRzIHVwIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBiYXNlZCBvbiBrZXJuZWwgZmVhdHVyZXMgb3IgY29tcGlsZS10aW1lIG9wdGlvbnMuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgYSBsb3Qgb2YgZXNzZW50aWFsIGRhdGEgc3RydWN0dXJlcyBhbmQgcG9zc2libHkgc29tZSBtYWNybyBkZWZpbml0aW9ucyB0aGF0IHJlYWxseSBkcml2ZSB0aGUgQlRGIGhhbmRsaW5nIGF0IHRoZSBsb3dlc3QgbGV2ZWxzLiBJJiMzOTtsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbmRpdGlvbnMgdGhhdCB0cmlnZ2VyIHRoZXNlIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhbmQgaG93IHRoZXkgaW1wYWN0IHRoZSBvdmVyYWxsIEJURiBpbXBsZW1lbnRhdGlvbi4gVGltZSB0byBkaWcgaW4hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9idGYuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTQwOlx0c3RydWN0IGJwZl9zdHJ1Y3Rfb3BzO1xuIDU0MTpcdGludCBfX3JlZ2lzdGVyX2JwZl9zdHJ1Y3Rfb3BzKHN0cnVjdCBicGZfc3RydWN0X29wcyAqc3Rfb3BzKTtcbiA1NDI6XHRjb25zdCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHNfZGVzYyAqYnBmX3N0cnVjdF9vcHNfZmluZF92YWx1ZShzdHJ1Y3QgYnRmICpidGYsIHUzMiB2YWx1ZV9pZCk7XG4gNTQzOlx0Y29uc3Qgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzX2Rlc2MgKmJwZl9zdHJ1Y3Rfb3BzX2ZpbmQoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdHlwZV9pZCk7XG4gNTQ0Olx0I2Vsc2VcbiA1NDU6XHRzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBicGZfc3RydWN0X29wc19kZXNjICpicGZfc3RydWN0X29wc19maW5kKHN0cnVjdCBidGYgKmJ0ZiwgdTMyIHR5cGVfaWQpXG4gNTQ2Olx0e1xuIDU0NzpcdFx0cmV0dXJuIE5VTEw7XG4gNTQ4Olx0fVxuIDU0OTpcdCNlbmRpZlxuIDU1MDpcdFxuIDU1MTpcdGVudW0gYnRmX2ZpZWxkX2l0ZXJfa2luZCB7XG4gNTUyOlx0XHRCVEZfRklFTERfSVRFUl9JRFMsXG4gNTUzOlx0XHRCVEZfRklFTERfSVRFUl9TVFJTLFxuIDU1NDpcdH07XG4gNTU1Olx0XG4gNTU2Olx0c3RydWN0IGJ0Zl9maWVsZF9kZXNjIHtcbiA1NTc6XHRcdC8qIG9uY2UtcGVyLXR5cGUgb2Zmc2V0cyAqL1xuIDU1ODpcdFx0aW50IHRfb2ZmX2NudCwgdF9vZmZzWzJdO1xuIDU1OTpcdFx0LyogbWVtYmVyIHN0cnVjdCBzaXplLCBvciB6ZXJvLCBpZiBubyBtZW1iZXJzICovXG4gNTYwOlx0XHRpbnQgbV9zejtcbiA1NjE6XHRcdC8qIHJlcGVhdGVkIHBlci1tZW1iZXIgb2Zmc2V0cyAqL1xuIDU2MjpcdFx0aW50IG1fb2ZmX2NudCwgbV9vZmZzWzFdO1xuIDU2MzpcdH07XG4gNTY0Olx0XG4gNTY1Olx0c3RydWN0IGJ0Zl9maWVsZF9pdGVyIHtcbiA1NjY6XHRcdHN0cnVjdCBidGZfZmllbGRfZGVzYyBkZXNjO1xuIDU2NzpcdFx0dm9pZCAqcDtcbiA1Njg6XHRcdGludCBtX2lkeDtcbiA1Njk6XHRcdGludCBvZmZfaWR4O1xuIDU3MDpcdFx0aW50IHZsZW47XG4gNTcxOlx0fTtcbiA1NzI6XHRcbiA1NzM6XHQjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4gNTc0Olx0Y29uc3Qgc3RydWN0IGJ0Zl90eXBlICpidGZfdHlwZV9ieV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiB0eXBlX2lkKTtcbiA1NzU6XHR2b2lkIGJ0Zl9zZXRfYmFzZV9idGYoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0Zik7XG4gNTc2Olx0aW50IGJ0Zl9yZWxvY2F0ZShzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGYgKmJhc2VfYnRmLCBfX3UzMiAqKm1hcF9pZHMpO1xuIDU3NzpcdGludCBidGZfZmllbGRfaXRlcl9pbml0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQsIHN0cnVjdCBidGZfdHlwZSAqdCxcbiA1Nzg6XHRcdFx0XHRlbnVtIGJ0Zl9maWVsZF9pdGVyX2tpbmQgaXRlcl9raW5kKTtcbiA1Nzk6XHRfX3UzMiAqYnRmX2ZpZWxkX2l0ZXJfbmV4dChzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIgKml0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjUyNDUKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBCVEYgYW5kIERlYnVnIEluZm9ybWF0aW9uIFJlcXVpcmVtZW50cyoqCgpSaWdodCwgc28gSSBuZWVkIHRvIGNsYXJpZnkgc29tZXRoaW5nIGFib3V0IHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgYW5kIGtmdW5jcyAoa2VybmVsIGZ1bmN0aW9ucykuIEkmIzM5O20gcHJldHR5IHN1cmUgSSBoYXZlIGEgaGFuZGxlIG9uIHRoaXMsIGJ1dCBsZXQmIzM5O3MganVzdCBtYWtlIGFic29sdXRlbHkgc3VyZSwgYW5kIGRvdWJsZSBjaGVjayBteSBhc3N1bXB0aW9uIHJlZ2FyZGluZyB0aGUgYERFQlVHX0lORk9fQlRGYCBjb25maWd1cmF0aW9uIG9wdGlvbi4gSSBuZWVkIHRvIGtub3cgaWYgaXQmIzM5O3Mgc3RyaWN0bHkgKnJlcXVpcmVkKiBmb3IgQlRGIGtmdW5jIGZ1bmN0aW9uYWxpdHkgd2l0aGluIHRoZSBrZXJuZWwgaXRzZWxmLgoKTXkgZ3V0IGZlZWxpbmcgaXMgdGhhdCBpdCBpc24mIzM5O3QuIEJURiBzdXBwb3J0IGhhcyBiZWVuIGV2b2x2aW5nLCBhbmQgSSBoYXZlIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBtaWdodCBoYXZlIGRlY291cGxlZCBmcm9tIHJlcXVpcmluZyB0aGlzIHBhcnRpY3VsYXIgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBlc3BlY2lhbGx5IGdpdmVuIHJlY2VudCBvcHRpbWl6YXRpb24gZWZmb3J0cy4gSG93ZXZlciwgbGV0JiMzOTtzIG5vdCByZWx5IG9uIGludHVpdGlvbiBhbG9uZS4gVGhlIGRlZmluaXRpdmUgYW5zd2VyIGlzIGFsd2F5cyB3aXRoaW4gdGhlIGNvZGUuIFRpbWUgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBzb3VyY2UsIHNwZWNpZmljYWxseSBga2VybmVsL2JwZi9idGYuY2AuIFRoYXQmIzM5O3MgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQg4oCTIGl0JiMzOTtzIHRoZSBoZWFydCBvZiB0aGUgQlRGIGltcGxlbWVudGF0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBjb2RlIGluIGBidGYuY2AsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIHJlbGV2YW50IGNvbXBpbGF0aW9uIGZsYWdzIGFuZCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLCBhbmQgcGlucG9pbnQgYW55IGRlcGVuZGVuY2llcyBvciBlcnJvciBoYW5kbGluZyByZWxhdGVkIHRvIGBERUJVR19JTkZPX0JURmAuIE9ubHkgdGhlbiBjYW4gSSBiZSBjZXJ0YWluIHdoZXRoZXIgdGhlIG9wdGlvbiBpcyBzdHJpY3RseSBhIHJlcXVpcmVtZW50IG9yIG1vcmUgb2YgYW4gb3B0aW9uYWwgZW5oYW5jZW1lbnQgZm9yIHRoZSBCVEYga2Z1bmMgY2FwYWJpbGl0aWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfREVCVUdfSU5GT19CVEYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL01ha2VmaWxlPTQzPWlmZXEgKCQoQ09ORklHX1NZU0ZTKSx5KVxua2VybmVsL2JwZi9NYWtlZmlsZTo0NDpvYmotJChDT05GSUdfREVCVUdfSU5GT19CVEYpICYjNDM7PSBzeXNmc19idGYub1xua2VybmVsL2JwZi9NYWtlZmlsZS00NS1lbmRpZlxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjQwMT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY0MDYtXG5rZXJuZWwvYnBmL2J0Zi5jOjY0MDc6XHRpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSlcbmtlcm5lbC9icGYvYnRmLmMtNjQwOC1cdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4tLVxua2VybmVsL2JwZi9idGYuYz02NDg3PV9fdTMyIGJ0Zl9yZWxvY2F0ZV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIF9fdTMyIGlkKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjQ5My1cbmtlcm5lbC9icGYvYnRmLmM6NjQ5NDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtNjQ5NS1cbmtlcm5lbC9icGYvYnRmLmM9NjQ5Nj1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX21vZHVsZShjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgY29uc3Qgdm9pZCAqZGF0YSxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1OTEtXG5rZXJuZWwvYnBmL2J0Zi5jOjY1OTI6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXG5rZXJuZWwvYnBmL2J0Zi5jLTY1OTMtXG4tLVxua2VybmVsL2JwZi9idGYuYz04NTAyPWVudW0ge1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtODUwNS1cbmtlcm5lbC9icGYvYnRmLmM6ODUwNjojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODUwNy1zdHJ1Y3QgYnRmX21vZHVsZSB7XG4tLVxua2VybmVsL2JwZi9idGYuYz04NjQ0PWZzX2luaXRjYWxsKGJ0Zl9tb2R1bGVfaW5pdCk7XG5rZXJuZWwvYnBmL2J0Zi5jOjg2NDU6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NDYtXG5rZXJuZWwvYnBmL2J0Zi5jPTg2NDc9c3RydWN0IG1vZHVsZSAqYnRmX3RyeV9nZXRfbW9kdWxlKGNvbnN0IHN0cnVjdCBidGYgKmJ0Zilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NDktXHRzdHJ1Y3QgbW9kdWxlICpyZXMgPSBOVUxMO1xua2VybmVsL2JwZi9idGYuYzo4NjUwOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04NjUxLVx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XG4tLVxua2VybmVsL2JwZi9idGYuYz04Njc3PXN0cnVjdCBidGYgKmJ0Zl9nZXRfbW9kdWxlX2J0Zihjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpXG5rZXJuZWwvYnBmL2J0Zi5jLTg2Nzgte1xua2VybmVsL2JwZi9idGYuYzo4Njc5OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04NjgwLVx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XG4tLVxua2VybmVsL2JwZi9idGYuYy04NjkwLVxua2VybmVsL2JwZi9idGYuYzo4NjkxOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04NjkyLVx0bXV0ZXhfbG9jayhcdTAwMjZidGZfbW9kdWxlX211dGV4KTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg3MDc9c3RhdGljIGludCBjaGVja19idGZfa2NvbmZpZ3MoY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBjb25zdCBjaGFyICpmZWF0dXJlKVxua2VybmVsL2JwZi9idGYuYy04NzA4LXtcbmtlcm5lbC9icGYvYnRmLmM6ODcwOTpcdGlmICghbW9kdWxlIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpIHtcbmtlcm5lbC9icGYvYnRmLmMtODcxMC1cdFx0cHJfZXJyKFwmIzM0O21pc3Npbmcgdm1saW51eCBCVEYsIGNhbm5vdCByZWdpc3RlciAlc1xcblwmIzM0OywgZmVhdHVyZSk7XG4tLVxua2VybmVsL2JwZi9idGYuYy04NzEyLVx0fVxua2VybmVsL2JwZi9idGYuYzo4NzEzOlx0aWYgKG1vZHVsZSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUykpXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MTQtXHRcdHByX3dhcm4oXCYjMzQ7bWlzc2luZyBtb2R1bGUgQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXG5cJiMzNDssIGZlYXR1cmUpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODg1ND1zdGF0aWMgaW50IGJ0Zl9jaGVja19rZnVuY19uYW1lKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqZnVuY19uYW1lLCB1MzIga2luZClcbmtlcm5lbC9icGYvYnRmLmMtODg1NS17XG5rZXJuZWwvYnBmL2J0Zi5jOjg4NTY6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTctXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NzAtXG5rZXJuZWwvYnBmL2J0Zi5jOjg4NzE6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NzItXHRndWFyZChtdXRleCkoXHUwMDI2YnRmX21vZHVsZV9tdXRleCk7XG4tLVxua2VybmVsL2JwZi9idGYuYz05NTE5PXN0YXRpYyBzdHJ1Y3QgYnBmX2NhbmRfY2FjaGUgKnBvcHVsYXRlX2NhbmRfY2FjaGUoc3RydWN0IGJwZl9jYW5kX2NhY2hlICpjYW5kcyxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTk1NDYtXG5rZXJuZWwvYnBmL2J0Zi5jOjk1NDc6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTk1NDgtc3RhdGljIHZvaWQgX19wdXJnZV9jYW5kX2NhY2hlKHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJwZl9jYW5kX2NhY2hlICoqY2FjaGUsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTI4MzY9aW50IGJwZl9hZGRfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgZnVuY19pZCwgdTE2IG9mZnNldClcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjg1Mi1cdFx0aWYgKCFidGZfdm1saW51eCkge1xua2VybmVsL2JwZi92ZXJpZmllci5jOjI4NTM6XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2NhbGxpbmcga2VybmVsIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXG5cJiMzNDspO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NTQtXHRcdFx0cmV0dXJuIC1FTk9UU1VQUDtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9NjE5MD1zdGF0aWMgaW50IGNoZWNrX3B0cl90b19tYXBfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTYyMDQtXHRpZiAoIWJ0Zl92bWxpbnV4KSB7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6NjIwNTpcdFx0dmVyYm9zZShlbnYsIFwmIzM0O21hcF9wdHIgYWNjZXNzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXG5cJiMzNDspO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTYyMDYtXHRcdHJldHVybiAtRU5PVFNVUFA7XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTE4ODQ4PXN0YXRpYyBpbnQgY2hlY2tfcHNldWRvX2J0Zl9pZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODg2NC1cdFx0aWYgKCFidGZfdm1saW51eCkge1xua2VybmVsL2JwZi92ZXJpZmllci5jOjE4ODY1Olx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtrZXJuZWwgaXMgbWlzc2luZyBCVEYsIG1ha2Ugc3VyZSBDT05GSUdfREVCVUdfSU5GT19CVEY9eSBpcyBzcGVjaWZpZWQgaW4gS2NvbmZpZy5cXG5cJiMzNDspO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTE4ODY2LVx0XHRcdHJldHVybiAtRUlOVkFMO1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yMDc1Nj1zdHJ1Y3QgYnRmICpicGZfZ2V0X2J0Zl92bWxpbnV4KHZvaWQpXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwNzYwLVxua2VybmVsL2JwZi92ZXJpZmllci5jOjIwNzYxOlx0aWYgKCFidGYgXHUwMDI2XHUwMDI2IElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSkge1xua2VybmVsL2JwZi92ZXJpZmllci5jLTIwNzYyLVx0XHRtdXRleF9sb2NrKFx1MDAyNmJ0Zl92bWxpbnV4X2xvY2spO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzU2OAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipNeSBJbml0aWFsIEFzc2Vzc21lbnQqKgoKQWxyaWdodCwgSSYjMzk7bSBsb29raW5nIGF0IGEgZmV3IGtlcm5lbCBjb25maWd1cmF0aW9ucyDigJMgYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfTUVNQ0dgLCBhbmQgYENPTkZJR19ERUJVR19JTkZPX0JURmAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1doYXQmIzM5O3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlPyYjMzQ7IEl0IGxvb2tzIGxpa2UgSSBtaWdodCBiZSB0cnlpbmcgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgZmVhdHVyZSBmbGFncyBpbnRlcmFjdC4gTXkgaW50dWl0aW9uIHRlbGxzIG1lIHRoYXQgYENPTkZJR19ERUJVR19JTkZPX0JURmAgaXMgdGhlIG1vc3QgY29tcGxleCBvbmUgYW5kIHBvc3NpYmx5IGhhcyBkZXBlbmRlbmNpZXMsIGxldCBtZSBjaGVjayB0aGUgYGxpYi9LY29uZmlnLmRlYnVnYCBmaWxlIHRvIHNlZSB3aGF0IHRoZSBkZXBlbmRlbmNpZXMgYXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVCVUdfSU5GT19CVEYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9LY29uZmlnLmRlYnVnPTM3OD1jb25maWcgREVCVUdfSU5GT19TUExJVFxuLS1cbmxpYi9LY29uZmlnLmRlYnVnLTM5Ny1cbmxpYi9LY29uZmlnLmRlYnVnOjM5ODpjb25maWcgREVCVUdfSU5GT19CVEZcbmxpYi9LY29uZmlnLmRlYnVnLTM5OS1cdGJvb2wgXCYjMzQ7R2VuZXJhdGUgQlRGIHR5cGUgaW5mb3JtYXRpb25cJiMzNDtcbi0tXG5saWIvS2NvbmZpZy5kZWJ1Zz00MTk9Y29uZmlnIFBBSE9MRV9IQVNfTEFOR19FWENMVURFXG4tLVxubGliL0tjb25maWcuZGVidWctNDI3LVxubGliL0tjb25maWcuZGVidWc6NDI4OmNvbmZpZyBERUJVR19JTkZPX0JURl9NT0RVTEVTXG5saWIvS2NvbmZpZy5kZWJ1Zy00MjktXHRib29sIFwmIzM0O0dlbmVyYXRlIEJURiB0eXBlIGluZm9ybWF0aW9uIGZvciBrZXJuZWwgbW9kdWxlc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzk1MwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBLY29uZmlnLmRlYnVnIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGZvciBzb21ldGhpbmcgcmVsYXRlZCB0byB0aGUgZGVidWcgY29uZmlndXJhdGlvbi4gVGltZSB0byBoZWFkIG92ZXIgdG8gYGxpYi9LY29uZmlnLmRlYnVnYC4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGdvaW5nIHRvIHplcm8gaW4gb24gbGluZXMgMzkwIHRvIDQxMC4gVGhhdCYjMzk7cyB1c3VhbGx5IGEgZ29vZCByYW5nZSB0byBzdGFydCB3aXRoIHdoZW4gSSYjMzk7bSBjaGFzaW5nIGRvd24gZGVwZW5kZW5jaWVzIGluIGEgS2NvbmZpZyBmaWxlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGBkZXBlbmRzIG9uYCBjbGF1c2VzIHJldmVhbCB0aGVyZS4gSG9wZWZ1bGx5LCBpdCYjMzk7cyBzdHJhaWdodGZvcndhcmQsIGFuZCBJIGNhbiBxdWlja2x5IHRyYWNlIHdoYXQgY29uZGl0aW9ucyBuZWVkIHRvIGJlIG1ldCBmb3IgdGhpcyBkZWJ1ZyBvcHRpb24gdG8gYmUgZW5hYmxlZC4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCB3b3JrIGJlZ2lucywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBvdGhlciBvcHRpb25zIGFyZSBpbXBhY3RlZCBhbmQgaWYgdGhleSBhcmUgcmVsZXZhbnQgdG8gdGhpcyBjdXJyZW50IGZvY3VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2xpYi9LY29uZmlnLmRlYnVnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzk1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzOTU6XHRcdCAgdG8ga25vdyBhYm91dCB0aGUgLmR3byBmaWxlcyBhbmQgaW5jbHVkZSB0aGVtLlxuIDM5NjpcdFx0ICBJbmNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBjY2FjaGUuXG4gMzk3Olx0XG4gMzk4Olx0Y29uZmlnIERFQlVHX0lORk9fQlRGXG4gMzk5Olx0XHRib29sIFwmIzM0O0dlbmVyYXRlIEJURiB0eXBlIGluZm9ybWF0aW9uXCYjMzQ7XG4gNDAwOlx0XHRkZXBlbmRzIG9uICFERUJVR19JTkZPX1NQTElUIFx1MDAyNlx1MDAyNiAhREVCVUdfSU5GT19SRURVQ0VEXG4gNDAxOlx0XHRkZXBlbmRzIG9uICFHQ0NfUExVR0lOX1JBTkRTVFJVQ1QgfHwgQ09NUElMRV9URVNUXG4gNDAyOlx0XHRkZXBlbmRzIG9uIEJQRl9TWVNDQUxMXG4gNDAzOlx0XHRkZXBlbmRzIG9uIFBBSE9MRV9WRVJTSU9OIFx1MDAzZT0gMTIyXG4gNDA0Olx0XHQjIHBhaG9sZSB1c2VzIGVsZnV0aWxzLCB3aGljaCBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIEhleGFnb24gcmVsb2NhdGlvbnNcbiA0MDU6XHRcdGRlcGVuZHMgb24gIUhFWEFHT05cbiA0MDY6XHRcdGhlbHBcbiA0MDc6XHRcdCAgR2VuZXJhdGUgZGVkdXBsaWNhdGVkIEJURiB0eXBlIGluZm9ybWF0aW9uIGZyb20gRFdBUkYgZGVidWcgaW5mby5cbiA0MDg6XHRcdCAgVHVybmluZyB0aGlzIG9uIHJlcXVpcmVzIHBhaG9sZSB2MS4yMiBvciBsYXRlciwgd2hpY2ggd2lsbCBjb252ZXJ0XG4gNDA5Olx0XHQgIERXQVJGIHR5cGUgaW5mbyBpbnRvIGVxdWl2YWxlbnQgZGVkdXBsaWNhdGVkIEJURiB0eXBlIGluZm8uXG4gNDEwOlx0XG4gNDExOlx0Y29uZmlnIFBBSE9MRV9IQVNfQlRGX1RBR1xuIDQxMjpcdFx0ZGVmX2Jvb2wgUEFIT0xFX1ZFUlNJT04gXHUwMDNlPSAxMjNcbiA0MTM6XHRcdGRlcGVuZHMgb24gQ0NfSVNfQ0xBTkdcbiA0MTQ6XHRcdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg1MjgKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgc3VtbWFyaXplZCBmcm9tIGEgZmlyc3QtcGVyc29uIGV4cGVydCBwZXJzcGVjdGl2ZToKCioqS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzOiBCUEYgYW5kIEJleW9uZCoqCgpBbHJpZ2h0LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzcGVjaWZpY2FsbHkgYENPTkZJR19CUEZgLiBUaGlzIGtlZXBzIHBvcHBpbmcgdXAsIGFuZCBpdCYjMzk7cyBhIGNyaXRpY2FsIGZvdW5kYXRpb25hbCBlbGVtZW50LiBJIGtub3cgYEJQRl9TWVNDQUxMYCByZWxpZXMgb24gYEJQRmAsIHdoaWNoIGltbWVkaWF0ZWx5IHN1Z2dlc3RzIGEgZGVwZW5kZW5jeS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IHRoZXNlIG9wdGlvbnMgaW50ZXJhY3QgYW5kIHdoYXQgb3RoZXIgcmVsYXRlZCBvcHRpb25zIGV4aXN0LiBCZXN0IHRvIGRpdmUgaW50byB0aGUgY29yZSBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBMZXQgbWUgY2hlY2sgdGhlIGBrZXJuZWwvYnBmL0tjb25maWdgIGZpbGUuIFRoYXQmIzM5O3Mgd2hlcmUgYWxsIHRoZSBkZXRhaWxzIGFib3V0IEJQRiBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBsYWlkIG91dC4gVW5kZXJzdGFuZGluZyB0aGUgZGVwZW5kZW5jeSBjaGFpbiBoZXJlIGlzIGtleSB0byBhIHJvYnVzdCBhbmQgZWZmaWNpZW50IGtlcm5lbCBidWlsZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDI1Olx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cbiAgMjY6XHRjb25maWcgQVJDSF9XQU5UX0RFRkFVTFRfQlBGX0pJVFxuICAyNzpcdFx0Ym9vbFxuICAyODpcdFxuICAyOTpcdG1lbnUgXCYjMzQ7QlBGIHN1YnN5c3RlbVwmIzM0O1xuICAzMDpcdFxuICAzMTpcdGNvbmZpZyBCUEZfU1lTQ0FMTFxuICAzMjpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcJiMzNDtcbiAgMzM6XHRcdHNlbGVjdCBCUEZcbiAgMzQ6XHRcdHNlbGVjdCBJUlFfV09SS1xuICAzNTpcdFx0c2VsZWN0IE5FRURfVEFTS1NfUkNVXG4gIDM2Olx0XHRzZWxlY3QgVEFTS1NfVFJBQ0VfUkNVXG4gIDM3Olx0XHRzZWxlY3QgQklOQVJZX1BSSU5URlxuICAzODpcdFx0c2VsZWN0IE5FVF9TT0NLX01TRyBpZiBORVRcbiAgMzk6XHRcdHNlbGVjdCBORVRfWEdSRVNTIGlmIE5FVFxuICA0MDpcdFx0c2VsZWN0IFBBR0VfUE9PTCBpZiBORVRcbiAgNDE6XHRcdGRlZmF1bHQgblxuICA0MjpcdFx0aGVscFxuICA0MzpcdFx0ICBFbmFibGUgdGhlIGJwZigpIHN5c3RlbSBjYWxsIHRoYXQgYWxsb3dzIHRvIG1hbmlwdWxhdGUgQlBGIHByb2dyYW1zXG4gIDQ0Olx0XHQgIGFuZCBtYXBzIHZpYSBmaWxlIGRlc2NyaXB0b3JzLlxuICA0NTpcdFxuICA0NjpcdGNvbmZpZyBCUEZfSklUXG4gIDQ3Olx0XHRib29sIFwmIzM0O0VuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXCYjMzQ7XG4gIDQ4Olx0XHRkZXBlbmRzIG9uIEJQRlxuICA0OTpcdFx0ZGVwZW5kcyBvbiBIQVZFX0NCUEZfSklUIHx8IEhBVkVfRUJQRl9KSVRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkwOTAKCQkJCQkJCW91dHB1dDogMTM0CgkJCQkJCQl0aG91Z2h0czogODU5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgQW5hbHlzaXM6IEJQRi1CYXNlZCBQcm9hY3RpdmUgTWVtb3J5IFJlY2xhaW0qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgYW5hbHlzaXMgaW5kaWNhdGVzIGEgbmV3IGF2ZW51ZSBmb3IgbWVtb3J5IHJlY2xhaW0gd2l0aGluIHRoZSBrZXJuZWwsIGxldmVyYWdpbmcgQlBGIGNhcGFiaWxpdGllcy4gVGhlIGtleSBjb25maWd1cmF0aW9ucyBpbnZvbHZlZCBhcmUgYEJQRl9TWVNDQUxMYCwgYE1FTUNHYCwgYW5kIGBERUJVR19JTkZPX0JURmAuIFRoZXNlIGFyZSBlc3NlbnRpYWwgZm9yIHRoZSBmdW5jdGlvbmFsaXR5LgoKVGhlIHByaW1hcnkgZm9jdXMgaXMgdW5kZW5pYWJseSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gVGhpcyBmdW5jdGlvbiwgbm93IGV4cG9zZWQgYXMgYSBCUEYga2Z1bmMsIGlzICp0aGUqIGZvY2FsIHBvaW50LiBJdCYjMzk7cyB0aGUgbmV3IGVudHJ5IHBvaW50IGZvciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhbWF0aW9uIHRyaWdnZXJlZCBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGBicGYoKWAgc3lzY2FsbCwgc3BlY2lmaWNhbGx5IHVzaW5nIGEgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgcHJvZ3JhbSBvciBwb3RlbnRpYWxseSB0aHJvdWdoIHdvcmtxdWV1ZSBjYWxsYmFja3MuIFRoaXMgaXMgYSBjcnVjaWFsIGRpc3RpbmN0aW9uIGFuZCBhIHNpZ25pZmljYW50IGFkZGl0aW9uLiBJdCBjYWxscyBjb3JlIHJlY2xhaW0gbG9naWMuIFRoZXJlJiMzOTtzIGFsc28gcmVjdXJzaW9uIHByb3RlY3Rpb24sIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgdG8ga2VlcCB0aGluZ3Mgc3RhYmxlLgoKYGJwZl9tZW1jb250cm9sX2luaXRgIGlzIGFsc28gcHJlc2VudCwgYnV0IGJlY2F1c2UgaXQmIzM5O3MgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgaXQmIzM5O3Mgbm90IGEgc3VpdGFibGUgdGFyZ2V0IGZvciBzeXNjYWxsIGZ1enppbmcuIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCBpcyBzdGF0aWMgYW5kIGxpa2VseSBpbmxpbmVkLCBzbyBpdCYjMzk7cyBub3QgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZWl0aGVyLgoKRXNzZW50aWFsbHksIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHByb3ZpZGVzIGEgdXNlcnNwYWNlLWluaXRpYXRlZCBtZWNoYW5pc20gdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgd2l0aGluIGEgbWVtY2csIHdoaWNoIGlzIGEgYmlnIGRlYWwgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLiBJdCYjMzk7cyBhIEJQRiBrZnVuYyBjYWxsaW5nIHRoZSBjb3JlIHJlY2xhaW0gbG9naWMsIHNvIGl0JiMzOTtzIGEgZ29vZCBwbGFjZSB0byBzdGFydCBkaWdnaW5nLgoKVGhlcmVmb3JlLCBgV29ydGhGdXp6aW5nYCBpcyBkZWZpbml0ZWx5IGB0cnVlYCBoZXJlLiBUaGUgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMgYXJlIGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgLiBBbmQgdGhlIHByaW1lIGBGb2N1c1N5bWJvbGAgaXMgdW5lcXVpdm9jYWxseSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQmIzM5O3Mgbm9uLXN0YXRpYywgYSBrZnVuYywgYW5kIHRoZSBjb3JlIG9mIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHksIHNvIGl0JiMzOTtzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiBUaGUgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4uLmAgYXJlIGZvciB1c2Vyc3BhY2Ugd2hpY2ggYXJlIGFsc28gbm90IGEgZm9jdXMgcG9pbnQgZm9yIHRoZSBrZXJuZWwgY29kZS4KCkkmIzM5O20gY29uZmlkZW50IGluIHRoZXNlIGZpbmRpbmdzLiBMZXQmIzM5O3MgZ2V0IHRoZSByZXN1bHRzIHNldC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgYWxsb3dpbmcgc2xlZXBhYmxlIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gdmlhIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKS4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBjb2RlIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtERUJVR19JTkZPX0JURiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGFsbG93aW5nIHNsZWVwYWJsZSBCUEZfUFJPR19UWVBFX1NZU0NBTEwgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IGNncm91cCByZWNsYWltIHZpYSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIEJQRiBzdWJzeXN0ZW0gY29kZSBhbmQgd2FycmFudHMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgcmVhZHMsIGFuZCBubyB0cmFuc2ZlcnMgb2Yga2VybmVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgaXNzdWVzIChlLmcuLCBkZWFkbG9jaywgcmVjdXJzaW9uIGluIHJlY2xhaW0gY29udGV4dCwgcmVmY291bnRpbmcsIG9yIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSkgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcywgbm90IEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuYwppbmRleCA3MTZkZjQ5ZDc2NDc3Li45MmYzNWJhNjYzMDllIDEwMDY0NAotLS0gYS9tbS9icGZfbWVtY29udHJvbC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmMKQEAgLTYsNiAmIzQzOzYsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKIAogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwpAQCAtMTU5LDYgJiM0MzsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiAJbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXMKJiM0MzsgKiBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyCiYjNDM7ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQzsKJiM0MzsgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseQomIzQzOyAqIGJlZm9yZSBQRl9NRU1BTExPQy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKGN1cnJlbnQtJmd0O2ZsYWdzICZhbXA7IFBGX01FTUFMTE9DKSB8fCBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0bwomIzQzOyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcykKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKgomIzQzOyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZwomIzQzOyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbQomIzQzOyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS4KJiM0MzsgKgomIzQzOyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnMKJiM0MzsgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlCiYjNDM7ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluCiYjNDM7ICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS4KJiM0MzsgKgomIzQzOyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyCiYjNDM7ICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXIKJiM0MzsgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzCiYjNDM7ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoCiYjNDM7ICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJCiYjNDM7ICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdAomIzQzOyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZgomIzQzOyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYKJiM0MzsgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcwomIzQzOyAqIGR5aW5nLgomIzQzOyAqCiYjNDM7ICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXMKJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwomIzQzOwomIzQzOwlpZiAoc2l6ZSAmbHQ7IFBBR0VfU0laRSB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BhZ2VzID0gbWluKHNpemUgLyBQQUdFX1NJWkUsICh1bnNpZ25lZCBsb25nKU1FTUNHX0NIQVJHRV9CQVRDSCk7CiYjNDM7CiYjNDM7CW5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLAomIzQzOwkJCQkJCSAgICBHRlBfS0VSTkVMLAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsCiYjNDM7CQkJCQkJICAgIE5VTEwpOwomIzQzOwomIzQzOwlyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTcxLDIyICYjNDM7MjQwLDQ0IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9tZW1vcnlfZXZlbnRzKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKLQogQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQogCiYjNDM7LyoKJiM0MzsgKiBQcm9hY3RpdmUgcmVjbGFpbSBuZWVkcyBhIGNsZWFuIHByb2Nlc3MgY29udGV4dCwgc28gaXQgaXMgcmVzdHJpY3RlZAomIzQzOyAqIHRvIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTC4gVGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyB0aGF0IGEKJiM0MzsgKiBTWVNDQUxMIHByb2dyYW0gc2NoZWR1bGVzIHJ1biBhcyB0aGUgc2FtZSBwcm9ncmFtIHR5cGUsIHNvIHRoZXkgY2FuCiYjNDM7ICogc3RpbGwgaW52b2tlIGl0OyBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyAoZS5nLiBmZW50cnkgb24gcmVjbGFpbQomIzQzOyAqIHBhdGhzLCBpbm9kZV9ybWRpcikgY2Fubm90LgomIzQzOyAqLwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jcywKIH07CiAKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7CiYjNDM7CS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLAomIzQzO307CiYjNDM7CiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiAJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTsKLQlpZiAoZXJyKQomIzQzOwlpZiAoZXJyKSB7CiAJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkJiMzNDssIGVycik7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl93YXJuKCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDY4NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSICYjMzQ7L3RhcmdldCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlCiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kCiYjNDM7ICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXIKJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvCiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMCkKJiM0MzsjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwCiYjNDM7I2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHMKJiM0MzsgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcAomIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZQomIzQzOyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjImIzM5O3MKJiM0MzsgKiBuby1pbnRlcm5hbC1wcm9jZXNzIGNvbnN0cmFpbnQga2VlcHMgdGhlIHJlZmF1bHRpbmcgd29ya2xvYWQgb3V0IG9mCiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzZXR1cF9keWluZ19jZ3JvdXBzKHU2NCAqdHJpZ2dlcl9jZ3JvdXBfaWQsIHU2NCAqdGFyZ2V0X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHMKJiM0MzsgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGUKJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzbwomIzQzOyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseQomIzQzOyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3AKJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkICE9IDApCiYjNDM7CQlyZXR1cm4gcGlkOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKQomIzQzOwkJX2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKQomIzQzOwkJCV9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kCiYjNDM7ICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZgomIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC4KJiM0MzsgKgomIzQzOyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kCiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZywKJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiByZWNsYWltX2NhbGxzIGdyb3dpbmcKJiM0MzsgKiB3aGlsZSB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmMKJiM0MzsgKiByZXR1cm5zIDAgb24gdGhlIGVtcHR5IHRhcmdldCwgYnV0IHRoZSBjYWxsIGlzIHN0aWxsIGNvdW50ZWQpLCBhbmQKJiM0MzsgKiBhZnRlciB0aGUgcmVtb3ZhbCB0aGUgc2tpcCBjb3VudGVycyBtdXN0IGdyb3cgd2hpbGUgcmVjbGFpbV9jYWxscwomIzQzOyAqIGFuZCByZWNsYWltZWRfYnl0ZXMgc3RheSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDsKJiM0MzsJdTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlOwomIzQzOwljaGFyIGRhdGFfZmlsZVtQQVRIX01BWF0gPSAmIzM0OyYjMzQ7OwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CXBpZF90IHJlYWRlcl9waWQgPSAtMTsKJiM0MzsJaW50IGVyciwgZmQsIGk7CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoJmFtcDt0cmlnZ2VyX2Nncm91cF9pZCwgJmFtcDt0YXJnZXRfY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2R5aW5nX2Nncm91cHMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfZHlpbmdfWFhYWFhYJiMzNDssIHdvcmtsb2FkX2ZpbGVzX2RpcigpKTsKJiM0MzsJZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlyZWFkZXJfcGlkID0gc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihkYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCAmIzM0O2Zvcmsga2VlcGFsaXZlIHJlYWRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMgJmd0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CiYjNDM7CS8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovCiYjNDM7CXVzbGVlcChEWUlOR19TRVRUTEVfVVMpOwomIzQzOwomIzQzOwljYWxsc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHM7CiYjNDM7CWJ5dGVzX2JlZm9yZSA9IHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUgfHwKJiM0MzsJCSAgICBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fc2tpcHBlZF9keWluZykKJiM0MzsJCQlicmVhazsKJiM0MzsJCXVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX3NraXBwZWRfZHlpbmcpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSkmIzM0OywKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSwKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVjawomIzQzOwkgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgaXQgaXMgaGl0IGlzIHRpbWluZwomIzQzOwkgKiBkZXBlbmRlbnQsIGJlY2F1c2UgdGhlIGNncm91cCBtYXkgYWxyZWFkeSBiZSBmdWxseSByZWxlYXNlZCwgc28KJiM0MzsJICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC4KJiM0MzsJICovCiYjNDM7CXByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVsbHUsIGR5aW5nPSVsbHVcbiYjMzQ7LAomIzQzOwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUsCiYjNDM7CSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsKJiM0MzsJLyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi8KJiM0MzsJaWYgKCFBU1NFUlRfRVEoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsICYjMzQ7cmVjbGFpbV9jYWxscyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLAomIzQzOwkJICAgICAgICYjMzQ7cmVjbGFpbWVkX2J5dGVzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAocmVhZGVyX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkodm9pZCl3YWl0cGlkKHJlYWRlcl9waWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CWlmIChkYXRhX2ZpbGVbMF0pCiYjNDM7CQl1bmxpbmsoZGF0YV9maWxlKTsKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDI1OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7LyoKJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkUKJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlCiYjNDM7ICogc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IG9uZSwgc28gbm8gY2FsbGJhY2sgcnVucyBsb25nZXIgdGhhbiBvbmUKJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJncyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5CiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7CiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlczsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gYXR0ZW1wdHMgc2tpcHBlZCBiZWNhdXNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nIG9yIGhhcwomIzQzOyAqIGJlZW4gcmVtb3ZlZC4gcmVjbGFpbV9za2lwcGVkX2R5aW5nIGNvdW50cyBsb29rdXBzIHRoYXQgc3RpbGwgZm91bmQKJiM0MzsgKiB0aGUgY2dyb3VwIHdoaWxlIGl0IGlzIGJlaW5nIHRvcm4gZG93biwgcmVjbGFpbV90YXJnZXRfZ29uZSBjb3VudHMKJiM0MzsgKiBsb29rdXBzIHRoYXQgZm91bmQgbm90aGluZy4gVGhlIHRlc3QgcmVtb3ZlcyB0aGUgdGFyZ2V0IGNncm91cCB3aGlsZQomIzQzOyAqIHJlY2xhaW0gaXMgcnVubmluZyBhbmQgY2hlY2tzIHRoYXQgcmVjbGFpbSBzdG9wcyB2aWEgdGhlc2UgY291bnRlcnMuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fc2tpcHBlZF9keWluZzsKJiM0Mzt1NjQgcmVjbGFpbV90YXJnZXRfZ29uZTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLAomIzQzOwkJYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLAomIzQzOwkJCQkgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvcgomIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpCiYjNDM7ICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFjawomIzQzOyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlbgomIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvbgomIzQzOyAqIHRoZSBsb29rdXAgZmFpbGluZy4KJiM0MzsgKgomIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbQomIzQzOyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0bwomIzQzOyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oCiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzbwomIzQzOyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtJmd0O3NlbGYuZmxhZ3M7CiYjNDM7CiYjNDM7CXJldHVybiAoZmxhZ3MgJmFtcDsgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzICZhbXA7IENTU19PTkxJTkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXMKJiM0MzsgKiByZWNsYWltZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CXU2NCBuciA9IDA7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkgewomIzQzOwkJcmVjbGFpbV90YXJnZXRfZ29uZSYjNDM7JiM0Mzs7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2dyb3VwX2lzX2R5aW5nKGNtLmNncnApKSB7CiYjNDM7CQlyZWNsYWltX3NraXBwZWRfZHlpbmcmIzQzOyYjNDM7OwomIzQzOwkJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwluciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgc2l6ZSk7CiYjNDM7CXJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7CS8qCiYjNDM7CSAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzCiYjNDM7CSAqIHJlcXVldWVzLiAwIG1lYW5zIG5vIHJvdW5kIGlzIGluIHByb2dyZXNzOyB0aGUgdGltZXIgcGF0aAomIzQzOwkgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3MKJiM0MzsJICogYXQgaXQuCiYjNDM7CSAqLwomIzQzOwl1NjQgcmVtYWluaW5nOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwl1NjQgbnIsIHNpemU7CiYjNDM7CiYjNDM7CWlmICghZWxlbS0mZ3Q7cmVtYWluaW5nKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlCiYjNDM7CQkgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzCiYjNDM7CQkgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGEKJiM0MzsJCSAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi8KJiM0MzsJc2l6ZSA9IGVsZW0tJmd0O3JlbWFpbmluZyAmbHQ7IFJFQ0xBSU1fU0laRSA/IGVsZW0tJmd0O3JlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTsKJiM0MzsJbnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTsKJiM0MzsJaWYgKCFucikgewomIzQzOwkJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovCiYjNDM7CWlmIChuciAmZ3Q7PSBlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwllbHNlCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgLT0gbnI7CiYjNDM7CiYjNDM7CS8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqLwomIzQzOwlpZiAoZWxlbS0mZ3Q7cmVtYWluaW5nKQomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MTAxCgkJCQkJCQlvdXRwdXQ6IDE5NQoJCQkJCQkJdGhvdWdodHM6IDEwODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQW5hbHlzaXMgb2YgQlBGIFByb2FjdGl2ZSBSZWNsYWltIEtmdW5jKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIEkgc2VlIGEgbmV3IGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgYWRkZWQgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLCBhbG9uZyB3aXRoIGl0cyBzZWxmdGVzdHMuIFRoZSBjb3JlIG9mIGl0IGludm9sdmVzIHRoaXMgZnVuY3Rpb24gY2FsbGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuCgpJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIFNvLCBsZXQmIzM5O3Mgc3RlcCB0aHJvdWdoIHRoaXMgbWV0aG9kaWNhbGx5LiBGaXJzdCwgdGhlcmUgYXJlbiYjMzk7dCBhbnkga2VybmVsIHN0cnVjdHVyZXMgZ2V0dGluZyBzZW50IHRvIHVzZXIgc3BhY2UgZGlyZWN0bHkuIEl0IHJldHVybnMgYSBzaW1wbGUgYHVuc2lnbmVkIGxvbmdgIHNjYWxhciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMsIHdoaWNoIGlzIGdvb2QuIFNlY29uZCwgdGhlIGNvZGUgZmxvdyBpcyBzdHJhaWdodGZvcndhcmQ7IHRoZXJlJiMzOTtzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBUaGUga2V5IHZhcmlhYmxlcywgYG5yX3BhZ2VzYCBhbmQgYG5yX3JlY2xhaW1lZGAsIGFyZSBkaXJlY3RseSBpbml0aWFsaXplZCB3aXRoIHRoZSByZXN1bHRzIG9mIGNhbGN1bGF0aW9ucyBhbmQgZnVuY3Rpb24gY2FsbHMsIHJlc3BlY3RpdmVseS4gVGhpcmQsIG5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLiBGaW5hbGx5LCB0aGVyZSYjMzk7cyBubyByaXNrIG9mIGFueSBraW5kIG9mIGJ1ZmZlciBvdmVycnVucyB0aGF0IG1pZ2h0IGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KCkxvb2tpbmcgZGVlcGVyIGF0IHRoZSBjb2RlLCBldmVyeXRoaW5nIGhpbmdlcyBvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgYW5kIHRoZSBpbml0aWFsaXphdGlvbiB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGlzIGtmdW5jIGxldmVyYWdlcyBhbiBleGlzdGluZywgd2VsbC12ZXR0ZWQgbW0gaW50ZXJuYWwgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBpcyBxdWl0ZSBzaW1wbGUsIGFuZCBpdCYjMzk7cyBwYXNzaW5nIGluIHRoZSBgbWVtY2dgIHBvaW50ZXIgYW5kIHRoZSBzaXplIHZhbHVlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGp1c3QgYW4gYHVuc2lnbmVkIGxvbmdgLgoKVGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBhcmUgYHN0cnVjdCBtZW1fY2dyb3VwICpgLCBgdW5zaWduZWQgbG9uZyBucl9wYWdlc2AsIGBnZnBfdCBnZnBfbWFza2AsIGB1bnNpZ25lZCBpbnQgcmVjbGFpbV9vcHRpb25zYCwgYW5kIGBub2RlbWFza190ICpub2RlbWFza2AgKHdoZXJlIGl0JiMzOTtzIHBhc3NlZCBhcyBOVUxMKS4gVGhlcmUgaXMgbm8gcmVhZGluZyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBOb3RoaW5nIGhlcmUgbGVha3MgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpUaGUgcG90ZW50aWFsIGlzc3VlcyBJIGNhbiBzZWUgd291bGQgYmUgY2xhc3NpYyBtZW1vcnkgbWFuYWdlbWVudCBlcnJvcnMgbGlrZSBsb2NraW5nIGlzc3VlcywgcmVjdXJzaW9uLCBzbGVlcC1pbi1hdG9taWMgY29udGV4dCBwcm9ibGVtcywgY29uY3VycmVuY3kgaXNzdWVzLCByZWZjb3VudCBlcnJvcnMsIG9yIGRlYWRsb2Nrcy4gSG93ZXZlciwgdGhvc2UgYXJlIHRoZSB0eXBlcyBvZiBidWdzIHRoYXQgS0FTQU4sIExPQ0tERVAsIFBST1ZFX0xPQ0tJTkcsIGFuZCB0aGUgb3RoZXIgc3RhbmRhcmQga2VybmVsIGRldGVjdG9ycyBhcmUgZGVzaWduZWQgdG8gY2F0Y2guIEtNU0FOIGlzbiYjMzk7dCBuZWVkZWQgaGVyZS4KClNvLCBhY2NvcmRpbmcgdG8gbXkgYW5hbHlzaXMgYW5kIHRoZXNlIGd1aWRlbGluZXM6CgoqICAgKipOZWVkc0tNU0FOOiBmYWxzZSoqCiogICAqKktNU0FOUmVhc29uaW5nOioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYywgd2hpY2ggaXMgYWRkZWQgdG8gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBzZWxmdGVzdHMuIFRoaXMga2Z1bmMgdGFrZXMgYSBtZW1jZyBwb2ludGVyIGFuZCBhIHNpemUgc2NhbGFyLCBkb2VzIHNvbWUgYmFzaWMgdmFsaWRhdGlvbiwgdGhlbiBpbnZva2VzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLCByZXR1cm5pbmcgYW4gYHVuc2lnbmVkIGxvbmdgIHJlcHJlc2VudGluZyByZWNsYWltZWQgYnl0ZXMuIFRoZXJlIGFyZSBubyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIG5vIGluZm8gbGVha3MuIEFueSBwb3RlbnRpYWwgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWVzLCBsb2NraW5nLCBzbGVlcGFibGUgY29udGV4dHMsIG9yIHBvaW50ZXIgdmFsaWRpdHkgcHJvYmxlbXMgd291bGQgYmUgaWRlbnRpZmllZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4KCkxldCYjMzk7cyBwcm9jZWVkIHRvIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgcmVhZHMsIGFuZCBubyB0cmFuc2ZlcnMgb2Yga2VybmVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgaXNzdWVzIChlLmcuLCBkZWFkbG9jaywgcmVjdXJzaW9uIGluIHJlY2xhaW0gY29udGV4dCwgcmVmY291bnRpbmcsIG9yIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSkgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcywgbm90IEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgQlBGIGtmdW5jIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbmQgYXNzb2NpYXRlZCBCUEYgc2VsZnRlc3RzLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBgc2l6ZWAgcGFyYW1ldGVyLCBjaGVja3MgdGhlIGV4ZWN1dGlvbiBjb250ZXh0LCBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYCwgYW5kIHJldHVybnMgYSBzY2FsYXIgYHVuc2lnbmVkIGxvbmdgIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMuXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjIzLjk1NjMwMTU2OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NTk4MjMwOTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiREVCVUdfSU5GT19CVEZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBhbGxvd2luZyBzbGVlcGFibGUgQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB2aWEgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGNvZGUgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjIzLjk1NjMwNjkwOVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyODk1MjUyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGU3MWEzMjE5NDI5NDIzZTVmZDM2NjRmNTJjZGI4OTQzYzE4NDliYmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBTZXAgNSAyMDo0MToyMiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyZjM1YmE2NjMwOWUgMTAwNjQ0XFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5AQCAtNiw2ICs2LDcgQEBcXG4gICovXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtY29udHJvbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuIFxcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuQEAgLTE1OSw2ICsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXFxuKyAqIGN1cnJlbnQtXFx1MDAzZXJlY2xhaW1fc3RhdGUsIHNvIGEgbmVzdGVkIGNhbGwgd291bGQgY29ycnVwdCB0aGUgb3V0ZXJcXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcXG4rICogcmVjbGFpbV9zdGF0ZSBpcyBhbHNvIGNoZWNrZWQgYmVjYXVzZSBpdCBpcyBpbnN0YWxsZWQgc2xpZ2h0bHlcXG4rICogYmVmb3JlIFBGX01FTUFMTE9DLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiAoY3VycmVudC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxcbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzLCBjbGFtcGVkIHRvXFxuKyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcXG4rICpcXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xcbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cXG4rICpcXG4rICogQHNpemUgaXMgY2xhbXBlZCBzbyB0aGF0IG9uZSBjYWxsIGlzIGEgYm91bmRlZCB1bml0IG9mIHdvcmssIG1hdGNoaW5nXFxuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxcbisgKiBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseSBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXFxuKyAqXFxuKyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcXG4rICogaW4gYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQuIFRoZSBTWVNDQUxMIHByb2dyYW0gY2FuIHNjaGVkdWxlIHRoZVxcbisgKiBhY3R1YWwgcmVjbGFpbSB3b3JrIHZpYSBicGZfd3Egb3IgdGltZXJzLCB3aGljaCBhbHNvIGV4ZWN1dGUgaW5cXG4rICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cXG4rICpcXG4rICogV2hlbiByZWNsYWltIGlzIGRyaXZlbiBmcm9tIGEgYnBmX3dxLCBjYWxsIHRoaXMga2Z1bmMgb25jZSBwZXJcXG4rICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcXG4rICogdGhhbiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2s6IGEgbG9uZy1ydW5uaW5nIGNhbGxiYWNrIHN0YWxsc1xcbisgKiBvdGhlciB3b3JrIG9uIHRoZSBzaGFyZWQgd29ya3F1ZXVlLCBhbmQgYmVjYXVzZSBscnVfbG9jayBpcyBoZWxkIHdpdGhcXG4rICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXFxuKyAqIGhhbmRsaW5nLiBHaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gYnBmX3dxIGl0ZW0sIHNvIHRoYXRcXG4rICogcmVjbGFpbWluZyBvbmUgbWVtY2cgbmVpdGhlciBzZXJpYWxpemVzIGJlaGluZCBub3IgcGlsZXMgdXAgb24gdG9wIG9mXFxuKyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcXG4rICogcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3AgYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXNcXG4rICogZHlpbmcuXFxuKyAqXFxuKyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcXG4rICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cXG4rICpcXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXFxuKyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzO1xcbitcXG4rXFx0aWYgKHNpemUgXFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xcbitcXG4rXFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIE5VTEwpO1xcbitcXG4rXFx0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcXG4rfVxcbitcXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4gXFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbkBAIC0xNzEsMjIgKzI0MCw0NCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfbWVtb3J5X2V2ZW50cylcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxuLVxcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuIFxcbisvKlxcbisgKiBQcm9hY3RpdmUgcmVjbGFpbSBuZWVkcyBhIGNsZWFuIHByb2Nlc3MgY29udGV4dCwgc28gaXQgaXMgcmVzdHJpY3RlZFxcbisgKiB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwuIFRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3MgdGhhdCBhXFxuKyAqIFNZU0NBTEwgcHJvZ3JhbSBzY2hlZHVsZXMgcnVuIGFzIHRoZSBzYW1lIHByb2dyYW0gdHlwZSwgc28gdGhleSBjYW5cXG4rICogc3RpbGwgaW52b2tlIGl0OyBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyAoZS5nLiBmZW50cnkgb24gcmVjbGFpbVxcbisgKiBwYXRocywgaW5vZGVfcm1kaXIpIGNhbm5vdC5cXG4rICovXFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcXG4rQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxuK1xcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xcbiBcXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcXG4gXFx0LnNldCAgICAgICAgICAgID0gXFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcXG4gfTtcXG4gXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXFxuK1xcdC5zZXQgICAgICAgICAgICA9IFxcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcyxcXG4rfTtcXG4rXFxuIHN0YXRpYyBpbnQgX19pbml0IGJwZl9tZW1jb250cm9sX2luaXQodm9pZClcXG4ge1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4gXFx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7XFxuLVxcdGlmIChlcnIpXFxuK1xcdGlmIChlcnIpIHtcXG4gXFx0XFx0cHJfd2FybihcXFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIG1lbWNvbnRyb2wga2Z1bmNzOiAlZFxcXCIsIGVycik7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRwcl93YXJuKFxcXCJlcnJvciByZWdpc3RlcmluZyBicGYgcmVjbGFpbSBrZnVuY3M6ICVkXFxcIiwgZXJyKTtcXG4gXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbkBAIC0wLDAgKzEsNjg2IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3Zmcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzaWduYWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW1pdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21hZ2ljLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rXFxuK3N0cnVjdCBicGZfYXJncyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0dfRFlJTkdfRElSIFxcXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1xcXCJcXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXFxcIi90cmlnZ2VyXFxcIlxcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFxcXCIvdGFyZ2V0XFxcIlxcbitcXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxcbitcXG4rLypcXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxcbisgKiBpbi1mbGlnaHQgcmVjbGFpbSBwYXNzZXMgdGltZSB0byBkcmFpbiwgdGhlbiB3YWl0IGZvciBhIHJlY2xhaW0gcm91bmRcXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xcbisgKiBzdWNoIGEgcm91bmQgbXVzdCBzaG93IHVwIHdpdGhpbiBhIGZldyB0aW1lciBwZXJpb2RzLlxcbisgKi9cXG4rI2RlZmluZSBEWUlOR19TRVRUTEVfVVMgKDIwMCAqIDEwMDApXFxuKyNkZWZpbmUgRFlJTkdfUE9MTF9JVEVSUyA1MDBcXG4rI2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApXFxuK1xcbisvKlxcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXFxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcXG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xcbitcXG4rXFx0aWYgKCFzdGF0ZnMoXFxcIi90bXBcXFwiLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXFxuK1xcdFxcdHJldHVybiBcXFwiLlxcXCI7XFxuK1xcdHJldHVybiBcXFwiL3RtcFxcXCI7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cXG4rICovXFxuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcXG4rXFx0Q0hJTERfRVhJVF9PSyA9IDAsXFxuK1xcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXFxuK1xcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXFxuK1xcdENISUxEX0VYSVRfVElNRV9GSUxFLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxcbit7XFxuK1xcdHN3aXRjaCAoY29kZSkge1xcbitcXHRjYXNlIENISUxEX0VYSVRfT0s6XFxuK1xcdFxcdHJldHVybiBcXFwic3VjY2Vzc1xcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJqb2luIGNncm91cFxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwicmVhZCBkYXRhIGZpbGVcXFwiO1xcbitcXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIHRpbWUgZmlsZVxcXCI7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBcXFwidW5rbm93blxcXCI7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHRjaGFyIGxpbWl0X2J1ZlsyMF07XFxuK1xcbitcXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcXFwibWVtb3J5XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImVuYWJsZV9jb250cm9sbGVyc1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcXFwiJWx1XFxcIiwgQ0dfTElNSVQpO1xcbitcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFxcXCJtZW1vcnkubWF4XFxcIiwgbGltaXRfYnVmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcXG4rXFx0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cXG4rXFx0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cXG4rXFx0ICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSBkeWluZyB0ZXN0IG5lZWRzIGFuIGVtcHR5IHJlY2xhaW0gdGFyZ2V0IHBsdXMgYSBjZ3JvdXAgdGhhdCBrZWVwc1xcbisgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcFxcbisgKiBzdGFydGluZyBhbmQgcnVuIGludG8gdGhlIHJlbW92ZWQgdGFyZ2V0LiBUaGUgdHdvIGhhdmUgdG8gYmUgc2VwYXJhdGVcXG4rICogY2dyb3VwczogdGhlIHRhcmdldCBtdXN0IGhvbGQgbm8gcHJvY2Vzc2VzIHRvIGJlIHJlbW92ZWQsIGFuZCB2MidzXFxuKyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcXG4rICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uXFxuKyAqL1xcbitzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdGNoYXIgbGltaXRfYnVmWzIwXTtcXG4rXFxuK1xcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0RZSU5HX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsIFxcXCJtZW1vcnlcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiZW5hYmxlX2NvbnRyb2xsZXJzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFxcXCIlbHVcXFwiLCBDR19MSU1JVCk7XFxuK1xcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXFxcIm1lbW9yeS5tYXhcXFwiLCBsaW1pdF9idWYpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdC8qIFNlZSB0aGUgbWF0Y2hpbmcgd3JpdGUgaW4gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygpLiAqL1xcbitcXHRpZiAoIWFjY2VzcyhcXFwiL3Byb2Mvc3dhcHNcXFwiLCBGX09LKSkge1xcbitcXHRcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFxcXCJtZW1vcnkuc3dhcC5tYXhcXFwiLCBcXFwiMFxcXCIpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19EWUlOR19UUklHR0VSX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqdHJpZ2dlcl9jZ3JvdXBfaWQsIDAsIFxcXCJnZXRfY2dyb3VwX2lkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdCp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsIFxcXCJnZXRfY2dyb3VwX2lkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRzaXplX3Qgd3JpdHRlbiA9IDA7XFxuK1xcdGNoYXIgKmJ1ZmZlcjtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcXFwid2JcXFwiKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xcbitcXHRpZiAoIWJ1ZmZlcilcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZwO1xcbitcXG4rXFx0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XFxuK1xcbitcXHR3aGlsZSAod3JpdHRlbiBcXHUwMDNjIEZJTEVfU0laRSkge1xcbitcXHRcXHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFxcdTAwM2MgQlVGRkVSX1NJWkUgP1xcbitcXHRcXHRcXHRcXHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcXG4rXFxuK1xcdFxcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdFxcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IDA7XFxuK2NsZWFudXA6XFxuK1xcdGZyZWUoYnVmZmVyKTtcXG4rY2xlYW51cF9mcDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0Y2hhciAqbWFwO1xcbitcXHRzaXplX3QgaTtcXG4rXFx0aW50IGZkO1xcbitcXHRzdHJ1Y3Qgc3RhdCBzYjtcXG4rXFxuK1xcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xcbitcXHRpZiAoZmQgPT0gLTEpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGZzdGF0KGZkLCBcXHUwMDI2c2IpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXHR9XFxuK1xcbitcXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xcbitcXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFxcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XFxuK1xcdFxcdFxcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXFxuK1xcdFxcdFxcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcXG4rXFx0XFx0XFx0KHZvaWQpdjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0cmV0ID0gMDtcXG4rXFxuK2NsZWFudXBfZmQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcXG4rXFx0ZG91YmxlIGVsYXBzZWQ7XFxuK1xcdEZJTEUgKmZwO1xcbitcXG4rXFx0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXFxuK1xcdFxcdHJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZzdGFydCk7XFxuK1xcbitcXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcXG4rXFxuK1xcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXFxuK1xcdFxcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcXG4rXFxuK1xcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcXHUwMDI2ZW5kKTtcXG4rXFxuK1xcdGlmICghdGltZV9maWxlbmFtZSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XFxuK1xcbitcXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcXG4rXFx0XFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcXG4rXFx0cHJpbnRmKFxcXCIlLjZmXFxcXG5cXFwiLCBlbGFwc2VkKTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcIndcXFwiKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xcbitcXHRmcHJpbnRmKGZwLCBcXFwiJS42ZlxcXCIsIGVsYXBzZWQpO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXG4rXFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxcbit7XFxuK1xcdGludCByZXQgPSAtMTtcXG4rXFx0RklMRSAqZnA7XFxuK1xcdGNoYXIgYnVmWzY0XTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcInJcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcXFwiZm9wZW5cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcXFwiZmdldHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKHNzY2FuZihidWYsIFxcXCIlbGZcXFwiLCB0aW1lKSAhPSAxKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcInNzY2FuZiAlc1xcXCIsIGJ1Zik7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXFxuK3tcXG4rXFx0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdO1xcbitcXHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xcbitcXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcXG4rXFx0cGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xO1xcbitcXHRwaWRfdCB3YWl0X3JldDtcXG4rXFx0aW50IGZkLCBzdGF0dXM7XFxuK1xcdGludCByZXQgPSAtMTtcXG4rXFxuK1xcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGxvd19waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFxcXCJmb3JrIGxvd1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChsb3dfcGlkID09IDApXFxuK1xcdFxcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aGlnaF9waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcXFwiZm9yayBoaWdoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGhpZ2hfcGlkID09IDApXFxuK1xcdFxcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFxcdTAwMjZzdGF0dXMsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXFxcImxvdyB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LypcXG4rXFx0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXFxuK1xcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxcbitcXHQgKi9cXG4rXFx0bG93X3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibG93IGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxcbitcXHRcXHRcXHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFxcdTAwMjZzdGF0dXMsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXFxcImhpZ2ggd2FpdHBpZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xcbitcXHRoaWdoX3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwiaGlnaCBleGl0ZWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRpZiAoaGlnaF9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdFxcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAobG93X3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcXG4rXFx0XFx0XFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHVubGluayhsb3dfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxcbitcXHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXFxuK3tcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XFxuK1xcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xcbitcXHRcXHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcXG4rXFx0XFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxcbitcXHRcXHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxcbitcXHRcXHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcXG4rXFx0XFx0LmN0eF9pbiA9IFxcdTAwMjZhcmdzLFxcbitcXHRcXHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xcbitcXHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XFxuK1xcbitcXHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXFx1MDAyNnJ1bl9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcXFwicHJvZ19pbml0IHJldHZhbFxcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFxuK1xcdCpza2VsX3B0ciA9IHNrZWw7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZXJyb3Jfb3V0OlxcbitcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXFxuK3tcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xcbitcXHRpbnQgZXJyO1xcbitcXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZsb3dfY2dyb3VwX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXFx1MDAyNnNrZWwpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9icGZcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXFx1MDAyNmhpZ2hfdGltZSwgXFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xcbitcXHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cXG4rXFx0ICogYWN0dWFsbHkgcmVjbGFpbWVkIG1lbW9yeSBmcm9tIHRoZSBsb3cgY2dyb3VwLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX2NhbGxzLCAwLCBcXFwicmVjbGFpbV9jYWxsc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFxcXCJyZWNsYWltZWRfYnl0ZXNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoaGlnaF90aW1lIFxcdTAwM2U9IGxvd190aW1lKVxcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQ6IGhpZ2g9JWYgbG93PSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcbitvdXQ6XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuK1xcbisvKlxcbisgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHNcXG4rICoga2VlcCBiZWluZyB0cmlnZ2VyZWQgd2hpbGUgdGhlIHRhcmdldCBjZ3JvdXAgaXMgYmVpbmcgcmVtb3ZlZC4gVGhlXFxuKyAqIGNoaWxkIGpvaW5zIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgd3JpdGVzIHRoZSBkYXRhIGZpbGUgdGhlcmUsIHNvXFxuKyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseVxcbisgKiBjb21lIHVuZGVyIGl0cyBtZW1vcnkgbGltaXQ7IHRoZW4gaXQgcmUtcmVhZHMgdGhlIGZpbGUgaW4gYSBsb29wXFxuKyAqIHVudGlsIGl0IGlzIGtpbGxlZC5cXG4rICovXFxuK3N0YXRpYyBwaWRfdCBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGNvbnN0IGNoYXIgKmRhdGFfZmlsZSlcXG4re1xcbitcXHRwaWRfdCBwaWQgPSBmb3JrKCk7XFxuK1xcbitcXHRpZiAocGlkICE9IDApXFxuK1xcdFxcdHJldHVybiBwaWQ7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSlcXG4rXFx0XFx0X2V4aXQoQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCk7XFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZSkpXFxuK1xcdFxcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxcbitcXHRcXHRcXHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rLypcXG4rICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmRcXG4rICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZlxcbisgKiByZWNsYWltaW5nIGZyb20gaXQuXFxuKyAqXFxuKyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kXFxuKyAqIG9ubHkga2VlcHMgcmVmYXVsdHMgZmxvd2luZyBzbyB0aGF0IHJlY2xhaW0gcm91bmRzIGtlZXAgc3RhcnRpbmcsXFxuKyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIHJlY2xhaW1fY2FsbHMgZ3Jvd2luZ1xcbisgKiB3aGlsZSB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmNcXG4rICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kXFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBza2lwIGNvdW50ZXJzIG11c3QgZ3JvdyB3aGlsZSByZWNsYWltX2NhbGxzXFxuKyAqIGFuZCByZWNsYWltZWRfYnl0ZXMgc3RheSBmcm96ZW4uXFxuKyAqL1xcbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxcbit7XFxuK1xcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcXG4rXFx0dTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlO1xcbitcXHRjaGFyIGRhdGFfZmlsZVtQQVRIX01BWF0gPSBcXFwiXFxcIjtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXHRwaWRfdCByZWFkZXJfcGlkID0gLTE7XFxuK1xcdGludCBlcnIsIGZkLCBpO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcyhcXHUwMDI2dHJpZ2dlcl9jZ3JvdXBfaWQsIFxcdTAwMjZ0YXJnZXRfY2dyb3VwX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfZHlpbmdfY2dyb3Vwc1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsIFxcdTAwMjZza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0c25wcmludGYoZGF0YV9maWxlLCBzaXplb2YoZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcXFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XFxuK1xcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFxcXCJmb3JrIGtlZXBhbGl2ZSByZWFkZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgRFlJTkdfUE9MTF9JVEVSUzsgaSsrKSB7XFxuK1xcdFxcdGlmIChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHMgXFx1MDAzZSAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXFxcInJlY2xhaW1fY2FsbHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXG4rXFx0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cXG4rXFx0dXNsZWVwKERZSU5HX1NFVFRMRV9VUyk7XFxuK1xcbitcXHRjYWxsc19iZWZvcmUgPSBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHM7XFxuK1xcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX2J5dGVzO1xcbitcXG4rXFx0LyogV2FpdCBmb3IgcmVjbGFpbSByb3VuZHMgdG8gaGl0IHRoZSByZW1vdmVkIGNncm91cC4gKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIERZSU5HX1BPTExfSVRFUlM7IGkrKykge1xcbitcXHRcXHRpZiAoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIHx8XFxuK1xcdFxcdCAgICBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZylcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fdGFyZ2V0X2dvbmUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZykge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSlcXFwiLFxcbitcXHRcXHRcXHQgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcXG4rXFx0XFx0XFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiByZWNsYWltX3NraXBwZWRfZHlpbmcgc2hvd3MgdGhhdCB0aGUgQ1NTX0RZSU5HL0NTU19PTkxJTkUgY2hlY2tcXG4rXFx0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIGl0IGlzIGhpdCBpcyB0aW1pbmdcXG4rXFx0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXFxuK1xcdCAqIG9ubHkgdGhlIGNvbWJpbmVkIHNraXAgY291bnQgYWJvdmUgaXMgYXNzZXJ0ZWQuXFxuK1xcdCAqL1xcbitcXHRwcmludGYoXFxcIm1lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVsbHUsIGR5aW5nPSVsbHVcXFxcblxcXCIsXFxuK1xcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcXG4rXFx0ICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpO1xcbitcXG4rXFx0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsIFxcXCJyZWNsYWltX2NhbGxzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxcbitcXHRcXHQgICAgICAgXFxcInJlY2xhaW1lZF9ieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK291dDpcXG4rXFx0aWYgKHJlYWRlcl9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XFxuK1xcdH1cXG4rXFx0aWYgKGRhdGFfZmlsZVswXSlcXG4rXFx0XFx0dW5saW5rKGRhdGFfZmlsZSk7XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lNjgzOWFkZTQ3MmJiXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDI1OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcXHQxXFxuKyNkZWZpbmUgUEFHRV9TSVpFXFx0XFx0NDA5NlVMXFxuKy8qXFxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxcbisgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlXFxuKyAqIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBvbmUsIHNvIG5vIGNhbGxiYWNrIHJ1bnMgbG9uZ2VyIHRoYW4gb25lXFxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxcbisgKi9cXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcXHRcXHQoMzIgKiBQQUdFX1NJWkUpXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xcbit9O1xcbitcXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcXG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xcbitcXG4rLypcXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcXG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9jYWxscztcXG4rdTY0IHJlY2xhaW1lZF9ieXRlcztcXG4rLypcXG4rICogUmVjbGFpbSBhdHRlbXB0cyBza2lwcGVkIGJlY2F1c2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcgb3IgaGFzXFxuKyAqIGJlZW4gcmVtb3ZlZC4gcmVjbGFpbV9za2lwcGVkX2R5aW5nIGNvdW50cyBsb29rdXBzIHRoYXQgc3RpbGwgZm91bmRcXG4rICogdGhlIGNncm91cCB3aGlsZSBpdCBpcyBiZWluZyB0b3JuIGRvd24sIHJlY2xhaW1fdGFyZ2V0X2dvbmUgY291bnRzXFxuKyAqIGxvb2t1cHMgdGhhdCBmb3VuZCBub3RoaW5nLiBUaGUgdGVzdCByZW1vdmVzIHRoZSB0YXJnZXQgY2dyb3VwIHdoaWxlXFxuKyAqIHJlY2xhaW0gaXMgcnVubmluZyBhbmQgY2hlY2tzIHRoYXQgcmVjbGFpbSBzdG9wcyB2aWEgdGhlc2UgY291bnRlcnMuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9za2lwcGVkX2R5aW5nO1xcbit1NjQgcmVjbGFpbV90YXJnZXRfZ29uZTtcXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXFxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXFxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcXG4rICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXFxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxcbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXFxuKyAqXFxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxcbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cXG4rICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXFxuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXFx1MDAzZXNlbGYuZmxhZ3M7XFxuK1xcbitcXHRyZXR1cm4gKGZsYWdzIFxcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFxcdTAwMjYgQ1NTX09OTElORSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxcbisgKiBieXRlcyByZWNsYWltZWQsIG9yIDAgaWYgdGhlIGNncm91cCBpcyBkeWluZyBvciBnb25lIG9yIG5vdGhpbmcgd2FzXFxuKyAqIHJlY2xhaW1lZC5cXG4rICovXFxuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0dTY0IG5yID0gMDtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKSB7XFxuK1xcdFxcdHJlY2xhaW1fdGFyZ2V0X2dvbmUrKztcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcXG4rXFx0XFx0cmVjbGFpbV9za2lwcGVkX2R5aW5nKys7XFxuK1xcdFxcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdHJlY2xhaW1fY2FsbHMrKztcXG4rXFx0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUpO1xcbitcXHRyZWNsYWltZWRfYnl0ZXMgKz0gbnI7XFxuK1xcbitcXHRwdXRfY2dyb3VwX21lbWNnKFxcdTAwMjZjbSk7XFxuK1xcbitcXHRyZXR1cm4gbnI7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbitcXHQvKlxcbitcXHQgKiBCeXRlcyBzdGlsbCB0byByZWNsYWltIGluIHRoZSBjdXJyZW50IHJvdW5kLCBjYXJyaWVkIGFjcm9zc1xcbitcXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcXG4rXFx0ICogc3RhcnRzIGEgbmV3IHJvdW5kIGJ5IHJlc2V0dGluZyBpdCwgcmVxdWV1ZWQgd29yayBvbmx5IGxvb2tzXFxuK1xcdCAqIGF0IGl0LlxcbitcXHQgKi9cXG4rXFx0dTY0IHJlbWFpbmluZztcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbitcXHRfX3R5cGUoa2V5LCBfX3UzMik7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xcbit9IHdxX21hcCBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xcbitcXHR1NjQgbnIsIHNpemU7XFxuK1xcbitcXHRpZiAoIWVsZW0tXFx1MDAzZXJlbWFpbmluZykge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaW1lci10cmlnZ2VyZWQgZW50cnk6IHN0YXJ0IGEgbmV3IHJvdW5kIG9ubHkgd2hlbiB0aGVcXG4rXFx0XFx0ICogaGlnaCBjZ3JvdXAgcmVmYXVsdHMgZW5vdWdoLiBSZXF1ZXVlZCBlbnRyaWVzIHNraXAgdGhpc1xcbitcXHRcXHQgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGFcXG4rXFx0XFx0ICogaXMgY29uc3VtZWQgb25jZSBwZXIgcm91bmQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXFx1MDAyNmVsZW0tXFx1MDAzZXByZXZfZXZlbnQsXFxuK1xcdFxcdFxcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRlbGVtLVxcdTAwM2VyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFO1xcbitcXHR9XFxuK1xcbitcXHQvKiBPbmUgYm91bmRlZCByZWNsYWltIHBhc3MgcGVyIGNhbGxiYWNrICovXFxuK1xcdHNpemUgPSBlbGVtLVxcdTAwM2VyZW1haW5pbmcgXFx1MDAzYyBSRUNMQUlNX1NJWkUgPyBlbGVtLVxcdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XFxuK1xcdG5yID0gcmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCwgc2l6ZSk7XFxuK1xcdGlmICghbnIpIHtcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlcmVtYWluaW5nID0gMDtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovXFxuK1xcdGlmIChuciBcXHUwMDNlPSBlbGVtLVxcdTAwM2VyZW1haW5pbmcpXFxuK1xcdFxcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyA9IDA7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlcmVtYWluaW5nIC09IG5yO1xcbitcXG4rXFx0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXFxuK1xcdGlmIChlbGVtLVxcdTAwM2VyZW1haW5pbmcpXFxuK1xcdFxcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcXG4re1xcbitcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXHRicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJzeXNjYWxsXFxcIilcXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcXG4rXFx0X191MzIga2V5ID0gMDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZ3cV9tYXAsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIWVsZW0pXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHJldCA9IGJwZl93cV9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCBcXHUwMDI2d3FfbWFwLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIFxcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0ZWxlbS1cXHUwMDNlcHJldl9ldmVudCA9IDA7XFxuK1xcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyA9IDA7XFxuK1xcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHRlbGVtLVxcdTAwM2VjaGVja19ucyA9IGN0eC1cXHUwMDNlY2hlY2tfbnM7XFxuK1xcbitcXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWxvd19jZ3JvdXBfaWQ7XFxuK1xcbitcXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbit9XFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6MjUuMzg1OTU5MTY1WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozNzMwNzM2MDc3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBhbGxvd2luZyBzbGVlcGFibGUgQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB2aWEgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGNvZGUgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTJmMzViYTY2MzA5ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuKyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcbisgKlxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cbisgKlxuKyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxuKyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cbisgKlxuKyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcbisgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlXG4rICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4rICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cbisgKlxuKyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4rICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcbisgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzXG4rICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4rICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXG4rICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdFxuKyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuKyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcbisgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpc1xuKyAqIGR5aW5nLlxuKyAqXG4rICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aFxuKyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbitcbitcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxuK1x0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rXHRcdFx0XHRcdFx0ICAgIE5VTEwpO1xuK1xuK1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzEsMjIgKzI0MCw0NCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfbWVtb3J5X2V2ZW50cylcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4tXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuKy8qXG4rICogUHJvYWN0aXZlIHJlY2xhaW0gbmVlZHMgYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQsIHNvIGl0IGlzIHJlc3RyaWN0ZWRcbisgKiB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwuIFRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3MgdGhhdCBhXG4rICogU1lTQ0FMTCBwcm9ncmFtIHNjaGVkdWxlcyBydW4gYXMgdGhlIHNhbWUgcHJvZ3JhbSB0eXBlLCBzbyB0aGV5IGNhblxuKyAqIHN0aWxsIGludm9rZSBpdDsgZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgKGUuZy4gZmVudHJ5IG9uIHJlY2xhaW1cbisgKiBwYXRocywgaW5vZGVfcm1kaXIpIGNhbm5vdC5cbisgKi9cbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjVmNTAwNjg0NDYzNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDY4NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENHX0RZSU5HX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nXCJcbisjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiBcIi90cmlnZ2VyXCJcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFwiL3RhcmdldFwiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlXG4rICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcbisgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvXG4rICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwXG4rI2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApXG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4rICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuKyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4rICovXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuK3tcbitcdHN0cnVjdCBzdGF0ZnMgc3Q7XG4rXG4rXHRpZiAoIXN0YXRmcyhcIi90bXBcIiwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbitcdFx0cmV0dXJuIFwiLlwiO1xuK1x0cmV0dXJuIFwiL3RtcFwiO1xuK31cbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4rICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cbisgKi9cbitlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4rXHRDSElMRF9FWElUX09LID0gMCxcbitcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4rXHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4rXHRDSElMRF9FWElUX1JFQURfRklMRSxcbitcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuK3tcbitcdHN3aXRjaCAoY29kZSkge1xuK1x0Y2FzZSBDSElMRF9FWElUX09LOlxuK1x0XHRyZXR1cm4gXCJzdWNjZXNzXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4rXHRcdHJldHVybiBcImpvaW4gY2dyb3VwXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuK1x0XHRyZXR1cm4gXCJyZWFkIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgdGltZSBmaWxlXCI7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LypcbitcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxuK1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbitcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4rXHQgKi9cbitcdGlmICghYWNjZXNzKFwiL3Byb2Mvc3dhcHNcIiwgRl9PSykpIHtcbitcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbisvKlxuKyAqIFRoZSBkeWluZyB0ZXN0IG5lZWRzIGFuIGVtcHR5IHJlY2xhaW0gdGFyZ2V0IHBsdXMgYSBjZ3JvdXAgdGhhdCBrZWVwc1xuKyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4rICogc3RhcnRpbmcgYW5kIHJ1biBpbnRvIHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIHR3byBoYXZlIHRvIGJlIHNlcGFyYXRlXG4rICogY2dyb3VwczogdGhlIHRhcmdldCBtdXN0IGhvbGQgbm8gcHJvY2Vzc2VzIHRvIGJlIHJlbW92ZWQsIGFuZCB2MidzXG4rICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZlxuKyAqIGFueSBwYXJlbnQgdGhhdCBoYXMgZG9tYWluIGNoaWxkcmVuLlxuKyAqL1xuK3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRFlJTkdfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RSSUdHRVJfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRyaWdnZXJfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdGFyZ2V0X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqdGFyZ2V0X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdHNpemVfdCB3cml0dGVuID0gMDtcbitcdGNoYXIgKmJ1ZmZlcjtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCJ3YlwiKTtcbitcdGlmICghZnApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbitcdGlmICghYnVmZmVyKVxuK1x0XHRnb3RvIGNsZWFudXBfZnA7XG4rXG4rXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcbitcbitcdHdoaWxlICh3cml0dGVuIFx1MDAzYyBGSUxFX1NJWkUpIHtcbitcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuK1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4rXG4rXHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0d3JpdHRlbiArPSB0b193cml0ZTtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZyZWUoYnVmZmVyKTtcbitjbGVhbnVwX2ZwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4rXHRjaGFyICptYXA7XG4rXHRzaXplX3QgaTtcbitcdGludCBmZDtcbitcdHN0cnVjdCBzdGF0IHNiO1xuK1xuK1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgPT0gLTEpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwiLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7XG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcdH1cbitcbitcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4rXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICs9IHBhZ2Vfc2l6ZSkge1xuK1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4rXHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuK1x0XHRcdCh2b2lkKXY7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfZmQ6XG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSxcbitcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4rXG4rXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbitcbitcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZlbmQpO1xuK1xuK1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbitcbitcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xuK1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuK1x0cHJpbnRmKFwiJS42ZlxcblwiLCBlbGFwc2VkKTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0aW50IGVycjtcbitcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuK1xuK1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LypcbitcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXG4rXHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbitcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cbitcdCAqL1xuK1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG4rXG4rLypcbisgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHNcbisgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGVcbisgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuKyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseVxuKyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3BcbisgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4rICovXG4rc3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKVxuK3tcbitcdHBpZF90IHBpZCA9IGZvcmsoKTtcbitcbitcdGlmIChwaWQgIT0gMClcbitcdFx0cmV0dXJuIHBpZDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuK1x0XHRfZXhpdChDSElMRF9FWElUX0pPSU5fQ0dST1VQKTtcbitcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZSkpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSlcbitcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4rXHR9XG4rfVxuK1xuKy8qXG4rICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmRcbisgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mXG4rICogcmVjbGFpbWluZyBmcm9tIGl0LlxuKyAqXG4rICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmRcbisgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxuKyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIHJlY2xhaW1fY2FsbHMgZ3Jvd2luZ1xuKyAqIHdoaWxlIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBza2lwIGNvdW50ZXJzIG11c3QgZ3JvdyB3aGlsZSByZWNsYWltX2NhbGxzXG4rICogYW5kIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRwaWRfdCByZWFkZXJfcGlkID0gLTE7XG4rXHRpbnQgZXJyLCBmZCwgaTtcbitcbitcdGVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoXHUwMDI2dHJpZ2dlcl9jZ3JvdXBfaWQsIFx1MDAyNnRhcmdldF9jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2R5aW5nX2Nncm91cHNcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHNucHJpbnRmKGRhdGFfZmlsZSwgc2l6ZW9mKGRhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XG4rXHRmZCA9IG1rc3RlbXAoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFwiZm9yayBrZWVwYWxpdmUgcmVhZGVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMgXHUwMDNlIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbitcdH1cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fdGFyZ2V0X2dvbmUgfHxcbitcdFx0ICAgIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZylcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpO1xuK1x0fVxuK1xuK1x0aWYgKCFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lbGx1LCBkeWluZz0lbGx1KVwiLFxuK1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdFx0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIGl0IGlzIGhpdCBpcyB0aW1pbmdcbitcdCAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzb1xuK1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbitcdCAqL1xuK1x0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWxsdSwgZHlpbmc9JWxsdVxcblwiLFxuK1x0ICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXG4rXHQvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqL1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCBcInJlY2xhaW1fY2FsbHNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbWVkX2J5dGVzLCBieXRlc19iZWZvcmUsXG4rXHRcdCAgICAgICBcInJlY2xhaW1lZF9ieXRlc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rb3V0OlxuK1x0aWYgKHJlYWRlcl9waWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTtcbitcdFx0KHZvaWQpd2FpdHBpZChyZWFkZXJfcGlkLCBOVUxMLCAwKTtcbitcdH1cbitcdGlmIChkYXRhX2ZpbGVbMF0pXG4rXHRcdHVubGluayhkYXRhX2ZpbGUpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjU5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuKy8qXG4rICogUmVjbGFpbSBhdHRlbXB0cyBza2lwcGVkIGJlY2F1c2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcgb3IgaGFzXG4rICogYmVlbiByZW1vdmVkLiByZWNsYWltX3NraXBwZWRfZHlpbmcgY291bnRzIGxvb2t1cHMgdGhhdCBzdGlsbCBmb3VuZFxuKyAqIHRoZSBjZ3JvdXAgd2hpbGUgaXQgaXMgYmVpbmcgdG9ybiBkb3duLCByZWNsYWltX3RhcmdldF9nb25lIGNvdW50c1xuKyAqIGxvb2t1cHMgdGhhdCBmb3VuZCBub3RoaW5nLiBUaGUgdGVzdCByZW1vdmVzIHRoZSB0YXJnZXQgY2dyb3VwIHdoaWxlXG4rICogcmVjbGFpbSBpcyBydW5uaW5nIGFuZCBjaGVja3MgdGhhdCByZWNsYWltIHN0b3BzIHZpYSB0aGVzZSBjb3VudGVycy5cbisgKi9cbit1NjQgcmVjbGFpbV9za2lwcGVkX2R5aW5nO1xuK3U2NCByZWNsYWltX3RhcmdldF9nb25lO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbisvKlxuKyAqIEEgY2dyb3VwIGlzIGR5aW5nIG9uY2UgaXQgaGFzIGJlZW4gb2ZmbGluZWQgKENTU19PTkxJTkUgY2xlYXJlZCkgb3JcbisgKiBDU1NfRFlJTkcgaGFzIGJlZW4gcmFpc2VkLCBtaXJyb3JpbmcgY2dyb3VwX2lzX2RlYWQoKS9jc3NfaXNfZHlpbmcoKVxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbisgKiBzdWNoIGEgY2dyb3VwLCBiZWNhdXNlIGl0IG9ubHkgZmFpbHMgb25jZSB0aGUgbGFzdCByZWZlcmVuY2UgaGFzIGJlZW5cbisgKiBkcm9wcGVkLCBzbyByZWNsYWltIGhhcyB0byBjaGVjayB0aGVzZSBmbGFncyBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4rICpcbisgKiBDU1NfT05MSU5FIGFuZCBDU1NfRFlJTkcgY29tZSBmcm9tIHZtbGludXguaDogdGhlIGtlcm5lbCBkZWZpbmVzIHRoZW1cbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbisgKiBiaW5kIHRvLCBhbmQgcmVkZWNsYXJpbmcgdGhlbSBsb2NhbGx5IHdvdWxkIGNsYXNoIHdpdGggdGhlIHZtbGludXguaFxuKyAqIGVudW1lcmF0b3JzLiB2bWxpbnV4LmggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsJ3MgQlRGLCBzb1xuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cbisgKi9cbitzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjZ3JwLVx1MDAzZXNlbGYuZmxhZ3M7XG4rXG4rXHRyZXR1cm4gKGZsYWdzIFx1MDAyNiBDU1NfRFlJTkcpIHx8ICEoZmxhZ3MgXHUwMDI2IENTU19PTkxJTkUpO1xuK31cbitcbisvKlxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxuKyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbisgKiByZWNsYWltZWQuXG4rICovXG4rc3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0dTY0IG5yID0gMDtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpIHtcbitcdFx0cmVjbGFpbV90YXJnZXRfZ29uZSsrO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0cmVjbGFpbV9za2lwcGVkX2R5aW5nKys7XG4rXHRcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdHJlY2xhaW1fY2FsbHMrKztcbitcdG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6MjUuMzg1OTYwNzc1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ4NzAyNDE5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBvdGVudGlhbCBmb3IgRnV6emluZzogQSBTdHJhdGVnaWMgQXNzZXNzbWVudCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBuZXcgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAga2Z1bmMgaXMgZXZlbiBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLCBhbmQgaWYgc28sIGhvdyB0byBhcHByb2FjaCBpdC4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIHBhdGNoLlxuXG5SaWdodCwgdGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGtmdW5jIHdpdGhpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIE5vdywgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlYmFzZSB0byB1bmRlcnN0YW5kIHdoYXQgKmVuYWJsZXMqIHRoaXMgZnVuY3Rpb25hbGl0eS4gSSdsbCBuZWVkIHRvIGV4YW1pbmUgYG1tL2JwZl9tZW1jb250cm9sLmNgIGl0c2VsZiwgYW5kIHF1aWNrbHkgZGl2ZSBpbnRvIHRoZSByZWxldmFudCBgTWFrZWZpbGVgIGFuZCBgS2NvbmZpZ2AgZmlsZXMgd2l0aGluIHRoZSBgbW1gIGRpcmVjdG9yeS4gVGhhdCB3aWxsIHRlbGwgbWUgd2hpY2ggY29uZmlndXJhdGlvbiBvcHRpb25zIHRyaWdnZXIgdGhlIGluY2x1c2lvbiBvZiBgbW0vYnBmX21lbWNvbnRyb2wuY2AsIHRodXMgYWxzbyBpbmZvcm1pbmcgd2hhdCBjb25maWd1cmF0aW9ucyBJJ2xsIG5lZWQgdG8gZW5hYmxlIGR1cmluZyBmdXp6aW5nIHRvIGV2ZW4gbWFrZSB0aGlzIGNvZGUgcGF0aCBhY3RpdmUuIE9uY2UgSSBrbm93IHdoYXQgdHJpZ2dlcnMgdGhlIGluY2x1c2lvbiBvZiB0aGUgbmV3IGNvZGUsIEknbGwgdGhlbiBkZXRlcm1pbmUgd2hpY2ggc3ltYm9scyBhcmUgZ29vZCBmb2N1cyBwb2ludHMgdG8gZXh0cmFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ4ODksIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MToyNy44NzI5ODc4MjNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU2Mjc0MzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2xcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTEwNj1pZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG5tbS9NYWtlZmlsZToxMDc6b2JqLSQoQ09ORklHX01FTUNHKSArPSBicGZfbWVtY29udHJvbC5vXFxubW0vTWFrZWZpbGUtMTA4LWVuZGlmXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jPTIzMT1fX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjMyLVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjMzOkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjM0LUJURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X3Jvb3RfbWVtX2Nncm91cCwgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDI9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDM6QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ0LVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTEtICovXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTI6QlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1My1CVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTQ6QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTUtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTY6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1Ny1cXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI1ODpcXHQuc2V0ICAgICAgICAgICAgPSBcXHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNzLFxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU5LX07XFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjAtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNjE6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0ge1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjYyLVxcdC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLFxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjYzOlxcdC5zZXQgICAgICAgICAgICA9IFxcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcyxcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2NC19O1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjY1LVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjY2OnN0YXRpYyBpbnQgX19pbml0IGJwZl9tZW1jb250cm9sX2luaXQodm9pZClcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2Ny17XFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTI3MC1cXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjcxOlxcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjcyLVxcdGlmIChlcnIpIHtcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjc3LVxcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxcbm1tL2JwZl9tZW1jb250cm9sLmM6Mjc4OlxcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNzktXFx0aWYgKGVycilcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjgzLX1cXG5tbS9icGZfbWVtY29udHJvbC5jOjI4NDpsYXRlX2luaXRjYWxsKGJwZl9tZW1jb250cm9sX2luaXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MToyNy45Mjg2MjIxOTJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTc1NjE5MTM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBtbS9icGZfbWVtY29udHJvbC5jYCoqXG5cbk9rYXksIHRpbWUgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uLiBMZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoZSBCUEYgaW50ZWdyYXRpb24gd2l0aCBtZW1vcnkgY29udHJvbCBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZC4gSSdtIGVzcGVjaWFsbHkgY3VyaW91cyBhYm91dCBob3cgdGhlIGhvb2tzIGFyZSBzZXQgdXAgYW5kIGhvdyB0aGUgQlBGIHByb2dyYW1zIGludGVyYWN0IHdpdGggdGhlIG1lbWNnIGRhdGEgc3RydWN0dXJlcy4gSSdtIGV4cGVjdGluZyB0byBzZWUgY2FsbHMgcmVsYXRlZCB0byBgbWVtY2dfY3NzX2AsIGBtZW1fY2dyb3VwX2AsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIHBlci1jcHUgc3RhdHMuIEknbSBrZWVuIHRvIHNlZSB0aGUgc3BlY2lmaWMgcG9pbnRzIG9mIGluamVjdGlvbjogYWxsb2NhdGlvbiBwYXRocywgcmVjbGFpbSwgbWlncmF0aW9uLCBldGMuIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMsIHNvIGxldCdzIHNlZSBob3cgdGhlIEJQRiBob29rcyBpbnRvIHRoZXNlIGNyaXRpY2FsIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbXMuIFVsdGltYXRlbHksIEknbSB0cnlpbmcgdG8gZ3JvayB0aGUgb3ZlcmhlYWQgaW50cm9kdWNlZCBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHRoZSBsZXZlbCBvZiBjb250cm9sIGFmZm9yZGVkIGJ5IHRoaXMgaW50ZWdyYXRpb24uIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjIyMiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjMwLjUwNDI0NDY0OFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczOTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2JwZl9tZW1jb250cm9sLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTUwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTUwOlxcdH1cXG4gMTUxOlxcdFxcbiAxNTI6XFx0LyoqXFxuIDE1MzpcXHQgKiBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyAtIEZsdXNoIG1lbW9yeSBjZ3JvdXAncyBzdGF0aXN0aWNzXFxuIDE1NDpcXHQgKiBAbWVtY2c6IG1lbW9yeSBjZ3JvdXBcXG4gMTU1OlxcdCAqXFxuIDE1NjpcXHQgKiBQcm9wYWdhdGUgbWVtb3J5IGNncm91cCdzIHN0YXRpc3RpY3MgdXAgdGhlIGNncm91cCB0cmVlLlxcbiAxNTc6XFx0ICovXFxuIDE1ODpcXHRfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4gMTU5OlxcdHtcXG4gMTYwOlxcdFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiAxNjE6XFx0fVxcbiAxNjI6XFx0XFxuIDE2MzpcXHQvKlxcbiAxNjQ6XFx0ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlOiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgb3ZlcndyaXRlc1xcbiAxNjU6XFx0ICogY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxcbiAxNjY6XFx0ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcXG4gMTY3OlxcdCAqIHJlY2xhaW1fc3RhdGUgaXMgYWxzbyBjaGVja2VkIGJlY2F1c2UgaXQgaXMgaW5zdGFsbGVkIHNsaWdodGx5XFxuIDE2ODpcXHQgKiBiZWZvcmUgUEZfTUVNQUxMT0MuXFxuIDE2OTpcXHQgKi9cXG4gMTcwOlxcdHN0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcXG4gMTcxOlxcdHtcXG4gMTcyOlxcdFxcdHJldHVybiAoY3VycmVudC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZTtcXG4gMTczOlxcdH1cXG4gMTc0OlxcdFxcbiAxNzU6XFx0LyoqXFxuIDE3NjpcXHQgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XFxuIDE3NzpcXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcXG4gMTc4OlxcdCAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxcbiAxNzk6XFx0ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xcbiAxODA6XFx0ICogICAgICAgICBNRU1DR19DSEFSR0VfQkFUQ0ggKDY0IHBhZ2VzKVxcbiAxODE6XFx0ICpcXG4gMTgyOlxcdCAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cXG4gMTgzOlxcdCAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxcbiAxODQ6XFx0ICpcXG4gMTg1OlxcdCAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xcbiAxODY6XFx0ICogdGhlIG1lbW9yeS5oaWdoIHdvcmtxdWV1ZSBmYWxsYmFjayBpbiBoaWdoX3dvcmtfZnVuYygpLiBUbyByZWNsYWltXFxuIDE4NzpcXHQgKiBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseSBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXFxuIDE4ODpcXHQgKlxcbiAxODk6XFx0ICogVGhpcyBrZnVuYyBpcyByZXN0cmljdGVkIHRvIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCB0byBlbnN1cmUgaXQgcnVuc1xcbiAxOTA6XFx0ICogaW4gYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQuIFRoZSBTWVNDQUxMIHByb2dyYW0gY2FuIHNjaGVkdWxlIHRoZVxcbiAxOTE6XFx0ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXFxuIDE5MjpcXHQgKiBzYWZlIHByb2Nlc3MgY29udGV4dCAod29ya3F1ZXVlLCB0YXNrX3dvcmspLlxcbiAxOTM6XFx0ICpcXG4gMTk0OlxcdCAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXFxuIDE5NTpcXHQgKiBjYWxsYmFjayBhbmQgcmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoIHJhdGhlclxcbiAxOTY6XFx0ICogdGhhbiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2s6IGEgbG9uZy1ydW5uaW5nIGNhbGxiYWNrIHN0YWxsc1xcbiAxOTc6XFx0ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXFxuIDE5ODpcXHQgKiBpbnRlcnJ1cHRzIGRpc2FibGVkIHRoZSByZXN1bHRpbmcgY29udGVudGlvbiBhbHNvIGRlbGF5cyBJUElcXG4gMTk5OlxcdCAqIGhhbmRsaW5nLiBHaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gYnBmX3dxIGl0ZW0sIHNvIHRoYXRcXG4gMjAwOlxcdCAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxcbiAyMDE6XFx0ICogYW5vdGhlci4gRGVjaWRpbmcgd2hldGhlciB0byBzdWJtaXQgdGhlIG5leHQgYmF0Y2ggaXMgdXAgdG8gdGhlIEJQRlxcbiAyMDI6XFx0ICogcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3AgYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXNcXG4gMjAzOlxcdCAqIGR5aW5nLlxcbiAyMDQ6XFx0ICpcXG4gMjA1OlxcdCAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcXG4gMjA2OlxcdCAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXFxuIDIwNzpcXHQgKlxcbiAyMDg6XFx0ICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXFxuIDIwOTpcXHQgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXFxuIDIxMDpcXHQgKi9cXG4gMjExOlxcdF9fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4gMjEyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4gMjEzOlxcdHtcXG4gMjE0OlxcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xcbiAyMTU6XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcXG4gMjE2OlxcdFxcbiAyMTc6XFx0XFx0aWYgKHNpemUgXFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcXG4gMjE4OlxcdFxcdFxcdHJldHVybiAwO1xcbiAyMTk6XFx0XFxuIDIyMDpcXHRcXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xcbiAyMjE6XFx0XFxuIDIyMjpcXHRcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG4gMjIzOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBHRlBfS0VSTkVMLFxcbiAyMjQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxcbiAyMjU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxcbiAyMjY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE5VTEwpO1xcbiAyMjc6XFx0XFxuIDIyODpcXHRcXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xcbiAyMjk6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTozMC41MDQzMjA0NDhaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNzkwMzYzMjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgQlBGIFByb2FjdGl2ZSBSZWNsYWltIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoaXMgY2hhbmdlLiBJdCBhcHBlYXJzIHdlJ3JlIGludHJvZHVjaW5nIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCwgd2l0aGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gVGhhdCBpbiBpdHNlbGYgaXMgaW50ZXJlc3RpbmcuIFRoaXMga2Z1bmMsIGNhbGxhYmxlIGZyb20gYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAg4oCTIGFuZCBjcnVjaWFsbHksIGZyb20gYSBzbGVlcGFibGUgY29udGV4dCDigJMgdGhlbiBwcm9jZWVkcyB0byBjYWxsIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLlxuXG5OZXh0LCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGFwcGxpY2FiaWxpdHkuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQncyBldmVuICpyZWxldmFudCogdG8gc3RhbmRhcmQgdmlydHVhbGl6YXRpb24gc2V0dXBzIGxpa2UgUUVNVT8gVGhlIGFuc3dlciwgSSBxdWlja2x5IGFzc2VzcywgaXMgYSBkZWZpbml0ZSB5ZXMuIFRoZSBCUEYgc3Vic3lzdGVtIGlzIGVudGlyZWx5IHJlYWNoYWJsZSB0aHJvdWdoIHN5c2NhbGxzIGxpa2UgYGJwZihCUEZfUFJPR19MT0FEKWAgYW5kIGBicGYoQlBGX1BST0dfVEVTVF9SVU4pYCwgYW5kIG1lbW9yeSBjZ3JvdXBzIGFyZSwgb2YgY291cnNlLCBlcXVhbGx5IGFjY2Vzc2libGUuIEdpdmVuIHRoYXQgYm90aCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIGtmdW5jcyBhcmUgY29yZSBzdWJzeXN0ZW1zLCB0aGlzIGFyZWEgaXMgc2NyZWFtaW5nIGZvciBmdXp6aW5nLiBJdCdzIGEgcHJpbWUgdGFyZ2V0IGZvciBmaW5kaW5nIHN1YnRsZSwgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgdnVsbmVyYWJpbGl0aWVzLlxuXG5Ob3csIEknbSB0aGlua2luZyBhYm91dCB0aGUgcHJlcmVxdWlzaXRlcy4gTG9va2luZyBhdCBgbW0vTWFrZWZpbGVgLCB0aGUgaW5jbHVzaW9uIG9mIGBicGZfbWVtY29udHJvbC5vYCBoaW5nZXMgb24gYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kLCBpbXBsaWNpdGx5LCBgQ09ORklHX01FTUNHYC4gRnVydGhlcm1vcmUsIGBERUJVR19JTkZPX0JURmAgaXMgdXN1YWxseSBhIG5lY2Vzc2FyeSBpbmdyZWRpZW50IGZvciBCVEYga2Z1bmNzLCB3aGljaCBhcmUgaGVhdmlseSByZWxhdGVkIHRvIEJQRiBrZnVuYyBzdXBwb3J0LCBhcyB3ZWxsIGFzIGBCUEZfU1lTQ0FMTGAgYW5kLCBhZ2FpbiwgYE1FTUNHYC4gSSdsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGUgS2NvbmZpZyBvcHRpb25zIGFyb3VuZCBCVEYsIGtmdW5jcywgYEJQRl9TWVNDQUxMYCwgYW5kIGBNRU1DR2AgdG8gbWFrZSBzdXJlIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzZXQgY29ycmVjdGx5LCBidXQgdGhpcyBhbGwgc2VlbXMgcXVpdGUgcGxhdXNpYmxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg1MSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM0LjI5NDY4NjQxNFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDcxMDkyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYXJlbmEuYz0xMTMxPXN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcXG5rZXJuZWwvYnBmL2FyZW5hLmMtMTEzMi17XFxua2VybmVsL2JwZi9hcmVuYS5jOjExMzM6XFx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFxcdTAwMjZjb21tb25fa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2FyZW5hLmMtMTEzNC19XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg5MTk9c3RhdGljIGludCBidGZfcG9wdWxhdGVfa2Z1bmNfc2V0KHN0cnVjdCBidGYgKmJ0ZiwgZW51bSBidGZfa2Z1bmNfaG9vayBob29rLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy04OTY1LVxcdHNldCA9IHRhYi1cXHUwMDNlc2V0c1tob29rXTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjg5NjY6XFx0LyogV2FybiB3aGVuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQgaXMgY2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBob29rXFxua2VybmVsL2JwZi9idGYuYy04OTY3LVxcdCAqIGZvciBtb2R1bGUgc2V0cy5cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9OTE5MD11MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtOTE5OC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjkxOTk6c3RhdGljIGludCBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBidGZfa2Z1bmNfaG9vayBob29rLFxcbmtlcm5lbC9icGYvYnRmLmMtOTIwMC1cXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjUtLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgb25seSBmcm9tIGluaXRjYWxscy9tb2R1bGUgaW5pdCBmdW5jdGlvbnMgKi9cXG5rZXJuZWwvYnBmL2J0Zi5jOjkyMjY6aW50IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjctXFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMzktXFx0aG9vayA9IGJwZl9wcm9nX3R5cGVfdG9fa2Z1bmNfaG9vayhwcm9nX3R5cGUpO1xcbmtlcm5lbC9icGYvYnRmLmM6OTI0MDpcXHRyZXR1cm4gX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGhvb2ssIGtzZXQpO1xcbmtlcm5lbC9icGYvYnRmLmMtOTI0MS19XFxua2VybmVsL2JwZi9idGYuYzo5MjQyOkVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQpO1xcbmtlcm5lbC9icGYvYnRmLmMtOTI0My1cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9OTI0NT1pbnQgcmVnaXN0ZXJfYnRmX2Ztb2RyZXRfaWRfc2V0KGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxcbmtlcm5lbC9icGYvYnRmLmMtOTI0Ni17XFxua2VybmVsL2JwZi9idGYuYzo5MjQ3OlxcdHJldHVybiBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlRGX0tGVU5DX0hPT0tfRk1PRFJFVCwga3NldCk7XFxua2VybmVsL2JwZi9idGYuYy05MjQ4LX1cXG4tLVxcbmtlcm5lbC9icGYvY3B1bWFzay5jPTUxNT1zdGF0aWMgaW50IF9faW5pdCBjcHVtYXNrX2tmdW5jX2luaXQodm9pZClcXG4tLVxcbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyNS1cXHRyZXQgPSBicGZfbWVtX2FsbG9jX2luaXQoXFx1MDAyNmJwZl9jcHVtYXNrX21hLCBzaXplb2Yoc3RydWN0IGJwZl9jcHVtYXNrKSwgZmFsc2UpO1xcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNjpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsIFxcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI3OlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1Mjg6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyOS1cXHRyZXR1cm4gIHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoY3B1bWFza19kdG9ycyxcXG4tLVxcbmtlcm5lbC9icGYvY3J5cHRvLmM9Mzc5PXN0YXRpYyBpbnQgX19pbml0IGNyeXB0b19rZnVuY19pbml0KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL2NyeXB0by5jLTM4OC1cXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM4OTpcXHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MDpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgXFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcnlwdG8uYzozOTE6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFxcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkyOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcXG5rZXJuZWwvYnBmL2NyeXB0by5jLTM5My1cXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmNyeXB0X2luaXRfa2Z1bmNfc2V0KTtcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jPTQ5ODI9c3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDk5Ny1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0OTk4OlxcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ5OTk6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMDpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1hEUCwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAxOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAyOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAzOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NLQiwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA0LVxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoZ2VuZXJpY19kdG9ycyxcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDYtXFx0XFx0XFx0XFx0XFx0XFx0ICBUSElTX01PRFVMRSk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwNzpcXHRyZXR1cm4gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFxcdTAwMjZjb21tb25fa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA4LX1cXG4tLVxcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYz0yMzA9c3RhdGljIGludCBpbml0X3N1YnN5c3RlbSh2b2lkKVxcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYy0yMzEte1xcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYzoyMzI6XFx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFxcdTAwMjZicGZfbWFwX2l0ZXJfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMzLX1cXG4tLVxcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jPTc1OT1zdGF0aWMgX19pbml0IGludCBycXNwaW5sb2NrX3JlZ2lzdGVyX2tmdW5jcyh2b2lkKVxcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2MC17XFxua2VybmVsL2JwZi9ycXNwaW5sb2NrLmM6NzYxOlxcdHJldHVybiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2cnFzcGlubG9ja19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2Mi19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM0LjM0OTM5OTE1M1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNzI0OTM5ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgZm9jdXNpbmcgb24gdGhlIGltcGxpZWQgcmVhc29uaW5nOlxuXG4qKkNoZWNraW5nIEtjb25maWcgZm9yIENydWNpYWwgS2VybmVsIEZlYXR1cmVzKipcblxuUmlnaHQsIGxldCdzIGRpdmUgaW4uIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gc3RhdGUuIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IHdoZXRoZXIgYE1FTUNHYCAobWVtb3J5IGNncm91cHMpIGlzIGVuYWJsZWQuIEl0J3MgYWxtb3N0IGEgZ2l2ZW4gdGhhdCBpdCdzIGltcG9ydGFudCBmb3IgdGhpcyBraW5kIG9mIHdvcmssIGJ1dCBJIGFsd2F5cyB3YW50IHRvIGNvbmZpcm0uIEl0J3MgbGlrZWx5IGludm9sdmVkIGluIHJlc291cmNlIG1hbmFnZW1lbnQgZm9yIHdoYXRldmVyIEknbSB0cm91Ymxlc2hvb3Rpbmcgb3IgZGV2ZWxvcGluZy4gVGhlbiwgSSBuZWVkIHRvIHZlcmlmeSBgQlBGX1NZU0NBTExgIGFzIHdlbGwsIGJlY2F1c2UgSSdtIGJldHRpbmcgSSdsbCBiZSB0b3VjaGluZyBlQlBGIGF0IHNvbWUgcG9pbnQsIGVpdGhlciBmb3IgaW5zdHJ1bWVudGF0aW9uIG9yIGZvciBmaWx0ZXJpbmcuIENoZWNraW5nIHRoZXNlIGluIEtjb25maWcgd2lsbCBsZXQgbWUga25vdyB3aGV0aGVyIEkgbmVlZCB0byByZWNvbXBpbGUgdGhlIGtlcm5lbCwgb3IgaWYgdGhlc2UgYXJlIGFscmVhZHkgZW5hYmxlZCBvbiB0aGUgc3lzdGVtIEkgYW0gd29ya2luZyB3aXRoLiBNYWtpbmcgc3VyZSB0aGVzZSBhcmUgc2V0IGNvcnJlY3RseSBpcyBhIGZvdW5kYXRpb25hbCBzdGVwIGJlZm9yZSBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMuIFRpbWUgdG8gZ2V0IHRoZSBsYXkgb2YgdGhlIGxhbmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNjI1LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6MzYuNTIxODk1NDQ2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjA1MzYzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTUVNQ0dcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDY3PWNvbmZpZyBDR1JPVVBfRkFWT1JfRFlOTU9EU1xcbi0tXFxuaW5pdC9LY29uZmlnLTEwNzYtXFxuaW5pdC9LY29uZmlnOjEwNzc6Y29uZmlnIE1FTUNHXFxuaW5pdC9LY29uZmlnLTEwNzgtXFx0Ym9vbCBcXFwiTWVtb3J5IGNvbnRyb2xsZXJcXFwiXFxuLS1cXG5pbml0L0tjb25maWctMTA4NS1cXG5pbml0L0tjb25maWc6MTA4Njpjb25maWcgTUVNQ0dfTk1JX1VOU0FGRVxcbmluaXQvS2NvbmZpZy0xMDg3LVxcdGJvb2xcXG4tLVxcbmluaXQvS2NvbmZpZy0xMDkyLVxcbmluaXQvS2NvbmZpZzoxMDkzOmNvbmZpZyBNRU1DR19OTUlfU0FGRVRZX1JFUVVJUkVTX0FUT01JQ1xcbmluaXQvS2NvbmZpZy0xMDk0LVxcdGJvb2xcXG4tLVxcbmluaXQvS2NvbmZpZy0xMDk5LVxcbmluaXQvS2NvbmZpZzoxMTAwOmNvbmZpZyBNRU1DR19WMVxcbmluaXQvS2NvbmZpZy0xMTAxLVxcdGJvb2wgXFxcIkxlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXJcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM2LjU3Mzk1NTMzNloiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODc3MTU2OTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIEJQRiBTeXNjYWxsIENvbmZpZ3VyYXRpb24qKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gcGlucG9pbnQgd2hlcmUgdGhlIGBCUEZfU1lTQ0FMTGAgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgZGVmaW5lZC4gS25vd2luZyB0aGUga2VybmVsJ3MgS2NvbmZpZyBzdHJ1Y3R1cmUgbGlrZSB0aGUgYmFjayBvZiBteSBoYW5kLCBteSBmaXJzdCBpbnN0aW5jdCBpcyB0byBjaGVjayBlaXRoZXIgYGluaXQvS2NvbmZpZ2Agb3IgYGtlcm5lbC9icGYvS2NvbmZpZ2AuIFRob3NlIGFyZSB0aGUgdHdvIG1vc3QgbG9naWNhbCBwbGFjZXMgdG8gc3RhcnQgbG9va2luZyBmb3IgYSBCUEYtcmVsYXRlZCBzZXR0aW5nLiBJdCdzIGFsbW9zdCBjZXJ0YWluIGl0J2xsIGJlIGluIG9uZSBvZiB0aG9zZSwgb3IgcGVyaGFwcyBjcm9zcy1yZWZlcmVuY2VkIGJldHdlZW4gdGhlbS4gVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBCUEYgc3lzY2FsbCBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgYXQgYnVpbGQgdGltZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjExMTMsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTozOC40NTExMTYyNDRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NDYyNzk5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM4LjQ5NzU4NzA2M1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjk0MzM5NDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkh1bnRpbmcgZm9yIEJQRl9TWVNDQUxMIGluIHRoZSBDb25maWcqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIGBCUEZfU1lTQ0FMTGAuIEknbSBnb2luZyB0byBzdGFydCBieSBhc3N1bWluZyBpdCdzIGxpa2VseSBhIGtlcm5lbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlciwgcHJvYmFibHkgdW5kZXIgb25lIG9mIHRoZSBicm9hZGVyIEJQRiBvciBzZWN1cml0eS1yZWxhdGVkIHNlY3Rpb25zLiBTaW5jZSBpdCdzIGEgc3lzY2FsbC1yZWxhdGVkIGZlYXR1cmUsIEkgY2FuIGFsbW9zdCBndWFyYW50ZWUgaXRzIGV4aXN0ZW5jZS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGl0J3MgZGVmaW5lZCBhbmQgd2hhdCBkZXBlbmRlbmNpZXMgaXQgbWlnaHQgaGF2ZS4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gdXNlIHRoZSBzdGFuZGFyZCB0b29sczsgYSBgZ3JlcGAgdGhyb3VnaCB0aGUga2VybmVsJ3MgYEtjb25maWdgIGZpbGVzIHNob3VsZCBkbyB0aGUgdHJpY2ssIG1heWJlIHN0YXJ0aW5nIHdpdGggYSB3aWxkY2FyZCBzZWFyY2ggbGlrZSBgS2NvbmZpZyogQlBGX1NZU0NBTExgLiBPciBwZXJoYXBzIEkgd2lsbCB1c2UgJ2ZpbmQnIGFuZCAnZ3JlcCcgY29tbWFuZHMgdG8gc2VhcmNoLiBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvZGViYXNlLCBJIG1pZ2h0IG5lZWQgdG8gcmVmaW5lIHRoYXQgc2VhcmNoIGlmIGl0J3MgdG9vIGJyb2FkIGluaXRpYWxseS4gSSdsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGNvbnRleHQgYXJvdW5kIHRoYXQgb3B0aW9uIOKAkyB3aGF0IG90aGVyIGZlYXR1cmVzIGRvZXMgaXQgZW5hYmxlIG9yIGRpc2FibGU/IEFyZSB0aGVyZSBhbnkgcHJlcmVxdWlzaXRlcyBJIG5lZWQgdG8gYmUgYXdhcmUgb2Y/IEFuZCBtb3JlIGltcG9ydGFudGx5LCB3aGF0J3MgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBJJ2xsIHByb2JhYmx5IGFsc28gY2hlY2sgcmVsZXZhbnQgYE1ha2VmaWxlYHMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWcgb3B0aW9uIHRyYW5zbGF0ZXMgaW50byBidWlsZCBmbGFncyBhbmQgdWx0aW1hdGVseSwgaG93IGl0IGFmZmVjdHMgdGhlIGdlbmVyYXRlZCBrZXJuZWwgY29kZS4gSWRlYWxseSwgSSdsbCBmaW5kIGEgY29uY2lzZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBvcHRpb24gYWN0dWFsbHkgKmRvZXMqIGFsb25nIHRoZSB3YXkuIFRoYXQncyB0aGUgcHJpb3JpdHkgcmlnaHQgbm93LCBmaW5kaW5nIGl0cyBkZWZpbml0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTMzNCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjQxLjE5MTkyODk4OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM1Mjc4NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJQRl9TWVNDQUxMXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9LY29uZmlnPTI5PW1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxua2VybmVsL2JwZi9LY29uZmlnLTMwLVxcbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcXG5rZXJuZWwvYnBmL0tjb25maWctMzItXFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0MS4yNjU0NjAzNDdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY5ODg3NzAyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgREVCVUdfSU5GT19CVEYgRGVwZW5kZW5jeSBmb3IgQlRGIEtmdW5jcyoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gdGFraW5nIGEgbG9vayBhdCBob3cgYERFQlVHX0lORk9fQlRGYCB0aWVzIGludG8gQlRGIGtmdW5jcy4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzOiAqaXMqIGl0IGEgaGFyZCBkZXBlbmRlbmN5PyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiBgREVCVUdfSU5GT19CVEZgIGlzIHN0cmljdGx5ICpyZXF1aXJlZCogZm9yIHRoZSBwcm9wZXIgZnVuY3Rpb25hbGl0eSBhbmQgZ2VuZXJhdGlvbiBvZiBCVEYgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBrZnVuY3MsIG9yIGlmIHRoZXJlJ3Mgc29tZSBsZXZlbCBvZiBmbGV4aWJpbGl0eSBoZXJlLiBUaGlzIGhhcyBpbXBsaWNhdGlvbnMgZm9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb25zIGFuZCBob3cgd2UgY2FuIGFwcHJvYWNoIHRvb2xpbmcuIEkndmUgZ290IGEgbWVudGFsIGNoZWNrbGlzdCBhbHJlYWR5OiBJcyBpdCBuZWNlc3NhcnkgZm9yIHRoZSAqY3JlYXRpb24qIG9mIGtmdW5jIEJURiwgb3IganVzdCBmb3IgbW9yZSBkZXRhaWxlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24/IERvZXMgaXQgaW1wYWN0IHJ1bnRpbWUgcGVyZm9ybWFuY2Ugb3Igb25seSBjb21waWxhdGlvbiB0aW1lPyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIHJlbGV2YW50IGNvZGUgcGF0aHMgYW5kIGJ1aWxkIHByb2Nlc3Nlcy4gR290dGEgc3RhcnQgd2l0aCB0aGUgQlRGIGdlbmVyYXRpb24gYW5kIHN5bWJvbCB0YWJsZSBhbmFseXNpcyBhbmQgc2VlIHdoZXJlIHRoYXQgYml0IG9mIGluZm9ybWF0aW9uIHBsdWdzIGluLiBFc3NlbnRpYWxseSwgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHByZWNpc2Ugc2NvcGUgb2YgdGhpcyBkZXBlbmRlbmN5LiBJdCdzIHRpbWUgdG8gZmlyZSB1cCB0aGUgdG9vbHMgYW5kIHRyYWNlIHRoZSBmbG93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTc4MywiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjQzLjk2NDMzOTM3MloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI2MzM1MDU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9idGYuaD01ODg9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXFxuaW5jbHVkZS9saW51eC9idGYuaC01ODktXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nKTtcXG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjU5MDppbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxcbmluY2x1ZGUvbGludXgvYnRmLmgtNTkxLVxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvYnRmLmg9NjQ4PXN0YXRpYyBpbmxpbmUgdTMyICpidGZfa2Z1bmNfaWRfc2V0X2NvbnRhaW5zKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4tLVxcbmluY2x1ZGUvbGludXgvYnRmLmgtNjU0LX1cXG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjY1NTpzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXFxuaW5jbHVkZS9saW51eC9idGYuaC02NTYtXFx0XFx0XFx0XFx0XFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0NC4wOTA2NzkzMloiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzM4NzgwNjIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipOYXZpZ2F0aW5nIHRoZSBCVEYgTWF6ZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gc29tZXRoaW5nIHJlbGF0ZWQgdG8gQlRGIChCZXJrZWxleSBlQlBGIFR5cGUgRm9ybWF0KSBhbmQgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgYSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBwYXRoLiBNeSBpbnR1aXRpb24gaXMgdGVsbGluZyBtZSB0aGF0IHRoZSByZWxldmFudCBjb2RlIG1pZ2h0IGhpbmdlIG9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX0RFQlVHX0lORk9fQlRGYCBiZWluZyBkZWZpbmVkLiBTbywgSSBuZWVkIHRvIHZlcmlmeSB0aGF0IGFuZCBzZWUgaG93IHRoZXkgaW50ZXJhY3QuIE15IG1lbnRhbCBtYXAgcG9pbnRzIG1lIHRvd2FyZHMgYGluY2x1ZGUvbGludXgvYnRmLmhgIGFzIHRoZSBsaWtlbHkgbG9jYXRpb24sIGFuZCBzaW5jZSB0aGVzZSBzb3J0cyBvZiBjb25kaXRpb25hbHMgb2Z0ZW4gY2x1c3RlciB0b2dldGhlciwgSSdtIGdvaW5nIHRvIHF1aWNrbHkgc2NhbiBsaW5lcyByb3VnaGx5IGJldHdlZW4gNTgwIGFuZCA2NjAuIEhvcGVmdWxseSwgaXQncyBsYWlkIG91dCBpbiBhIHdheSB0aGF0J3MgZWFzeSB0byByZWFkIGFuZCBJIGNhbiBxdWlja2x5IGFzY2VydGFpbiB3aGV0aGVyIG15IGh1bmNoIGlzIHJpZ2h0IGFuZCB3aGF0IHRoZSBsb2dpYyBmbG93IGlzLiBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgZWl0aGVyIGFuIGAjaWZgIGJsb2NrIG9yIHNvbWV0aGluZyBzaW1pbGFyIHRoYXQgYWRkcmVzc2VzIHRob3NlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLiBUaGlzIHNob3VsZCBiZSBhIHF1aWNrIGNoZWNrLCBob3BlZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMzYxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NDYuNDI5NDYzMDExWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzNTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvYnRmLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNTgwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTgwOlxcdFxcbiA1ODE6XFx0Y29uc3QgY2hhciAqYnRmX25hbWVfYnlfb2Zmc2V0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIG9mZnNldCk7XFxuIDU4MjpcXHRjb25zdCBjaGFyICpidGZfc3RyX2J5X29mZnNldChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBvZmZzZXQpO1xcbiA1ODM6XFx0c3RydWN0IGJ0ZiAqYnRmX3BhcnNlX3ZtbGludXgodm9pZCk7XFxuIDU4NDpcXHRzdHJ1Y3QgYnRmICpicGZfcHJvZ19nZXRfdGFyZ2V0X2J0Zihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpO1xcbiA1ODU6XFx0dTMyICpidGZfa2Z1bmNfZmxhZ3MoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIga2Z1bmNfYnRmX2lkLCBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpO1xcbiA1ODY6XFx0aW50IGJ0Zl9rZnVuY19jaGVja19mbGFnKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCwgdTMyIGZsYWcpO1xcbiA1ODc6XFx0Ym9vbCBidGZfa2Z1bmNfaXNfYWxsb3dlZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XFxuIDU4ODpcXHR1MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcXG4gNTg5OlxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XFxuIDU5MDpcXHRpbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxcbiA1OTE6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKnMpO1xcbiA1OTI6XFx0aW50IHJlZ2lzdGVyX2J0Zl9mbW9kcmV0X2lkX3NldChjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldCk7XFxuIDU5MzpcXHRzMzIgYnRmX2ZpbmRfZHRvcl9rZnVuYyhzdHJ1Y3QgYnRmICpidGYsIHUzMiBidGZfaWQpO1xcbiA1OTQ6XFx0aW50IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhjb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgKmR0b3JzLCB1MzIgYWRkX2NudCxcXG4gNTk1OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBtb2R1bGUgKm93bmVyKTtcXG4gNTk2OlxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKmJ0Zl9maW5kX3N0cnVjdF9tZXRhKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZCk7XFxuIDU5NzpcXHRib29sIGJ0Zl9pc19wcm9qZWN0aW9uX29mKGNvbnN0IGNoYXIgKnBuYW1lLCBjb25zdCBjaGFyICp0bmFtZSk7XFxuIDU5ODpcXHRib29sIGJ0Zl9pc19wcm9nX2N0eF90eXBlKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gNTk5OlxcdFxcdFxcdFxcdCAgIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCwgZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcXG4gNjAwOlxcdFxcdFxcdFxcdCAgIGludCBhcmcpO1xcbiA2MDE6XFx0aW50IGdldF9rZXJuX2N0eF9idGZfaWQoc3RydWN0IGJwZl92ZXJpZmllcl9sb2cgKmxvZywgZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSk7XFxuIDYwMjpcXHRib29sIGJ0Zl90eXBlc19hcmVfc2FtZShjb25zdCBzdHJ1Y3QgYnRmICpidGYxLCB1MzIgaWQxLFxcbiA2MDM6XFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IGJ0ZiAqYnRmMiwgdTMyIGlkMik7XFxuIDYwNDpcXHRpbnQgYnRmX2NoZWNrX2l0ZXJfYXJnKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICpmdW5jLCBpbnQgYXJnX2lkeCk7XFxuIDYwNTpcXHRcXG4gNjA2OlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBidGZfdHlwZV9pc19zdHJ1Y3RfcHRyKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0KVxcbiA2MDc6XFx0e1xcbiA2MDg6XFx0XFx0aWYgKCFidGZfdHlwZV9pc19wdHIodCkpXFxuIDYwOTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDYxMDpcXHRcXG4gNjExOlxcdFxcdHQgPSBidGZfdHlwZV9za2lwX21vZGlmaWVycyhidGYsIHQtXFx1MDAzZXR5cGUsIE5VTEwpO1xcbiA2MTI6XFx0XFxuIDYxMzpcXHRcXHRyZXR1cm4gYnRmX3R5cGVfaXNfc3RydWN0KHQpO1xcbiA2MTQ6XFx0fVxcbiA2MTU6XFx0I2Vsc2VcXG4gNjE2OlxcdHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICpidGZfdHlwZV9ieV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuIDYxNzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgdTMyIHR5cGVfaWQpXFxuIDYxODpcXHR7XFxuIDYxOTpcXHRcXHRyZXR1cm4gTlVMTDtcXG4gNjIwOlxcdH1cXG4gNjIxOlxcdFxcbiA2MjI6XFx0c3RhdGljIGlubGluZSB2b2lkIGJ0Zl9zZXRfYmFzZV9idGYoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0ZilcXG4gNjIzOlxcdHtcXG4gNjI0OlxcdH1cXG4gNjI1OlxcdFxcbiA2MjY6XFx0c3RhdGljIGlubGluZSBpbnQgYnRmX3JlbG9jYXRlKHZvaWQgKmxvZywgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0ZixcXG4gNjI3OlxcdFxcdFxcdFxcdCAgICAgICBfX3UzMiAqKm1hcF9pZHMpXFxuIDYyODpcXHR7XFxuIDYyOTpcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuIDYzMDpcXHR9XFxuIDYzMTpcXHRcXG4gNjMyOlxcdHN0YXRpYyBpbmxpbmUgaW50IGJ0Zl9maWVsZF9pdGVyX2luaXQoc3RydWN0IGJ0Zl9maWVsZF9pdGVyICppdCwgc3RydWN0IGJ0Zl90eXBlICp0LFxcbiA2MzM6XFx0XFx0XFx0XFx0XFx0ICAgICAgZW51bSBidGZfZmllbGRfaXRlcl9raW5kIGl0ZXJfa2luZClcXG4gNjM0OlxcdHtcXG4gNjM1OlxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gNjM2OlxcdH1cXG4gNjM3OlxcdFxcbiA2Mzg6XFx0c3RhdGljIGlubGluZSBfX3UzMiAqYnRmX2ZpZWxkX2l0ZXJfbmV4dChzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIgKml0KVxcbiA2Mzk6XFx0e1xcbiA2NDA6XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDY0MTpcXHR9XFxuIDY0MjpcXHRcXG4gNjQzOlxcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYnRmX25hbWVfYnlfb2Zmc2V0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gNjQ0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgdTMyIG9mZnNldClcXG4gNjQ1OlxcdHtcXG4gNjQ2OlxcdFxcdHJldHVybiBOVUxMO1xcbiA2NDc6XFx0fVxcbiA2NDg6XFx0c3RhdGljIGlubGluZSB1MzIgKmJ0Zl9rZnVuY19pZF9zZXRfY29udGFpbnMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbiA2NDk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICB1MzIga2Z1bmNfYnRmX2lkLFxcbiA2NTA6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXFxuIDY1MTpcXHRcXG4gNjUyOlxcdHtcXG4gNjUzOlxcdFxcdHJldHVybiBOVUxMO1xcbiA2NTQ6XFx0fVxcbiA2NTU6XFx0c3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxcbiA2NTY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxcbiA2NTc6XFx0e1xcbiA2NTg6XFx0XFx0cmV0dXJuIDA7XFxuIDY1OTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjQ2LjQyOTU1ODUxMVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTc4MjUxNTgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGF0IGNvZGUgc25pcHBldDpcblxuKipEaXZpbmcgaW50byBgYnRmLmhgJ3MgQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gZ2V0dGluZyByZWFkeSB0byBwb2tlIGFyb3VuZCBpbiB0aGUgYGluY2x1ZGUvbGludXgvYnRmLmhgIGZpbGUsIHNwZWNpZmljYWxseSB0aGUgYCNpZmRlZmAgYmxvY2tzLiBJIHdhbnQgdG8gc2VlIHdoYXQncyBiZWluZyBjb25kaXRpb25hbGx5IGNvbXBpbGVkIGFuZCB3aHkuIFRoaXMgaXMgbGlrZWx5IHdoZXJlIHRoZSBjb3JlIG9mIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgZGVmaW5pdGlvbnMgYW5kIHJlbGF0ZWQgc3RydWN0dXJlcyBhcmUgZGVjbGFyZWQsIG9yIG1heWJlIGl0IHNldHMgdXAgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIGtlcm5lbCBmZWF0dXJlcyBvciBjb21waWxlLXRpbWUgb3B0aW9ucy4gSSdtIGV4cGVjdGluZyB0byBmaW5kIGEgbG90IG9mIGVzc2VudGlhbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHBvc3NpYmx5IHNvbWUgbWFjcm8gZGVmaW5pdGlvbnMgdGhhdCByZWFsbHkgZHJpdmUgdGhlIEJURiBoYW5kbGluZyBhdCB0aGUgbG93ZXN0IGxldmVscy4gSSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbmRpdGlvbnMgdGhhdCB0cmlnZ2VyIHRoZXNlIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhbmQgaG93IHRoZXkgaW1wYWN0IHRoZSBvdmVyYWxsIEJURiBpbXBsZW1lbnRhdGlvbi4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0Mjc0LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0OC42MDc4MTIzMjRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM2NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9saW51eC9idGYuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA1NDAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1NDA6XFx0c3RydWN0IGJwZl9zdHJ1Y3Rfb3BzO1xcbiA1NDE6XFx0aW50IF9fcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzICpzdF9vcHMpO1xcbiA1NDI6XFx0Y29uc3Qgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzX2Rlc2MgKmJwZl9zdHJ1Y3Rfb3BzX2ZpbmRfdmFsdWUoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdmFsdWVfaWQpO1xcbiA1NDM6XFx0Y29uc3Qgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzX2Rlc2MgKmJwZl9zdHJ1Y3Rfb3BzX2ZpbmQoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdHlwZV9pZCk7XFxuIDU0NDpcXHQjZWxzZVxcbiA1NDU6XFx0c3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHNfZGVzYyAqYnBmX3N0cnVjdF9vcHNfZmluZChzdHJ1Y3QgYnRmICpidGYsIHUzMiB0eXBlX2lkKVxcbiA1NDY6XFx0e1xcbiA1NDc6XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDU0ODpcXHR9XFxuIDU0OTpcXHQjZW5kaWZcXG4gNTUwOlxcdFxcbiA1NTE6XFx0ZW51bSBidGZfZmllbGRfaXRlcl9raW5kIHtcXG4gNTUyOlxcdFxcdEJURl9GSUVMRF9JVEVSX0lEUyxcXG4gNTUzOlxcdFxcdEJURl9GSUVMRF9JVEVSX1NUUlMsXFxuIDU1NDpcXHR9O1xcbiA1NTU6XFx0XFxuIDU1NjpcXHRzdHJ1Y3QgYnRmX2ZpZWxkX2Rlc2Mge1xcbiA1NTc6XFx0XFx0Lyogb25jZS1wZXItdHlwZSBvZmZzZXRzICovXFxuIDU1ODpcXHRcXHRpbnQgdF9vZmZfY250LCB0X29mZnNbMl07XFxuIDU1OTpcXHRcXHQvKiBtZW1iZXIgc3RydWN0IHNpemUsIG9yIHplcm8sIGlmIG5vIG1lbWJlcnMgKi9cXG4gNTYwOlxcdFxcdGludCBtX3N6O1xcbiA1NjE6XFx0XFx0LyogcmVwZWF0ZWQgcGVyLW1lbWJlciBvZmZzZXRzICovXFxuIDU2MjpcXHRcXHRpbnQgbV9vZmZfY250LCBtX29mZnNbMV07XFxuIDU2MzpcXHR9O1xcbiA1NjQ6XFx0XFxuIDU2NTpcXHRzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIge1xcbiA1NjY6XFx0XFx0c3RydWN0IGJ0Zl9maWVsZF9kZXNjIGRlc2M7XFxuIDU2NzpcXHRcXHR2b2lkICpwO1xcbiA1Njg6XFx0XFx0aW50IG1faWR4O1xcbiA1Njk6XFx0XFx0aW50IG9mZl9pZHg7XFxuIDU3MDpcXHRcXHRpbnQgdmxlbjtcXG4gNTcxOlxcdH07XFxuIDU3MjpcXHRcXG4gNTczOlxcdCNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG4gNTc0OlxcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqYnRmX3R5cGVfYnlfaWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdHlwZV9pZCk7XFxuIDU3NTpcXHR2b2lkIGJ0Zl9zZXRfYmFzZV9idGYoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0Zik7XFxuIDU3NjpcXHRpbnQgYnRmX3JlbG9jYXRlKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0ZiAqYmFzZV9idGYsIF9fdTMyICoqbWFwX2lkcyk7XFxuIDU3NzpcXHRpbnQgYnRmX2ZpZWxkX2l0ZXJfaW5pdChzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIgKml0LCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxuIDU3ODpcXHRcXHRcXHRcXHRlbnVtIGJ0Zl9maWVsZF9pdGVyX2tpbmQgaXRlcl9raW5kKTtcXG4gNTc5OlxcdF9fdTMyICpidGZfZmllbGRfaXRlcl9uZXh0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0OC42MDc4OTcxNjRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjczNDg5MDYyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBCVEYgYW5kIERlYnVnIEluZm9ybWF0aW9uIFJlcXVpcmVtZW50cyoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gY2xhcmlmeSBzb21ldGhpbmcgYWJvdXQgdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBhbmQga2Z1bmNzIChrZXJuZWwgZnVuY3Rpb25zKS4gSSdtIHByZXR0eSBzdXJlIEkgaGF2ZSBhIGhhbmRsZSBvbiB0aGlzLCBidXQgbGV0J3MganVzdCBtYWtlIGFic29sdXRlbHkgc3VyZSwgYW5kIGRvdWJsZSBjaGVjayBteSBhc3N1bXB0aW9uIHJlZ2FyZGluZyB0aGUgYERFQlVHX0lORk9fQlRGYCBjb25maWd1cmF0aW9uIG9wdGlvbi4gSSBuZWVkIHRvIGtub3cgaWYgaXQncyBzdHJpY3RseSAqcmVxdWlyZWQqIGZvciBCVEYga2Z1bmMgZnVuY3Rpb25hbGl0eSB3aXRoaW4gdGhlIGtlcm5lbCBpdHNlbGYuXG5cbk15IGd1dCBmZWVsaW5nIGlzIHRoYXQgaXQgaXNuJ3QuIEJURiBzdXBwb3J0IGhhcyBiZWVuIGV2b2x2aW5nLCBhbmQgSSBoYXZlIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBtaWdodCBoYXZlIGRlY291cGxlZCBmcm9tIHJlcXVpcmluZyB0aGlzIHBhcnRpY3VsYXIgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBlc3BlY2lhbGx5IGdpdmVuIHJlY2VudCBvcHRpbWl6YXRpb24gZWZmb3J0cy4gSG93ZXZlciwgbGV0J3Mgbm90IHJlbHkgb24gaW50dWl0aW9uIGFsb25lLiBUaGUgZGVmaW5pdGl2ZSBhbnN3ZXIgaXMgYWx3YXlzIHdpdGhpbiB0aGUgY29kZS4gVGltZSB0byBkaWcgaW50byB0aGUga2VybmVsIHNvdXJjZSwgc3BlY2lmaWNhbGx5IGBrZXJuZWwvYnBmL2J0Zi5jYC4gVGhhdCdzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IOKAkyBpdCdzIHRoZSBoZWFydCBvZiB0aGUgQlRGIGltcGxlbWVudGF0aW9uLiBJJ2xsIG5lZWQgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgdGhlIGNvZGUgaW4gYGJ0Zi5jYCwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgcmVsZXZhbnQgY29tcGlsYXRpb24gZmxhZ3MgYW5kIGNvbmRpdGlvbmFsIHN0YXRlbWVudHMsIGFuZCBwaW5wb2ludCBhbnkgZGVwZW5kZW5jaWVzIG9yIGVycm9yIGhhbmRsaW5nIHJlbGF0ZWQgdG8gYERFQlVHX0lORk9fQlRGYC4gT25seSB0aGVuIGNhbiBJIGJlIGNlcnRhaW4gd2hldGhlciB0aGUgb3B0aW9uIGlzIHN0cmljdGx5IGEgcmVxdWlyZW1lbnQgb3IgbW9yZSBvZiBhbiBvcHRpb25hbCBlbmhhbmNlbWVudCBmb3IgdGhlIEJURiBrZnVuYyBjYXBhYmlsaXRpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1MjQ1LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo1MS4zNDI3ODk4MzlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU5MDE0ODg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19ERUJVR19JTkZPX0JURlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTQzPWlmZXEgKCQoQ09ORklHX1NZU0ZTKSx5KVxcbmtlcm5lbC9icGYvTWFrZWZpbGU6NDQ6b2JqLSQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSArPSBzeXNmc19idGYub1xcbmtlcm5lbC9icGYvTWFrZWZpbGUtNDUtZW5kaWZcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjQwMT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjQwNi1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY0MDc6XFx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpXFxua2VybmVsL2JwZi9idGYuYy02NDA4LVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz02NDg3PV9fdTMyIGJ0Zl9yZWxvY2F0ZV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIF9fdTMyIGlkKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NDkzLVxcbmtlcm5lbC9icGYvYnRmLmM6NjQ5NDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTY0OTUtXFxua2VybmVsL2JwZi9idGYuYz02NDk2PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBjb25zdCB2b2lkICpkYXRhLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NTkxLVxcbmtlcm5lbC9icGYvYnRmLmM6NjU5MjojZW5kaWYgLyogQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVMgKi9cXG5rZXJuZWwvYnBmL2J0Zi5jLTY1OTMtXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg1MDI9ZW51bSB7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg1MDUtXFxua2VybmVsL2JwZi9idGYuYzo4NTA2OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODUwNy1zdHJ1Y3QgYnRmX21vZHVsZSB7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg2NDQ9ZnNfaW5pdGNhbGwoYnRmX21vZHVsZV9pbml0KTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjg2NDU6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXFxua2VybmVsL2JwZi9idGYuYy04NjQ2LVxcbmtlcm5lbC9icGYvYnRmLmM9ODY0Nz1zdHJ1Y3QgbW9kdWxlICpidGZfdHJ5X2dldF9tb2R1bGUoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NjQ5LVxcdHN0cnVjdCBtb2R1bGUgKnJlcyA9IE5VTEw7XFxua2VybmVsL2JwZi9idGYuYzo4NjUwOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODY1MS1cXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODY3Nz1zdHJ1Y3QgYnRmICpidGZfZ2V0X21vZHVsZV9idGYoY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kdWxlKVxcbmtlcm5lbC9icGYvYnRmLmMtODY3OC17XFxua2VybmVsL2JwZi9idGYuYzo4Njc5OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODY4MC1cXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODY5MC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg2OTE6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy04NjkyLVxcdG11dGV4X2xvY2soXFx1MDAyNmJ0Zl9tb2R1bGVfbXV0ZXgpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NzA3PXN0YXRpYyBpbnQgY2hlY2tfYnRmX2tjb25maWdzKGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgY29uc3QgY2hhciAqZmVhdHVyZSlcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MDgte1xcbmtlcm5lbC9icGYvYnRmLmM6ODcwOTpcXHRpZiAoIW1vZHVsZSBcXHUwMDI2XFx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpIHtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MTAtXFx0XFx0cHJfZXJyKFxcXCJtaXNzaW5nIHZtbGludXggQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXFxcblxcXCIsIGZlYXR1cmUpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NzEyLVxcdH1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg3MTM6XFx0aWYgKG1vZHVsZSBcXHUwMDI2XFx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTKSlcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MTQtXFx0XFx0cHJfd2FybihcXFwibWlzc2luZyBtb2R1bGUgQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXFxcblxcXCIsIGZlYXR1cmUpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz04ODU0PXN0YXRpYyBpbnQgYnRmX2NoZWNrX2tmdW5jX25hbWUoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBjaGFyICpmdW5jX25hbWUsIHUzMiBraW5kKVxcbmtlcm5lbC9icGYvYnRmLmMtODg1NS17XFxua2VybmVsL2JwZi9idGYuYzo4ODU2OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODg1Ny1cXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODg3MC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg4NzE6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy04ODcyLVxcdGd1YXJkKG11dGV4KShcXHUwMDI2YnRmX21vZHVsZV9tdXRleCk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTk1MTk9c3RhdGljIHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqcG9wdWxhdGVfY2FuZF9jYWNoZShzdHJ1Y3QgYnBmX2NhbmRfY2FjaGUgKmNhbmRzLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy05NTQ2LVxcbmtlcm5lbC9icGYvYnRmLmM6OTU0NzojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTk1NDgtc3RhdGljIHZvaWQgX19wdXJnZV9jYW5kX2NhY2hlKHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJwZl9jYW5kX2NhY2hlICoqY2FjaGUsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjgzNj1pbnQgYnBmX2FkZF9rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBmdW5jX2lkLCB1MTYgb2Zmc2V0KVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NTItXFx0XFx0aWYgKCFidGZfdm1saW51eCkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyODUzOlxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiY2FsbGluZyBrZXJuZWwgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRob3V0IENPTkZJR19ERUJVR19JTkZPX0JURlxcXFxuXFxcIik7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NTQtXFx0XFx0XFx0cmV0dXJuIC1FTk9UU1VQUDtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz02MTkwPXN0YXRpYyBpbnQgY2hlY2tfcHRyX3RvX21hcF9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjA0LVxcdGlmICghYnRmX3ZtbGludXgpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6NjIwNTpcXHRcXHR2ZXJib3NlKGVudiwgXFxcIm1hcF9wdHIgYWNjZXNzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXFxcblxcXCIpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjA2LVxcdFxcdHJldHVybiAtRU5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTg4NDg9c3RhdGljIGludCBjaGVja19wc2V1ZG9fYnRmX2lkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTg4NjQtXFx0XFx0aWYgKCFidGZfdm1saW51eCkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODg2NTpcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImtlcm5lbCBpcyBtaXNzaW5nIEJURiwgbWFrZSBzdXJlIENPTkZJR19ERUJVR19JTkZPX0JURj15IGlzIHNwZWNpZmllZCBpbiBLY29uZmlnLlxcXFxuXFxcIik7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4ODY2LVxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTIwNzU2PXN0cnVjdCBidGYgKmJwZl9nZXRfYnRmX3ZtbGludXgodm9pZClcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDc2MC1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjA3NjE6XFx0aWYgKCFidGYgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKSB7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwNzYyLVxcdFxcdG11dGV4X2xvY2soXFx1MDAyNmJ0Zl92bWxpbnV4X2xvY2spO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo1MS40MDE4MDY5MjhaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTY2ODQ1MTcwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKk15IEluaXRpYWwgQXNzZXNzbWVudCoqXG5cbkFscmlnaHQsIEknbSBsb29raW5nIGF0IGEgZmV3IGtlcm5lbCBjb25maWd1cmF0aW9ucyDigJMgYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfTUVNQ0dgLCBhbmQgYENPTkZJR19ERUJVR19JTkZPX0JURmAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIldoYXQncyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2U/XCIgSXQgbG9va3MgbGlrZSBJIG1pZ2h0IGJlIHRyeWluZyB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmZWF0dXJlIGZsYWdzIGludGVyYWN0LiBNeSBpbnR1aXRpb24gdGVsbHMgbWUgdGhhdCBgQ09ORklHX0RFQlVHX0lORk9fQlRGYCBpcyB0aGUgbW9zdCBjb21wbGV4IG9uZSBhbmQgcG9zc2libHkgaGFzIGRlcGVuZGVuY2llcywgbGV0IG1lIGNoZWNrIHRoZSBgbGliL0tjb25maWcuZGVidWdgIGZpbGUgdG8gc2VlIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3NTY4LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NTMuMDcwMjYwNzkxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjY2OTQwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgREVCVUdfSU5GT19CVEZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibGliL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Zz0zNzg9Y29uZmlnIERFQlVHX0lORk9fU1BMSVRcXG4tLVxcbmxpYi9LY29uZmlnLmRlYnVnLTM5Ny1cXG5saWIvS2NvbmZpZy5kZWJ1ZzozOTg6Y29uZmlnIERFQlVHX0lORk9fQlRGXFxubGliL0tjb25maWcuZGVidWctMzk5LVxcdGJvb2wgXFxcIkdlbmVyYXRlIEJURiB0eXBlIGluZm9ybWF0aW9uXFxcIlxcbi0tXFxubGliL0tjb25maWcuZGVidWc9NDE5PWNvbmZpZyBQQUhPTEVfSEFTX0xBTkdfRVhDTFVERVxcbi0tXFxubGliL0tjb25maWcuZGVidWctNDI3LVxcbmxpYi9LY29uZmlnLmRlYnVnOjQyODpjb25maWcgREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmxpYi9LY29uZmlnLmRlYnVnLTQyOS1cXHRib29sIFxcXCJHZW5lcmF0ZSBCVEYgdHlwZSBpbmZvcm1hdGlvbiBmb3Iga2VybmVsIG1vZHVsZXNcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjUzLjEyNjkzNDYzWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNjY4Mzk0NzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIEtjb25maWcuZGVidWcgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBmb3Igc29tZXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGRlYnVnIGNvbmZpZ3VyYXRpb24uIFRpbWUgdG8gaGVhZCBvdmVyIHRvIGBsaWIvS2NvbmZpZy5kZWJ1Z2AuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIHplcm8gaW4gb24gbGluZXMgMzkwIHRvIDQxMC4gVGhhdCdzIHVzdWFsbHkgYSBnb29kIHJhbmdlIHRvIHN0YXJ0IHdpdGggd2hlbiBJJ20gY2hhc2luZyBkb3duIGRlcGVuZGVuY2llcyBpbiBhIEtjb25maWcgZmlsZS4gTGV0J3Mgc2VlIHdoYXQgdGhlIGBkZXBlbmRzIG9uYCBjbGF1c2VzIHJldmVhbCB0aGVyZS4gSG9wZWZ1bGx5LCBpdCdzIHN0cmFpZ2h0Zm9yd2FyZCwgYW5kIEkgY2FuIHF1aWNrbHkgdHJhY2Ugd2hhdCBjb25kaXRpb25zIG5lZWQgdG8gYmUgbWV0IGZvciB0aGlzIGRlYnVnIG9wdGlvbiB0byBiZSBlbmFibGVkLiBUaGlzIGlzIHdoZXJlIHRoZSByZWFsIHdvcmsgYmVnaW5zLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIG9wdGlvbnMgYXJlIGltcGFjdGVkIGFuZCBpZiB0aGV5IGFyZSByZWxldmFudCB0byB0aGlzIGN1cnJlbnQgZm9jdXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3OTUzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NTUuMjkzNzc3NjY1WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMzI5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Z1wiLFxuICBcIkZpcnN0TGluZVwiOiAzOTUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzOTU6XFx0XFx0ICB0byBrbm93IGFib3V0IHRoZSAuZHdvIGZpbGVzIGFuZCBpbmNsdWRlIHRoZW0uXFxuIDM5NjpcXHRcXHQgIEluY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGNjYWNoZS5cXG4gMzk3OlxcdFxcbiAzOTg6XFx0Y29uZmlnIERFQlVHX0lORk9fQlRGXFxuIDM5OTpcXHRcXHRib29sIFxcXCJHZW5lcmF0ZSBCVEYgdHlwZSBpbmZvcm1hdGlvblxcXCJcXG4gNDAwOlxcdFxcdGRlcGVuZHMgb24gIURFQlVHX0lORk9fU1BMSVQgXFx1MDAyNlxcdTAwMjYgIURFQlVHX0lORk9fUkVEVUNFRFxcbiA0MDE6XFx0XFx0ZGVwZW5kcyBvbiAhR0NDX1BMVUdJTl9SQU5EU1RSVUNUIHx8IENPTVBJTEVfVEVTVFxcbiA0MDI6XFx0XFx0ZGVwZW5kcyBvbiBCUEZfU1lTQ0FMTFxcbiA0MDM6XFx0XFx0ZGVwZW5kcyBvbiBQQUhPTEVfVkVSU0lPTiBcXHUwMDNlPSAxMjJcXG4gNDA0OlxcdFxcdCMgcGFob2xlIHVzZXMgZWxmdXRpbHMsIHdoaWNoIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3IgSGV4YWdvbiByZWxvY2F0aW9uc1xcbiA0MDU6XFx0XFx0ZGVwZW5kcyBvbiAhSEVYQUdPTlxcbiA0MDY6XFx0XFx0aGVscFxcbiA0MDc6XFx0XFx0ICBHZW5lcmF0ZSBkZWR1cGxpY2F0ZWQgQlRGIHR5cGUgaW5mb3JtYXRpb24gZnJvbSBEV0FSRiBkZWJ1ZyBpbmZvLlxcbiA0MDg6XFx0XFx0ICBUdXJuaW5nIHRoaXMgb24gcmVxdWlyZXMgcGFob2xlIHYxLjIyIG9yIGxhdGVyLCB3aGljaCB3aWxsIGNvbnZlcnRcXG4gNDA5OlxcdFxcdCAgRFdBUkYgdHlwZSBpbmZvIGludG8gZXF1aXZhbGVudCBkZWR1cGxpY2F0ZWQgQlRGIHR5cGUgaW5mby5cXG4gNDEwOlxcdFxcbiA0MTE6XFx0Y29uZmlnIFBBSE9MRV9IQVNfQlRGX1RBR1xcbiA0MTI6XFx0XFx0ZGVmX2Jvb2wgUEFIT0xFX1ZFUlNJT04gXFx1MDAzZT0gMTIzXFxuIDQxMzpcXHRcXHRkZXBlbmRzIG9uIENDX0lTX0NMQU5HXFxuIDQxNDpcXHRcXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjU1LjI5NDAwMjI4NVoiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxOTY0ODAyMTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBhIGZpcnN0LXBlcnNvbiBleHBlcnQgcGVyc3BlY3RpdmU6XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzOiBCUEYgYW5kIEJleW9uZCoqXG5cbkFscmlnaHQsIHNvIEknbSB0aGlua2luZyBhYm91dCB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgc3BlY2lmaWNhbGx5IGBDT05GSUdfQlBGYC4gVGhpcyBrZWVwcyBwb3BwaW5nIHVwLCBhbmQgaXQncyBhIGNyaXRpY2FsIGZvdW5kYXRpb25hbCBlbGVtZW50LiBJIGtub3cgYEJQRl9TWVNDQUxMYCByZWxpZXMgb24gYEJQRmAsIHdoaWNoIGltbWVkaWF0ZWx5IHN1Z2dlc3RzIGEgZGVwZW5kZW5jeS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IHRoZXNlIG9wdGlvbnMgaW50ZXJhY3QgYW5kIHdoYXQgb3RoZXIgcmVsYXRlZCBvcHRpb25zIGV4aXN0LiBCZXN0IHRvIGRpdmUgaW50byB0aGUgY29yZSBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBMZXQgbWUgY2hlY2sgdGhlIGBrZXJuZWwvYnBmL0tjb25maWdgIGZpbGUuIFRoYXQncyB3aGVyZSBhbGwgdGhlIGRldGFpbHMgYWJvdXQgQlBGIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGxhaWQgb3V0LiBVbmRlcnN0YW5kaW5nIHRoZSBkZXBlbmRlbmN5IGNoYWluIGhlcmUgaXMga2V5IHRvIGEgcm9idXN0IGFuZCBlZmZpY2llbnQga2VybmVsIGJ1aWxkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODUyOCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NTcuMjU4ODA3NDgyWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAyNTpcXHQjIGRlZmF1bHQgZm9yIGtlcm5lbHMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGggQlBGIEpJVCBzdXBwb3J0LlxcbiAgMjY6XFx0Y29uZmlnIEFSQ0hfV0FOVF9ERUZBVUxUX0JQRl9KSVRcXG4gIDI3OlxcdFxcdGJvb2xcXG4gIDI4OlxcdFxcbiAgMjk6XFx0bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG4gIDMwOlxcdFxcbiAgMzE6XFx0Y29uZmlnIEJQRl9TWVNDQUxMXFxuICAzMjpcXHRcXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuICAzMzpcXHRcXHRzZWxlY3QgQlBGXFxuICAzNDpcXHRcXHRzZWxlY3QgSVJRX1dPUktcXG4gIDM1OlxcdFxcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxcbiAgMzY6XFx0XFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxcbiAgMzc6XFx0XFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcXG4gIDM4OlxcdFxcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXFxuICAzOTpcXHRcXHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcXG4gIDQwOlxcdFxcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXFxuICA0MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDQyOlxcdFxcdGhlbHBcXG4gIDQzOlxcdFxcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xcbiAgNDQ6XFx0XFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0Y29uZmlnIEJQRl9KSVRcXG4gIDQ3OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXFxcIlxcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBCUEZcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjU3LjI1ODg3MDQ4MloiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MzU5MzA5NDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgQW5hbHlzaXM6IEJQRi1CYXNlZCBQcm9hY3RpdmUgTWVtb3J5IFJlY2xhaW0qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGFuYWx5c2lzIGluZGljYXRlcyBhIG5ldyBhdmVudWUgZm9yIG1lbW9yeSByZWNsYWltIHdpdGhpbiB0aGUga2VybmVsLCBsZXZlcmFnaW5nIEJQRiBjYXBhYmlsaXRpZXMuIFRoZSBrZXkgY29uZmlndXJhdGlvbnMgaW52b2x2ZWQgYXJlIGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgLiBUaGVzZSBhcmUgZXNzZW50aWFsIGZvciB0aGUgZnVuY3Rpb25hbGl0eS5cblxuVGhlIHByaW1hcnkgZm9jdXMgaXMgdW5kZW5pYWJseSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gVGhpcyBmdW5jdGlvbiwgbm93IGV4cG9zZWQgYXMgYSBCUEYga2Z1bmMsIGlzICp0aGUqIGZvY2FsIHBvaW50LiBJdCdzIHRoZSBuZXcgZW50cnkgcG9pbnQgZm9yIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFtYXRpb24gdHJpZ2dlcmVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsLCBzcGVjaWZpY2FsbHkgdXNpbmcgYSBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCBwcm9ncmFtIG9yIHBvdGVudGlhbGx5IHRocm91Z2ggd29ya3F1ZXVlIGNhbGxiYWNrcy4gVGhpcyBpcyBhIGNydWNpYWwgZGlzdGluY3Rpb24gYW5kIGEgc2lnbmlmaWNhbnQgYWRkaXRpb24uIEl0IGNhbGxzIGNvcmUgcmVjbGFpbSBsb2dpYy4gVGhlcmUncyBhbHNvIHJlY3Vyc2lvbiBwcm90ZWN0aW9uLCBgYnBmX2luX3JlY2xhaW1fY29udGV4dGAsIHRvIGtlZXAgdGhpbmdzIHN0YWJsZS5cblxuYGJwZl9tZW1jb250cm9sX2luaXRgIGlzIGFsc28gcHJlc2VudCwgYnV0IGJlY2F1c2UgaXQncyBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBpdCdzIG5vdCBhIHN1aXRhYmxlIHRhcmdldCBmb3Igc3lzY2FsbCBmdXp6aW5nLiBgYnBmX2luX3JlY2xhaW1fY29udGV4dGAgaXMgc3RhdGljIGFuZCBsaWtlbHkgaW5saW5lZCwgc28gaXQncyBub3QgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZWl0aGVyLlxuXG5Fc3NlbnRpYWxseSwgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgcHJvdmlkZXMgYSB1c2Vyc3BhY2UtaW5pdGlhdGVkIG1lY2hhbmlzbSB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSB3aXRoaW4gYSBtZW1jZywgd2hpY2ggaXMgYSBiaWcgZGVhbCBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUuIEl0J3MgYSBCUEYga2Z1bmMgY2FsbGluZyB0aGUgY29yZSByZWNsYWltIGxvZ2ljLCBzbyBpdCdzIGEgZ29vZCBwbGFjZSB0byBzdGFydCBkaWdnaW5nLlxuXG5UaGVyZWZvcmUsIGBXb3J0aEZ1enppbmdgIGlzIGRlZmluaXRlbHkgYHRydWVgIGhlcmUuIFRoZSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cyBhcmUgYEJQRl9TWVNDQUxMYCwgYE1FTUNHYCwgYW5kIGBERUJVR19JTkZPX0JURmAuIEFuZCB0aGUgcHJpbWUgYEZvY3VzU3ltYm9sYCBpcyB1bmVxdWl2b2NhbGx5IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCdzIG5vbi1zdGF0aWMsIGEga2Z1bmMsIGFuZCB0aGUgY29yZSBvZiB0aGlzIG5ldyBmdW5jdGlvbmFsaXR5LCBzbyBpdCdzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiBUaGUgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4uLmAgYXJlIGZvciB1c2Vyc3BhY2Ugd2hpY2ggYXJlIGFsc28gbm90IGEgZm9jdXMgcG9pbnQgZm9yIHRoZSBrZXJuZWwgY29kZS5cblxuSSdtIGNvbmZpZGVudCBpbiB0aGVzZSBmaW5kaW5ncy4gTGV0J3MgZ2V0IHRoZSByZXN1bHRzIHNldC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjkwOTAsIk91dHB1dFRva2VucyI6MTM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODU5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDI6MDIuNjE4MTgyNTMzWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzUxMzQ1NzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiREVCVUdfSU5GT19CVEZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGFsbG93aW5nIHNsZWVwYWJsZSBCUEZfUFJPR19UWVBFX1NZU0NBTEwgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IGNncm91cCByZWNsYWltIHZpYSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIEJQRiBzdWJzeXN0ZW0gY29kZSBhbmQgd2FycmFudHMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBhbGxvd2luZyBzbGVlcGFibGUgQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB2aWEgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGNvZGUgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQyOjAyLjY5MzMyMzc0MVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Njg2MTE5OTkyNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQyOjAyLjY5Mzc4NzYzMVoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjY4NjA3MzI1NjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTJmMzViYTY2MzA5ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuKyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcbisgKlxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cbisgKlxuKyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxuKyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cbisgKlxuKyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcbisgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlXG4rICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4rICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cbisgKlxuKyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4rICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcbisgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzXG4rICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4rICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXG4rICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdFxuKyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuKyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcbisgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpc1xuKyAqIGR5aW5nLlxuKyAqXG4rICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aFxuKyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbitcbitcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxuK1x0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rXHRcdFx0XHRcdFx0ICAgIE5VTEwpO1xuK1xuK1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzEsMjIgKzI0MCw0NCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfbWVtb3J5X2V2ZW50cylcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4tXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuKy8qXG4rICogUHJvYWN0aXZlIHJlY2xhaW0gbmVlZHMgYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQsIHNvIGl0IGlzIHJlc3RyaWN0ZWRcbisgKiB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwuIFRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3MgdGhhdCBhXG4rICogU1lTQ0FMTCBwcm9ncmFtIHNjaGVkdWxlcyBydW4gYXMgdGhlIHNhbWUgcHJvZ3JhbSB0eXBlLCBzbyB0aGV5IGNhblxuKyAqIHN0aWxsIGludm9rZSBpdDsgZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgKGUuZy4gZmVudHJ5IG9uIHJlY2xhaW1cbisgKiBwYXRocywgaW5vZGVfcm1kaXIpIGNhbm5vdC5cbisgKi9cbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjVmNTAwNjg0NDYzNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDY4NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENHX0RZSU5HX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nXCJcbisjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiBcIi90cmlnZ2VyXCJcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFwiL3RhcmdldFwiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlXG4rICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcbisgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvXG4rICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwXG4rI2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApXG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4rICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuKyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4rICovXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuK3tcbitcdHN0cnVjdCBzdGF0ZnMgc3Q7XG4rXG4rXHRpZiAoIXN0YXRmcyhcIi90bXBcIiwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbitcdFx0cmV0dXJuIFwiLlwiO1xuK1x0cmV0dXJuIFwiL3RtcFwiO1xuK31cbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4rICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cbisgKi9cbitlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4rXHRDSElMRF9FWElUX09LID0gMCxcbitcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4rXHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4rXHRDSElMRF9FWElUX1JFQURfRklMRSxcbitcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuK3tcbitcdHN3aXRjaCAoY29kZSkge1xuK1x0Y2FzZSBDSElMRF9FWElUX09LOlxuK1x0XHRyZXR1cm4gXCJzdWNjZXNzXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4rXHRcdHJldHVybiBcImpvaW4gY2dyb3VwXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuK1x0XHRyZXR1cm4gXCJyZWFkIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgdGltZSBmaWxlXCI7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LypcbitcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxuK1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbitcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4rXHQgKi9cbitcdGlmICghYWNjZXNzKFwiL3Byb2Mvc3dhcHNcIiwgRl9PSykpIHtcbitcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbisvKlxuKyAqIFRoZSBkeWluZyB0ZXN0IG5lZWRzIGFuIGVtcHR5IHJlY2xhaW0gdGFyZ2V0IHBsdXMgYSBjZ3JvdXAgdGhhdCBrZWVwc1xuKyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4rICogc3RhcnRpbmcgYW5kIHJ1biBpbnRvIHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIHR3byBoYXZlIHRvIGJlIHNlcGFyYXRlXG4rICogY2dyb3VwczogdGhlIHRhcmdldCBtdXN0IGhvbGQgbm8gcHJvY2Vzc2VzIHRvIGJlIHJlbW92ZWQsIGFuZCB2MidzXG4rICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZlxuKyAqIGFueSBwYXJlbnQgdGhhdCBoYXMgZG9tYWluIGNoaWxkcmVuLlxuKyAqL1xuK3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRFlJTkdfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RSSUdHRVJfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRyaWdnZXJfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdGFyZ2V0X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqdGFyZ2V0X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdHNpemVfdCB3cml0dGVuID0gMDtcbitcdGNoYXIgKmJ1ZmZlcjtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCJ3YlwiKTtcbitcdGlmICghZnApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbitcdGlmICghYnVmZmVyKVxuK1x0XHRnb3RvIGNsZWFudXBfZnA7XG4rXG4rXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcbitcbitcdHdoaWxlICh3cml0dGVuIFx1MDAzYyBGSUxFX1NJWkUpIHtcbitcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuK1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4rXG4rXHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0d3JpdHRlbiArPSB0b193cml0ZTtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZyZWUoYnVmZmVyKTtcbitjbGVhbnVwX2ZwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4rXHRjaGFyICptYXA7XG4rXHRzaXplX3QgaTtcbitcdGludCBmZDtcbitcdHN0cnVjdCBzdGF0IHNiO1xuK1xuK1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgPT0gLTEpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwiLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7XG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcdH1cbitcbitcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4rXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICs9IHBhZ2Vfc2l6ZSkge1xuK1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4rXHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuK1x0XHRcdCh2b2lkKXY7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfZmQ6XG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSxcbitcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4rXG4rXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbitcbitcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZlbmQpO1xuK1xuK1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbitcbitcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xuK1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuK1x0cHJpbnRmKFwiJS42ZlxcblwiLCBlbGFwc2VkKTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0aW50IGVycjtcbitcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuK1xuK1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LypcbitcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXG4rXHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbitcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cbitcdCAqL1xuK1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG4rXG4rLypcbisgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHNcbisgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGVcbisgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuKyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseVxuKyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3BcbisgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4rICovXG4rc3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKVxuK3tcbitcdHBpZF90IHBpZCA9IGZvcmsoKTtcbitcbitcdGlmIChwaWQgIT0gMClcbitcdFx0cmV0dXJuIHBpZDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuK1x0XHRfZXhpdChDSElMRF9FWElUX0pPSU5fQ0dST1VQKTtcbitcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZSkpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSlcbitcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4rXHR9XG4rfVxuK1xuKy8qXG4rICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmRcbisgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mXG4rICogcmVjbGFpbWluZyBmcm9tIGl0LlxuKyAqXG4rICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmRcbisgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxuKyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIHJlY2xhaW1fY2FsbHMgZ3Jvd2luZ1xuKyAqIHdoaWxlIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBza2lwIGNvdW50ZXJzIG11c3QgZ3JvdyB3aGlsZSByZWNsYWltX2NhbGxzXG4rICogYW5kIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRwaWRfdCByZWFkZXJfcGlkID0gLTE7XG4rXHRpbnQgZXJyLCBmZCwgaTtcbitcbitcdGVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoXHUwMDI2dHJpZ2dlcl9jZ3JvdXBfaWQsIFx1MDAyNnRhcmdldF9jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2R5aW5nX2Nncm91cHNcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHNucHJpbnRmKGRhdGFfZmlsZSwgc2l6ZW9mKGRhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XG4rXHRmZCA9IG1rc3RlbXAoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFwiZm9yayBrZWVwYWxpdmUgcmVhZGVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMgXHUwMDNlIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbitcdH1cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fdGFyZ2V0X2dvbmUgfHxcbitcdFx0ICAgIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZylcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpO1xuK1x0fVxuK1xuK1x0aWYgKCFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lbGx1LCBkeWluZz0lbGx1KVwiLFxuK1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdFx0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIGl0IGlzIGhpdCBpcyB0aW1pbmdcbitcdCAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzb1xuK1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbitcdCAqL1xuK1x0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWxsdSwgZHlpbmc9JWxsdVxcblwiLFxuK1x0ICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXG4rXHQvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqL1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCBcInJlY2xhaW1fY2FsbHNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbWVkX2J5dGVzLCBieXRlc19iZWZvcmUsXG4rXHRcdCAgICAgICBcInJlY2xhaW1lZF9ieXRlc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rb3V0OlxuK1x0aWYgKHJlYWRlcl9waWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTtcbitcdFx0KHZvaWQpd2FpdHBpZChyZWFkZXJfcGlkLCBOVUxMLCAwKTtcbitcdH1cbitcdGlmIChkYXRhX2ZpbGVbMF0pXG4rXHRcdHVubGluayhkYXRhX2ZpbGUpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjU5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuKy8qXG4rICogUmVjbGFpbSBhdHRlbXB0cyBza2lwcGVkIGJlY2F1c2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcgb3IgaGFzXG4rICogYmVlbiByZW1vdmVkLiByZWNsYWltX3NraXBwZWRfZHlpbmcgY291bnRzIGxvb2t1cHMgdGhhdCBzdGlsbCBmb3VuZFxuKyAqIHRoZSBjZ3JvdXAgd2hpbGUgaXQgaXMgYmVpbmcgdG9ybiBkb3duLCByZWNsYWltX3RhcmdldF9nb25lIGNvdW50c1xuKyAqIGxvb2t1cHMgdGhhdCBmb3VuZCBub3RoaW5nLiBUaGUgdGVzdCByZW1vdmVzIHRoZSB0YXJnZXQgY2dyb3VwIHdoaWxlXG4rICogcmVjbGFpbSBpcyBydW5uaW5nIGFuZCBjaGVja3MgdGhhdCByZWNsYWltIHN0b3BzIHZpYSB0aGVzZSBjb3VudGVycy5cbisgKi9cbit1NjQgcmVjbGFpbV9za2lwcGVkX2R5aW5nO1xuK3U2NCByZWNsYWltX3RhcmdldF9nb25lO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbisvKlxuKyAqIEEgY2dyb3VwIGlzIGR5aW5nIG9uY2UgaXQgaGFzIGJlZW4gb2ZmbGluZWQgKENTU19PTkxJTkUgY2xlYXJlZCkgb3JcbisgKiBDU1NfRFlJTkcgaGFzIGJlZW4gcmFpc2VkLCBtaXJyb3JpbmcgY2dyb3VwX2lzX2RlYWQoKS9jc3NfaXNfZHlpbmcoKVxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbisgKiBzdWNoIGEgY2dyb3VwLCBiZWNhdXNlIGl0IG9ubHkgZmFpbHMgb25jZSB0aGUgbGFzdCByZWZlcmVuY2UgaGFzIGJlZW5cbisgKiBkcm9wcGVkLCBzbyByZWNsYWltIGhhcyB0byBjaGVjayB0aGVzZSBmbGFncyBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4rICpcbisgKiBDU1NfT05MSU5FIGFuZCBDU1NfRFlJTkcgY29tZSBmcm9tIHZtbGludXguaDogdGhlIGtlcm5lbCBkZWZpbmVzIHRoZW1cbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbisgKiBiaW5kIHRvLCBhbmQgcmVkZWNsYXJpbmcgdGhlbSBsb2NhbGx5IHdvdWxkIGNsYXNoIHdpdGggdGhlIHZtbGludXguaFxuKyAqIGVudW1lcmF0b3JzLiB2bWxpbnV4LmggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsJ3MgQlRGLCBzb1xuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cbisgKi9cbitzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjZ3JwLVx1MDAzZXNlbGYuZmxhZ3M7XG4rXG4rXHRyZXR1cm4gKGZsYWdzIFx1MDAyNiBDU1NfRFlJTkcpIHx8ICEoZmxhZ3MgXHUwMDI2IENTU19PTkxJTkUpO1xuK31cbitcbisvKlxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxuKyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbisgKiByZWNsYWltZWQuXG4rICovXG4rc3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0dTY0IG5yID0gMDtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpIHtcbitcdFx0cmVjbGFpbV90YXJnZXRfZ29uZSsrO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0cmVjbGFpbV9za2lwcGVkX2R5aW5nKys7XG4rXHRcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdHJlY2xhaW1fY2FsbHMrKztcbitcdG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDI6MDIuNjkzNzg4ODgxWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY4NjA3MTE1NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQW5hbHlzaXMgb2YgQlBGIFByb2FjdGl2ZSBSZWNsYWltIEtmdW5jKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBJIHNlZSBhIG5ldyBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGFkZGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgYWxvbmcgd2l0aCBpdHMgc2VsZnRlc3RzLiBUaGUgY29yZSBvZiBpdCBpbnZvbHZlcyB0aGlzIGZ1bmN0aW9uIGNhbGxpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLlxuXG5JIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gU28sIGxldCdzIHN0ZXAgdGhyb3VnaCB0aGlzIG1ldGhvZGljYWxseS4gRmlyc3QsIHRoZXJlIGFyZW4ndCBhbnkga2VybmVsIHN0cnVjdHVyZXMgZ2V0dGluZyBzZW50IHRvIHVzZXIgc3BhY2UgZGlyZWN0bHkuIEl0IHJldHVybnMgYSBzaW1wbGUgYHVuc2lnbmVkIGxvbmdgIHNjYWxhciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMsIHdoaWNoIGlzIGdvb2QuIFNlY29uZCwgdGhlIGNvZGUgZmxvdyBpcyBzdHJhaWdodGZvcndhcmQ7IHRoZXJlJ3Mgbm8gY29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoZSBrZXkgdmFyaWFibGVzLCBgbnJfcGFnZXNgIGFuZCBgbnJfcmVjbGFpbWVkYCwgYXJlIGRpcmVjdGx5IGluaXRpYWxpemVkIHdpdGggdGhlIHJlc3VsdHMgb2YgY2FsY3VsYXRpb25zIGFuZCBmdW5jdGlvbiBjYWxscywgcmVzcGVjdGl2ZWx5LiBUaGlyZCwgbm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQuIEZpbmFsbHksIHRoZXJlJ3Mgbm8gcmlzayBvZiBhbnkga2luZCBvZiBidWZmZXIgb3ZlcnJ1bnMgdGhhdCBtaWdodCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbkxvb2tpbmcgZGVlcGVyIGF0IHRoZSBjb2RlLCBldmVyeXRoaW5nIGhpbmdlcyBvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgYW5kIHRoZSBpbml0aWFsaXphdGlvbiB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGlzIGtmdW5jIGxldmVyYWdlcyBhbiBleGlzdGluZywgd2VsbC12ZXR0ZWQgbW0gaW50ZXJuYWwgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBpcyBxdWl0ZSBzaW1wbGUsIGFuZCBpdCdzIHBhc3NpbmcgaW4gdGhlIGBtZW1jZ2AgcG9pbnRlciBhbmQgdGhlIHNpemUgdmFsdWUuIFRoZSByZXR1cm4gdmFsdWUgaXMganVzdCBhbiBgdW5zaWduZWQgbG9uZ2AuXG5cblRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgYXJlIGBzdHJ1Y3QgbWVtX2Nncm91cCAqYCwgYHVuc2lnbmVkIGxvbmcgbnJfcGFnZXNgLCBgZ2ZwX3QgZ2ZwX21hc2tgLCBgdW5zaWduZWQgaW50IHJlY2xhaW1fb3B0aW9uc2AsIGFuZCBgbm9kZW1hc2tfdCAqbm9kZW1hc2tgICh3aGVyZSBpdCdzIHBhc3NlZCBhcyBOVUxMKS4gVGhlcmUgaXMgbm8gcmVhZGluZyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBOb3RoaW5nIGhlcmUgbGVha3MgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZSBwb3RlbnRpYWwgaXNzdWVzIEkgY2FuIHNlZSB3b3VsZCBiZSBjbGFzc2ljIG1lbW9yeSBtYW5hZ2VtZW50IGVycm9ycyBsaWtlIGxvY2tpbmcgaXNzdWVzLCByZWN1cnNpb24sIHNsZWVwLWluLWF0b21pYyBjb250ZXh0IHByb2JsZW1zLCBjb25jdXJyZW5jeSBpc3N1ZXMsIHJlZmNvdW50IGVycm9ycywgb3IgZGVhZGxvY2tzLiBIb3dldmVyLCB0aG9zZSBhcmUgdGhlIHR5cGVzIG9mIGJ1Z3MgdGhhdCBLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORywgYW5kIHRoZSBvdGhlciBzdGFuZGFyZCBrZXJuZWwgZGV0ZWN0b3JzIGFyZSBkZXNpZ25lZCB0byBjYXRjaC4gS01TQU4gaXNuJ3QgbmVlZGVkIGhlcmUuXG5cblNvLCBhY2NvcmRpbmcgdG8gbXkgYW5hbHlzaXMgYW5kIHRoZXNlIGd1aWRlbGluZXM6XG5cbiogICAqKk5lZWRzS01TQU46IGZhbHNlKipcbiogICAqKktNU0FOUmVhc29uaW5nOioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYywgd2hpY2ggaXMgYWRkZWQgdG8gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBzZWxmdGVzdHMuIFRoaXMga2Z1bmMgdGFrZXMgYSBtZW1jZyBwb2ludGVyIGFuZCBhIHNpemUgc2NhbGFyLCBkb2VzIHNvbWUgYmFzaWMgdmFsaWRhdGlvbiwgdGhlbiBpbnZva2VzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLCByZXR1cm5pbmcgYW4gYHVuc2lnbmVkIGxvbmdgIHJlcHJlc2VudGluZyByZWNsYWltZWQgYnl0ZXMuIFRoZXJlIGFyZSBubyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIG5vIGluZm8gbGVha3MuIEFueSBwb3RlbnRpYWwgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWVzLCBsb2NraW5nLCBzbGVlcGFibGUgY29udGV4dHMsIG9yIHBvaW50ZXIgdmFsaWRpdHkgcHJvYmxlbXMgd291bGQgYmUgaWRlbnRpZmllZCBieSBLQVNBTiBhbmQgTE9DS0RFUC5cblxuTGV0J3MgcHJvY2VlZCB0byBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDEwMSwiT3V0cHV0VG9rZW5zIjoxOTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDgzLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDI6MDkuNTU0NTAzMTM3WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUzNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBCUEYga2Z1bmMgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFuZCBhc3NvY2lhdGVkIEJQRiBzZWxmdGVzdHMuIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIGBzaXplYCBwYXJhbWV0ZXIsIGNoZWNrcyB0aGUgZXhlY3V0aW9uIGNvbnRleHQsIGNhbGxzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLCBhbmQgcmV0dXJucyBhIHNjYWxhciBgdW5zaWduZWQgbG9uZ2AgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHJlY2xhaW1lZCBieXRlcy5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgcmVhZHMsIGFuZCBubyB0cmFuc2ZlcnMgb2Yga2VybmVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgaXNzdWVzIChlLmcuLCBkZWFkbG9jaywgcmVjdXJzaW9uIGluIHJlY2xhaW0gY29udGV4dCwgcmVmY291bnRpbmcsIG9yIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSkgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcywgbm90IEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowmkb67[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-05 19:36:54 +0000 UTC FinishedAt: 2026-09-05 20:42:11 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "bpf-next", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git", "commit_hash": "3ccdb07813829ba9487273e75d1cb238cfa774c1", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "series_id": "43142361-e717-4509-a429-70ce312f5eb2" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db", "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgQlBGIGtmdW5jIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbmQgYXNzb2NpYXRlZCBCUEYgc2VsZnRlc3RzLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBgc2l6ZWAgcGFyYW1ldGVyLCBjaGVja3MgdGhlIGV4ZWN1dGlvbiBjb250ZXh0LCBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYCwgYW5kIHJldHVybnMgYSBzY2FsYXIgYHVuc2lnbmVkIGxvbmdgIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMuXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgYWxsb3dpbmcgc2xlZXBhYmxlIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gdmlhIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKS4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBjb2RlIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyZjM1YmE2NjMwOWUgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtNiw2ICYjNDM7Niw3IEBAXG4gICovXG4gXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICYjNDM7MTYwLDc0IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuIFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XG4gfVxuIFxuJiM0MzsvKlxuJiM0MzsgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4mIzQzOyAqIGN1cnJlbnQtXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxuJiM0MzsgKiByZWNsYWltIHN0YXRlLiBSZWNsYWltIHdpbmRvd3MgYXJlIG1hcmtlZCB3aXRoIFBGX01FTUFMTE9DO1xuJiM0MzsgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuJiM0MzsgKiBiZWZvcmUgUEZfTUVNQUxMT0MuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRyZXR1cm4gKGN1cnJlbnQtXHUwMDNlZmxhZ3MgXHUwMDI2IFBGX01FTUFMTE9DKSB8fCBjdXJyZW50LVx1MDAzZXJlY2xhaW1fc3RhdGU7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuJiM0MzsgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuXG4mIzQzOyAqXG4mIzQzOyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuJiM0MzsgKiB0aGUgbWVtb3J5LmhpZ2ggd29ya3F1ZXVlIGZhbGxiYWNrIGluIGhpZ2hfd29ya19mdW5jKCkuIFRvIHJlY2xhaW1cbiYjNDM7ICogbW9yZSwgY2FsbCB0aGlzIGtmdW5jIHJlcGVhdGVkbHkgaW5zdGVhZCBvZiBwYXNzaW5nIGEgbGFyZ2VyIEBzaXplLlxuJiM0MzsgKlxuJiM0MzsgKiBUaGlzIGtmdW5jIGlzIHJlc3RyaWN0ZWQgdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMIHRvIGVuc3VyZSBpdCBydW5zXG4mIzQzOyAqIGluIGEgY2xlYW4gcHJvY2VzcyBjb250ZXh0LiBUaGUgU1lTQ0FMTCBwcm9ncmFtIGNhbiBzY2hlZHVsZSB0aGVcbiYjNDM7ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4mIzQzOyAqIHNhZmUgcHJvY2VzcyBjb250ZXh0ICh3b3JrcXVldWUsIHRhc2tfd29yaykuXG4mIzQzOyAqXG4mIzQzOyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4mIzQzOyAqIGNhbGxiYWNrIGFuZCByZXF1ZXVlIHRoZSBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgYmF0Y2ggcmF0aGVyXG4mIzQzOyAqIHRoYW4gbG9vcGluZyBpbnNpZGUgdGhlIGNhbGxiYWNrOiBhIGxvbmctcnVubmluZyBjYWxsYmFjayBzdGFsbHNcbiYjNDM7ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4mIzQzOyAqIGludGVycnVwdHMgZGlzYWJsZWQgdGhlIHJlc3VsdGluZyBjb250ZW50aW9uIGFsc28gZGVsYXlzIElQSVxuJiM0MzsgKiBoYW5kbGluZy4gR2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIGJwZl93cSBpdGVtLCBzbyB0aGF0XG4mIzQzOyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuJiM0MzsgKiBhbm90aGVyLiBEZWNpZGluZyB3aGV0aGVyIHRvIHN1Ym1pdCB0aGUgbmV4dCBiYXRjaCBpcyB1cCB0byB0aGUgQlBGXG4mIzQzOyAqIHByb2dyYW0sIHdoaWNoIGNhbiBzdG9wIGF0IGFueSBwb2ludCwgZS5nLiBvbmNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzXG4mIzQzOyAqIGR5aW5nLlxuJiM0MzsgKlxuJiM0MzsgKiBNdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhIGZpbGVzeXN0ZW0gbG9jayBoZWxkOiB0aGUgcmVjbGFpbSBwYXRoXG4mIzQzOyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpc1xuJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4mIzQzO1xuJiM0MztcdGlmIChzaXplIFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7XHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xuJiM0MztcbiYjNDM7XHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIEdGUF9LRVJORUwsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgTlVMTCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XG4mIzQzO31cbiYjNDM7XG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzEsMjIgJiM0MzsyNDAsNDQgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX21lbW9yeV9ldmVudHMpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKVxuIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuLVxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbiYjNDM7LypcbiYjNDM7ICogUHJvYWN0aXZlIHJlY2xhaW0gbmVlZHMgYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQsIHNvIGl0IGlzIHJlc3RyaWN0ZWRcbiYjNDM7ICogdG8gQlBGX1BST0dfVFlQRV9TWVNDQUxMLiBUaGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIHRoYXQgYVxuJiM0MzsgKiBTWVNDQUxMIHByb2dyYW0gc2NoZWR1bGVzIHJ1biBhcyB0aGUgc2FtZSBwcm9ncmFtIHR5cGUsIHNvIHRoZXkgY2FuXG4mIzQzOyAqIHN0aWxsIGludm9rZSBpdDsgZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgKGUuZy4gZmVudHJ5IG9uIHJlY2xhaW1cbiYjNDM7ICogcGF0aHMsIGlub2RlX3JtZGlyKSBjYW5ub3QuXG4mIzQzOyAqL1xuJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuJiM0MztCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG4mIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuJiM0MztcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0ge1xuJiM0MztcdC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLFxuJiM0MztcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuJiM0Mzt9O1xuJiM0MztcbiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXG4ge1xuIFx0aW50IGVycjtcbiBcbiBcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXG4gXHRcdFx0XHRcdFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7XG4tXHRpZiAoZXJyKVxuJiM0MztcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkXCYjMzQ7LCBlcnIpO1xuJiM0MztcdFx0cmV0dXJuIGVycjtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuJiM0MztcdFx0XHRcdFx0XHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpO1xuJiM0MztcdGlmIChlcnIpXG4mIzQzO1x0XHRwcl93YXJuKFwmIzM0O2Vycm9yIHJlZ2lzdGVyaW5nIGJwZiByZWNsYWltIGtmdW5jczogJWRcJiMzNDssIGVycik7XG4gXG4gXHRyZXR1cm4gZXJyO1xuIH1cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2XG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDY4NiBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKi9cbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvbW1hbi5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy9zdGF0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy93YWl0LmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjZmNudGwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2N0aW1lLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdW5pc3RkLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdGRsaWIuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzdHJpbmcuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NsaW51eC9tYWdpYy5oXHUwMDNlXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDtjZ3JvdXBfaGVscGVycy5oXCYjMzQ7XG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuJiM0MzsjZGVmaW5lIENHX0xJTUlUICgzMiAqIDEwMjQgKiAxMDI0dWwpXG4mIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuJiM0MztcbiYjNDM7I2RlZmluZSBDR19ESVIgXCYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW1cJiMzNDtcbiYjNDM7I2RlZmluZSBDR19ISUdIX0RJUiBDR19ESVIgXCYjMzQ7L2hpZ2hcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcJiMzNDsvbG93XCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiBcJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1wmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiBcJiMzNDsvdHJpZ2dlclwmIzM0O1xuJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFwmIzM0Oy90YXJnZXRcJiMzNDtcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4mIzQzOyNkZWZpbmUgRVZFTlRfREVMVEFfVEhSRVNIT0xEIDFcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFRpbWluZyBmb3IgdGhlIGR5aW5nIHRlc3Q6IGFmdGVyIHRoZSB0YXJnZXQgY2dyb3VwIGlzIHJlbW92ZWQsIGdpdmVcbiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kXG4mIzQzOyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyXG4mIzQzOyAqIGNncm91cCByZWZhdWx0aW5nLCBhbmQgdGhlIHRpbWVyIGZpcmVzIGV2ZXJ5IENIRUNLX1BFUklPRF9OUywgc29cbiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgRFlJTkdfU0VUVExFX1VTICgyMDAgKiAxMDAwKVxuJiM0MzsjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwXG4mIzQzOyNkZWZpbmUgRFlJTkdfUE9MTF9JTlRFUlZBTF9VUyAoMTAgKiAxMDAwKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4mIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuJiM0MztcbiYjNDM7XHRpZiAoIXN0YXRmcyhcJiMzNDsvdG1wXCYjMzQ7LCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuXCYjMzQ7O1xuJiM0MztcdHJldHVybiBcJiMzNDsvdG1wXCYjMzQ7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4mIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4mIzQzO1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4mIzQzO1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbiYjNDM7XHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKGNvZGUpIHtcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfT0s6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7c3VjY2Vzc1wmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7am9pbiBjZ3JvdXBcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7cmVhZCBkYXRhIGZpbGVcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt3cml0ZSB0aW1lIGZpbGVcJiMzNDs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt1bmtub3duXCYjMzQ7O1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwmIzM0O21lbW9yeVwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtlbmFibGVfY29udHJvbGxlcnNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcJiMzNDslbHVcJiMzNDssIENHX0xJTUlUKTtcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5tYXhcJiMzNDssIGxpbWl0X2J1Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbiYjNDM7XHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuJiM0MztcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7L3Byb2Mvc3dhcHNcJiMzNDssIEZfT0spKSB7XG4mIzQzO1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5zd2FwLm1heFwmIzM0OywgXCYjMzQ7MFwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0hJR0hfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0xPV19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzXG4mIzQzOyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4mIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuJiM0MzsgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJiMzOTtzXG4mIzQzOyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4mIzQzO1xuJiM0MztcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0RZSU5HX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2VuYWJsZV9jb250cm9sbGVyc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwmIzM0OyVsdVwmIzM0OywgQ0dfTElNSVQpO1xuJiM0MztcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5Lm1heFwmIzM0OywgbGltaXRfYnVmKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHQvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi9cbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgRl9PSykpIHtcbiYjNDM7XHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5LnN3YXAubWF4XCYjMzQ7LCBcJiMzNDswXCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0YXJnZXRfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbiYjNDM7XHRcdFx0KHZvaWQpdjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7XG4mIzQzO1x0ZG91YmxlIGVsYXBzZWQ7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4mIzQzO1xuJiM0MztcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4mIzQzO1xuJiM0MztcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNmVuZCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX09LO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuJiM0MztcdHByaW50ZihcJiMzNDslLjZmXFxuXCYjMzQ7LCBlbGFwc2VkKTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDt3XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIWZwKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuJiM0MztcdGZwcmludGYoZnAsIFwmIzM0OyUuNmZcJiMzNDssIGVsYXBzZWQpO1xuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBDSElMRF9FWElUX09LO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbiYjNDM7e1xuJiM0MztcdGludCByZXQgPSAtMTtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XHRjaGFyIGJ1Zls2NF07XG4mIzQzO1xuJiM0MztcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCYjMzQ7clwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcJiMzNDtmb3BlblwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgXCYjMzQ7ZmdldHNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRpZiAoc3NjYW5mKGJ1ZiwgXCYjMzQ7JWxmXCYjMzQ7LCB0aW1lKSAhPSAxKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O3NzY2FuZiAlc1wmIzM0OywgYnVmKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7b3V0OlxuJiM0MztcdHJldHVybiByZXQ7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnRcbiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbiYjNDM7e1xuJiM0MztcdGNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbiYjNDM7XHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XG4mIzQzO1x0cGlkX3Qgd2FpdF9yZXQ7XG4mIzQzO1x0aW50IGZkLCBzdGF0dXM7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4mIzQzO1x0XHQgXCYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCYjMzQ7bWtzdGVtcFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UoZmQpO1xuJiM0MztcbiYjNDM7XHRsb3dfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFwmIzM0O2ZvcmsgbG93XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAobG93X3BpZCA9PSAwKVxuJiM0MztcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHRoaWdoX3BpZCA9IGZvcmsoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgXCYjMzQ7Zm9yayBoaWdoXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoaGlnaF9waWQgPT0gMClcbiYjNDM7XHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbiYjNDM7XHRcdFx0XHRcdCAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTtcbiYjNDM7XG4mIzQzO1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsIFwmIzM0O2xvdyB3YWl0cGlkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHQvKlxuJiM0MztcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuJiM0MztcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxuJiM0MztcdCAqL1xuJiM0MztcdGxvd19waWQgPSAtMTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcJiMzNDtsb3cgZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuJiM0MztcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCYjMzQ7aGlnaCB3YWl0cGlkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHQvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi9cbiYjNDM7XHRoaWdoX3BpZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2hpZ2ggZXhpdGVkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcbiYjNDM7XHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbiYjNDM7XHRpZiAocmV0KSB7XG4mIzQzO1x0XHRpZiAoaGlnaF9waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHRcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1x0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCxcbiYjNDM7XHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcbiYjNDM7XHRzdHJ1Y3QgYnBmX2FyZ3MgYXJncyA9IHtcbiYjNDM7XHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuJiM0MztcdFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdFx0LmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCxcbiYjNDM7XHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbiYjNDM7XHR9O1xuJiM0MztcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcbiYjNDM7XHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuJiM0MztcdFx0LmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTtcbiYjNDM7XHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XG4mIzQzO1xuJiM0MztcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsIFwmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cdTAwM2Vwcm9ncy53cV9wcm9nX2luaXQpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFwmIzM0O3Byb2dfaW5pdCByZXR2YWxcJiMzNDspKVxuJiM0MztcdFx0Z290byBlcnJvcl9vdXQ7XG4mIzQzO1xuJiM0MztcdCpza2VsX3B0ciA9IHNrZWw7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztlcnJvcl9vdXQ6XG4mIzQzO1x0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRyZXR1cm4gLTE7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0aW50IGVycjtcbiYjNDM7XHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1xuJiM0MztcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmxvd19jZ3JvdXBfaWQpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCYjMzQ7KSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2JwZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbiYjNDM7XHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbiYjNDM7XHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwmIzM0O3JlY2xhaW1lZF9ieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtoaWdoIGNncm91cCBub3QgaW1wcm92ZWQ6IGhpZ2g9JWYgbG93PSVmXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAoc2tlbClcbiYjNDM7XHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzXG4mIzQzOyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuJiM0MzsgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHlcbiYjNDM7ICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4mIzQzO3tcbiYjNDM7XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4mIzQzO1xuJiM0MztcdGlmIChwaWQgIT0gMClcbiYjNDM7XHRcdHJldHVybiBwaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0X2V4aXQoQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCk7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbiYjNDM7XHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuJiM0MztcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZW1vdmUgdGhlIHJlY2xhaW0gdGFyZ2V0IHdoaWxlIHRoZSBCUEYgcHJvZ3JhbSBrZWVwcyBydW5uaW5nIGFuZFxuJiM0MzsgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mXG4mIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC5cbiYjNDM7ICpcbiYjNDM7ICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmRcbiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZyxcbiYjNDM7ICogYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZC4gcmVjbGFpbV9jYWxscyBncm93aW5nXG4mIzQzOyAqIHdoaWxlIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuJiM0MzsgKiByZXR1cm5zIDAgb24gdGhlIGVtcHR5IHRhcmdldCwgYnV0IHRoZSBjYWxsIGlzIHN0aWxsIGNvdW50ZWQpLCBhbmRcbiYjNDM7ICogYWZ0ZXIgdGhlIHJlbW92YWwgdGhlIHNraXAgY291bnRlcnMgbXVzdCBncm93IHdoaWxlIHJlY2xhaW1fY2FsbHNcbiYjNDM7ICogYW5kIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbiYjNDM7ICovXG4mIzQzO3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHR1NjQgdHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlO1xuJiM0MztcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwmIzM0O1wmIzM0OztcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0cGlkX3QgcmVhZGVyX3BpZCA9IC0xO1xuJiM0MztcdGludCBlcnIsIGZkLCBpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9keWluZ19jZ3JvdXBzKFx1MDAyNnRyaWdnZXJfY2dyb3VwX2lkLCBcdTAwMjZ0YXJnZXRfY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2R5aW5nX2Nncm91cHNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwmIzM0Oywgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuJiM0MztcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcJiMzNDtmb3JrIGtlZXBhbGl2ZSByZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX2NhbGxzIFx1MDAzZSAwKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0cmVtb3ZlX2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbiYjNDM7XG4mIzQzO1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbiYjNDM7XHR1c2xlZXAoRFlJTkdfU0VUVExFX1VTKTtcbiYjNDM7XG4mIzQzO1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbiYjNDM7XHRieXRlc19iZWZvcmUgPSBza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXM7XG4mIzQzO1xuJiM0MztcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGlmIChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIHx8XG4mIzQzO1x0XHQgICAgc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9za2lwcGVkX2R5aW5nKVxuJiM0MztcdFx0XHRicmVhaztcbiYjNDM7XHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmICghc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSBcdTAwMjZcdTAwMjZcbiYjNDM7XHQgICAgIXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZykge1xuJiM0MztcdFx0UFJJTlRfRkFJTChcJiMzNDtubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSlcJiMzNDssXG4mIzQzO1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbiYjNDM7XHRcdFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuJiM0MztcdCAqIGNhdWdodCB0aGUgY2dyb3VwIG1pZC10ZWFyZG93bi4gV2hldGhlciBpdCBpcyBoaXQgaXMgdGltaW5nXG4mIzQzO1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4mIzQzO1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwcmludGYoXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWxsdSwgZHlpbmc9JWxsdVxcblwmIzM0OyxcbiYjNDM7XHQgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lLFxuJiM0MztcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4mIzQzO1xuJiM0MztcdC8qIE5vdGhpbmcgbWF5IGhhdmUgYmVlbiByZWNsYWltZWQgZnJvbSB0aGUgcmVtb3ZlZCB0YXJnZXQuICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCBcJiMzNDtyZWNsYWltX2NhbGxzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxuJiM0MztcdFx0ICAgICAgIFwmIzM0O3JlY2xhaW1lZF9ieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAocmVhZGVyX3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0a2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0fVxuJiM0MztcdGlmIChkYXRhX2ZpbGVbMF0pXG4mIzQzO1x0XHR1bmxpbmsoZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoc2tlbClcbiYjNDM7XHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uZTY4MzlhZGU0NzJiYlxuLS0tIC9kZXYvbnVsbFxuJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCAmIzQzOzEsMjU5IEBAXG4mIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDt2bWxpbnV4LmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oXCYjMzQ7XG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfY29yZV9yZWFkLmhcdTAwM2VcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXHQxXG4mIzQzOyNkZWZpbmUgUEFHRV9TSVpFXHRcdDQwOTZVTFxuJiM0MzsvKlxuJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkVcbiYjNDM7ICogZWFjaC4gRWFjaCBicGZfd3EgY2FsbGJhY2sgcmVjbGFpbXMgYSBzaW5nbGUgYmF0Y2ggYW5kIHJlcXVldWVzIHRoZVxuJiM0MzsgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy5cbiYjNDM7ICovXG4mIzQzOyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbiYjNDM7I2RlZmluZSBSRUNMQUlNX01BWF9JVEVSXHQzMlxuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcbiYjNDM7XHRzdHJ1Y3QgY2dyb3VwICpjZ3JwO1xuJiM0MztcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XG4mIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxuJiM0MzsgKi9cbiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7XG4mIzQzO3U2NCByZWNsYWltZWRfYnl0ZXM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlY2xhaW0gYXR0ZW1wdHMgc2tpcHBlZCBiZWNhdXNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nIG9yIGhhc1xuJiM0MzsgKiBiZWVuIHJlbW92ZWQuIHJlY2xhaW1fc2tpcHBlZF9keWluZyBjb3VudHMgbG9va3VwcyB0aGF0IHN0aWxsIGZvdW5kXG4mIzQzOyAqIHRoZSBjZ3JvdXAgd2hpbGUgaXQgaXMgYmVpbmcgdG9ybiBkb3duLCByZWNsYWltX3RhcmdldF9nb25lIGNvdW50c1xuJiM0MzsgKiBsb29rdXBzIHRoYXQgZm91bmQgbm90aGluZy4gVGhlIHRlc3QgcmVtb3ZlcyB0aGUgdGFyZ2V0IGNncm91cCB3aGlsZVxuJiM0MzsgKiByZWNsYWltIGlzIHJ1bm5pbmcgYW5kIGNoZWNrcyB0aGF0IHJlY2xhaW0gc3RvcHMgdmlhIHRoZXNlIGNvdW50ZXJzLlxuJiM0MzsgKi9cbiYjNDM7dTY0IHJlY2xhaW1fc2tpcHBlZF9keWluZztcbiYjNDM7dTY0IHJlY2xhaW1fdGFyZ2V0X2dvbmU7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZWNncnApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuJiM0MztcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuJiM0MztcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4mIzQzO1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4mIzQzO1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4mIzQzO1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXG4mIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4mIzQzOyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbiYjNDM7ICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXG4mIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuJiM0MzsgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4mIzQzOyAqXG4mIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuJiM0MzsgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbiYjNDM7ICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcbiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzb1xuJiM0MzsgKiB0aGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggdGhlIHRhcmdldCBrZXJuZWwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChmbGFncyBcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFx1MDAyNiBDU1NfT05MSU5FKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4mIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbiYjNDM7ICogcmVjbGFpbWVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1x0dTY0IG5yID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSkge1xuJiM0MztcdFx0cmVjbGFpbV90YXJnZXRfZ29uZSYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbiYjNDM7XHRcdHJlY2xhaW1fc2tpcHBlZF9keWluZyYjNDM7JiM0Mzs7XG4mIzQzO1x0XHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmVjbGFpbV9jYWxscyYjNDM7JiM0Mzs7XG4mIzQzO1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUpO1xuJiM0MztcdHJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7XG4mIzQzO1xuJiM0MztcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gbnI7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0cnVjdCB3cV9lbGVtIHtcbiYjNDM7XHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuJiM0MztcdHN0cnVjdCBicGZfd3Egd29yaztcbiYjNDM7XHR1NjQgcHJldl9ldmVudDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4mIzQzO1x0ICogcmVxdWV1ZXMuIDAgbWVhbnMgbm8gcm91bmQgaXMgaW4gcHJvZ3Jlc3M7IHRoZSB0aW1lciBwYXRoXG4mIzQzO1x0ICogc3RhcnRzIGEgbmV3IHJvdW5kIGJ5IHJlc2V0dGluZyBpdCwgcmVxdWV1ZWQgd29yayBvbmx5IGxvb2tzXG4mIzQzO1x0ICogYXQgaXQuXG4mIzQzO1x0ICovXG4mIzQzO1x0dTY0IHJlbWFpbmluZztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCB7XG4mIzQzO1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4mIzQzO1x0X191aW50KG1heF9lbnRyaWVzLCAxKTtcbiYjNDM7XHRfX3R5cGUoa2V5LCBfX3UzMik7XG4mIzQzO1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4mIzQzO30gd3FfbWFwIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7XG4mIzQzO1x0dTY0IG5yLCBzaXplO1xuJiM0MztcbiYjNDM7XHRpZiAoIWVsZW0tXHUwMDNlcmVtYWluaW5nKSB7XG4mIzQzO1x0XHQvKlxuJiM0MztcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4mIzQzO1x0XHQgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzXG4mIzQzO1x0XHQgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGFcbiYjNDM7XHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXHUwMDI2ZWxlbS1cdTAwM2VwcmV2X2V2ZW50LFxuJiM0MztcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4mIzQzO1x0XHRcdHJldHVybiAwO1xuJiM0MztcdFx0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogT25lIGJvdW5kZWQgcmVjbGFpbSBwYXNzIHBlciBjYWxsYmFjayAqL1xuJiM0MztcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4mIzQzO1x0bnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTtcbiYjNDM7XHRpZiAoIW5yKSB7XG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdC8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovXG4mIzQzO1x0aWYgKG5yIFx1MDAzZT0gZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4mIzQzO1x0ZWxzZVxuJiM0MztcdFx0ZWxlbS1cdTAwM2VyZW1haW5pbmcgLT0gbnI7XG4mIzQzO1xuJiM0MztcdC8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqL1xuJiM0MztcdGlmIChlbGVtLVx1MDAzZXJlbWFpbmluZylcbiYjNDM7XHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcbiYjNDM7e1xuJiM0MztcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuJiM0MztcdGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO1NFQyhcJiMzNDtzeXNjYWxsXCYjMzQ7KVxuJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4mIzQzO1x0X191MzIga2V5ID0gMDtcbiYjNDM7XHRpbnQgcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcdTAwMjZ3cV9tYXAsIFx1MDAyNmtleSk7XG4mIzQzO1x0aWYgKCFlbGVtKVxuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfd3FfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIFx1MDAyNndxX21hcCwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRyZXQgPSBicGZfdGltZXJfaW5pdChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xuJiM0MztcdGlmIChyZXQpXG4mIzQzO1x0XHRyZXR1cm4gcmV0O1xuJiM0MztcbiYjNDM7XHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gMDtcbiYjNDM7XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbiYjNDM7XG4mIzQzO1x0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztjaGFyIF9saWNlbnNlW10gU0VDKFwmIzM0O2xpY2Vuc2VcJiMzNDspID0gXCYjMzQ7R1BMXCYjMzQ7O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgYWxsb3dpbmcgc2xlZXBhYmxlIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gdmlhIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKS4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBjb2RlIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuYwppbmRleCA3MTZkZjQ5ZDc2NDc3Li45MmYzNWJhNjYzMDllIDEwMDY0NAotLS0gYS9tbS9icGZfbWVtY29udHJvbC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmMKQEAgLTYsNiAmIzQzOzYsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKIAogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwpAQCAtMTU5LDYgJiM0MzsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiAJbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXMKJiM0MzsgKiBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyCiYjNDM7ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQzsKJiM0MzsgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseQomIzQzOyAqIGJlZm9yZSBQRl9NRU1BTExPQy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKGN1cnJlbnQtJmd0O2ZsYWdzICZhbXA7IFBGX01FTUFMTE9DKSB8fCBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0bwomIzQzOyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcykKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKgomIzQzOyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZwomIzQzOyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbQomIzQzOyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS4KJiM0MzsgKgomIzQzOyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnMKJiM0MzsgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlCiYjNDM7ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluCiYjNDM7ICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS4KJiM0MzsgKgomIzQzOyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyCiYjNDM7ICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXIKJiM0MzsgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzCiYjNDM7ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoCiYjNDM7ICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJCiYjNDM7ICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdAomIzQzOyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZgomIzQzOyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYKJiM0MzsgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcwomIzQzOyAqIGR5aW5nLgomIzQzOyAqCiYjNDM7ICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXMKJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwomIzQzOwomIzQzOwlpZiAoc2l6ZSAmbHQ7IFBBR0VfU0laRSB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BhZ2VzID0gbWluKHNpemUgLyBQQUdFX1NJWkUsICh1bnNpZ25lZCBsb25nKU1FTUNHX0NIQVJHRV9CQVRDSCk7CiYjNDM7CiYjNDM7CW5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLAomIzQzOwkJCQkJCSAgICBHRlBfS0VSTkVMLAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsCiYjNDM7CQkJCQkJICAgIE5VTEwpOwomIzQzOwomIzQzOwlyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTcxLDIyICYjNDM7MjQwLDQ0IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9tZW1vcnlfZXZlbnRzKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKLQogQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQogCiYjNDM7LyoKJiM0MzsgKiBQcm9hY3RpdmUgcmVjbGFpbSBuZWVkcyBhIGNsZWFuIHByb2Nlc3MgY29udGV4dCwgc28gaXQgaXMgcmVzdHJpY3RlZAomIzQzOyAqIHRvIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTC4gVGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyB0aGF0IGEKJiM0MzsgKiBTWVNDQUxMIHByb2dyYW0gc2NoZWR1bGVzIHJ1biBhcyB0aGUgc2FtZSBwcm9ncmFtIHR5cGUsIHNvIHRoZXkgY2FuCiYjNDM7ICogc3RpbGwgaW52b2tlIGl0OyBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyAoZS5nLiBmZW50cnkgb24gcmVjbGFpbQomIzQzOyAqIHBhdGhzLCBpbm9kZV9ybWRpcikgY2Fubm90LgomIzQzOyAqLwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jcywKIH07CiAKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7CiYjNDM7CS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLAomIzQzO307CiYjNDM7CiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiAJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTsKLQlpZiAoZXJyKQomIzQzOwlpZiAoZXJyKSB7CiAJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkJiMzNDssIGVycik7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl93YXJuKCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDY4NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSICYjMzQ7L3RhcmdldCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlCiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kCiYjNDM7ICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXIKJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvCiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMCkKJiM0MzsjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwCiYjNDM7I2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHMKJiM0MzsgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcAomIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZQomIzQzOyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjImIzM5O3MKJiM0MzsgKiBuby1pbnRlcm5hbC1wcm9jZXNzIGNvbnN0cmFpbnQga2VlcHMgdGhlIHJlZmF1bHRpbmcgd29ya2xvYWQgb3V0IG9mCiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzZXR1cF9keWluZ19jZ3JvdXBzKHU2NCAqdHJpZ2dlcl9jZ3JvdXBfaWQsIHU2NCAqdGFyZ2V0X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHMKJiM0MzsgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGUKJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzbwomIzQzOyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseQomIzQzOyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3AKJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkICE9IDApCiYjNDM7CQlyZXR1cm4gcGlkOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKQomIzQzOwkJX2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKQomIzQzOwkJCV9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kCiYjNDM7ICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZgomIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC4KJiM0MzsgKgomIzQzOyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kCiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZywKJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiByZWNsYWltX2NhbGxzIGdyb3dpbmcKJiM0MzsgKiB3aGlsZSB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmMKJiM0MzsgKiByZXR1cm5zIDAgb24gdGhlIGVtcHR5IHRhcmdldCwgYnV0IHRoZSBjYWxsIGlzIHN0aWxsIGNvdW50ZWQpLCBhbmQKJiM0MzsgKiBhZnRlciB0aGUgcmVtb3ZhbCB0aGUgc2tpcCBjb3VudGVycyBtdXN0IGdyb3cgd2hpbGUgcmVjbGFpbV9jYWxscwomIzQzOyAqIGFuZCByZWNsYWltZWRfYnl0ZXMgc3RheSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDsKJiM0MzsJdTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlOwomIzQzOwljaGFyIGRhdGFfZmlsZVtQQVRIX01BWF0gPSAmIzM0OyYjMzQ7OwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CXBpZF90IHJlYWRlcl9waWQgPSAtMTsKJiM0MzsJaW50IGVyciwgZmQsIGk7CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoJmFtcDt0cmlnZ2VyX2Nncm91cF9pZCwgJmFtcDt0YXJnZXRfY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2R5aW5nX2Nncm91cHMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfZHlpbmdfWFhYWFhYJiMzNDssIHdvcmtsb2FkX2ZpbGVzX2RpcigpKTsKJiM0MzsJZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlyZWFkZXJfcGlkID0gc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihkYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCAmIzM0O2Zvcmsga2VlcGFsaXZlIHJlYWRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMgJmd0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CiYjNDM7CS8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovCiYjNDM7CXVzbGVlcChEWUlOR19TRVRUTEVfVVMpOwomIzQzOwomIzQzOwljYWxsc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHM7CiYjNDM7CWJ5dGVzX2JlZm9yZSA9IHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUgfHwKJiM0MzsJCSAgICBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fc2tpcHBlZF9keWluZykKJiM0MzsJCQlicmVhazsKJiM0MzsJCXVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX3NraXBwZWRfZHlpbmcpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSkmIzM0OywKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSwKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVjawomIzQzOwkgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgaXQgaXMgaGl0IGlzIHRpbWluZwomIzQzOwkgKiBkZXBlbmRlbnQsIGJlY2F1c2UgdGhlIGNncm91cCBtYXkgYWxyZWFkeSBiZSBmdWxseSByZWxlYXNlZCwgc28KJiM0MzsJICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC4KJiM0MzsJICovCiYjNDM7CXByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVsbHUsIGR5aW5nPSVsbHVcbiYjMzQ7LAomIzQzOwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUsCiYjNDM7CSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsKJiM0MzsJLyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi8KJiM0MzsJaWYgKCFBU1NFUlRfRVEoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsICYjMzQ7cmVjbGFpbV9jYWxscyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLAomIzQzOwkJICAgICAgICYjMzQ7cmVjbGFpbWVkX2J5dGVzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAocmVhZGVyX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkodm9pZCl3YWl0cGlkKHJlYWRlcl9waWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CWlmIChkYXRhX2ZpbGVbMF0pCiYjNDM7CQl1bmxpbmsoZGF0YV9maWxlKTsKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDI1OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7LyoKJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkUKJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlCiYjNDM7ICogc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IG9uZSwgc28gbm8gY2FsbGJhY2sgcnVucyBsb25nZXIgdGhhbiBvbmUKJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJncyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5CiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7CiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlczsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gYXR0ZW1wdHMgc2tpcHBlZCBiZWNhdXNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nIG9yIGhhcwomIzQzOyAqIGJlZW4gcmVtb3ZlZC4gcmVjbGFpbV9za2lwcGVkX2R5aW5nIGNvdW50cyBsb29rdXBzIHRoYXQgc3RpbGwgZm91bmQKJiM0MzsgKiB0aGUgY2dyb3VwIHdoaWxlIGl0IGlzIGJlaW5nIHRvcm4gZG93biwgcmVjbGFpbV90YXJnZXRfZ29uZSBjb3VudHMKJiM0MzsgKiBsb29rdXBzIHRoYXQgZm91bmQgbm90aGluZy4gVGhlIHRlc3QgcmVtb3ZlcyB0aGUgdGFyZ2V0IGNncm91cCB3aGlsZQomIzQzOyAqIHJlY2xhaW0gaXMgcnVubmluZyBhbmQgY2hlY2tzIHRoYXQgcmVjbGFpbSBzdG9wcyB2aWEgdGhlc2UgY291bnRlcnMuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fc2tpcHBlZF9keWluZzsKJiM0Mzt1NjQgcmVjbGFpbV90YXJnZXRfZ29uZTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLAomIzQzOwkJYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLAomIzQzOwkJCQkgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvcgomIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpCiYjNDM7ICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFjawomIzQzOyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlbgomIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvbgomIzQzOyAqIHRoZSBsb29rdXAgZmFpbGluZy4KJiM0MzsgKgomIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbQomIzQzOyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0bwomIzQzOyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oCiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzbwomIzQzOyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtJmd0O3NlbGYuZmxhZ3M7CiYjNDM7CiYjNDM7CXJldHVybiAoZmxhZ3MgJmFtcDsgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzICZhbXA7IENTU19PTkxJTkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXMKJiM0MzsgKiByZWNsYWltZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CXU2NCBuciA9IDA7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkgewomIzQzOwkJcmVjbGFpbV90YXJnZXRfZ29uZSYjNDM7JiM0Mzs7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2dyb3VwX2lzX2R5aW5nKGNtLmNncnApKSB7CiYjNDM7CQlyZWNsYWltX3NraXBwZWRfZHlpbmcmIzQzOyYjNDM7OwomIzQzOwkJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwluciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgc2l6ZSk7CiYjNDM7CXJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7CS8qCiYjNDM7CSAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzCiYjNDM7CSAqIHJlcXVldWVzLiAwIG1lYW5zIG5vIHJvdW5kIGlzIGluIHByb2dyZXNzOyB0aGUgdGltZXIgcGF0aAomIzQzOwkgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3MKJiM0MzsJICogYXQgaXQuCiYjNDM7CSAqLwomIzQzOwl1NjQgcmVtYWluaW5nOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwl1NjQgbnIsIHNpemU7CiYjNDM7CiYjNDM7CWlmICghZWxlbS0mZ3Q7cmVtYWluaW5nKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlCiYjNDM7CQkgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzCiYjNDM7CQkgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGEKJiM0MzsJCSAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi8KJiM0MzsJc2l6ZSA9IGVsZW0tJmd0O3JlbWFpbmluZyAmbHQ7IFJFQ0xBSU1fU0laRSA/IGVsZW0tJmd0O3JlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTsKJiM0MzsJbnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTsKJiM0MzsJaWYgKCFucikgewomIzQzOwkJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovCiYjNDM7CWlmIChuciAmZ3Q7PSBlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwllbHNlCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgLT0gbnI7CiYjNDM7CiYjNDM7CS8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqLwomIzQzOwlpZiAoZWxlbS0mZ3Q7cmVtYWluaW5nKQomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTQ4ODkKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxMTIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBQb3RlbnRpYWwgZm9yIEZ1enppbmc6IEEgU3RyYXRlZ2ljIEFzc2Vzc21lbnQqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBuZXcgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAga2Z1bmMgaXMgZXZlbiBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLCBhbmQgaWYgc28sIGhvdyB0byBhcHByb2FjaCBpdC4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIHBhdGNoLgoKUmlnaHQsIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYyB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBOb3csIEkgbmVlZCB0byBjaGVjayB0aGUgY29kZWJhc2UgdG8gdW5kZXJzdGFuZCB3aGF0ICplbmFibGVzKiB0aGlzIGZ1bmN0aW9uYWxpdHkuIEkmIzM5O2xsIG5lZWQgdG8gZXhhbWluZSBgbW0vYnBmX21lbWNvbnRyb2wuY2AgaXRzZWxmLCBhbmQgcXVpY2tseSBkaXZlIGludG8gdGhlIHJlbGV2YW50IGBNYWtlZmlsZWAgYW5kIGBLY29uZmlnYCBmaWxlcyB3aXRoaW4gdGhlIGBtbWAgZGlyZWN0b3J5LiBUaGF0IHdpbGwgdGVsbCBtZSB3aGljaCBjb25maWd1cmF0aW9uIG9wdGlvbnMgdHJpZ2dlciB0aGUgaW5jbHVzaW9uIG9mIGBtbS9icGZfbWVtY29udHJvbC5jYCwgdGh1cyBhbHNvIGluZm9ybWluZyB3aGF0IGNvbmZpZ3VyYXRpb25zIEkmIzM5O2xsIG5lZWQgdG8gZW5hYmxlIGR1cmluZyBmdXp6aW5nIHRvIGV2ZW4gbWFrZSB0aGlzIGNvZGUgcGF0aCBhY3RpdmUuIE9uY2UgSSBrbm93IHdoYXQgdHJpZ2dlcnMgdGhlIGluY2x1c2lvbiBvZiB0aGUgbmV3IGNvZGUsIEkmIzM5O2xsIHRoZW4gZGV0ZXJtaW5lIHdoaWNoIHN5bWJvbHMgYXJlIGdvb2QgZm9jdXMgcG9pbnRzIHRvIGV4dHJhY3QuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX21lbWNvbnRyb2wmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmM9MjMxPV9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTIzMi1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjMzOkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yMzQtQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDI9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG5tbS9icGZfbWVtY29udHJvbC5jOjI0MzpCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG5tbS9icGZfbWVtY29udHJvbC5jLTI0NC1cbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTI1MS0gKi9cbm1tL2JwZl9tZW1jb250cm9sLmM6MjUyOkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXG5tbS9icGZfbWVtY29udHJvbC5jLTI1My1CVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXG5tbS9icGZfbWVtY29udHJvbC5jOjI1NDpCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU1LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTY6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU3LVx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG5tbS9icGZfbWVtY29udHJvbC5jOjI1ODpcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU5LX07XG5tbS9icGZfbWVtY29udHJvbC5jLTI2MC1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjYxOnN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCA9IHtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjYyLVx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG5tbS9icGZfbWVtY29udHJvbC5jOjI2MzpcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjQtfTtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjY1LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNjY6c3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjcte1xuLS1cbm1tL2JwZl9tZW1jb250cm9sLmMtMjcwLVx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjcxOlx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNzItXHRpZiAoZXJyKSB7XG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNzctXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcbm1tL2JwZl9tZW1jb250cm9sLmM6Mjc4Olx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTI3OS1cdGlmIChlcnIpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yODMtfVxubW0vYnBmX21lbWNvbnRyb2wuYzoyODQ6bGF0ZV9pbml0Y2FsbChicGZfbWVtY29udHJvbF9pbml0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjIyMgoJCQkJCQkJb3V0cHV0OiAzNwoJCQkJCQkJdGhvdWdodHM6IDE4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqRGl2aW5nIGludG8gYG1tL2JwZl9tZW1jb250cm9sLmNgKioKCk9rYXksIHRpbWUgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uLiBMZXQmIzM5O3Mgc3RhcnQgYnkgZGlnZ2luZyBpbnRvIGBtbS9icGZfbWVtY29udHJvbC5jYC4gSSBuZWVkIHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIGhvdyB0aGUgQlBGIGludGVncmF0aW9uIHdpdGggbWVtb3J5IGNvbnRyb2wgaXMgYWN0dWFsbHkgaW1wbGVtZW50ZWQuIEkmIzM5O20gZXNwZWNpYWxseSBjdXJpb3VzIGFib3V0IGhvdyB0aGUgaG9va3MgYXJlIHNldCB1cCBhbmQgaG93IHRoZSBCUEYgcHJvZ3JhbXMgaW50ZXJhY3Qgd2l0aCB0aGUgbWVtY2cgZGF0YSBzdHJ1Y3R1cmVzLiBJJiMzOTttIGV4cGVjdGluZyB0byBzZWUgY2FsbHMgcmVsYXRlZCB0byBgbWVtY2dfY3NzX2AsIGBtZW1fY2dyb3VwX2AsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIHBlci1jcHUgc3RhdHMuIEkmIzM5O20ga2VlbiB0byBzZWUgdGhlIHNwZWNpZmljIHBvaW50cyBvZiBpbmplY3Rpb246IGFsbG9jYXRpb24gcGF0aHMsIHJlY2xhaW0sIG1pZ3JhdGlvbiwgZXRjLiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLCBzbyBsZXQmIzM5O3Mgc2VlIGhvdyB0aGUgQlBGIGhvb2tzIGludG8gdGhlc2UgY3JpdGljYWwgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtcy4gVWx0aW1hdGVseSwgSSYjMzk7bSB0cnlpbmcgdG8gZ3JvayB0aGUgb3ZlcmhlYWQgaW50cm9kdWNlZCBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHRoZSBsZXZlbCBvZiBjb250cm9sIGFmZm9yZGVkIGJ5IHRoaXMgaW50ZWdyYXRpb24uIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vYnBmX21lbWNvbnRyb2wuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE1MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgMTUwOlx0fVxuIDE1MTpcdFxuIDE1MjpcdC8qKlxuIDE1MzpcdCAqIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzIC0gRmx1c2ggbWVtb3J5IGNncm91cCYjMzk7cyBzdGF0aXN0aWNzXG4gMTU0Olx0ICogQG1lbWNnOiBtZW1vcnkgY2dyb3VwXG4gMTU1Olx0ICpcbiAxNTY6XHQgKiBQcm9wYWdhdGUgbWVtb3J5IGNncm91cCYjMzk7cyBzdGF0aXN0aWNzIHVwIHRoZSBjZ3JvdXAgdHJlZS5cbiAxNTc6XHQgKi9cbiAxNTg6XHRfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbiAxNTk6XHR7XG4gMTYwOlx0XHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiAxNjE6XHR9XG4gMTYyOlx0XG4gMTYzOlx0LypcbiAxNjQ6XHQgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4gMTY1Olx0ICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4gMTY2Olx0ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbiAxNjc6XHQgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuIDE2ODpcdCAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbiAxNjk6XHQgKi9cbiAxNzA6XHRzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4gMTcxOlx0e1xuIDE3MjpcdFx0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuIDE3MzpcdH1cbiAxNzQ6XHRcbiAxNzU6XHQvKipcbiAxNzY6XHQgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4gMTc3Olx0ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4gMTc4Olx0ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4gMTc5Olx0ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuIDE4MDpcdCAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcbiAxODE6XHQgKlxuIDE4MjpcdCAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiAxODM6XHQgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cbiAxODQ6XHQgKlxuIDE4NTpcdCAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuIDE4NjpcdCAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxuIDE4NzpcdCAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cbiAxODg6XHQgKlxuIDE4OTpcdCAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcbiAxOTA6XHQgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlXG4gMTkxOlx0ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4gMTkyOlx0ICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cbiAxOTM6XHQgKlxuIDE5NDpcdCAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4gMTk1Olx0ICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcbiAxOTY6XHQgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzXG4gMTk3Olx0ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4gMTk4Olx0ICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXG4gMTk5Olx0ICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdFxuIDIwMDpcdCAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuIDIwMTpcdCAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcbiAyMDI6XHQgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpc1xuIDIwMzpcdCAqIGR5aW5nLlxuIDIwNDpcdCAqXG4gMjA1Olx0ICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aFxuIDIwNjpcdCAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4gMjA3Olx0ICpcbiAyMDg6XHQgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbiAyMDk6XHQgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4gMjEwOlx0ICovXG4gMjExOlx0X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIDIxMjpcdFx0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbiAyMTM6XHR7XG4gMjE0Olx0XHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbiAyMTU6XHRcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4gMjE2Olx0XG4gMjE3Olx0XHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4gMjE4Olx0XHRcdHJldHVybiAwO1xuIDIxOTpcdFxuIDIyMDpcdFx0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbiAyMjE6XHRcbiAyMjI6XHRcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxuIDIyMzpcdFx0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuIDIyNDpcdFx0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbiAyMjU6XHRcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4gMjI2Olx0XHRcdFx0XHRcdFx0ICAgIE5VTEwpO1xuIDIyNzpcdFxuIDIyODpcdFx0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbiAyMjk6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc4NTEKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAzMDEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqTXkgSW5pdGlhbCBBc3Nlc3NtZW50IG9mIHRoZSBCUEYgUHJvYWN0aXZlIFJlY2xhaW0gUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93biBzeXN0ZW1hdGljYWxseS4gTXkgZmlyc3QgdGhvdWdodCBpcyB0byB1bmRlcnN0YW5kIHRoZSBzY29wZSBvZiB0aGlzIGNoYW5nZS4gSXQgYXBwZWFycyB3ZSYjMzk7cmUgaW50cm9kdWNpbmcgYSBuZXcgQlBGIGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgLCB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGF0IGluIGl0c2VsZiBpcyBpbnRlcmVzdGluZy4gVGhpcyBrZnVuYywgY2FsbGFibGUgZnJvbSBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCDigJMgYW5kIGNydWNpYWxseSwgZnJvbSBhIHNsZWVwYWJsZSBjb250ZXh0IOKAkyB0aGVuIHByb2NlZWRzIHRvIGNhbGwgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuCgpOZXh0LCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGFwcGxpY2FiaWxpdHkuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQmIzM5O3MgZXZlbiAqcmVsZXZhbnQqIHRvIHN0YW5kYXJkIHZpcnR1YWxpemF0aW9uIHNldHVwcyBsaWtlIFFFTVU/IFRoZSBhbnN3ZXIsIEkgcXVpY2tseSBhc3Nlc3MsIGlzIGEgZGVmaW5pdGUgeWVzLiBUaGUgQlBGIHN1YnN5c3RlbSBpcyBlbnRpcmVseSByZWFjaGFibGUgdGhyb3VnaCBzeXNjYWxscyBsaWtlIGBicGYoQlBGX1BST0dfTE9BRClgIGFuZCBgYnBmKEJQRl9QUk9HX1RFU1RfUlVOKWAsIGFuZCBtZW1vcnkgY2dyb3VwcyBhcmUsIG9mIGNvdXJzZSwgZXF1YWxseSBhY2Nlc3NpYmxlLiBHaXZlbiB0aGF0IGJvdGggbWVtb3J5IG1hbmFnZW1lbnQgYW5kIEJQRiBrZnVuY3MgYXJlIGNvcmUgc3Vic3lzdGVtcywgdGhpcyBhcmVhIGlzIHNjcmVhbWluZyBmb3IgZnV6emluZy4gSXQmIzM5O3MgYSBwcmltZSB0YXJnZXQgZm9yIGZpbmRpbmcgc3VidGxlLCBwb3RlbnRpYWxseSBleHBsb2l0YWJsZSB2dWxuZXJhYmlsaXRpZXMuCgpOb3csIEkmIzM5O20gdGhpbmtpbmcgYWJvdXQgdGhlIHByZXJlcXVpc2l0ZXMuIExvb2tpbmcgYXQgYG1tL01ha2VmaWxlYCwgdGhlIGluY2x1c2lvbiBvZiBgYnBmX21lbWNvbnRyb2wub2AgaGluZ2VzIG9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCwgaW1wbGljaXRseSwgYENPTkZJR19NRU1DR2AuIEZ1cnRoZXJtb3JlLCBgREVCVUdfSU5GT19CVEZgIGlzIHVzdWFsbHkgYSBuZWNlc3NhcnkgaW5ncmVkaWVudCBmb3IgQlRGIGtmdW5jcywgd2hpY2ggYXJlIGhlYXZpbHkgcmVsYXRlZCB0byBCUEYga2Z1bmMgc3VwcG9ydCwgYXMgd2VsbCBhcyBgQlBGX1NZU0NBTExgIGFuZCwgYWdhaW4sIGBNRU1DR2AuIEkmIzM5O2xsIG5lZWQgdG8gZG91YmxlLWNoZWNrIHRoZSBLY29uZmlnIG9wdGlvbnMgYXJvdW5kIEJURiwga2Z1bmNzLCBgQlBGX1NZU0NBTExgLCBhbmQgYE1FTUNHYCB0byBtYWtlIHN1cmUgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNldCBjb3JyZWN0bHksIGJ1dCB0aGlzIGFsbCBzZWVtcyBxdWl0ZSBwbGF1c2libGUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7cmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvYXJlbmEuYz0xMTMxPXN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcbmtlcm5lbC9icGYvYXJlbmEuYy0xMTMyLXtcbmtlcm5lbC9icGYvYXJlbmEuYzoxMTMzOlx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNmNvbW1vbl9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9hcmVuYS5jLTExMzQtfVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODkxOT1zdGF0aWMgaW50IGJ0Zl9wb3B1bGF0ZV9rZnVuY19zZXQoc3RydWN0IGJ0ZiAqYnRmLCBlbnVtIGJ0Zl9rZnVuY19ob29rIGhvb2ssXG4tLVxua2VybmVsL2JwZi9idGYuYy04OTY1LVx0c2V0ID0gdGFiLVx1MDAzZXNldHNbaG9va107XG5rZXJuZWwvYnBmL2J0Zi5jOjg5NjY6XHQvKiBXYXJuIHdoZW4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldCBpcyBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGhvb2tcbmtlcm5lbC9icGYvYnRmLmMtODk2Ny1cdCAqIGZvciBtb2R1bGUgc2V0cy5cbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTkxOTA9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXG4tLVxua2VybmVsL2JwZi9idGYuYy05MTk4LVxua2VybmVsL2JwZi9idGYuYzo5MTk5OnN0YXRpYyBpbnQgX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcbmtlcm5lbC9icGYvYnRmLmMtOTIwMC1cdFx0XHRcdCAgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldClcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjUtLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgb25seSBmcm9tIGluaXRjYWxscy9tb2R1bGUgaW5pdCBmdW5jdGlvbnMgKi9cbmtlcm5lbC9icGYvYnRmLmM6OTIyNjppbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxua2VybmVsL2JwZi9idGYuYy05MjI3LVx0XHRcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtOTIzOS1cdGhvb2sgPSBicGZfcHJvZ190eXBlX3RvX2tmdW5jX2hvb2socHJvZ190eXBlKTtcbmtlcm5lbC9icGYvYnRmLmM6OTI0MDpcdHJldHVybiBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoaG9vaywga3NldCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTkyNDEtfVxua2VybmVsL2JwZi9idGYuYzo5MjQyOkVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQpO1xua2VybmVsL2JwZi9idGYuYy05MjQzLVxuLS1cbmtlcm5lbC9icGYvYnRmLmM9OTI0NT1pbnQgcmVnaXN0ZXJfYnRmX2Ztb2RyZXRfaWRfc2V0KGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxua2VybmVsL2JwZi9idGYuYy05MjQ2LXtcbmtlcm5lbC9icGYvYnRmLmM6OTI0NzpcdHJldHVybiBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlRGX0tGVU5DX0hPT0tfRk1PRFJFVCwga3NldCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTkyNDgtfVxuLS1cbmtlcm5lbC9icGYvY3B1bWFzay5jPTUxNT1zdGF0aWMgaW50IF9faW5pdCBjcHVtYXNrX2tmdW5jX2luaXQodm9pZClcbi0tXG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjUtXHRyZXQgPSBicGZfbWVtX2FsbG9jX2luaXQoXHUwMDI2YnBmX2NwdW1hc2tfbWEsIHNpemVvZihzdHJ1Y3QgYnBmX2NwdW1hc2spLCBmYWxzZSk7XG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1MjY6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsIFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNzpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI4Olx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjktXHRyZXR1cm4gIHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoY3B1bWFza19kdG9ycyxcbi0tXG5rZXJuZWwvYnBmL2NyeXB0by5jPTM3OT1zdGF0aWMgaW50IF9faW5pdCBjcnlwdG9fa2Z1bmNfaW5pdCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvY3J5cHRvLmMtMzg4LVxua2VybmVsL2JwZi9jcnlwdG8uYzozODk6XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcnlwdG8uYzozOTA6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkxOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MjpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcbmtlcm5lbC9icGYvY3J5cHRvLmMtMzkzLVx0XHRcdFx0XHQgICAgICAgXHUwMDI2Y3J5cHRfaW5pdF9rZnVuY19zZXQpO1xuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jPTQ5ODI9c3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTQ5OTctXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0OTk4Olx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ5OTk6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMDpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfWERQLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAxOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TVFJVQ1RfT1BTLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAyOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAzOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9DR1JPVVBfU0tCLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA0LVx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhnZW5lcmljX2R0b3JzLFxuLS1cbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDYtXHRcdFx0XHRcdFx0ICBUSElTX01PRFVMRSk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDA3Olx0cmV0dXJuIHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcdTAwMjZjb21tb25fa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDgtfVxuLS1cbmtlcm5lbC9icGYvbWFwX2l0ZXIuYz0yMzA9c3RhdGljIGludCBpbml0X3N1YnN5c3RlbSh2b2lkKVxua2VybmVsL2JwZi9tYXBfaXRlci5jLTIzMS17XG5rZXJuZWwvYnBmL21hcF9pdGVyLmM6MjMyOlx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNmJwZl9tYXBfaXRlcl9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9tYXBfaXRlci5jLTIzMy19XG4tLVxua2VybmVsL2JwZi9ycXNwaW5sb2NrLmM9NzU5PXN0YXRpYyBfX2luaXQgaW50IHJxc3BpbmxvY2tfcmVnaXN0ZXJfa2Z1bmNzKHZvaWQpXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYy03NjAte1xua2VybmVsL2JwZi9ycXNwaW5sb2NrLmM6NzYxOlx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNnJxc3BpbmxvY2tfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2Mi19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjA2MjUKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiAxNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgZm9jdXNpbmcgb24gdGhlIGltcGxpZWQgcmVhc29uaW5nOgoKKipDaGVja2luZyBLY29uZmlnIGZvciBDcnVjaWFsIEtlcm5lbCBGZWF0dXJlcyoqCgpSaWdodCwgbGV0JiMzOTtzIGRpdmUgaW4uIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gc3RhdGUuIFNwZWNpZmljYWxseSwgSSYjMzk7bSB0aGlua2luZyBhYm91dCB3aGV0aGVyIGBNRU1DR2AgKG1lbW9yeSBjZ3JvdXBzKSBpcyBlbmFibGVkLiBJdCYjMzk7cyBhbG1vc3QgYSBnaXZlbiB0aGF0IGl0JiMzOTtzIGltcG9ydGFudCBmb3IgdGhpcyBraW5kIG9mIHdvcmssIGJ1dCBJIGFsd2F5cyB3YW50IHRvIGNvbmZpcm0uIEl0JiMzOTtzIGxpa2VseSBpbnZvbHZlZCBpbiByZXNvdXJjZSBtYW5hZ2VtZW50IGZvciB3aGF0ZXZlciBJJiMzOTttIHRyb3VibGVzaG9vdGluZyBvciBkZXZlbG9waW5nLiBUaGVuLCBJIG5lZWQgdG8gdmVyaWZ5IGBCUEZfU1lTQ0FMTGAgYXMgd2VsbCwgYmVjYXVzZSBJJiMzOTttIGJldHRpbmcgSSYjMzk7bGwgYmUgdG91Y2hpbmcgZUJQRiBhdCBzb21lIHBvaW50LCBlaXRoZXIgZm9yIGluc3RydW1lbnRhdGlvbiBvciBmb3IgZmlsdGVyaW5nLiBDaGVja2luZyB0aGVzZSBpbiBLY29uZmlnIHdpbGwgbGV0IG1lIGtub3cgd2hldGhlciBJIG5lZWQgdG8gcmVjb21waWxlIHRoZSBrZXJuZWwsIG9yIGlmIHRoZXNlIGFyZSBhbHJlYWR5IGVuYWJsZWQgb24gdGhlIHN5c3RlbSBJIGFtIHdvcmtpbmcgd2l0aC4gTWFraW5nIHN1cmUgdGhlc2UgYXJlIHNldCBjb3JyZWN0bHkgaXMgYSBmb3VuZGF0aW9uYWwgc3RlcCBiZWZvcmUgZGlnZ2luZyBpbnRvIHRoZSBkZXRhaWxzLiBUaW1lIHRvIGdldCB0aGUgbGF5IG9mIHRoZSBsYW5kLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgTUVNQ0cmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtpbml0L0tjb25maWcmIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5pdC9LY29uZmlnPTEwNjc9Y29uZmlnIENHUk9VUF9GQVZPUl9EWU5NT0RTXG4tLVxuaW5pdC9LY29uZmlnLTEwNzYtXG5pbml0L0tjb25maWc6MTA3Nzpjb25maWcgTUVNQ0dcbmluaXQvS2NvbmZpZy0xMDc4LVx0Ym9vbCBcJiMzNDtNZW1vcnkgY29udHJvbGxlclwmIzM0O1xuLS1cbmluaXQvS2NvbmZpZy0xMDg1LVxuaW5pdC9LY29uZmlnOjEwODY6Y29uZmlnIE1FTUNHX05NSV9VTlNBRkVcbmluaXQvS2NvbmZpZy0xMDg3LVx0Ym9vbFxuLS1cbmluaXQvS2NvbmZpZy0xMDkyLVxuaW5pdC9LY29uZmlnOjEwOTM6Y29uZmlnIE1FTUNHX05NSV9TQUZFVFlfUkVRVUlSRVNfQVRPTUlDXG5pbml0L0tjb25maWctMTA5NC1cdGJvb2xcbi0tXG5pbml0L0tjb25maWctMTA5OS1cbmluaXQvS2NvbmZpZzoxMTAwOmNvbmZpZyBNRU1DR19WMVxuaW5pdC9LY29uZmlnLTExMDEtXHRib29sIFwmIzM0O0xlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXJcJiMzNDtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjExMTMKCQkJCQkJCW91dHB1dDogMjkKCQkJCQkJCXRob3VnaHRzOiAyOQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoZSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIGl0IHdlcmUgbXkgb3duOgoKKipJbnZlc3RpZ2F0aW5nIEJQRiBTeXNjYWxsIENvbmZpZ3VyYXRpb24qKgoKQWxyaWdodCwgSSBuZWVkIHRvIHBpbnBvaW50IHdoZXJlIHRoZSBgQlBGX1NZU0NBTExgIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIGRlZmluZWQuIEtub3dpbmcgdGhlIGtlcm5lbCYjMzk7cyBLY29uZmlnIHN0cnVjdHVyZSBsaWtlIHRoZSBiYWNrIG9mIG15IGhhbmQsIG15IGZpcnN0IGluc3RpbmN0IGlzIHRvIGNoZWNrIGVpdGhlciBgaW5pdC9LY29uZmlnYCBvciBga2VybmVsL2JwZi9LY29uZmlnYC4gVGhvc2UgYXJlIHRoZSB0d28gbW9zdCBsb2dpY2FsIHBsYWNlcyB0byBzdGFydCBsb29raW5nIGZvciBhIEJQRi1yZWxhdGVkIHNldHRpbmcuIEl0JiMzOTtzIGFsbW9zdCBjZXJ0YWluIGl0JiMzOTtsbCBiZSBpbiBvbmUgb2YgdGhvc2UsIG9yIHBlcmhhcHMgY3Jvc3MtcmVmZXJlbmNlZCBiZXR3ZWVuIHRoZW0uIFRoaXMgaXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGUgQlBGIHN5c2NhbGwgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGF0IGJ1aWxkIHRpbWUuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTIvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5FcnJvcjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm5vIG1hdGNoZXM8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7Y29uZmlnIEJQRl9TWVNDQUxMJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5pdC8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7ZXJyb3ImIzM0OzogJiMzNDtubyBtYXRjaGVzJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMTMzNAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDEyCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IGF0dGVtcHQgYXQgc3VtbWFyaXppbmcgdGhlIHRob3VnaHQgcHJvY2VzcywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZToKCioqSHVudGluZyBmb3IgQlBGX1NZU0NBTEwgaW4gdGhlIENvbmZpZyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIGBCUEZfU1lTQ0FMTGAuIEkmIzM5O20gZ29pbmcgdG8gc3RhcnQgYnkgYXNzdW1pbmcgaXQmIzM5O3MgbGlrZWx5IGEga2VybmVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLCBwcm9iYWJseSB1bmRlciBvbmUgb2YgdGhlIGJyb2FkZXIgQlBGIG9yIHNlY3VyaXR5LXJlbGF0ZWQgc2VjdGlvbnMuIFNpbmNlIGl0JiMzOTtzIGEgc3lzY2FsbC1yZWxhdGVkIGZlYXR1cmUsIEkgY2FuIGFsbW9zdCBndWFyYW50ZWUgaXRzIGV4aXN0ZW5jZS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGl0JiMzOTtzIGRlZmluZWQgYW5kIHdoYXQgZGVwZW5kZW5jaWVzIGl0IG1pZ2h0IGhhdmUuIE15IGZpcnN0IGluc3RpbmN0IGlzIHRvIHVzZSB0aGUgc3RhbmRhcmQgdG9vbHM7IGEgYGdyZXBgIHRocm91Z2ggdGhlIGtlcm5lbCYjMzk7cyBgS2NvbmZpZ2AgZmlsZXMgc2hvdWxkIGRvIHRoZSB0cmljaywgbWF5YmUgc3RhcnRpbmcgd2l0aCBhIHdpbGRjYXJkIHNlYXJjaCBsaWtlIGBLY29uZmlnKiBCUEZfU1lTQ0FMTGAuIE9yIHBlcmhhcHMgSSB3aWxsIHVzZSAmIzM5O2ZpbmQmIzM5OyBhbmQgJiMzOTtncmVwJiMzOTsgY29tbWFuZHMgdG8gc2VhcmNoLiBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvZGViYXNlLCBJIG1pZ2h0IG5lZWQgdG8gcmVmaW5lIHRoYXQgc2VhcmNoIGlmIGl0JiMzOTtzIHRvbyBicm9hZCBpbml0aWFsbHkuIEkmIzM5O2xsIG5lZWQgdG8gcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgY29udGV4dCBhcm91bmQgdGhhdCBvcHRpb24g4oCTIHdoYXQgb3RoZXIgZmVhdHVyZXMgZG9lcyBpdCBlbmFibGUgb3IgZGlzYWJsZT8gQXJlIHRoZXJlIGFueSBwcmVyZXF1aXNpdGVzIEkgbmVlZCB0byBiZSBhd2FyZSBvZj8gQW5kIG1vcmUgaW1wb3J0YW50bHksIHdoYXQmIzM5O3MgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBJJiMzOTtsbCBwcm9iYWJseSBhbHNvIGNoZWNrIHJlbGV2YW50IGBNYWtlZmlsZWBzIHRvIHVuZGVyc3RhbmQgaG93IHRoaXMgY29uZmlnIG9wdGlvbiB0cmFuc2xhdGVzIGludG8gYnVpbGQgZmxhZ3MgYW5kIHVsdGltYXRlbHksIGhvdyBpdCBhZmZlY3RzIHRoZSBnZW5lcmF0ZWQga2VybmVsIGNvZGUuIElkZWFsbHksIEkmIzM5O2xsIGZpbmQgYSBjb25jaXNlIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIG9wdGlvbiBhY3R1YWxseSAqZG9lcyogYWxvbmcgdGhlIHdheS4gVGhhdCYjMzk7cyB0aGUgcHJpb3JpdHkgcmlnaHQgbm93LCBmaW5kaW5nIGl0cyBkZWZpbml0aW9uLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgQlBGX1NZU0NBTEwmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2tlcm5lbC9icGYvS2NvbmZpZz0yOT1tZW51IFwmIzM0O0JQRiBzdWJzeXN0ZW1cJiMzNDtcbmtlcm5lbC9icGYvS2NvbmZpZy0zMC1cbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcbmtlcm5lbC9icGYvS2NvbmZpZy0zMi1cdGJvb2wgXCYjMzQ7RW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXCYjMzQ7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIxNzgzCgkJCQkJCQlvdXRwdXQ6IDMzCgkJCQkJCQl0aG91Z2h0czogMTkKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPk9rYXksIGhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgZnJhbWVkIGFzIGFuIGV4cGVydCYjMzk7cyBpbnRlcm5hbCBtb25vbG9ndWU6CgoqKkludmVzdGlnYXRpbmcgdGhlIERFQlVHX0lORk9fQlRGIERlcGVuZGVuY3kgZm9yIEJURiBLZnVuY3MqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkmIzM5O20gdGFraW5nIGEgbG9vayBhdCBob3cgYERFQlVHX0lORk9fQlRGYCB0aWVzIGludG8gQlRGIGtmdW5jcy4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzOiAqaXMqIGl0IGEgaGFyZCBkZXBlbmRlbmN5PyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiBgREVCVUdfSU5GT19CVEZgIGlzIHN0cmljdGx5ICpyZXF1aXJlZCogZm9yIHRoZSBwcm9wZXIgZnVuY3Rpb25hbGl0eSBhbmQgZ2VuZXJhdGlvbiBvZiBCVEYgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBrZnVuY3MsIG9yIGlmIHRoZXJlJiMzOTtzIHNvbWUgbGV2ZWwgb2YgZmxleGliaWxpdHkgaGVyZS4gVGhpcyBoYXMgaW1wbGljYXRpb25zIGZvciBwb3RlbnRpYWwgb3B0aW1pemF0aW9ucyBhbmQgaG93IHdlIGNhbiBhcHByb2FjaCB0b29saW5nLiBJJiMzOTt2ZSBnb3QgYSBtZW50YWwgY2hlY2tsaXN0IGFscmVhZHk6IElzIGl0IG5lY2Vzc2FyeSBmb3IgdGhlICpjcmVhdGlvbiogb2Yga2Z1bmMgQlRGLCBvciBqdXN0IGZvciBtb3JlIGRldGFpbGVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbj8gRG9lcyBpdCBpbXBhY3QgcnVudGltZSBwZXJmb3JtYW5jZSBvciBvbmx5IGNvbXBpbGF0aW9uIHRpbWU/IEkgbmVlZCB0byBkaWcgaW50byB0aGUgcmVsZXZhbnQgY29kZSBwYXRocyBhbmQgYnVpbGQgcHJvY2Vzc2VzLiBHb3R0YSBzdGFydCB3aXRoIHRoZSBCVEYgZ2VuZXJhdGlvbiBhbmQgc3ltYm9sIHRhYmxlIGFuYWx5c2lzIGFuZCBzZWUgd2hlcmUgdGhhdCBiaXQgb2YgaW5mb3JtYXRpb24gcGx1Z3MgaW4uIEVzc2VudGlhbGx5LCBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgcHJlY2lzZSBzY29wZSBvZiB0aGlzIGRlcGVuZGVuY3kuIEl0JiMzOTtzIHRpbWUgdG8gZmlyZSB1cCB0aGUgdG9vbHMgYW5kIHRyYWNlIHRoZSBmbG93LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7aW5jbHVkZS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9idGYuaD01ODg9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTU4OS1cdFx0XHRcdGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjU5MDppbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxuaW5jbHVkZS9saW51eC9idGYuaC01OTEtXHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKnMpO1xuLS1cbmluY2x1ZGUvbGludXgvYnRmLmg9NjQ4PXN0YXRpYyBpbmxpbmUgdTMyICpidGZfa2Z1bmNfaWRfc2V0X2NvbnRhaW5zKGNvbnN0IHN0cnVjdCBidGYgKmJ0Zixcbi0tXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTY1NC19XG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjY1NTpzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXG5pbmNsdWRlL2xpbnV4L2J0Zi5oLTY1Ni1cdFx0XHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMjM2MQoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDY5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6CgoqKk5hdmlnYXRpbmcgdGhlIEJURiBNYXplKioKCk9rYXksIHNvIEkmIzM5O20gZGlnZ2luZyBpbnRvIHNvbWV0aGluZyByZWxhdGVkIHRvIEJURiAoQmVya2VsZXkgZUJQRiBUeXBlIEZvcm1hdCkgYW5kIHRyeWluZyB0byBmaWd1cmUgb3V0IGEgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gcGF0aC4gTXkgaW50dWl0aW9uIGlzIHRlbGxpbmcgbWUgdGhhdCB0aGUgcmVsZXZhbnQgY29kZSBtaWdodCBoaW5nZSBvbiBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19ERUJVR19JTkZPX0JURmAgYmVpbmcgZGVmaW5lZC4gU28sIEkgbmVlZCB0byB2ZXJpZnkgdGhhdCBhbmQgc2VlIGhvdyB0aGV5IGludGVyYWN0LiBNeSBtZW50YWwgbWFwIHBvaW50cyBtZSB0b3dhcmRzIGBpbmNsdWRlL2xpbnV4L2J0Zi5oYCBhcyB0aGUgbGlrZWx5IGxvY2F0aW9uLCBhbmQgc2luY2UgdGhlc2Ugc29ydHMgb2YgY29uZGl0aW9uYWxzIG9mdGVuIGNsdXN0ZXIgdG9nZXRoZXIsIEkmIzM5O20gZ29pbmcgdG8gcXVpY2tseSBzY2FuIGxpbmVzIHJvdWdobHkgYmV0d2VlbiA1ODAgYW5kIDY2MC4gSG9wZWZ1bGx5LCBpdCYjMzk7cyBsYWlkIG91dCBpbiBhIHdheSB0aGF0JiMzOTtzIGVhc3kgdG8gcmVhZCBhbmQgSSBjYW4gcXVpY2tseSBhc2NlcnRhaW4gd2hldGhlciBteSBodW5jaCBpcyByaWdodCBhbmQgd2hhdCB0aGUgbG9naWMgZmxvdyBpcy4gSSYjMzk7bSBleHBlY3RpbmcgdG8gZmluZCBlaXRoZXIgYW4gYCNpZmAgYmxvY2sgb3Igc29tZXRoaW5nIHNpbWlsYXIgdGhhdCBhZGRyZXNzZXMgdGhvc2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuIFRoaXMgc2hvdWxkIGJlIGEgcXVpY2sgY2hlY2ssIGhvcGVmdWxseS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtpbmNsdWRlL2xpbnV4L2J0Zi5oJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNTgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDgwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA1ODA6XHRcbiA1ODE6XHRjb25zdCBjaGFyICpidGZfbmFtZV9ieV9vZmZzZXQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgb2Zmc2V0KTtcbiA1ODI6XHRjb25zdCBjaGFyICpidGZfc3RyX2J5X29mZnNldChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBvZmZzZXQpO1xuIDU4MzpcdHN0cnVjdCBidGYgKmJ0Zl9wYXJzZV92bWxpbnV4KHZvaWQpO1xuIDU4NDpcdHN0cnVjdCBidGYgKmJwZl9wcm9nX2dldF90YXJnZXRfYnRmKGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XG4gNTg1Olx0dTMyICpidGZfa2Z1bmNfZmxhZ3MoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIga2Z1bmNfYnRmX2lkLCBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpO1xuIDU4NjpcdGludCBidGZfa2Z1bmNfY2hlY2tfZmxhZyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsIHUzMiBmbGFnKTtcbiA1ODc6XHRib29sIGJ0Zl9rZnVuY19pc19hbGxvd2VkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCwgY29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nKTtcbiA1ODg6XHR1MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcbiA1ODk6XHRcdFx0XHRcdGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XG4gNTkwOlx0aW50IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcbiA1OTE6XHRcdFx0XHQgICAgICBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqcyk7XG4gNTkyOlx0aW50IHJlZ2lzdGVyX2J0Zl9mbW9kcmV0X2lkX3NldChjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldCk7XG4gNTkzOlx0czMyIGJ0Zl9maW5kX2R0b3Jfa2Z1bmMoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgYnRmX2lkKTtcbiA1OTQ6XHRpbnQgcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGNvbnN0IHN0cnVjdCBidGZfaWRfZHRvcl9rZnVuYyAqZHRvcnMsIHUzMiBhZGRfY250LFxuIDU5NTpcdFx0XHRcdFx0c3RydWN0IG1vZHVsZSAqb3duZXIpO1xuIDU5NjpcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKmJ0Zl9maW5kX3N0cnVjdF9tZXRhKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZCk7XG4gNTk3Olx0Ym9vbCBidGZfaXNfcHJvamVjdGlvbl9vZihjb25zdCBjaGFyICpwbmFtZSwgY29uc3QgY2hhciAqdG5hbWUpO1xuIDU5ODpcdGJvb2wgYnRmX2lzX3Byb2dfY3R4X3R5cGUoc3RydWN0IGJwZl92ZXJpZmllcl9sb2cgKmxvZywgY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxuIDU5OTpcdFx0XHRcdCAgIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCwgZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcbiA2MDA6XHRcdFx0XHQgICBpbnQgYXJnKTtcbiA2MDE6XHRpbnQgZ2V0X2tlcm5fY3R4X2J0Zl9pZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2xvZyAqbG9nLCBlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlKTtcbiA2MDI6XHRib29sIGJ0Zl90eXBlc19hcmVfc2FtZShjb25zdCBzdHJ1Y3QgYnRmICpidGYxLCB1MzIgaWQxLFxuIDYwMzpcdFx0XHRcdGNvbnN0IHN0cnVjdCBidGYgKmJ0ZjIsIHUzMiBpZDIpO1xuIDYwNDpcdGludCBidGZfY2hlY2tfaXRlcl9hcmcoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmZ1bmMsIGludCBhcmdfaWR4KTtcbiA2MDU6XHRcbiA2MDY6XHRzdGF0aWMgaW5saW5lIGJvb2wgYnRmX3R5cGVfaXNfc3RydWN0X3B0cihzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdClcbiA2MDc6XHR7XG4gNjA4Olx0XHRpZiAoIWJ0Zl90eXBlX2lzX3B0cih0KSlcbiA2MDk6XHRcdFx0cmV0dXJuIGZhbHNlO1xuIDYxMDpcdFxuIDYxMTpcdFx0dCA9IGJ0Zl90eXBlX3NraXBfbW9kaWZpZXJzKGJ0ZiwgdC1cdTAwM2V0eXBlLCBOVUxMKTtcbiA2MTI6XHRcbiA2MTM6XHRcdHJldHVybiBidGZfdHlwZV9pc19zdHJ1Y3QodCk7XG4gNjE0Olx0fVxuIDYxNTpcdCNlbHNlXG4gNjE2Olx0c3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgYnRmX3R5cGUgKmJ0Zl90eXBlX2J5X2lkKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiA2MTc6XHRcdFx0XHRcdFx0XHQgICAgdTMyIHR5cGVfaWQpXG4gNjE4Olx0e1xuIDYxOTpcdFx0cmV0dXJuIE5VTEw7XG4gNjIwOlx0fVxuIDYyMTpcdFxuIDYyMjpcdHN0YXRpYyBpbmxpbmUgdm9pZCBidGZfc2V0X2Jhc2VfYnRmKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0ZiAqYmFzZV9idGYpXG4gNjIzOlx0e1xuIDYyNDpcdH1cbiA2MjU6XHRcbiA2MjY6XHRzdGF0aWMgaW5saW5lIGludCBidGZfcmVsb2NhdGUodm9pZCAqbG9nLCBzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGYgKmJhc2VfYnRmLFxuIDYyNzpcdFx0XHRcdCAgICAgICBfX3UzMiAqKm1hcF9pZHMpXG4gNjI4Olx0e1xuIDYyOTpcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDYzMDpcdH1cbiA2MzE6XHRcbiA2MzI6XHRzdGF0aWMgaW5saW5lIGludCBidGZfZmllbGRfaXRlcl9pbml0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQsIHN0cnVjdCBidGZfdHlwZSAqdCxcbiA2MzM6XHRcdFx0XHRcdCAgICAgIGVudW0gYnRmX2ZpZWxkX2l0ZXJfa2luZCBpdGVyX2tpbmQpXG4gNjM0Olx0e1xuIDYzNTpcdFx0cmV0dXJuIC1FT1BOT1RTVVBQO1xuIDYzNjpcdH1cbiA2Mzc6XHRcbiA2Mzg6XHRzdGF0aWMgaW5saW5lIF9fdTMyICpidGZfZmllbGRfaXRlcl9uZXh0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQpXG4gNjM5Olx0e1xuIDY0MDpcdFx0cmV0dXJuIE5VTEw7XG4gNjQxOlx0fVxuIDY0MjpcdFxuIDY0MzpcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYnRmX25hbWVfYnlfb2Zmc2V0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcbiA2NDQ6XHRcdFx0XHRcdFx0ICAgICB1MzIgb2Zmc2V0KVxuIDY0NTpcdHtcbiA2NDY6XHRcdHJldHVybiBOVUxMO1xuIDY0NzpcdH1cbiA2NDg6XHRzdGF0aWMgaW5saW5lIHUzMiAqYnRmX2tmdW5jX2lkX3NldF9jb250YWlucyhjb25zdCBzdHJ1Y3QgYnRmICpidGYsXG4gNjQ5Olx0XHRcdFx0XHRcdCAgICAgdTMyIGtmdW5jX2J0Zl9pZCxcbiA2NTA6XHRcdFx0XHRcdFx0ICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXG4gNjUxOlx0XG4gNjUyOlx0e1xuIDY1MzpcdFx0cmV0dXJuIE5VTEw7XG4gNjU0Olx0fVxuIDY1NTpcdHN0YXRpYyBpbmxpbmUgaW50IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcbiA2NTY6XHRcdFx0XHRcdFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxuIDY1NzpcdHtcbiA2NTg6XHRcdHJldHVybiAwO1xuIDY1OTpcdH1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjQyNzQKCQkJCQkJCW91dHB1dDogMzYKCQkJCQkJCXRob3VnaHRzOiAyNQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRoYXQgY29kZSBzbmlwcGV0OgoKKipEaXZpbmcgaW50byBgYnRmLmhgJiMzOTtzIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uKioKCk9rYXksIHNvIEkmIzM5O20gZ2V0dGluZyByZWFkeSB0byBwb2tlIGFyb3VuZCBpbiB0aGUgYGluY2x1ZGUvbGludXgvYnRmLmhgIGZpbGUsIHNwZWNpZmljYWxseSB0aGUgYCNpZmRlZmAgYmxvY2tzLiBJIHdhbnQgdG8gc2VlIHdoYXQmIzM5O3MgYmVpbmcgY29uZGl0aW9uYWxseSBjb21waWxlZCBhbmQgd2h5LiBUaGlzIGlzIGxpa2VseSB3aGVyZSB0aGUgY29yZSBvZiB0aGUgQlRGIChCUEYgVHlwZSBGb3JtYXQpIGRlZmluaXRpb25zIGFuZCByZWxhdGVkIHN0cnVjdHVyZXMgYXJlIGRlY2xhcmVkLCBvciBtYXliZSBpdCBzZXRzIHVwIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBiYXNlZCBvbiBrZXJuZWwgZmVhdHVyZXMgb3IgY29tcGlsZS10aW1lIG9wdGlvbnMuIEkmIzM5O20gZXhwZWN0aW5nIHRvIGZpbmQgYSBsb3Qgb2YgZXNzZW50aWFsIGRhdGEgc3RydWN0dXJlcyBhbmQgcG9zc2libHkgc29tZSBtYWNybyBkZWZpbml0aW9ucyB0aGF0IHJlYWxseSBkcml2ZSB0aGUgQlRGIGhhbmRsaW5nIGF0IHRoZSBsb3dlc3QgbGV2ZWxzLiBJJiMzOTtsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbmRpdGlvbnMgdGhhdCB0cmlnZ2VyIHRoZXNlIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhbmQgaG93IHRoZXkgaW1wYWN0IHRoZSBvdmVyYWxsIEJURiBpbXBsZW1lbnRhdGlvbi4gVGltZSB0byBkaWcgaW4hCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQxPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9idGYuaCYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDU0MCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNTQwOlx0c3RydWN0IGJwZl9zdHJ1Y3Rfb3BzO1xuIDU0MTpcdGludCBfX3JlZ2lzdGVyX2JwZl9zdHJ1Y3Rfb3BzKHN0cnVjdCBicGZfc3RydWN0X29wcyAqc3Rfb3BzKTtcbiA1NDI6XHRjb25zdCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHNfZGVzYyAqYnBmX3N0cnVjdF9vcHNfZmluZF92YWx1ZShzdHJ1Y3QgYnRmICpidGYsIHUzMiB2YWx1ZV9pZCk7XG4gNTQzOlx0Y29uc3Qgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzX2Rlc2MgKmJwZl9zdHJ1Y3Rfb3BzX2ZpbmQoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdHlwZV9pZCk7XG4gNTQ0Olx0I2Vsc2VcbiA1NDU6XHRzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBicGZfc3RydWN0X29wc19kZXNjICpicGZfc3RydWN0X29wc19maW5kKHN0cnVjdCBidGYgKmJ0ZiwgdTMyIHR5cGVfaWQpXG4gNTQ2Olx0e1xuIDU0NzpcdFx0cmV0dXJuIE5VTEw7XG4gNTQ4Olx0fVxuIDU0OTpcdCNlbmRpZlxuIDU1MDpcdFxuIDU1MTpcdGVudW0gYnRmX2ZpZWxkX2l0ZXJfa2luZCB7XG4gNTUyOlx0XHRCVEZfRklFTERfSVRFUl9JRFMsXG4gNTUzOlx0XHRCVEZfRklFTERfSVRFUl9TVFJTLFxuIDU1NDpcdH07XG4gNTU1Olx0XG4gNTU2Olx0c3RydWN0IGJ0Zl9maWVsZF9kZXNjIHtcbiA1NTc6XHRcdC8qIG9uY2UtcGVyLXR5cGUgb2Zmc2V0cyAqL1xuIDU1ODpcdFx0aW50IHRfb2ZmX2NudCwgdF9vZmZzWzJdO1xuIDU1OTpcdFx0LyogbWVtYmVyIHN0cnVjdCBzaXplLCBvciB6ZXJvLCBpZiBubyBtZW1iZXJzICovXG4gNTYwOlx0XHRpbnQgbV9zejtcbiA1NjE6XHRcdC8qIHJlcGVhdGVkIHBlci1tZW1iZXIgb2Zmc2V0cyAqL1xuIDU2MjpcdFx0aW50IG1fb2ZmX2NudCwgbV9vZmZzWzFdO1xuIDU2MzpcdH07XG4gNTY0Olx0XG4gNTY1Olx0c3RydWN0IGJ0Zl9maWVsZF9pdGVyIHtcbiA1NjY6XHRcdHN0cnVjdCBidGZfZmllbGRfZGVzYyBkZXNjO1xuIDU2NzpcdFx0dm9pZCAqcDtcbiA1Njg6XHRcdGludCBtX2lkeDtcbiA1Njk6XHRcdGludCBvZmZfaWR4O1xuIDU3MDpcdFx0aW50IHZsZW47XG4gNTcxOlx0fTtcbiA1NzI6XHRcbiA1NzM6XHQjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMXG4gNTc0Olx0Y29uc3Qgc3RydWN0IGJ0Zl90eXBlICpidGZfdHlwZV9ieV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiB0eXBlX2lkKTtcbiA1NzU6XHR2b2lkIGJ0Zl9zZXRfYmFzZV9idGYoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0Zik7XG4gNTc2Olx0aW50IGJ0Zl9yZWxvY2F0ZShzdHJ1Y3QgYnRmICpidGYsIGNvbnN0IHN0cnVjdCBidGYgKmJhc2VfYnRmLCBfX3UzMiAqKm1hcF9pZHMpO1xuIDU3NzpcdGludCBidGZfZmllbGRfaXRlcl9pbml0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQsIHN0cnVjdCBidGZfdHlwZSAqdCxcbiA1Nzg6XHRcdFx0XHRlbnVtIGJ0Zl9maWVsZF9pdGVyX2tpbmQgaXRlcl9raW5kKTtcbiA1Nzk6XHRfX3UzMiAqYnRmX2ZpZWxkX2l0ZXJfbmV4dChzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIgKml0KTtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjUyNDUKCQkJCQkJCW91dHB1dDogMzMKCQkJCQkJCXRob3VnaHRzOiA0MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBCVEYgYW5kIERlYnVnIEluZm9ybWF0aW9uIFJlcXVpcmVtZW50cyoqCgpSaWdodCwgc28gSSBuZWVkIHRvIGNsYXJpZnkgc29tZXRoaW5nIGFib3V0IHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgYW5kIGtmdW5jcyAoa2VybmVsIGZ1bmN0aW9ucykuIEkmIzM5O20gcHJldHR5IHN1cmUgSSBoYXZlIGEgaGFuZGxlIG9uIHRoaXMsIGJ1dCBsZXQmIzM5O3MganVzdCBtYWtlIGFic29sdXRlbHkgc3VyZSwgYW5kIGRvdWJsZSBjaGVjayBteSBhc3N1bXB0aW9uIHJlZ2FyZGluZyB0aGUgYERFQlVHX0lORk9fQlRGYCBjb25maWd1cmF0aW9uIG9wdGlvbi4gSSBuZWVkIHRvIGtub3cgaWYgaXQmIzM5O3Mgc3RyaWN0bHkgKnJlcXVpcmVkKiBmb3IgQlRGIGtmdW5jIGZ1bmN0aW9uYWxpdHkgd2l0aGluIHRoZSBrZXJuZWwgaXRzZWxmLgoKTXkgZ3V0IGZlZWxpbmcgaXMgdGhhdCBpdCBpc24mIzM5O3QuIEJURiBzdXBwb3J0IGhhcyBiZWVuIGV2b2x2aW5nLCBhbmQgSSBoYXZlIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBtaWdodCBoYXZlIGRlY291cGxlZCBmcm9tIHJlcXVpcmluZyB0aGlzIHBhcnRpY3VsYXIgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBlc3BlY2lhbGx5IGdpdmVuIHJlY2VudCBvcHRpbWl6YXRpb24gZWZmb3J0cy4gSG93ZXZlciwgbGV0JiMzOTtzIG5vdCByZWx5IG9uIGludHVpdGlvbiBhbG9uZS4gVGhlIGRlZmluaXRpdmUgYW5zd2VyIGlzIGFsd2F5cyB3aXRoaW4gdGhlIGNvZGUuIFRpbWUgdG8gZGlnIGludG8gdGhlIGtlcm5lbCBzb3VyY2UsIHNwZWNpZmljYWxseSBga2VybmVsL2JwZi9idGYuY2AuIFRoYXQmIzM5O3MgdGhlIGxvZ2ljYWwgcGxhY2UgdG8gc3RhcnQg4oCTIGl0JiMzOTtzIHRoZSBoZWFydCBvZiB0aGUgQlRGIGltcGxlbWVudGF0aW9uLiBJJiMzOTtsbCBuZWVkIHRvIGNhcmVmdWxseSBleGFtaW5lIHRoZSBjb2RlIGluIGBidGYuY2AsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIHJlbGV2YW50IGNvbXBpbGF0aW9uIGZsYWdzIGFuZCBjb25kaXRpb25hbCBzdGF0ZW1lbnRzLCBhbmQgcGlucG9pbnQgYW55IGRlcGVuZGVuY2llcyBvciBlcnJvciBoYW5kbGluZyByZWxhdGVkIHRvIGBERUJVR19JTkZPX0JURmAuIE9ubHkgdGhlbiBjYW4gSSBiZSBjZXJ0YWluIHdoZXRoZXIgdGhlIG9wdGlvbiBpcyBzdHJpY3RseSBhIHJlcXVpcmVtZW50IG9yIG1vcmUgb2YgYW4gb3B0aW9uYWwgZW5oYW5jZW1lbnQgZm9yIHRoZSBCVEYga2Z1bmMgY2FwYWJpbGl0aWVzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtDT05GSUdfREVCVUdfSU5GT19CVEYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtrZXJuZWwvYnBmLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDtrZXJuZWwvYnBmL01ha2VmaWxlPTQzPWlmZXEgKCQoQ09ORklHX1NZU0ZTKSx5KVxua2VybmVsL2JwZi9NYWtlZmlsZTo0NDpvYmotJChDT05GSUdfREVCVUdfSU5GT19CVEYpICYjNDM7PSBzeXNmc19idGYub1xua2VybmVsL2JwZi9NYWtlZmlsZS00NS1lbmRpZlxuLS1cbmtlcm5lbC9icGYvYnRmLmM9NjQwMT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY0MDYtXG5rZXJuZWwvYnBmL2J0Zi5jOjY0MDc6XHRpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSlcbmtlcm5lbC9icGYvYnRmLmMtNjQwOC1cdFx0cmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7XG4tLVxua2VybmVsL2JwZi9idGYuYz02NDg3PV9fdTMyIGJ0Zl9yZWxvY2F0ZV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIF9fdTMyIGlkKVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtNjQ5My1cbmtlcm5lbC9icGYvYnRmLmM6NjQ5NDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtNjQ5NS1cbmtlcm5lbC9icGYvYnRmLmM9NjQ5Nj1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX21vZHVsZShjb25zdCBjaGFyICptb2R1bGVfbmFtZSwgY29uc3Qgdm9pZCAqZGF0YSxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTY1OTEtXG5rZXJuZWwvYnBmL2J0Zi5jOjY1OTI6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXG5rZXJuZWwvYnBmL2J0Zi5jLTY1OTMtXG4tLVxua2VybmVsL2JwZi9idGYuYz04NTAyPWVudW0ge1xuLS1cbmtlcm5lbC9icGYvYnRmLmMtODUwNS1cbmtlcm5lbC9icGYvYnRmLmM6ODUwNjojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcbmtlcm5lbC9icGYvYnRmLmMtODUwNy1zdHJ1Y3QgYnRmX21vZHVsZSB7XG4tLVxua2VybmVsL2JwZi9idGYuYz04NjQ0PWZzX2luaXRjYWxsKGJ0Zl9tb2R1bGVfaW5pdCk7XG5rZXJuZWwvYnBmL2J0Zi5jOjg2NDU6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NDYtXG5rZXJuZWwvYnBmL2J0Zi5jPTg2NDc9c3RydWN0IG1vZHVsZSAqYnRmX3RyeV9nZXRfbW9kdWxlKGNvbnN0IHN0cnVjdCBidGYgKmJ0Zilcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg2NDktXHRzdHJ1Y3QgbW9kdWxlICpyZXMgPSBOVUxMO1xua2VybmVsL2JwZi9idGYuYzo4NjUwOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04NjUxLVx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XG4tLVxua2VybmVsL2JwZi9idGYuYz04Njc3PXN0cnVjdCBidGYgKmJ0Zl9nZXRfbW9kdWxlX2J0Zihjb25zdCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpXG5rZXJuZWwvYnBmL2J0Zi5jLTg2Nzgte1xua2VybmVsL2JwZi9idGYuYzo4Njc5OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04NjgwLVx0c3RydWN0IGJ0Zl9tb2R1bGUgKmJ0Zl9tb2QsICp0bXA7XG4tLVxua2VybmVsL2JwZi9idGYuYy04NjkwLVxua2VybmVsL2JwZi9idGYuYzo4NjkxOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xua2VybmVsL2JwZi9idGYuYy04NjkyLVx0bXV0ZXhfbG9jayhcdTAwMjZidGZfbW9kdWxlX211dGV4KTtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jPTg3MDc9c3RhdGljIGludCBjaGVja19idGZfa2NvbmZpZ3MoY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kdWxlLCBjb25zdCBjaGFyICpmZWF0dXJlKVxua2VybmVsL2JwZi9idGYuYy04NzA4LXtcbmtlcm5lbC9icGYvYnRmLmM6ODcwOTpcdGlmICghbW9kdWxlIFx1MDAyNlx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpIHtcbmtlcm5lbC9icGYvYnRmLmMtODcxMC1cdFx0cHJfZXJyKFwmIzM0O21pc3Npbmcgdm1saW51eCBCVEYsIGNhbm5vdCByZWdpc3RlciAlc1xcblwmIzM0OywgZmVhdHVyZSk7XG4tLVxua2VybmVsL2JwZi9idGYuYy04NzEyLVx0fVxua2VybmVsL2JwZi9idGYuYzo4NzEzOlx0aWYgKG1vZHVsZSBcdTAwMjZcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFUykpXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MTQtXHRcdHByX3dhcm4oXCYjMzQ7bWlzc2luZyBtb2R1bGUgQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXG5cJiMzNDssIGZlYXR1cmUpO1xuLS1cbmtlcm5lbC9icGYvYnRmLmM9ODg1ND1zdGF0aWMgaW50IGJ0Zl9jaGVja19rZnVuY19uYW1lKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3QgY2hhciAqZnVuY19uYW1lLCB1MzIga2luZClcbmtlcm5lbC9icGYvYnRmLmMtODg1NS17XG5rZXJuZWwvYnBmL2J0Zi5jOjg4NTY6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NTctXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NzAtXG5rZXJuZWwvYnBmL2J0Zi5jOjg4NzE6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTg4NzItXHRndWFyZChtdXRleCkoXHUwMDI2YnRmX21vZHVsZV9tdXRleCk7XG4tLVxua2VybmVsL2JwZi9idGYuYz05NTE5PXN0YXRpYyBzdHJ1Y3QgYnBmX2NhbmRfY2FjaGUgKnBvcHVsYXRlX2NhbmRfY2FjaGUoc3RydWN0IGJwZl9jYW5kX2NhY2hlICpjYW5kcyxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTk1NDYtXG5rZXJuZWwvYnBmL2J0Zi5jOjk1NDc6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXG5rZXJuZWwvYnBmL2J0Zi5jLTk1NDgtc3RhdGljIHZvaWQgX19wdXJnZV9jYW5kX2NhY2hlKHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJwZl9jYW5kX2NhY2hlICoqY2FjaGUsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTI4MzY9aW50IGJwZl9hZGRfa2Z1bmNfY2FsbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgZnVuY19pZCwgdTE2IG9mZnNldClcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMjg1Mi1cdFx0aWYgKCFidGZfdm1saW51eCkge1xua2VybmVsL2JwZi92ZXJpZmllci5jOjI4NTM6XHRcdFx0dmVyYm9zZShlbnYsIFwmIzM0O2NhbGxpbmcga2VybmVsIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXG5cJiMzNDspO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NTQtXHRcdFx0cmV0dXJuIC1FTk9UU1VQUDtcbi0tXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9NjE5MD1zdGF0aWMgaW50IGNoZWNrX3B0cl90b19tYXBfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTYyMDQtXHRpZiAoIWJ0Zl92bWxpbnV4KSB7XG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6NjIwNTpcdFx0dmVyYm9zZShlbnYsIFwmIzM0O21hcF9wdHIgYWNjZXNzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXG5cJiMzNDspO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTYyMDYtXHRcdHJldHVybiAtRU5PVFNVUFA7XG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jPTE4ODQ4PXN0YXRpYyBpbnQgY2hlY2tfcHNldWRvX2J0Zl9pZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LFxuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0xODg2NC1cdFx0aWYgKCFidGZfdm1saW51eCkge1xua2VybmVsL2JwZi92ZXJpZmllci5jOjE4ODY1Olx0XHRcdHZlcmJvc2UoZW52LCBcJiMzNDtrZXJuZWwgaXMgbWlzc2luZyBCVEYsIG1ha2Ugc3VyZSBDT05GSUdfREVCVUdfSU5GT19CVEY9eSBpcyBzcGVjaWZpZWQgaW4gS2NvbmZpZy5cXG5cJiMzNDspO1xua2VybmVsL2JwZi92ZXJpZmllci5jLTE4ODY2LVx0XHRcdHJldHVybiAtRUlOVkFMO1xuLS1cbmtlcm5lbC9icGYvdmVyaWZpZXIuYz0yMDc1Nj1zdHJ1Y3QgYnRmICpicGZfZ2V0X2J0Zl92bWxpbnV4KHZvaWQpXG4tLVxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwNzYwLVxua2VybmVsL2JwZi92ZXJpZmllci5jOjIwNzYxOlx0aWYgKCFidGYgXHUwMDI2XHUwMDI2IElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSkge1xua2VybmVsL2JwZi92ZXJpZmllci5jLTIwNzYyLVx0XHRtdXRleF9sb2NrKFx1MDAyNmJ0Zl92bWxpbnV4X2xvY2spO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzU2OAoJCQkJCQkJb3V0cHV0OiAyOQoJCQkJCQkJdGhvdWdodHM6IDU2CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLgoKKipNeSBJbml0aWFsIEFzc2Vzc21lbnQqKgoKQWxyaWdodCwgSSYjMzk7bSBsb29raW5nIGF0IGEgZmV3IGtlcm5lbCBjb25maWd1cmF0aW9ucyDigJMgYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfTUVNQ0dgLCBhbmQgYENPTkZJR19ERUJVR19JTkZPX0JURmAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCAmIzM0O1doYXQmIzM5O3MgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlPyYjMzQ7IEl0IGxvb2tzIGxpa2UgSSBtaWdodCBiZSB0cnlpbmcgdG8gdW5kZXJzdGFuZCBob3cgdGhlc2UgZmVhdHVyZSBmbGFncyBpbnRlcmFjdC4gTXkgaW50dWl0aW9uIHRlbGxzIG1lIHRoYXQgYENPTkZJR19ERUJVR19JTkZPX0JURmAgaXMgdGhlIG1vc3QgY29tcGxleCBvbmUgYW5kIHBvc3NpYmx5IGhhcyBkZXBlbmRlbmNpZXMsIGxldCBtZSBjaGVjayB0aGUgYGxpYi9LY29uZmlnLmRlYnVnYCBmaWxlIHRvIHNlZSB3aGF0IHRoZSBkZXBlbmRlbmNpZXMgYXJlLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgREVCVUdfSU5GT19CVEYmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDtsaWIvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2xpYi9LY29uZmlnLmRlYnVnPTM3OD1jb25maWcgREVCVUdfSU5GT19TUExJVFxuLS1cbmxpYi9LY29uZmlnLmRlYnVnLTM5Ny1cbmxpYi9LY29uZmlnLmRlYnVnOjM5ODpjb25maWcgREVCVUdfSU5GT19CVEZcbmxpYi9LY29uZmlnLmRlYnVnLTM5OS1cdGJvb2wgXCYjMzQ7R2VuZXJhdGUgQlRGIHR5cGUgaW5mb3JtYXRpb25cJiMzNDtcbi0tXG5saWIvS2NvbmZpZy5kZWJ1Zz00MTk9Y29uZmlnIFBBSE9MRV9IQVNfTEFOR19FWENMVURFXG4tLVxubGliL0tjb25maWcuZGVidWctNDI3LVxubGliL0tjb25maWcuZGVidWc6NDI4OmNvbmZpZyBERUJVR19JTkZPX0JURl9NT0RVTEVTXG5saWIvS2NvbmZpZy5kZWJ1Zy00MjktXHRib29sIFwmIzM0O0dlbmVyYXRlIEJURiB0eXBlIGluZm9ybWF0aW9uIGZvciBrZXJuZWwgbW9kdWxlc1wmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyNzk1MwoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBLY29uZmlnLmRlYnVnIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGZvciBzb21ldGhpbmcgcmVsYXRlZCB0byB0aGUgZGVidWcgY29uZmlndXJhdGlvbi4gVGltZSB0byBoZWFkIG92ZXIgdG8gYGxpYi9LY29uZmlnLmRlYnVnYC4gU3BlY2lmaWNhbGx5LCBJJiMzOTttIGdvaW5nIHRvIHplcm8gaW4gb24gbGluZXMgMzkwIHRvIDQxMC4gVGhhdCYjMzk7cyB1c3VhbGx5IGEgZ29vZCByYW5nZSB0byBzdGFydCB3aXRoIHdoZW4gSSYjMzk7bSBjaGFzaW5nIGRvd24gZGVwZW5kZW5jaWVzIGluIGEgS2NvbmZpZyBmaWxlLiBMZXQmIzM5O3Mgc2VlIHdoYXQgdGhlIGBkZXBlbmRzIG9uYCBjbGF1c2VzIHJldmVhbCB0aGVyZS4gSG9wZWZ1bGx5LCBpdCYjMzk7cyBzdHJhaWdodGZvcndhcmQsIGFuZCBJIGNhbiBxdWlja2x5IHRyYWNlIHdoYXQgY29uZGl0aW9ucyBuZWVkIHRvIGJlIG1ldCBmb3IgdGhpcyBkZWJ1ZyBvcHRpb24gdG8gYmUgZW5hYmxlZC4gVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCB3b3JrIGJlZ2lucywgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCBvdGhlciBvcHRpb25zIGFyZSBpbXBhY3RlZCBhbmQgaWYgdGhleSBhcmUgcmVsZXZhbnQgdG8gdGhpcyBjdXJyZW50IGZvY3VzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI2LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O2xpYi9LY29uZmlnLmRlYnVnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMzk1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDIwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyAzOTU6XHRcdCAgdG8ga25vdyBhYm91dCB0aGUgLmR3byBmaWxlcyBhbmQgaW5jbHVkZSB0aGVtLlxuIDM5NjpcdFx0ICBJbmNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiBjY2FjaGUuXG4gMzk3Olx0XG4gMzk4Olx0Y29uZmlnIERFQlVHX0lORk9fQlRGXG4gMzk5Olx0XHRib29sIFwmIzM0O0dlbmVyYXRlIEJURiB0eXBlIGluZm9ybWF0aW9uXCYjMzQ7XG4gNDAwOlx0XHRkZXBlbmRzIG9uICFERUJVR19JTkZPX1NQTElUIFx1MDAyNlx1MDAyNiAhREVCVUdfSU5GT19SRURVQ0VEXG4gNDAxOlx0XHRkZXBlbmRzIG9uICFHQ0NfUExVR0lOX1JBTkRTVFJVQ1QgfHwgQ09NUElMRV9URVNUXG4gNDAyOlx0XHRkZXBlbmRzIG9uIEJQRl9TWVNDQUxMXG4gNDAzOlx0XHRkZXBlbmRzIG9uIFBBSE9MRV9WRVJTSU9OIFx1MDAzZT0gMTIyXG4gNDA0Olx0XHQjIHBhaG9sZSB1c2VzIGVsZnV0aWxzLCB3aGljaCBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIEhleGFnb24gcmVsb2NhdGlvbnNcbiA0MDU6XHRcdGRlcGVuZHMgb24gIUhFWEFHT05cbiA0MDY6XHRcdGhlbHBcbiA0MDc6XHRcdCAgR2VuZXJhdGUgZGVkdXBsaWNhdGVkIEJURiB0eXBlIGluZm9ybWF0aW9uIGZyb20gRFdBUkYgZGVidWcgaW5mby5cbiA0MDg6XHRcdCAgVHVybmluZyB0aGlzIG9uIHJlcXVpcmVzIHBhaG9sZSB2MS4yMiBvciBsYXRlciwgd2hpY2ggd2lsbCBjb252ZXJ0XG4gNDA5Olx0XHQgIERXQVJGIHR5cGUgaW5mbyBpbnRvIGVxdWl2YWxlbnQgZGVkdXBsaWNhdGVkIEJURiB0eXBlIGluZm8uXG4gNDEwOlx0XG4gNDExOlx0Y29uZmlnIFBBSE9MRV9IQVNfQlRGX1RBR1xuIDQxMjpcdFx0ZGVmX2Jvb2wgUEFIT0xFX1ZFUlNJT04gXHUwMDNlPSAxMjNcbiA0MTM6XHRcdGRlcGVuZHMgb24gQ0NfSVNfQ0xBTkdcbiA0MTQ6XHRcdGhlbHBcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjg1MjgKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aG9zZSB0aG91Z2h0cywgc3VtbWFyaXplZCBmcm9tIGEgZmlyc3QtcGVyc29uIGV4cGVydCBwZXJzcGVjdGl2ZToKCioqS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzOiBCUEYgYW5kIEJleW9uZCoqCgpBbHJpZ2h0LCBzbyBJJiMzOTttIHRoaW5raW5nIGFib3V0IHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzcGVjaWZpY2FsbHkgYENPTkZJR19CUEZgLiBUaGlzIGtlZXBzIHBvcHBpbmcgdXAsIGFuZCBpdCYjMzk7cyBhIGNyaXRpY2FsIGZvdW5kYXRpb25hbCBlbGVtZW50LiBJIGtub3cgYEJQRl9TWVNDQUxMYCByZWxpZXMgb24gYEJQRmAsIHdoaWNoIGltbWVkaWF0ZWx5IHN1Z2dlc3RzIGEgZGVwZW5kZW5jeS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IHRoZXNlIG9wdGlvbnMgaW50ZXJhY3QgYW5kIHdoYXQgb3RoZXIgcmVsYXRlZCBvcHRpb25zIGV4aXN0LiBCZXN0IHRvIGRpdmUgaW50byB0aGUgY29yZSBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBMZXQgbWUgY2hlY2sgdGhlIGBrZXJuZWwvYnBmL0tjb25maWdgIGZpbGUuIFRoYXQmIzM5O3Mgd2hlcmUgYWxsIHRoZSBkZXRhaWxzIGFib3V0IEJQRiBjb25maWd1cmF0aW9uIHNob3VsZCBiZSBsYWlkIG91dC4gVW5kZXJzdGFuZGluZyB0aGUgZGVwZW5kZW5jeSBjaGFpbiBoZXJlIGlzIGtleSB0byBhIHJvYnVzdCBhbmQgZWZmaWNpZW50IGtlcm5lbCBidWlsZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDtrZXJuZWwvYnBmL0tjb25maWcmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiAyNQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgIDI1Olx0IyBkZWZhdWx0IGZvciBrZXJuZWxzIHRoYXQgd2VyZSBjb21waWxlZCB3aXRoIEJQRiBKSVQgc3VwcG9ydC5cbiAgMjY6XHRjb25maWcgQVJDSF9XQU5UX0RFRkFVTFRfQlBGX0pJVFxuICAyNzpcdFx0Ym9vbFxuICAyODpcdFxuICAyOTpcdG1lbnUgXCYjMzQ7QlBGIHN1YnN5c3RlbVwmIzM0O1xuICAzMDpcdFxuICAzMTpcdGNvbmZpZyBCUEZfU1lTQ0FMTFxuICAzMjpcdFx0Ym9vbCBcJiMzNDtFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcJiMzNDtcbiAgMzM6XHRcdHNlbGVjdCBCUEZcbiAgMzQ6XHRcdHNlbGVjdCBJUlFfV09SS1xuICAzNTpcdFx0c2VsZWN0IE5FRURfVEFTS1NfUkNVXG4gIDM2Olx0XHRzZWxlY3QgVEFTS1NfVFJBQ0VfUkNVXG4gIDM3Olx0XHRzZWxlY3QgQklOQVJZX1BSSU5URlxuICAzODpcdFx0c2VsZWN0IE5FVF9TT0NLX01TRyBpZiBORVRcbiAgMzk6XHRcdHNlbGVjdCBORVRfWEdSRVNTIGlmIE5FVFxuICA0MDpcdFx0c2VsZWN0IFBBR0VfUE9PTCBpZiBORVRcbiAgNDE6XHRcdGRlZmF1bHQgblxuICA0MjpcdFx0aGVscFxuICA0MzpcdFx0ICBFbmFibGUgdGhlIGJwZigpIHN5c3RlbSBjYWxsIHRoYXQgYWxsb3dzIHRvIG1hbmlwdWxhdGUgQlBGIHByb2dyYW1zXG4gIDQ0Olx0XHQgIGFuZCBtYXBzIHZpYSBmaWxlIGRlc2NyaXB0b3JzLlxuICA0NTpcdFxuICA0NjpcdGNvbmZpZyBCUEZfSklUXG4gIDQ3Olx0XHRib29sIFwmIzM0O0VuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXCYjMzQ7XG4gIDQ4Olx0XHRkZXBlbmRzIG9uIEJQRlxuICA0OTpcdFx0ZGVwZW5kcyBvbiBIQVZFX0NCUEZfSklUIHx8IEhBVkVfRUJQRl9KSVRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDE8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjkwOTAKCQkJCQkJCW91dHB1dDogMTM0CgkJCQkJCQl0aG91Z2h0czogODU5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkZ1enppbmcgQW5hbHlzaXM6IEJQRi1CYXNlZCBQcm9hY3RpdmUgTWVtb3J5IFJlY2xhaW0qKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgYW5hbHlzaXMgaW5kaWNhdGVzIGEgbmV3IGF2ZW51ZSBmb3IgbWVtb3J5IHJlY2xhaW0gd2l0aGluIHRoZSBrZXJuZWwsIGxldmVyYWdpbmcgQlBGIGNhcGFiaWxpdGllcy4gVGhlIGtleSBjb25maWd1cmF0aW9ucyBpbnZvbHZlZCBhcmUgYEJQRl9TWVNDQUxMYCwgYE1FTUNHYCwgYW5kIGBERUJVR19JTkZPX0JURmAuIFRoZXNlIGFyZSBlc3NlbnRpYWwgZm9yIHRoZSBmdW5jdGlvbmFsaXR5LgoKVGhlIHByaW1hcnkgZm9jdXMgaXMgdW5kZW5pYWJseSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gVGhpcyBmdW5jdGlvbiwgbm93IGV4cG9zZWQgYXMgYSBCUEYga2Z1bmMsIGlzICp0aGUqIGZvY2FsIHBvaW50LiBJdCYjMzk7cyB0aGUgbmV3IGVudHJ5IHBvaW50IGZvciBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhbWF0aW9uIHRyaWdnZXJlZCBmcm9tIHVzZXJzcGFjZSB2aWEgdGhlIGBicGYoKWAgc3lzY2FsbCwgc3BlY2lmaWNhbGx5IHVzaW5nIGEgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgcHJvZ3JhbSBvciBwb3RlbnRpYWxseSB0aHJvdWdoIHdvcmtxdWV1ZSBjYWxsYmFja3MuIFRoaXMgaXMgYSBjcnVjaWFsIGRpc3RpbmN0aW9uIGFuZCBhIHNpZ25pZmljYW50IGFkZGl0aW9uLiBJdCBjYWxscyBjb3JlIHJlY2xhaW0gbG9naWMuIFRoZXJlJiMzOTtzIGFsc28gcmVjdXJzaW9uIHByb3RlY3Rpb24sIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgdG8ga2VlcCB0aGluZ3Mgc3RhYmxlLgoKYGJwZl9tZW1jb250cm9sX2luaXRgIGlzIGFsc28gcHJlc2VudCwgYnV0IGJlY2F1c2UgaXQmIzM5O3MgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgaXQmIzM5O3Mgbm90IGEgc3VpdGFibGUgdGFyZ2V0IGZvciBzeXNjYWxsIGZ1enppbmcuIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCBpcyBzdGF0aWMgYW5kIGxpa2VseSBpbmxpbmVkLCBzbyBpdCYjMzk7cyBub3QgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZWl0aGVyLgoKRXNzZW50aWFsbHksIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIHByb3ZpZGVzIGEgdXNlcnNwYWNlLWluaXRpYXRlZCBtZWNoYW5pc20gdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgd2l0aGluIGEgbWVtY2csIHdoaWNoIGlzIGEgYmlnIGRlYWwgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlLiBJdCYjMzk7cyBhIEJQRiBrZnVuYyBjYWxsaW5nIHRoZSBjb3JlIHJlY2xhaW0gbG9naWMsIHNvIGl0JiMzOTtzIGEgZ29vZCBwbGFjZSB0byBzdGFydCBkaWdnaW5nLgoKVGhlcmVmb3JlLCBgV29ydGhGdXp6aW5nYCBpcyBkZWZpbml0ZWx5IGB0cnVlYCBoZXJlLiBUaGUgY29uZmlndXJhdGlvbiByZXF1aXJlbWVudHMgYXJlIGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgLiBBbmQgdGhlIHByaW1lIGBGb2N1c1N5bWJvbGAgaXMgdW5lcXVpdm9jYWxseSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQmIzM5O3Mgbm9uLXN0YXRpYywgYSBrZnVuYywgYW5kIHRoZSBjb3JlIG9mIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHksIHNvIGl0JiMzOTtzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiBUaGUgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4uLmAgYXJlIGZvciB1c2Vyc3BhY2Ugd2hpY2ggYXJlIGFsc28gbm90IGEgZm9jdXMgcG9pbnQgZm9yIHRoZSBrZXJuZWwgY29kZS4KCkkmIzM5O20gY29uZmlkZW50IGluIHRoZXNlIGZpbmRpbmdzLiBMZXQmIzM5O3MgZ2V0IHRoZSByZXN1bHRzIHNldC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDI8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKSwgYWxsb3dpbmcgc2xlZXBhYmxlIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBwcm9ncmFtcyB0byB0cmlnZ2VyIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gdmlhIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKS4gVGhpcyBtb2RpZmllcyByZWFjaGFibGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBjb2RlIGFuZCB3YXJyYW50cyBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtCUEZfU1lTQ0FMTCYjMzQ7LAogICAgJiMzNDtNRU1DRyYjMzQ7LAogICAgJiMzNDtERUJVR19JTkZPX0JURiYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2JwZl9wcm9hY3RpdmVfcmVjbGFpbSYjMzQ7CiAgXSwKICAmIzM0O1JlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGFsbG93aW5nIHNsZWVwYWJsZSBCUEZfUFJPR19UWVBFX1NZU0NBTEwgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IGNncm91cCByZWNsYWltIHZpYSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIEJQRiBzdWJzeXN0ZW0gY29kZSBhbmQgd2FycmFudHMgZnV6emluZy4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDUgMjA6NDI8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wNSAyMDo0MjwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgcmVhZHMsIGFuZCBubyB0cmFuc2ZlcnMgb2Yga2VybmVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgaXNzdWVzIChlLmcuLCBkZWFkbG9jaywgcmVjdXJzaW9uIGluIHJlY2xhaW0gY29udGV4dCwgcmVmY291bnRpbmcsIG9yIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSkgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcywgbm90IEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZQpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuYwppbmRleCA3MTZkZjQ5ZDc2NDc3Li45MmYzNWJhNjYzMDllIDEwMDY0NAotLS0gYS9tbS9icGZfbWVtY29udHJvbC5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2JwZl9tZW1jb250cm9sLmMKQEAgLTYsNiAmIzQzOzYsNyBAQAogICovCiAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L3N3YXAuaCZndDsKICNpbmNsdWRlICZsdDtsaW51eC9icGYuaCZndDsKIAogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwpAQCAtMTU5LDYgJiM0MzsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCiAJbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7CiB9CiAKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gbXVzdCBub3QgcmVjdXJzZTogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG92ZXJ3cml0ZXMKJiM0MzsgKiBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyCiYjNDM7ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQzsKJiM0MzsgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseQomIzQzOyAqIGJlZm9yZSBQRl9NRU1BTExPQy4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpCiYjNDM7ewomIzQzOwlyZXR1cm4gKGN1cnJlbnQtJmd0O2ZsYWdzICZhbXA7IFBGX01FTUFMTE9DKSB8fCBjdXJyZW50LSZndDtyZWNsYWltX3N0YXRlOwomIzQzO30KJiM0MzsKJiM0MzsvKioKJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5CiYjNDM7ICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwCiYjNDM7ICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tCiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0bwomIzQzOyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcykKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKgomIzQzOyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZwomIzQzOyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbQomIzQzOyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS4KJiM0MzsgKgomIzQzOyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnMKJiM0MzsgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlCiYjNDM7ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluCiYjNDM7ICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS4KJiM0MzsgKgomIzQzOyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyCiYjNDM7ICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXIKJiM0MzsgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzCiYjNDM7ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoCiYjNDM7ICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJCiYjNDM7ICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdAomIzQzOyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZgomIzQzOyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYKJiM0MzsgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcwomIzQzOyAqIGR5aW5nLgomIzQzOyAqCiYjNDM7ICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aAomIzQzOyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXMKJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwomIzQzOwomIzQzOwlpZiAoc2l6ZSAmbHQ7IFBBR0VfU0laRSB8fCB1bmxpa2VseShicGZfaW5fcmVjbGFpbV9jb250ZXh0KCkpKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BhZ2VzID0gbWluKHNpemUgLyBQQUdFX1NJWkUsICh1bnNpZ25lZCBsb25nKU1FTUNHX0NIQVJHRV9CQVRDSCk7CiYjNDM7CiYjNDM7CW5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLAomIzQzOwkJCQkJCSAgICBHRlBfS0VSTkVMLAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsCiYjNDM7CQkJCQkJICAgIE5VTEwpOwomIzQzOwomIzQzOwlyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTcxLDIyICYjNDM7MjQwLDQ0IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9tZW1vcnlfZXZlbnRzKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKQogQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpCiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSkKLQogQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQogCiYjNDM7LyoKJiM0MzsgKiBQcm9hY3RpdmUgcmVjbGFpbSBuZWVkcyBhIGNsZWFuIHByb2Nlc3MgY29udGV4dCwgc28gaXQgaXMgcmVzdHJpY3RlZAomIzQzOyAqIHRvIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTC4gVGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyB0aGF0IGEKJiM0MzsgKiBTWVNDQUxMIHByb2dyYW0gc2NoZWR1bGVzIHJ1biBhcyB0aGUgc2FtZSBwcm9ncmFtIHR5cGUsIHNvIHRoZXkgY2FuCiYjNDM7ICogc3RpbGwgaW52b2tlIGl0OyBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyAoZS5nLiBmZW50cnkgb24gcmVjbGFpbQomIzQzOyAqIHBhdGhzLCBpbm9kZV9ybWRpcikgY2Fubm90LgomIzQzOyAqLwomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jcywKIH07CiAKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7CiYjNDM7CS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLAomIzQzO307CiYjNDM7CiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiAJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTsKLQlpZiAoZXJyKQomIzQzOwlpZiAoZXJyKSB7CiAJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkJiMzNDssIGVycik7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl93YXJuKCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2Ci0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDY4NiBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7LyoKJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdAomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSICYjMzQ7L3RhcmdldCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlCiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kCiYjNDM7ICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXIKJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvCiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMCkKJiM0MzsjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwCiYjNDM7I2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHMKJiM0MzsgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcAomIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZQomIzQzOyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjImIzM5O3MKJiM0MzsgKiBuby1pbnRlcm5hbC1wcm9jZXNzIGNvbnN0cmFpbnQga2VlcHMgdGhlIHJlZmF1bHRpbmcgd29ya2xvYWQgb3V0IG9mCiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzZXR1cF9keWluZ19jZ3JvdXBzKHU2NCAqdHJpZ2dlcl9jZ3JvdXBfaWQsIHU2NCAqdGFyZ2V0X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CXByaW50ZigmIzM0OyUuNmZcbiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3cmIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7CiYjNDM7CWZwcmludGYoZnAsICYjMzQ7JS42ZiYjMzQ7LCBlbGFwc2VkKTsKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlGSUxFICpmcDsKJiM0MzsJY2hhciBidWZbNjRdOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7ciYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZwLCAmIzM0O2ZvcGVuJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksICYjMzQ7ZmdldHMmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CWlmIChzc2NhbmYoYnVmLCAmIzM0OyVsZiYjMzQ7LCB0aW1lKSAhPSAxKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7c3NjYW5mICVzJiMzNDssIGJ1Zik7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmY2xvc2UoZnApOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwljaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpOwomIzQzOwlwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7CiYjNDM7CXBpZF90IHdhaXRfcmV0OwomIzQzOwlpbnQgZmQsIHN0YXR1czsKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwomIzQzOwlzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJbG93X3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgJiMzNDtmb3JrIGxvdyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGxvd19waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGxvd190aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJaGlnaF9waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCAmIzM0O2ZvcmsgaGlnaCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGhpZ2hfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19ISUdIX0RJUiwgaGlnaF9kYXRhX2ZpbGUsCiYjNDM7CQkJCQkgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChsb3dfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2xvdyB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCwKJiM0MzsJICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuCiYjNDM7CSAqLwomIzQzOwlsb3dfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7bG93IGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2xvdyBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7aGlnaCB3YWl0cGlkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwkvKiBTYW1lIGFzIGFib3ZlOiB0aGUgcmVhcGVkIFBJRCBtdXN0IG5vdCBiZSBzaWduYWxlZCBhZ2Fpbi4gKi8KJiM0MzsJaGlnaF9waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtoaWdoIGV4aXRlZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CS8qIE9uIGZhaWx1cmUsIG1ha2Ugc3VyZSBubyBjaGlsZCBwcm9jZXNzIGlzIGxlZnQgYmVoaW5kICovCiYjNDM7CWlmIChyZXQpIHsKJiM0MzsJCWlmIChoaWdoX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJCWlmIChsb3dfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwobG93X3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTsKJiM0MzsJCX0KJiM0MzsJfQomIzQzOwl1bmxpbmsobG93X3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CXVubGluayhsb3dfZGF0YV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfZGF0YV9maWxlKTsKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludAomIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLAomIzQzOwkgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDsKJiM0MzsJc3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7CiYjNDM7CQkuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCwKJiM0MzsJCS5sb3dfY2dyb3VwX2lkID0gbG93X2Nncm91cF9pZCwKJiM0MzsJCS5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsCiYjNDM7CQkuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsCiYjNDM7CX07CiYjNDM7CUxJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cywKJiM0MzsJCS5jdHhfaW4gPSAmYW1wO2FyZ3MsCiYjNDM7CQkuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpOwomIzQzOwlpbnQgcHJvZ19pbml0X2ZkLCBlcnI7CiYjNDM7CiYjNDM7CXNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihza2VsLCAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQmIzM0OykpCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLSZndDtwcm9ncy53cV9wcm9nX2luaXQpOwomIzQzOwomIzQzOwllcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgJmFtcDtydW5fb3B0cyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgJiMzNDtwcm9nX2luaXQgcmV0dmFsJiMzNDspKQomIzQzOwkJZ290byBlcnJvcl9vdXQ7CiYjNDM7CiYjNDM7CSpza2VsX3B0ciA9IHNrZWw7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2Vycm9yX291dDoKJiM0MzsJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlpbnQgZXJyOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O2hpZ2ggY2dyb3VwIG5vdCBpbXByb3ZlZDogaGlnaD0lZiBsb3c9JWYmIzM0OywKJiM0MzsJCQkgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHMKJiM0MzsgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGUKJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzbwomIzQzOyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseQomIzQzOyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3AKJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkICE9IDApCiYjNDM7CQlyZXR1cm4gcGlkOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKQomIzQzOwkJX2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKQomIzQzOwkJCV9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kCiYjNDM7ICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZgomIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC4KJiM0MzsgKgomIzQzOyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kCiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZywKJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiByZWNsYWltX2NhbGxzIGdyb3dpbmcKJiM0MzsgKiB3aGlsZSB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmMKJiM0MzsgKiByZXR1cm5zIDAgb24gdGhlIGVtcHR5IHRhcmdldCwgYnV0IHRoZSBjYWxsIGlzIHN0aWxsIGNvdW50ZWQpLCBhbmQKJiM0MzsgKiBhZnRlciB0aGUgcmVtb3ZhbCB0aGUgc2tpcCBjb3VudGVycyBtdXN0IGdyb3cgd2hpbGUgcmVjbGFpbV9jYWxscwomIzQzOyAqIGFuZCByZWNsYWltZWRfYnl0ZXMgc3RheSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDsKJiM0MzsJdTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlOwomIzQzOwljaGFyIGRhdGFfZmlsZVtQQVRIX01BWF0gPSAmIzM0OyYjMzQ7OwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CXBpZF90IHJlYWRlcl9waWQgPSAtMTsKJiM0MzsJaW50IGVyciwgZmQsIGk7CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoJmFtcDt0cmlnZ2VyX2Nncm91cF9pZCwgJmFtcDt0YXJnZXRfY2dyb3VwX2lkKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2R5aW5nX2Nncm91cHMmIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfZHlpbmdfWFhYWFhYJiMzNDssIHdvcmtsb2FkX2ZpbGVzX2RpcigpKTsKJiM0MzsJZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlyZWFkZXJfcGlkID0gc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihkYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCAmIzM0O2Zvcmsga2VlcGFsaXZlIHJlYWRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMgJmd0OyAwKQomIzQzOwkJCWJyZWFrOwomIzQzOwkJdXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpOwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CiYjNDM7CS8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovCiYjNDM7CXVzbGVlcChEWUlOR19TRVRUTEVfVVMpOwomIzQzOwomIzQzOwljYWxsc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHM7CiYjNDM7CWJ5dGVzX2JlZm9yZSA9IHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRFlJTkdfUE9MTF9JVEVSUzsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWlmIChza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUgfHwKJiM0MzsJCSAgICBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fc2tpcHBlZF9keWluZykKJiM0MzsJCQlicmVhazsKJiM0MzsJCXVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSAmYW1wOyZhbXA7CiYjNDM7CSAgICAhc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX3NraXBwZWRfZHlpbmcpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSkmIzM0OywKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV90YXJnZXRfZ29uZSwKJiM0MzsJCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVjawomIzQzOwkgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgaXQgaXMgaGl0IGlzIHRpbWluZwomIzQzOwkgKiBkZXBlbmRlbnQsIGJlY2F1c2UgdGhlIGNncm91cCBtYXkgYWxyZWFkeSBiZSBmdWxseSByZWxlYXNlZCwgc28KJiM0MzsJICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC4KJiM0MzsJICovCiYjNDM7CXByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVsbHUsIGR5aW5nPSVsbHVcbiYjMzQ7LAomIzQzOwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fdGFyZ2V0X2dvbmUsCiYjNDM7CSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9za2lwcGVkX2R5aW5nKTsKJiM0MzsKJiM0MzsJLyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi8KJiM0MzsJaWYgKCFBU1NFUlRfRVEoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsICYjMzQ7cmVjbGFpbV9jYWxscyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLAomIzQzOwkJICAgICAgICYjMzQ7cmVjbGFpbWVkX2J5dGVzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAocmVhZGVyX3BpZCAmZ3Q7IDApIHsKJiM0MzsJCWtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkodm9pZCl3YWl0cGlkKHJlYWRlcl9waWQsIE5VTEwsIDApOwomIzQzOwl9CiYjNDM7CWlmIChkYXRhX2ZpbGVbMF0pCiYjNDM7CQl1bmxpbmsoZGF0YV9maWxlKTsKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmIKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDI1OSBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7LyoKJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkUKJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlCiYjNDM7ICogc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IG9uZSwgc28gbm8gY2FsbGJhY2sgcnVucyBsb25nZXIgdGhhbiBvbmUKJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJncyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5CiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7CiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlczsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gYXR0ZW1wdHMgc2tpcHBlZCBiZWNhdXNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nIG9yIGhhcwomIzQzOyAqIGJlZW4gcmVtb3ZlZC4gcmVjbGFpbV9za2lwcGVkX2R5aW5nIGNvdW50cyBsb29rdXBzIHRoYXQgc3RpbGwgZm91bmQKJiM0MzsgKiB0aGUgY2dyb3VwIHdoaWxlIGl0IGlzIGJlaW5nIHRvcm4gZG93biwgcmVjbGFpbV90YXJnZXRfZ29uZSBjb3VudHMKJiM0MzsgKiBsb29rdXBzIHRoYXQgZm91bmQgbm90aGluZy4gVGhlIHRlc3QgcmVtb3ZlcyB0aGUgdGFyZ2V0IGNncm91cCB3aGlsZQomIzQzOyAqIHJlY2xhaW0gaXMgcnVubmluZyBhbmQgY2hlY2tzIHRoYXQgcmVjbGFpbSBzdG9wcyB2aWEgdGhlc2UgY291bnRlcnMuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fc2tpcHBlZF9keWluZzsKJiM0Mzt1NjQgcmVjbGFpbV90YXJnZXRfZ29uZTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLAomIzQzOwkJYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLAomIzQzOwkJCQkgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvcgomIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpCiYjNDM7ICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFjawomIzQzOyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlbgomIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvbgomIzQzOyAqIHRoZSBsb29rdXAgZmFpbGluZy4KJiM0MzsgKgomIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbQomIzQzOyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0bwomIzQzOyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oCiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzbwomIzQzOyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtJmd0O3NlbGYuZmxhZ3M7CiYjNDM7CiYjNDM7CXJldHVybiAoZmxhZ3MgJmFtcDsgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzICZhbXA7IENTU19PTkxJTkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXMKJiM0MzsgKiByZWNsYWltZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CXU2NCBuciA9IDA7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkgewomIzQzOwkJcmVjbGFpbV90YXJnZXRfZ29uZSYjNDM7JiM0Mzs7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2dyb3VwX2lzX2R5aW5nKGNtLmNncnApKSB7CiYjNDM7CQlyZWNsYWltX3NraXBwZWRfZHlpbmcmIzQzOyYjNDM7OwomIzQzOwkJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwluciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgc2l6ZSk7CiYjNDM7CXJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7CS8qCiYjNDM7CSAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzCiYjNDM7CSAqIHJlcXVldWVzLiAwIG1lYW5zIG5vIHJvdW5kIGlzIGluIHByb2dyZXNzOyB0aGUgdGltZXIgcGF0aAomIzQzOwkgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3MKJiM0MzsJICogYXQgaXQuCiYjNDM7CSAqLwomIzQzOwl1NjQgcmVtYWluaW5nOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwl1NjQgbnIsIHNpemU7CiYjNDM7CiYjNDM7CWlmICghZWxlbS0mZ3Q7cmVtYWluaW5nKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlCiYjNDM7CQkgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzCiYjNDM7CQkgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGEKJiM0MzsJCSAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi8KJiM0MzsJc2l6ZSA9IGVsZW0tJmd0O3JlbWFpbmluZyAmbHQ7IFJFQ0xBSU1fU0laRSA/IGVsZW0tJmd0O3JlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTsKJiM0MzsJbnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTsKJiM0MzsJaWYgKCFucikgewomIzQzOwkJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovCiYjNDM7CWlmIChuciAmZ3Q7PSBlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwllbHNlCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgLT0gbnI7CiYjNDM7CiYjNDM7CS8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqLwomIzQzOwlpZiAoZWxlbS0mZ3Q7cmVtYWluaW5nKQomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQyPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0MTAxCgkJCQkJCQlvdXRwdXQ6IDE5NQoJCQkJCQkJdGhvdWdodHM6IDEwODMKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQW5hbHlzaXMgb2YgQlBGIFByb2FjdGl2ZSBSZWNsYWltIEtmdW5jKioKCkFscmlnaHQsIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2guIEkgc2VlIGEgbmV3IGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgYWRkZWQgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLCBhbG9uZyB3aXRoIGl0cyBzZWxmdGVzdHMuIFRoZSBjb3JlIG9mIGl0IGludm9sdmVzIHRoaXMgZnVuY3Rpb24gY2FsbGluZyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuCgpJIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24mIzM5O3QgaW50cm9kdWNlIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBpc3N1ZXMuIFNvLCBsZXQmIzM5O3Mgc3RlcCB0aHJvdWdoIHRoaXMgbWV0aG9kaWNhbGx5LiBGaXJzdCwgdGhlcmUgYXJlbiYjMzk7dCBhbnkga2VybmVsIHN0cnVjdHVyZXMgZ2V0dGluZyBzZW50IHRvIHVzZXIgc3BhY2UgZGlyZWN0bHkuIEl0IHJldHVybnMgYSBzaW1wbGUgYHVuc2lnbmVkIGxvbmdgIHNjYWxhciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMsIHdoaWNoIGlzIGdvb2QuIFNlY29uZCwgdGhlIGNvZGUgZmxvdyBpcyBzdHJhaWdodGZvcndhcmQ7IHRoZXJlJiMzOTtzIG5vIGNvbmRpdGlvbmFsIGxvZ2ljIGJhc2VkIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzLiBUaGUga2V5IHZhcmlhYmxlcywgYG5yX3BhZ2VzYCBhbmQgYG5yX3JlY2xhaW1lZGAsIGFyZSBkaXJlY3RseSBpbml0aWFsaXplZCB3aXRoIHRoZSByZXN1bHRzIG9mIGNhbGN1bGF0aW9ucyBhbmQgZnVuY3Rpb24gY2FsbHMsIHJlc3BlY3RpdmVseS4gVGhpcmQsIG5vIG5ldyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkLiBGaW5hbGx5LCB0aGVyZSYjMzk7cyBubyByaXNrIG9mIGFueSBraW5kIG9mIGJ1ZmZlciBvdmVycnVucyB0aGF0IG1pZ2h0IGV4cG9zZSB1bmluaXRpYWxpemVkIG1lbW9yeS4KCkxvb2tpbmcgZGVlcGVyIGF0IHRoZSBjb2RlLCBldmVyeXRoaW5nIGhpbmdlcyBvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgYW5kIHRoZSBpbml0aWFsaXphdGlvbiB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGlzIGtmdW5jIGxldmVyYWdlcyBhbiBleGlzdGluZywgd2VsbC12ZXR0ZWQgbW0gaW50ZXJuYWwgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBpcyBxdWl0ZSBzaW1wbGUsIGFuZCBpdCYjMzk7cyBwYXNzaW5nIGluIHRoZSBgbWVtY2dgIHBvaW50ZXIgYW5kIHRoZSBzaXplIHZhbHVlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGp1c3QgYW4gYHVuc2lnbmVkIGxvbmdgLgoKVGhlIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBhcmUgYHN0cnVjdCBtZW1fY2dyb3VwICpgLCBgdW5zaWduZWQgbG9uZyBucl9wYWdlc2AsIGBnZnBfdCBnZnBfbWFza2AsIGB1bnNpZ25lZCBpbnQgcmVjbGFpbV9vcHRpb25zYCwgYW5kIGBub2RlbWFza190ICpub2RlbWFza2AgKHdoZXJlIGl0JiMzOTtzIHBhc3NlZCBhcyBOVUxMKS4gVGhlcmUgaXMgbm8gcmVhZGluZyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBOb3RoaW5nIGhlcmUgbGVha3MgdW5pbml0aWFsaXplZCBtZW1vcnkuCgpUaGUgcG90ZW50aWFsIGlzc3VlcyBJIGNhbiBzZWUgd291bGQgYmUgY2xhc3NpYyBtZW1vcnkgbWFuYWdlbWVudCBlcnJvcnMgbGlrZSBsb2NraW5nIGlzc3VlcywgcmVjdXJzaW9uLCBzbGVlcC1pbi1hdG9taWMgY29udGV4dCBwcm9ibGVtcywgY29uY3VycmVuY3kgaXNzdWVzLCByZWZjb3VudCBlcnJvcnMsIG9yIGRlYWRsb2Nrcy4gSG93ZXZlciwgdGhvc2UgYXJlIHRoZSB0eXBlcyBvZiBidWdzIHRoYXQgS0FTQU4sIExPQ0tERVAsIFBST1ZFX0xPQ0tJTkcsIGFuZCB0aGUgb3RoZXIgc3RhbmRhcmQga2VybmVsIGRldGVjdG9ycyBhcmUgZGVzaWduZWQgdG8gY2F0Y2guIEtNU0FOIGlzbiYjMzk7dCBuZWVkZWQgaGVyZS4KClNvLCBhY2NvcmRpbmcgdG8gbXkgYW5hbHlzaXMgYW5kIHRoZXNlIGd1aWRlbGluZXM6CgoqICAgKipOZWVkc0tNU0FOOiBmYWxzZSoqCiogICAqKktNU0FOUmVhc29uaW5nOioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYywgd2hpY2ggaXMgYWRkZWQgdG8gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBzZWxmdGVzdHMuIFRoaXMga2Z1bmMgdGFrZXMgYSBtZW1jZyBwb2ludGVyIGFuZCBhIHNpemUgc2NhbGFyLCBkb2VzIHNvbWUgYmFzaWMgdmFsaWRhdGlvbiwgdGhlbiBpbnZva2VzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLCByZXR1cm5pbmcgYW4gYHVuc2lnbmVkIGxvbmdgIHJlcHJlc2VudGluZyByZWNsYWltZWQgYnl0ZXMuIFRoZXJlIGFyZSBubyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIG5vIGluZm8gbGVha3MuIEFueSBwb3RlbnRpYWwgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWVzLCBsb2NraW5nLCBzbGVlcGFibGUgY29udGV4dHMsIG9yIHBvaW50ZXIgdmFsaWRpdHkgcHJvYmxlbXMgd291bGQgYmUgaWRlbnRpZmllZCBieSBLQVNBTiBhbmQgTE9DS0RFUC4KCkxldCYjMzk7cyBwcm9jZWVkIHRvIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzA1IDIwOjQyPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgcmVhZHMsIGFuZCBubyB0cmFuc2ZlcnMgb2Yga2VybmVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgaXNzdWVzIChlLmcuLCBkZWFkbG9jaywgcmVjdXJzaW9uIGluIHJlY2xhaW0gY29udGV4dCwgcmVmY291bnRpbmcsIG9yIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSkgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcywgbm90IEtNU0FOLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgQlBGIGtmdW5jIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbmQgYXNzb2NpYXRlZCBCUEYgc2VsZnRlc3RzLiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBhIHBvaW50ZXIgdG8gYHN0cnVjdCBtZW1fY2dyb3VwYCBhbmQgYSBgc2l6ZWAgcGFyYW1ldGVyLCBjaGVja3MgdGhlIGV4ZWN1dGlvbiBjb250ZXh0LCBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYCwgYW5kIHJldHVybnMgYSBzY2FsYXIgYHVuc2lnbmVkIGxvbmdgIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMuXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8L3Rib2R5PgoJPC90YWJsZT4KCgk8ZGl2IGlkPSJsbG1fc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPkxMTSBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIFRva2VuczwvdGg+CgkJCQkJPHRoPkF2ZyBUb2tlbnM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0ibGxtX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0idG9vbF9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+VG9vbCBDYWxscyBTdW1tYXJ5OjwvY2FwdGlvbj4KCQkJPHRoZWFkPgoJCQkJPHRyPgoJCQkJCTx0aD5Ub3RhbCBDYWxsczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJ0b29sX3N1bW1hcnlfc3RhdHNfYm9keSI+PC90Ym9keT4KCQk8L3RhYmxlPgoJPC9kaXY+CgoJPGRpdiBpZD0iZHVyYXRpb25fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoJPGRpdiBpZD0idG9rZW5fY2hhcnRfZGl2IiBzdHlsZT0id2lkdGg6IDEwMCU7IG1hcmdpbjogMjBweCAwOyBib3JkZXI6IDFweDsiPjwvZGl2PgoKCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vanNhcGkiPjwvc2NyaXB0PgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgoJCWdvb2dsZS5sb2FkKCJ2aXN1YWxpemF0aW9uIiwgIjEiLCB7cGFja2FnZXM6WyJjb3JlY2hhcnQiXX0pOwoJCWdvb2dsZS5zZXRPbkxvYWRDYWxsYmFjayhkcmF3Q2hhcnRzKTsKCgkJZnVuY3Rpb24gZHJhd0NoYXJ0cygpIHsKCQkJY29uc3QgcmF3RGF0YSA9IFt7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjIzLjk1NjMwMTU2OVoiLCJTZXEiOjAsIk5lc3RpbmciOjAsIlR5cGUiOiJmbG93IiwiTmFtZSI6InBhdGNoLXRyaWFnZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ1NTk4MjMwOTE4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiREVCVUdfSU5GT19CVEZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBhbGxvd2luZyBzbGVlcGFibGUgQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB2aWEgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGNvZGUgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjIzLjk1NjMwNjkwOVoiLCJTZXEiOjEsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoicmVhZC1wYXRjaC1kaWZmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTQyODk1MjUyNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiUGF0Y2hEaWZmXCI6IFwiY29tbWl0IGU3MWEzMjE5NDI5NDIzZTVmZDM2NjRmNTJjZGI4OTQzYzE4NDliYmVcXG5BdXRob3I6IHN5ei1jbHVzdGVyIFxcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVxcdTAwM2VcXG5EYXRlOiAgIFNhdCBTZXAgNSAyMDo0MToyMiAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbmluZGV4IDcxNmRmNDlkNzY0NzcuLjkyZjM1YmE2NjMwOWUgMTAwNjQ0XFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5AQCAtNiw2ICs2LDcgQEBcXG4gICovXFxuIFxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtY29udHJvbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvc3dhcC5oXFx1MDAzZVxcbiAjaW5jbHVkZSBcXHUwMDNjbGludXgvYnBmLmhcXHUwMDNlXFxuIFxcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuQEAgLTE1OSw2ICsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuIFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiB9XFxuIFxcbisvKlxcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXFxuKyAqIGN1cnJlbnQtXFx1MDAzZXJlY2xhaW1fc3RhdGUsIHNvIGEgbmVzdGVkIGNhbGwgd291bGQgY29ycnVwdCB0aGUgb3V0ZXJcXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcXG4rICogcmVjbGFpbV9zdGF0ZSBpcyBhbHNvIGNoZWNrZWQgYmVjYXVzZSBpdCBpcyBpbnN0YWxsZWQgc2xpZ2h0bHlcXG4rICogYmVmb3JlIFBGX01FTUFMTE9DLlxcbisgKi9cXG4rc3RhdGljIGJvb2wgYnBmX2luX3JlY2xhaW1fY29udGV4dCh2b2lkKVxcbit7XFxuK1xcdHJldHVybiAoY3VycmVudC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZTtcXG4rfVxcbitcXG4rLyoqXFxuKyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnlcXG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxcbisgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzLCBjbGFtcGVkIHRvXFxuKyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcXG4rICpcXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xcbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cXG4rICpcXG4rICogQHNpemUgaXMgY2xhbXBlZCBzbyB0aGF0IG9uZSBjYWxsIGlzIGEgYm91bmRlZCB1bml0IG9mIHdvcmssIG1hdGNoaW5nXFxuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxcbisgKiBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseSBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXFxuKyAqXFxuKyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcXG4rICogaW4gYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQuIFRoZSBTWVNDQUxMIHByb2dyYW0gY2FuIHNjaGVkdWxlIHRoZVxcbisgKiBhY3R1YWwgcmVjbGFpbSB3b3JrIHZpYSBicGZfd3Egb3IgdGltZXJzLCB3aGljaCBhbHNvIGV4ZWN1dGUgaW5cXG4rICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cXG4rICpcXG4rICogV2hlbiByZWNsYWltIGlzIGRyaXZlbiBmcm9tIGEgYnBmX3dxLCBjYWxsIHRoaXMga2Z1bmMgb25jZSBwZXJcXG4rICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcXG4rICogdGhhbiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2s6IGEgbG9uZy1ydW5uaW5nIGNhbGxiYWNrIHN0YWxsc1xcbisgKiBvdGhlciB3b3JrIG9uIHRoZSBzaGFyZWQgd29ya3F1ZXVlLCBhbmQgYmVjYXVzZSBscnVfbG9jayBpcyBoZWxkIHdpdGhcXG4rICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXFxuKyAqIGhhbmRsaW5nLiBHaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gYnBmX3dxIGl0ZW0sIHNvIHRoYXRcXG4rICogcmVjbGFpbWluZyBvbmUgbWVtY2cgbmVpdGhlciBzZXJpYWxpemVzIGJlaGluZCBub3IgcGlsZXMgdXAgb24gdG9wIG9mXFxuKyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcXG4rICogcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3AgYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXNcXG4rICogZHlpbmcuXFxuKyAqXFxuKyAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcXG4rICogbWF5IGRlYWRsb2NrIG9uIGl0IHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cXG4rICpcXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXFxuKyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2Ugb3IgdGhlIHRhc2sgaXMgYWxyZWFkeSBpbiBhIHJlY2xhaW0gY29udGV4dC5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzaXplKVxcbit7XFxuK1xcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzO1xcbitcXG4rXFx0aWYgKHNpemUgXFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xcbitcXG4rXFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIE5VTEwpO1xcbitcXG4rXFx0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcXG4rfVxcbitcXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcXG4gXFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbkBAIC0xNzEsMjIgKzI0MCw0NCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfbWVtb3J5X2V2ZW50cylcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3VzYWdlKVxcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZSlcXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxuLVxcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuIFxcbisvKlxcbisgKiBQcm9hY3RpdmUgcmVjbGFpbSBuZWVkcyBhIGNsZWFuIHByb2Nlc3MgY29udGV4dCwgc28gaXQgaXMgcmVzdHJpY3RlZFxcbisgKiB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwuIFRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3MgdGhhdCBhXFxuKyAqIFNZU0NBTEwgcHJvZ3JhbSBzY2hlZHVsZXMgcnVuIGFzIHRoZSBzYW1lIHByb2dyYW0gdHlwZSwgc28gdGhleSBjYW5cXG4rICogc3RpbGwgaW52b2tlIGl0OyBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyAoZS5nLiBmZW50cnkgb24gcmVjbGFpbVxcbisgKiBwYXRocywgaW5vZGVfcm1kaXIpIGNhbm5vdC5cXG4rICovXFxuK0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcXG4rQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxuK1xcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xcbiBcXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcXG4gXFx0LnNldCAgICAgICAgICAgID0gXFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcXG4gfTtcXG4gXFxuK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCA9IHtcXG4rXFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXFxuK1xcdC5zZXQgICAgICAgICAgICA9IFxcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcyxcXG4rfTtcXG4rXFxuIHN0YXRpYyBpbnQgX19pbml0IGJwZl9tZW1jb250cm9sX2luaXQodm9pZClcXG4ge1xcbiBcXHRpbnQgZXJyO1xcbiBcXG4gXFx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcXG4gXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7XFxuLVxcdGlmIChlcnIpXFxuK1xcdGlmIChlcnIpIHtcXG4gXFx0XFx0cHJfd2FybihcXFwiZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIG1lbWNvbnRyb2wga2Z1bmNzOiAlZFxcXCIsIGVycik7XFxuK1xcdFxcdHJldHVybiBlcnI7XFxuK1xcdH1cXG4rXFxuK1xcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpO1xcbitcXHRpZiAoZXJyKVxcbitcXHRcXHRwcl93YXJuKFxcXCJlcnJvciByZWdpc3RlcmluZyBicGYgcmVjbGFpbSBrZnVuY3M6ICVkXFxcIiwgZXJyKTtcXG4gXFxuIFxcdHJldHVybiBlcnI7XFxuIH1cXG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi42NWY1MDA2ODQ0NjM2XFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbkBAIC0wLDAgKzEsNjg2IEBAXFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXFxuKy8qXFxuKyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0XFxuKyAqL1xcbitcXG4rI2luY2x1ZGUgXFx1MDAzY3Rlc3RfcHJvZ3MuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9tbWFuLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvc3RhdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3Zmcy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL3dhaXQuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2ZjbnRsLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzaWduYWwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3RpbWUuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3VuaXN0ZC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkaW8uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N0ZGxpYi5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RyaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NsaW1pdHMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21hZ2ljLmhcXHUwMDNlXFxuK1xcbisjaW5jbHVkZSBcXFwiY2dyb3VwX2hlbHBlcnMuaFxcXCJcXG4rXFxuK3N0cnVjdCBicGZfYXJncyB7XFxuK1xcdHU2NCBoaWdoX2Nncm91cF9pZDtcXG4rXFx0dTY0IGxvd19jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0dfRFlJTkdfRElSIFxcXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1xcXCJcXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXFxcIi90cmlnZ2VyXFxcIlxcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFxcXCIvdGFyZ2V0XFxcIlxcbitcXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxcbitcXG4rLypcXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxcbisgKiBpbi1mbGlnaHQgcmVjbGFpbSBwYXNzZXMgdGltZSB0byBkcmFpbiwgdGhlbiB3YWl0IGZvciBhIHJlY2xhaW0gcm91bmRcXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xcbisgKiBzdWNoIGEgcm91bmQgbXVzdCBzaG93IHVwIHdpdGhpbiBhIGZldyB0aW1lciBwZXJpb2RzLlxcbisgKi9cXG4rI2RlZmluZSBEWUlOR19TRVRUTEVfVVMgKDIwMCAqIDEwMDApXFxuKyNkZWZpbmUgRFlJTkdfUE9MTF9JVEVSUyA1MDBcXG4rI2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApXFxuK1xcbisvKlxcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxcbisgKiBPT00gdGhlIGNncm91cCBpbnN0ZWFkIG9mIGV4ZXJjaXNpbmcgcmVjbGFpbTsgdGhleSBhcmUgYWxzbyBjaGFyZ2VkXFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXFxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcXG4rICogd2hlbiAvdG1wIGlzIGJhY2tlZCBieSBzdWNoIGEgZmlsZXN5c3RlbS5cXG4rICovXFxuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcXG4re1xcbitcXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xcbitcXG4rXFx0aWYgKCFzdGF0ZnMoXFxcIi90bXBcXFwiLCBcXHUwMDI2c3QpIFxcdTAwMjZcXHUwMDI2XFxuK1xcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXFxuK1xcdFxcdHJldHVybiBcXFwiLlxcXCI7XFxuK1xcdHJldHVybiBcXFwiL3RtcFxcXCI7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxcbisgKiBidWZmZXIuIFRoZSBleGl0IHN0YXR1cyBpcyB0aGUgb25seSBkaWFnbm9zdGljcyBjaGFubmVsIHRoYXQgcmVhY2hlc1xcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cXG4rICovXFxuK2VudW0gY2hpbGRfZXhpdF9jb2RlIHtcXG4rXFx0Q0hJTERfRVhJVF9PSyA9IDAsXFxuK1xcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXFxuK1xcdENISUxEX0VYSVRfV1JJVEVfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXFxuK1xcdENISUxEX0VYSVRfVElNRV9GSUxFLFxcbit9O1xcbitcXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxcbit7XFxuK1xcdHN3aXRjaCAoY29kZSkge1xcbitcXHRjYXNlIENISUxEX0VYSVRfT0s6XFxuK1xcdFxcdHJldHVybiBcXFwic3VjY2Vzc1xcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJqb2luIGNncm91cFxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwicmVhZCBkYXRhIGZpbGVcXFwiO1xcbitcXHRjYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOlxcbitcXHRcXHRyZXR1cm4gXFxcIndyaXRlIHRpbWUgZmlsZVxcXCI7XFxuK1xcdGRlZmF1bHQ6XFxuK1xcdFxcdHJldHVybiBcXFwidW5rbm93blxcXCI7XFxuK1xcdH1cXG4rfVxcbitcXG4rc3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcXG4re1xcbitcXHRpbnQgcmV0O1xcbitcXHRjaGFyIGxpbWl0X2J1ZlsyMF07XFxuK1xcbitcXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwic2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcXFwibWVtb3J5XFxcIik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcImVuYWJsZV9jb250cm9sbGVyc1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcXFwiJWx1XFxcIiwgQ0dfTElNSVQpO1xcbitcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFxcXCJtZW1vcnkubWF4XFxcIiwgbGltaXRfYnVmKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcXG4rXFx0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cXG4rXFx0ICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS5cXG4rXFx0ICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0hJR0hfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpoaWdoX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19MT1dfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0Kmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFRoZSBkeWluZyB0ZXN0IG5lZWRzIGFuIGVtcHR5IHJlY2xhaW0gdGFyZ2V0IHBsdXMgYSBjZ3JvdXAgdGhhdCBrZWVwc1xcbisgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcFxcbisgKiBzdGFydGluZyBhbmQgcnVuIGludG8gdGhlIHJlbW92ZWQgdGFyZ2V0LiBUaGUgdHdvIGhhdmUgdG8gYmUgc2VwYXJhdGVcXG4rICogY2dyb3VwczogdGhlIHRhcmdldCBtdXN0IGhvbGQgbm8gcHJvY2Vzc2VzIHRvIGJlIHJlbW92ZWQsIGFuZCB2MidzXFxuKyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcXG4rICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uXFxuKyAqL1xcbitzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdGNoYXIgbGltaXRfYnVmWzIwXTtcXG4rXFxuK1xcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0RZSU5HX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsIFxcXCJtZW1vcnlcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiZW5hYmxlX2NvbnRyb2xsZXJzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFxcXCIlbHVcXFwiLCBDR19MSU1JVCk7XFxuK1xcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXFxcIm1lbW9yeS5tYXhcXFwiLCBsaW1pdF9idWYpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdC8qIFNlZSB0aGUgbWF0Y2hpbmcgd3JpdGUgaW4gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygpLiAqL1xcbitcXHRpZiAoIWFjY2VzcyhcXFwiL3Byb2Mvc3dhcHNcXFwiLCBGX09LKSkge1xcbitcXHRcXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFxcXCJtZW1vcnkuc3dhcC5tYXhcXFwiLCBcXFwiMFxcXCIpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcXFwiKSlcXG4rXFx0XFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19EWUlOR19UUklHR0VSX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqdHJpZ2dlcl9jZ3JvdXBfaWQsIDAsIFxcXCJnZXRfY2dyb3VwX2lkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdCp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsIFxcXCJnZXRfY2dyb3VwX2lkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldHVybiAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rXFx0cmV0dXJuIC0xO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRzaXplX3Qgd3JpdHRlbiA9IDA7XFxuK1xcdGNoYXIgKmJ1ZmZlcjtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRmcCA9IGZvcGVuKGZpbGVuYW1lLCBcXFwid2JcXFwiKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpO1xcbitcXHRpZiAoIWJ1ZmZlcilcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZwO1xcbitcXG4rXFx0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XFxuK1xcbitcXHR3aGlsZSAod3JpdHRlbiBcXHUwMDNjIEZJTEVfU0laRSkge1xcbitcXHRcXHRzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuIFxcdTAwM2MgQlVGRkVSX1NJWkUgP1xcbitcXHRcXHRcXHRcXHQgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTtcXG4rXFxuK1xcdFxcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdFxcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IDA7XFxuK2NsZWFudXA6XFxuK1xcdGZyZWUoYnVmZmVyKTtcXG4rY2xlYW51cF9mcDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTtcXG4rXFx0Y2hhciAqbWFwO1xcbitcXHRzaXplX3QgaTtcXG4rXFx0aW50IGZkO1xcbitcXHRzdHJ1Y3Qgc3RhdCBzYjtcXG4rXFxuK1xcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xcbitcXHRpZiAoZmQgPT0gLTEpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0aWYgKGZzdGF0KGZkLCBcXHUwMDI2c2IpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcXG4rXFx0XFx0ZnByaW50ZihzdGRlcnIsIFxcXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcXFxuXFxcIixcXG4rXFx0XFx0XFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXHR9XFxuK1xcbitcXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xcbitcXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFxcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XFxuK1xcdFxcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBGSUxFX1NJWkU7IGkgKz0gcGFnZV9zaXplKSB7XFxuK1xcdFxcdFxcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXFxuK1xcdFxcdFxcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcXG4rXFx0XFx0XFx0KHZvaWQpdjtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcbitcXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0cmV0ID0gMDtcXG4rXFxuK2NsZWFudXBfZmQ6XFxuK1xcdGNsb3NlKGZkKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxcbitcXHRcXHRcXHRcXHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcXG4rXFx0ZG91YmxlIGVsYXBzZWQ7XFxuK1xcdEZJTEUgKmZwO1xcbitcXG4rXFx0aWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpXFxuK1xcdFxcdHJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZzdGFydCk7XFxuK1xcbitcXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcXG4rXFxuK1xcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXFxuK1xcdFxcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcXG4rXFxuK1xcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcXHUwMDI2ZW5kKTtcXG4rXFxuK1xcdGlmICghdGltZV9maWxlbmFtZSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XFxuK1xcbitcXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcXG4rXFx0XFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcXG4rXFx0cHJpbnRmKFxcXCIlLjZmXFxcXG5cXFwiLCBlbGFwc2VkKTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcIndcXFwiKTtcXG4rXFx0aWYgKCFmcClcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xcbitcXHRmcHJpbnRmKGZwLCBcXFwiJS42ZlxcXCIsIGVsYXBzZWQpO1xcbitcXHRmY2xvc2UoZnApO1xcbitcXG4rXFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxcbit7XFxuK1xcdGludCByZXQgPSAtMTtcXG4rXFx0RklMRSAqZnA7XFxuK1xcdGNoYXIgYnVmWzY0XTtcXG4rXFxuK1xcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXFxcInJcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcXFwiZm9wZW5cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcXFwiZmdldHNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0aWYgKHNzY2FuZihidWYsIFxcXCIlbGZcXFwiLCB0aW1lKSAhPSAxKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcInNzY2FuZiAlc1xcXCIsIGJ1Zik7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZmNsb3NlKGZwKTtcXG4rb3V0OlxcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3J1bl9oaWdoX2xvd193b3JrbG9hZChkb3VibGUgKmhpZ2hfZWxhcHNlZCwgZG91YmxlICpsb3dfZWxhcHNlZCwgaW50IHJlYWRfdGltZXMpXFxuK3tcXG4rXFx0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdO1xcbitcXHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xcbitcXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcXG4rXFx0cGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xO1xcbitcXHRwaWRfdCB3YWl0X3JldDtcXG4rXFx0aW50IGZkLCBzdGF0dXM7XFxuK1xcdGludCByZXQgPSAtMTtcXG4rXFxuK1xcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfbG93X2RhdGFfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfaGlnaF90aW1lX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGxvd19waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsIFxcXCJmb3JrIGxvd1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChsb3dfcGlkID09IDApXFxuK1xcdFxcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0xPV19ESVIsIGxvd19kYXRhX2ZpbGUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0aGlnaF9waWQgPSBmb3JrKCk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcXFwiZm9yayBoaWdoXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGhpZ2hfcGlkID09IDApXFxuK1xcdFxcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xcbitcXG4rXFx0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFxcdTAwMjZzdGF0dXMsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXFxcImxvdyB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LypcXG4rXFx0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXFxuK1xcdCAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLlxcbitcXHQgKi9cXG4rXFx0bG93X3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwibG93IGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVxcXCIsXFxuK1xcdFxcdFxcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxcbitcXHRcXHRcXHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFxcdTAwMjZzdGF0dXMsIDApO1xcbitcXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXFxcImhpZ2ggd2FpdHBpZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xcbitcXHRoaWdoX3BpZCA9IC0xO1xcbitcXHRpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCBcXFwiaGlnaCBleGl0ZWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7XFxuK1xcdFxcdFBSSU5UX0ZBSUwoXFxcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cDpcXG4rXFx0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cXG4rXFx0aWYgKHJldCkge1xcbitcXHRcXHRpZiAoaGlnaF9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdFxcdGtpbGwoaGlnaF9waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGhpZ2hfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHRcXHRpZiAobG93X3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChsb3dfcGlkLCBTSUdLSUxMKTtcXG4rXFx0XFx0XFx0KHZvaWQpd2FpdHBpZChsb3dfcGlkLCBOVUxMLCAwKTtcXG4rXFx0XFx0fVxcbitcXHR9XFxuK1xcdHVubGluayhsb3dfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcXG4rXFx0dW5saW5rKGxvd19kYXRhX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRyZXR1cm4gcmV0O1xcbit9XFxuK1xcbitzdGF0aWMgaW50XFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxcbitcXHQgIHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICoqc2tlbF9wdHIpXFxuK3tcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7XFxuK1xcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xcbitcXHRcXHQuaGlnaF9jZ3JvdXBfaWQgPSBoaWdoX2Nncm91cF9pZCxcXG4rXFx0XFx0Lmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLFxcbitcXHRcXHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxcbitcXHRcXHQuY2hlY2tfbnMgPSBDSEVDS19QRVJJT0RfTlMsXFxuK1xcdH07XFxuK1xcdExJQkJQRl9PUFRTKGJwZl90ZXN0X3J1bl9vcHRzLCBydW5fb3B0cyxcXG4rXFx0XFx0LmN0eF9pbiA9IFxcdTAwMjZhcmdzLFxcbitcXHRcXHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xcbitcXHRpbnQgcHJvZ19pbml0X2ZkLCBlcnI7XFxuK1xcbitcXHRza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXFxcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcXFwiKSlcXG4rXFx0XFx0cmV0dXJuIC0xO1xcbitcXG4rXFx0cHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtXFx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XFxuK1xcbitcXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXFx1MDAyNnJ1bl9vcHRzKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwiYnBmX3Byb2dfdGVzdF9ydW5fb3B0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFx0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcXFwicHJvZ19pbml0IHJldHZhbFxcXCIpKVxcbitcXHRcXHRnb3RvIGVycm9yX291dDtcXG4rXFxuK1xcdCpza2VsX3B0ciA9IHNrZWw7XFxuK1xcdHJldHVybiAwO1xcbitcXG4rZXJyb3Jfb3V0OlxcbitcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXFxuK3tcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xcbitcXHRpbnQgZXJyO1xcbitcXHRkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcXHUwMDI2aGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZsb3dfY2dyb3VwX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXFxcIikpXFxuK1xcdFxcdHJldHVybjtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgXFx1MDAyNnNrZWwpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJzZXR1cF9icGZcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXFx1MDAyNmhpZ2hfdGltZSwgXFx1MDAyNmxvd190aW1lLCBSRUFEX1RJTUVTKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xcbitcXHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cXG4rXFx0ICogYWN0dWFsbHkgcmVjbGFpbWVkIG1lbW9yeSBmcm9tIHRoZSBsb3cgY2dyb3VwLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX2NhbGxzLCAwLCBcXFwicmVjbGFpbV9jYWxsc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFxcXCJyZWNsYWltZWRfYnl0ZXNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoaGlnaF90aW1lIFxcdTAwM2U9IGxvd190aW1lKVxcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJoaWdoIGNncm91cCBub3QgaW1wcm92ZWQ6IGhpZ2g9JWYgbG93PSVmXFxcIixcXG4rXFx0XFx0XFx0ICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XFxuK1xcbitvdXQ6XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuK1xcbisvKlxcbisgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHNcXG4rICoga2VlcCBiZWluZyB0cmlnZ2VyZWQgd2hpbGUgdGhlIHRhcmdldCBjZ3JvdXAgaXMgYmVpbmcgcmVtb3ZlZC4gVGhlXFxuKyAqIGNoaWxkIGpvaW5zIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgd3JpdGVzIHRoZSBkYXRhIGZpbGUgdGhlcmUsIHNvXFxuKyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseVxcbisgKiBjb21lIHVuZGVyIGl0cyBtZW1vcnkgbGltaXQ7IHRoZW4gaXQgcmUtcmVhZHMgdGhlIGZpbGUgaW4gYSBsb29wXFxuKyAqIHVudGlsIGl0IGlzIGtpbGxlZC5cXG4rICovXFxuK3N0YXRpYyBwaWRfdCBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGNvbnN0IGNoYXIgKmRhdGFfZmlsZSlcXG4re1xcbitcXHRwaWRfdCBwaWQgPSBmb3JrKCk7XFxuK1xcbitcXHRpZiAocGlkICE9IDApXFxuK1xcdFxcdHJldHVybiBwaWQ7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSlcXG4rXFx0XFx0X2V4aXQoQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCk7XFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZSkpXFxuK1xcdFxcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XFxuK1xcdGZvciAoOzspIHtcXG4rXFx0XFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxcbitcXHRcXHRcXHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XFxuK1xcdH1cXG4rfVxcbitcXG4rLypcXG4rICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmRcXG4rICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZlxcbisgKiByZWNsYWltaW5nIGZyb20gaXQuXFxuKyAqXFxuKyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kXFxuKyAqIG9ubHkga2VlcHMgcmVmYXVsdHMgZmxvd2luZyBzbyB0aGF0IHJlY2xhaW0gcm91bmRzIGtlZXAgc3RhcnRpbmcsXFxuKyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIHJlY2xhaW1fY2FsbHMgZ3Jvd2luZ1xcbisgKiB3aGlsZSB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmNcXG4rICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kXFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBza2lwIGNvdW50ZXJzIG11c3QgZ3JvdyB3aGlsZSByZWNsYWltX2NhbGxzXFxuKyAqIGFuZCByZWNsYWltZWRfYnl0ZXMgc3RheSBmcm96ZW4uXFxuKyAqL1xcbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxcbit7XFxuK1xcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcXG4rXFx0dTY0IGNhbGxzX2JlZm9yZSwgYnl0ZXNfYmVmb3JlO1xcbitcXHRjaGFyIGRhdGFfZmlsZVtQQVRIX01BWF0gPSBcXFwiXFxcIjtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXHRwaWRfdCByZWFkZXJfcGlkID0gLTE7XFxuK1xcdGludCBlcnIsIGZkLCBpO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcyhcXHUwMDI2dHJpZ2dlcl9jZ3JvdXBfaWQsIFxcdTAwMjZ0YXJnZXRfY2dyb3VwX2lkKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfZHlpbmdfY2dyb3Vwc1xcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsIFxcdTAwMjZza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0c25wcmludGYoZGF0YV9maWxlLCBzaXplb2YoZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcXFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XFxuK1xcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFxcXCJmb3JrIGtlZXBhbGl2ZSByZWFkZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgRFlJTkdfUE9MTF9JVEVSUzsgaSsrKSB7XFxuK1xcdFxcdGlmIChza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHMgXFx1MDAzZSAwKVxcbitcXHRcXHRcXHRicmVhaztcXG4rXFx0XFx0dXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpO1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXFxcInJlY2xhaW1fY2FsbHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXG4rXFx0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cXG4rXFx0dXNsZWVwKERZSU5HX1NFVFRMRV9VUyk7XFxuK1xcbitcXHRjYWxsc19iZWZvcmUgPSBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHM7XFxuK1xcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX2J5dGVzO1xcbitcXG4rXFx0LyogV2FpdCBmb3IgcmVjbGFpbSByb3VuZHMgdG8gaGl0IHRoZSByZW1vdmVkIGNncm91cC4gKi9cXG4rXFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIERZSU5HX1BPTExfSVRFUlM7IGkrKykge1xcbitcXHRcXHRpZiAoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIHx8XFxuK1xcdFxcdCAgICBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZylcXG4rXFx0XFx0XFx0YnJlYWs7XFxuK1xcdFxcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fdGFyZ2V0X2dvbmUgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgICFza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZykge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJubyByZWNsYWltIHJvdW5kIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAgKGdvbmU9JWxsdSwgZHlpbmc9JWxsdSlcXFwiLFxcbitcXHRcXHRcXHQgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcXG4rXFx0XFx0XFx0ICAgKHVuc2lnbmVkIGxvbmcgbG9uZylza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHQvKlxcbitcXHQgKiByZWNsYWltX3NraXBwZWRfZHlpbmcgc2hvd3MgdGhhdCB0aGUgQ1NTX0RZSU5HL0NTU19PTkxJTkUgY2hlY2tcXG4rXFx0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIGl0IGlzIGhpdCBpcyB0aW1pbmdcXG4rXFx0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXFxuK1xcdCAqIG9ubHkgdGhlIGNvbWJpbmVkIHNraXAgY291bnQgYWJvdmUgaXMgYXNzZXJ0ZWQuXFxuK1xcdCAqL1xcbitcXHRwcmludGYoXFxcIm1lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVsbHUsIGR5aW5nPSVsbHVcXFxcblxcXCIsXFxuK1xcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcXG4rXFx0ICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpO1xcbitcXG4rXFx0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsIFxcXCJyZWNsYWltX2NhbGxzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxcbitcXHRcXHQgICAgICAgXFxcInJlY2xhaW1lZF9ieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK291dDpcXG4rXFx0aWYgKHJlYWRlcl9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XFxuK1xcdH1cXG4rXFx0aWYgKGRhdGFfZmlsZVswXSlcXG4rXFx0XFx0dW5saW5rKGRhdGFfZmlsZSk7XFxuK1xcdGlmIChza2VsKVxcbitcXHRcXHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbit9XFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxubmV3IGZpbGUgbW9kZSAxMDA2NDRcXG5pbmRleCAwMDAwMDAwMDAwMDAwLi5lNjgzOWFkZTQ3MmJiXFxuLS0tIC9kZXYvbnVsbFxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDI1OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbitcXG4rI2luY2x1ZGUgXFxcInZtbGludXguaFxcXCJcXG4rI2luY2x1ZGUgXFxcImJwZl9leHBlcmltZW50YWwuaFxcXCJcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfaGVscGVycy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXFx1MDAzZVxcbitcXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcXHQxXFxuKyNkZWZpbmUgUEFHRV9TSVpFXFx0XFx0NDA5NlVMXFxuKy8qXFxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxcbisgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlXFxuKyAqIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBvbmUsIHNvIG5vIGNhbGxiYWNrIHJ1bnMgbG9uZ2VyIHRoYW4gb25lXFxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxcbisgKi9cXG4rI2RlZmluZSBSRUNMQUlNX1NJWkVcXHRcXHQoMzIgKiBQQUdFX1NJWkUpXFxuKyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUlxcdDMyXFxuK1xcbitzdHJ1Y3QgYnBmX2FyZ3Mge1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBsb3dfY2dyb3VwX2lkO1xcbitcXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHR1NjQgY2hlY2tfbnM7XFxuK307XFxuK1xcbitzdHJ1Y3QgY2dyb3VwX21lbWNnIHtcXG4rXFx0c3RydWN0IGNncm91cCAqY2dycDtcXG4rXFx0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xcbit9O1xcbitcXG4rc3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcXG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xcbitcXG4rLypcXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcXG4rICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9jYWxscztcXG4rdTY0IHJlY2xhaW1lZF9ieXRlcztcXG4rLypcXG4rICogUmVjbGFpbSBhdHRlbXB0cyBza2lwcGVkIGJlY2F1c2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcgb3IgaGFzXFxuKyAqIGJlZW4gcmVtb3ZlZC4gcmVjbGFpbV9za2lwcGVkX2R5aW5nIGNvdW50cyBsb29rdXBzIHRoYXQgc3RpbGwgZm91bmRcXG4rICogdGhlIGNncm91cCB3aGlsZSBpdCBpcyBiZWluZyB0b3JuIGRvd24sIHJlY2xhaW1fdGFyZ2V0X2dvbmUgY291bnRzXFxuKyAqIGxvb2t1cHMgdGhhdCBmb3VuZCBub3RoaW5nLiBUaGUgdGVzdCByZW1vdmVzIHRoZSB0YXJnZXQgY2dyb3VwIHdoaWxlXFxuKyAqIHJlY2xhaW0gaXMgcnVubmluZyBhbmQgY2hlY2tzIHRoYXQgcmVjbGFpbSBzdG9wcyB2aWEgdGhlc2UgY291bnRlcnMuXFxuKyAqL1xcbit1NjQgcmVjbGFpbV9za2lwcGVkX2R5aW5nO1xcbit1NjQgcmVjbGFpbV90YXJnZXRfZ29uZTtcXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXFxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXFxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcXG4rICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXFxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxcbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXFxuKyAqXFxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxcbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cXG4rICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXFxuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXFx1MDAzZXNlbGYuZmxhZ3M7XFxuK1xcbitcXHRyZXR1cm4gKGZsYWdzIFxcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFxcdTAwMjYgQ1NTX09OTElORSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxcbisgKiBieXRlcyByZWNsYWltZWQsIG9yIDAgaWYgdGhlIGNncm91cCBpcyBkeWluZyBvciBnb25lIG9yIG5vdGhpbmcgd2FzXFxuKyAqIHJlY2xhaW1lZC5cXG4rICovXFxuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0dTY0IG5yID0gMDtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKSB7XFxuK1xcdFxcdHJlY2xhaW1fdGFyZ2V0X2dvbmUrKztcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcXG4rXFx0XFx0cmVjbGFpbV9za2lwcGVkX2R5aW5nKys7XFxuK1xcdFxcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdHJlY2xhaW1fY2FsbHMrKztcXG4rXFx0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUpO1xcbitcXHRyZWNsYWltZWRfYnl0ZXMgKz0gbnI7XFxuK1xcbitcXHRwdXRfY2dyb3VwX21lbWNnKFxcdTAwMjZjbSk7XFxuK1xcbitcXHRyZXR1cm4gbnI7XFxuK31cXG4rXFxuK3N0cnVjdCB3cV9lbGVtIHtcXG4rXFx0c3RydWN0IGJwZl90aW1lciB0aW1lcjtcXG4rXFx0c3RydWN0IGJwZl93cSB3b3JrO1xcbitcXHR1NjQgcHJldl9ldmVudDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbitcXHQvKlxcbitcXHQgKiBCeXRlcyBzdGlsbCB0byByZWNsYWltIGluIHRoZSBjdXJyZW50IHJvdW5kLCBjYXJyaWVkIGFjcm9zc1xcbitcXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcXG4rXFx0ICogc3RhcnRzIGEgbmV3IHJvdW5kIGJ5IHJlc2V0dGluZyBpdCwgcmVxdWV1ZWQgd29yayBvbmx5IGxvb2tzXFxuK1xcdCAqIGF0IGl0LlxcbitcXHQgKi9cXG4rXFx0dTY0IHJlbWFpbmluZztcXG4rfTtcXG4rXFxuK3N0cnVjdCB7XFxuK1xcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfQVJSQVkpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xcbitcXHRfX3R5cGUoa2V5LCBfX3UzMik7XFxuK1xcdF9fdHlwZSh2YWx1ZSwgc3RydWN0IHdxX2VsZW0pO1xcbit9IHdxX21hcCBTRUMoXFxcIi5tYXBzXFxcIik7XFxuK1xcbitzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlO1xcbitcXHR1NjQgbnIsIHNpemU7XFxuK1xcbitcXHRpZiAoIWVsZW0tXFx1MDAzZXJlbWFpbmluZykge1xcbitcXHRcXHQvKlxcbitcXHRcXHQgKiBUaW1lci10cmlnZ2VyZWQgZW50cnk6IHN0YXJ0IGEgbmV3IHJvdW5kIG9ubHkgd2hlbiB0aGVcXG4rXFx0XFx0ICogaGlnaCBjZ3JvdXAgcmVmYXVsdHMgZW5vdWdoLiBSZXF1ZXVlZCBlbnRyaWVzIHNraXAgdGhpc1xcbitcXHRcXHQgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGFcXG4rXFx0XFx0ICogaXMgY29uc3VtZWQgb25jZSBwZXIgcm91bmQuXFxuK1xcdFxcdCAqL1xcbitcXHRcXHRpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgXFx1MDAyNmVsZW0tXFx1MDAzZXByZXZfZXZlbnQsXFxuK1xcdFxcdFxcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXFxuK1xcdFxcdFxcdHJldHVybiAwO1xcbitcXHRcXHRlbGVtLVxcdTAwM2VyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFO1xcbitcXHR9XFxuK1xcbitcXHQvKiBPbmUgYm91bmRlZCByZWNsYWltIHBhc3MgcGVyIGNhbGxiYWNrICovXFxuK1xcdHNpemUgPSBlbGVtLVxcdTAwM2VyZW1haW5pbmcgXFx1MDAzYyBSRUNMQUlNX1NJWkUgPyBlbGVtLVxcdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XFxuK1xcdG5yID0gcmVjbGFpbV9jZ3JvdXAod3FfbG93X2Nncm91cF9pZCwgc2l6ZSk7XFxuK1xcdGlmICghbnIpIHtcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlcmVtYWluaW5nID0gMDtcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcdH1cXG4rXFxuK1xcdC8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovXFxuK1xcdGlmIChuciBcXHUwMDNlPSBlbGVtLVxcdTAwM2VyZW1haW5pbmcpXFxuK1xcdFxcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyA9IDA7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlcmVtYWluaW5nIC09IG5yO1xcbitcXG4rXFx0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXFxuK1xcdGlmIChlbGVtLVxcdTAwM2VyZW1haW5pbmcpXFxuK1xcdFxcdGJwZl93cV9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgMCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rc3RhdGljIGludCB3cV90aW1lcl9jYih2b2lkICptYXAsIGludCAqa2V5LCBzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSlcXG4re1xcbitcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXHRicGZfdGltZXJfc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBlbGVtLVxcdTAwM2VjaGVja19ucywgMCk7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rfVxcbitcXG4rU0VDKFxcXCJzeXNjYWxsXFxcIilcXG4raW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eClcXG4re1xcbitcXHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcXG4rXFx0X191MzIga2V5ID0gMDtcXG4rXFx0aW50IHJldDtcXG4rXFxuK1xcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFxcdTAwMjZ3cV9tYXAsIFxcdTAwMjZrZXkpO1xcbitcXHRpZiAoIWVsZW0pXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdHJldCA9IGJwZl93cV9pbml0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCBcXHUwMDI2d3FfbWFwLCAwKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIFxcdTAwMjZ3cV9tYXAsIENMT0NLX01PTk9UT05JQ19JRCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgd3FfdGltZXJfY2IpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0ZWxlbS1cXHUwMDNlcHJldl9ldmVudCA9IDA7XFxuK1xcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyA9IDA7XFxuK1xcdGVsZW0tXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC1cXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbitcXHRlbGVtLVxcdTAwM2VjaGVja19ucyA9IGN0eC1cXHUwMDNlY2hlY2tfbnM7XFxuK1xcbitcXHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cXHUwMDNlaGlnaF9jZ3JvdXBfaWQ7XFxuK1xcdHdxX2xvd19jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWxvd19jZ3JvdXBfaWQ7XFxuK1xcbitcXHRyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbit9XFxuK1xcbitjaGFyIF9saWNlbnNlW10gU0VDKFxcXCJsaWNlbnNlXFxcIikgPSBcXFwiR1BMXFxcIjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6MjUuMzg1OTU5MTY1WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjozNzMwNzM2MDc3NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBhbGxvd2luZyBzbGVlcGFibGUgQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB2aWEgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGNvZGUgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTJmMzViYTY2MzA5ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuKyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcbisgKlxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cbisgKlxuKyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxuKyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cbisgKlxuKyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcbisgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlXG4rICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4rICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cbisgKlxuKyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4rICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcbisgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzXG4rICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4rICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXG4rICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdFxuKyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuKyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcbisgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpc1xuKyAqIGR5aW5nLlxuKyAqXG4rICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aFxuKyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbitcbitcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxuK1x0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rXHRcdFx0XHRcdFx0ICAgIE5VTEwpO1xuK1xuK1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzEsMjIgKzI0MCw0NCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfbWVtb3J5X2V2ZW50cylcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4tXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuKy8qXG4rICogUHJvYWN0aXZlIHJlY2xhaW0gbmVlZHMgYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQsIHNvIGl0IGlzIHJlc3RyaWN0ZWRcbisgKiB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwuIFRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3MgdGhhdCBhXG4rICogU1lTQ0FMTCBwcm9ncmFtIHNjaGVkdWxlcyBydW4gYXMgdGhlIHNhbWUgcHJvZ3JhbSB0eXBlLCBzbyB0aGV5IGNhblxuKyAqIHN0aWxsIGludm9rZSBpdDsgZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgKGUuZy4gZmVudHJ5IG9uIHJlY2xhaW1cbisgKiBwYXRocywgaW5vZGVfcm1kaXIpIGNhbm5vdC5cbisgKi9cbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjVmNTAwNjg0NDYzNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDY4NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENHX0RZSU5HX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nXCJcbisjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiBcIi90cmlnZ2VyXCJcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFwiL3RhcmdldFwiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlXG4rICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcbisgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvXG4rICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwXG4rI2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApXG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4rICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuKyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4rICovXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuK3tcbitcdHN0cnVjdCBzdGF0ZnMgc3Q7XG4rXG4rXHRpZiAoIXN0YXRmcyhcIi90bXBcIiwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbitcdFx0cmV0dXJuIFwiLlwiO1xuK1x0cmV0dXJuIFwiL3RtcFwiO1xuK31cbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4rICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cbisgKi9cbitlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4rXHRDSElMRF9FWElUX09LID0gMCxcbitcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4rXHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4rXHRDSElMRF9FWElUX1JFQURfRklMRSxcbitcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuK3tcbitcdHN3aXRjaCAoY29kZSkge1xuK1x0Y2FzZSBDSElMRF9FWElUX09LOlxuK1x0XHRyZXR1cm4gXCJzdWNjZXNzXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4rXHRcdHJldHVybiBcImpvaW4gY2dyb3VwXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuK1x0XHRyZXR1cm4gXCJyZWFkIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgdGltZSBmaWxlXCI7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LypcbitcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxuK1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbitcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4rXHQgKi9cbitcdGlmICghYWNjZXNzKFwiL3Byb2Mvc3dhcHNcIiwgRl9PSykpIHtcbitcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbisvKlxuKyAqIFRoZSBkeWluZyB0ZXN0IG5lZWRzIGFuIGVtcHR5IHJlY2xhaW0gdGFyZ2V0IHBsdXMgYSBjZ3JvdXAgdGhhdCBrZWVwc1xuKyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4rICogc3RhcnRpbmcgYW5kIHJ1biBpbnRvIHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIHR3byBoYXZlIHRvIGJlIHNlcGFyYXRlXG4rICogY2dyb3VwczogdGhlIHRhcmdldCBtdXN0IGhvbGQgbm8gcHJvY2Vzc2VzIHRvIGJlIHJlbW92ZWQsIGFuZCB2MidzXG4rICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZlxuKyAqIGFueSBwYXJlbnQgdGhhdCBoYXMgZG9tYWluIGNoaWxkcmVuLlxuKyAqL1xuK3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRFlJTkdfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RSSUdHRVJfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRyaWdnZXJfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdGFyZ2V0X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqdGFyZ2V0X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdHNpemVfdCB3cml0dGVuID0gMDtcbitcdGNoYXIgKmJ1ZmZlcjtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCJ3YlwiKTtcbitcdGlmICghZnApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbitcdGlmICghYnVmZmVyKVxuK1x0XHRnb3RvIGNsZWFudXBfZnA7XG4rXG4rXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcbitcbitcdHdoaWxlICh3cml0dGVuIFx1MDAzYyBGSUxFX1NJWkUpIHtcbitcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuK1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4rXG4rXHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0d3JpdHRlbiArPSB0b193cml0ZTtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZyZWUoYnVmZmVyKTtcbitjbGVhbnVwX2ZwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4rXHRjaGFyICptYXA7XG4rXHRzaXplX3QgaTtcbitcdGludCBmZDtcbitcdHN0cnVjdCBzdGF0IHNiO1xuK1xuK1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgPT0gLTEpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwiLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7XG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcdH1cbitcbitcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4rXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICs9IHBhZ2Vfc2l6ZSkge1xuK1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4rXHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuK1x0XHRcdCh2b2lkKXY7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfZmQ6XG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSxcbitcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4rXG4rXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbitcbitcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZlbmQpO1xuK1xuK1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbitcbitcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xuK1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuK1x0cHJpbnRmKFwiJS42ZlxcblwiLCBlbGFwc2VkKTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0aW50IGVycjtcbitcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuK1xuK1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LypcbitcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXG4rXHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbitcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cbitcdCAqL1xuK1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG4rXG4rLypcbisgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHNcbisgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGVcbisgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuKyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseVxuKyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3BcbisgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4rICovXG4rc3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKVxuK3tcbitcdHBpZF90IHBpZCA9IGZvcmsoKTtcbitcbitcdGlmIChwaWQgIT0gMClcbitcdFx0cmV0dXJuIHBpZDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuK1x0XHRfZXhpdChDSElMRF9FWElUX0pPSU5fQ0dST1VQKTtcbitcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZSkpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSlcbitcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4rXHR9XG4rfVxuK1xuKy8qXG4rICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmRcbisgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mXG4rICogcmVjbGFpbWluZyBmcm9tIGl0LlxuKyAqXG4rICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmRcbisgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxuKyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIHJlY2xhaW1fY2FsbHMgZ3Jvd2luZ1xuKyAqIHdoaWxlIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBza2lwIGNvdW50ZXJzIG11c3QgZ3JvdyB3aGlsZSByZWNsYWltX2NhbGxzXG4rICogYW5kIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRwaWRfdCByZWFkZXJfcGlkID0gLTE7XG4rXHRpbnQgZXJyLCBmZCwgaTtcbitcbitcdGVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoXHUwMDI2dHJpZ2dlcl9jZ3JvdXBfaWQsIFx1MDAyNnRhcmdldF9jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2R5aW5nX2Nncm91cHNcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHNucHJpbnRmKGRhdGFfZmlsZSwgc2l6ZW9mKGRhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XG4rXHRmZCA9IG1rc3RlbXAoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFwiZm9yayBrZWVwYWxpdmUgcmVhZGVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMgXHUwMDNlIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbitcdH1cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fdGFyZ2V0X2dvbmUgfHxcbitcdFx0ICAgIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZylcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpO1xuK1x0fVxuK1xuK1x0aWYgKCFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lbGx1LCBkeWluZz0lbGx1KVwiLFxuK1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdFx0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIGl0IGlzIGhpdCBpcyB0aW1pbmdcbitcdCAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzb1xuK1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbitcdCAqL1xuK1x0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWxsdSwgZHlpbmc9JWxsdVxcblwiLFxuK1x0ICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXG4rXHQvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqL1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCBcInJlY2xhaW1fY2FsbHNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbWVkX2J5dGVzLCBieXRlc19iZWZvcmUsXG4rXHRcdCAgICAgICBcInJlY2xhaW1lZF9ieXRlc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rb3V0OlxuK1x0aWYgKHJlYWRlcl9waWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTtcbitcdFx0KHZvaWQpd2FpdHBpZChyZWFkZXJfcGlkLCBOVUxMLCAwKTtcbitcdH1cbitcdGlmIChkYXRhX2ZpbGVbMF0pXG4rXHRcdHVubGluayhkYXRhX2ZpbGUpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjU5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuKy8qXG4rICogUmVjbGFpbSBhdHRlbXB0cyBza2lwcGVkIGJlY2F1c2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcgb3IgaGFzXG4rICogYmVlbiByZW1vdmVkLiByZWNsYWltX3NraXBwZWRfZHlpbmcgY291bnRzIGxvb2t1cHMgdGhhdCBzdGlsbCBmb3VuZFxuKyAqIHRoZSBjZ3JvdXAgd2hpbGUgaXQgaXMgYmVpbmcgdG9ybiBkb3duLCByZWNsYWltX3RhcmdldF9nb25lIGNvdW50c1xuKyAqIGxvb2t1cHMgdGhhdCBmb3VuZCBub3RoaW5nLiBUaGUgdGVzdCByZW1vdmVzIHRoZSB0YXJnZXQgY2dyb3VwIHdoaWxlXG4rICogcmVjbGFpbSBpcyBydW5uaW5nIGFuZCBjaGVja3MgdGhhdCByZWNsYWltIHN0b3BzIHZpYSB0aGVzZSBjb3VudGVycy5cbisgKi9cbit1NjQgcmVjbGFpbV9za2lwcGVkX2R5aW5nO1xuK3U2NCByZWNsYWltX3RhcmdldF9nb25lO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbisvKlxuKyAqIEEgY2dyb3VwIGlzIGR5aW5nIG9uY2UgaXQgaGFzIGJlZW4gb2ZmbGluZWQgKENTU19PTkxJTkUgY2xlYXJlZCkgb3JcbisgKiBDU1NfRFlJTkcgaGFzIGJlZW4gcmFpc2VkLCBtaXJyb3JpbmcgY2dyb3VwX2lzX2RlYWQoKS9jc3NfaXNfZHlpbmcoKVxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbisgKiBzdWNoIGEgY2dyb3VwLCBiZWNhdXNlIGl0IG9ubHkgZmFpbHMgb25jZSB0aGUgbGFzdCByZWZlcmVuY2UgaGFzIGJlZW5cbisgKiBkcm9wcGVkLCBzbyByZWNsYWltIGhhcyB0byBjaGVjayB0aGVzZSBmbGFncyBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4rICpcbisgKiBDU1NfT05MSU5FIGFuZCBDU1NfRFlJTkcgY29tZSBmcm9tIHZtbGludXguaDogdGhlIGtlcm5lbCBkZWZpbmVzIHRoZW1cbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbisgKiBiaW5kIHRvLCBhbmQgcmVkZWNsYXJpbmcgdGhlbSBsb2NhbGx5IHdvdWxkIGNsYXNoIHdpdGggdGhlIHZtbGludXguaFxuKyAqIGVudW1lcmF0b3JzLiB2bWxpbnV4LmggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsJ3MgQlRGLCBzb1xuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cbisgKi9cbitzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjZ3JwLVx1MDAzZXNlbGYuZmxhZ3M7XG4rXG4rXHRyZXR1cm4gKGZsYWdzIFx1MDAyNiBDU1NfRFlJTkcpIHx8ICEoZmxhZ3MgXHUwMDI2IENTU19PTkxJTkUpO1xuK31cbitcbisvKlxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxuKyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbisgKiByZWNsYWltZWQuXG4rICovXG4rc3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0dTY0IG5yID0gMDtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpIHtcbitcdFx0cmVjbGFpbV90YXJnZXRfZ29uZSsrO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0cmVjbGFpbV9za2lwcGVkX2R5aW5nKys7XG4rXHRcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdHJlY2xhaW1fY2FsbHMrKztcbitcdG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6MjUuMzg1OTYwNzc1WiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjQ4NzAyNDE5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIFBvdGVudGlhbCBmb3IgRnV6emluZzogQSBTdHJhdGVnaWMgQXNzZXNzbWVudCoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBuZXcgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAga2Z1bmMgaXMgZXZlbiBhIGdvb2QgdGFyZ2V0IGZvciBmdXp6aW5nLCBhbmQgaWYgc28sIGhvdyB0byBhcHByb2FjaCBpdC4gRmlyc3QsIEkgbmVlZCB0byBnZXQgYSBoYW5kbGUgb24gdGhlIHNwZWNpZmljcyBvZiB0aGlzIHBhdGNoLlxuXG5SaWdodCwgdGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGtmdW5jIHdpdGhpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIE5vdywgSSBuZWVkIHRvIGNoZWNrIHRoZSBjb2RlYmFzZSB0byB1bmRlcnN0YW5kIHdoYXQgKmVuYWJsZXMqIHRoaXMgZnVuY3Rpb25hbGl0eS4gSSdsbCBuZWVkIHRvIGV4YW1pbmUgYG1tL2JwZl9tZW1jb250cm9sLmNgIGl0c2VsZiwgYW5kIHF1aWNrbHkgZGl2ZSBpbnRvIHRoZSByZWxldmFudCBgTWFrZWZpbGVgIGFuZCBgS2NvbmZpZ2AgZmlsZXMgd2l0aGluIHRoZSBgbW1gIGRpcmVjdG9yeS4gVGhhdCB3aWxsIHRlbGwgbWUgd2hpY2ggY29uZmlndXJhdGlvbiBvcHRpb25zIHRyaWdnZXIgdGhlIGluY2x1c2lvbiBvZiBgbW0vYnBmX21lbWNvbnRyb2wuY2AsIHRodXMgYWxzbyBpbmZvcm1pbmcgd2hhdCBjb25maWd1cmF0aW9ucyBJJ2xsIG5lZWQgdG8gZW5hYmxlIGR1cmluZyBmdXp6aW5nIHRvIGV2ZW4gbWFrZSB0aGlzIGNvZGUgcGF0aCBhY3RpdmUuIE9uY2UgSSBrbm93IHdoYXQgdHJpZ2dlcnMgdGhlIGluY2x1c2lvbiBvZiB0aGUgbmV3IGNvZGUsIEknbGwgdGhlbiBkZXRlcm1pbmUgd2hpY2ggc3ltYm9scyBhcmUgZ29vZCBmb2N1cyBwb2ludHMgdG8gZXh0cmFjdC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ4ODksIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMTIsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MToyNy44NzI5ODc4MjNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTU2Mjc0MzksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2xcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTEwNj1pZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG5tbS9NYWtlZmlsZToxMDc6b2JqLSQoQ09ORklHX01FTUNHKSArPSBicGZfbWVtY29udHJvbC5vXFxubW0vTWFrZWZpbGUtMTA4LWVuZGlmXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jPTIzMT1fX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjMyLVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjMzOkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjM0LUJURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X3Jvb3RfbWVtX2Nncm91cCwgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDI9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDM6QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ0LVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTEtICovXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTI6QlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1My1CVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTQ6QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTUtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTY6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1Ny1cXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI1ODpcXHQuc2V0ICAgICAgICAgICAgPSBcXHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNzLFxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU5LX07XFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjAtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNjE6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0ge1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjYyLVxcdC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLFxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjYzOlxcdC5zZXQgICAgICAgICAgICA9IFxcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcyxcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2NC19O1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjY1LVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjY2OnN0YXRpYyBpbnQgX19pbml0IGJwZl9tZW1jb250cm9sX2luaXQodm9pZClcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2Ny17XFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTI3MC1cXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjcxOlxcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjcyLVxcdGlmIChlcnIpIHtcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjc3LVxcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxcbm1tL2JwZl9tZW1jb250cm9sLmM6Mjc4OlxcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNzktXFx0aWYgKGVycilcXG4tLVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjgzLX1cXG5tbS9icGZfbWVtY29udHJvbC5jOjI4NDpsYXRlX2luaXRjYWxsKGJwZl9tZW1jb250cm9sX2luaXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MToyNy45Mjg2MjIxOTJaIiwiU2VxIjo1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNTc1NjE5MTM2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkRpdmluZyBpbnRvIGBtbS9icGZfbWVtY29udHJvbC5jYCoqXG5cbk9rYXksIHRpbWUgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGltcGxlbWVudGF0aW9uLiBMZXQncyBzdGFydCBieSBkaWdnaW5nIGludG8gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBJIG5lZWQgdG8gcmVmcmVzaCBteSBtZW1vcnkgb24gaG93IHRoZSBCUEYgaW50ZWdyYXRpb24gd2l0aCBtZW1vcnkgY29udHJvbCBpcyBhY3R1YWxseSBpbXBsZW1lbnRlZC4gSSdtIGVzcGVjaWFsbHkgY3VyaW91cyBhYm91dCBob3cgdGhlIGhvb2tzIGFyZSBzZXQgdXAgYW5kIGhvdyB0aGUgQlBGIHByb2dyYW1zIGludGVyYWN0IHdpdGggdGhlIG1lbWNnIGRhdGEgc3RydWN0dXJlcy4gSSdtIGV4cGVjdGluZyB0byBzZWUgY2FsbHMgcmVsYXRlZCB0byBgbWVtY2dfY3NzX2AsIGBtZW1fY2dyb3VwX2AsIGFuZCBwcm9iYWJseSBzb21lIGludGVyYWN0aW9uIHdpdGggdGhlIHBlci1jcHUgc3RhdHMuIEknbSBrZWVuIHRvIHNlZSB0aGUgc3BlY2lmaWMgcG9pbnRzIG9mIGluamVjdGlvbjogYWxsb2NhdGlvbiBwYXRocywgcmVjbGFpbSwgbWlncmF0aW9uLCBldGMuIFRoaXMgaXMgd2hlcmUgdGhlIG1hZ2ljIGhhcHBlbnMsIHNvIGxldCdzIHNlZSBob3cgdGhlIEJQRiBob29rcyBpbnRvIHRoZXNlIGNyaXRpY2FsIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbXMuIFVsdGltYXRlbHksIEknbSB0cnlpbmcgdG8gZ3JvayB0aGUgb3ZlcmhlYWQgaW50cm9kdWNlZCBhbmQsIG1vcmUgaW1wb3J0YW50bHksIHRoZSBsZXZlbCBvZiBjb250cm9sIGFmZm9yZGVkIGJ5IHRoaXMgaW50ZWdyYXRpb24uIFRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNjIyMiwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjMwLjUwNDI0NDY0OFoiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjczOTIwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcIm1tL2JwZl9tZW1jb250cm9sLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTUwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgMTUwOlxcdH1cXG4gMTUxOlxcdFxcbiAxNTI6XFx0LyoqXFxuIDE1MzpcXHQgKiBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyAtIEZsdXNoIG1lbW9yeSBjZ3JvdXAncyBzdGF0aXN0aWNzXFxuIDE1NDpcXHQgKiBAbWVtY2c6IG1lbW9yeSBjZ3JvdXBcXG4gMTU1OlxcdCAqXFxuIDE1NjpcXHQgKiBQcm9wYWdhdGUgbWVtb3J5IGNncm91cCdzIHN0YXRpc3RpY3MgdXAgdGhlIGNncm91cCB0cmVlLlxcbiAxNTc6XFx0ICovXFxuIDE1ODpcXHRfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4gMTU5OlxcdHtcXG4gMTYwOlxcdFxcdG1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpO1xcbiAxNjE6XFx0fVxcbiAxNjI6XFx0XFxuIDE2MzpcXHQvKlxcbiAxNjQ6XFx0ICogUmVjbGFpbSBtdXN0IG5vdCByZWN1cnNlOiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgb3ZlcndyaXRlc1xcbiAxNjU6XFx0ICogY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZSwgc28gYSBuZXN0ZWQgY2FsbCB3b3VsZCBjb3JydXB0IHRoZSBvdXRlclxcbiAxNjY6XFx0ICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcXG4gMTY3OlxcdCAqIHJlY2xhaW1fc3RhdGUgaXMgYWxzbyBjaGVja2VkIGJlY2F1c2UgaXQgaXMgaW5zdGFsbGVkIHNsaWdodGx5XFxuIDE2ODpcXHQgKiBiZWZvcmUgUEZfTUVNQUxMT0MuXFxuIDE2OTpcXHQgKi9cXG4gMTcwOlxcdHN0YXRpYyBib29sIGJwZl9pbl9yZWNsYWltX2NvbnRleHQodm9pZClcXG4gMTcxOlxcdHtcXG4gMTcyOlxcdFxcdHJldHVybiAoY3VycmVudC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cXHUwMDNlcmVjbGFpbV9zdGF0ZTtcXG4gMTczOlxcdH1cXG4gMTc0OlxcdFxcbiAxNzU6XFx0LyoqXFxuIDE3NjpcXHQgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XFxuIDE3NzpcXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXBcXG4gMTc4OlxcdCAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxcbiAxNzk6XFx0ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xcbiAxODA6XFx0ICogICAgICAgICBNRU1DR19DSEFSR0VfQkFUQ0ggKDY0IHBhZ2VzKVxcbiAxODE6XFx0ICpcXG4gMTgyOlxcdCAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cXG4gMTgzOlxcdCAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxcbiAxODQ6XFx0ICpcXG4gMTg1OlxcdCAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xcbiAxODY6XFx0ICogdGhlIG1lbW9yeS5oaWdoIHdvcmtxdWV1ZSBmYWxsYmFjayBpbiBoaWdoX3dvcmtfZnVuYygpLiBUbyByZWNsYWltXFxuIDE4NzpcXHQgKiBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseSBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXFxuIDE4ODpcXHQgKlxcbiAxODk6XFx0ICogVGhpcyBrZnVuYyBpcyByZXN0cmljdGVkIHRvIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCB0byBlbnN1cmUgaXQgcnVuc1xcbiAxOTA6XFx0ICogaW4gYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQuIFRoZSBTWVNDQUxMIHByb2dyYW0gY2FuIHNjaGVkdWxlIHRoZVxcbiAxOTE6XFx0ICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXFxuIDE5MjpcXHQgKiBzYWZlIHByb2Nlc3MgY29udGV4dCAod29ya3F1ZXVlLCB0YXNrX3dvcmspLlxcbiAxOTM6XFx0ICpcXG4gMTk0OlxcdCAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXFxuIDE5NTpcXHQgKiBjYWxsYmFjayBhbmQgcmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoIHJhdGhlclxcbiAxOTY6XFx0ICogdGhhbiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2s6IGEgbG9uZy1ydW5uaW5nIGNhbGxiYWNrIHN0YWxsc1xcbiAxOTc6XFx0ICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXFxuIDE5ODpcXHQgKiBpbnRlcnJ1cHRzIGRpc2FibGVkIHRoZSByZXN1bHRpbmcgY29udGVudGlvbiBhbHNvIGRlbGF5cyBJUElcXG4gMTk5OlxcdCAqIGhhbmRsaW5nLiBHaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gYnBmX3dxIGl0ZW0sIHNvIHRoYXRcXG4gMjAwOlxcdCAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxcbiAyMDE6XFx0ICogYW5vdGhlci4gRGVjaWRpbmcgd2hldGhlciB0byBzdWJtaXQgdGhlIG5leHQgYmF0Y2ggaXMgdXAgdG8gdGhlIEJQRlxcbiAyMDI6XFx0ICogcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3AgYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXNcXG4gMjAzOlxcdCAqIGR5aW5nLlxcbiAyMDQ6XFx0ICpcXG4gMjA1OlxcdCAqIE11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGEgZmlsZXN5c3RlbSBsb2NrIGhlbGQ6IHRoZSByZWNsYWltIHBhdGhcXG4gMjA2OlxcdCAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXFxuIDIwNzpcXHQgKlxcbiAyMDg6XFx0ICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXFxuIDIwOTpcXHQgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXFxuIDIxMDpcXHQgKi9cXG4gMjExOlxcdF9fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4gMjEyOlxcdFxcdFxcdFxcdFxcdFxcdFxcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcXG4gMjEzOlxcdHtcXG4gMjE0OlxcdFxcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xcbiAyMTU6XFx0XFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcXG4gMjE2OlxcdFxcbiAyMTc6XFx0XFx0aWYgKHNpemUgXFx1MDAzYyBQQUdFX1NJWkUgfHwgdW5saWtlbHkoYnBmX2luX3JlY2xhaW1fY29udGV4dCgpKSlcXG4gMjE4OlxcdFxcdFxcdHJldHVybiAwO1xcbiAyMTk6XFx0XFxuIDIyMDpcXHRcXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xcbiAyMjE6XFx0XFxuIDIyMjpcXHRcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG4gMjIzOlxcdFxcdFxcdFxcdFxcdFxcdFxcdCAgICBHRlBfS0VSTkVMLFxcbiAyMjQ6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxcbiAyMjU6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFLFxcbiAyMjY6XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgIE5VTEwpO1xcbiAyMjc6XFx0XFxuIDIyODpcXHRcXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xcbiAyMjk6XFx0fVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTozMC41MDQzMjA0NDhaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozNzkwMzYzMjE2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEluaXRpYWwgQXNzZXNzbWVudCBvZiB0aGUgQlBGIFByb2FjdGl2ZSBSZWNsYWltIFBhdGNoKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duIHN5c3RlbWF0aWNhbGx5LiBNeSBmaXJzdCB0aG91Z2h0IGlzIHRvIHVuZGVyc3RhbmQgdGhlIHNjb3BlIG9mIHRoaXMgY2hhbmdlLiBJdCBhcHBlYXJzIHdlJ3JlIGludHJvZHVjaW5nIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCwgd2l0aGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gVGhhdCBpbiBpdHNlbGYgaXMgaW50ZXJlc3RpbmcuIFRoaXMga2Z1bmMsIGNhbGxhYmxlIGZyb20gYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAg4oCTIGFuZCBjcnVjaWFsbHksIGZyb20gYSBzbGVlcGFibGUgY29udGV4dCDigJMgdGhlbiBwcm9jZWVkcyB0byBjYWxsIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLlxuXG5OZXh0LCBJIG5lZWQgdG8gY29uc2lkZXIgaXRzIGFwcGxpY2FiaWxpdHkuIElzIHRoaXMgc29tZXRoaW5nIHRoYXQncyBldmVuICpyZWxldmFudCogdG8gc3RhbmRhcmQgdmlydHVhbGl6YXRpb24gc2V0dXBzIGxpa2UgUUVNVT8gVGhlIGFuc3dlciwgSSBxdWlja2x5IGFzc2VzcywgaXMgYSBkZWZpbml0ZSB5ZXMuIFRoZSBCUEYgc3Vic3lzdGVtIGlzIGVudGlyZWx5IHJlYWNoYWJsZSB0aHJvdWdoIHN5c2NhbGxzIGxpa2UgYGJwZihCUEZfUFJPR19MT0FEKWAgYW5kIGBicGYoQlBGX1BST0dfVEVTVF9SVU4pYCwgYW5kIG1lbW9yeSBjZ3JvdXBzIGFyZSwgb2YgY291cnNlLCBlcXVhbGx5IGFjY2Vzc2libGUuIEdpdmVuIHRoYXQgYm90aCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIGtmdW5jcyBhcmUgY29yZSBzdWJzeXN0ZW1zLCB0aGlzIGFyZWEgaXMgc2NyZWFtaW5nIGZvciBmdXp6aW5nLiBJdCdzIGEgcHJpbWUgdGFyZ2V0IGZvciBmaW5kaW5nIHN1YnRsZSwgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgdnVsbmVyYWJpbGl0aWVzLlxuXG5Ob3csIEknbSB0aGlua2luZyBhYm91dCB0aGUgcHJlcmVxdWlzaXRlcy4gTG9va2luZyBhdCBgbW0vTWFrZWZpbGVgLCB0aGUgaW5jbHVzaW9uIG9mIGBicGZfbWVtY29udHJvbC5vYCBoaW5nZXMgb24gYENPTkZJR19CUEZfU1lTQ0FMTGAgYW5kLCBpbXBsaWNpdGx5LCBgQ09ORklHX01FTUNHYC4gRnVydGhlcm1vcmUsIGBERUJVR19JTkZPX0JURmAgaXMgdXN1YWxseSBhIG5lY2Vzc2FyeSBpbmdyZWRpZW50IGZvciBCVEYga2Z1bmNzLCB3aGljaCBhcmUgaGVhdmlseSByZWxhdGVkIHRvIEJQRiBrZnVuYyBzdXBwb3J0LCBhcyB3ZWxsIGFzIGBCUEZfU1lTQ0FMTGAgYW5kLCBhZ2FpbiwgYE1FTUNHYC4gSSdsbCBuZWVkIHRvIGRvdWJsZS1jaGVjayB0aGUgS2NvbmZpZyBvcHRpb25zIGFyb3VuZCBCVEYsIGtmdW5jcywgYEJQRl9TWVNDQUxMYCwgYW5kIGBNRU1DR2AgdG8gbWFrZSBzdXJlIHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzZXQgY29ycmVjdGx5LCBidXQgdGhpcyBhbGwgc2VlbXMgcXVpdGUgcGxhdXNpYmxlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzg1MSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwMSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM0LjI5NDY4NjQxNFoiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NDcxMDkyOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0XCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9icGYvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImtlcm5lbC9icGYvYXJlbmEuYz0xMTMxPXN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcXG5rZXJuZWwvYnBmL2FyZW5hLmMtMTEzMi17XFxua2VybmVsL2JwZi9hcmVuYS5jOjExMzM6XFx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFxcdTAwMjZjb21tb25fa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2FyZW5hLmMtMTEzNC19XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg5MTk9c3RhdGljIGludCBidGZfcG9wdWxhdGVfa2Z1bmNfc2V0KHN0cnVjdCBidGYgKmJ0ZiwgZW51bSBidGZfa2Z1bmNfaG9vayBob29rLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy04OTY1LVxcdHNldCA9IHRhYi1cXHUwMDNlc2V0c1tob29rXTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjg5NjY6XFx0LyogV2FybiB3aGVuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQgaXMgY2FsbGVkIHR3aWNlIGZvciB0aGUgc2FtZSBob29rXFxua2VybmVsL2JwZi9idGYuYy04OTY3LVxcdCAqIGZvciBtb2R1bGUgc2V0cy5cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9OTE5MD11MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtOTE5OC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjkxOTk6c3RhdGljIGludCBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBidGZfa2Z1bmNfaG9vayBob29rLFxcbmtlcm5lbC9icGYvYnRmLmMtOTIwMC1cXHRcXHRcXHRcXHQgICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjUtLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgb25seSBmcm9tIGluaXRjYWxscy9tb2R1bGUgaW5pdCBmdW5jdGlvbnMgKi9cXG5rZXJuZWwvYnBmL2J0Zi5jOjkyMjY6aW50IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjctXFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMzktXFx0aG9vayA9IGJwZl9wcm9nX3R5cGVfdG9fa2Z1bmNfaG9vayhwcm9nX3R5cGUpO1xcbmtlcm5lbC9icGYvYnRmLmM6OTI0MDpcXHRyZXR1cm4gX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGhvb2ssIGtzZXQpO1xcbmtlcm5lbC9icGYvYnRmLmMtOTI0MS19XFxua2VybmVsL2JwZi9idGYuYzo5MjQyOkVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQpO1xcbmtlcm5lbC9icGYvYnRmLmMtOTI0My1cXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9OTI0NT1pbnQgcmVnaXN0ZXJfYnRmX2Ztb2RyZXRfaWRfc2V0KGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxcbmtlcm5lbC9icGYvYnRmLmMtOTI0Ni17XFxua2VybmVsL2JwZi9idGYuYzo5MjQ3OlxcdHJldHVybiBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlRGX0tGVU5DX0hPT0tfRk1PRFJFVCwga3NldCk7XFxua2VybmVsL2JwZi9idGYuYy05MjQ4LX1cXG4tLVxcbmtlcm5lbC9icGYvY3B1bWFzay5jPTUxNT1zdGF0aWMgaW50IF9faW5pdCBjcHVtYXNrX2tmdW5jX2luaXQodm9pZClcXG4tLVxcbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyNS1cXHRyZXQgPSBicGZfbWVtX2FsbG9jX2luaXQoXFx1MDAyNmJwZl9jcHVtYXNrX21hLCBzaXplb2Yoc3RydWN0IGJwZl9jcHVtYXNrKSwgZmFsc2UpO1xcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNjpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1RSQUNJTkcsIFxcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI3OlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1Mjg6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLCBcXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyOS1cXHRyZXR1cm4gIHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoY3B1bWFza19kdG9ycyxcXG4tLVxcbmtlcm5lbC9icGYvY3J5cHRvLmM9Mzc5PXN0YXRpYyBpbnQgX19pbml0IGNyeXB0b19rZnVuY19pbml0KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL2NyeXB0by5jLTM4OC1cXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM4OTpcXHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MDpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCwgXFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcnlwdG8uYzozOTE6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFxcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkyOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcXG5rZXJuZWwvYnBmL2NyeXB0by5jLTM5My1cXHRcXHRcXHRcXHRcXHQgICAgICAgXFx1MDAyNmNyeXB0X2luaXRfa2Z1bmNfc2V0KTtcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jPTQ5ODI9c3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxcbi0tXFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDk5Ny1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0OTk4OlxcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjQ5OTk6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMDpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1hEUCwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAxOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1RSVUNUX09QUywgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAyOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAzOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfQ0dST1VQX1NLQiwgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA0LVxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfaWRfZHRvcl9rZnVuY3MoZ2VuZXJpY19kdG9ycyxcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDYtXFx0XFx0XFx0XFx0XFx0XFx0ICBUSElTX01PRFVMRSk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwNzpcXHRyZXR1cm4gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFxcdTAwMjZjb21tb25fa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA4LX1cXG4tLVxcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYz0yMzA9c3RhdGljIGludCBpbml0X3N1YnN5c3RlbSh2b2lkKVxcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYy0yMzEte1xcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYzoyMzI6XFx0cmV0dXJuIHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFxcdTAwMjZicGZfbWFwX2l0ZXJfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMzLX1cXG4tLVxcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jPTc1OT1zdGF0aWMgX19pbml0IGludCBycXNwaW5sb2NrX3JlZ2lzdGVyX2tmdW5jcyh2b2lkKVxcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2MC17XFxua2VybmVsL2JwZi9ycXNwaW5sb2NrLmM6NzYxOlxcdHJldHVybiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2cnFzcGlubG9ja19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2Mi19XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM0LjM0OTM5OTE1M1oiLCJTZXEiOjksIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNzI0OTM5ODMsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSBhdHRlbXB0IGF0IHN1bW1hcml6aW5nIHRob3NlIHRob3VnaHRzIGZyb20gYSBmaXJzdC1wZXJzb24sIGV4cGVydCBwZXJzcGVjdGl2ZSwgZm9jdXNpbmcgb24gdGhlIGltcGxpZWQgcmVhc29uaW5nOlxuXG4qKkNoZWNraW5nIEtjb25maWcgZm9yIENydWNpYWwgS2VybmVsIEZlYXR1cmVzKipcblxuUmlnaHQsIGxldCdzIGRpdmUgaW4uIEkgbmVlZCB0byBxdWlja2x5IGFzY2VydGFpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gc3RhdGUuIFNwZWNpZmljYWxseSwgSSdtIHRoaW5raW5nIGFib3V0IHdoZXRoZXIgYE1FTUNHYCAobWVtb3J5IGNncm91cHMpIGlzIGVuYWJsZWQuIEl0J3MgYWxtb3N0IGEgZ2l2ZW4gdGhhdCBpdCdzIGltcG9ydGFudCBmb3IgdGhpcyBraW5kIG9mIHdvcmssIGJ1dCBJIGFsd2F5cyB3YW50IHRvIGNvbmZpcm0uIEl0J3MgbGlrZWx5IGludm9sdmVkIGluIHJlc291cmNlIG1hbmFnZW1lbnQgZm9yIHdoYXRldmVyIEknbSB0cm91Ymxlc2hvb3Rpbmcgb3IgZGV2ZWxvcGluZy4gVGhlbiwgSSBuZWVkIHRvIHZlcmlmeSBgQlBGX1NZU0NBTExgIGFzIHdlbGwsIGJlY2F1c2UgSSdtIGJldHRpbmcgSSdsbCBiZSB0b3VjaGluZyBlQlBGIGF0IHNvbWUgcG9pbnQsIGVpdGhlciBmb3IgaW5zdHJ1bWVudGF0aW9uIG9yIGZvciBmaWx0ZXJpbmcuIENoZWNraW5nIHRoZXNlIGluIEtjb25maWcgd2lsbCBsZXQgbWUga25vdyB3aGV0aGVyIEkgbmVlZCB0byByZWNvbXBpbGUgdGhlIGtlcm5lbCwgb3IgaWYgdGhlc2UgYXJlIGFscmVhZHkgZW5hYmxlZCBvbiB0aGUgc3lzdGVtIEkgYW0gd29ya2luZyB3aXRoLiBNYWtpbmcgc3VyZSB0aGVzZSBhcmUgc2V0IGNvcnJlY3RseSBpcyBhIGZvdW5kYXRpb25hbCBzdGVwIGJlZm9yZSBkaWdnaW5nIGludG8gdGhlIGRldGFpbHMuIFRpbWUgdG8gZ2V0IHRoZSBsYXkgb2YgdGhlIGxhbmQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNjI1LCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6MzYuNTIxODk1NDQ2WiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjA1MzYzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgTUVNQ0dcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9LY29uZmlnXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluaXQvS2NvbmZpZz0xMDY3PWNvbmZpZyBDR1JPVVBfRkFWT1JfRFlOTU9EU1xcbi0tXFxuaW5pdC9LY29uZmlnLTEwNzYtXFxuaW5pdC9LY29uZmlnOjEwNzc6Y29uZmlnIE1FTUNHXFxuaW5pdC9LY29uZmlnLTEwNzgtXFx0Ym9vbCBcXFwiTWVtb3J5IGNvbnRyb2xsZXJcXFwiXFxuLS1cXG5pbml0L0tjb25maWctMTA4NS1cXG5pbml0L0tjb25maWc6MTA4Njpjb25maWcgTUVNQ0dfTk1JX1VOU0FGRVxcbmluaXQvS2NvbmZpZy0xMDg3LVxcdGJvb2xcXG4tLVxcbmluaXQvS2NvbmZpZy0xMDkyLVxcbmluaXQvS2NvbmZpZzoxMDkzOmNvbmZpZyBNRU1DR19OTUlfU0FGRVRZX1JFUVVJUkVTX0FUT01JQ1xcbmluaXQvS2NvbmZpZy0xMDk0LVxcdGJvb2xcXG4tLVxcbmluaXQvS2NvbmZpZy0xMDk5LVxcbmluaXQvS2NvbmZpZzoxMTAwOmNvbmZpZyBNRU1DR19WMVxcbmluaXQvS2NvbmZpZy0xMTAxLVxcdGJvb2wgXFxcIkxlZ2FjeSBjZ3JvdXAgdjEgbWVtb3J5IGNvbnRyb2xsZXJcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM2LjU3Mzk1NTMzNloiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxODc3MTU2OTY4LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipJbnZlc3RpZ2F0aW5nIEJQRiBTeXNjYWxsIENvbmZpZ3VyYXRpb24qKlxuXG5BbHJpZ2h0LCBJIG5lZWQgdG8gcGlucG9pbnQgd2hlcmUgdGhlIGBCUEZfU1lTQ0FMTGAgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgZGVmaW5lZC4gS25vd2luZyB0aGUga2VybmVsJ3MgS2NvbmZpZyBzdHJ1Y3R1cmUgbGlrZSB0aGUgYmFjayBvZiBteSBoYW5kLCBteSBmaXJzdCBpbnN0aW5jdCBpcyB0byBjaGVjayBlaXRoZXIgYGluaXQvS2NvbmZpZ2Agb3IgYGtlcm5lbC9icGYvS2NvbmZpZ2AuIFRob3NlIGFyZSB0aGUgdHdvIG1vc3QgbG9naWNhbCBwbGFjZXMgdG8gc3RhcnQgbG9va2luZyBmb3IgYSBCUEYtcmVsYXRlZCBzZXR0aW5nLiBJdCdzIGFsbW9zdCBjZXJ0YWluIGl0J2xsIGJlIGluIG9uZSBvZiB0aG9zZSwgb3IgcGVyaGFwcyBjcm9zcy1yZWZlcmVuY2VkIGJldHdlZW4gdGhlbS4gVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHVuZGVyc3RhbmRpbmcgaG93IHRoZSBCUEYgc3lzY2FsbCBmZWF0dXJlIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgYXQgYnVpbGQgdGltZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MjExMTMsIk91dHB1dFRva2VucyI6MjksIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTozOC40NTExMTYyNDRaIiwiU2VxIjoxMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ2NDYyNzk5LCJFcnJvciI6Im5vIG1hdGNoZXMiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgQlBGX1NZU0NBTExcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5pdC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiZXJyb3JcIjogXCJubyBtYXRjaGVzXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjM4LjQ5NzU4NzA2M1oiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyNjk0MzM5NDg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYXR0ZW1wdCBhdCBzdW1tYXJpemluZyB0aGUgdGhvdWdodCBwcm9jZXNzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkh1bnRpbmcgZm9yIEJQRl9TWVNDQUxMIGluIHRoZSBDb25maWcqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gdHJhY2sgZG93biB0aGUgY29uZmlndXJhdGlvbiBvcHRpb24gZm9yIGBCUEZfU1lTQ0FMTGAuIEknbSBnb2luZyB0byBzdGFydCBieSBhc3N1bWluZyBpdCdzIGxpa2VseSBhIGtlcm5lbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlciwgcHJvYmFibHkgdW5kZXIgb25lIG9mIHRoZSBicm9hZGVyIEJQRiBvciBzZWN1cml0eS1yZWxhdGVkIHNlY3Rpb25zLiBTaW5jZSBpdCdzIGEgc3lzY2FsbC1yZWxhdGVkIGZlYXR1cmUsIEkgY2FuIGFsbW9zdCBndWFyYW50ZWUgaXRzIGV4aXN0ZW5jZS4gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaG93IGl0J3MgZGVmaW5lZCBhbmQgd2hhdCBkZXBlbmRlbmNpZXMgaXQgbWlnaHQgaGF2ZS4gTXkgZmlyc3QgaW5zdGluY3QgaXMgdG8gdXNlIHRoZSBzdGFuZGFyZCB0b29sczsgYSBgZ3JlcGAgdGhyb3VnaCB0aGUga2VybmVsJ3MgYEtjb25maWdgIGZpbGVzIHNob3VsZCBkbyB0aGUgdHJpY2ssIG1heWJlIHN0YXJ0aW5nIHdpdGggYSB3aWxkY2FyZCBzZWFyY2ggbGlrZSBgS2NvbmZpZyogQlBGX1NZU0NBTExgLiBPciBwZXJoYXBzIEkgd2lsbCB1c2UgJ2ZpbmQnIGFuZCAnZ3JlcCcgY29tbWFuZHMgdG8gc2VhcmNoLiBEZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGNvZGViYXNlLCBJIG1pZ2h0IG5lZWQgdG8gcmVmaW5lIHRoYXQgc2VhcmNoIGlmIGl0J3MgdG9vIGJyb2FkIGluaXRpYWxseS4gSSdsbCBuZWVkIHRvIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGNvbnRleHQgYXJvdW5kIHRoYXQgb3B0aW9uIOKAkyB3aGF0IG90aGVyIGZlYXR1cmVzIGRvZXMgaXQgZW5hYmxlIG9yIGRpc2FibGU/IEFyZSB0aGVyZSBhbnkgcHJlcmVxdWlzaXRlcyBJIG5lZWQgdG8gYmUgYXdhcmUgb2Y/IEFuZCBtb3JlIGltcG9ydGFudGx5LCB3aGF0J3MgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHdoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgb2YgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIGl0PyBJJ2xsIHByb2JhYmx5IGFsc28gY2hlY2sgcmVsZXZhbnQgYE1ha2VmaWxlYHMgdG8gdW5kZXJzdGFuZCBob3cgdGhpcyBjb25maWcgb3B0aW9uIHRyYW5zbGF0ZXMgaW50byBidWlsZCBmbGFncyBhbmQgdWx0aW1hdGVseSwgaG93IGl0IGFmZmVjdHMgdGhlIGdlbmVyYXRlZCBrZXJuZWwgY29kZS4gSWRlYWxseSwgSSdsbCBmaW5kIGEgY29uY2lzZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBvcHRpb24gYWN0dWFsbHkgKmRvZXMqIGFsb25nIHRoZSB3YXkuIFRoYXQncyB0aGUgcHJpb3JpdHkgcmlnaHQgbm93LCBmaW5kaW5nIGl0cyBkZWZpbml0aW9uLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTMzNCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEyLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjQxLjE5MTkyODk4OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzM1Mjc4NjksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiY29uZmlnIEJQRl9TWVNDQUxMXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImtlcm5lbC9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwia2VybmVsL2JwZi9LY29uZmlnPTI5PW1lbnUgXFxcIkJQRiBzdWJzeXN0ZW1cXFwiXFxua2VybmVsL2JwZi9LY29uZmlnLTMwLVxcbmtlcm5lbC9icGYvS2NvbmZpZzozMTpjb25maWcgQlBGX1NZU0NBTExcXG5rZXJuZWwvYnBmL0tjb25maWctMzItXFx0Ym9vbCBcXFwiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0MS4yNjU0NjAzNDdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjY5ODg3NzAyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgREVCVUdfSU5GT19CVEYgRGVwZW5kZW5jeSBmb3IgQlRGIEtmdW5jcyoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IG15IGhhbmRzIGRpcnR5LiBJJ20gdGFraW5nIGEgbG9vayBhdCBob3cgYERFQlVHX0lORk9fQlRGYCB0aWVzIGludG8gQlRGIGtmdW5jcy4gTXkgaW1tZWRpYXRlIHF1ZXN0aW9uIGlzOiAqaXMqIGl0IGEgaGFyZCBkZXBlbmRlbmN5PyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBpZiBgREVCVUdfSU5GT19CVEZgIGlzIHN0cmljdGx5ICpyZXF1aXJlZCogZm9yIHRoZSBwcm9wZXIgZnVuY3Rpb25hbGl0eSBhbmQgZ2VuZXJhdGlvbiBvZiBCVEYgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBrZnVuY3MsIG9yIGlmIHRoZXJlJ3Mgc29tZSBsZXZlbCBvZiBmbGV4aWJpbGl0eSBoZXJlLiBUaGlzIGhhcyBpbXBsaWNhdGlvbnMgZm9yIHBvdGVudGlhbCBvcHRpbWl6YXRpb25zIGFuZCBob3cgd2UgY2FuIGFwcHJvYWNoIHRvb2xpbmcuIEkndmUgZ290IGEgbWVudGFsIGNoZWNrbGlzdCBhbHJlYWR5OiBJcyBpdCBuZWNlc3NhcnkgZm9yIHRoZSAqY3JlYXRpb24qIG9mIGtmdW5jIEJURiwgb3IganVzdCBmb3IgbW9yZSBkZXRhaWxlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24/IERvZXMgaXQgaW1wYWN0IHJ1bnRpbWUgcGVyZm9ybWFuY2Ugb3Igb25seSBjb21waWxhdGlvbiB0aW1lPyBJIG5lZWQgdG8gZGlnIGludG8gdGhlIHJlbGV2YW50IGNvZGUgcGF0aHMgYW5kIGJ1aWxkIHByb2Nlc3Nlcy4gR290dGEgc3RhcnQgd2l0aCB0aGUgQlRGIGdlbmVyYXRpb24gYW5kIHN5bWJvbCB0YWJsZSBhbmFseXNpcyBhbmQgc2VlIHdoZXJlIHRoYXQgYml0IG9mIGluZm9ybWF0aW9uIHBsdWdzIGluLiBFc3NlbnRpYWxseSwgSSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHByZWNpc2Ugc2NvcGUgb2YgdGhpcyBkZXBlbmRlbmN5LiBJdCdzIHRpbWUgdG8gZmlyZSB1cCB0aGUgdG9vbHMgYW5kIHRyYWNlIHRoZSBmbG93LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTc4MywiT3V0cHV0VG9rZW5zIjozMywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjQzLjk2NDMzOTM3MloiLCJTZXEiOjE2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTI2MzM1MDU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcInJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwiaW5jbHVkZS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwiaW5jbHVkZS9saW51eC9idGYuaD01ODg9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXFxuaW5jbHVkZS9saW51eC9idGYuaC01ODktXFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IGJwZl9wcm9nICpwcm9nKTtcXG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjU5MDppbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxcbmluY2x1ZGUvbGludXgvYnRmLmgtNTkxLVxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKTtcXG4tLVxcbmluY2x1ZGUvbGludXgvYnRmLmg9NjQ4PXN0YXRpYyBpbmxpbmUgdTMyICpidGZfa2Z1bmNfaWRfc2V0X2NvbnRhaW5zKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4tLVxcbmluY2x1ZGUvbGludXgvYnRmLmgtNjU0LX1cXG5pbmNsdWRlL2xpbnV4L2J0Zi5oOjY1NTpzdGF0aWMgaW5saW5lIGludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXFxuaW5jbHVkZS9saW51eC9idGYuaC02NTYtXFx0XFx0XFx0XFx0XFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0NC4wOTA2NzkzMloiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMzM4NzgwNjIxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0czpcblxuKipOYXZpZ2F0aW5nIHRoZSBCVEYgTWF6ZSoqXG5cbk9rYXksIHNvIEknbSBkaWdnaW5nIGludG8gc29tZXRoaW5nIHJlbGF0ZWQgdG8gQlRGIChCZXJrZWxleSBlQlBGIFR5cGUgRm9ybWF0KSBhbmQgdHJ5aW5nIHRvIGZpZ3VyZSBvdXQgYSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBwYXRoLiBNeSBpbnR1aXRpb24gaXMgdGVsbGluZyBtZSB0aGF0IHRoZSByZWxldmFudCBjb2RlIG1pZ2h0IGhpbmdlIG9uIGBDT05GSUdfQlBGX1NZU0NBTExgIGFuZCBgQ09ORklHX0RFQlVHX0lORk9fQlRGYCBiZWluZyBkZWZpbmVkLiBTbywgSSBuZWVkIHRvIHZlcmlmeSB0aGF0IGFuZCBzZWUgaG93IHRoZXkgaW50ZXJhY3QuIE15IG1lbnRhbCBtYXAgcG9pbnRzIG1lIHRvd2FyZHMgYGluY2x1ZGUvbGludXgvYnRmLmhgIGFzIHRoZSBsaWtlbHkgbG9jYXRpb24sIGFuZCBzaW5jZSB0aGVzZSBzb3J0cyBvZiBjb25kaXRpb25hbHMgb2Z0ZW4gY2x1c3RlciB0b2dldGhlciwgSSdtIGdvaW5nIHRvIHF1aWNrbHkgc2NhbiBsaW5lcyByb3VnaGx5IGJldHdlZW4gNTgwIGFuZCA2NjAuIEhvcGVmdWxseSwgaXQncyBsYWlkIG91dCBpbiBhIHdheSB0aGF0J3MgZWFzeSB0byByZWFkIGFuZCBJIGNhbiBxdWlja2x5IGFzY2VydGFpbiB3aGV0aGVyIG15IGh1bmNoIGlzIHJpZ2h0IGFuZCB3aGF0IHRoZSBsb2dpYyBmbG93IGlzLiBJJ20gZXhwZWN0aW5nIHRvIGZpbmQgZWl0aGVyIGFuIGAjaWZgIGJsb2NrIG9yIHNvbWV0aGluZyBzaW1pbGFyIHRoYXQgYWRkcmVzc2VzIHRob3NlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb25zLiBUaGlzIHNob3VsZCBiZSBhIHF1aWNrIGNoZWNrLCBob3BlZnVsbHkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIyMzYxLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjksIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NDYuNDI5NDYzMDExWiIsIlNlcSI6MTgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjkzNTgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvYnRmLmhcIixcbiAgXCJGaXJzdExpbmVcIjogNTgwLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgNTgwOlxcdFxcbiA1ODE6XFx0Y29uc3QgY2hhciAqYnRmX25hbWVfYnlfb2Zmc2V0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIG9mZnNldCk7XFxuIDU4MjpcXHRjb25zdCBjaGFyICpidGZfc3RyX2J5X29mZnNldChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBvZmZzZXQpO1xcbiA1ODM6XFx0c3RydWN0IGJ0ZiAqYnRmX3BhcnNlX3ZtbGludXgodm9pZCk7XFxuIDU4NDpcXHRzdHJ1Y3QgYnRmICpicGZfcHJvZ19nZXRfdGFyZ2V0X2J0Zihjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpO1xcbiA1ODU6XFx0dTMyICpidGZfa2Z1bmNfZmxhZ3MoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIga2Z1bmNfYnRmX2lkLCBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpO1xcbiA1ODY6XFx0aW50IGJ0Zl9rZnVuY19jaGVja19mbGFnKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCwgdTMyIGZsYWcpO1xcbiA1ODc6XFx0Ym9vbCBidGZfa2Z1bmNfaXNfYWxsb3dlZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsIGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XFxuIDU4ODpcXHR1MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcXG4gNTg5OlxcdFxcdFxcdFxcdFxcdGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7XFxuIDU5MDpcXHRpbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxcbiA1OTE6XFx0XFx0XFx0XFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKnMpO1xcbiA1OTI6XFx0aW50IHJlZ2lzdGVyX2J0Zl9mbW9kcmV0X2lkX3NldChjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldCk7XFxuIDU5MzpcXHRzMzIgYnRmX2ZpbmRfZHRvcl9rZnVuYyhzdHJ1Y3QgYnRmICpidGYsIHUzMiBidGZfaWQpO1xcbiA1OTQ6XFx0aW50IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhjb25zdCBzdHJ1Y3QgYnRmX2lkX2R0b3Jfa2Z1bmMgKmR0b3JzLCB1MzIgYWRkX2NudCxcXG4gNTk1OlxcdFxcdFxcdFxcdFxcdHN0cnVjdCBtb2R1bGUgKm93bmVyKTtcXG4gNTk2OlxcdHN0cnVjdCBidGZfc3RydWN0X21ldGEgKmJ0Zl9maW5kX3N0cnVjdF9tZXRhKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGJ0Zl9pZCk7XFxuIDU5NzpcXHRib29sIGJ0Zl9pc19wcm9qZWN0aW9uX29mKGNvbnN0IGNoYXIgKnBuYW1lLCBjb25zdCBjaGFyICp0bmFtZSk7XFxuIDU5ODpcXHRib29sIGJ0Zl9pc19wcm9nX2N0eF90eXBlKHN0cnVjdCBicGZfdmVyaWZpZXJfbG9nICpsb2csIGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gNTk5OlxcdFxcdFxcdFxcdCAgIGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqdCwgZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSxcXG4gNjAwOlxcdFxcdFxcdFxcdCAgIGludCBhcmcpO1xcbiA2MDE6XFx0aW50IGdldF9rZXJuX2N0eF9idGZfaWQoc3RydWN0IGJwZl92ZXJpZmllcl9sb2cgKmxvZywgZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZSk7XFxuIDYwMjpcXHRib29sIGJ0Zl90eXBlc19hcmVfc2FtZShjb25zdCBzdHJ1Y3QgYnRmICpidGYxLCB1MzIgaWQxLFxcbiA2MDM6XFx0XFx0XFx0XFx0Y29uc3Qgc3RydWN0IGJ0ZiAqYnRmMiwgdTMyIGlkMik7XFxuIDYwNDpcXHRpbnQgYnRmX2NoZWNrX2l0ZXJfYXJnKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICpmdW5jLCBpbnQgYXJnX2lkeCk7XFxuIDYwNTpcXHRcXG4gNjA2OlxcdHN0YXRpYyBpbmxpbmUgYm9vbCBidGZfdHlwZV9pc19zdHJ1Y3RfcHRyKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICp0KVxcbiA2MDc6XFx0e1xcbiA2MDg6XFx0XFx0aWYgKCFidGZfdHlwZV9pc19wdHIodCkpXFxuIDYwOTpcXHRcXHRcXHRyZXR1cm4gZmFsc2U7XFxuIDYxMDpcXHRcXG4gNjExOlxcdFxcdHQgPSBidGZfdHlwZV9za2lwX21vZGlmaWVycyhidGYsIHQtXFx1MDAzZXR5cGUsIE5VTEwpO1xcbiA2MTI6XFx0XFxuIDYxMzpcXHRcXHRyZXR1cm4gYnRmX3R5cGVfaXNfc3RydWN0KHQpO1xcbiA2MTQ6XFx0fVxcbiA2MTU6XFx0I2Vsc2VcXG4gNjE2OlxcdHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGJ0Zl90eXBlICpidGZfdHlwZV9ieV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsXFxuIDYxNzpcXHRcXHRcXHRcXHRcXHRcXHRcXHQgICAgdTMyIHR5cGVfaWQpXFxuIDYxODpcXHR7XFxuIDYxOTpcXHRcXHRyZXR1cm4gTlVMTDtcXG4gNjIwOlxcdH1cXG4gNjIxOlxcdFxcbiA2MjI6XFx0c3RhdGljIGlubGluZSB2b2lkIGJ0Zl9zZXRfYmFzZV9idGYoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0ZilcXG4gNjIzOlxcdHtcXG4gNjI0OlxcdH1cXG4gNjI1OlxcdFxcbiA2MjY6XFx0c3RhdGljIGlubGluZSBpbnQgYnRmX3JlbG9jYXRlKHZvaWQgKmxvZywgc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0ZixcXG4gNjI3OlxcdFxcdFxcdFxcdCAgICAgICBfX3UzMiAqKm1hcF9pZHMpXFxuIDYyODpcXHR7XFxuIDYyOTpcXHRcXHRyZXR1cm4gLUVPUE5PVFNVUFA7XFxuIDYzMDpcXHR9XFxuIDYzMTpcXHRcXG4gNjMyOlxcdHN0YXRpYyBpbmxpbmUgaW50IGJ0Zl9maWVsZF9pdGVyX2luaXQoc3RydWN0IGJ0Zl9maWVsZF9pdGVyICppdCwgc3RydWN0IGJ0Zl90eXBlICp0LFxcbiA2MzM6XFx0XFx0XFx0XFx0XFx0ICAgICAgZW51bSBidGZfZmllbGRfaXRlcl9raW5kIGl0ZXJfa2luZClcXG4gNjM0OlxcdHtcXG4gNjM1OlxcdFxcdHJldHVybiAtRU9QTk9UU1VQUDtcXG4gNjM2OlxcdH1cXG4gNjM3OlxcdFxcbiA2Mzg6XFx0c3RhdGljIGlubGluZSBfX3UzMiAqYnRmX2ZpZWxkX2l0ZXJfbmV4dChzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIgKml0KVxcbiA2Mzk6XFx0e1xcbiA2NDA6XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDY0MTpcXHR9XFxuIDY0MjpcXHRcXG4gNjQzOlxcdHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqYnRmX25hbWVfYnlfb2Zmc2V0KGNvbnN0IHN0cnVjdCBidGYgKmJ0ZixcXG4gNjQ0OlxcdFxcdFxcdFxcdFxcdFxcdCAgICAgdTMyIG9mZnNldClcXG4gNjQ1OlxcdHtcXG4gNjQ2OlxcdFxcdHJldHVybiBOVUxMO1xcbiA2NDc6XFx0fVxcbiA2NDg6XFx0c3RhdGljIGlubGluZSB1MzIgKmJ0Zl9rZnVuY19pZF9zZXRfY29udGFpbnMoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLFxcbiA2NDk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICB1MzIga2Z1bmNfYnRmX2lkLFxcbiA2NTA6XFx0XFx0XFx0XFx0XFx0XFx0ICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpXFxuIDY1MTpcXHRcXG4gNjUyOlxcdHtcXG4gNjUzOlxcdFxcdHJldHVybiBOVUxMO1xcbiA2NTQ6XFx0fVxcbiA2NTU6XFx0c3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChlbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlLFxcbiA2NTY6XFx0XFx0XFx0XFx0XFx0XFx0ICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICpzKVxcbiA2NTc6XFx0e1xcbiA2NTg6XFx0XFx0cmV0dXJuIDA7XFxuIDY1OTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjQ2LjQyOTU1ODUxMVoiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTc4MjUxNTgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGF0IGNvZGUgc25pcHBldDpcblxuKipEaXZpbmcgaW50byBgYnRmLmhgJ3MgQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24qKlxuXG5Pa2F5LCBzbyBJJ20gZ2V0dGluZyByZWFkeSB0byBwb2tlIGFyb3VuZCBpbiB0aGUgYGluY2x1ZGUvbGludXgvYnRmLmhgIGZpbGUsIHNwZWNpZmljYWxseSB0aGUgYCNpZmRlZmAgYmxvY2tzLiBJIHdhbnQgdG8gc2VlIHdoYXQncyBiZWluZyBjb25kaXRpb25hbGx5IGNvbXBpbGVkIGFuZCB3aHkuIFRoaXMgaXMgbGlrZWx5IHdoZXJlIHRoZSBjb3JlIG9mIHRoZSBCVEYgKEJQRiBUeXBlIEZvcm1hdCkgZGVmaW5pdGlvbnMgYW5kIHJlbGF0ZWQgc3RydWN0dXJlcyBhcmUgZGVjbGFyZWQsIG9yIG1heWJlIGl0IHNldHMgdXAgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zIGJhc2VkIG9uIGtlcm5lbCBmZWF0dXJlcyBvciBjb21waWxlLXRpbWUgb3B0aW9ucy4gSSdtIGV4cGVjdGluZyB0byBmaW5kIGEgbG90IG9mIGVzc2VudGlhbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHBvc3NpYmx5IHNvbWUgbWFjcm8gZGVmaW5pdGlvbnMgdGhhdCByZWFsbHkgZHJpdmUgdGhlIEJURiBoYW5kbGluZyBhdCB0aGUgbG93ZXN0IGxldmVscy4gSSdsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIGNvbmRpdGlvbnMgdGhhdCB0cmlnZ2VyIHRoZXNlIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBhbmQgaG93IHRoZXkgaW1wYWN0IHRoZSBvdmVyYWxsIEJURiBpbXBsZW1lbnRhdGlvbi4gVGltZSB0byBkaWcgaW4hXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI0Mjc0LCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjUsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0OC42MDc4MTIzMjRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6ODM2NTAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwiaW5jbHVkZS9saW51eC9idGYuaFwiLFxuICBcIkZpcnN0TGluZVwiOiA1NDAsXG4gIFwiTGluZUNvdW50XCI6IDQwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiA1NDA6XFx0c3RydWN0IGJwZl9zdHJ1Y3Rfb3BzO1xcbiA1NDE6XFx0aW50IF9fcmVnaXN0ZXJfYnBmX3N0cnVjdF9vcHMoc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzICpzdF9vcHMpO1xcbiA1NDI6XFx0Y29uc3Qgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzX2Rlc2MgKmJwZl9zdHJ1Y3Rfb3BzX2ZpbmRfdmFsdWUoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdmFsdWVfaWQpO1xcbiA1NDM6XFx0Y29uc3Qgc3RydWN0IGJwZl9zdHJ1Y3Rfb3BzX2Rlc2MgKmJwZl9zdHJ1Y3Rfb3BzX2ZpbmQoc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdHlwZV9pZCk7XFxuIDU0NDpcXHQjZWxzZVxcbiA1NDU6XFx0c3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgYnBmX3N0cnVjdF9vcHNfZGVzYyAqYnBmX3N0cnVjdF9vcHNfZmluZChzdHJ1Y3QgYnRmICpidGYsIHUzMiB0eXBlX2lkKVxcbiA1NDY6XFx0e1xcbiA1NDc6XFx0XFx0cmV0dXJuIE5VTEw7XFxuIDU0ODpcXHR9XFxuIDU0OTpcXHQjZW5kaWZcXG4gNTUwOlxcdFxcbiA1NTE6XFx0ZW51bSBidGZfZmllbGRfaXRlcl9raW5kIHtcXG4gNTUyOlxcdFxcdEJURl9GSUVMRF9JVEVSX0lEUyxcXG4gNTUzOlxcdFxcdEJURl9GSUVMRF9JVEVSX1NUUlMsXFxuIDU1NDpcXHR9O1xcbiA1NTU6XFx0XFxuIDU1NjpcXHRzdHJ1Y3QgYnRmX2ZpZWxkX2Rlc2Mge1xcbiA1NTc6XFx0XFx0Lyogb25jZS1wZXItdHlwZSBvZmZzZXRzICovXFxuIDU1ODpcXHRcXHRpbnQgdF9vZmZfY250LCB0X29mZnNbMl07XFxuIDU1OTpcXHRcXHQvKiBtZW1iZXIgc3RydWN0IHNpemUsIG9yIHplcm8sIGlmIG5vIG1lbWJlcnMgKi9cXG4gNTYwOlxcdFxcdGludCBtX3N6O1xcbiA1NjE6XFx0XFx0LyogcmVwZWF0ZWQgcGVyLW1lbWJlciBvZmZzZXRzICovXFxuIDU2MjpcXHRcXHRpbnQgbV9vZmZfY250LCBtX29mZnNbMV07XFxuIDU2MzpcXHR9O1xcbiA1NjQ6XFx0XFxuIDU2NTpcXHRzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIge1xcbiA1NjY6XFx0XFx0c3RydWN0IGJ0Zl9maWVsZF9kZXNjIGRlc2M7XFxuIDU2NzpcXHRcXHR2b2lkICpwO1xcbiA1Njg6XFx0XFx0aW50IG1faWR4O1xcbiA1Njk6XFx0XFx0aW50IG9mZl9pZHg7XFxuIDU3MDpcXHRcXHRpbnQgdmxlbjtcXG4gNTcxOlxcdH07XFxuIDU3MjpcXHRcXG4gNTczOlxcdCNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG4gNTc0OlxcdGNvbnN0IHN0cnVjdCBidGZfdHlwZSAqYnRmX3R5cGVfYnlfaWQoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmLCB1MzIgdHlwZV9pZCk7XFxuIDU3NTpcXHR2b2lkIGJ0Zl9zZXRfYmFzZV9idGYoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBzdHJ1Y3QgYnRmICpiYXNlX2J0Zik7XFxuIDU3NjpcXHRpbnQgYnRmX3JlbG9jYXRlKHN0cnVjdCBidGYgKmJ0ZiwgY29uc3Qgc3RydWN0IGJ0ZiAqYmFzZV9idGYsIF9fdTMyICoqbWFwX2lkcyk7XFxuIDU3NzpcXHRpbnQgYnRmX2ZpZWxkX2l0ZXJfaW5pdChzdHJ1Y3QgYnRmX2ZpZWxkX2l0ZXIgKml0LCBzdHJ1Y3QgYnRmX3R5cGUgKnQsXFxuIDU3ODpcXHRcXHRcXHRcXHRlbnVtIGJ0Zl9maWVsZF9pdGVyX2tpbmQgaXRlcl9raW5kKTtcXG4gNTc5OlxcdF9fdTMyICpidGZfZmllbGRfaXRlcl9uZXh0KHN0cnVjdCBidGZfZmllbGRfaXRlciAqaXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo0OC42MDc4OTcxNjRaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjczNDg5MDYyNSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBCVEYgYW5kIERlYnVnIEluZm9ybWF0aW9uIFJlcXVpcmVtZW50cyoqXG5cblJpZ2h0LCBzbyBJIG5lZWQgdG8gY2xhcmlmeSBzb21ldGhpbmcgYWJvdXQgdGhlIEJURiAoQlBGIFR5cGUgRm9ybWF0KSBhbmQga2Z1bmNzIChrZXJuZWwgZnVuY3Rpb25zKS4gSSdtIHByZXR0eSBzdXJlIEkgaGF2ZSBhIGhhbmRsZSBvbiB0aGlzLCBidXQgbGV0J3MganVzdCBtYWtlIGFic29sdXRlbHkgc3VyZSwgYW5kIGRvdWJsZSBjaGVjayBteSBhc3N1bXB0aW9uIHJlZ2FyZGluZyB0aGUgYERFQlVHX0lORk9fQlRGYCBjb25maWd1cmF0aW9uIG9wdGlvbi4gSSBuZWVkIHRvIGtub3cgaWYgaXQncyBzdHJpY3RseSAqcmVxdWlyZWQqIGZvciBCVEYga2Z1bmMgZnVuY3Rpb25hbGl0eSB3aXRoaW4gdGhlIGtlcm5lbCBpdHNlbGYuXG5cbk15IGd1dCBmZWVsaW5nIGlzIHRoYXQgaXQgaXNuJ3QuIEJURiBzdXBwb3J0IGhhcyBiZWVuIGV2b2x2aW5nLCBhbmQgSSBoYXZlIGEgbmFnZ2luZyBmZWVsaW5nIHRoYXQgdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBtaWdodCBoYXZlIGRlY291cGxlZCBmcm9tIHJlcXVpcmluZyB0aGlzIHBhcnRpY3VsYXIgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBlc3BlY2lhbGx5IGdpdmVuIHJlY2VudCBvcHRpbWl6YXRpb24gZWZmb3J0cy4gSG93ZXZlciwgbGV0J3Mgbm90IHJlbHkgb24gaW50dWl0aW9uIGFsb25lLiBUaGUgZGVmaW5pdGl2ZSBhbnN3ZXIgaXMgYWx3YXlzIHdpdGhpbiB0aGUgY29kZS4gVGltZSB0byBkaWcgaW50byB0aGUga2VybmVsIHNvdXJjZSwgc3BlY2lmaWNhbGx5IGBrZXJuZWwvYnBmL2J0Zi5jYC4gVGhhdCdzIHRoZSBsb2dpY2FsIHBsYWNlIHRvIHN0YXJ0IOKAkyBpdCdzIHRoZSBoZWFydCBvZiB0aGUgQlRGIGltcGxlbWVudGF0aW9uLiBJJ2xsIG5lZWQgdG8gY2FyZWZ1bGx5IGV4YW1pbmUgdGhlIGNvZGUgaW4gYGJ0Zi5jYCwgcGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgcmVsZXZhbnQgY29tcGlsYXRpb24gZmxhZ3MgYW5kIGNvbmRpdGlvbmFsIHN0YXRlbWVudHMsIGFuZCBwaW5wb2ludCBhbnkgZGVwZW5kZW5jaWVzIG9yIGVycm9yIGhhbmRsaW5nIHJlbGF0ZWQgdG8gYERFQlVHX0lORk9fQlRGYC4gT25seSB0aGVuIGNhbiBJIGJlIGNlcnRhaW4gd2hldGhlciB0aGUgb3B0aW9uIGlzIHN0cmljdGx5IGEgcmVxdWlyZW1lbnQgb3IgbW9yZSBvZiBhbiBvcHRpb25hbCBlbmhhbmNlbWVudCBmb3IgdGhlIEJURiBrZnVuYyBjYXBhYmlsaXRpZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI1MjQ1LCJPdXRwdXRUb2tlbnMiOjMzLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo1MS4zNDI3ODk4MzlaIiwiU2VxIjoyMiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjU5MDE0ODg5LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcIkNPTkZJR19ERUJVR19JTkZPX0JURlwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL01ha2VmaWxlPTQzPWlmZXEgKCQoQ09ORklHX1NZU0ZTKSx5KVxcbmtlcm5lbC9icGYvTWFrZWZpbGU6NDQ6b2JqLSQoQ09ORklHX0RFQlVHX0lORk9fQlRGKSArPSBzeXNmc19idGYub1xcbmtlcm5lbC9icGYvTWFrZWZpbGUtNDUtZW5kaWZcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9NjQwMT1zdGF0aWMgc3RydWN0IGJ0ZiAqYnRmX3BhcnNlX2Jhc2Uoc3RydWN0IGJ0Zl92ZXJpZmllcl9lbnYgKmVudiwgY29uc3QgY2hhciAqbmFtZSxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtNjQwNi1cXG5rZXJuZWwvYnBmL2J0Zi5jOjY0MDc6XFx0aWYgKCFJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpXFxua2VybmVsL2JwZi9idGYuYy02NDA4LVxcdFxcdHJldHVybiBFUlJfUFRSKC1FTk9FTlQpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz02NDg3PV9fdTMyIGJ0Zl9yZWxvY2F0ZV9pZChjb25zdCBzdHJ1Y3QgYnRmICpidGYsIF9fdTMyIGlkKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NDkzLVxcbmtlcm5lbC9icGYvYnRmLmM6NjQ5NDojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTY0OTUtXFxua2VybmVsL2JwZi9idGYuYz02NDk2PXN0YXRpYyBzdHJ1Y3QgYnRmICpidGZfcGFyc2VfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZV9uYW1lLCBjb25zdCB2b2lkICpkYXRhLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy02NTkxLVxcbmtlcm5lbC9icGYvYnRmLmM6NjU5MjojZW5kaWYgLyogQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVMgKi9cXG5rZXJuZWwvYnBmL2J0Zi5jLTY1OTMtXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg1MDI9ZW51bSB7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTg1MDUtXFxua2VybmVsL2JwZi9idGYuYzo4NTA2OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODUwNy1zdHJ1Y3QgYnRmX21vZHVsZSB7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTg2NDQ9ZnNfaW5pdGNhbGwoYnRmX21vZHVsZV9pbml0KTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjg2NDU6I2VuZGlmIC8qIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTICovXFxua2VybmVsL2JwZi9idGYuYy04NjQ2LVxcbmtlcm5lbC9icGYvYnRmLmM9ODY0Nz1zdHJ1Y3QgbW9kdWxlICpidGZfdHJ5X2dldF9tb2R1bGUoY29uc3Qgc3RydWN0IGJ0ZiAqYnRmKVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NjQ5LVxcdHN0cnVjdCBtb2R1bGUgKnJlcyA9IE5VTEw7XFxua2VybmVsL2JwZi9idGYuYzo4NjUwOiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODY1MS1cXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmM9ODY3Nz1zdHJ1Y3QgYnRmICpidGZfZ2V0X21vZHVsZV9idGYoY29uc3Qgc3RydWN0IG1vZHVsZSAqbW9kdWxlKVxcbmtlcm5lbC9icGYvYnRmLmMtODY3OC17XFxua2VybmVsL2JwZi9idGYuYzo4Njc5OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODY4MC1cXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODY5MC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg2OTE6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy04NjkyLVxcdG11dGV4X2xvY2soXFx1MDAyNmJ0Zl9tb2R1bGVfbXV0ZXgpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz04NzA3PXN0YXRpYyBpbnQgY2hlY2tfYnRmX2tjb25maWdzKGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgY29uc3QgY2hhciAqZmVhdHVyZSlcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MDgte1xcbmtlcm5lbC9icGYvYnRmLmM6ODcwOTpcXHRpZiAoIW1vZHVsZSBcXHUwMDI2XFx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURikpIHtcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MTAtXFx0XFx0cHJfZXJyKFxcXCJtaXNzaW5nIHZtbGludXggQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXFxcblxcXCIsIGZlYXR1cmUpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYy04NzEyLVxcdH1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg3MTM6XFx0aWYgKG1vZHVsZSBcXHUwMDI2XFx1MDAyNiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTKSlcXG5rZXJuZWwvYnBmL2J0Zi5jLTg3MTQtXFx0XFx0cHJfd2FybihcXFwibWlzc2luZyBtb2R1bGUgQlRGLCBjYW5ub3QgcmVnaXN0ZXIgJXNcXFxcblxcXCIsIGZlYXR1cmUpO1xcbi0tXFxua2VybmVsL2JwZi9idGYuYz04ODU0PXN0YXRpYyBpbnQgYnRmX2NoZWNrX2tmdW5jX25hbWUoc3RydWN0IGJ0ZiAqYnRmLCBjb25zdCBjaGFyICpmdW5jX25hbWUsIHUzMiBraW5kKVxcbmtlcm5lbC9icGYvYnRmLmMtODg1NS17XFxua2VybmVsL2JwZi9idGYuYzo4ODU2OiNpZmRlZiBDT05GSUdfREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmtlcm5lbC9icGYvYnRmLmMtODg1Ny1cXHRzdHJ1Y3QgYnRmX21vZHVsZSAqYnRmX21vZCwgKnRtcDtcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODg3MC1cXG5rZXJuZWwvYnBmL2J0Zi5jOjg4NzE6I2lmZGVmIENPTkZJR19ERUJVR19JTkZPX0JURl9NT0RVTEVTXFxua2VybmVsL2JwZi9idGYuYy04ODcyLVxcdGd1YXJkKG11dGV4KShcXHUwMDI2YnRmX21vZHVsZV9tdXRleCk7XFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTk1MTk9c3RhdGljIHN0cnVjdCBicGZfY2FuZF9jYWNoZSAqcG9wdWxhdGVfY2FuZF9jYWNoZShzdHJ1Y3QgYnBmX2NhbmRfY2FjaGUgKmNhbmRzLFxcbi0tXFxua2VybmVsL2JwZi9idGYuYy05NTQ2LVxcbmtlcm5lbC9icGYvYnRmLmM6OTU0NzojaWZkZWYgQ09ORklHX0RFQlVHX0lORk9fQlRGX01PRFVMRVNcXG5rZXJuZWwvYnBmL2J0Zi5jLTk1NDgtc3RhdGljIHZvaWQgX19wdXJnZV9jYW5kX2NhY2hlKHN0cnVjdCBidGYgKmJ0Ziwgc3RydWN0IGJwZl9jYW5kX2NhY2hlICoqY2FjaGUsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MjgzNj1pbnQgYnBmX2FkZF9rZnVuY19jYWxsKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiBmdW5jX2lkLCB1MTYgb2Zmc2V0KVxcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NTItXFx0XFx0aWYgKCFidGZfdm1saW51eCkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoyODUzOlxcdFxcdFxcdHZlcmJvc2UoZW52LCBcXFwiY2FsbGluZyBrZXJuZWwgZnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRob3V0IENPTkZJR19ERUJVR19JTkZPX0JURlxcXFxuXFxcIik7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTI4NTQtXFx0XFx0XFx0cmV0dXJuIC1FTk9UU1VQUDtcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYz02MTkwPXN0YXRpYyBpbnQgY2hlY2tfcHRyX3RvX21hcF9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudixcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjA0LVxcdGlmICghYnRmX3ZtbGludXgpIHtcXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6NjIwNTpcXHRcXHR2ZXJib3NlKGVudiwgXFxcIm1hcF9wdHIgYWNjZXNzIG5vdCBzdXBwb3J0ZWQgd2l0aG91dCBDT05GSUdfREVCVUdfSU5GT19CVEZcXFxcblxcXCIpO1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy02MjA2LVxcdFxcdHJldHVybiAtRU5PVFNVUFA7XFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM9MTg4NDg9c3RhdGljIGludCBjaGVja19wc2V1ZG9fYnRmX2lkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsXFxuLS1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmMtMTg4NjQtXFx0XFx0aWYgKCFidGZfdm1saW51eCkge1xcbmtlcm5lbC9icGYvdmVyaWZpZXIuYzoxODg2NTpcXHRcXHRcXHR2ZXJib3NlKGVudiwgXFxcImtlcm5lbCBpcyBtaXNzaW5nIEJURiwgbWFrZSBzdXJlIENPTkZJR19ERUJVR19JTkZPX0JURj15IGlzIHNwZWNpZmllZCBpbiBLY29uZmlnLlxcXFxuXFxcIik7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTE4ODY2LVxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbi0tXFxua2VybmVsL2JwZi92ZXJpZmllci5jPTIwNzU2PXN0cnVjdCBidGYgKmJwZl9nZXRfYnRmX3ZtbGludXgodm9pZClcXG4tLVxcbmtlcm5lbC9icGYvdmVyaWZpZXIuYy0yMDc2MC1cXG5rZXJuZWwvYnBmL3ZlcmlmaWVyLmM6MjA3NjE6XFx0aWYgKCFidGYgXFx1MDAyNlxcdTAwMjYgSVNfRU5BQkxFRChDT05GSUdfREVCVUdfSU5GT19CVEYpKSB7XFxua2VybmVsL2JwZi92ZXJpZmllci5jLTIwNzYyLVxcdFxcdG11dGV4X2xvY2soXFx1MDAyNmJ0Zl92bWxpbnV4X2xvY2spO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wNVQyMDo0MTo1MS40MDE4MDY5MjhaIiwiU2VxIjoyMywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MTY2ODQ1MTcwMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLlxuXG4qKk15IEluaXRpYWwgQXNzZXNzbWVudCoqXG5cbkFscmlnaHQsIEknbSBsb29raW5nIGF0IGEgZmV3IGtlcm5lbCBjb25maWd1cmF0aW9ucyDigJMgYENPTkZJR19CUEZfU1lTQ0FMTGAsIGBDT05GSUdfTUVNQ0dgLCBhbmQgYENPTkZJR19ERUJVR19JTkZPX0JURmAuIE15IGltbWVkaWF0ZSB0aG91Z2h0IGlzLCBcIldoYXQncyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2U/XCIgSXQgbG9va3MgbGlrZSBJIG1pZ2h0IGJlIHRyeWluZyB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmZWF0dXJlIGZsYWdzIGludGVyYWN0LiBNeSBpbnR1aXRpb24gdGVsbHMgbWUgdGhhdCBgQ09ORklHX0RFQlVHX0lORk9fQlRGYCBpcyB0aGUgbW9zdCBjb21wbGV4IG9uZSBhbmQgcG9zc2libHkgaGFzIGRlcGVuZGVuY2llcywgbGV0IG1lIGNoZWNrIHRoZSBgbGliL0tjb25maWcuZGVidWdgIGZpbGUgdG8gc2VlIHdoYXQgdGhlIGRlcGVuZGVuY2llcyBhcmUuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3NTY4LCJPdXRwdXRUb2tlbnMiOjI5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NTMuMDcwMjYwNzkxWiIsIlNlcSI6MjQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NjY2OTQwOSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgREVCVUdfSU5GT19CVEZcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibGliL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Zz0zNzg9Y29uZmlnIERFQlVHX0lORk9fU1BMSVRcXG4tLVxcbmxpYi9LY29uZmlnLmRlYnVnLTM5Ny1cXG5saWIvS2NvbmZpZy5kZWJ1ZzozOTg6Y29uZmlnIERFQlVHX0lORk9fQlRGXFxubGliL0tjb25maWcuZGVidWctMzk5LVxcdGJvb2wgXFxcIkdlbmVyYXRlIEJURiB0eXBlIGluZm9ybWF0aW9uXFxcIlxcbi0tXFxubGliL0tjb25maWcuZGVidWc9NDE5PWNvbmZpZyBQQUhPTEVfSEFTX0xBTkdfRVhDTFVERVxcbi0tXFxubGliL0tjb25maWcuZGVidWctNDI3LVxcbmxpYi9LY29uZmlnLmRlYnVnOjQyODpjb25maWcgREVCVUdfSU5GT19CVEZfTU9EVUxFU1xcbmxpYi9LY29uZmlnLmRlYnVnLTQyOS1cXHRib29sIFxcXCJHZW5lcmF0ZSBCVEYgdHlwZSBpbmZvcm1hdGlvbiBmb3Iga2VybmVsIG1vZHVsZXNcXFwiXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjUzLjEyNjkzNDYzWiIsIlNlcSI6MjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNjY4Mzk0NzUsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHRoaW5raW5nIHRocm91Z2ggdGhpcyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIEtjb25maWcuZGVidWcgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBmb3Igc29tZXRoaW5nIHJlbGF0ZWQgdG8gdGhlIGRlYnVnIGNvbmZpZ3VyYXRpb24uIFRpbWUgdG8gaGVhZCBvdmVyIHRvIGBsaWIvS2NvbmZpZy5kZWJ1Z2AuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIHplcm8gaW4gb24gbGluZXMgMzkwIHRvIDQxMC4gVGhhdCdzIHVzdWFsbHkgYSBnb29kIHJhbmdlIHRvIHN0YXJ0IHdpdGggd2hlbiBJJ20gY2hhc2luZyBkb3duIGRlcGVuZGVuY2llcyBpbiBhIEtjb25maWcgZmlsZS4gTGV0J3Mgc2VlIHdoYXQgdGhlIGBkZXBlbmRzIG9uYCBjbGF1c2VzIHJldmVhbCB0aGVyZS4gSG9wZWZ1bGx5LCBpdCdzIHN0cmFpZ2h0Zm9yd2FyZCwgYW5kIEkgY2FuIHF1aWNrbHkgdHJhY2Ugd2hhdCBjb25kaXRpb25zIG5lZWQgdG8gYmUgbWV0IGZvciB0aGlzIGRlYnVnIG9wdGlvbiB0byBiZSBlbmFibGVkLiBUaGlzIGlzIHdoZXJlIHRoZSByZWFsIHdvcmsgYmVnaW5zLCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0IG90aGVyIG9wdGlvbnMgYXJlIGltcGFjdGVkIGFuZCBpZiB0aGV5IGFyZSByZWxldmFudCB0byB0aGlzIGN1cnJlbnQgZm9jdXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjI3OTUzLCJPdXRwdXRUb2tlbnMiOjM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NTUuMjkzNzc3NjY1WiIsIlNlcSI6MjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMzI5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJsaWIvS2NvbmZpZy5kZWJ1Z1wiLFxuICBcIkZpcnN0TGluZVwiOiAzOTUsXG4gIFwiTGluZUNvdW50XCI6IDIwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAzOTU6XFx0XFx0ICB0byBrbm93IGFib3V0IHRoZSAuZHdvIGZpbGVzIGFuZCBpbmNsdWRlIHRoZW0uXFxuIDM5NjpcXHRcXHQgIEluY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIGNjYWNoZS5cXG4gMzk3OlxcdFxcbiAzOTg6XFx0Y29uZmlnIERFQlVHX0lORk9fQlRGXFxuIDM5OTpcXHRcXHRib29sIFxcXCJHZW5lcmF0ZSBCVEYgdHlwZSBpbmZvcm1hdGlvblxcXCJcXG4gNDAwOlxcdFxcdGRlcGVuZHMgb24gIURFQlVHX0lORk9fU1BMSVQgXFx1MDAyNlxcdTAwMjYgIURFQlVHX0lORk9fUkVEVUNFRFxcbiA0MDE6XFx0XFx0ZGVwZW5kcyBvbiAhR0NDX1BMVUdJTl9SQU5EU1RSVUNUIHx8IENPTVBJTEVfVEVTVFxcbiA0MDI6XFx0XFx0ZGVwZW5kcyBvbiBCUEZfU1lTQ0FMTFxcbiA0MDM6XFx0XFx0ZGVwZW5kcyBvbiBQQUhPTEVfVkVSU0lPTiBcXHUwMDNlPSAxMjJcXG4gNDA0OlxcdFxcdCMgcGFob2xlIHVzZXMgZWxmdXRpbHMsIHdoaWNoIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3IgSGV4YWdvbiByZWxvY2F0aW9uc1xcbiA0MDU6XFx0XFx0ZGVwZW5kcyBvbiAhSEVYQUdPTlxcbiA0MDY6XFx0XFx0aGVscFxcbiA0MDc6XFx0XFx0ICBHZW5lcmF0ZSBkZWR1cGxpY2F0ZWQgQlRGIHR5cGUgaW5mb3JtYXRpb24gZnJvbSBEV0FSRiBkZWJ1ZyBpbmZvLlxcbiA0MDg6XFx0XFx0ICBUdXJuaW5nIHRoaXMgb24gcmVxdWlyZXMgcGFob2xlIHYxLjIyIG9yIGxhdGVyLCB3aGljaCB3aWxsIGNvbnZlcnRcXG4gNDA5OlxcdFxcdCAgRFdBUkYgdHlwZSBpbmZvIGludG8gZXF1aXZhbGVudCBkZWR1cGxpY2F0ZWQgQlRGIHR5cGUgaW5mby5cXG4gNDEwOlxcdFxcbiA0MTE6XFx0Y29uZmlnIFBBSE9MRV9IQVNfQlRGX1RBR1xcbiA0MTI6XFx0XFx0ZGVmX2Jvb2wgUEFIT0xFX1ZFUlNJT04gXFx1MDAzZT0gMTIzXFxuIDQxMzpcXHRcXHRkZXBlbmRzIG9uIENDX0lTX0NMQU5HXFxuIDQxNDpcXHRcXHRoZWxwXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjU1LjI5NDAwMjI4NVoiLCJTZXEiOjI3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxOTY0ODAyMTA3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgaW50ZXJwcmV0YXRpb24gb2YgdGhvc2UgdGhvdWdodHMsIHN1bW1hcml6ZWQgZnJvbSBhIGZpcnN0LXBlcnNvbiBleHBlcnQgcGVyc3BlY3RpdmU6XG5cbioqS2VybmVsIENvbmZpZ3VyYXRpb24gRGVwZW5kZW5jaWVzOiBCUEYgYW5kIEJleW9uZCoqXG5cbkFscmlnaHQsIHNvIEknbSB0aGlua2luZyBhYm91dCB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgc3BlY2lmaWNhbGx5IGBDT05GSUdfQlBGYC4gVGhpcyBrZWVwcyBwb3BwaW5nIHVwLCBhbmQgaXQncyBhIGNyaXRpY2FsIGZvdW5kYXRpb25hbCBlbGVtZW50LiBJIGtub3cgYEJQRl9TWVNDQUxMYCByZWxpZXMgb24gYEJQRmAsIHdoaWNoIGltbWVkaWF0ZWx5IHN1Z2dlc3RzIGEgZGVwZW5kZW5jeS4gSSBuZWVkIHRvIGdldCBhIGNsZWFyIHBpY3R1cmUgb2YgaG93IHRoZXNlIG9wdGlvbnMgaW50ZXJhY3QgYW5kIHdoYXQgb3RoZXIgcmVsYXRlZCBvcHRpb25zIGV4aXN0LiBCZXN0IHRvIGRpdmUgaW50byB0aGUgY29yZSBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zLiBMZXQgbWUgY2hlY2sgdGhlIGBrZXJuZWwvYnBmL0tjb25maWdgIGZpbGUuIFRoYXQncyB3aGVyZSBhbGwgdGhlIGRldGFpbHMgYWJvdXQgQlBGIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGxhaWQgb3V0LiBVbmRlcnN0YW5kaW5nIHRoZSBkZXBlbmRlbmN5IGNoYWluIGhlcmUgaXMga2V5IHRvIGEgcm9idXN0IGFuZCBlZmZpY2llbnQga2VybmVsIGJ1aWxkLlxuXG5cbiIsIklucHV0VG9rZW5zIjoyODUyOCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjM3LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDE6NTcuMjU4ODA3NDgyWiIsIlNlcSI6MjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjYxNTUwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImtlcm5lbC9icGYvS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiAyNSxcbiAgXCJMaW5lQ291bnRcIjogMjVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICAyNTpcXHQjIGRlZmF1bHQgZm9yIGtlcm5lbHMgdGhhdCB3ZXJlIGNvbXBpbGVkIHdpdGggQlBGIEpJVCBzdXBwb3J0LlxcbiAgMjY6XFx0Y29uZmlnIEFSQ0hfV0FOVF9ERUZBVUxUX0JQRl9KSVRcXG4gIDI3OlxcdFxcdGJvb2xcXG4gIDI4OlxcdFxcbiAgMjk6XFx0bWVudSBcXFwiQlBGIHN1YnN5c3RlbVxcXCJcXG4gIDMwOlxcdFxcbiAgMzE6XFx0Y29uZmlnIEJQRl9TWVNDQUxMXFxuICAzMjpcXHRcXHRib29sIFxcXCJFbmFibGUgYnBmKCkgc3lzdGVtIGNhbGxcXFwiXFxuICAzMzpcXHRcXHRzZWxlY3QgQlBGXFxuICAzNDpcXHRcXHRzZWxlY3QgSVJRX1dPUktcXG4gIDM1OlxcdFxcdHNlbGVjdCBORUVEX1RBU0tTX1JDVVxcbiAgMzY6XFx0XFx0c2VsZWN0IFRBU0tTX1RSQUNFX1JDVVxcbiAgMzc6XFx0XFx0c2VsZWN0IEJJTkFSWV9QUklOVEZcXG4gIDM4OlxcdFxcdHNlbGVjdCBORVRfU09DS19NU0cgaWYgTkVUXFxuICAzOTpcXHRcXHRzZWxlY3QgTkVUX1hHUkVTUyBpZiBORVRcXG4gIDQwOlxcdFxcdHNlbGVjdCBQQUdFX1BPT0wgaWYgTkVUXFxuICA0MTpcXHRcXHRkZWZhdWx0IG5cXG4gIDQyOlxcdFxcdGhlbHBcXG4gIDQzOlxcdFxcdCAgRW5hYmxlIHRoZSBicGYoKSBzeXN0ZW0gY2FsbCB0aGF0IGFsbG93cyB0byBtYW5pcHVsYXRlIEJQRiBwcm9ncmFtc1xcbiAgNDQ6XFx0XFx0ICBhbmQgbWFwcyB2aWEgZmlsZSBkZXNjcmlwdG9ycy5cXG4gIDQ1OlxcdFxcbiAgNDY6XFx0Y29uZmlnIEJQRl9KSVRcXG4gIDQ3OlxcdFxcdGJvb2wgXFxcIkVuYWJsZSBCUEYgSnVzdCBJbiBUaW1lIGNvbXBpbGVyXFxcIlxcbiAgNDg6XFx0XFx0ZGVwZW5kcyBvbiBCUEZcXG4gIDQ5OlxcdFxcdGRlcGVuZHMgb24gSEFWRV9DQlBGX0pJVCB8fCBIQVZFX0VCUEZfSklUXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQxOjU3LjI1ODg3MDQ4MloiLCJTZXEiOjI5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MzU5MzA5NDAxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgQW5hbHlzaXM6IEJQRi1CYXNlZCBQcm9hY3RpdmUgTWVtb3J5IFJlY2xhaW0qKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGFuYWx5c2lzIGluZGljYXRlcyBhIG5ldyBhdmVudWUgZm9yIG1lbW9yeSByZWNsYWltIHdpdGhpbiB0aGUga2VybmVsLCBsZXZlcmFnaW5nIEJQRiBjYXBhYmlsaXRpZXMuIFRoZSBrZXkgY29uZmlndXJhdGlvbnMgaW52b2x2ZWQgYXJlIGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgLiBUaGVzZSBhcmUgZXNzZW50aWFsIGZvciB0aGUgZnVuY3Rpb25hbGl0eS5cblxuVGhlIHByaW1hcnkgZm9jdXMgaXMgdW5kZW5pYWJseSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gVGhpcyBmdW5jdGlvbiwgbm93IGV4cG9zZWQgYXMgYSBCUEYga2Z1bmMsIGlzICp0aGUqIGZvY2FsIHBvaW50LiBJdCdzIHRoZSBuZXcgZW50cnkgcG9pbnQgZm9yIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFtYXRpb24gdHJpZ2dlcmVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGUgYGJwZigpYCBzeXNjYWxsLCBzcGVjaWZpY2FsbHkgdXNpbmcgYSBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCBwcm9ncmFtIG9yIHBvdGVudGlhbGx5IHRocm91Z2ggd29ya3F1ZXVlIGNhbGxiYWNrcy4gVGhpcyBpcyBhIGNydWNpYWwgZGlzdGluY3Rpb24gYW5kIGEgc2lnbmlmaWNhbnQgYWRkaXRpb24uIEl0IGNhbGxzIGNvcmUgcmVjbGFpbSBsb2dpYy4gVGhlcmUncyBhbHNvIHJlY3Vyc2lvbiBwcm90ZWN0aW9uLCBgYnBmX2luX3JlY2xhaW1fY29udGV4dGAsIHRvIGtlZXAgdGhpbmdzIHN0YWJsZS5cblxuYGJwZl9tZW1jb250cm9sX2luaXRgIGlzIGFsc28gcHJlc2VudCwgYnV0IGJlY2F1c2UgaXQncyBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBpdCdzIG5vdCBhIHN1aXRhYmxlIHRhcmdldCBmb3Igc3lzY2FsbCBmdXp6aW5nLiBgYnBmX2luX3JlY2xhaW1fY29udGV4dGAgaXMgc3RhdGljIGFuZCBsaWtlbHkgaW5saW5lZCwgc28gaXQncyBub3QgdGhlIHByaW1hcnkgZW50cnkgcG9pbnQgZWl0aGVyLlxuXG5Fc3NlbnRpYWxseSwgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgcHJvdmlkZXMgYSB1c2Vyc3BhY2UtaW5pdGlhdGVkIG1lY2hhbmlzbSB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSB3aXRoaW4gYSBtZW1jZywgd2hpY2ggaXMgYSBiaWcgZGVhbCBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUuIEl0J3MgYSBCUEYga2Z1bmMgY2FsbGluZyB0aGUgY29yZSByZWNsYWltIGxvZ2ljLCBzbyBpdCdzIGEgZ29vZCBwbGFjZSB0byBzdGFydCBkaWdnaW5nLlxuXG5UaGVyZWZvcmUsIGBXb3J0aEZ1enppbmdgIGlzIGRlZmluaXRlbHkgYHRydWVgIGhlcmUuIFRoZSBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cyBhcmUgYEJQRl9TWVNDQUxMYCwgYE1FTUNHYCwgYW5kIGBERUJVR19JTkZPX0JURmAuIEFuZCB0aGUgcHJpbWUgYEZvY3VzU3ltYm9sYCBpcyB1bmVxdWl2b2NhbGx5IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCdzIG5vbi1zdGF0aWMsIGEga2Z1bmMsIGFuZCB0aGUgY29yZSBvZiB0aGlzIG5ldyBmdW5jdGlvbmFsaXR5LCBzbyBpdCdzIGV4YWN0bHkgd2hhdCB3ZSB3YW50LiBUaGUgdGVzdHMgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzLy4uLmAgYXJlIGZvciB1c2Vyc3BhY2Ugd2hpY2ggYXJlIGFsc28gbm90IGEgZm9jdXMgcG9pbnQgZm9yIHRoZSBrZXJuZWwgY29kZS5cblxuSSdtIGNvbmZpZGVudCBpbiB0aGVzZSBmaW5kaW5ncy4gTGV0J3MgZ2V0IHRoZSByZXN1bHRzIHNldC5cblxuXG4iLCJJbnB1dFRva2VucyI6MjkwOTAsIk91dHB1dFRva2VucyI6MTM0LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6ODU5LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDI6MDIuNjE4MTgyNTMzWiIsIlNlcSI6MzAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzUxMzQ1NzgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIkJQRl9TWVNDQUxMXCIsXG4gICAgXCJNRU1DR1wiLFxuICAgIFwiREVCVUdfSU5GT19CVEZcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJicGZfcHJvYWN0aXZlX3JlY2xhaW1cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKCksIGFsbG93aW5nIHNsZWVwYWJsZSBCUEZfUFJPR19UWVBFX1NZU0NBTEwgcHJvZ3JhbXMgdG8gdHJpZ2dlciBwcm9hY3RpdmUgbWVtb3J5IGNncm91cCByZWNsYWltIHZpYSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkuIFRoaXMgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYW5kIEJQRiBzdWJzeXN0ZW0gY29kZSBhbmQgd2FycmFudHMgZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpLCBhbGxvd2luZyBzbGVlcGFibGUgQlBGX1BST0dfVFlQRV9TWVNDQUxMIHByb2dyYW1zIHRvIHRyaWdnZXIgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSB2aWEgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpLiBUaGlzIG1vZGlmaWVzIHJlYWNoYWJsZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGNvZGUgYW5kIHdhcnJhbnRzIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQyOjAyLjY5MzMyMzc0MVoiLCJTZXEiOjMxLCJOZXN0aW5nIjoxLCJUeXBlIjoiYWN0aW9uIiwiTmFtZSI6IklmIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Njg2MTE5OTkyNiwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTA1VDIwOjQyOjAyLjY5Mzc4NzYzMVoiLCJTZXEiOjMyLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjY4NjA3MzI1NjYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgZTcxYTMyMTk0Mjk0MjNlNWZkMzY2NGY1MmNkYjg5NDNjMTg0OWJiZVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBTYXQgU2VwIDUgMjA6NDE6MjIgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xuaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uOTJmMzViYTY2MzA5ZSAxMDA2NDRcbi0tLSBhL21tL2JwZl9tZW1jb250cm9sLmNcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcbkBAIC02LDYgKzYsNyBAQFxuICAqL1xuIFxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L3N3YXAuaFx1MDAzZVxuICNpbmNsdWRlIFx1MDAzY2xpbnV4L2JwZi5oXHUwMDNlXG4gXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuQEAgLTE1OSw2ICsxNjAsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLypcbisgKiBSZWNsYWltIG11c3Qgbm90IHJlY3Vyc2U6IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBvdmVyd3JpdGVzXG4rICogY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlLCBzbyBhIG5lc3RlZCBjYWxsIHdvdWxkIGNvcnJ1cHQgdGhlIG91dGVyXG4rICogcmVjbGFpbSBzdGF0ZS4gUmVjbGFpbSB3aW5kb3dzIGFyZSBtYXJrZWQgd2l0aCBQRl9NRU1BTExPQztcbisgKiByZWNsYWltX3N0YXRlIGlzIGFsc28gY2hlY2tlZCBiZWNhdXNlIGl0IGlzIGluc3RhbGxlZCBzbGlnaHRseVxuKyAqIGJlZm9yZSBQRl9NRU1BTExPQy5cbisgKi9cbitzdGF0aWMgYm9vbCBicGZfaW5fcmVjbGFpbV9jb250ZXh0KHZvaWQpXG4re1xuK1x0cmV0dXJuIChjdXJyZW50LVx1MDAzZWZsYWdzIFx1MDAyNiBQRl9NRU1BTExPQykgfHwgY3VycmVudC1cdTAwM2VyZWNsYWltX3N0YXRlO1xuK31cbitcbisvKipcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4rICogICAgICAgICAgICAgICAgICAgICAgICAgY2dyb3VwXG4rICogQG1lbWNnOiB0aGUgdGFyZ2V0IG1lbW9yeSBjZ3JvdXAgdG8gcmVjbGFpbSBmcm9tXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuKyAqICAgICAgICAgTUVNQ0dfQ0hBUkdFX0JBVENIICg2NCBwYWdlcylcbisgKlxuKyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cbisgKlxuKyAqIEBzaXplIGlzIGNsYW1wZWQgc28gdGhhdCBvbmUgY2FsbCBpcyBhIGJvdW5kZWQgdW5pdCBvZiB3b3JrLCBtYXRjaGluZ1xuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2sgaW4gaGlnaF93b3JrX2Z1bmMoKS4gVG8gcmVjbGFpbVxuKyAqIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5IGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cbisgKlxuKyAqIFRoaXMga2Z1bmMgaXMgcmVzdHJpY3RlZCB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwgdG8gZW5zdXJlIGl0IHJ1bnNcbisgKiBpbiBhIGNsZWFuIHByb2Nlc3MgY29udGV4dC4gVGhlIFNZU0NBTEwgcHJvZ3JhbSBjYW4gc2NoZWR1bGUgdGhlXG4rICogYWN0dWFsIHJlY2xhaW0gd29yayB2aWEgYnBmX3dxIG9yIHRpbWVycywgd2hpY2ggYWxzbyBleGVjdXRlIGluXG4rICogc2FmZSBwcm9jZXNzIGNvbnRleHQgKHdvcmtxdWV1ZSwgdGFza193b3JrKS5cbisgKlxuKyAqIFdoZW4gcmVjbGFpbSBpcyBkcml2ZW4gZnJvbSBhIGJwZl93cSwgY2FsbCB0aGlzIGtmdW5jIG9uY2UgcGVyXG4rICogY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCByYXRoZXJcbisgKiB0aGFuIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjazogYSBsb25nLXJ1bm5pbmcgY2FsbGJhY2sgc3RhbGxzXG4rICogb3RoZXIgd29yayBvbiB0aGUgc2hhcmVkIHdvcmtxdWV1ZSwgYW5kIGJlY2F1c2UgbHJ1X2xvY2sgaXMgaGVsZCB3aXRoXG4rICogaW50ZXJydXB0cyBkaXNhYmxlZCB0aGUgcmVzdWx0aW5nIGNvbnRlbnRpb24gYWxzbyBkZWxheXMgSVBJXG4rICogaGFuZGxpbmcuIEdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biBicGZfd3EgaXRlbSwgc28gdGhhdFxuKyAqIHJlY2xhaW1pbmcgb25lIG1lbWNnIG5laXRoZXIgc2VyaWFsaXplcyBiZWhpbmQgbm9yIHBpbGVzIHVwIG9uIHRvcCBvZlxuKyAqIGFub3RoZXIuIERlY2lkaW5nIHdoZXRoZXIgdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEZcbisgKiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcCBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpc1xuKyAqIGR5aW5nLlxuKyAqXG4rICogTXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYSBmaWxlc3lzdGVtIGxvY2sgaGVsZDogdGhlIHJlY2xhaW0gcGF0aFxuKyAqIG1heSBkZWFkbG9jayBvbiBpdCB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlIG9yIHRoZSB0YXNrIGlzIGFscmVhZHkgaW4gYSByZWNsYWltIGNvbnRleHQuXG4rICovXG4rX19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuK1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSlcbit7XG4rXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbitcdHVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7XG4rXG4rXHRpZiAoc2l6ZSBcdTAwM2MgUEFHRV9TSVpFIHx8IHVubGlrZWx5KGJwZl9pbl9yZWNsYWltX2NvbnRleHQoKSkpXG4rXHRcdHJldHVybiAwO1xuK1xuK1x0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbitcbitcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxuK1x0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHxcbitcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsXG4rXHRcdFx0XHRcdFx0ICAgIE5VTEwpO1xuK1xuK1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbit9XG4rXG4gX19icGZfa2Z1bmNfZW5kX2RlZnMoKTtcbiBcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbkBAIC0xNzEsMjIgKzI0MCw0NCBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfbWVtb3J5X2V2ZW50cylcbiBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfdXNhZ2UpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUpXG4gQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG4tXG4gQlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuIFxuKy8qXG4rICogUHJvYWN0aXZlIHJlY2xhaW0gbmVlZHMgYSBjbGVhbiBwcm9jZXNzIGNvbnRleHQsIHNvIGl0IGlzIHJlc3RyaWN0ZWRcbisgKiB0byBCUEZfUFJPR19UWVBFX1NZU0NBTEwuIFRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3MgdGhhdCBhXG4rICogU1lTQ0FMTCBwcm9ncmFtIHNjaGVkdWxlcyBydW4gYXMgdGhlIHNhbWUgcHJvZ3JhbSB0eXBlLCBzbyB0aGV5IGNhblxuKyAqIHN0aWxsIGludm9rZSBpdDsgZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgKGUuZy4gZmVudHJ5IG9uIHJlY2xhaW1cbisgKiBwYXRocywgaW5vZGVfcm1kaXIpIGNhbm5vdC5cbisgKi9cbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5uZXcgZmlsZSBtb2RlIDEwMDY0NFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uNjVmNTAwNjg0NDYzNlxuLS0tIC9kZXYvbnVsbFxuKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICsxLDY4NiBAQFxuKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wXG4rLypcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisjaW5jbHVkZSBcIm1lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oXCJcbitcbisjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXG4rI2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuKyNkZWZpbmUgUkVBRF9USU1FUyA1MFxuK1xuKyNkZWZpbmUgQ0dfRElSIFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cIlxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwiL2hpZ2hcIlxuKyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCIvbG93XCJcbitcbisjZGVmaW5lIENHX0RZSU5HX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nXCJcbisjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiBcIi90cmlnZ2VyXCJcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFwiL3RhcmdldFwiXG4rXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcbisjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4rXG4rLypcbisgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlXG4rICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcbisgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvXG4rICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIERZSU5HX1BPTExfSVRFUlMgNTAwXG4rI2RlZmluZSBEWUlOR19QT0xMX0lOVEVSVkFMX1VTICgxMCAqIDEwMDApXG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXG4rICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuKyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuKyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4rICovXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxuK3tcbitcdHN0cnVjdCBzdGF0ZnMgc3Q7XG4rXG4rXHRpZiAoIXN0YXRmcyhcIi90bXBcIiwgXHUwMDI2c3QpIFx1MDAyNlx1MDAyNlxuK1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbitcdFx0cmV0dXJuIFwiLlwiO1xuK1x0cmV0dXJuIFwiL3RtcFwiO1xuK31cbitcbisvKlxuKyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc29cbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXG4rICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbisgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS5cbisgKi9cbitlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4rXHRDSElMRF9FWElUX09LID0gMCxcbitcdENISUxEX0VYSVRfSk9JTl9DR1JPVVAsXG4rXHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4rXHRDSElMRF9FWElUX1JFQURfRklMRSxcbitcdENISUxEX0VYSVRfVElNRV9GSUxFLFxuK307XG4rXG4rc3RhdGljIGNvbnN0IGNoYXIgKmNoaWxkX2V4aXRfc3RyKGludCBjb2RlKVxuK3tcbitcdHN3aXRjaCAoY29kZSkge1xuK1x0Y2FzZSBDSElMRF9FWElUX09LOlxuK1x0XHRyZXR1cm4gXCJzdWNjZXNzXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4rXHRcdHJldHVybiBcImpvaW4gY2dyb3VwXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgZGF0YSBmaWxlXCI7XG4rXHRjYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOlxuK1x0XHRyZXR1cm4gXCJyZWFkIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbitcdFx0cmV0dXJuIFwid3JpdGUgdGltZSBmaWxlXCI7XG4rXHRkZWZhdWx0OlxuK1x0XHRyZXR1cm4gXCJ1bmtub3duXCI7XG4rXHR9XG4rfVxuK1xuK3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LypcbitcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxuK1x0ICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW5cbitcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4rXHQgKi9cbitcdGlmICghYWNjZXNzKFwiL3Byb2Mvc3dhcHNcIiwgRl9PSykpIHtcbitcdFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcIm1lbW9yeS5zd2FwLm1heFwiLCBcIjBcIik7XG4rXHRcdGlmICghQVNTRVJUX09LKHJldCwgXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXhcIikpXG4rXHRcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfSElHSF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KmhpZ2hfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19MT1dfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldHVybiAwO1xuK1xuK2NsZWFudXA6XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0cmV0dXJuIC0xO1xuK31cbitcbisvKlxuKyAqIFRoZSBkeWluZyB0ZXN0IG5lZWRzIGFuIGVtcHR5IHJlY2xhaW0gdGFyZ2V0IHBsdXMgYSBjZ3JvdXAgdGhhdCBrZWVwc1xuKyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4rICogc3RhcnRpbmcgYW5kIHJ1biBpbnRvIHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIHR3byBoYXZlIHRvIGJlIHNlcGFyYXRlXG4rICogY2dyb3VwczogdGhlIHRhcmdldCBtdXN0IGhvbGQgbm8gcHJvY2Vzc2VzIHRvIGJlIHJlbW92ZWQsIGFuZCB2MidzXG4rICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZlxuKyAqIGFueSBwYXJlbnQgdGhhdCBoYXMgZG9tYWluIGNoaWxkcmVuLlxuKyAqL1xuK3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpXG4re1xuK1x0aW50IHJldDtcbitcdGNoYXIgbGltaXRfYnVmWzIwXTtcbitcbitcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHRyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRFlJTkdfRElSLCBcIm1lbW9yeVwiKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJlbmFibGVfY29udHJvbGxlcnNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwiJWx1XCIsIENHX0xJTUlUKTtcbitcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkubWF4XCIsIGxpbWl0X2J1Zik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0LyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RSSUdHRVJfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRyaWdnZXJfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdGFyZ2V0X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqdGFyZ2V0X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rc3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdHNpemVfdCB3cml0dGVuID0gMDtcbitcdGNoYXIgKmJ1ZmZlcjtcbitcdEZJTEUgKmZwO1xuK1xuK1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCJ3YlwiKTtcbitcdGlmICghZnApXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbitcdGlmICghYnVmZmVyKVxuK1x0XHRnb3RvIGNsZWFudXBfZnA7XG4rXG4rXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcbitcbitcdHdoaWxlICh3cml0dGVuIFx1MDAzYyBGSUxFX1NJWkUpIHtcbitcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuK1x0XHRcdFx0ICBGSUxFX1NJWkUgLSB3cml0dGVuIDogQlVGRkVSX1NJWkU7XG4rXG4rXHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdFx0d3JpdHRlbiArPSB0b193cml0ZTtcbitcdH1cbitcbitcdHJldCA9IDA7XG4rY2xlYW51cDpcbitcdGZyZWUoYnVmZmVyKTtcbitjbGVhbnVwX2ZwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4re1xuK1x0aW50IHJldCA9IC0xO1xuK1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4rXHRjaGFyICptYXA7XG4rXHRzaXplX3QgaTtcbitcdGludCBmZDtcbitcdHN0cnVjdCBzdGF0IHNiO1xuK1xuK1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4rXHRpZiAoZmQgPT0gLTEpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGZzdGF0KGZkLCBcdTAwMjZzYikgPT0gLTEpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xuK1x0XHRmcHJpbnRmKHN0ZGVyciwgXCJGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwiLFxuK1x0XHRcdCh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7XG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcdH1cbitcbitcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4rXHRpZiAobWFwID09IE1BUF9GQUlMRUQpXG4rXHRcdGdvdG8gY2xlYW51cF9mZDtcbitcbitcdGZvciAoaW50IGl0ZXIgPSAwOyBpdGVyIFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcbitcdFx0Zm9yIChpID0gMDsgaSBcdTAwM2MgRklMRV9TSVpFOyBpICs9IHBhZ2Vfc2l6ZSkge1xuK1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4rXHRcdFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xuK1x0XHRcdCh2b2lkKXY7XG4rXHRcdH1cbitcdH1cbitcbitcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRyZXQgPSAwO1xuK1xuK2NsZWFudXBfZmQ6XG4rXHRjbG9zZShmZCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSxcbitcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuK3tcbitcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xuK1x0ZG91YmxlIGVsYXBzZWQ7XG4rXHRGSUxFICpmcDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4rXG4rXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbitcbitcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbitcbitcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZlbmQpO1xuK1xuK1x0aWYgKCF0aW1lX2ZpbGVuYW1lKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcbitcbitcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xuK1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuK1x0cHJpbnRmKFwiJS42ZlxcblwiLCBlbGFwc2VkKTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0aW50IGVycjtcbitcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuK1x0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xuK1xuK1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltXCIpKVxuK1x0XHRyZXR1cm47XG4rXG4rXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2JwZlwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2aGlnaF90aW1lLCBcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0LypcbitcdCAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBiZWxvdyBhbG9uZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYSB3b3JraW5nXG4rXHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbitcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cbitcdCAqL1xuK1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgMCwgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0aWYgKGhpZ2hfdGltZSBcdTAwM2U9IGxvd190aW1lKVxuK1x0XHRQUklOVF9GQUlMKFwiaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlwiLFxuK1x0XHRcdCAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xuK1xuK291dDpcbitcdGlmIChza2VsKVxuK1x0XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbit9XG4rXG4rLypcbisgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHNcbisgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGVcbisgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuKyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseVxuKyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3BcbisgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4rICovXG4rc3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKVxuK3tcbitcdHBpZF90IHBpZCA9IGZvcmsoKTtcbitcbitcdGlmIChwaWQgIT0gMClcbitcdFx0cmV0dXJuIHBpZDtcbitcbitcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuK1x0XHRfZXhpdChDSElMRF9FWElUX0pPSU5fQ0dST1VQKTtcbitcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZSkpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4rXHRmb3IgKDs7KSB7XG4rXHRcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSlcbitcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4rXHR9XG4rfVxuK1xuKy8qXG4rICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmRcbisgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mXG4rICogcmVjbGFpbWluZyBmcm9tIGl0LlxuKyAqXG4rICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmRcbisgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxuKyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIHJlY2xhaW1fY2FsbHMgZ3Jvd2luZ1xuKyAqIHdoaWxlIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBza2lwIGNvdW50ZXJzIG11c3QgZ3JvdyB3aGlsZSByZWNsYWltX2NhbGxzXG4rICogYW5kIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRwaWRfdCByZWFkZXJfcGlkID0gLTE7XG4rXHRpbnQgZXJyLCBmZCwgaTtcbitcbitcdGVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoXHUwMDI2dHJpZ2dlcl9jZ3JvdXBfaWQsIFx1MDAyNnRhcmdldF9jZ3JvdXBfaWQpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInNldHVwX2R5aW5nX2Nncm91cHNcIikpXG4rXHRcdHJldHVybjtcbitcbitcdGVyciA9IHNldHVwX2JwZih0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZCwgXHUwMDI2c2tlbCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfYnBmXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdHNucHJpbnRmKGRhdGFfZmlsZSwgc2l6ZW9mKGRhdGFfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XG4rXHRmZCA9IG1rc3RlbXAoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0Y2xvc2UoZmQpO1xuK1xuK1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFwiZm9yayBrZWVwYWxpdmUgcmVhZGVyXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMgXHUwMDNlIDApXG4rXHRcdFx0YnJlYWs7XG4rXHRcdHVzbGVlcChEWUlOR19QT0xMX0lOVEVSVkFMX1VTKTtcbitcdH1cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXG4rXHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBEWUlOR19QT0xMX0lURVJTOyBpKyspIHtcbitcdFx0aWYgKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fdGFyZ2V0X2dvbmUgfHxcbitcdFx0ICAgIHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZylcbitcdFx0XHRicmVhaztcbitcdFx0dXNsZWVwKERZSU5HX1BPTExfSU5URVJWQUxfVVMpO1xuK1x0fVxuK1xuK1x0aWYgKCFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3RhcmdldF9nb25lIFx1MDAyNlx1MDAyNlxuK1x0ICAgICFza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltX3NraXBwZWRfZHlpbmcpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lbGx1LCBkeWluZz0lbGx1KVwiLFxuK1x0XHRcdCAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdFx0XHQgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0LypcbitcdCAqIHJlY2xhaW1fc2tpcHBlZF9keWluZyBzaG93cyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIGl0IGlzIGhpdCBpcyB0aW1pbmdcbitcdCAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzb1xuK1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbitcdCAqL1xuK1x0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWxsdSwgZHlpbmc9JWxsdVxcblwiLFxuK1x0ICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV90YXJnZXRfZ29uZSxcbitcdCAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fc2tpcHBlZF9keWluZyk7XG4rXG4rXHQvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqL1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCBcInJlY2xhaW1fY2FsbHNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbWVkX2J5dGVzLCBieXRlc19iZWZvcmUsXG4rXHRcdCAgICAgICBcInJlY2xhaW1lZF9ieXRlc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rb3V0OlxuK1x0aWYgKHJlYWRlcl9waWQgXHUwMDNlIDApIHtcbitcdFx0a2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTtcbitcdFx0KHZvaWQpd2FpdHBpZChyZWFkZXJfcGlkLCBOVUxMLCAwKTtcbitcdH1cbitcdGlmIChkYXRhX2ZpbGVbMF0pXG4rXHRcdHVubGluayhkYXRhX2ZpbGUpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmU2ODM5YWRlNDcyYmJcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjU5IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuKy8qXG4rICogUmVjbGFpbSBhdHRlbXB0cyBza2lwcGVkIGJlY2F1c2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcgb3IgaGFzXG4rICogYmVlbiByZW1vdmVkLiByZWNsYWltX3NraXBwZWRfZHlpbmcgY291bnRzIGxvb2t1cHMgdGhhdCBzdGlsbCBmb3VuZFxuKyAqIHRoZSBjZ3JvdXAgd2hpbGUgaXQgaXMgYmVpbmcgdG9ybiBkb3duLCByZWNsYWltX3RhcmdldF9nb25lIGNvdW50c1xuKyAqIGxvb2t1cHMgdGhhdCBmb3VuZCBub3RoaW5nLiBUaGUgdGVzdCByZW1vdmVzIHRoZSB0YXJnZXQgY2dyb3VwIHdoaWxlXG4rICogcmVjbGFpbSBpcyBydW5uaW5nIGFuZCBjaGVja3MgdGhhdCByZWNsYWltIHN0b3BzIHZpYSB0aGVzZSBjb3VudGVycy5cbisgKi9cbit1NjQgcmVjbGFpbV9za2lwcGVkX2R5aW5nO1xuK3U2NCByZWNsYWltX3RhcmdldF9nb25lO1xuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbitcdGlmICghY20tXHUwMDNlY2dycClcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0Y20tXHUwMDNlbWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoXHUwMDI2Y20tXHUwMDNlY2dycC1cdTAwM2VzZWxmKTtcbitcdGlmICghY20tXHUwMDNlbWVtY2cpIHtcbitcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK1x0XHRyZXR1cm4gLTE7XG4rXHR9XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIHZvaWQgcHV0X2Nncm91cF9tZW1jZyhzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbit7XG4rXHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuK1x0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuK31cbitcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpXG4rXHRcdHJldHVybiAtMTtcbitcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcbitcdCp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLFxuK1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4rXHRcdFx0XHQgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTtcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBib29sXG4rc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZClcbit7XG4rXHR1NjQgY3VyLCBkZWx0YTtcbitcbitcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbitcdFx0cmV0dXJuIGZhbHNlO1xuK1xuK1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbitcdCpwcmV2X2V2ZW50ID0gY3VyO1xuK1xuK1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK31cbitcbisvKlxuKyAqIEEgY2dyb3VwIGlzIGR5aW5nIG9uY2UgaXQgaGFzIGJlZW4gb2ZmbGluZWQgKENTU19PTkxJTkUgY2xlYXJlZCkgb3JcbisgKiBDU1NfRFlJTkcgaGFzIGJlZW4gcmFpc2VkLCBtaXJyb3JpbmcgY2dyb3VwX2lzX2RlYWQoKS9jc3NfaXNfZHlpbmcoKVxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbisgKiBzdWNoIGEgY2dyb3VwLCBiZWNhdXNlIGl0IG9ubHkgZmFpbHMgb25jZSB0aGUgbGFzdCByZWZlcmVuY2UgaGFzIGJlZW5cbisgKiBkcm9wcGVkLCBzbyByZWNsYWltIGhhcyB0byBjaGVjayB0aGVzZSBmbGFncyBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4rICpcbisgKiBDU1NfT05MSU5FIGFuZCBDU1NfRFlJTkcgY29tZSBmcm9tIHZtbGludXguaDogdGhlIGtlcm5lbCBkZWZpbmVzIHRoZW1cbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbisgKiBiaW5kIHRvLCBhbmQgcmVkZWNsYXJpbmcgdGhlbSBsb2NhbGx5IHdvdWxkIGNsYXNoIHdpdGggdGhlIHZtbGludXguaFxuKyAqIGVudW1lcmF0b3JzLiB2bWxpbnV4LmggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsJ3MgQlRGLCBzb1xuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cbisgKi9cbitzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbit7XG4rXHR1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjZ3JwLVx1MDAzZXNlbGYuZmxhZ3M7XG4rXG4rXHRyZXR1cm4gKGZsYWdzIFx1MDAyNiBDU1NfRFlJTkcpIHx8ICEoZmxhZ3MgXHUwMDI2IENTU19PTkxJTkUpO1xuK31cbitcbisvKlxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxuKyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbisgKiByZWNsYWltZWQuXG4rICovXG4rc3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1x0dTY0IG5yID0gMDtcbitcbitcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcdTAwMjZjbSkpIHtcbitcdFx0cmVjbGFpbV90YXJnZXRfZ29uZSsrO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0cmVjbGFpbV9za2lwcGVkX2R5aW5nKys7XG4rXHRcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdHJlY2xhaW1fY2FsbHMrKztcbitcdG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDI6MDIuNjkzNzg4ODgxWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY4NjA3MTE1NTYsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gQW5hbHlzaXMgb2YgQlBGIFByb2FjdGl2ZSBSZWNsYWltIEtmdW5jKipcblxuQWxyaWdodCwgbGV0J3MgYnJlYWsgZG93biB0aGlzIHBhdGNoLiBJIHNlZSBhIG5ldyBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGFkZGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgYWxvbmcgd2l0aCBpdHMgc2VsZnRlc3RzLiBUaGUgY29yZSBvZiBpdCBpbnZvbHZlcyB0aGlzIGZ1bmN0aW9uIGNhbGxpbmcgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLlxuXG5JIG5lZWQgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24ndCBpbnRyb2R1Y2UgYW55IHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy4gU28sIGxldCdzIHN0ZXAgdGhyb3VnaCB0aGlzIG1ldGhvZGljYWxseS4gRmlyc3QsIHRoZXJlIGFyZW4ndCBhbnkga2VybmVsIHN0cnVjdHVyZXMgZ2V0dGluZyBzZW50IHRvIHVzZXIgc3BhY2UgZGlyZWN0bHkuIEl0IHJldHVybnMgYSBzaW1wbGUgYHVuc2lnbmVkIGxvbmdgIHNjYWxhciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiByZWNsYWltZWQgYnl0ZXMsIHdoaWNoIGlzIGdvb2QuIFNlY29uZCwgdGhlIGNvZGUgZmxvdyBpcyBzdHJhaWdodGZvcndhcmQ7IHRoZXJlJ3Mgbm8gY29uZGl0aW9uYWwgbG9naWMgYmFzZWQgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMuIFRoZSBrZXkgdmFyaWFibGVzLCBgbnJfcGFnZXNgIGFuZCBgbnJfcmVjbGFpbWVkYCwgYXJlIGRpcmVjdGx5IGluaXRpYWxpemVkIHdpdGggdGhlIHJlc3VsdHMgb2YgY2FsY3VsYXRpb25zIGFuZCBmdW5jdGlvbiBjYWxscywgcmVzcGVjdGl2ZWx5LiBUaGlyZCwgbm8gbmV3IGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQuIEZpbmFsbHksIHRoZXJlJ3Mgbm8gcmlzayBvZiBhbnkga2luZCBvZiBidWZmZXIgb3ZlcnJ1bnMgdGhhdCBtaWdodCBleHBvc2UgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cbkxvb2tpbmcgZGVlcGVyIGF0IHRoZSBjb2RlLCBldmVyeXRoaW5nIGhpbmdlcyBvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AsIGBicGZfaW5fcmVjbGFpbV9jb250ZXh0YCwgYW5kIHRoZSBpbml0aWFsaXphdGlvbiB3aXRoaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGlzIGtmdW5jIGxldmVyYWdlcyBhbiBleGlzdGluZywgd2VsbC12ZXR0ZWQgbW0gaW50ZXJuYWwgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBpcyBxdWl0ZSBzaW1wbGUsIGFuZCBpdCdzIHBhc3NpbmcgaW4gdGhlIGBtZW1jZ2AgcG9pbnRlciBhbmQgdGhlIHNpemUgdmFsdWUuIFRoZSByZXR1cm4gdmFsdWUgaXMganVzdCBhbiBgdW5zaWduZWQgbG9uZ2AuXG5cblRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgYXJlIGBzdHJ1Y3QgbWVtX2Nncm91cCAqYCwgYHVuc2lnbmVkIGxvbmcgbnJfcGFnZXNgLCBgZ2ZwX3QgZ2ZwX21hc2tgLCBgdW5zaWduZWQgaW50IHJlY2xhaW1fb3B0aW9uc2AsIGFuZCBgbm9kZW1hc2tfdCAqbm9kZW1hc2tgICh3aGVyZSBpdCdzIHBhc3NlZCBhcyBOVUxMKS4gVGhlcmUgaXMgbm8gcmVhZGluZyBvZiB1bmluaXRpYWxpemVkIHN0YWNrIG9yIGhlYXAgbWVtb3J5LiBOb3RoaW5nIGhlcmUgbGVha3MgdW5pbml0aWFsaXplZCBtZW1vcnkuXG5cblRoZSBwb3RlbnRpYWwgaXNzdWVzIEkgY2FuIHNlZSB3b3VsZCBiZSBjbGFzc2ljIG1lbW9yeSBtYW5hZ2VtZW50IGVycm9ycyBsaWtlIGxvY2tpbmcgaXNzdWVzLCByZWN1cnNpb24sIHNsZWVwLWluLWF0b21pYyBjb250ZXh0IHByb2JsZW1zLCBjb25jdXJyZW5jeSBpc3N1ZXMsIHJlZmNvdW50IGVycm9ycywgb3IgZGVhZGxvY2tzLiBIb3dldmVyLCB0aG9zZSBhcmUgdGhlIHR5cGVzIG9mIGJ1Z3MgdGhhdCBLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORywgYW5kIHRoZSBvdGhlciBzdGFuZGFyZCBrZXJuZWwgZGV0ZWN0b3JzIGFyZSBkZXNpZ25lZCB0byBjYXRjaC4gS01TQU4gaXNuJ3QgbmVlZGVkIGhlcmUuXG5cblNvLCBhY2NvcmRpbmcgdG8gbXkgYW5hbHlzaXMgYW5kIHRoZXNlIGd1aWRlbGluZXM6XG5cbiogICAqKk5lZWRzS01TQU46IGZhbHNlKipcbiogICAqKktNU0FOUmVhc29uaW5nOioqIFRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBrZnVuYywgd2hpY2ggaXMgYWRkZWQgdG8gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBzZWxmdGVzdHMuIFRoaXMga2Z1bmMgdGFrZXMgYSBtZW1jZyBwb2ludGVyIGFuZCBhIHNpemUgc2NhbGFyLCBkb2VzIHNvbWUgYmFzaWMgdmFsaWRhdGlvbiwgdGhlbiBpbnZva2VzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLCByZXR1cm5pbmcgYW4gYHVuc2lnbmVkIGxvbmdgIHJlcHJlc2VudGluZyByZWNsYWltZWQgYnl0ZXMuIFRoZXJlIGFyZSBubyBoZWFwIG9yIHN0YWNrIGFsbG9jYXRpb25zIHdpdGggdW5pbml0aWFsaXplZCBmaWVsZHMsIG5vIGNvcGllcyB0byB1c2VyIHNwYWNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIG5vIGluZm8gbGVha3MuIEFueSBwb3RlbnRpYWwgbWVtb3J5IG1hbmFnZW1lbnQgaXNzdWVzLCBsb2NraW5nLCBzbGVlcGFibGUgY29udGV4dHMsIG9yIHBvaW50ZXIgdmFsaWRpdHkgcHJvYmxlbXMgd291bGQgYmUgaWRlbnRpZmllZCBieSBLQVNBTiBhbmQgTE9DS0RFUC5cblxuTGV0J3MgcHJvY2VlZCB0byBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDEwMSwiT3V0cHV0VG9rZW5zIjoxOTUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxMDgzLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDVUMjA6NDI6MDkuNTU0NTAzMTM3WiIsIlNlcSI6MzQsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTUzNjAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBCUEYga2Z1bmMgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFuZCBhc3NvY2lhdGVkIEJQRiBzZWxmdGVzdHMuIFRoZSBmdW5jdGlvbiBhY2NlcHRzIGEgcG9pbnRlciB0byBgc3RydWN0IG1lbV9jZ3JvdXBgIGFuZCBhIGBzaXplYCBwYXJhbWV0ZXIsIGNoZWNrcyB0aGUgZXhlY3V0aW9uIGNvbnRleHQsIGNhbGxzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLCBhbmQgcmV0dXJucyBhIHNjYWxhciBgdW5zaWduZWQgbG9uZ2AgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHJlY2xhaW1lZCBieXRlcy5cXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIG5vIHVuaW5pdGlhbGl6ZWQgc3RydWN0IGZpZWxkcywgbm8gdW5pbml0aWFsaXplZCBidWZmZXIgcmVhZHMsIGFuZCBubyB0cmFuc2ZlcnMgb2Yga2VybmVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIHVzZXIgc3BhY2UuIEFueSBwb3RlbnRpYWwgaXNzdWVzIChlLmcuLCBkZWFkbG9jaywgcmVjdXJzaW9uIGluIHJlY2xhaW0gY29udGV4dCwgcmVmY291bnRpbmcsIG9yIGludmFsaWQgcG9pbnRlciBkZXJlZmVyZW5jZSkgZmFsbCBzdHJpY3RseSB1bmRlciBLQVNBTiwgTE9DS0RFUCwgYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dpbmcgZmFjaWxpdGllcywgbm90IEtNU0FOLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgdGhlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIEJQRiBrZnVuYyBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYW5kIGFzc29jaWF0ZWQgQlBGIHNlbGZ0ZXN0cy4gVGhlIGZ1bmN0aW9uIGFjY2VwdHMgYSBwb2ludGVyIHRvIGBzdHJ1Y3QgbWVtX2Nncm91cGAgYW5kIGEgYHNpemVgIHBhcmFtZXRlciwgY2hlY2tzIHRoZSBleGVjdXRpb24gY29udGV4dCwgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAsIGFuZCByZXR1cm5zIGEgc2NhbGFyIGB1bnNpZ25lZCBsb25nYCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgcmVjbGFpbWVkIGJ5dGVzLlxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbm8gdW5pbml0aWFsaXplZCBzdHJ1Y3QgZmllbGRzLCBubyB1bmluaXRpYWxpemVkIGJ1ZmZlciByZWFkcywgYW5kIG5vIHRyYW5zZmVycyBvZiBrZXJuZWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8gdXNlciBzcGFjZS4gQW55IHBvdGVudGlhbCBpc3N1ZXMgKGUuZy4sIGRlYWRsb2NrLCByZWN1cnNpb24gaW4gcmVjbGFpbSBjb250ZXh0LCByZWZjb3VudGluZywgb3IgaW52YWxpZCBwb2ludGVyIGRlcmVmZXJlbmNlKSBmYWxsIHN0cmljdGx5IHVuZGVyIEtBU0FOLCBMT0NLREVQLCBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyBmYWNpbGl0aWVzLCBub3QgS01TQU4uXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+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-workflowmkb67[1] Phase: Succeeded StartedAt: 2026-09-05 20:42:21 +0000 UTC FinishedAt: 2026-09-05 20:42:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-05 20:42:21 +0000 UTC FinishedAt: 2026-09-05 20:42:21 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2] Phase: Running StartedAt: 2026-09-05 20:42:21 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN) Phase: Running StartedAt: 2026-09-05 20:42:21 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-05 20:42:21 +0000 UTC FinishedAt: 2026-09-05 20:42:31 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-05 20:42:21 +0000 UTC FinishedAt: 2026-09-05 20:42:24 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.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-workflowmkb67/series-workflowmkb67-convert-artifact-4006866407/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-05 20:42:31 +0000 UTC FinishedAt: 2026-09-05 20:59:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-05 20:42:31 +0000 UTC FinishedAt: 2026-09-05 20:59:25 +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:*bb71d112-65ea-47ec-b2cb-206214b25641,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-workflowmkb67/series-workflowmkb67-convert-artifact-4006866407/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": "c5286866-c2b2-4b4e-84b8-dbe3333e5335", "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-workflowmkb67/series-workflowmkb67-build-action-3985564797/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-05 20:42:31 +0000 UTC FinishedAt: 2026-09-05 20:59:15 +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:*bb71d112-65ea-47ec-b2cb-206214b25641,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-workflowmkb67/series-workflowmkb67-convert-artifact-4006866407/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": "c5286866-c2b2-4b4e-84b8-dbe3333e5335", "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-workflowmkb67/series-workflowmkb67-build-action-3985564797/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-05 20:59:25 +0000 UTC FinishedAt: 2026-09-05 20:59:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-05 20:59:25 +0000 UTC FinishedAt: 2026-09-05 20:59:25 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-05 20:59:25 +0000 UTC FinishedAt: 2026-09-05 20:59:35 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-05 20:59:25 +0000 UTC FinishedAt: 2026-09-05 20:59:29 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.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-workflowmkb67/series-workflowmkb67-convert-artifact-2839380630/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-05 20:59:35 +0000 UTC FinishedAt: 2026-09-05 21:01:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-05 20:59:35 +0000 UTC FinishedAt: 2026-09-05 21:01:28 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*c5286866-c2b2-4b4e-84b8-dbe3333e5335,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-workflowmkb67/series-workflowmkb67-build-action-3985564797/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-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-05 21:01:38 +0000 UTC FinishedAt: 2026-09-05 21:01:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-05 21:01:38 +0000 UTC FinishedAt: 2026-09-05 21:01:38 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-05 21:01:38 +0000 UTC FinishedAt: 2026-09-05 21:18:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-05 21:01:38 +0000 UTC FinishedAt: 2026-09-05 21:18:34 +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:*bb71d112-65ea-47ec-b2cb-206214b25641,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-workflowmkb67/series-workflowmkb67-convert-artifact-2839380630/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": "cd576d24-5a98-4587-a17c-064e8eb0b55a", "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-workflowmkb67/series-workflowmkb67-build-action-323765146/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-05 21:01:38 +0000 UTC FinishedAt: 2026-09-05 21:18:24 +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:*bb71d112-65ea-47ec-b2cb-206214b25641,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-workflowmkb67/series-workflowmkb67-convert-artifact-2839380630/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": "cd576d24-5a98-4587-a17c-064e8eb0b55a", "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-workflowmkb67/series-workflowmkb67-build-action-323765146/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-05 21:18:34 +0000 UTC FinishedAt: 2026-09-05 21:18:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-05 21:18:34 +0000 UTC FinishedAt: 2026-09-05 21:18:34 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8] Phase: Running StartedAt: 2026-09-05 21:18:34 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +0000 UTC Input: nil Output: nil --------- Name: series-workflowmkb67[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-bpf-kasan-gce-corpus.db","https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["bpf_proactive_reclaim"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"3ccdb07813829ba9487273e75d1cb238cfa774c1","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"43142361-e717-4509-a429-70ce312f5eb2","tree_name":"bpf-next","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/bpf/bpf-next.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Running StartedAt: 2026-09-05 21:18:34 +0000 UTC FinishedAt: 0001-01-01 00:00:00 +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:*cd576d24-5a98-4587-a17c-064e8eb0b55a,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-workflowmkb67/series-workflowmkb67-build-action-323765146/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil