Name: series-workflowzlspx Phase: Succeeded StartedAt: 2026-09-03 15:41:29 +0000 UTC FinishedAt: 2026-09-03 19:23:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[0] Phase: Succeeded StartedAt: 2026-09-03 15:41:29 +0000 UTC FinishedAt: 2026-09-03 15:44:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[0].run-triage Phase: Succeeded StartedAt: 2026-09-03 15:41:29 +0000 UTC FinishedAt: 2026-09-03 15:44:57 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_GUEST_MEMFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_GUEST_MEMFD" ], "series_id": "29c063b4-0fb5-4c56-a411-2d16db5a39e2" }, "track": "KASAN", "fuzz": { "focus": [ "kvm" ], "focus_symbols": [ "kvm_gmem_bind", "kvm_set_memslot", "kvm_set_memory_region", "kvm_vm_ioctl_set_memory_region" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OywKICAgICYjMzQ7a3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRqdXN0cyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHNlcXVlbmNlIG9mIGt2bV9nbWVtX2JpbmQoKSB3aXRoaW4gS1ZNJiMzOTtzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cblxuQWxsIGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0dXJlcyAoc3VjaCBhcyBrdm1fbWVtb3J5X3Nsb3QpIGFyZSB6ZXJvLWFsbG9jYXRlZCB3aXRoIGt6YWxsb2Nfb2JqKCksIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiwgeGFyKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIG5vIGRhdGEgaXMgY29waWVkIHRvIHVzZXJzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQgaW4ga2VybmVsLWludGVybmFsIHN0YXRlLiBBcyB0aGlzIGNoYW5nZSBkZWFscyBzdHJpY3RseSB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBjbGVhbnVwIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlcywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQgYW5kIHN0YW5kYXJkIEtBU0FOIHRlc3RpbmcgaXMgc3VmZmljaWVudC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMDcxMTU1MzZiYzI3ZmQyYzcwMWI1MTc4MmY4ZmIyYjZmNjI5YzAxZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbmluZGV4IGI1OTY0ODZkMTg0Y2EuLjMyMzE1OWM5YjVmMzQgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5AQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbiYjNDM7XHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShzbG90LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiAmIzQzOzY1MywxMiBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gXHQgKi9cbi1cdFdSSVRFX09OQ0Uoc2xvdC1cdTAwM2VnbWVtLmZpbGUsIGZpbGUpO1xuJiM0MztcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiYjNDM7XHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4gXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXG4gXHQvKlxuQEAgLTY2Miw3ICYjNDM7NjY2LDEzIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICYjMzk7cm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gXHQgKi9cbi1cdHIgPSAwO1xuJiM0MztcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiYjNDM7XHRpZiAocikge1xuJiM0MztcdFx0eGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbiYjNDM7XHRcdHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuJiM0MztcdH1cbiBlcnI6XG4gXHRmcHV0KGZpbGUpO1xuIFx0cmV0dXJuIHI7XG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5AQCAtMTg4Nyw3ICYjNDM7MTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4tXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcbiYjNDM7XHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbiYjNDM7XHRcdFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XG4gXHRpbnQgcjtcbkBAIC0xOTMxLDIwICYjNDM7MTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHR9XG4gXG4gXHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuLVx0aWYgKHIpIHtcbi1cdFx0Lypcbi1cdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cbi1cdFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXG4tXHRcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xuLVx0XHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbi1cdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbi1cdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRyZXR1cm4gcjtcbiYjNDM7XHRpZiAocilcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuJiM0MztcdFx0XHRnb3RvIGVycl9iaW5kO1xuJiM0MztcbiYjNDM7XHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4mIzQzO1x0XHRpZiAocilcbiYjNDM7XHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbiBcbiBcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZXJyX2JpbmQ6XG4mIzQzO1x0aWYgKG5ldykge1xuJiM0MztcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuJiM0MztcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbiYjNDM7XHR9XG4mIzQzO2VycjpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbiYjNDM7XHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbiYjNDM7XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuJiM0MztcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4mIzQzO1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiByO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXG5AQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4gXHRcdFx0cmV0dXJuIC1FSU87XG4gXG4tXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpO1xuJiM0MztcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSAmIzQzOzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0bmV3LVx1MDAzZW5wYWdlcyA9IG5wYWdlcztcbiBcdG5ldy1cdTAwM2VmbGFncyA9IG1lbS1cdTAwM2VmbGFncztcbiBcdG5ldy1cdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cdTAwM2V1c2Vyc3BhY2VfYWRkcjtcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbi1cdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4tXHRcdGlmIChyKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0fVxuIFxuLVx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuJiM0MztcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxuJiM0MztcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcbiBcdHJldHVybiAwO1xuIFxuLW91dF91bmJpbmQ6XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxuLVx0XHRrdm1fZ21lbV91bmJpbmQobmV3KTtcbiBvdXQ6XG4gXHRrZnJlZShuZXcpO1xuIFx0cmV0dXJuIHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7LAogICAgJiMzNDtrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMDcxMTU1MzZiYzI3ZmQyYzcwMWI1MTc4MmY4ZmIyYjZmNjI5YzAxZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwppbmRleCBiNTk2NDg2ZDE4NGNhLi4zMjMxNTljOWI1ZjM0IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCiYjNDM7JiM0MzsmIzQzOyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKQEAgLTYxMiwxMCAmIzQzOzYxMiwxNCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlpbnQgciA9IC1FSU5WQUw7CiYjNDM7CXZvaWQgKnhhcjsKIAogCUJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTsKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC0mZ3Q7Z21lbS5wZ29mZikpOwogCiYjNDM7CWlmIChXQVJOX09OX09OQ0Uoc2xvdC0mZ3Q7ZmxhZ3MgJmFtcDsgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwogCWZpbGUgPSBmZ2V0KGZkKTsKIAlpZiAoIWZpbGUpCiAJCXJldHVybiAtRUJBREY7CkBAIC02NDksMTIgJiM0Mzs2NTMsMTIgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAogCSAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90CiAJICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuCiAJICovCi0JV1JJVEVfT05DRShzbG90LSZndDtnbWVtLmZpbGUsIGZpbGUpOwomIzQzOwlzbG90LSZndDtnbWVtLmZpbGUgPSBmaWxlOwogCXNsb3QtJmd0O2dtZW0ucGdvZmYgPSBzdGFydDsKIAlpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpCiAJCXNsb3QtJmd0O2ZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTsKIAotCXhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTsKJiM0MzsJeGFyID0geGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpOwogCWZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtJmd0O2lfbWFwcGluZyk7CiAKIAkvKgpAQCAtNjYyLDcgJiM0Mzs2NjYsMTMgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAogCSAqIG5vdCB0aGUgb3RoZXIgd2F5ICYjMzk7cm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZQogCSAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLgogCSAqLwotCXIgPSAwOwomIzQzOwlyID0geGFfaXNfZXJyKHhhcikgPyB4YV9lcnIoeGFyKSA6IDA7CiYjNDM7CWlmIChyKSB7CiYjNDM7CQl4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7CiYjNDM7CQlzbG90LSZndDtnbWVtLmZpbGUgPSBOVUxMOwomIzQzOwkJc2xvdC0mZ3Q7Z21lbS5wZ29mZiA9IDA7CiYjNDM7CQlzbG90LSZndDtmbGFncyAmYW1wOz0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTsKJiM0MzsJfQogZXJyOgogCWZwdXQoZmlsZSk7CiAJcmV0dXJuIHI7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCA2NWViMjZhMDUyMGQ4Li4yMWMxMGNiYmFjNjYxIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTE4ODcsNyAmIzQzOzE4ODcsOCBAQCBzdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLAogc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLAogCQkJICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLAogCQkJICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbmV3LAotCQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSkKJiM0MzsJCQkgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlLAomIzQzOwkJCSAgIHVuc2lnbmVkIGludCBnbWVtX2ZkLCB1b2ZmX3QgZ21lbV9vZmZzZXQpCiB7CiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqaW52YWxpZF9zbG90OwogCWludCByOwpAQCAtMTkzMSwyMCAmIzQzOzE5MzIsMTYgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLAogCX0KIAogCXIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7Ci0JaWYgKHIpIHsKLQkJLyoKLQkJICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8KLQkJICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkCi0JCSAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbwotCQkgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KLQkJICovCi0JCWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKLQkJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwotCQkJa2ZyZWUoaW52YWxpZF9zbG90KTsKLQkJfSBlbHNlIHsKLQkJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKLQkJfQotCQlyZXR1cm4gcjsKJiM0MzsJaWYgKHIpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJaWYgKG5ldyAmYW1wOyZhbXA7IG5ldy0mZ3Q7ZmxhZ3MgJmFtcDsgS1ZNX01FTV9HVUVTVF9NRU1GRCkgewomIzQzOwkJaWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKJiM0MzsKJiM0MzsJCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7CiYjNDM7CQlpZiAocikKJiM0MzsJCQlnb3RvIGVycl9iaW5kOwogCX0KIAogCS8qCkBAIC0xOTc3LDYgJiM0MzsxOTc0LDI3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAlrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTsKIAogCXJldHVybiAwOwomIzQzOwomIzQzO2Vycl9iaW5kOgomIzQzOwlpZiAobmV3KSB7CiYjNDM7CQlrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpOwomIzQzOwomIzQzOwkJaWYgKG5ldy0mZ3Q7ZGlydHlfYml0bWFwICZhbXA7JmFtcDsgKCFvbGQgfHwgIW9sZC0mZ3Q7ZGlydHlfYml0bWFwKSkKJiM0MzsJCQlrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTsKJiM0MzsJfQomIzQzO2VycjoKJiM0MzsJLyoKJiM0MzsJICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9ucwomIzQzOwkgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4KJiM0MzsJICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLgomIzQzOwkgKi8KJiM0MzsJaWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkgewomIzQzOwkJa3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7CiYjNDM7CQlrZnJlZShpbnZhbGlkX3Nsb3QpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJbXV0ZXhfdW5sb2NrKCZhbXA7a3ZtLSZndDtzbG90c19hcmNoX2xvY2spOwomIzQzOwl9CiYjNDM7CXJldHVybiByOwogfQogCiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsCkBAIC0yMDU4LDcgJiM0MzsyMDc2LDcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLAogCQlpZiAoV0FSTl9PTl9PTkNFKGt2bS0mZ3Q7bnJfbWVtc2xvdF9wYWdlcyAmbHQ7IG9sZC0mZ3Q7bnBhZ2VzKSkKIAkJCXJldHVybiAtRUlPOwogCi0JCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpOwomIzQzOwkJcmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApOwogCX0KIAogCWJhc2VfZ2ZuID0gKG1lbS0mZ3Q7Z3Vlc3RfcGh5c19hZGRyICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwpAQCAtMjEwNSwyMSAmIzQzOzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLAogCW5ldy0mZ3Q7bnBhZ2VzID0gbnBhZ2VzOwogCW5ldy0mZ3Q7ZmxhZ3MgPSBtZW0tJmd0O2ZsYWdzOwogCW5ldy0mZ3Q7dXNlcnNwYWNlX2FkZHIgPSBtZW0tJmd0O3VzZXJzcGFjZV9hZGRyOwotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKLQkJciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS0mZ3Q7Z3Vlc3RfbWVtZmQsIG1lbS0mZ3Q7Z3Vlc3RfbWVtZmRfb2Zmc2V0KTsKLQkJaWYgKHIpCi0JCQlnb3RvIG91dDsKLQl9CiAKLQlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiYjNDM7CXIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLAomIzQzOwkJCSAgICBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7CiAJaWYgKHIpCi0JCWdvdG8gb3V0X3VuYmluZDsKJiM0MzsJCWdvdG8gb3V0OwogCiAJcmV0dXJuIDA7CiAKLW91dF91bmJpbmQ6Ci0JaWYgKG1lbS0mZ3Q7ZmxhZ3MgJmFtcDsgS1ZNX01FTV9HVUVTVF9NRU1GRCkKLQkJa3ZtX2dtZW1fdW5iaW5kKG5ldyk7CiBvdXQ6CiAJa2ZyZWUobmV3KTsKIAlyZXR1cm4gcjsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDgwMwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI1NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtWTSBNZW1vcnkgU2xvdCBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgZGlmZiBhbmQgc2VlIGlmIGl0IHdhcnJhbnRzIHNvbWUgZnV6emluZyBhdHRlbnRpb24uIEl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gS1ZNJiMzOTtzIG1lbW9yeSBzbG90IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSB3aXRoaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIE15IGluaXRpYWwgZ2xhbmNlIHN1Z2dlc3RzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIGBndWVzdF9tZW1mZGAgaW50ZXJmYWNlLCB3aGljaCBpcyBpbnRlcmVzdGluZy4KClNwZWNpZmljYWxseSwgaW4gYGd1ZXN0X21lbWZkLmNgLCB0aGV5JiMzOTt2ZSBtb2RpZmllZCBga3ZtX2dtZW1fYmluZGAuIEkgc2VlIGEgYFdBUk5fT05fT05DRWAgY2hlY2sgYWdhaW5zdCBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCwgYSBuZXcgZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ3ksIGFuZCBhIHJvbGxiYWNrIG1lY2hhbmlzbSBpZiBgeGFfc3RvcmVfcmFuZ2VgIGZhaWxzLiBUaGlzIGluZGljYXRlcyBwb3RlbnRpYWwgZWRnZSBjYXNlcyByZWxhdGVkIHRvIHRoZSBhbGxvY2F0aW9uIG9yIGJpbmRpbmcgb2YgZ3Vlc3QgbWVtb3J5IHRocm91Z2ggbWVtZmRzLiBJbnRlcmVzdGluZywgaXQmIzM5O3MgcHJldHR5IGdvb2QgY29kZS4KCk5vdywgaW4gYGt2bV9tYWluLmNgLCBga3ZtX3NldF9tZW1zbG90YCBhcHBlYXJzIHRvIGhhdmUgYmVlbiByZXdvcmtlZC4gVGhleSYjMzk7dmUgbW92ZWQgYGt2bV9nbWVtX2JpbmRgIGluc2lkZSBpdCwgYWZ0ZXIgYGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb25gLCB3aGljaCBpcyBhIG5vdGFibGUgY2hhbmdlLiBUaGV5IGFsc28gYWRkZWQgYSBgV0FSTl9PTl9PTkNFYCBjaGVjayBmb3IgYEtWTV9NUl9DUkVBVEVgLCBhbmQgc29tZSBjbGVhbnVwIHN0ZXBzLiBUaGlzIHN1Z2dlc3RzIHRoZXkgYXJlIGJlaW5nIHZlcnkgY2FyZWZ1bCBhYm91dCBtZW1vcnkgc2xvdCBjcmVhdGlvbiwgYW5kIGhhbmRsaW5nIGZhaWx1cmVzIGNvcnJlY3RseS4gQW5kIGl0IGxvb2tzIGxpa2UgdGhlIGNhbGxzIHRvIGBrdm1fc2V0X21lbXNsb3RgIGluIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGhhdmUgYmVlbiB1cGRhdGVkIGFzIHdlbGwuCgpUbyBnZXQgYSBoYW5kbGUgb24gdGhpcywgSSYjMzk7bGwgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGNvZGUuIEkmIzM5O2xsIHVzZSBncmVwcGVyIGFuZCByZWFkLWZpbGUgdG8gY2hlY2sgdGhlIGNvZGUgYW5kIEtjb25maWcsIHNwZWNpZmljYWxseSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBkZXBlbmRlbmNpZXMuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGNoYW5nZXMgaW50ZXJhY3Qgd2l0aCB0aGUgYnJvYWRlciBLVk0gbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGFuZCBhbnkgcmVsZXZhbnQgZmVhdHVyZSBmbGFncy4gVGhpcyBsZXZlbCBvZiBjaGFuZ2UgaW4gbWVtb3J5IG1hbmFnZW1lbnQgaXMgYWx3YXlzIHdvcnRoIGNsb3NlIHNjcnV0aW55LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xuLS1cbnZpcnQva3ZtL0tjb25maWctMTA1LVxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxudmlydC9rdm0vS2NvbmZpZy0xMDctICAgICAgIHNlbGVjdCBYQVJSQVlfTVVMVElcbi0tXG52aXJ0L2t2bS9LY29uZmlnPTExMD1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcbnZpcnQva3ZtL0tjb25maWctMTExLSAgICAgICBib29sXG52aXJ0L2t2bS9LY29uZmlnOjExMjogICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL0tjb25maWctMTEzLVxudmlydC9rdm0vS2NvbmZpZz0xMTQ9Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXG52aXJ0L2t2bS9LY29uZmlnLTExNS0gICAgICAgYm9vbFxudmlydC9rdm0vS2NvbmZpZzoxMTY6ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG52aXJ0L2t2bS9LY29uZmlnLTExNy1cbnZpcnQva3ZtL0tjb25maWc9MTE4PWNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxudmlydC9rdm0vS2NvbmZpZy0xMTktICAgICAgIGJvb2xcbnZpcnQva3ZtL0tjb25maWc6MTIwOiAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxudmlydC9rdm0vS2NvbmZpZy0xMjEtXG52aXJ0L2t2bS9LY29uZmlnPTEyMj1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXG52aXJ0L2t2bS9LY29uZmlnLTEyMy0gICAgICAgYm9vbFxudmlydC9rdm0vS2NvbmZpZzoxMjQ6ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4tLVxudmlydC9rdm0vTWFrZWZpbGUua3ZtPTE0PWt2bS0kKENPTkZJR19IQVZFX0tWTV9QRk5DQUNIRSkgJiM0Mzs9ICQoS1ZNKS9wZm5jYWNoZS5vXG52aXJ0L2t2bS9NYWtlZmlsZS5rdm06MTU6a3ZtLSQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkgJiM0Mzs9ICQoS1ZNKS9ndWVzdF9tZW1mZC5vXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaC0xLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjojaWZuZGVmIF9fS1ZNX0dVRVNUX01FTUZEX0hfX1xudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDozOiNkZWZpbmUgX19LVk1fR1VFU1RfTUVNRkRfSF9fXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTQtXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaC02LVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDo3OiNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTgtaW50IGt2bV9nbWVtX2luaXQoc3RydWN0IG1vZHVsZSAqbW9kdWxlKTtcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oPTI4PXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fZ21lbV91bmJpbmQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTMxLX1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MzI6I2VuZGlmIC8qIENPTkZJR19LVk1fR1VFU1RfTUVNRkQgKi9cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtMzMtXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjM0OiNlbmRpZiAvKiBfX0tWTV9HVUVTVF9NRU1GRF9IX18gKi9cbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE1NzQ9c3RhdGljIGludCBjaGVja19tZW1vcnlfcmVnaW9uX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1NzgtXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE1Nzk6XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS1ZNX0dVRVNUX01FTUZEKSlcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU4MC1cdFx0dmFsaWRfZmxhZ3MgfD0gS1ZNX01FTV9HVUVTVF9NRU1GRDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTQ4OTQ9c3RhdGljIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uX2dlbmVyaWMoc3RydWN0IGt2bSAqa3ZtLCBsb25nIGFyZylcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTQ5NTgtI2VuZGlmXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjQ5NTk6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL2t2bV9tYWluLmMtNDk2MC1cdGNhc2UgS1ZNX0NBUF9HVUVTVF9NRU1GRDpcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTUxNzg9c3RhdGljIGxvbmcga3ZtX3ZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM5Ny1cdFx0YnJlYWs7XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjUzOTg6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM5OS1cdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2NjEKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIEtWTSBHdWVzdCBNZW1vcnkgRmlsZSBEZXNjcmlwdG9yIFN1cHBvcnQqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgdGhpcyBzdHJhaWdodCBpbiBteSBoZWFkLiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgS1ZNJiMzOTtzIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIHN1cHBvcnQsIHNwZWNpZmljYWxseSBgS1ZNX0dVRVNUX01FTUZEYC4gQW5kIGJlY2F1c2UgSSYjMzk7bSBmb2N1c2VkIG9uIHg4Ni9hbWQ2NCBwbGF0Zm9ybXMsIGxldCYjMzk7cyBkcmlsbCBkb3duIGFuZCBzZWUgaG93IHRoaXMgaXMgZW5hYmxlZCwgb3IgaWYgaXQgaXMgZXZlbiBlbmFibGVkLCB3aXRoaW4gdGhlIEtjb25maWcgZmlsZXMuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIHF1aWNrbHkganVtcCB0byB0aGUgS2NvbmZpZyBmaWxlcyB0byBjb25maXJtIGl0cyBkZWZpbml0aW9uLCBpdHMgZGVwZW5kZW5jeSAoaWYgYW55KSBvbiBvdGhlciBjb25maWd1cmF0aW9ucyBhbmQgaWYgaXRzIGV2ZW4gZXhwb3NlZCBmb3IgeDg2L2FtZDY0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLVk1fR1VFU1RfTUVNRkQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDt2aXJ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnPTEwMz1jb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcbi0tXG52aXJ0L2t2bS9LY29uZmlnLTEwNS1cbnZpcnQva3ZtL0tjb25maWc6MTA2OmNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjk2OAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHJlYWRpbmcgYW5kIHByb2Nlc3NpbmcgdGhlIHByb3ZpZGVkIHRleHQ6CgoqKktWTSBDb25maWd1cmF0aW9uIERlZXAgRGl2ZSoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgdmlydC9rdm0vS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDEwNi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBLVk0gY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBzdHJ1Y3R1cmVkIGFuZCB3aGF0JiMzOTtzIGJlaW5nIGVuYWJsZWQgb3IgZGlzYWJsZWQgYXQgdGhhdCBwb2ludCBpbiB0aGUgY29kZS4gSSYjMzk7bSBsb29raW5nIGZvciB0aGUgY29yZSBzZXQgb2Ygb3B0aW9uczsgaXQmIzM5O3MgbGlrZWx5IHRoZXkgYXJlIHRoZSBiYXNpY3MgZm9yIHRoZSBtb2R1bGUgdG8gYnVpbGQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA5NTpcdCAgICAgICBib29sXG4gIDk2Olx0XG4gIDk3Olx0Y29uZmlnIEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcbiAgOTg6XHQgICAgICAgYm9vbFxuICA5OTpcdFxuIDEwMDpcdGNvbmZpZyBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXG4gMTAxOlx0ICAgICAgIGJvb2xcbiAxMDI6XHRcbiAxMDM6XHRjb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcbiAxMDQ6XHQgICAgICAgYm9vbFxuIDEwNTpcdFxuIDEwNjpcdGNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcbiAxMDc6XHQgICAgICAgc2VsZWN0IFhBUlJBWV9NVUxUSVxuIDEwODpcdCAgICAgICBib29sXG4gMTA5Olx0XG4gMTEwOlx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9DT05WRVJUXG4gMTExOlx0ICAgICAgIGJvb2xcbiAxMTI6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiAxMTM6XHRcbiAxMTQ6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1JFQ0xBSU1cbiAxMTU6XHQgICAgICAgYm9vbFxuIDExNjpcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxuIDExNzpcdFxuIDExODpcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxuIDExOTpcdCAgICAgICBib29sXG4gMTIwOlx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4gMTIxOlx0XG4gMTIyOlx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9QT1BVTEFURVxuIDEyMzpcdCAgICAgICBib29sXG4gMTI0Olx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzUxNgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBLVk1fR1VFU1RfTUVNRkQgU2VsZWN0aW9uIGluIEtjb25maWcqKgoKQWxyaWdodCwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBmaWd1cmUgb3V0IHRoZSBkZXBlbmRlbmNpZXMgYW5kIHBvdGVudGlhbCBzZWxlY3Rpb24gY29uZGl0aW9ucyBmb3IgYEtWTV9HVUVTVF9NRU1GRGAgd2l0aGluIHRoZSBgYXJjaC94ODYva3ZtL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSBhbmQgd2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgb3IsIGlmIG5vdCBkaXJlY3RseSBlbmFibGVkLCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgaXQgYmVjb21lcyBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBieSB0aGUgdXNlciBvciBidWlsZCBzeXN0ZW0uCgpGaXJzdCwgSSYjMzk7bGwgbmVlZCB0byBvcGVuIHRoYXQgS2NvbmZpZyBmaWxlLiBJIGFscmVhZHkga25vdyB0aGUgcGF0aDogYGFyY2gveDg2L2t2bS9LY29uZmlnYC4gTGV0JiMzOTtzIGFzc3VtZSBJIGhhdmUgYWNjZXNzIHRvIGEgdGVybWluYWwgb3IgY29kZSBlZGl0b3Igd2l0aCBmaWxlIG5hdmlnYXRpb24gY2FwYWJpbGl0aWVzLiBJJiMzOTtsbCBuZWVkIHRvIHF1aWNrbHkgc2tpbSB0aGUgZmlsZSwgbG9va2luZyBmb3IgdGhlIGRlZmluaXRpb24sIG9yIHJlZmVyZW5jZXMgdG8sIGBLVk1fR1VFU1RfTUVNRkRgLiBJJiMzOTtsbCBiZSB3YXRjaGluZyBmb3Iga2V5d29yZHMgbGlrZSAmIzM0O2NvbmZpZyYjMzQ7LCAmIzM0O3NlbGVjdCYjMzQ7LCAmIzM0O2RlcGVuZHMgb24mIzM0OywgJiMzNDtpZiYjMzQ7LCAmIzM0O3RyaXN0YXRlJiMzNDssIGFuZCBwb3RlbnRpYWxseSAmIzM0O2Jvb2wmIzM0OyBvciBvdGhlciBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuCgpJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGEgc2VjdGlvbiB0aGF0IGRlZmluZXMgYEtWTV9HVUVTVF9NRU1GRGAuIEl0IGNvdWxkIGJlIGRpcmVjdGx5IGRlZmluZWQsIG9yIHNlbGVjdGVkIGluZGlyZWN0bHkgdGhyb3VnaCBhIGxhcmdlciBLVk0gZmVhdHVyZS4gVGhlIGNvZGUgc2hvdWxkIHJldmVhbCBpZiBpdCYjMzk7cyBhIG1hbmRhdG9yeSBmZWF0dXJlIChib29sKSwgb3B0aW9uYWwgKHRyaXN0YXRlKSwgYW5kIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG5lZWQgdG8gYmUgZW5hYmxlZCBiZWZvcmUgYEtWTV9HVUVTVF9NRU1GRGAgY2FuIGJlIGVuYWJsZWQuIEkgYW0gcGFydGljdWxhcmx5IGxvb2tpbmcgZm9yIHRoZSBkZXBlbmRlbmN5IGNoYWlucyBhbmQgcmVsYXRpb25zaGlwcy4gQXJlIHRoZXJlIGNlcnRhaW4gQ1BVIGZlYXR1cmVzIG9yIGtlcm5lbCBjb25maWd1cmF0aW9ucyB0aGF0ICptdXN0KiBiZSBwcmVzZW50IGJlZm9yZSBgS1ZNX0dVRVNUX01FTUZEYCBpcyBldmVuIGNvbnNpZGVyZWQ/CgpPbmNlIEkgaGF2ZSBsb2NhdGVkIHRoZSByZWxldmFudCBzZWN0aW9uLCBteSBnb2FsIGlzIHRvIGRpc3RpbGwgdGhlIGxvZ2ljIHRoYXQgZGljdGF0ZXMgd2hlbiBgS1ZNX0dVRVNUX01FTUZEYCBpcyBhdmFpbGFibGUuIFVuZGVyc3RhbmRpbmcgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSB3aWxsIGJlIGtleS4gSSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lLCBpZiBnaXZlbiBhIHNwZWNpZmljIHNldCBvZiBrZXJuZWwgY29uZmlndXJhdGlvbnMsIHdoZXRoZXIgYEtWTV9HVUVTVF9NRU1GRGAgd291bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyB3aWxsIGVpdGhlciBnaXZlIG1lIGNvbmZpZGVuY2UgdGhhdCBteSB1c2UgY2FzZSBpcyBzdXBwb3J0ZWQsIG9yIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBhdGggdG8gZ2V0IHRoZXJlLiBJdCYjMzk7cyB0aW1lIHRvIHJlYWQgc29tZSBjb2RlIGFuZCB1bmNvdmVyIHRoZXNlIGRlcGVuZGVuY2llcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7S1ZNX0dVRVNUX01FTUZEJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC94ODYva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gveDg2L2t2bS9LY29uZmlnPTIwPWNvbmZpZyBLVk1fWDg2XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctNDktXHRzZWxlY3QgS1ZNX1dFUlJPUiBpZiBXRVJST1JcbmFyY2gveDg2L2t2bS9LY29uZmlnOjUwOlx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRCBpZiBYODZfNjRcbmFyY2gveDg2L2t2bS9LY29uZmlnLTUxLVxuLS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmM9NTEzNT12b2lkIGt2bV9hcmNoX2FzeW5jX3BhZ2VfcmVhZHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2FzeW5jX3BmICp3b3JrKVxuLS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTE2NS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmM6NTE2NjojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYy01MTY3LXN0YXRpYyB2b2lkIGt2bV9hc3NlcnRfZ21lbV9pbnZhbGlkYXRlX2xvY2tfaGVsZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90KVxuLS1cbmFyY2gveDg2L2t2bS94ODYuYz0xMDYzND1ib29sIGt2bV9hcmNoX25vX3BvbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLS1cbmFyY2gveDg2L2t2bS94ODYuYy0xMDYzOC1cbmFyY2gveDg2L2t2bS94ODYuYzoxMDYzOTojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxuYXJjaC94ODYva3ZtL3g4Ni5jLTEwNjQwLS8qXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0NTgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIEtWTSBMYW5kc2NhcGUqKgoKT2theSwgc28gd2UmIzM5O3JlIHRhbGtpbmcgYEtWTWAgaGVyZSwgc3BlY2lmaWNhbGx5LiBSaWdodCwgd2VsbCwgdGhlIGNvbnRleHQgaXMgbGlrZWx5IGtlcm5lbC1sZXZlbCB2aXJ0dWFsaXphdGlvbi4gSW1tZWRpYXRlbHksIEkmIzM5O20gdGhpbmtpbmcgb2YgdGhlIHZhcmlvdXMgZmxhdm9ycyDigJMgYEtWTV9JTlRFTGAsIGBLVk1fQU1EYCwgbWF5YmUgZXZlbiBgS1ZNX0dVRVNUX01FTUZEYC4gTGV0JiMzOTtzIGFzc3VtZSB0aGVzZSBhcmUgdGhlIG9wdGlvbnMgd2UgYXJlIGRlYWxpbmcgd2l0aC4KCkZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHNlZSBob3cgYEtWTWAgaXMgY29uZmlndXJlZCwgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgd2hhdCB0aGUgb3ZlcmFsbCBzZXR1cCBsb29rcyBsaWtlIHdpdGhpbiB0aGUgeDg2IGFyY2hpdGVjdHVyZS4gVGhlIGdvLXRvIHBsYWNlIGZvciB0aGF0IGtpbmQgb2YgaW5mb3JtYXRpb24gaXMsIG9mIGNvdXJzZSwgdGhlIGBLY29uZmlnYCBmaWxlLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGp1bXAgaW50byBgYXJjaC94ODYva3ZtL0tjb25maWdgIHRvIGdldCB0aGUgbGF5IG9mIHRoZSBsYW5kLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIEtWTSBmb3IgeDg2IHN5c3RlbXMgYXJlIGRlZmluZWQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBmaW5lciBkZXRhaWxzLCBhbmQgSSBjYW4gc3RhcnQgZnJvbSB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDthcmNoL3g4Ni9rdm0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAgIDI6XHQjXG4gICAzOlx0IyBLVk0gY29uZmlndXJhdGlvblxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRzb3VyY2UgXCYjMzQ7dmlydC9rdm0vS2NvbmZpZ1wmIzM0O1xuICAgNzpcdFxuICAgODpcdG1lbnVjb25maWcgVklSVFVBTElaQVRJT05cbiAgIDk6XHRcdGJvb2wgXCYjMzQ7VmlydHVhbGl6YXRpb25cJiMzNDtcbiAgMTA6XHRcdGRlZmF1bHQgeVxuICAxMTpcdFx0aGVscFxuICAxMjpcdFx0ICBTYXkgWSBoZXJlIHRvIGdldCB0byBzZWUgb3B0aW9ucyBmb3IgdXNpbmcgeW91ciBMaW51eCBob3N0IHRvIHJ1biBvdGhlclxuICAxMzpcdFx0ICBvcGVyYXRpbmcgc3lzdGVtcyBpbnNpZGUgdmlydHVhbCBtYWNoaW5lcyAoZ3Vlc3RzKS5cbiAgMTQ6XHRcdCAgVGhpcyBvcHRpb24gYWxvbmUgZG9lcyBub3QgYWRkIGFueSBrZXJuZWwgY29kZS5cbiAgMTU6XHRcbiAgMTY6XHRcdCAgSWYgeW91IHNheSBOLCBhbGwgb3B0aW9ucyBpbiB0aGlzIHN1Ym1lbnUgd2lsbCBiZSBza2lwcGVkIGFuZCBkaXNhYmxlZC5cbiAgMTc6XHRcbiAgMTg6XHRpZiBWSVJUVUFMSVpBVElPTlxuICAxOTpcdFxuICAyMDpcdGNvbmZpZyBLVk1fWDg2XG4gIDIxOlx0XHRkZWZfdHJpc3RhdGUgS1ZNIGlmIChLVk1fSU5URUwgIT0gbiB8fCBLVk1fQU1EICE9IG4pXG4gIDIyOlx0XHRzZWxlY3QgS1ZNX0NPTU1PTlxuICAyMzpcdFx0c2VsZWN0IEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcbiAgMjQ6XHRcdHNlbGVjdCBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXG4gIDI1Olx0XHRzZWxlY3QgSEFWRV9LVk1fSVJRQ0hJUFxuICAyNjpcdFx0c2VsZWN0IEhBVkVfS1ZNX1BGTkNBQ0hFXG4gIDI3Olx0XHRzZWxlY3QgSEFWRV9LVk1fRElSVFlfUklOR19UU09cbiAgMjg6XHRcdHNlbGVjdCBIQVZFX0tWTV9ESVJUWV9SSU5HX0FDUV9SRUxcbiAgMjk6XHRcdHNlbGVjdCBIQVZFX0tWTV9JUlFfQllQQVNTXG4gIDMwOlx0XHRzZWxlY3QgSEFWRV9LVk1fSVJRX1JPVVRJTkdcbiAgMzE6XHRcdHNlbGVjdCBIQVZFX0tWTV9SRUFET05MWV9NRU1cbiAgMzI6XHRcdHNlbGVjdCBWSE9TVF9UQVNLXG4gIDMzOlx0XHRzZWxlY3QgS1ZNX0FTWU5DX1BGXG4gIDM0Olx0XHRzZWxlY3QgVVNFUl9SRVRVUk5fTk9USUZJRVJcbiAgMzU6XHRcdHNlbGVjdCBLVk1fTU1JT1xuICAzNjpcdFx0c2VsZWN0IFNDSEVEX0lORk9cbiAgMzc6XHRcdHNlbGVjdCBQRVJGX0VWRU5UU1xuICAzODpcdFx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTXG4gIDM5Olx0XHRzZWxlY3QgUEVSRl9HVUVTVF9NRURJQVRFRF9QTVVcbiAgNDA6XHRcdHNlbGVjdCBIQVZFX0tWTV9NU0lcbiAgNDE6XHRcdHNlbGVjdCBIQVZFX0tWTV9DUFVfUkVMQVhfSU5URVJDRVBUXG4gIDQyOlx0XHRzZWxlY3QgSEFWRV9LVk1fTk9fUE9MTFxuICA0MzpcdFx0c2VsZWN0IFZJUlRfWEZFUl9UT19HVUVTVF9XT1JLXG4gIDQ0Olx0XHRzZWxlY3QgS1ZNX0dFTkVSSUNfRElSVFlMT0dfUkVBRF9QUk9URUNUXG4gIDQ1Olx0XHRzZWxlY3QgS1ZNX1ZGSU9cbiAgNDY6XHRcdHNlbGVjdCBIQVZFX0tWTV9QTV9OT1RJRklFUiBpZiBQTVxuICA0NzpcdFx0c2VsZWN0IEtWTV9HRU5FUklDX0hBUkRXQVJFX0VOQUJMSU5HXG4gIDQ4Olx0XHRzZWxlY3QgS1ZNX0dFTkVSSUNfUFJFX0ZBVUxUX01FTU9SWVxuICA0OTpcdFx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXG4gIDUwOlx0XHRzZWxlY3QgS1ZNX0dVRVNUX01FTUZEIGlmIFg4Nl82NFxuICA1MTpcdFxuICA1MjpcdGNvbmZpZyBLVk1cbiAgNTM6XHRcdHRyaXN0YXRlIFwmIzM0O0tlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgKEtWTSkgc3VwcG9ydFwmIzM0O1xuICA1NDpcdFx0ZGVwZW5kcyBvbiBYODZfTE9DQUxfQVBJQ1xuICA1NTpcdFx0aGVscFxuICA1NjpcdFx0ICBTdXBwb3J0IGhvc3RpbmcgZnVsbHkgdmlydHVhbGl6ZWQgZ3Vlc3QgbWFjaGluZXMgdXNpbmcgaGFyZHdhcmVcbiAgNTc6XHRcdCAgdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9ucy4gIFlvdSB3aWxsIG5lZWQgYSBmYWlybHkgcmVjZW50XG4gIDU4Olx0XHQgIHByb2Nlc3NvciBlcXVpcHBlZCB3aXRoIHZpcnR1YWxpemF0aW9uIGV4dGVuc2lvbnMuIFlvdSB3aWxsIGFsc29cbiAgNTk6XHRcdCAgbmVlZCB0byBzZWxlY3Qgb25lIG9yIG1vcmUgb2YgdGhlIHByb2Nlc3NvciBtb2R1bGVzIGJlbG93LlxuICA2MDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjQwCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS1ZNIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgcmVsYXRlZCB0byBLVk0sIHdoaWNoIGlzLCBvZiBjb3Vyc2UsIGZ1bGx5IHZpcnR1YWxpemVkIGFuZCBzdXBwb3J0ZWQgaW4gYm90aCBRRU1VIGFuZCBHb29nbGUgQ29tcHV0ZSBFbmdpbmUsIGFuZCBpdCYjMzk7cyBzb21ldGhpbmcgdGhhdCBzeXprYWxsZXIgbGlrZWx5IHRlc3RzIGV4dGVuc2l2ZWx5LCBwYXJ0aWN1bGFybHkgY29uY2VybmluZyB0aG9zZSBgL2Rldi9rdm1gIGlvY3Rscy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBjaGFuZ2VzLiBUaGUgZmlyc3Qgc3RlcCwgYXMgYWx3YXlzLCBpcyB0byBpZGVudGlmeSB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zLgoKQWxyaWdodCwgaGVyZSB0aGV5IGFyZTogYGt2bV9nbWVtX2JpbmRgIHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AsIGBrdm1fc2V0X21lbXNsb3RgIGluIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCwgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCBhbHNvIGluIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gTXkgbmV4dCBtb3ZlPyBJIG5lZWQgdGhlIGZ1bGwgcGljdHVyZS4gSSYjMzk7bSBnb2luZyB0byBwdWxsIHVwIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgemVybyBpbiBvbiB0aGUgYXJlYSBhcm91bmQgbGluZXMgNjEyLTY4MC4gVGhhdCYjMzk7bGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIFdpdGggdGhhdCBjb250ZXh0LCBJJiMzOTtsbCBiZSBhYmxlIHRvIHF1aWNrbHkgdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBwYXRjaCBhbmQgd2hlcmUgdG8gc3RhcnQgbXkgZGV0YWlsZWQgZXhhbWluYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjA1Olx0XG4gNjA2Olx0aW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIDYwNzpcdFx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldClcbiA2MDg6XHR7XG4gNjA5Olx0XHR1b2ZmX3Qgc2l6ZSA9IHNsb3QtXHUwMDNlbnBhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuIDYxMDpcdFx0dW5zaWduZWQgbG9uZyBzdGFydCwgZW5kO1xuIDYxMTpcdFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcbiA2MTI6XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gNjEzOlx0XHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiA2MTQ6XHRcdGludCByID0gLUVJTlZBTDtcbiA2MTU6XHRcdHZvaWQgKnhhcjtcbiA2MTY6XHRcbiA2MTc6XHRcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcbiA2MTg6XHRcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVx1MDAzZWdtZW0ucGdvZmYpKTtcbiA2MTk6XHRcbiA2MjA6XHRcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcbiA2MjE6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjIyOlx0XG4gNjIzOlx0XHRmaWxlID0gZmdldChmZCk7XG4gNjI0Olx0XHRpZiAoIWZpbGUpXG4gNjI1Olx0XHRcdHJldHVybiAtRUJBREY7XG4gNjI2Olx0XG4gNjI3Olx0XHRpZiAoZmlsZS1cdTAwM2VmX29wICE9IFx1MDAyNmt2bV9nbWVtX2ZvcHMpXG4gNjI4Olx0XHRcdGdvdG8gZXJyO1xuIDYyOTpcdFxuIDYzMDpcdFx0ZiA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDYzMTpcdFx0aWYgKGYtXHUwMDNla3ZtICE9IGt2bSlcbiA2MzI6XHRcdFx0Z290byBlcnI7XG4gNjMzOlx0XG4gNjM0Olx0XHRpbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XG4gNjM1Olx0XG4gNjM2Olx0XHRpZiAoIVBBR0VfQUxJR05FRChvZmZzZXQpIHx8IG9mZnNldCAmIzQzOyBzaXplIFx1MDAzZSBpX3NpemVfcmVhZChpbm9kZSkpXG4gNjM3Olx0XHRcdGdvdG8gZXJyO1xuIDYzODpcdFxuIDYzOTpcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX2xvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NDA6XHRcbiA2NDE6XHRcdHN0YXJ0ID0gb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDY0MjpcdFx0ZW5kID0gc3RhcnQgJiM0Mzsgc2xvdC1cdTAwM2VucGFnZXM7XG4gNjQzOlx0XG4gNjQ0Olx0XHRpZiAoIXhhX2VtcHR5KFx1MDAyNmYtXHUwMDNlYmluZGluZ3MpIFx1MDAyNlx1MDAyNlxuIDY0NTpcdFx0ICAgIHhhX2ZpbmQoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgXHUwMDI2c3RhcnQsIGVuZCAtIDEsIFhBX1BSRVNFTlQpKSB7XG4gNjQ2Olx0XHRcdHIgPSAtRUVYSVNUO1xuIDY0NzpcdFx0XHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjQ4Olx0XHRcdGdvdG8gZXJyO1xuIDY0OTpcdFx0fVxuIDY1MDpcdFxuIDY1MTpcdFx0LypcbiA2NTI6XHRcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbiA2NTM6XHRcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XG4gNjU0Olx0XHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cbiA2NTU6XHRcdCAqL1xuIDY1NjpcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBmaWxlO1xuIDY1NzpcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gc3RhcnQ7XG4gNjU4Olx0XHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXG4gNjU5Olx0XHRcdHNsb3QtXHUwMDNlZmxhZ3MgfD0gS1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuIDY2MDpcdFxuIDY2MTpcdFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xuIDY2MjpcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY2MzpcdFxuIDY2NDpcdFx0LypcbiA2NjU6XHRcdCAqIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSwgZXZlbiBvbiBzdWNjZXNzLiAgVGhlIGZpbGUgcGlucyBLVk0sXG4gNjY2Olx0XHQgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcbiA2Njc6XHRcdCAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLlxuIDY2ODpcdFx0ICovXG4gNjY5Olx0XHRyID0geGFfaXNfZXJyKHhhcikgPyB4YV9lcnIoeGFyKSA6IDA7XG4gNjcwOlx0XHRpZiAocikge1xuIDY3MTpcdFx0XHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7XG4gNjcyOlx0XHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gTlVMTDtcbiA2NzM6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbiA2NzQ6XHRcdFx0c2xvdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gNjc1Olx0XHR9XG4gNjc2Olx0ZXJyOlxuIDY3NzpcdFx0ZnB1dChmaWxlKTtcbiA2Nzg6XHRcdHJldHVybiByO1xuIDY3OTpcdH1cbiA2ODA6XHRcbiA2ODE6XHRzdGF0aWMgdm9pZCBfX2t2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBzdHJ1Y3QgZ21lbV9maWxlICpmKVxuIDY4MjpcdHtcbiA2ODM6XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBzbG90LVx1MDAzZWdtZW0ucGdvZmY7XG4gNjg0Olx0XHR1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICYjNDM7IHNsb3QtXHUwMDNlbnBhZ2VzO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTM4MwoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKioKCk9rYXksIHNvIHdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgbWVtb3J5IHJlZ2lvbnMgYXJlIGJlaW5nIHNldCB1cCBhbmQgbWFuYWdlZCB3aXRoaW4gS1ZNLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byB6ZXJvIGluIG9uIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCBiZWNhdXNlIHRoYXQmIzM5O3MgdXN1YWxseSB0aGUgaGVhcnQgb2YgdGhlIGNvcmUgS1ZNIGxvZ2ljLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIGFyb3VuZCBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZ29pbmcgdG8gYmUgY3JpdGljYWwgZm9yIHRyYWNraW5nIGhvdyBtZW1vcnkgaXMgYWxsb2NhdGVkLCBtYXBwZWQsIGFuZCBwb3RlbnRpYWxseSByZW1hcHBlZCB3aXRoaW4gdGhlIGd1ZXN0JiMzOTtzIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4gSSYjMzk7bGwgbmVlZCB0byBzZWUgaG93IHRoZSBob3N0IG1hcHMgdGhlIGd1ZXN0JiMzOTtzIHBoeXNpY2FsIG1lbW9yeSwgYW5kIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBoeXBlcnZpc29yJiMzOTtzIHZpZXcgYW5kIHRoZSBoYXJkd2FyZS4gTGV0JiMzOTtzIHNlZSBob3cgdGhlc2UgYXJlIGNhbGxlZCwgd2hhdCBkYXRhIHN0cnVjdHVyZXMgdGhleSBtYW5pcHVsYXRlLCBhbmQgd2hhdCBpbXBsaWNhdGlvbnMgdGhvc2UgbWFuaXB1bGF0aW9ucyBoYXZlIG9uIHRoZSBvdmVyYWxsIG1lbW9yeSBvcmdhbml6YXRpb24uIEhvcGVmdWxseSwgbG9va2luZyBhdCB0aGVzZSBmdW5jdGlvbnMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBoYW5kbGVkIGF0IHRoZSBLVk0gbGV2ZWwsIGVzcGVjaWFsbHkgd2hlbiBjb25zaWRlcmluZyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBob3RwbHVnZ2luZyBzY2VuYXJpb3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkyMDpcdFx0ICpcbjE5MjE6XHRcdCAqIE1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgb24gYSB0ZW1wb3JhcnksIHVucmVhY2hhYmxlIHNsb3QuICBUaGUgb2xkXG4xOTIyOlx0XHQgKiBzbG90IG5lZWRzIHRvIGJlIHByZXNlcnZlZCBpbiBjYXNlIGEgbGF0ZXIgc3RlcCBmYWlscyBhbmQgdGhlXG4xOTIzOlx0XHQgKiBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQuXG4xOTI0Olx0XHQgKi9cbjE5MjU6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5MjY6XHRcdFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbjE5Mjc6XHRcdFx0aWYgKCFpbnZhbGlkX3Nsb3QpIHtcbjE5Mjg6XHRcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTI5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4xOTMwOlx0XHRcdH1cbjE5MzE6XHRcdFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcbjE5MzI6XHRcdH1cbjE5MzM6XHRcbjE5MzQ6XHRcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTM1Olx0XHRpZiAocilcbjE5MzY6XHRcdFx0Z290byBlcnI7XG4xOTM3Olx0XG4xOTM4Olx0XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbjE5Mzk6XHRcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4xOTQwOlx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDE6XHRcbjE5NDI6XHRcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbjE5NDM6XHRcdFx0aWYgKHIpXG4xOTQ0Olx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDU6XHRcdH1cbjE5NDY6XHRcbjE5NDc6XHRcdC8qXG4xOTQ4Olx0XHQgKiBGb3IgREVMRVRFIGFuZCBNT1ZFLCB0aGUgd29ya2luZyBzbG90IGlzIG5vdyBhY3RpdmUgYXMgdGhlIElOVkFMSURcbjE5NDk6XHRcdCAqIHZlcnNpb24gb2YgdGhlIG9sZCBzbG90LiAgTU9WRSBpcyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBhcyBpdCByZXVzZXNcbjE5NTA6XHRcdCAqIHRoZSBvbGQgc2xvdCBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9sZCBzbG90IChpbiB3b3JraW5nX3Nsb3QpLlxuMTk1MTpcdFx0ICogRm9yIENSRUFURSwgdGhlcmUgaXMgbm8gb2xkIHNsb3QuICBGb3IgREVMRVRFIGFuZCBGTEFHU19PTkxZLCB0aGVcbjE5NTI6XHRcdCAqIG9sZCBzbG90IGlzIGRldGFjaGVkIGJ1dCBvdGhlcndpc2UgcHJlc2VydmVkLlxuMTk1MzpcdFx0ICovXG4xOTU0Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUpXG4xOTU1Olx0XHRcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XG4xOTU2Olx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcbjE5NTc6XHRcdFx0a3ZtX2RlbGV0ZV9tZW1zbG90KGt2bSwgb2xkLCBpbnZhbGlkX3Nsb3QpO1xuMTk1ODpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxuMTk1OTpcdFx0XHRrdm1fbW92ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGludmFsaWRfc2xvdCk7XG4xOTYwOlx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0ZMQUdTX09OTFkpXG4xOTYxOlx0XHRcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcbjE5NjI6XHRcdGVsc2VcbjE5NjM6XHRcdFx0QlVHKCk7XG4xOTY0Olx0XG4xOTY1Olx0XHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cbjE5NjY6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXG4xOTY3Olx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTY4Olx0XG4xOTY5Olx0XHQvKlxuMTk3MDpcdFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cdTAwM2VhcmNoLCBjaGFuZ2VzIGFmdGVyIGRyb3BwaW5nIHNsb3RzX2FyY2hfbG9ja1xuMTk3MTpcdFx0ICogd2lsbCBkaXJlY3RseSBoaXQgdGhlIGZpbmFsLCBhY3RpdmUgbWVtc2xvdC4gIEFyY2hpdGVjdHVyZXMgYXJlXG4xOTcyOlx0XHQgKiByZXNwb25zaWJsZSBmb3Iga25vd2luZyB0aGF0IG5ldy1cdTAwM2VhcmNoIG1heSBiZSBzdGFsZS5cbjE5NzM6XHRcdCAqL1xuMTk3NDpcdFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTc1Olx0XG4xOTc2Olx0XHRyZXR1cm4gMDtcbjE5Nzc6XHRcbjE5Nzg6XHRlcnJfYmluZDpcbjE5Nzk6XHRcdGlmIChuZXcpIHtcbjE5ODA6XHRcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbjE5ODE6XHRcbjE5ODI6XHRcdFx0aWYgKG5ldy1cdTAwM2VkaXJ0eV9iaXRtYXAgXHUwMDI2XHUwMDI2ICghb2xkIHx8ICFvbGQtXHUwMDNlZGlydHlfYml0bWFwKSlcbjE5ODM6XHRcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbjE5ODQ6XHRcdH1cbjE5ODU6XHRlcnI6XG4xOTg2Olx0XHQvKlxuMTk4NzpcdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xuMTk4ODpcdFx0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXG4xOTg5Olx0XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4xOTkwOlx0XHQgKi9cbjE5OTE6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5OTI6XHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4xOTkzOlx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTk0Olx0XHR9IGVsc2Uge1xuMTk5NTpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTk2Olx0XHR9XG4xOTk3Olx0XHRyZXR1cm4gcjtcbjE5OTg6XHR9XG4xOTk5Olx0XG4yMDAwOlx0c3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLFxuMjAwMTpcdFx0XHRcdFx0ICAgICAgZ2ZuX3Qgc3RhcnQsIGdmbl90IGVuZClcbjIwMDI6XHR7XG4yMDAzOlx0XHRzdHJ1Y3Qga3ZtX21lbXNsb3RfaXRlciBpdGVyO1xuMjAwNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzA2NwoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIERlZXBlciBpbnRvIEtWTSBNZW1vcnkgTWFuYWdlbWVudCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgYmVlbiBsb29raW5nIGF0IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpbiBLVk0sIGFuZCBJIG5lZWQgdG8gem9vbSBpbiBvbiBhIHNwZWNpZmljIGFyZWEuIEkmIzM5O20gdGhpbmtpbmcgd2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIGRyaWxsIGRvd24gaW50byB0aGUgY29kZSBhcm91bmQgbGluZXMgMjA1OCB0byAyMTMwLiBUaGlzIHNlY3Rpb24gbGlrZWx5IGhhbmRsZXMgYSBjcml0aWNhbCBhc3BlY3Qgb2YgbWVtb3J5IGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSB2aXJ0dWFsIG1hY2hpbmUgZW52aXJvbm1lbnQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCYjMzk7cyBpbnRlcmFjdGluZyB3aXRoIHRoZSBob3N0JiMzOTtzIHBoeXNpY2FsIG1lbW9yeSBhbmQgaG93IGl0JiMzOTtzIHNldHRpbmcgdXAgdGhlIG1hcHBpbmdzIGZvciBndWVzdCBhY2Nlc3MuIFRoZXJlIGNvdWxkIGJlIHNvbWUgc3VidGxlIGltcGxpY2F0aW9ucyBpbiB0aGF0IHJhbmdlIHJlZ2FyZGluZyBtZW1vcnkgYXNzaWdubWVudCwgcGVybWlzc2lvbnMsIG9yIGV2ZW4gcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyBpZiBub3QgcHJvcGVybHkgaGFuZGxlZC4gSSBzaG91bGQgY2hlY2sgdGhhdCByZWdpb24gc3BlY2lmaWNhbGx5IHRvIGV2YWx1YXRlIHBvc3NpYmxlIGlzc3VlcyByZWxhdGluZyB0byBtZW1vcnkgbWFuYWdlbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9rdm1fbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjA1OCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMDU4Olx0XHQgKiBsb2dnaW5nLCBhbmQgc28gYXJlIGV4ZW1wdC5cbjIwNTk6XHRcdCAqL1xuMjA2MDpcdFx0aWYgKGlkIFx1MDAzYyBLVk1fVVNFUl9NRU1fU0xPVFMgXHUwMDI2XHUwMDI2XG4yMDYxOlx0XHQgICAgKG1lbS1cdTAwM2VtZW1vcnlfc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDNlIEtWTV9NRU1fTUFYX05SX1BBR0VTKVxuMjA2MjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIwNjM6XHRcbjIwNjQ6XHRcdHNsb3RzID0gX19rdm1fbWVtc2xvdHMoa3ZtLCBhc19pZCk7XG4yMDY1Olx0XG4yMDY2Olx0XHQvKlxuMjA2NzpcdFx0ICogTm90ZSwgdGhlIG9sZCBtZW1zbG90IChhbmQgdGhlIHBvaW50ZXIgaXRzZWxmISkgbWF5IGJlIGludmFsaWRhdGVkXG4yMDY4Olx0XHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxuMjA2OTpcdFx0ICovXG4yMDcwOlx0XHRvbGQgPSBpZF90b19tZW1zbG90KHNsb3RzLCBpZCk7XG4yMDcxOlx0XG4yMDcyOlx0XHRpZiAoIW1lbS1cdTAwM2VtZW1vcnlfc2l6ZSkge1xuMjA3MzpcdFx0XHRpZiAoIW9sZCB8fCAhb2xkLVx1MDAzZW5wYWdlcylcbjIwNzQ6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIwNzU6XHRcbjIwNzY6XHRcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4yMDc3Olx0XHRcdFx0cmV0dXJuIC1FSU87XG4yMDc4Olx0XG4yMDc5Olx0XHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcbjIwODA6XHRcdH1cbjIwODE6XHRcbjIwODI6XHRcdGJhc2VfZ2ZuID0gKG1lbS1cdTAwM2VndWVzdF9waHlzX2FkZHIgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuMjA4MzpcdFx0bnBhZ2VzID0gKG1lbS1cdTAwM2VtZW1vcnlfc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4yMDg0Olx0XG4yMDg1Olx0XHRpZiAoIW9sZCB8fCAhb2xkLVx1MDAzZW5wYWdlcykge1xuMjA4NjpcdFx0XHRjaGFuZ2UgPSBLVk1fTVJfQ1JFQVRFO1xuMjA4NzpcdFxuMjA4ODpcdFx0XHQvKlxuMjA4OTpcdFx0XHQgKiBUbyBzaW1wbGlmeSBLVk0gaW50ZXJuYWxzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFjcm9zc1xuMjA5MDpcdFx0XHQgKiBhbGwgbWVtc2xvdHMgbXVzdCBmaXQgaW4gYW4gdW5zaWduZWQgbG9uZy5cbjIwOTE6XHRcdFx0ICovXG4yMDkyOlx0XHRcdGlmICgoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgJiM0MzsgbnBhZ2VzKSBcdTAwM2Mga3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMpXG4yMDkzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk0Olx0XHR9IGVsc2UgeyAvKiBNb2RpZnkgYW4gZXhpc3Rpbmcgc2xvdC4gKi9cbjIwOTU6XHRcdFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXG4yMDk2Olx0XHRcdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4yMDk3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk4Olx0XHRcdGlmICgobWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyICE9IG9sZC1cdTAwM2V1c2Vyc3BhY2VfYWRkcikgfHxcbjIwOTk6XHRcdFx0ICAgIChucGFnZXMgIT0gb2xkLVx1MDAzZW5wYWdlcykgfHxcbjIxMDA6XHRcdFx0ICAgICgobWVtLVx1MDAzZWZsYWdzIF4gb2xkLVx1MDAzZWZsYWdzKSBcdTAwMjYgKEtWTV9NRU1fUkVBRE9OTFkgfCBLVk1fTUVNX0dVRVNUX01FTUZEKSkpXG4yMTAxOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMTAyOlx0XG4yMTAzOlx0XHRcdGlmIChiYXNlX2dmbiAhPSBvbGQtXHUwMDNlYmFzZV9nZm4pXG4yMTA0Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX01PVkU7XG4yMTA1Olx0XHRcdGVsc2UgaWYgKG1lbS1cdTAwM2VmbGFncyAhPSBvbGQtXHUwMDNlZmxhZ3MpXG4yMTA2Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX0ZMQUdTX09OTFk7XG4yMTA3Olx0XHRcdGVsc2UgLyogTm90aGluZyB0byBjaGFuZ2UuICovXG4yMTA4Olx0XHRcdFx0cmV0dXJuIDA7XG4yMTA5Olx0XHR9XG4yMTEwOlx0XG4yMTExOlx0XHRpZiAoKGNoYW5nZSA9PSBLVk1fTVJfQ1JFQVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkgXHUwMDI2XHUwMDI2XG4yMTEyOlx0XHQgICAga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzbG90cywgaWQsIGJhc2VfZ2ZuLCBiYXNlX2dmbiAmIzQzOyBucGFnZXMpKVxuMjExMzpcdFx0XHRyZXR1cm4gLUVFWElTVDtcbjIxMTQ6XHRcbjIxMTU6XHRcdC8qIEFsbG9jYXRlIGEgc2xvdCB0aGF0IHdpbGwgcGVyc2lzdCBpbiB0aGUgbWVtc2xvdC4gKi9cbjIxMTY6XHRcdG5ldyA9IGt6YWxsb2Nfb2JqKCpuZXcsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4yMTE3Olx0XHRpZiAoIW5ldylcbjIxMTg6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4yMTE5Olx0XG4yMTIwOlx0XHRuZXctXHUwMDNlYXNfaWQgPSBhc19pZDtcbjIxMjE6XHRcdG5ldy1cdTAwM2VpZCA9IGlkO1xuMjEyMjpcdFx0bmV3LVx1MDAzZWJhc2VfZ2ZuID0gYmFzZV9nZm47XG4yMTIzOlx0XHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuMjEyNDpcdFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuMjEyNTpcdFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuMjEyNjpcdFxuMjEyNzpcdFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG4yMTI4Olx0XHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4yMTI5Olx0XHRpZiAocilcbjIxMzA6XHRcdFx0Z290byBvdXQ7XG4yMTMxOlx0XG4yMTMyOlx0XHRyZXR1cm4gMDtcbjIxMzM6XHRcbjIxMzQ6XHRvdXQ6XG4yMTM1Olx0XHRrZnJlZShuZXcpO1xuMjEzNjpcdFx0cmV0dXJuIHI7XG4yMTM3Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDU4MgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDU3MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLVk0gTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpc3NlY3QgdGhpcyBwYXRjaC4gSXQgc2VlbXMgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBhIGNvcmUgS1ZNIG1lbW9yeSB2aXJ0dWFsaXphdGlvbiBlbmhhbmNlbWVudCwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gYGd1ZXN0X21lbWZkYCBhbmQgbWVtb3J5IHNsb3RzLiBUaGlzIGltcGFjdHMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50L3ZpcnR1YWxpemF0aW9uIGxvZ2ljIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggdGhlIGAvZGV2L2t2bWAgaW50ZXJmYWNlIHZpYSBgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yYCBhbmQgYEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OYCBpb2N0bHMuCgpUaGUgZmlyc3QgZmlsZSwgYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBoYXMgYSBuZXcgY2hlY2sgdXNpbmcgYFdBUk5fT05fT05DRWAgZm9yIGEgc3BlY2lmaWMgbWVtb3J5IHNsb3QgZmxhZyAoYEtWTV9NRU1TTE9UX0dNRU1fT05MWWApLiBJdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBoYXJkZW5pbmcgZXJyb3IgaGFuZGxpbmcgaW4gYHhhX3N0b3JlX3JhbmdlYCB3aGVuIHRoaW5ncyBnbyB3cm9uZyBhbmQgcmVzZXR0aW5nIHNvbWUgc2xvdCBkYXRhIGlmIHRoZSB3cml0ZSBmYWlscy4gVGhpcyBjbGVhbi11cCBpcyBpbXBvcnRhbnQuCgpUaGVuLCBgdmlydC9rdm0va3ZtX21haW4uY2AgcmVvcmRlcnMgdGhpbmdzLCBtb3ZpbmcgdGhlIGBrdm1fZ21lbV9iaW5kKClgIGNhbGwgKmFmdGVyKiBga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbigpYCB3aXRoaW4gYGt2bV9zZXRfbWVtc2xvdCgpYC4gVGhlcmUgaXMgYSBgV0FSTl9PTl9PTkNFYCBhc3NlcnRpb24gb24gdGhlIGBjaGFuZ2VgIHZhbHVlIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IG9ubHkgYEtWTV9NUl9DUkVBVEVgIGlzIHByb2Nlc3NlZCAodGhlIHBhdGNoIGFwcGVhcnMgdG8gYmUgZGVhbGluZyB3aXRoIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVtb3J5IHJlZ2lvbikuIEVycm9yIHVud2luZGluZyBpbiB0aGlzIHNlY3Rpb24gaXMgbm93IGhhbmRsZWQgYnkgdGhlIGludHJvZHVjdGlvbiBvZiBhbiBgZXJyX2JpbmRgIGxhYmVsLCBjYWxsaW5nIGBrdm1fYXJjaF9mcmVlX21lbXNsb3RgIGFuZCBga3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwYC4gVGhpcyBpcyBnb29kLCBlbnN1cmluZyBwcm9wZXIgcmVzb3VyY2UgcmVsZWFzZSBvbiBmYWlsdXJlLgoKR2l2ZW4gdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UsIHdpdGggdGhlIG5ldyBgV0FSTl9PTl9PTkNFYCBhc3NlcnRpb25zIGFuZCB0aGUgbW9kaWZpY2F0aW9ucyB0byBiaW5kaW5nIHNlcXVlbmNpbmcgYW5kIGVycm9yIGhhbmRsaW5nLCB0aGlzIGlzIGRlZmluaXRlbHkgc29tZXRoaW5nIHRvIGZ1enouCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIFRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBzZWVtIHRvIGJlIGBLVk1gLCBgS1ZNX0dVRVNUX01FTUZEYCwgYEtWTV9JTlRFTGAsIGFuZCBgS1ZNX0FNRGAuIEluIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AsIGBLVk1gIHdpbGwgc2VsZWN0IGBLVk1fR1VFU1RfTUVNRkRgIGlmIGl0IGlzIGFuIGBYODZfNjRgIG1hY2hpbmUuIFdlIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZmlsZXMgaW4gYHZpcnQva3ZtL0tjb25maWdgIGFuZCBgYXJjaC94ODYva3ZtL0tjb25maWdgIHRvIGNvbmZpcm0gdGhlc2UgZGVwZW5kZW5jaWVzIGFuZCB0aGUgY29uZmlndXJhdGlvbnMuIGBLVk1gIGlzIHRyaXN0YXRlL2Jvb2wuIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGJvb2xlYW4gKHNlbGVjdGVkIGJ5IGBLVk1fWDg2IGlmIFg4Nl82NGApLiBMZXQmIzM5O3MgZW5zdXJlIHRoYXQgYENPTkZJR19LVk1gIGFuZCBgQ09ORklHX0tWTV9HVUVTVF9NRU1GRGAgYXJlIHNldCBhcHByb3ByaWF0ZWx5LCBhbmQgY2hlY2sgZm9yIGFueSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWlnaHQgYmUgbmVlZGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgS1ZNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC94ODYva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gveDg2L2t2bS9LY29uZmlnPTE4PWlmIFZJUlRVQUxJWkFUSU9OXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xOS1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjIwOmNvbmZpZyBLVk1fWDg2XG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMS1cdGRlZl90cmlzdGF0ZSBLVk0gaWYgKEtWTV9JTlRFTCAhPSBuIHx8IEtWTV9BTUQgIT0gbilcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjUyOmNvbmZpZyBLVk1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTUzLVx0dHJpc3RhdGUgXCYjMzQ7S2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSAoS1ZNKSBzdXBwb3J0XCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctNjgtXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo2OTpjb25maWcgS1ZNX1dFUlJPUlxuYXJjaC94ODYva3ZtL0tjb25maWctNzAtXHRib29sIFwmIzM0O0NvbXBpbGUgS1ZNIHdpdGggLVdlcnJvclwmIzM0O1xuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTgyLVxuYXJjaC94ODYva3ZtL0tjb25maWc6ODM6Y29uZmlnIEtWTV9TV19QUk9URUNURURfVk1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTg0LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCBmb3IgS1ZNIHNvZnR3YXJlLXByb3RlY3RlZCBWTXNcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy05NS1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjk2OmNvbmZpZyBLVk1fSU5URUxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTk3LVx0dHJpc3RhdGUgXCYjMzQ7S1ZNIGZvciBJbnRlbCAoYW5kIGNvbXBhdGlibGUpIHByb2Nlc3NvcnMgc3VwcG9ydFwmIzM0O1xuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTEwNi1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjEwNzpjb25maWcgS1ZNX0lOVEVMX1BST1ZFX1ZFXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xMDgtICAgICAgICBib29sIFwmIzM0O0NoZWNrIHRoYXQgZ3Vlc3RzIGRvIG5vdCByZWNlaXZlICNWRSBleGNlcHRpb25zXCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWc9MTIyPWNvbmZpZyBYODZfU0dYX0tWTVxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTEzMy1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjEzNDpjb25maWcgS1ZNX0lOVEVMX1REWFxuYXJjaC94ODYva3ZtL0tjb25maWctMTM1LVx0Ym9vbCBcJiMzNDtJbnRlbCBUcnVzdCBEb21haW4gRXh0ZW5zaW9ucyAoVERYKSBzdXBwb3J0XCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctMTQ1LVxuYXJjaC94ODYva3ZtL0tjb25maWc6MTQ2OmNvbmZpZyBLVk1fQU1EXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNDctXHR0cmlzdGF0ZSBcJiMzNDtLVk0gZm9yIEFNRCBwcm9jZXNzb3JzIHN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNTUtXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxNTY6Y29uZmlnIEtWTV9BTURfU0VWXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNTctXHRib29sIFwmIzM0O0FNRCBTZWN1cmUgRW5jcnlwdGVkIFZpcnR1YWxpemF0aW9uIChTRVYpIHN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNzItXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxNzM6Y29uZmlnIEtWTV9JT0FQSUNcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE3NC1cdGJvb2wgXCYjMzQ7SS9PIEFQSUMsIFBJQywgYW5kIFBJVCBlbXVsYXRpb25cJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xODItXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxODM6Y29uZmlnIEtWTV9TTU1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTE4NC1cdGJvb2wgXCYjMzQ7U3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBlbXVsYXRpb25cJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xOTMtXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxOTQ6Y29uZmlnIEtWTV9IWVBFUlZcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE5NS1cdGJvb2wgXCYjMzQ7U3VwcG9ydCBmb3IgTWljcm9zb2Z0IEh5cGVyLVYgZW11bGF0aW9uXCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctMjA3LVxuYXJjaC94ODYva3ZtL0tjb25maWc6MjA4OmNvbmZpZyBLVk1fWEVOXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMDktXHRib29sIFwmIzM0O1N1cHBvcnQgZm9yIFhlbiBoeXBlcmNhbGwgaW50ZXJmYWNlXCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctMjE2LVxuYXJjaC94ODYva3ZtL0tjb25maWc6MjE3OmNvbmZpZyBLVk1fUFJPVkVfTU1VXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMTgtXHRib29sIFwmIzM0O1Byb3ZlIEtWTSBNTVUgY29ycmVjdG5lc3NcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMjktXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoyMzA6Y29uZmlnIEtWTV9FWFRFUk5BTF9XUklURV9UUkFDS0lOR1xuYXJjaC94ODYva3ZtL0tjb25maWctMjMxLVx0Ym9vbFxuYXJjaC94ODYva3ZtL0tjb25maWctMjMyLVxuYXJjaC94ODYva3ZtL0tjb25maWc6MjMzOmNvbmZpZyBLVk1fTUFYX05SX1ZDUFVTXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMzQtXHRpbnQgXCYjMzQ7TWF4aW11bSBudW1iZXIgb2YgdkNQVXMgcGVyIEtWTSBndWVzdFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjk5NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBBbmFseXNpcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNvbmZpZ3VyYXRpb24uIEl0IGxvb2tzIGxpa2UgYEtWTV9HVUVTVF9NRU1GRGAgaXMgZW5hYmxlZCB3aGVuIHRhcmdldGluZyB4ODZfNjQgYXJjaGl0ZWN0dXJlIGFuZCBLVk0gaXMgYWN0aXZlLCBtZWFuaW5nIGVpdGhlciBgS1ZNYCwgYEtWTV9JTlRFTGAsIG9yIGBLVk1fQU1EYCBpcyBzZWxlY3RlZC4gU28sIHRoZSBiYXNlIGlzIHNldCBmb3IgbWVtb3J5IGZpbGUgZGVzY3JpcHRvciBmdW5jdGlvbmFsaXR5IHdpdGhpbiBLVk0uCgpOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgc3BlY2lmaWNzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zOiBga3ZtX2dtZW1fYmluZGAsIGBrdm1fc2V0X21lbXNsb3RgLCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBkZXRlcm1pbmUgaWYgdGhlc2UgYXJlIGNvcmUsIHdpZGVseS11c2VkIGZ1bmN0aW9ucyBvciBpZiB0aGV5JiMzOTtyZSBzcGVjaWZpYyBlbnRyeSBwb2ludHMgdG8gdGhlIGd1ZXN0IG1lbWZkIGxvZ2ljLgoKSXQgbG9va3MgbGlrZSBga3ZtX2dtZW1fYmluZGAgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgYmluZHMgYSBndWVzdCBtZW1mZCBmaWxlIHRvIGEgbWVtb3J5IHNsb3QsIGl0IGlzIHZlcnkgc3BlY2lmaWMuIGBrdm1fc2V0X21lbXNsb3RgIG1hbmFnZXMgbWVtc2xvdCBzdGF0ZSBjaGFuZ2VzIHdpdGhpbiBLVk0uIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGlzIG91ciBlbnRyeSBwb2ludCBmb3IgYEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OYCBjYWxscy4KCkZpbmFsbHksIEkgbmVlZCB0byBrbm93IHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3NlZCBhbmQgdXNlZC4gSSBzZWUgdGhhdCBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYXJlIGRlZmluZWQgYXMgc3RhdGljIHdpdGhpbiBgdmlydC9rdm0va3ZtX21haW4uY2AsIHdoaWxlIGBrdm1fZ21lbV9iaW5kYCBpcyBub24tc3RhdGljLiBUaGlzIGxpa2VseSBtZWFucyBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYXJlIG5vdCBkaXJlY3RseSBleHBvcnRlZCwgYW5kIGBrdm1fZ21lbV9iaW5kYCBpcy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgY2FsbCBjaGFpbiB0byBlbnN1cmUgbm8gb3RoZXIgY3J1Y2lhbCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZXNlIGFyZSBhY3R1YWxseSBiZWluZyBjYWxsZWQgZnJvbSwgc3VjaCBhcyBpZiBga3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uYCBjYWxscyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3ZtX3NldF9tZW1vcnlfcmVnaW9uJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dmlydC9rdm0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYz0yMDAwPXN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwMTItXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIwMTM6c3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxudmlydC9rdm0va3ZtX21haW4uYy0yMDE0LVx0XHRcdFx0IGNvbnN0IHN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24yICptZW0pXG4tLVxudmlydC9rdm0va3ZtX21haW4uYz0yMTM5PWludCBrdm1fc2V0X2ludGVybmFsX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE0Ny1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MjE0ODpcdHJldHVybiBrdm1fc2V0X21lbW9yeV9yZWdpb24oa3ZtLCBtZW0pO1xudmlydC9rdm0va3ZtX21haW4uYy0yMTQ5LX1cbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIxNTI9c3RhdGljIGludCBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE1OC1cdGd1YXJkKG11dGV4KShcdTAwMjZrdm0tXHUwMDNlc2xvdHNfbG9jayk7XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIxNTk6XHRyZXR1cm4ga3ZtX3NldF9tZW1vcnlfcmVnaW9uKGt2bSwgbWVtKTtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE2MC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MjYzCgkJCQkJCQlvdXRwdXQ6IDE4NwoJCQkJCQkJdGhvdWdodHM6IDMxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLVk0gTWVtb3J5IE1hbmFnZW1lbnQgQ29tcG9uZW50cyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3Mgc2VlLiBga3ZtX2dtZW1fYmluZGAsIGBrdm1fc2V0X21lbXNsb3RgLCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCwgYW5kIGBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25gIOKAkyB0aG9zZSBhcmUgdGhlIGtleSBzeW1ib2xzLCB0aGUgaGVhcnQgb2YgdGhpcyBhcmVhLCBhcyBJIHN1c3BlY3RlZC4gTm93LCBiZWZvcmUgSSBkZWNsYXJlIHRoaXMgYXMgJiMzNDtkb25lLCYjMzQ7IGxldCYjMzk7cyBqdXN0IG1ha2Ugc3VyZSBJJiMzOTttIG5vdCBtaXNzaW5nIGFueXRoaW5nLiBJIG5lZWQgdG8gZW5zdXJlIGEgY29tcGxldGUgcGljdHVyZSBoZXJlLgoKT2theSwgbGV0IG1lIGNoZWNrIHRoZSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZDogYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIE1ha2VzIHNlbnNlLiBBbmQgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBgS1ZNYCBhbmQgYEtWTV9HVUVTVF9NRU1GRGAuIEdvb2QsIHRoYXQgbGluZXMgdXAuCgpOb3csIHRpbWUgZm9yIHRoZSBzYW5pdHkgY2hlY2suIEZpcnN0LCByZWFjaGFiaWxpdHk6IHllcCwgS1ZNIGlvY3RscyBhcmUgaW5kZWVkIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdGhyb3VnaCBgL2Rldi9rdm1gLCBhbmQgYm90aCBndWVzdCBtZW1mZCBhbmQgbWVtb3J5IHJlZ2lvbnMgYXJlIGFjdGl2ZWx5IHN1cHBvcnRlZCBpbiBWTXMuIENoZWNrLgoKU2Vjb25kLCB3b3J0aCBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBUaGUgcmVmYWN0b3Jpbmcgb2YgbWVtc2xvdCBiaW5kaW5nIGVycm9yIGhhbmRsaW5nLCB0aGUgbW92ZSBvZiBga3ZtX2dtZW1fYmluZGAgaW5zaWRlIGBrdm1fc2V0X21lbXNsb3RgLCBhbmQgdGhlIGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbnMuLi4gYWxsIG9mIHRoYXQgc2NyZWFtcyBwb3RlbnRpYWwgZm9yIGludGVyZXN0aW5nIGZ1enppbmcgdGFyZ2V0cy4gRGVmaW5pdGVseSB3b3J0aCB0aGUgZWZmb3J0LgoKVGhlbiwgdGhlIGZvY3VzIHN5bWJvbHMgYXJlIGV4YWN0bHkgYXMgZXhwZWN0ZWQuIFRoZXkgYXJlOgoqICAgYGt2bV9nbWVtX2JpbmRgCiogICBga3ZtX3NldF9tZW1zbG90YAoqICAgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAKKiAgIGBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25gCgpBbmQgdGhlIGVuYWJsZSBjb25maWd1cmF0aW9ucyBhcmUganVzdCB3aGF0IEkgdGhvdWdodCwgbmFtZWx5OgoqICAgYEtWTWAKKiAgIGBLVk1fR1VFU1RfTUVNRkRgCgpZZXMsIGV2ZXJ5dGhpbmcmIzM5O3MgY2xlYXIsIGFjY3VyYXRlLCBhbmQgY29tcGxldGUuIFRpbWUgdG8gY2FsbCBpdC4gTGV0JiMzOTtzIHRyaWdnZXIgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OywKICAgICYjMzQ7a3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcgbG9naWMgZm9yIGd1ZXN0X21lbWZkLiBJdCBtb3ZlcyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpLCBhZGRzIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucywgYW5kIHVwZGF0ZXMgZXJyb3IgdW53aW5kaW5nIGZvciBtZW1zbG90IGJpbmRpbmcgZmFpbHVyZXMgYW5kIHhhX3N0b3JlX3JhbmdlIGVycm9ycy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIEtWTSBpb2N0bHMgKHN1Y2ggYXMgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yKS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7LAogICAgJiMzNDtrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRqdXN0cyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHNlcXVlbmNlIG9mIGt2bV9nbWVtX2JpbmQoKSB3aXRoaW4gS1ZNJiMzOTtzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cblxuQWxsIGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0dXJlcyAoc3VjaCBhcyBrdm1fbWVtb3J5X3Nsb3QpIGFyZSB6ZXJvLWFsbG9jYXRlZCB3aXRoIGt6YWxsb2Nfb2JqKCksIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiwgeGFyKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIG5vIGRhdGEgaXMgY29waWVkIHRvIHVzZXJzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQgaW4ga2VybmVsLWludGVybmFsIHN0YXRlLiBBcyB0aGlzIGNoYW5nZSBkZWFscyBzdHJpY3RseSB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBjbGVhbnVwIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlcywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQgYW5kIHN0YW5kYXJkIEtBU0FOIHRlc3RpbmcgaXMgc3VmZmljaWVudC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDA3MTE1NTM2YmMyN2ZkMmM3MDFiNTE3ODJmOGZiMmI2ZjYyOWMwMWQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAzIDE1OjQzOjE5IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKaW5kZXggYjU5NjQ4NmQxODRjYS4uMzIzMTU5YzliNWYzNCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCkBAIC02MTIsMTAgJiM0Mzs2MTIsMTQgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJaW50IHIgPSAtRUlOVkFMOwomIzQzOwl2b2lkICp4YXI7CiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7CiAJQlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtJmd0O2dtZW0ucGdvZmYpKTsKIAomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKHNsb3QtJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKCFmaWxlKQogCQlyZXR1cm4gLUVCQURGOwpAQCAtNjQ5LDEyICYjNDM7NjUzLDEyIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdAogCSAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLgogCSAqLwotCVdSSVRFX09OQ0Uoc2xvdC0mZ3Q7Z21lbS5maWxlLCBmaWxlKTsKJiM0MzsJc2xvdC0mZ3Q7Z21lbS5maWxlID0gZmlsZTsKIAlzbG90LSZndDtnbWVtLnBnb2ZmID0gc3RhcnQ7CiAJaWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKQogCQlzbG90LSZndDtmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7CiAKLQl4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7CiYjNDM7CXhhciA9IHhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTsKIAlmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLSZndDtpX21hcHBpbmcpOwogCiAJLyoKQEAgLTY2Miw3ICYjNDM7NjY2LDEzIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGUKIAkgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC4KIAkgKi8KLQlyID0gMDsKJiM0MzsJciA9IHhhX2lzX2Vycih4YXIpID8geGFfZXJyKHhhcikgOiAwOwomIzQzOwlpZiAocikgewomIzQzOwkJeGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpOwomIzQzOwkJc2xvdC0mZ3Q7Z21lbS5maWxlID0gTlVMTDsKJiM0MzsJCXNsb3QtJmd0O2dtZW0ucGdvZmYgPSAwOwomIzQzOwkJc2xvdC0mZ3Q7ZmxhZ3MgJmFtcDs9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7CiYjNDM7CX0KIGVycjoKIAlmcHV0KGZpbGUpOwogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xODg3LDcgJiM0MzsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldywKLQkJCSAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpCiYjNDM7CQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSwKJiM0MzsJCQkgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KQogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDsKIAlpbnQgcjsKQEAgLTE5MzEsMjAgJiM0MzsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAl9CiAKIAlyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwotCWlmIChyKSB7Ci0JCS8qCi0JCSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vCi0JCSAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZAotCQkgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28KLQkJICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suCi0JCSAqLwotCQlpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7Ci0JCQlrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTsKLQkJCWtmcmVlKGludmFsaWRfc2xvdCk7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF91bmxvY2soJmFtcDtrdm0tJmd0O3Nsb3RzX2FyY2hfbG9jayk7Ci0JCX0KLQkJcmV0dXJuIHI7CiYjNDM7CWlmIChyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CWlmIChuZXcgJmFtcDsmYW1wOyBuZXctJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKQomIzQzOwkJCWdvdG8gZXJyX2JpbmQ7CiYjNDM7CiYjNDM7CQlyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpOwomIzQzOwkJaWYgKHIpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKIAl9CiAKIAkvKgpAQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCiAJa3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiAKIAlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJfYmluZDoKJiM0MzsJaWYgKG5ldykgewomIzQzOwkJa3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTsKJiM0MzsKJiM0MzsJCWlmIChuZXctJmd0O2RpcnR5X2JpdG1hcCAmYW1wOyZhbXA7ICghb2xkIHx8ICFvbGQtJmd0O2RpcnR5X2JpdG1hcCkpCiYjNDM7CQkJa3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7CiYjNDM7CX0KJiM0MztlcnI6CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnMKJiM0MzsJICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuCiYjNDM7CSAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKJiM0MzsJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwomIzQzOwkJa2ZyZWUoaW52YWxpZF9zbG90KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLApAQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAkJaWYgKFdBUk5fT05fT05DRShrdm0tJmd0O25yX21lbXNsb3RfcGFnZXMgJmx0OyBvbGQtJmd0O25wYWdlcykpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTsKJiM0MzsJCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTsKIAl9CiAKIAliYXNlX2dmbiA9IChtZW0tJmd0O2d1ZXN0X3BoeXNfYWRkciAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKQEAgLTIxMDUsMjEgJiM0MzsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAluZXctJmd0O25wYWdlcyA9IG5wYWdlczsKIAluZXctJmd0O2ZsYWdzID0gbWVtLSZndDtmbGFnczsKIAluZXctJmd0O3VzZXJzcGFjZV9hZGRyID0gbWVtLSZndDt1c2Vyc3BhY2VfYWRkcjsKLQlpZiAobWVtLSZndDtmbGFncyAmYW1wOyBLVk1fTUVNX0dVRVNUX01FTUZEKSB7Ci0JCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXQ7Ci0JfQogCi0JciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwomIzQzOwlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSwKJiM0MzsJCQkgICAgbWVtLSZndDtndWVzdF9tZW1mZCwgbWVtLSZndDtndWVzdF9tZW1mZF9vZmZzZXQpOwogCWlmIChyKQotCQlnb3RvIG91dF91bmJpbmQ7CiYjNDM7CQlnb3RvIG91dDsKIAogCXJldHVybiAwOwogCi1vdXRfdW5iaW5kOgotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpCi0JCWt2bV9nbWVtX3VuYmluZChuZXcpOwogb3V0OgogCWtmcmVlKG5ldyk7CiAJcmV0dXJuIHI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDE1CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTAxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV2YWx1YXRpbmcgdGhlIEtWTSBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgTmVlZHMqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBzZXJpZXMgbmVjZXNzaXRhdGVzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiwgb3IgaWYgd2UmIzM5O3JlIGdvb2Qgd2l0aCB0aGUgc3RhbmRhcmQgS0FTQU4vTE9DS0RFUC9idWcgZGV0ZWN0b3IgYXBwcm9hY2guIExldCYjMzk7cyBkaXZlIGluLgoKRmlyc3QsIEkgc2VlIHRoZSBwYXRjaGVzIHRvdWNoIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBUaGF0IGdpdmVzIG1lIGEgc3RhcnRpbmcgcG9pbnQuIExldCYjMzk7cyBicmVhayBpdCBkb3duOgoKSW4gYGd1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYGt2bV9nbWVtX2JpbmRgOiBpdCBsb29rcyBsaWtlIHdlJiMzOTt2ZSBnb3QgYSBgV0FSTl9PTl9PTkNFYCBpZiBgc2xvdC0mZ3Q7ZmxhZ3NgIGhhcyBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBzZXQuIEludGVyZXN0aW5nLiBUaGVuIHRoZXJlIGlzIGFuIGVycm9yIGNoZWNrIGZvbGxvd2luZyBgeGFfc3RvcmVfcmFuZ2VgIHdoaWNoIHJvbGxzIGJhY2sgb24gZXJyb3IsIGNsZWFyaW5nIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZ21lbSBhbmQgaGFuZGxpbmcgbWVtb3J5IHNsb3QgZmxhZ3MuIFRoZSBvcmlnaW5hbCBwYXRjaCB1c2VzIGBXUklURV9PTkNFYCB0byBzZXQgdGhlIGdtZW0gZmlsZSBhbmQgaGFzIG5vdyBiZWVuIHJlcGxhY2VkIHdpdGggYSBkaXJlY3QgYXNzaWdubWVudC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgd2h5IHRoYXQgY2hhbmdlIHdhcyBtYWRlLgoKT3ZlciBpbiBga3ZtX21haW4uY2AsIGBrdm1fc2V0X21lbXNsb3RgIGhhcyBhZGRlZCBuZXcgcGFyYW1ldGVycywgYGdtZW1fZmRgIGFuZCBgZ21lbV9vZmZzZXRgLiBBbmQgaXQgbG9va3MgbGlrZSBga3ZtX2dtZW1fYmluZGAgaGFzIGJlZW4gbW92ZWQgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBpbnRvIGBrdm1fc2V0X21lbXNsb3RgLiAgRXJyb3IgdW53aW5kaW5nIGlzIGluIHBsYWNlIGlmIGBrdm1fZ21lbV9iaW5kYCBmYWlscywgd2hpY2ggaW5jbHVkZXMgcmVsZWFzaW5nIG1lbW9yeSBzbG90cyBhbmQgZGVzdHJveWluZyB0aGUgZGlydHkgYml0bWFwLCBpZiBuZWNlc3NhcnkuIEFuZCBmaW5hbGx5LCBpbiBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCwgdGhlIHBhdGNoIHBhc3NlcyB0aGUgbWVtZmQgcGFyYW1ldGVycyB0byBga3ZtX3NldF9tZW1zbG90YCBhbmQgcmVtb3ZlcyB0aGUgb2xkIGJpbmRpbmcgbG9naWMuCgpOb3csIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBUaW1lIHRvIGZpcmUgdXAgbXkgdHJ1c3R5IHRvb2xzIOKAkyByZWFkLWZpbGUgb3IgZ3JlcHBlciDigJMgYW5kIHJlYWxseSBkaWcgaW50byB0aGUgY29kZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYW55IGNsdWVzIHRoYXQgY291bGQgaW5kaWNhdGUgc29tZXRoaW5nIG5ldyB0byBmdXp6LCBvciBpZiB0aGlzIGNoYW5nZSBpcyBqdXN0IG1vdmluZyBzb21lIGxvZ2ljIGFyb3VuZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3ZtX2dtZW1fYmluZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NTkyPWludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjA2OmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjA3LVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldClcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjUzOlx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjU0LVx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xMD1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpO1xudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoxMTppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldCk7XG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xOT1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2dtZW1fZXhpdCh2b2lkKSB7fTtcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjA6c3RhdGljIGlubGluZSBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVx0XHRcdFx0XHQgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE4ODc9c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTk0MjpcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0My1cdFx0aWYgKHIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU2MTYKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiA1MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgdGV4dCwgc3VtbWFyaXplZCBpbiB0aGUgZmlyc3QgcGVyc29uIGFzIGlmIHRoZXkgd2VyZSBteSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIEtWTSBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBndXRzIG9mIEtWTSYjMzk7cyBndWVzdCBtZW1vcnkgbWFuYWdlbWVudC4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgaXMgYWN0dWFsbHkgYm91bmQgdG8gZ3Vlc3QgcHJvY2Vzc2VzIHVzaW5nIG1lbWZkcy4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYSBmb3Igc2VjdXJpdHkgYW5kIHBlcmZvcm1hbmNlLCBzbyBJIHdhbnQgYSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVyYWN0aW9ucyBpbnZvbHZlZC4KClRoZW4sIHRvIHB1dCBpdCBpbnRvIHRoZSB3aWRlciBjb250ZXh0IG9mIGhvdyB0aGlzIG1lbW9yeSBnZXRzIHNldCB1cCBpbml0aWFsbHksIEkmIzM5O2xsIG5lZWQgdG8ganVtcCBvdmVyIHRvIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCBhbmQgdGFrZSBhIGNsb3NlIGxvb2sgYXQgYm90aCBga3ZtX2dtZW1fYmluZGAgYW5kIGhvdyBga3ZtX3NldF9tZW1zbG90YCB3b3Jrcy4gVW5kZXJzdGFuZGluZyBob3cgbWVtc2xvdHMgYXJlIGNvbmZpZ3VyZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbWVtZmQgYmluZGluZyBpcyBlc3NlbnRpYWwgdG8gZ3Jhc3BpbmcgdGhlIGNvbXBsZXRlIG1lbW9yeSBtYXBwaW5nIHBpY3R1cmUuIEkmIzM5O20gdGhpbmtpbmcgSSYjMzk7bGwgdHJhY2UgZGF0YSBmbG93IGFuZCBjb250cm9sIHBhdGhzIHRvIGJ1aWxkIGEgbWVudGFsIG1hcCBvZiB0aGUgcHJvY2VzcywgbG9va2luZyBmb3IgYW55IG9wdGltaXphdGlvbiBib3R0bGVuZWNrcyBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgYXMgSSBnby4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNjA1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDc1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA2MDU6XHRcbiA2MDY6XHRpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gNjA3Olx0XHRcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KVxuIDYwODpcdHtcbiA2MDk6XHRcdHVvZmZfdCBzaXplID0gc2xvdC1cdTAwM2VucGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4gNjEwOlx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7XG4gNjExOlx0XHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xuIDYxMjpcdFx0c3RydWN0IGlub2RlICppbm9kZTtcbiA2MTM6XHRcdHN0cnVjdCBmaWxlICpmaWxlO1xuIDYxNDpcdFx0aW50IHIgPSAtRUlOVkFMO1xuIDYxNTpcdFx0dm9pZCAqeGFyO1xuIDYxNjpcdFxuIDYxNzpcdFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xuIDYxODpcdFx0QlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtXHUwMDNlZ21lbS5wZ29mZikpO1xuIDYxOTpcdFxuIDYyMDpcdFx0aWYgKFdBUk5fT05fT05DRShzbG90LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxuIDYyMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA2MjI6XHRcbiA2MjM6XHRcdGZpbGUgPSBmZ2V0KGZkKTtcbiA2MjQ6XHRcdGlmICghZmlsZSlcbiA2MjU6XHRcdFx0cmV0dXJuIC1FQkFERjtcbiA2MjY6XHRcbiA2Mjc6XHRcdGlmIChmaWxlLVx1MDAzZWZfb3AgIT0gXHUwMDI2a3ZtX2dtZW1fZm9wcylcbiA2Mjg6XHRcdFx0Z290byBlcnI7XG4gNjI5Olx0XG4gNjMwOlx0XHRmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gNjMxOlx0XHRpZiAoZi1cdTAwM2Vrdm0gIT0ga3ZtKVxuIDYzMjpcdFx0XHRnb3RvIGVycjtcbiA2MzM6XHRcbiA2MzQ6XHRcdGlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbiA2MzU6XHRcbiA2MzY6XHRcdGlmICghUEFHRV9BTElHTkVEKG9mZnNldCkgfHwgb2Zmc2V0ICYjNDM7IHNpemUgXHUwMDNlIGlfc2l6ZV9yZWFkKGlub2RlKSlcbiA2Mzc6XHRcdFx0Z290byBlcnI7XG4gNjM4Olx0XG4gNjM5Olx0XHRmaWxlbWFwX2ludmFsaWRhdGVfbG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY0MDpcdFxuIDY0MTpcdFx0c3RhcnQgPSBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gNjQyOlx0XHRlbmQgPSBzdGFydCAmIzQzOyBzbG90LVx1MDAzZW5wYWdlcztcbiA2NDM6XHRcbiA2NDQ6XHRcdGlmICgheGFfZW1wdHkoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncykgXHUwMDI2XHUwMDI2XG4gNjQ1Olx0XHQgICAgeGFfZmluZChcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBcdTAwMjZzdGFydCwgZW5kIC0gMSwgWEFfUFJFU0VOVCkpIHtcbiA2NDY6XHRcdFx0ciA9IC1FRVhJU1Q7XG4gNjQ3Olx0XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NDg6XHRcdFx0Z290byBlcnI7XG4gNjQ5Olx0XHR9XG4gNjUwOlx0XG4gNjUxOlx0XHQvKlxuIDY1MjpcdFx0ICogbWVtc2xvdHMgb2YgZmxhZyBLVk1fTUVNX0dVRVNUX01FTUZEIGFyZSBpbW11dGFibGUgdG8gY2hhbmdlLCBzb1xuIDY1MzpcdFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbiA2NTQ6XHRcdCAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLlxuIDY1NTpcdFx0ICovXG4gNjU2Olx0XHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XG4gNjU3Olx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcbiA2NTg6XHRcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcbiA2NTk6XHRcdFx0c2xvdC1cdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gNjYwOlx0XG4gNjYxOlx0XHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4gNjYyOlx0XHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjYzOlx0XG4gNjY0Olx0XHQvKlxuIDY2NTpcdFx0ICogRHJvcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmaWxlLCBldmVuIG9uIHN1Y2Nlc3MuICBUaGUgZmlsZSBwaW5zIEtWTSxcbiA2NjY6XHRcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICYjMzk7cm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIDY2NzpcdFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gNjY4Olx0XHQgKi9cbiA2Njk6XHRcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiA2NzA6XHRcdGlmIChyKSB7XG4gNjcxOlx0XHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiA2NzI6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuIDY3MzpcdFx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuIDY3NDpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2NzU6XHRcdH1cbiA2NzY6XHRlcnI6XG4gNjc3Olx0XHRmcHV0KGZpbGUpO1xuIDY3ODpcdFx0cmV0dXJuIHI7XG4gNjc5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MTQzCgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqRGl2aW5nIGludG8gS1ZNIENvcmU6IEEgVGFyZ2V0ZWQgTG9vayoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7dmUgZ290IGEgaHVuY2gsIGFuZCBJIG5lZWQgdG8gdmVyaWZ5IGl0IGluIHRoZSBLVk0gY29kZWJhc2UuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBnb2luZyB0byBmb2N1cyBteSBhdHRlbnRpb24gb24gYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBNeSBndXQgc2F5cyB0aGF0IHRoZSBsb2dpYyBJJiMzOTttIGludGVyZXN0ZWQgaW4gaXMgbGlrZWx5IHdpdGhpbiB0aGUgdmljaW5pdHkgb2YgbGluZXMgMTg4NyB0byAyMTM1LiBUaGlzIHJhbmdlIHByb2JhYmx5IGVuY2Fwc3VsYXRlcyB0aGUgY3JpdGljYWwgY29kZSBJIG5lZWQgdG8gc2NydXRpbml6ZS4gSSYjMzk7bSBub3QgZ29pbmcgaW4gYmxpbmQ7IEkgaGF2ZSBhIHNwZWNpZmljIGNvbmNlcHQgSSYjMzk7bSBjaGFzaW5nLiBMZXQmIzM5O3Mgc2VlIGlmIHRob3NlIGxpbmVzIGhvbGQgdGhlIGtleS4gSSBleHBlY3QgSSB3aWxsIGJlIGRpZ2dpbmcgaW50byB0aGUgZmluZXIgZGV0YWlscyBvZiB0aGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBzZWN0aW9uIHRvIGZpbmQgd2hhdCBJIG5lZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkyMDpcdFx0ICpcbjE5MjE6XHRcdCAqIE1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgb24gYSB0ZW1wb3JhcnksIHVucmVhY2hhYmxlIHNsb3QuICBUaGUgb2xkXG4xOTIyOlx0XHQgKiBzbG90IG5lZWRzIHRvIGJlIHByZXNlcnZlZCBpbiBjYXNlIGEgbGF0ZXIgc3RlcCBmYWlscyBhbmQgdGhlXG4xOTIzOlx0XHQgKiBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQuXG4xOTI0Olx0XHQgKi9cbjE5MjU6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5MjY6XHRcdFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbjE5Mjc6XHRcdFx0aWYgKCFpbnZhbGlkX3Nsb3QpIHtcbjE5Mjg6XHRcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTI5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4xOTMwOlx0XHRcdH1cbjE5MzE6XHRcdFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcbjE5MzI6XHRcdH1cbjE5MzM6XHRcbjE5MzQ6XHRcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTM1Olx0XHRpZiAocilcbjE5MzY6XHRcdFx0Z290byBlcnI7XG4xOTM3Olx0XG4xOTM4Olx0XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbjE5Mzk6XHRcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4xOTQwOlx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDE6XHRcbjE5NDI6XHRcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbjE5NDM6XHRcdFx0aWYgKHIpXG4xOTQ0Olx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDU6XHRcdH1cbjE5NDY6XHRcbjE5NDc6XHRcdC8qXG4xOTQ4Olx0XHQgKiBGb3IgREVMRVRFIGFuZCBNT1ZFLCB0aGUgd29ya2luZyBzbG90IGlzIG5vdyBhY3RpdmUgYXMgdGhlIElOVkFMSURcbjE5NDk6XHRcdCAqIHZlcnNpb24gb2YgdGhlIG9sZCBzbG90LiAgTU9WRSBpcyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBhcyBpdCByZXVzZXNcbjE5NTA6XHRcdCAqIHRoZSBvbGQgc2xvdCBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9sZCBzbG90IChpbiB3b3JraW5nX3Nsb3QpLlxuMTk1MTpcdFx0ICogRm9yIENSRUFURSwgdGhlcmUgaXMgbm8gb2xkIHNsb3QuICBGb3IgREVMRVRFIGFuZCBGTEFHU19PTkxZLCB0aGVcbjE5NTI6XHRcdCAqIG9sZCBzbG90IGlzIGRldGFjaGVkIGJ1dCBvdGhlcndpc2UgcHJlc2VydmVkLlxuMTk1MzpcdFx0ICovXG4xOTU0Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUpXG4xOTU1Olx0XHRcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XG4xOTU2Olx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcbjE5NTc6XHRcdFx0a3ZtX2RlbGV0ZV9tZW1zbG90KGt2bSwgb2xkLCBpbnZhbGlkX3Nsb3QpO1xuMTk1ODpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxuMTk1OTpcdFx0XHRrdm1fbW92ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGludmFsaWRfc2xvdCk7XG4xOTYwOlx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0ZMQUdTX09OTFkpXG4xOTYxOlx0XHRcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcbjE5NjI6XHRcdGVsc2VcbjE5NjM6XHRcdFx0QlVHKCk7XG4xOTY0Olx0XG4xOTY1Olx0XHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cbjE5NjY6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXG4xOTY3Olx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTY4Olx0XG4xOTY5Olx0XHQvKlxuMTk3MDpcdFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cdTAwM2VhcmNoLCBjaGFuZ2VzIGFmdGVyIGRyb3BwaW5nIHNsb3RzX2FyY2hfbG9ja1xuMTk3MTpcdFx0ICogd2lsbCBkaXJlY3RseSBoaXQgdGhlIGZpbmFsLCBhY3RpdmUgbWVtc2xvdC4gIEFyY2hpdGVjdHVyZXMgYXJlXG4xOTcyOlx0XHQgKiByZXNwb25zaWJsZSBmb3Iga25vd2luZyB0aGF0IG5ldy1cdTAwM2VhcmNoIG1heSBiZSBzdGFsZS5cbjE5NzM6XHRcdCAqL1xuMTk3NDpcdFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTc1Olx0XG4xOTc2Olx0XHRyZXR1cm4gMDtcbjE5Nzc6XHRcbjE5Nzg6XHRlcnJfYmluZDpcbjE5Nzk6XHRcdGlmIChuZXcpIHtcbjE5ODA6XHRcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbjE5ODE6XHRcbjE5ODI6XHRcdFx0aWYgKG5ldy1cdTAwM2VkaXJ0eV9iaXRtYXAgXHUwMDI2XHUwMDI2ICghb2xkIHx8ICFvbGQtXHUwMDNlZGlydHlfYml0bWFwKSlcbjE5ODM6XHRcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbjE5ODQ6XHRcdH1cbjE5ODU6XHRlcnI6XG4xOTg2Olx0XHQvKlxuMTk4NzpcdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xuMTk4ODpcdFx0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXG4xOTg5Olx0XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4xOTkwOlx0XHQgKi9cbjE5OTE6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5OTI6XHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4xOTkzOlx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTk0Olx0XHR9IGVsc2Uge1xuMTk5NTpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTk2Olx0XHR9XG4xOTk3Olx0XHRyZXR1cm4gcjtcbjE5OTg6XHR9XG4xOTk5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2NzEKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aGlua2luZyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBLVk0gTWVtb3J5IE1hbmFnZW1lbnQqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBrdm1fc2V0X21lbXNsb3RgIGFuZCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBhcmUgYmVpbmcgdXNlZC4gVGhlc2UgYXJlIGNyaXRpY2FsIGZ1bmN0aW9ucyBpbiBLVk0gZm9yIG1hbmFnaW5nIHRoZSB2aXJ0dWFsIG1hY2hpbmUmIzM5O3MgbWVtb3J5LCByaWdodD8gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBjYWxscyB0byB0aGVzZSBmdW5jdGlvbnMgdG8gdW5kZXJzdGFuZCAqd2hvKiBpcyBzZXR0aW5nIHVwIG1lbW9yeSwgKndoZW4qIGluIHRoZSBWTSBsaWZlY3ljbGUsIGFuZCAqaG93KiB0aGUgbWVtb3J5IGlzIGJlaW5nIGNvbmZpZ3VyZWQuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGluaXRpYWwgc2V0dXAsIGR5bmFtaWMgYWRkaXRpb24vcmVtb3ZhbCBvZiBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBLbm93aW5nIHRoZSBjYWxsZXIgZnVuY3Rpb25zIHdpbGwgcHJvdmlkZSBjb250ZXh0LiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHRoZXkmIzM5O3JlIGludm9rZWQgZHVyaW5nIGd1ZXN0IHN0YXJ0dXAsIGhvdHBsdWcgb3BlcmF0aW9ucywgb3IgcGVyaGFwcyBieSBzb21lIGZvcm0gb2YgbWVtb3J5IGJhbGxvb25pbmcuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSB1c2UgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2t2bV9tYWluLmM9MTYwMT1zdGF0aWMgdm9pZCBrdm1fc3dhcF9hY3RpdmVfbWVtc2xvdHMoc3RydWN0IGt2bSAqa3ZtLCBpbnQgYXNfaWQpXG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0xNjI4LVx0LypcbnZpcnQva3ZtL2t2bV9tYWluLmM6MTYyOTpcdCAqIEFjcXVpcmVkIGluIGt2bV9zZXRfbWVtc2xvdC4gTXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgc3luY2hyb25pemVcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTYzMC1cdCAqIFNSQ1UgYmVsb3cgaW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBhbm90aGVyIHRocmVhZFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MTg3ND1zdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTg4Ni1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTg4NzpzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE4ODgtXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MjAxMz1zdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMDY3LVx0ICogTm90ZSwgdGhlIG9sZCBtZW1zbG90IChhbmQgdGhlIHBvaW50ZXIgaXRzZWxmISkgbWF5IGJlIGludmFsaWRhdGVkXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIwNjg6XHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxudmlydC9rdm0va3ZtX21haW4uYy0yMDY5LVx0ICovXG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMDc4LVxudmlydC9rdm0va3ZtX21haW4uYzoyMDc5Olx0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFLCAtMSwgMCk7XG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwODAtXHR9XG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMTI2LVxudmlydC9rdm0va3ZtX21haW4uYzoyMTI3Olx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIxMjgtXHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0ODkKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoYXQgMjAxMy0yMTQwIHJhbmdlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIHdoZW4gZGVhbGluZyB3aXRoIHRoZSBgbmV3YCB2YXJpYWJsZSwgYmVjYXVzZSB0aGF0JiMzOTtzIHdoZXJlIHRoaW5ncyBjYW4gb2Z0ZW4gZ28gc2lkZXdheXMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMgY29ycmVjdGx5LiBNeSBleHBlcmllbmNlIHNheXMgdGhhdCBpcyB0aGUgbW9zdCBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgaW4gdGhlc2Uga2luZHMgb2Ygcm91dGluZXMsIHNvIGxldCYjMzk7cyBzdGFydCB0aGVyZS4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIHBhZ2UgdGFibGVzIGFuZCBtZW1vcnkgbWFwcGluZy4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgbWlzdGFrZXMgaW4gdGhlIGxvZ2ljLCBvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBpZiB0aGlzIGlzIG11bHRpdGhyZWFkZWQuIEdvdHRhIGJlIG1ldGhvZGljYWwgaGVyZSBhbmQgYXZvaWQgYW55IGFzc3VtcHRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2t2bV9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDYwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwODA6XHRcdH1cbjIwODE6XHRcbjIwODI6XHRcdGJhc2VfZ2ZuID0gKG1lbS1cdTAwM2VndWVzdF9waHlzX2FkZHIgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuMjA4MzpcdFx0bnBhZ2VzID0gKG1lbS1cdTAwM2VtZW1vcnlfc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4yMDg0Olx0XG4yMDg1Olx0XHRpZiAoIW9sZCB8fCAhb2xkLVx1MDAzZW5wYWdlcykge1xuMjA4NjpcdFx0XHRjaGFuZ2UgPSBLVk1fTVJfQ1JFQVRFO1xuMjA4NzpcdFxuMjA4ODpcdFx0XHQvKlxuMjA4OTpcdFx0XHQgKiBUbyBzaW1wbGlmeSBLVk0gaW50ZXJuYWxzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFjcm9zc1xuMjA5MDpcdFx0XHQgKiBhbGwgbWVtc2xvdHMgbXVzdCBmaXQgaW4gYW4gdW5zaWduZWQgbG9uZy5cbjIwOTE6XHRcdFx0ICovXG4yMDkyOlx0XHRcdGlmICgoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgJiM0MzsgbnBhZ2VzKSBcdTAwM2Mga3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMpXG4yMDkzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk0Olx0XHR9IGVsc2UgeyAvKiBNb2RpZnkgYW4gZXhpc3Rpbmcgc2xvdC4gKi9cbjIwOTU6XHRcdFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXG4yMDk2Olx0XHRcdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4yMDk3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk4Olx0XHRcdGlmICgobWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyICE9IG9sZC1cdTAwM2V1c2Vyc3BhY2VfYWRkcikgfHxcbjIwOTk6XHRcdFx0ICAgIChucGFnZXMgIT0gb2xkLVx1MDAzZW5wYWdlcykgfHxcbjIxMDA6XHRcdFx0ICAgICgobWVtLVx1MDAzZWZsYWdzIF4gb2xkLVx1MDAzZWZsYWdzKSBcdTAwMjYgKEtWTV9NRU1fUkVBRE9OTFkgfCBLVk1fTUVNX0dVRVNUX01FTUZEKSkpXG4yMTAxOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMTAyOlx0XG4yMTAzOlx0XHRcdGlmIChiYXNlX2dmbiAhPSBvbGQtXHUwMDNlYmFzZV9nZm4pXG4yMTA0Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX01PVkU7XG4yMTA1Olx0XHRcdGVsc2UgaWYgKG1lbS1cdTAwM2VmbGFncyAhPSBvbGQtXHUwMDNlZmxhZ3MpXG4yMTA2Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX0ZMQUdTX09OTFk7XG4yMTA3Olx0XHRcdGVsc2UgLyogTm90aGluZyB0byBjaGFuZ2UuICovXG4yMTA4Olx0XHRcdFx0cmV0dXJuIDA7XG4yMTA5Olx0XHR9XG4yMTEwOlx0XG4yMTExOlx0XHRpZiAoKGNoYW5nZSA9PSBLVk1fTVJfQ1JFQVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkgXHUwMDI2XHUwMDI2XG4yMTEyOlx0XHQgICAga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzbG90cywgaWQsIGJhc2VfZ2ZuLCBiYXNlX2dmbiAmIzQzOyBucGFnZXMpKVxuMjExMzpcdFx0XHRyZXR1cm4gLUVFWElTVDtcbjIxMTQ6XHRcbjIxMTU6XHRcdC8qIEFsbG9jYXRlIGEgc2xvdCB0aGF0IHdpbGwgcGVyc2lzdCBpbiB0aGUgbWVtc2xvdC4gKi9cbjIxMTY6XHRcdG5ldyA9IGt6YWxsb2Nfb2JqKCpuZXcsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4yMTE3Olx0XHRpZiAoIW5ldylcbjIxMTg6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4yMTE5Olx0XG4yMTIwOlx0XHRuZXctXHUwMDNlYXNfaWQgPSBhc19pZDtcbjIxMjE6XHRcdG5ldy1cdTAwM2VpZCA9IGlkO1xuMjEyMjpcdFx0bmV3LVx1MDAzZWJhc2VfZ2ZuID0gYmFzZV9nZm47XG4yMTIzOlx0XHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuMjEyNDpcdFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuMjEyNTpcdFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuMjEyNjpcdFxuMjEyNzpcdFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG4yMTI4Olx0XHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4yMTI5Olx0XHRpZiAocilcbjIxMzA6XHRcdFx0Z290byBvdXQ7XG4yMTMxOlx0XG4yMTMyOlx0XHRyZXR1cm4gMDtcbjIxMzM6XHRcbjIxMzQ6XHRvdXQ6XG4yMTM1Olx0XHRrZnJlZShuZXcpO1xuMjEzNjpcdFx0cmV0dXJuIHI7XG4yMTM3Olx0fVxuMjEzODpcdFxuMjEzOTpcdGludCBrdm1fc2V0X2ludGVybmFsX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDcwOAoJCQkJCQkJb3V0cHV0OiAyMDIKCQkJCQkJCXRob3VnaHRzOiA4NTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudCBvZiBLVk0gTWVtc2xvdCBCaW5kaW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIHNlZSBpZiBpdCBpbnRyb2R1Y2VzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMsIGdpdmVuIG15IGV4cGVydGlzZSBpbiB0aGlzIGFyZWEuCgpGaXJzdCwgSSBzZWUgdGhlIHBhdGNoIGlzIHByaW1hcmlseSBmb2N1c2VkIG9uIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24gYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgbWVtc2xvdCBjcmVhdGlvbiBwcm9jZXNzLCBtb3ZpbmcgYW5kIG1vZGlmeWluZyB0aGUgY2FsbCB0byBga3ZtX2dtZW1fYmluZGAuIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IG1lbXNsb3QgYmluZGluZyBzcGVjaWZpY2FsbHkgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFsIG1lbW9yeSAoZ21lbSkgd2l0aGluIEtWTS4KCkhlcmUmIzM5O3MgbXkgYW5hbHlzaXM6CgoxLiAgKipga3ZtX2dtZW1fYmluZGAgQnJlYWtkb3duOioqIFRoZSBwYXRjaCBub3cgaW5jbHVkZXMgYSBgV0FSTl9PTl9PTkNFYCBjaGVjay4gVGhlbiB0aGUgY29kZSBzZXRzIGBzbG90LSZndDtnbWVtLmZpbGUgPSBmaWxlO2AsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgYWNjZXNzIGlzIHNhZmUuIFRoZSBwYXRjaCBhbHNvIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZWAuICBDcml0aWNhbGx5LCB0aGUgcGF0Y2ggaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgeGFfc3RvcmVfcmFuZ2VgIGZhaWxzIChmb3IgaW5zdGFuY2UsIGR1ZSB0byAtRU5PTUVNKSBieSBwcm9wZXJseSBjbGVhbmluZyB1cCB0aGUgYmluZGluZyBhbmQgcmVzZXR0aW5nIHJlbGV2YW50IGZpZWxkcy4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudC4KCjIuICAqKmBrdm1fc2V0X21lbXNsb3RgIE1vZGlmaWNhdGlvbjoqKiAgYGt2bV9nbWVtX2JpbmRgIGlzIG5vdyBjYWxsZWQgd2l0aGluIGBrdm1fc2V0X21lbXNsb3RgLCBhZnRlciBga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbmAuIEVycm9yIGhhbmRsaW5nIGhhcyBiZWVuIGFkZGVkIGlmIHRoZSBiaW5kaW5nIGZhaWxzLCBpbmNsdWRpbmcgY2xlYW51cCBvZiBhcmNoIG1lbXNsb3QgcmVzb3VyY2VzIGFuZCB0aGUgZGlydHkgYml0bWFwLiBUaGUgcGF0Y2ggYWxzbyBtb3ZlcyB0aGUgYGt2bV9nbWVtX2JpbmRgIGNhbGwgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCB0byBga3ZtX3NldF9tZW1zbG90YC4KCjMuICAqKktNU0FOIENvbnNpZGVyYXRpb25zOioqIEkmIzM5O3ZlIGNhcmVmdWxseSBjb25zaWRlcmVkIHRoZSBLTVNBTiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5OgoKICAgICogICBObyBrZXJuZWwgc3RydWN0dXJlcyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2UgaGVyZS4gVGhhdCYjMzk7cyBhIGh1Z2UgcG9zaXRpdmUuCiAgICAqICAgVmFyaWFibGVzIGFyZSBlaXRoZXIgaW5pdGlhbGl6ZWQgZGlyZWN0bHkgb3IgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jX29iamAsIHdoaWNoIHplcm8taW5pdGlhbGl6ZXMuIE5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMgaGVyZS4KICAgICogICBObyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGNhdXNlIHByb2JsZW1zLiBFdmVyeXRoaW5nIGlzIGhhbmRsZWQgcHJvcGVybHkuCiAgICAqICAgQm91bmRzIGNoZWNrcyBhbmQgbGVuZ3RocyBsb29rIGZpbmUgaW4gcmVsYXRpb24gdG8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLgoKNC4gICoqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGFuYWx5c2lzLCBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHRoaXMgcGF0Y2ggKipkb2VzIG5vdCBpbnRyb2R1Y2UqKiBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYnVncy4gSXQgZG9lc24mIzM5O3QgYWx0ZXIgYW55IGRhdGEgZmxvdyBpbiB0aGF0IHJlZ2FyZC4gSW4gZmFjdCwgaXQgaW1wcm92ZXMgZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaW4gaG93IGBrdm1fZ21lbV9iaW5kYCBpbnRlcmFjdHMgd2l0aCBgeGFfc3RvcmVfcmFuZ2VgLiBUaGVzZSBpbXByb3ZlbWVudHMgYXJlIGVycm9yIHVud2luZGluZy9zeW5jaHJvbml6YXRpb24vcmVzb3VyY2UgbWFuYWdlbWVudCBjb25jZXJucywgYW5kIHRoZXkgY2FuIGJlIGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4KCkxldCYjMzk7cyBkbyBhIHF1aWNrIGRvdWJsZS1jaGVjazoKLSBgeGFyYCBpcyBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBiZWZvcmUgdXNlCi0gYHNsb3RgIGlzIHByb3Blcmx5IGFsbG9jYXRlZCB3aXRoIGBremFsbG9jX29iamAKLSBObyBzdGFjayB2YXJpYWJsZXMgYXJlIHVuaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4KLSBObyBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbi4KClRoZXJlZm9yZSwgYE5lZWRzS01TQU4gPSBmYWxzZWAuIEkmIzM5O20gcmVhZHkgdG8gcHJlcGFyZSB0aGUgdG9vbCBjYWxsIHRvIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSYjMzk7cyBtZW1zbG90IHNldHVwIChrdm1fc2V0X21lbXNsb3QoKSkuIFNwZWNpZmljYWxseSwgaXQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgeGFfc3RvcmVfcmFuZ2UoKSwgdW53aW5kcyB0aGUgbWVtc2xvdCBmaWVsZHMgYW5kIHhhcnJheSBiaW5kaW5ncyBvbiBmYWlsdXJlLCBhbmQgbW92ZXMgdGhlIGJpbmQgY2FsbCBhZnRlciBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKCkuXG5cbkFsbCBhbGxvY2F0ZWQgbWVtb3J5IHN0cnVjdHVyZXMgKHN1Y2ggYXMga3ZtX21lbW9yeV9zbG90KSBhcmUgemVyby1hbGxvY2F0ZWQgd2l0aCBremFsbG9jX29iaigpLCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4sIHhhcikgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UsIGFuZCBubyBkYXRhIGlzIGNvcGllZCB0byB1c2Vyc3BhY2Ugb3IgbGVmdCB1bmluaXRpYWxpemVkIGluIGtlcm5lbC1pbnRlcm5hbCBzdGF0ZS4gQXMgdGhpcyBjaGFuZ2UgZGVhbHMgc3RyaWN0bHkgd2l0aCBlcnJvciBoYW5kbGluZyBhbmQgcmVzb3VyY2UgY2xlYW51cCByYXRoZXIgdGhhbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkIGFuZCBzdGFuZGFyZCBLQVNBTiB0ZXN0aW5nIGlzIHN1ZmZpY2llbnQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGp1c3RzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgc2VxdWVuY2Ugb2Yga3ZtX2dtZW1fYmluZCgpIHdpdGhpbiBLVk0mIzM5O3MgbWVtc2xvdCBzZXR1cCAoa3ZtX3NldF9tZW1zbG90KCkpLiBTcGVjaWZpY2FsbHksIGl0IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHhhX3N0b3JlX3JhbmdlKCksIHVud2luZHMgdGhlIG1lbXNsb3QgZmllbGRzIGFuZCB4YXJyYXkgYmluZGluZ3Mgb24gZmFpbHVyZSwgYW5kIG1vdmVzIHRoZSBiaW5kIGNhbGwgYWZ0ZXIga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbigpLlxuXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzoyMC44NjAzNTM3OTNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTEyOTQ3Njg5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIktWTV9HVUVTVF9NRU1GRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2JpbmRcIixcbiAgICBcImt2bV9zZXRfbWVtc2xvdFwiLFxuICAgIFwia3ZtX3NldF9tZW1vcnlfcmVnaW9uXCIsXG4gICAgXCJrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25cIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSdzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cXG5cXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcgbG9naWMgZm9yIGd1ZXN0X21lbWZkLiBJdCBtb3ZlcyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpLCBhZGRzIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucywgYW5kIHVwZGF0ZXMgZXJyb3IgdW53aW5kaW5nIGZvciBtZW1zbG90IGJpbmRpbmcgZmFpbHVyZXMgYW5kIHhhX3N0b3JlX3JhbmdlIGVycm9ycy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIEtWTSBpb2N0bHMgKHN1Y2ggYXMgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yKS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDM6MjAuODYwMzU4MTYzWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mjk3MjU5NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAwNzExNTUzNmJjMjdmZDJjNzAxYjUxNzgyZjhmYjJiNmY2MjljMDFkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG5pbmRleCBiNTk2NDg2ZDE4NGNhLi4zMjMxNTljOWI1ZjM0IDEwMDY0NFxcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG4rKysgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXFxuQEAgLTYxMiwxMCArNjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZTtcXG4gXFx0c3RydWN0IGZpbGUgKmZpbGU7XFxuIFxcdGludCByID0gLUVJTlZBTDtcXG4rXFx0dm9pZCAqeGFyO1xcbiBcXG4gXFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xcbiBcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cXHUwMDNlZ21lbS5wZ29mZikpO1xcbiBcXG4rXFx0aWYgKFdBUk5fT05fT05DRShzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4gXFx0ZmlsZSA9IGZnZXQoZmQpO1xcbiBcXHRpZiAoIWZpbGUpXFxuIFxcdFxcdHJldHVybiAtRUJBREY7XFxuQEAgLTY0OSwxMiArNjUzLDEyIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gXFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcXG4gXFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXFxuIFxcdCAqL1xcbi1cXHRXUklURV9PTkNFKHNsb3QtXFx1MDAzZWdtZW0uZmlsZSwgZmlsZSk7XFxuK1xcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XFxuIFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcXG4gXFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxcbiBcXHRcXHRzbG90LVxcdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIFxcbi1cXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcXG4rXFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XFxuIFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIFxcbiBcXHQvKlxcbkBAIC02NjIsNyArNjY2LDEzIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gXFx0ICogbm90IHRoZSBvdGhlciB3YXkgJ3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcXG4gXFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXFxuIFxcdCAqL1xcbi1cXHRyID0gMDtcXG4rXFx0ciA9IHhhX2lzX2Vycih4YXIpID8geGFfZXJyKHhhcikgOiAwO1xcbitcXHRpZiAocikge1xcbitcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4rXFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gTlVMTDtcXG4rXFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5wZ29mZiA9IDA7XFxuK1xcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuK1xcdH1cXG4gZXJyOlxcbiBcXHRmcHV0KGZpbGUpO1xcbiBcXHRyZXR1cm4gcjtcXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcXG5pbmRleCA2NWViMjZhMDUyMGQ4Li4yMWMxMGNiYmFjNjYxIDEwMDY0NFxcbi0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmNcXG4rKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXFxuQEAgLTE4ODcsNyArMTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4gXFx0XFx0XFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLFxcbiBcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXFxuLVxcdFxcdFxcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpXFxuK1xcdFxcdFxcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UsXFxuK1xcdFxcdFxcdCAgIHVuc2lnbmVkIGludCBnbWVtX2ZkLCB1b2ZmX3QgZ21lbV9vZmZzZXQpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqaW52YWxpZF9zbG90O1xcbiBcXHRpbnQgcjtcXG5AQCAtMTkzMSwyMCArMTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcdH1cXG4gXFxuIFxcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuLVxcdGlmIChyKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vXFxuLVxcdFxcdCAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZFxcbi1cXHRcXHQgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc29cXG4tXFx0XFx0ICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XFxuLVxcdFxcdFxcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xcbi1cXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbi1cXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRyZXR1cm4gcjtcXG4rXFx0aWYgKHIpXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0aWYgKG5ldyBcXHUwMDI2XFx1MDAyNiBuZXctXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xcbitcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcXG4rXFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4rXFxuK1xcdFxcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XFxuK1xcdFxcdGlmIChyKVxcbitcXHRcXHRcXHRnb3RvIGVycl9iaW5kO1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbkBAIC0xOTc3LDYgKzE5NzQsMjcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4gXFxuIFxcdHJldHVybiAwO1xcbitcXG4rZXJyX2JpbmQ6XFxuK1xcdGlmIChuZXcpIHtcXG4rXFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4rXFxuK1xcdFxcdGlmIChuZXctXFx1MDAzZWRpcnR5X2JpdG1hcCBcXHUwMDI2XFx1MDAyNiAoIW9sZCB8fCAhb2xkLVxcdTAwM2VkaXJ0eV9iaXRtYXApKVxcbitcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4rXFx0fVxcbitlcnI6XFxuK1xcdC8qXFxuK1xcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcXG4rXFx0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXFxuK1xcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4rXFx0ICovXFxuK1xcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcXG4rXFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuK1xcdFxcdGtmcmVlKGludmFsaWRfc2xvdCk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbitcXHR9XFxuK1xcdHJldHVybiByO1xcbiB9XFxuIFxcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXFxuQEAgLTIwNTgsNyArMjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcXG4gXFx0XFx0aWYgKFdBUk5fT05fT05DRShrdm0tXFx1MDAzZW5yX21lbXNsb3RfcGFnZXMgXFx1MDAzYyBvbGQtXFx1MDAzZW5wYWdlcykpXFxuIFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiBcXG4tXFx0XFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSk7XFxuK1xcdFxcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcXG4gXFx0fVxcbiBcXG4gXFx0YmFzZV9nZm4gPSAobWVtLVxcdTAwM2VndWVzdF9waHlzX2FkZHIgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuQEAgLTIxMDUsMjEgKzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRuZXctXFx1MDAzZW5wYWdlcyA9IG5wYWdlcztcXG4gXFx0bmV3LVxcdTAwM2VmbGFncyA9IG1lbS1cXHUwMDNlZmxhZ3M7XFxuIFxcdG5ldy1cXHUwMDNldXNlcnNwYWNlX2FkZHIgPSBtZW0tXFx1MDAzZXVzZXJzcGFjZV9hZGRyO1xcbi1cXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4tXFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcXG4tXFx0XFx0aWYgKHIpXFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHR9XFxuIFxcbi1cXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuK1xcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxcbitcXHRcXHRcXHQgICAgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcbiBcXHRpZiAocilcXG4tXFx0XFx0Z290byBvdXRfdW5iaW5kO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFxuIFxcdHJldHVybiAwO1xcbiBcXG4tb3V0X3VuYmluZDpcXG4tXFx0aWYgKG1lbS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxcbi1cXHRcXHRrdm1fZ21lbV91bmJpbmQobmV3KTtcXG4gb3V0OlxcbiBcXHRrZnJlZShuZXcpO1xcbiBcXHRyZXR1cm4gcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDM6MjEuMjkwODcyMDY0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1MTkzMTMyMDg3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIktWTV9HVUVTVF9NRU1GRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2JpbmRcIixcbiAgICBcImt2bV9zZXRfbWVtc2xvdFwiLFxuICAgIFwia3ZtX3NldF9tZW1vcnlfcmVnaW9uXCIsXG4gICAgXCJrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtb3J5IHNsb3QgY3JlYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nIGxvZ2ljIGZvciBndWVzdF9tZW1mZC4gSXQgbW92ZXMga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSwgYWRkcyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMsIGFuZCB1cGRhdGVzIGVycm9yIHVud2luZGluZyBmb3IgbWVtc2xvdCBiaW5kaW5nIGZhaWx1cmVzIGFuZCB4YV9zdG9yZV9yYW5nZSBlcnJvcnMuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBLVk0gaW9jdGxzIChzdWNoIGFzIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMikuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMDcxMTU1MzZiYzI3ZmQyYzcwMWI1MTc4MmY4ZmIyYjZmNjI5YzAxZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuaW5kZXggYjU5NjQ4NmQxODRjYS4uMzIzMTU5YzliNWYzNCAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbkBAIC02MTIsMTAgKzYxMiwxNCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gXHRpbnQgciA9IC1FSU5WQUw7XG4rXHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4rXHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiArNjUzLDEyIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XG4gXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cbiBcdCAqL1xuLVx0V1JJVEVfT05DRShzbG90LVx1MDAzZWdtZW0uZmlsZSwgZmlsZSk7XG4rXHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XG4gXHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcbiBcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcbiBcdFx0c2xvdC1cdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gXG4tXHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4rXHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4gXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXG4gXHQvKlxuQEAgLTY2Miw3ICs2NjYsMTMgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIFx0ICogbm90IHRoZSBvdGhlciB3YXkgJ3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcbiBcdCAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLlxuIFx0ICovXG4tXHRyID0gMDtcbitcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbitcdGlmIChyKSB7XG4rXHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbitcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuK1x0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuK1x0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbitcdH1cbiBlcnI6XG4gXHRmcHV0KGZpbGUpO1xuIFx0cmV0dXJuIHI7XG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jXG4rKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5AQCAtMTg4Nyw3ICsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldyxcbi1cdFx0XHQgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlKVxuK1x0XHRcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UsXG4rXHRcdFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XG4gXHRpbnQgcjtcbkBAIC0xOTMxLDIwICsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdH1cbiBcbiBcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4tXHRpZiAocikge1xuLVx0XHQvKlxuLVx0XHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBOb1xuLVx0XHQgKiBtb2RpZmljYXRpb25zIHJlcXVpcmVkIHNpbmNlIHRoZSBvcmlnaW5hbCBzbG90IHdhcyBwcmVzZXJ2ZWRcbi1cdFx0ICogaW4gdGhlIGluYWN0aXZlIHNsb3RzLiAgQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvXG4tXHRcdCAqIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuLVx0XHRcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xuLVx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuLVx0XHR9XG4tXHRcdHJldHVybiByO1xuK1x0aWYgKHIpXG4rXHRcdGdvdG8gZXJyO1xuK1xuK1x0aWYgKG5ldyBcdTAwMjZcdTAwMjYgbmV3LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuK1x0XHRcdGdvdG8gZXJyX2JpbmQ7XG4rXG4rXHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4rXHRcdGlmIChyKVxuK1x0XHRcdGdvdG8gZXJyX2JpbmQ7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTE5NzcsNiArMTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbiBcbiBcdHJldHVybiAwO1xuK1xuK2Vycl9iaW5kOlxuK1x0aWYgKG5ldykge1xuK1x0XHRrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpO1xuK1xuK1x0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuK1x0XHRcdGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChuZXcpO1xuK1x0fVxuK2VycjpcbitcdC8qXG4rXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXG4rXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbitcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbitcdCAqL1xuK1x0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuK1x0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbitcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbitcdH0gZWxzZSB7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbitcdH1cbitcdHJldHVybiByO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXG5AQCAtMjA1OCw3ICsyMDc2LDcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRpZiAoV0FSTl9PTl9PTkNFKGt2bS1cdTAwM2Vucl9tZW1zbG90X3BhZ2VzIFx1MDAzYyBvbGQtXHUwMDNlbnBhZ2VzKSlcbiBcdFx0XHRyZXR1cm4gLUVJTztcbiBcbi1cdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSk7XG4rXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcbiBcdH1cbiBcbiBcdGJhc2VfZ2ZuID0gKG1lbS1cdTAwM2VndWVzdF9waHlzX2FkZHIgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuQEAgLTIxMDUsMjEgKzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0bmV3LVx1MDAzZW5wYWdlcyA9IG5wYWdlcztcbiBcdG5ldy1cdTAwM2VmbGFncyA9IG1lbS1cdTAwM2VmbGFncztcbiBcdG5ldy1cdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cdTAwM2V1c2Vyc3BhY2VfYWRkcjtcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbi1cdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4tXHRcdGlmIChyKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0fVxuIFxuLVx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuK1x0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG4rXHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4gXHRpZiAocilcbi1cdFx0Z290byBvdXRfdW5iaW5kO1xuK1x0XHRnb3RvIG91dDtcbiBcbiBcdHJldHVybiAwO1xuIFxuLW91dF91bmJpbmQ6XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxuLVx0XHRrdm1fZ21lbV91bmJpbmQobmV3KTtcbiBvdXQ6XG4gXHRrZnJlZShuZXcpO1xuIFx0cmV0dXJuIHI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzoyMS4yOTA4NzM2NDRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo5NjQ2MzkxNTgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS1ZNIE1lbW9yeSBTbG90IFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgZGlmZiBhbmQgc2VlIGlmIGl0IHdhcnJhbnRzIHNvbWUgZnV6emluZyBhdHRlbnRpb24uIEl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gS1ZNJ3MgbWVtb3J5IHNsb3QgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gTXkgaW5pdGlhbCBnbGFuY2Ugc3VnZ2VzdHMgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBgZ3Vlc3RfbWVtZmRgIGludGVyZmFjZSwgd2hpY2ggaXMgaW50ZXJlc3RpbmcuXG5cblNwZWNpZmljYWxseSwgaW4gYGd1ZXN0X21lbWZkLmNgLCB0aGV5J3ZlIG1vZGlmaWVkIGBrdm1fZ21lbV9iaW5kYC4gSSBzZWUgYSBgV0FSTl9PTl9PTkNFYCBjaGVjayBhZ2FpbnN0IGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgLCBhIG5ldyBlcnJvciBoYW5kbGluZyBzdHJhdGVneSwgYW5kIGEgcm9sbGJhY2sgbWVjaGFuaXNtIGlmIGB4YV9zdG9yZV9yYW5nZWAgZmFpbHMuIFRoaXMgaW5kaWNhdGVzIHBvdGVudGlhbCBlZGdlIGNhc2VzIHJlbGF0ZWQgdG8gdGhlIGFsbG9jYXRpb24gb3IgYmluZGluZyBvZiBndWVzdCBtZW1vcnkgdGhyb3VnaCBtZW1mZHMuIEludGVyZXN0aW5nLCBpdCdzIHByZXR0eSBnb29kIGNvZGUuXG5cbk5vdywgaW4gYGt2bV9tYWluLmNgLCBga3ZtX3NldF9tZW1zbG90YCBhcHBlYXJzIHRvIGhhdmUgYmVlbiByZXdvcmtlZC4gVGhleSd2ZSBtb3ZlZCBga3ZtX2dtZW1fYmluZGAgaW5zaWRlIGl0LCBhZnRlciBga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbmAsIHdoaWNoIGlzIGEgbm90YWJsZSBjaGFuZ2UuIFRoZXkgYWxzbyBhZGRlZCBhIGBXQVJOX09OX09OQ0VgIGNoZWNrIGZvciBgS1ZNX01SX0NSRUFURWAsIGFuZCBzb21lIGNsZWFudXAgc3RlcHMuIFRoaXMgc3VnZ2VzdHMgdGhleSBhcmUgYmVpbmcgdmVyeSBjYXJlZnVsIGFib3V0IG1lbW9yeSBzbG90IGNyZWF0aW9uLCBhbmQgaGFuZGxpbmcgZmFpbHVyZXMgY29ycmVjdGx5LiBBbmQgaXQgbG9va3MgbGlrZSB0aGUgY2FsbHMgdG8gYGt2bV9zZXRfbWVtc2xvdGAgaW4gYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgaGF2ZSBiZWVuIHVwZGF0ZWQgYXMgd2VsbC5cblxuVG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMsIEknbGwgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGNvZGUuIEknbGwgdXNlIGdyZXBwZXIgYW5kIHJlYWQtZmlsZSB0byBjaGVjayB0aGUgY29kZSBhbmQgS2NvbmZpZywgc3BlY2lmaWNhbGx5IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gSSB3YW50IHRvIHNlZSBob3cgdGhlc2UgY2hhbmdlcyBpbnRlcmFjdCB3aXRoIHRoZSBicm9hZGVyIEtWTSBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0gYW5kIGFueSByZWxldmFudCBmZWF0dXJlIGZsYWdzLiBUaGlzIGxldmVsIG9mIGNoYW5nZSBpbiBtZW1vcnkgbWFuYWdlbWVudCBpcyBhbHdheXMgd29ydGggY2xvc2Ugc2NydXRpbnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ4MDMsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzozMC45MzcyNjcwODdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQxMTk3NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuLS1cXG52aXJ0L2t2bS9LY29uZmlnPTExMD1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcXG52aXJ0L2t2bS9LY29uZmlnLTExMS0gICAgICAgYm9vbFxcbnZpcnQva3ZtL0tjb25maWc6MTEyOiAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTEzLVxcbnZpcnQva3ZtL0tjb25maWc9MTE0PWNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fUkVDTEFJTVxcbnZpcnQva3ZtL0tjb25maWctMTE1LSAgICAgICBib29sXFxudmlydC9rdm0vS2NvbmZpZzoxMTY6ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxudmlydC9rdm0vS2NvbmZpZy0xMTctXFxudmlydC9rdm0vS2NvbmZpZz0xMTg9Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9JTlZBTElEQVRFXFxudmlydC9rdm0vS2NvbmZpZy0xMTktICAgICAgIGJvb2xcXG52aXJ0L2t2bS9LY29uZmlnOjEyMDogICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9LY29uZmlnLTEyMS1cXG52aXJ0L2t2bS9LY29uZmlnPTEyMj1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXFxudmlydC9rdm0vS2NvbmZpZy0xMjMtICAgICAgIGJvb2xcXG52aXJ0L2t2bS9LY29uZmlnOjEyNDogICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4tLVxcbnZpcnQva3ZtL01ha2VmaWxlLmt2bT0xND1rdm0tJChDT05GSUdfSEFWRV9LVk1fUEZOQ0FDSEUpICs9ICQoS1ZNKS9wZm5jYWNoZS5vXFxudmlydC9rdm0vTWFrZWZpbGUua3ZtOjE1Omt2bS0kKENPTkZJR19LVk1fR1VFU1RfTUVNRkQpICs9ICQoS1ZNKS9ndWVzdF9tZW1mZC5vXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEtLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjojaWZuZGVmIF9fS1ZNX0dVRVNUX01FTUZEX0hfX1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MzojZGVmaW5lIF9fS1ZNX0dVRVNUX01FTUZEX0hfX1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtNC1cXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtNi1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjc6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTgtaW50IGt2bV9nbWVtX2luaXQoc3RydWN0IG1vZHVsZSAqbW9kdWxlKTtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9Mjg9c3RhdGljIGlubGluZSB2b2lkIGt2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90KVxcbi0tXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaC0zMS19XFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDozMjojZW5kaWYgLyogQ09ORklHX0tWTV9HVUVTVF9NRU1GRCAqL1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtMzMtXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDozNDojZW5kaWYgLyogX19LVk1fR1VFU1RfTUVNRkRfSF9fICovXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE1NzQ9c3RhdGljIGludCBjaGVja19tZW1vcnlfcmVnaW9uX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU3OC1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE1Nzk6XFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkpXFxudmlydC9rdm0va3ZtX21haW4uYy0xNTgwLVxcdFxcdHZhbGlkX2ZsYWdzIHw9IEtWTV9NRU1fR1VFU1RfTUVNRkQ7XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTQ4OTQ9c3RhdGljIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uX2dlbmVyaWMoc3RydWN0IGt2bSAqa3ZtLCBsb25nIGFyZylcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtNDk1OC0jZW5kaWZcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjQ5NTk6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTQ5NjAtXFx0Y2FzZSBLVk1fQ0FQX0dVRVNUX01FTUZEOlxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz01MTc4PXN0YXRpYyBsb25nIGt2bV92bV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM5Ny1cXHRcXHRicmVhaztcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjUzOTg6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzOTktXFx0Y2FzZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEOiB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjMwLjk5MTM5MDc4NFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI5ODQzNzQyNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgS1ZNIEd1ZXN0IE1lbW9yeSBGaWxlIERlc2NyaXB0b3IgU3VwcG9ydCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRoaXMgc3RyYWlnaHQgaW4gbXkgaGVhZC4gSSBuZWVkIHRvIHF1aWNrbHkgYXNjZXJ0YWluIHRoZSBjdXJyZW50IHN0YXRlIG9mIEtWTSdzIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIHN1cHBvcnQsIHNwZWNpZmljYWxseSBgS1ZNX0dVRVNUX01FTUZEYC4gQW5kIGJlY2F1c2UgSSdtIGZvY3VzZWQgb24geDg2L2FtZDY0IHBsYXRmb3JtcywgbGV0J3MgZHJpbGwgZG93biBhbmQgc2VlIGhvdyB0aGlzIGlzIGVuYWJsZWQsIG9yIGlmIGl0IGlzIGV2ZW4gZW5hYmxlZCwgd2l0aGluIHRoZSBLY29uZmlnIGZpbGVzLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBpcyB0byBxdWlja2x5IGp1bXAgdG8gdGhlIEtjb25maWcgZmlsZXMgdG8gY29uZmlybSBpdHMgZGVmaW5pdGlvbiwgaXRzIGRlcGVuZGVuY3kgKGlmIGFueSkgb24gb3RoZXIgY29uZmlndXJhdGlvbnMgYW5kIGlmIGl0cyBldmVuIGV4cG9zZWQgZm9yIHg4Ni9hbWQ2NC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjY2MSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjMzLjk3NTc2NjkzNloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjAyODAzOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjM0LjAyMTgwMTE4NFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNTA3ODY5NjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHJlYWRpbmcgYW5kIHByb2Nlc3NpbmcgdGhlIHByb3ZpZGVkIHRleHQ6XG5cbioqS1ZNIENvbmZpZ3VyYXRpb24gRGVlcCBEaXZlKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBgdmlydC9rdm0vS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDEwNi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBLVk0gY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBzdHJ1Y3R1cmVkIGFuZCB3aGF0J3MgYmVpbmcgZW5hYmxlZCBvciBkaXNhYmxlZCBhdCB0aGF0IHBvaW50IGluIHRoZSBjb2RlLiBJJ20gbG9va2luZyBmb3IgdGhlIGNvcmUgc2V0IG9mIG9wdGlvbnM7IGl0J3MgbGlrZWx5IHRoZXkgYXJlIHRoZSBiYXNpY3MgZm9yIHRoZSBtb2R1bGUgdG8gYnVpbGQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY5NjgsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzozNi4xNzI1OTA1MzFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDc0ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwidmlydC9rdm0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiA5NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA5NTpcXHQgICAgICAgYm9vbFxcbiAgOTY6XFx0XFxuICA5NzpcXHRjb25maWcgS1ZNX0VMSURFX1RMQl9GTFVTSF9JRl9ZT1VOR1xcbiAgOTg6XFx0ICAgICAgIGJvb2xcXG4gIDk5OlxcdFxcbiAxMDA6XFx0Y29uZmlnIEtWTV9NTVVfTE9DS0xFU1NfQUdJTkdcXG4gMTAxOlxcdCAgICAgICBib29sXFxuIDEwMjpcXHRcXG4gMTAzOlxcdGNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbiAxMDQ6XFx0ICAgICAgIGJvb2xcXG4gMTA1OlxcdFxcbiAxMDY6XFx0Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbiAxMDc6XFx0ICAgICAgIHNlbGVjdCBYQVJSQVlfTVVMVElcXG4gMTA4OlxcdCAgICAgICBib29sXFxuIDEwOTpcXHRcXG4gMTEwOlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fQ09OVkVSVFxcbiAxMTE6XFx0ICAgICAgIGJvb2xcXG4gMTEyOlxcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxcbiAxMTM6XFx0XFxuIDExNDpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1JFQ0xBSU1cXG4gMTE1OlxcdCAgICAgICBib29sXFxuIDExNjpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4gMTE3OlxcdFxcbiAxMTg6XFx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9JTlZBTElEQVRFXFxuIDExOTpcXHQgICAgICAgYm9vbFxcbiAxMjA6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuIDEyMTpcXHRcXG4gMTIyOlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fUE9QVUxBVEVcXG4gMTIzOlxcdCAgICAgICBib29sXFxuIDEyNDpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDM6MzYuMTcyNjk5MzQxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjQwODgwMDk4MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBLVk1fR1VFU1RfTUVNRkQgU2VsZWN0aW9uIGluIEtjb25maWcqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgdGFzayBhdCBoYW5kIGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGRlcGVuZGVuY2llcyBhbmQgcG90ZW50aWFsIHNlbGVjdGlvbiBjb25kaXRpb25zIGZvciBgS1ZNX0dVRVNUX01FTUZEYCB3aXRoaW4gdGhlIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5IGFuZCB3aGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBvciwgaWYgbm90IGRpcmVjdGx5IGVuYWJsZWQsIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBpdCBiZWNvbWVzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGJ5IHRoZSB1c2VyIG9yIGJ1aWxkIHN5c3RlbS5cblxuRmlyc3QsIEknbGwgbmVlZCB0byBvcGVuIHRoYXQgS2NvbmZpZyBmaWxlLiBJIGFscmVhZHkga25vdyB0aGUgcGF0aDogYGFyY2gveDg2L2t2bS9LY29uZmlnYC4gTGV0J3MgYXNzdW1lIEkgaGF2ZSBhY2Nlc3MgdG8gYSB0ZXJtaW5hbCBvciBjb2RlIGVkaXRvciB3aXRoIGZpbGUgbmF2aWdhdGlvbiBjYXBhYmlsaXRpZXMuIEknbGwgbmVlZCB0byBxdWlja2x5IHNraW0gdGhlIGZpbGUsIGxvb2tpbmcgZm9yIHRoZSBkZWZpbml0aW9uLCBvciByZWZlcmVuY2VzIHRvLCBgS1ZNX0dVRVNUX01FTUZEYC4gSSdsbCBiZSB3YXRjaGluZyBmb3Iga2V5d29yZHMgbGlrZSBcImNvbmZpZ1wiLCBcInNlbGVjdFwiLCBcImRlcGVuZHMgb25cIiwgXCJpZlwiLCBcInRyaXN0YXRlXCIsIGFuZCBwb3RlbnRpYWxseSBcImJvb2xcIiBvciBvdGhlciBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuXG5cbkknbSBleHBlY3RpbmcgdG8gZmluZCBhIHNlY3Rpb24gdGhhdCBkZWZpbmVzIGBLVk1fR1VFU1RfTUVNRkRgLiBJdCBjb3VsZCBiZSBkaXJlY3RseSBkZWZpbmVkLCBvciBzZWxlY3RlZCBpbmRpcmVjdGx5IHRocm91Z2ggYSBsYXJnZXIgS1ZNIGZlYXR1cmUuIFRoZSBjb2RlIHNob3VsZCByZXZlYWwgaWYgaXQncyBhIG1hbmRhdG9yeSBmZWF0dXJlIChib29sKSwgb3B0aW9uYWwgKHRyaXN0YXRlKSwgYW5kIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG5lZWQgdG8gYmUgZW5hYmxlZCBiZWZvcmUgYEtWTV9HVUVTVF9NRU1GRGAgY2FuIGJlIGVuYWJsZWQuIEkgYW0gcGFydGljdWxhcmx5IGxvb2tpbmcgZm9yIHRoZSBkZXBlbmRlbmN5IGNoYWlucyBhbmQgcmVsYXRpb25zaGlwcy4gQXJlIHRoZXJlIGNlcnRhaW4gQ1BVIGZlYXR1cmVzIG9yIGtlcm5lbCBjb25maWd1cmF0aW9ucyB0aGF0ICptdXN0KiBiZSBwcmVzZW50IGJlZm9yZSBgS1ZNX0dVRVNUX01FTUZEYCBpcyBldmVuIGNvbnNpZGVyZWQ/XG5cbk9uY2UgSSBoYXZlIGxvY2F0ZWQgdGhlIHJlbGV2YW50IHNlY3Rpb24sIG15IGdvYWwgaXMgdG8gZGlzdGlsbCB0aGUgbG9naWMgdGhhdCBkaWN0YXRlcyB3aGVuIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGF2YWlsYWJsZS4gVW5kZXJzdGFuZGluZyB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhIHdpbGwgYmUga2V5LiBJIG5lZWQgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUsIGlmIGdpdmVuIGEgc3BlY2lmaWMgc2V0IG9mIGtlcm5lbCBjb25maWd1cmF0aW9ucywgd2hldGhlciBgS1ZNX0dVRVNUX01FTUZEYCB3b3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIHdpbGwgZWl0aGVyIGdpdmUgbWUgY29uZmlkZW5jZSB0aGF0IG15IHVzZSBjYXNlIGlzIHN1cHBvcnRlZCwgb3Igd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGF0aCB0byBnZXQgdGhlcmUuIEl0J3MgdGltZSB0byByZWFkIHNvbWUgY29kZSBhbmQgdW5jb3ZlciB0aGVzZSBkZXBlbmRlbmNpZXMhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc1MTYsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjQyLjU4MTUwMjY2NFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYyNzE2NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImFyY2gveDg2L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3g4Ni9rdm0vS2NvbmZpZz0yMD1jb25maWcgS1ZNX1g4Nlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctNDktXFx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXFxuYXJjaC94ODYva3ZtL0tjb25maWc6NTA6XFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRCBpZiBYODZfNjRcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cXG4tLVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmM9NTEzNT12b2lkIGt2bV9hcmNoX2FzeW5jX3BhZ2VfcmVhZHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2FzeW5jX3BmICp3b3JrKVxcbi0tXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYy01MTY1LVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmM6NTE2NjojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTE2Ny1zdGF0aWMgdm9pZCBrdm1fYXNzZXJ0X2dtZW1faW52YWxpZGF0ZV9sb2NrX2hlbGQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcXG4tLVxcbmFyY2gveDg2L2t2bS94ODYuYz0xMDYzND1ib29sIGt2bV9hcmNoX25vX3BvbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbi0tXFxuYXJjaC94ODYva3ZtL3g4Ni5jLTEwNjM4LVxcbmFyY2gveDg2L2t2bS94ODYuYzoxMDYzOTojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxcbmFyY2gveDg2L2t2bS94ODYuYy0xMDY0MC0vKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0Mzo0Mi42NTc3Nzc5NDFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTc5MDk1NDA3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIHRoZSBLVk0gTGFuZHNjYXBlKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBgS1ZNYCBoZXJlLCBzcGVjaWZpY2FsbHkuIFJpZ2h0LCB3ZWxsLCB0aGUgY29udGV4dCBpcyBsaWtlbHkga2VybmVsLWxldmVsIHZpcnR1YWxpemF0aW9uLiBJbW1lZGlhdGVseSwgSSdtIHRoaW5raW5nIG9mIHRoZSB2YXJpb3VzIGZsYXZvcnMg4oCTIGBLVk1fSU5URUxgLCBgS1ZNX0FNRGAsIG1heWJlIGV2ZW4gYEtWTV9HVUVTVF9NRU1GRGAuIExldCdzIGFzc3VtZSB0aGVzZSBhcmUgdGhlIG9wdGlvbnMgd2UgYXJlIGRlYWxpbmcgd2l0aC5cblxuRmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgdG8gc2VlIGhvdyBgS1ZNYCBpcyBjb25maWd1cmVkLCB3aGF0IGRlcGVuZGVuY2llcyBpdCBoYXMsIGFuZCB3aGF0IHRoZSBvdmVyYWxsIHNldHVwIGxvb2tzIGxpa2Ugd2l0aGluIHRoZSB4ODYgYXJjaGl0ZWN0dXJlLiBUaGUgZ28tdG8gcGxhY2UgZm9yIHRoYXQga2luZCBvZiBpbmZvcm1hdGlvbiBpcywgb2YgY291cnNlLCB0aGUgYEtjb25maWdgIGZpbGUuIFNwZWNpZmljYWxseSwgSSdsbCBqdW1wIGludG8gYGFyY2gveDg2L2t2bS9LY29uZmlnYCB0byBnZXQgdGhlIGxheSBvZiB0aGUgbGFuZC4gVGhhdCdzIHdoZXJlIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIEtWTSBmb3IgeDg2IHN5c3RlbXMgYXJlIGRlZmluZWQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBmaW5lciBkZXRhaWxzLCBhbmQgSSBjYW4gc3RhcnQgZnJvbSB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6ODQ1OCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjQ4LjQ0ODczNTY3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyNzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImFyY2gveDg2L2t2bS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbiAgIDI6XFx0I1xcbiAgIDM6XFx0IyBLVk0gY29uZmlndXJhdGlvblxcbiAgIDQ6XFx0I1xcbiAgIDU6XFx0XFxuICAgNjpcXHRzb3VyY2UgXFxcInZpcnQva3ZtL0tjb25maWdcXFwiXFxuICAgNzpcXHRcXG4gICA4OlxcdG1lbnVjb25maWcgVklSVFVBTElaQVRJT05cXG4gICA5OlxcdFxcdGJvb2wgXFxcIlZpcnR1YWxpemF0aW9uXFxcIlxcbiAgMTA6XFx0XFx0ZGVmYXVsdCB5XFxuICAxMTpcXHRcXHRoZWxwXFxuICAxMjpcXHRcXHQgIFNheSBZIGhlcmUgdG8gZ2V0IHRvIHNlZSBvcHRpb25zIGZvciB1c2luZyB5b3VyIExpbnV4IGhvc3QgdG8gcnVuIG90aGVyXFxuICAxMzpcXHRcXHQgIG9wZXJhdGluZyBzeXN0ZW1zIGluc2lkZSB2aXJ0dWFsIG1hY2hpbmVzIChndWVzdHMpLlxcbiAgMTQ6XFx0XFx0ICBUaGlzIG9wdGlvbiBhbG9uZSBkb2VzIG5vdCBhZGQgYW55IGtlcm5lbCBjb2RlLlxcbiAgMTU6XFx0XFxuICAxNjpcXHRcXHQgIElmIHlvdSBzYXkgTiwgYWxsIG9wdGlvbnMgaW4gdGhpcyBzdWJtZW51IHdpbGwgYmUgc2tpcHBlZCBhbmQgZGlzYWJsZWQuXFxuICAxNzpcXHRcXG4gIDE4OlxcdGlmIFZJUlRVQUxJWkFUSU9OXFxuICAxOTpcXHRcXG4gIDIwOlxcdGNvbmZpZyBLVk1fWDg2XFxuICAyMTpcXHRcXHRkZWZfdHJpc3RhdGUgS1ZNIGlmIChLVk1fSU5URUwgIT0gbiB8fCBLVk1fQU1EICE9IG4pXFxuICAyMjpcXHRcXHRzZWxlY3QgS1ZNX0NPTU1PTlxcbiAgMjM6XFx0XFx0c2VsZWN0IEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcXG4gIDI0OlxcdFxcdHNlbGVjdCBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXFxuICAyNTpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fSVJRQ0hJUFxcbiAgMjY6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX1BGTkNBQ0hFXFxuICAyNzpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fRElSVFlfUklOR19UU09cXG4gIDI4OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9ESVJUWV9SSU5HX0FDUV9SRUxcXG4gIDI5OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9JUlFfQllQQVNTXFxuICAzMDpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fSVJRX1JPVVRJTkdcXG4gIDMxOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9SRUFET05MWV9NRU1cXG4gIDMyOlxcdFxcdHNlbGVjdCBWSE9TVF9UQVNLXFxuICAzMzpcXHRcXHRzZWxlY3QgS1ZNX0FTWU5DX1BGXFxuICAzNDpcXHRcXHRzZWxlY3QgVVNFUl9SRVRVUk5fTk9USUZJRVJcXG4gIDM1OlxcdFxcdHNlbGVjdCBLVk1fTU1JT1xcbiAgMzY6XFx0XFx0c2VsZWN0IFNDSEVEX0lORk9cXG4gIDM3OlxcdFxcdHNlbGVjdCBQRVJGX0VWRU5UU1xcbiAgMzg6XFx0XFx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTXFxuICAzOTpcXHRcXHRzZWxlY3QgUEVSRl9HVUVTVF9NRURJQVRFRF9QTVVcXG4gIDQwOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9NU0lcXG4gIDQxOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9DUFVfUkVMQVhfSU5URVJDRVBUXFxuICA0MjpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fTk9fUE9MTFxcbiAgNDM6XFx0XFx0c2VsZWN0IFZJUlRfWEZFUl9UT19HVUVTVF9XT1JLXFxuICA0NDpcXHRcXHRzZWxlY3QgS1ZNX0dFTkVSSUNfRElSVFlMT0dfUkVBRF9QUk9URUNUXFxuICA0NTpcXHRcXHRzZWxlY3QgS1ZNX1ZGSU9cXG4gIDQ2OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9QTV9OT1RJRklFUiBpZiBQTVxcbiAgNDc6XFx0XFx0c2VsZWN0IEtWTV9HRU5FUklDX0hBUkRXQVJFX0VOQUJMSU5HXFxuICA0ODpcXHRcXHRzZWxlY3QgS1ZNX0dFTkVSSUNfUFJFX0ZBVUxUX01FTU9SWVxcbiAgNDk6XFx0XFx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXFxuICA1MDpcXHRcXHRzZWxlY3QgS1ZNX0dVRVNUX01FTUZEIGlmIFg4Nl82NFxcbiAgNTE6XFx0XFxuICA1MjpcXHRjb25maWcgS1ZNXFxuICA1MzpcXHRcXHR0cmlzdGF0ZSBcXFwiS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSAoS1ZNKSBzdXBwb3J0XFxcIlxcbiAgNTQ6XFx0XFx0ZGVwZW5kcyBvbiBYODZfTE9DQUxfQVBJQ1xcbiAgNTU6XFx0XFx0aGVscFxcbiAgNTY6XFx0XFx0ICBTdXBwb3J0IGhvc3RpbmcgZnVsbHkgdmlydHVhbGl6ZWQgZ3Vlc3QgbWFjaGluZXMgdXNpbmcgaGFyZHdhcmVcXG4gIDU3OlxcdFxcdCAgdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9ucy4gIFlvdSB3aWxsIG5lZWQgYSBmYWlybHkgcmVjZW50XFxuICA1ODpcXHRcXHQgIHByb2Nlc3NvciBlcXVpcHBlZCB3aXRoIHZpcnR1YWxpemF0aW9uIGV4dGVuc2lvbnMuIFlvdSB3aWxsIGFsc29cXG4gIDU5OlxcdFxcdCAgbmVlZCB0byBzZWxlY3Qgb25lIG9yIG1vcmUgb2YgdGhlIHByb2Nlc3NvciBtb2R1bGVzIGJlbG93LlxcbiAgNjA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjQ4LjQ0ODgwOTc3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM0NzIyMDI4MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLVk0gUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHJlbGF0ZWQgdG8gS1ZNLCB3aGljaCBpcywgb2YgY291cnNlLCBmdWxseSB2aXJ0dWFsaXplZCBhbmQgc3VwcG9ydGVkIGluIGJvdGggUUVNVSBhbmQgR29vZ2xlIENvbXB1dGUgRW5naW5lLCBhbmQgaXQncyBzb21ldGhpbmcgdGhhdCBzeXprYWxsZXIgbGlrZWx5IHRlc3RzIGV4dGVuc2l2ZWx5LCBwYXJ0aWN1bGFybHkgY29uY2VybmluZyB0aG9zZSBgL2Rldi9rdm1gIGlvY3Rscy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBjaGFuZ2VzLiBUaGUgZmlyc3Qgc3RlcCwgYXMgYWx3YXlzLCBpcyB0byBpZGVudGlmeSB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zLlxuXG5BbHJpZ2h0LCBoZXJlIHRoZXkgYXJlOiBga3ZtX2dtZW1fYmluZGAgd2l0aGluIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCwgYGt2bV9zZXRfbWVtc2xvdGAgaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAsIGFsc28gaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBNeSBuZXh0IG1vdmU/IEkgbmVlZCB0aGUgZnVsbCBwaWN0dXJlLiBJJ20gZ29pbmcgdG8gcHVsbCB1cCBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIHplcm8gaW4gb24gdGhlIGFyZWEgYXJvdW5kIGxpbmVzIDYxMi02ODAuIFRoYXQnbGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIFdpdGggdGhhdCBjb250ZXh0LCBJJ2xsIGJlIGFibGUgdG8gcXVpY2tseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3Qgb2YgdGhlIHBhdGNoIGFuZCB3aGVyZSB0byBzdGFydCBteSBkZXRhaWxlZCBleGFtaW5hdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY0MCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjUxLjkyMTAxNTU5OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTY3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwNSxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDYwNTpcXHRcXG4gNjA2OlxcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gNjA3OlxcdFxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KVxcbiA2MDg6XFx0e1xcbiA2MDk6XFx0XFx0dW9mZl90IHNpemUgPSBzbG90LVxcdTAwM2VucGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4gNjEwOlxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcXG4gNjExOlxcdFxcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XFxuIDYxMjpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbiA2MTM6XFx0XFx0c3RydWN0IGZpbGUgKmZpbGU7XFxuIDYxNDpcXHRcXHRpbnQgciA9IC1FSU5WQUw7XFxuIDYxNTpcXHRcXHR2b2lkICp4YXI7XFxuIDYxNjpcXHRcXG4gNjE3OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcXG4gNjE4OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVxcdTAwM2VnbWVtLnBnb2ZmKSk7XFxuIDYxOTpcXHRcXG4gNjIwOlxcdFxcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxcbiA2MjE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYyMjpcXHRcXG4gNjIzOlxcdFxcdGZpbGUgPSBmZ2V0KGZkKTtcXG4gNjI0OlxcdFxcdGlmICghZmlsZSlcXG4gNjI1OlxcdFxcdFxcdHJldHVybiAtRUJBREY7XFxuIDYyNjpcXHRcXG4gNjI3OlxcdFxcdGlmIChmaWxlLVxcdTAwM2VmX29wICE9IFxcdTAwMjZrdm1fZ21lbV9mb3BzKVxcbiA2Mjg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYyOTpcXHRcXG4gNjMwOlxcdFxcdGYgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDYzMTpcXHRcXHRpZiAoZi1cXHUwMDNla3ZtICE9IGt2bSlcXG4gNjMyOlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2MzM6XFx0XFxuIDYzNDpcXHRcXHRpbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XFxuIDYzNTpcXHRcXG4gNjM2OlxcdFxcdGlmICghUEFHRV9BTElHTkVEKG9mZnNldCkgfHwgb2Zmc2V0ICsgc2l6ZSBcXHUwMDNlIGlfc2l6ZV9yZWFkKGlub2RlKSlcXG4gNjM3OlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2Mzg6XFx0XFxuIDYzOTpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfbG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjQwOlxcdFxcbiA2NDE6XFx0XFx0c3RhcnQgPSBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gNjQyOlxcdFxcdGVuZCA9IHN0YXJ0ICsgc2xvdC1cXHUwMDNlbnBhZ2VzO1xcbiA2NDM6XFx0XFxuIDY0NDpcXHRcXHRpZiAoIXhhX2VtcHR5KFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncykgXFx1MDAyNlxcdTAwMjZcXG4gNjQ1OlxcdFxcdCAgICB4YV9maW5kKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgXFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xcbiA2NDY6XFx0XFx0XFx0ciA9IC1FRVhJU1Q7XFxuIDY0NzpcXHRcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDY0OTpcXHRcXHR9XFxuIDY1MDpcXHRcXG4gNjUxOlxcdFxcdC8qXFxuIDY1MjpcXHRcXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxuIDY1MzpcXHRcXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbiA2NTQ6XFx0XFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXFxuIDY1NTpcXHRcXHQgKi9cXG4gNjU2OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XFxuIDY1NzpcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gc3RhcnQ7XFxuIDY1ODpcXHRcXHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXFxuIDY1OTpcXHRcXHRcXHRzbG90LVxcdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2MDpcXHRcXG4gNjYxOlxcdFxcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xcbiA2NjI6XFx0XFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjYzOlxcdFxcbiA2NjQ6XFx0XFx0LypcXG4gNjY1OlxcdFxcdCAqIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSwgZXZlbiBvbiBzdWNjZXNzLiAgVGhlIGZpbGUgcGlucyBLVk0sXFxuIDY2NjpcXHRcXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxcbiA2Njc6XFx0XFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXFxuIDY2ODpcXHRcXHQgKi9cXG4gNjY5OlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjcwOlxcdFxcdGlmIChyKSB7XFxuIDY3MTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjcyOlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY3MzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjc0OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY3NTpcXHRcXHR9XFxuIDY3NjpcXHRlcnI6XFxuIDY3NzpcXHRcXHRmcHV0KGZpbGUpO1xcbiA2Nzg6XFx0XFx0cmV0dXJuIHI7XFxuIDY3OTpcXHR9XFxuIDY4MDpcXHRcXG4gNjgxOlxcdHN0YXRpYyB2b2lkIF9fa3ZtX2dtZW1fdW5iaW5kKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsIHN0cnVjdCBnbWVtX2ZpbGUgKmYpXFxuIDY4MjpcXHR7XFxuIDY4MzpcXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gc2xvdC1cXHUwMDNlZ21lbS5wZ29mZjtcXG4gNjg0OlxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBzbG90LVxcdTAwM2VucGFnZXM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjUxLjkyMTExNjk3OFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTE5MDk0NTI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqRGlnZ2luZyBpbnRvIE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqXG5cbk9rYXksIHNvIHdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgbWVtb3J5IHJlZ2lvbnMgYXJlIGJlaW5nIHNldCB1cCBhbmQgbWFuYWdlZCB3aXRoaW4gS1ZNLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byB6ZXJvIGluIG9uIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCBiZWNhdXNlIHRoYXQncyB1c3VhbGx5IHRoZSBoZWFydCBvZiB0aGUgY29yZSBLVk0gbG9naWMuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgYXJvdW5kIGBrdm1fc2V0X21lbXNsb3RgIGFuZCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBnb2luZyB0byBiZSBjcml0aWNhbCBmb3IgdHJhY2tpbmcgaG93IG1lbW9yeSBpcyBhbGxvY2F0ZWQsIG1hcHBlZCwgYW5kIHBvdGVudGlhbGx5IHJlbWFwcGVkIHdpdGhpbiB0aGUgZ3Vlc3QncyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuIEknbGwgbmVlZCB0byBzZWUgaG93IHRoZSBob3N0IG1hcHMgdGhlIGd1ZXN0J3MgcGh5c2ljYWwgbWVtb3J5LCBhbmQgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGh5cGVydmlzb3IncyB2aWV3IGFuZCB0aGUgaGFyZHdhcmUuIExldCdzIHNlZSBob3cgdGhlc2UgYXJlIGNhbGxlZCwgd2hhdCBkYXRhIHN0cnVjdHVyZXMgdGhleSBtYW5pcHVsYXRlLCBhbmQgd2hhdCBpbXBsaWNhdGlvbnMgdGhvc2UgbWFuaXB1bGF0aW9ucyBoYXZlIG9uIHRoZSBvdmVyYWxsIG1lbW9yeSBvcmdhbml6YXRpb24uIEhvcGVmdWxseSwgbG9va2luZyBhdCB0aGVzZSBmdW5jdGlvbnMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBoYW5kbGVkIGF0IHRoZSBLVk0gbGV2ZWwsIGVzcGVjaWFsbHkgd2hlbiBjb25zaWRlcmluZyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBob3RwbHVnZ2luZyBzY2VuYXJpb3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzgzLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0Mzo1NC4wNDAyMTUyNzVaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk1NzgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkyMCxcbiAgXCJMaW5lQ291bnRcIjogODVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkyMDpcXHRcXHQgKlxcbjE5MjE6XFx0XFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcXG4xOTIyOlxcdFxcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcXG4xOTIzOlxcdFxcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cXG4xOTI0OlxcdFxcdCAqL1xcbjE5MjU6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5MjY6XFx0XFx0XFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4xOTI3OlxcdFxcdFxcdGlmICghaW52YWxpZF9zbG90KSB7XFxuMTkyODpcXHRcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4xOTI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjE5MzA6XFx0XFx0XFx0fVxcbjE5MzE6XFx0XFx0XFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTMyOlxcdFxcdH1cXG4xOTMzOlxcdFxcbjE5MzQ6XFx0XFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTM1OlxcdFxcdGlmIChyKVxcbjE5MzY6XFx0XFx0XFx0Z290byBlcnI7XFxuMTkzNzpcXHRcXG4xOTM4OlxcdFxcdGlmIChuZXcgXFx1MDAyNlxcdTAwMjYgbmV3LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4xOTM5OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbjE5NDA6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQxOlxcdFxcbjE5NDI6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4xOTQzOlxcdFxcdFxcdGlmIChyKVxcbjE5NDQ6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQ1OlxcdFxcdH1cXG4xOTQ2OlxcdFxcbjE5NDc6XFx0XFx0LypcXG4xOTQ4OlxcdFxcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxcbjE5NDk6XFx0XFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xcbjE5NTA6XFx0XFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXFxuMTk1MTpcXHRcXHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxcbjE5NTI6XFx0XFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXFxuMTk1MzpcXHRcXHQgKi9cXG4xOTU0OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcXG4xOTU1OlxcdFxcdFxcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XFxuMTk1NjpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcXG4xOTU3OlxcdFxcdFxcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTU4OlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcXG4xOTU5OlxcdFxcdFxcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcXG4xOTYwOlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcXG4xOTYxOlxcdFxcdFxcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xOTYyOlxcdFxcdGVsc2VcXG4xOTYzOlxcdFxcdFxcdEJVRygpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cXG4xOTY2OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk2NzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5Njg6XFx0XFxuMTk2OTpcXHRcXHQvKlxcbjE5NzA6XFx0XFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcXG4xOTcxOlxcdFxcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxcbjE5NzI6XFx0XFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXFx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxcbjE5NzM6XFx0XFx0ICovXFxuMTk3NDpcXHRcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTc1OlxcdFxcbjE5NzY6XFx0XFx0cmV0dXJuIDA7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdGVycl9iaW5kOlxcbjE5Nzk6XFx0XFx0aWYgKG5ldykge1xcbjE5ODA6XFx0XFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4xOTgxOlxcdFxcbjE5ODI6XFx0XFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuMTk4MzpcXHRcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4xOTg0OlxcdFxcdH1cXG4xOTg1OlxcdGVycjpcXG4xOTg2OlxcdFxcdC8qXFxuMTk4NzpcXHRcXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXFxuMTk4ODpcXHRcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4xOTg5OlxcdFxcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4xOTkwOlxcdFxcdCAqL1xcbjE5OTE6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5OTI6XFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuMTk5MzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5OTQ6XFx0XFx0fSBlbHNlIHtcXG4xOTk1OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbjE5OTY6XFx0XFx0fVxcbjE5OTc6XFx0XFx0cmV0dXJuIHI7XFxuMTk5ODpcXHR9XFxuMTk5OTpcXHRcXG4yMDAwOlxcdHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcXG4yMDAxOlxcdFxcdFxcdFxcdFxcdCAgICAgIGdmbl90IHN0YXJ0LCBnZm5fdCBlbmQpXFxuMjAwMjpcXHR7XFxuMjAwMzpcXHRcXHRzdHJ1Y3Qga3ZtX21lbXNsb3RfaXRlciBpdGVyO1xcbjIwMDQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjU0LjA0MDYxMjc5NVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMzgxOTg3NjkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBLVk0gTWVtb3J5IE1hbmFnZW1lbnQqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBiZWVuIGxvb2tpbmcgYXQgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGluIEtWTSwgYW5kIEkgbmVlZCB0byB6b29tIGluIG9uIGEgc3BlY2lmaWMgYXJlYS4gSSdtIHRoaW5raW5nIHdlIG5lZWQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBkcmlsbCBkb3duIGludG8gdGhlIGNvZGUgYXJvdW5kIGxpbmVzIDIwNTggdG8gMjEzMC4gVGhpcyBzZWN0aW9uIGxpa2VseSBoYW5kbGVzIGEgY3JpdGljYWwgYXNwZWN0IG9mIG1lbW9yeSBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgdmlydHVhbCBtYWNoaW5lIGVudmlyb25tZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQncyBpbnRlcmFjdGluZyB3aXRoIHRoZSBob3N0J3MgcGh5c2ljYWwgbWVtb3J5IGFuZCBob3cgaXQncyBzZXR0aW5nIHVwIHRoZSBtYXBwaW5ncyBmb3IgZ3Vlc3QgYWNjZXNzLiBUaGVyZSBjb3VsZCBiZSBzb21lIHN1YnRsZSBpbXBsaWNhdGlvbnMgaW4gdGhhdCByYW5nZSByZWdhcmRpbmcgbWVtb3J5IGFzc2lnbm1lbnQsIHBlcm1pc3Npb25zLCBvciBldmVuIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaWYgbm90IHByb3Blcmx5IGhhbmRsZWQuIEkgc2hvdWxkIGNoZWNrIHRoYXQgcmVnaW9uIHNwZWNpZmljYWxseSB0byBldmFsdWF0ZSBwb3NzaWJsZSBpc3N1ZXMgcmVsYXRpbmcgdG8gbWVtb3J5IG1hbmFnZW1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMDY3LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0Mzo1Ny40MjI2MDM0MTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzcwNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjA1OCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjA1ODpcXHRcXHQgKiBsb2dnaW5nLCBhbmQgc28gYXJlIGV4ZW1wdC5cXG4yMDU5OlxcdFxcdCAqL1xcbjIwNjA6XFx0XFx0aWYgKGlkIFxcdTAwM2MgS1ZNX1VTRVJfTUVNX1NMT1RTIFxcdTAwMjZcXHUwMDI2XFxuMjA2MTpcXHRcXHQgICAgKG1lbS1cXHUwMDNlbWVtb3J5X3NpemUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCkgXFx1MDAzZSBLVk1fTUVNX01BWF9OUl9QQUdFUylcXG4yMDYyOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIwNjM6XFx0XFxuMjA2NDpcXHRcXHRzbG90cyA9IF9fa3ZtX21lbXNsb3RzKGt2bSwgYXNfaWQpO1xcbjIwNjU6XFx0XFxuMjA2NjpcXHRcXHQvKlxcbjIwNjc6XFx0XFx0ICogTm90ZSwgdGhlIG9sZCBtZW1zbG90IChhbmQgdGhlIHBvaW50ZXIgaXRzZWxmISkgbWF5IGJlIGludmFsaWRhdGVkXFxuMjA2ODpcXHRcXHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxcbjIwNjk6XFx0XFx0ICovXFxuMjA3MDpcXHRcXHRvbGQgPSBpZF90b19tZW1zbG90KHNsb3RzLCBpZCk7XFxuMjA3MTpcXHRcXG4yMDcyOlxcdFxcdGlmICghbWVtLVxcdTAwM2VtZW1vcnlfc2l6ZSkge1xcbjIwNzM6XFx0XFx0XFx0aWYgKCFvbGQgfHwgIW9sZC1cXHUwMDNlbnBhZ2VzKVxcbjIwNzQ6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjA3NTpcXHRcXG4yMDc2OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0Uoa3ZtLVxcdTAwM2Vucl9tZW1zbG90X3BhZ2VzIFxcdTAwM2Mgb2xkLVxcdTAwM2VucGFnZXMpKVxcbjIwNzc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuMjA3ODpcXHRcXG4yMDc5OlxcdFxcdFxcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcXG4yMDgwOlxcdFxcdH1cXG4yMDgxOlxcdFxcbjIwODI6XFx0XFx0YmFzZV9nZm4gPSAobWVtLVxcdTAwM2VndWVzdF9waHlzX2FkZHIgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuMjA4MzpcXHRcXHRucGFnZXMgPSAobWVtLVxcdTAwM2VtZW1vcnlfc2l6ZSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4yMDg0OlxcdFxcbjIwODU6XFx0XFx0aWYgKCFvbGQgfHwgIW9sZC1cXHUwMDNlbnBhZ2VzKSB7XFxuMjA4NjpcXHRcXHRcXHRjaGFuZ2UgPSBLVk1fTVJfQ1JFQVRFO1xcbjIwODc6XFx0XFxuMjA4ODpcXHRcXHRcXHQvKlxcbjIwODk6XFx0XFx0XFx0ICogVG8gc2ltcGxpZnkgS1ZNIGludGVybmFscywgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhY3Jvc3NcXG4yMDkwOlxcdFxcdFxcdCAqIGFsbCBtZW1zbG90cyBtdXN0IGZpdCBpbiBhbiB1bnNpZ25lZCBsb25nLlxcbjIwOTE6XFx0XFx0XFx0ICovXFxuMjA5MjpcXHRcXHRcXHRpZiAoKGt2bS1cXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyArIG5wYWdlcykgXFx1MDAzYyBrdm0tXFx1MDAzZW5yX21lbXNsb3RfcGFnZXMpXFxuMjA5MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4yMDk0OlxcdFxcdH0gZWxzZSB7IC8qIE1vZGlmeSBhbiBleGlzdGluZyBzbG90LiAqL1xcbjIwOTU6XFx0XFx0XFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXFxuMjA5NjpcXHRcXHRcXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxuMjA5NzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4yMDk4OlxcdFxcdFxcdGlmICgobWVtLVxcdTAwM2V1c2Vyc3BhY2VfYWRkciAhPSBvbGQtXFx1MDAzZXVzZXJzcGFjZV9hZGRyKSB8fFxcbjIwOTk6XFx0XFx0XFx0ICAgIChucGFnZXMgIT0gb2xkLVxcdTAwM2VucGFnZXMpIHx8XFxuMjEwMDpcXHRcXHRcXHQgICAgKChtZW0tXFx1MDAzZWZsYWdzIF4gb2xkLVxcdTAwM2VmbGFncykgXFx1MDAyNiAoS1ZNX01FTV9SRUFET05MWSB8IEtWTV9NRU1fR1VFU1RfTUVNRkQpKSlcXG4yMTAxOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIxMDI6XFx0XFxuMjEwMzpcXHRcXHRcXHRpZiAoYmFzZV9nZm4gIT0gb2xkLVxcdTAwM2ViYXNlX2dmbilcXG4yMTA0OlxcdFxcdFxcdFxcdGNoYW5nZSA9IEtWTV9NUl9NT1ZFO1xcbjIxMDU6XFx0XFx0XFx0ZWxzZSBpZiAobWVtLVxcdTAwM2VmbGFncyAhPSBvbGQtXFx1MDAzZWZsYWdzKVxcbjIxMDY6XFx0XFx0XFx0XFx0Y2hhbmdlID0gS1ZNX01SX0ZMQUdTX09OTFk7XFxuMjEwNzpcXHRcXHRcXHRlbHNlIC8qIE5vdGhpbmcgdG8gY2hhbmdlLiAqL1xcbjIxMDg6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjEwOTpcXHRcXHR9XFxuMjExMDpcXHRcXG4yMTExOlxcdFxcdGlmICgoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSBcXHUwMDI2XFx1MDAyNlxcbjIxMTI6XFx0XFx0ICAgIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc2xvdHMsIGlkLCBiYXNlX2dmbiwgYmFzZV9nZm4gKyBucGFnZXMpKVxcbjIxMTM6XFx0XFx0XFx0cmV0dXJuIC1FRVhJU1Q7XFxuMjExNDpcXHRcXG4yMTE1OlxcdFxcdC8qIEFsbG9jYXRlIGEgc2xvdCB0aGF0IHdpbGwgcGVyc2lzdCBpbiB0aGUgbWVtc2xvdC4gKi9cXG4yMTE2OlxcdFxcdG5ldyA9IGt6YWxsb2Nfb2JqKCpuZXcsIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuMjExNzpcXHRcXHRpZiAoIW5ldylcXG4yMTE4OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjIxMTk6XFx0XFxuMjEyMDpcXHRcXHRuZXctXFx1MDAzZWFzX2lkID0gYXNfaWQ7XFxuMjEyMTpcXHRcXHRuZXctXFx1MDAzZWlkID0gaWQ7XFxuMjEyMjpcXHRcXHRuZXctXFx1MDAzZWJhc2VfZ2ZuID0gYmFzZV9nZm47XFxuMjEyMzpcXHRcXHRuZXctXFx1MDAzZW5wYWdlcyA9IG5wYWdlcztcXG4yMTI0OlxcdFxcdG5ldy1cXHUwMDNlZmxhZ3MgPSBtZW0tXFx1MDAzZWZsYWdzO1xcbjIxMjU6XFx0XFx0bmV3LVxcdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cXHUwMDNldXNlcnNwYWNlX2FkZHI7XFxuMjEyNjpcXHRcXG4yMTI3OlxcdFxcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxcbjIxMjg6XFx0XFx0XFx0XFx0ICAgIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcXG4yMTI5OlxcdFxcdGlmIChyKVxcbjIxMzA6XFx0XFx0XFx0Z290byBvdXQ7XFxuMjEzMTpcXHRcXG4yMTMyOlxcdFxcdHJldHVybiAwO1xcbjIxMzM6XFx0XFxuMjEzNDpcXHRvdXQ6XFxuMjEzNTpcXHRcXHRrZnJlZShuZXcpO1xcbjIxMzY6XFx0XFx0cmV0dXJuIHI7XFxuMjEzNzpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjU3LjQyMjk3NjQyN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MzUyMjA1ODU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEtWTSBNZW1vcnkgTWFuYWdlbWVudCBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpc3NlY3QgdGhpcyBwYXRjaC4gSXQgc2VlbXMgd2UncmUgZGVhbGluZyB3aXRoIGEgY29yZSBLVk0gbWVtb3J5IHZpcnR1YWxpemF0aW9uIGVuaGFuY2VtZW50LCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBgZ3Vlc3RfbWVtZmRgIGFuZCBtZW1vcnkgc2xvdHMuIFRoaXMgaW1wYWN0cyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQvdmlydHVhbGl6YXRpb24gbG9naWMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCB0aGUgYC9kZXYva3ZtYCBpbnRlcmZhY2UgdmlhIGBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjJgIGFuZCBgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT05gIGlvY3Rscy5cblxuVGhlIGZpcnN0IGZpbGUsIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCwgaGFzIGEgbmV3IGNoZWNrIHVzaW5nIGBXQVJOX09OX09OQ0VgIGZvciBhIHNwZWNpZmljIG1lbW9yeSBzbG90IGZsYWcgKGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgKS4gSXQgbG9va3MgbGlrZSB3ZSdyZSBoYXJkZW5pbmcgZXJyb3IgaGFuZGxpbmcgaW4gYHhhX3N0b3JlX3JhbmdlYCB3aGVuIHRoaW5ncyBnbyB3cm9uZyBhbmQgcmVzZXR0aW5nIHNvbWUgc2xvdCBkYXRhIGlmIHRoZSB3cml0ZSBmYWlscy4gVGhpcyBjbGVhbi11cCBpcyBpbXBvcnRhbnQuXG5cblRoZW4sIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCByZW9yZGVycyB0aGluZ3MsIG1vdmluZyB0aGUgYGt2bV9nbWVtX2JpbmQoKWAgY2FsbCAqYWZ0ZXIqIGBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKClgIHdpdGhpbiBga3ZtX3NldF9tZW1zbG90KClgLiBUaGVyZSBpcyBhIGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbiBvbiB0aGUgYGNoYW5nZWAgdmFsdWUgd2l0aGluIHRoaXMgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgb25seSBgS1ZNX01SX0NSRUFURWAgaXMgcHJvY2Vzc2VkICh0aGUgcGF0Y2ggYXBwZWFycyB0byBiZSBkZWFsaW5nIHdpdGggdGhlIGNyZWF0aW9uIG9mIHRoZSBtZW1vcnkgcmVnaW9uKS4gRXJyb3IgdW53aW5kaW5nIGluIHRoaXMgc2VjdGlvbiBpcyBub3cgaGFuZGxlZCBieSB0aGUgaW50cm9kdWN0aW9uIG9mIGFuIGBlcnJfYmluZGAgbGFiZWwsIGNhbGxpbmcgYGt2bV9hcmNoX2ZyZWVfbWVtc2xvdGAgYW5kIGBrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXBgLiBUaGlzIGlzIGdvb2QsIGVuc3VyaW5nIHByb3BlciByZXNvdXJjZSByZWxlYXNlIG9uIGZhaWx1cmUuXG5cbkdpdmVuIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlLCB3aXRoIHRoZSBuZXcgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9ucyBhbmQgdGhlIG1vZGlmaWNhdGlvbnMgdG8gYmluZGluZyBzZXF1ZW5jaW5nIGFuZCBlcnJvciBoYW5kbGluZywgdGhpcyBpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyB0byBmdXp6LlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9ucy4gVGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIHNlZW0gdG8gYmUgYEtWTWAsIGBLVk1fR1VFU1RfTUVNRkRgLCBgS1ZNX0lOVEVMYCwgYW5kIGBLVk1fQU1EYC4gSW4gYGFyY2gveDg2L2t2bS9LY29uZmlnYCwgYEtWTWAgd2lsbCBzZWxlY3QgYEtWTV9HVUVTVF9NRU1GRGAgaWYgaXQgaXMgYW4gYFg4Nl82NGAgbWFjaGluZS4gV2UgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBpbiBgdmlydC9rdm0vS2NvbmZpZ2AgYW5kIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgdG8gY29uZmlybSB0aGVzZSBkZXBlbmRlbmNpZXMgYW5kIHRoZSBjb25maWd1cmF0aW9ucy4gYEtWTWAgaXMgdHJpc3RhdGUvYm9vbC4gYEtWTV9HVUVTVF9NRU1GRGAgaXMgYm9vbGVhbiAoc2VsZWN0ZWQgYnkgYEtWTV9YODYgaWYgWDg2XzY0YCkuIExldCdzIGVuc3VyZSB0aGF0IGBDT05GSUdfS1ZNYCBhbmQgYENPTkZJR19LVk1fR1VFU1RfTUVNRkRgIGFyZSBzZXQgYXBwcm9wcmlhdGVseSwgYW5kIGNoZWNrIGZvciBhbnkgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyB0aGF0IG1pZ2h0IGJlIG5lZWRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1ODIsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDowMi43NzUxODUyMzRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1Mzg3NDU4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImFyY2gveDg2L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3g4Ni9rdm0vS2NvbmZpZz0xOD1pZiBWSVJUVUFMSVpBVElPTlxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE5LVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjIwOmNvbmZpZyBLVk1fWDg2XFxuYXJjaC94ODYva3ZtL0tjb25maWctMjEtXFx0ZGVmX3RyaXN0YXRlIEtWTSBpZiAoS1ZNX0lOVEVMICE9IG4gfHwgS1ZNX0FNRCAhPSBuKVxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctNTEtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6NTI6Y29uZmlnIEtWTVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTUzLVxcdHRyaXN0YXRlIFxcXCJLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy02OC1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo2OTpjb25maWcgS1ZNX1dFUlJPUlxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTcwLVxcdGJvb2wgXFxcIkNvbXBpbGUgS1ZNIHdpdGggLVdlcnJvclxcXCJcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTgyLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjgzOmNvbmZpZyBLVk1fU1dfUFJPVEVDVEVEX1ZNXFxuYXJjaC94ODYva3ZtL0tjb25maWctODQtXFx0Ym9vbCBcXFwiRW5hYmxlIHN1cHBvcnQgZm9yIEtWTSBzb2Z0d2FyZS1wcm90ZWN0ZWQgVk1zXFxcIlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctOTUtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6OTY6Y29uZmlnIEtWTV9JTlRFTFxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTk3LVxcdHRyaXN0YXRlIFxcXCJLVk0gZm9yIEludGVsIChhbmQgY29tcGF0aWJsZSkgcHJvY2Vzc29ycyBzdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTA2LVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjEwNzpjb25maWcgS1ZNX0lOVEVMX1BST1ZFX1ZFXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTA4LSAgICAgICAgYm9vbCBcXFwiQ2hlY2sgdGhhdCBndWVzdHMgZG8gbm90IHJlY2VpdmUgI1ZFIGV4Y2VwdGlvbnNcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz0xMjI9Y29uZmlnIFg4Nl9TR1hfS1ZNXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xMzMtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTM0OmNvbmZpZyBLVk1fSU5URUxfVERYXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTM1LVxcdGJvb2wgXFxcIkludGVsIFRydXN0IERvbWFpbiBFeHRlbnNpb25zIChURFgpIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNDUtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTQ2OmNvbmZpZyBLVk1fQU1EXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTQ3LVxcdHRyaXN0YXRlIFxcXCJLVk0gZm9yIEFNRCBwcm9jZXNzb3JzIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNTUtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTU2OmNvbmZpZyBLVk1fQU1EX1NFVlxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE1Ny1cXHRib29sIFxcXCJBTUQgU2VjdXJlIEVuY3J5cHRlZCBWaXJ0dWFsaXphdGlvbiAoU0VWKSBzdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTcyLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjE3Mzpjb25maWcgS1ZNX0lPQVBJQ1xcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE3NC1cXHRib29sIFxcXCJJL08gQVBJQywgUElDLCBhbmQgUElUIGVtdWxhdGlvblxcXCJcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE4Mi1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxODM6Y29uZmlnIEtWTV9TTU1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xODQtXFx0Ym9vbCBcXFwiU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBlbXVsYXRpb25cXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xOTMtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTk0OmNvbmZpZyBLVk1fSFlQRVJWXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTk1LVxcdGJvb2wgXFxcIlN1cHBvcnQgZm9yIE1pY3Jvc29mdCBIeXBlci1WIGVtdWxhdGlvblxcXCJcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTIwNy1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoyMDg6Y29uZmlnIEtWTV9YRU5cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMDktXFx0Ym9vbCBcXFwiU3VwcG9ydCBmb3IgWGVuIGh5cGVyY2FsbCBpbnRlcmZhY2VcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMTYtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MjE3OmNvbmZpZyBLVk1fUFJPVkVfTU1VXFxuYXJjaC94ODYva3ZtL0tjb25maWctMjE4LVxcdGJvb2wgXFxcIlByb3ZlIEtWTSBNTVUgY29ycmVjdG5lc3NcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMjktXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MjMwOmNvbmZpZyBLVk1fRVhURVJOQUxfV1JJVEVfVFJBQ0tJTkdcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMzEtXFx0Ym9vbFxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTIzMi1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoyMzM6Y29uZmlnIEtWTV9NQVhfTlJfVkNQVVNcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMzQtXFx0aW50IFxcXCJNYXhpbXVtIG51bWJlciBvZiB2Q1BVcyBwZXIgS1ZNIGd1ZXN0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDowMy4wMjkwNjQ3NzNaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDMyNTc4NDIxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBBbmFseXNpcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uLiBJdCBsb29rcyBsaWtlIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGVuYWJsZWQgd2hlbiB0YXJnZXRpbmcgeDg2XzY0IGFyY2hpdGVjdHVyZSBhbmQgS1ZNIGlzIGFjdGl2ZSwgbWVhbmluZyBlaXRoZXIgYEtWTWAsIGBLVk1fSU5URUxgLCBvciBgS1ZNX0FNRGAgaXMgc2VsZWN0ZWQuIFNvLCB0aGUgYmFzZSBpcyBzZXQgZm9yIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3IgZnVuY3Rpb25hbGl0eSB3aXRoaW4gS1ZNLlxuXG5Ob3csIGxldCdzIGdldCBpbnRvIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uLiBJJ20gZm9jdXNpbmcgb24gdGhlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGt2bV9nbWVtX2JpbmRgLCBga3ZtX3NldF9tZW1zbG90YCwgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXNlIGFyZSBjb3JlLCB3aWRlbHktdXNlZCBmdW5jdGlvbnMgb3IgaWYgdGhleSdyZSBzcGVjaWZpYyBlbnRyeSBwb2ludHMgdG8gdGhlIGd1ZXN0IG1lbWZkIGxvZ2ljLlxuXG5JdCBsb29rcyBsaWtlIGBrdm1fZ21lbV9iaW5kYCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBiaW5kcyBhIGd1ZXN0IG1lbWZkIGZpbGUgdG8gYSBtZW1vcnkgc2xvdCwgaXQgaXMgdmVyeSBzcGVjaWZpYy4gYGt2bV9zZXRfbWVtc2xvdGAgbWFuYWdlcyBtZW1zbG90IHN0YXRlIGNoYW5nZXMgd2l0aGluIEtWTS4gYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgaXMgb3VyIGVudHJ5IHBvaW50IGZvciBgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT05gIGNhbGxzLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8ga25vdyB3aGVyZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGV4cG9zZWQgYW5kIHVzZWQuIEkgc2VlIHRoYXQgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGFyZSBkZWZpbmVkIGFzIHN0YXRpYyB3aXRoaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLCB3aGlsZSBga3ZtX2dtZW1fYmluZGAgaXMgbm9uLXN0YXRpYy4gVGhpcyBsaWtlbHkgbWVhbnMgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGFyZSBub3QgZGlyZWN0bHkgZXhwb3J0ZWQsIGFuZCBga3ZtX2dtZW1fYmluZGAgaXMuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgY2FsbCBjaGFpbiB0byBlbnN1cmUgbm8gb3RoZXIgY3J1Y2lhbCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZXNlIGFyZSBhY3R1YWxseSBiZWluZyBjYWxsZWQgZnJvbSwgc3VjaCBhcyBpZiBga3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uYCBjYWxscyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5OTYsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MDcuMzU0ODUxNDQzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTM3NzM1MzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia3ZtX3NldF9tZW1vcnlfcmVnaW9uXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmM9MjAwMD1zdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwMTItXFxudmlydC9rdm0va3ZtX21haW4uYzoyMDEzOnN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwMTQtXFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24yICptZW0pXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIxMzk9aW50IGt2bV9zZXRfaW50ZXJuYWxfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIxNDctXFxudmlydC9rdm0va3ZtX21haW4uYzoyMTQ4OlxcdHJldHVybiBrdm1fc2V0X21lbW9yeV9yZWdpb24oa3ZtLCBtZW0pO1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE0OS19XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIxNTI9c3RhdGljIGludCBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0yMTU4LVxcdGd1YXJkKG11dGV4KShcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19sb2NrKTtcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIxNTk6XFx0cmV0dXJuIGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihrdm0sIG1lbSk7XFxudmlydC9rdm0va3ZtX21haW4uYy0yMTYwLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MDcuNTA4NjMyNTM2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU2MzkzNDEwNDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgS1ZNIE1lbW9yeSBNYW5hZ2VtZW50IENvbXBvbmVudHMqKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUuIGBrdm1fZ21lbV9iaW5kYCwgYGt2bV9zZXRfbWVtc2xvdGAsIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCBhbmQgYGt2bV92bV9pb2N0bF9zZXRfbWVtb3J5X3JlZ2lvbmAg4oCTIHRob3NlIGFyZSB0aGUga2V5IHN5bWJvbHMsIHRoZSBoZWFydCBvZiB0aGlzIGFyZWEsIGFzIEkgc3VzcGVjdGVkLiBOb3csIGJlZm9yZSBJIGRlY2xhcmUgdGhpcyBhcyBcImRvbmUsXCIgbGV0J3MganVzdCBtYWtlIHN1cmUgSSdtIG5vdCBtaXNzaW5nIGFueXRoaW5nLiBJIG5lZWQgdG8gZW5zdXJlIGEgY29tcGxldGUgcGljdHVyZSBoZXJlLlxuXG5Pa2F5LCBsZXQgbWUgY2hlY2sgdGhlIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkOiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gTWFrZXMgc2Vuc2UuIEFuZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYXJlIGBLVk1gIGFuZCBgS1ZNX0dVRVNUX01FTUZEYC4gR29vZCwgdGhhdCBsaW5lcyB1cC5cblxuTm93LCB0aW1lIGZvciB0aGUgc2FuaXR5IGNoZWNrLiBGaXJzdCwgcmVhY2hhYmlsaXR5OiB5ZXAsIEtWTSBpb2N0bHMgYXJlIGluZGVlZCBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggYC9kZXYva3ZtYCwgYW5kIGJvdGggZ3Vlc3QgbWVtZmQgYW5kIG1lbW9yeSByZWdpb25zIGFyZSBhY3RpdmVseSBzdXBwb3J0ZWQgaW4gVk1zLiBDaGVjay5cblxuU2Vjb25kLCB3b3J0aCBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBUaGUgcmVmYWN0b3Jpbmcgb2YgbWVtc2xvdCBiaW5kaW5nIGVycm9yIGhhbmRsaW5nLCB0aGUgbW92ZSBvZiBga3ZtX2dtZW1fYmluZGAgaW5zaWRlIGBrdm1fc2V0X21lbXNsb3RgLCBhbmQgdGhlIGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbnMuLi4gYWxsIG9mIHRoYXQgc2NyZWFtcyBwb3RlbnRpYWwgZm9yIGludGVyZXN0aW5nIGZ1enppbmcgdGFyZ2V0cy4gRGVmaW5pdGVseSB3b3J0aCB0aGUgZWZmb3J0LlxuXG5UaGVuLCB0aGUgZm9jdXMgc3ltYm9scyBhcmUgZXhhY3RseSBhcyBleHBlY3RlZC4gVGhleSBhcmU6XG4qICAgYGt2bV9nbWVtX2JpbmRgXG4qICAgYGt2bV9zZXRfbWVtc2xvdGBcbiogICBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYFxuKiAgIGBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25gXG5cbkFuZCB0aGUgZW5hYmxlIGNvbmZpZ3VyYXRpb25zIGFyZSBqdXN0IHdoYXQgSSB0aG91Z2h0LCBuYW1lbHk6XG4qICAgYEtWTWBcbiogICBgS1ZNX0dVRVNUX01FTUZEYFxuXG5ZZXMsIGV2ZXJ5dGhpbmcncyBjbGVhciwgYWNjdXJhdGUsIGFuZCBjb21wbGV0ZS4gVGltZSB0byBjYWxsIGl0LiBMZXQncyB0cmlnZ2VyIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MjYzLCJPdXRwdXRUb2tlbnMiOjE4NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoxMy4xNDc5NzU5NDdaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDIxMzU3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS1ZNXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiLFxuICAgIFwia3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0dVRVNUX01FTUZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia3ZtX2dtZW1fYmluZFwiLFxuICAgIFwia3ZtX3NldF9tZW1zbG90XCIsXG4gICAgXCJrdm1fc2V0X21lbW9yeV9yZWdpb25cIixcbiAgICBcImt2bV92bV9pb2N0bF9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcgbG9naWMgZm9yIGd1ZXN0X21lbWZkLiBJdCBtb3ZlcyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpLCBhZGRzIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucywgYW5kIHVwZGF0ZXMgZXJyb3IgdW53aW5kaW5nIGZvciBtZW1zbG90IGJpbmRpbmcgZmFpbHVyZXMgYW5kIHhhX3N0b3JlX3JhbmdlIGVycm9ycy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIEtWTSBpb2N0bHMgKHN1Y2ggYXMgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yKS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MTMuMjIyMTk3MDA0WiIsIlNlcSI6MjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjc2NzYyNDU0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjEzLjIyMjYzODM0NFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjMyNzY3MTc4NTY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGp1c3RzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgc2VxdWVuY2Ugb2Yga3ZtX2dtZW1fYmluZCgpIHdpdGhpbiBLVk0ncyBtZW1zbG90IHNldHVwIChrdm1fc2V0X21lbXNsb3QoKSkuIFNwZWNpZmljYWxseSwgaXQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgeGFfc3RvcmVfcmFuZ2UoKSwgdW53aW5kcyB0aGUgbWVtc2xvdCBmaWVsZHMgYW5kIHhhcnJheSBiaW5kaW5ncyBvbiBmYWlsdXJlLCBhbmQgbW92ZXMgdGhlIGJpbmQgY2FsbCBhZnRlciBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKCkuXFxuXFxuQWxsIGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0dXJlcyAoc3VjaCBhcyBrdm1fbWVtb3J5X3Nsb3QpIGFyZSB6ZXJvLWFsbG9jYXRlZCB3aXRoIGt6YWxsb2Nfb2JqKCksIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiwgeGFyKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIG5vIGRhdGEgaXMgY29waWVkIHRvIHVzZXJzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQgaW4ga2VybmVsLWludGVybmFsIHN0YXRlLiBBcyB0aGlzIGNoYW5nZSBkZWFscyBzdHJpY3RseSB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBjbGVhbnVwIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlcywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQgYW5kIHN0YW5kYXJkIEtBU0FOIHRlc3RpbmcgaXMgc3VmZmljaWVudC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwNzExNTUzNmJjMjdmZDJjNzAxYjUxNzgyZjhmYjJiNmY2MjljMDFkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxNTo0MzoxOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCBiNTk2NDg2ZDE4NGNhLi4zMjMxNTljOWI1ZjM0IDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuKysrIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTYxMiwxMCArNjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbitcdHZvaWQgKnhhcjtcbiBcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVx1MDAzZWdtZW0ucGdvZmYpKTtcbiBcbitcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRmaWxlID0gZmdldChmZCk7XG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG5AQCAtNjQ5LDEyICs2NTMsMTIgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbiBcdCAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLlxuIFx0ICovXG4tXHRXUklURV9PTkNFKHNsb3QtXHUwMDNlZ21lbS5maWxlLCBmaWxlKTtcbitcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbitcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiBcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiBcbiBcdC8qXG5AQCAtNjYyLDcgKzY2NiwxMyBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gXHQgKi9cbi1cdHIgPSAwO1xuK1x0ciA9IHhhX2lzX2Vycih4YXIpID8geGFfZXJyKHhhcikgOiAwO1xuK1x0aWYgKHIpIHtcbitcdFx0eGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpO1xuK1x0XHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XG4rXHRcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IDA7XG4rXHRcdHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuK1x0fVxuIGVycjpcbiBcdGZwdXQoZmlsZSk7XG4gXHRyZXR1cm4gcjtcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uY1xuaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmNcbisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbkBAIC0xODg3LDcgKzE4ODcsOCBAQCBzdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXG4gXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbmV3LFxuLVx0XHRcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpXG4rXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbitcdFx0XHQgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KVxuIHtcbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcbiBcdGludCByO1xuQEAgLTE5MzEsMjAgKzE5MzIsMTYgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0fVxuIFxuIFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbi1cdGlmIChyKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vXG4tXHRcdCAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZFxuLVx0XHQgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc29cbi1cdFx0ICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4tXHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4tXHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4tXHRcdH1cbi1cdFx0cmV0dXJuIHI7XG4rXHRpZiAocilcbitcdFx0Z290byBlcnI7XG4rXG4rXHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbitcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbitcbitcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbitcdFx0aWYgKHIpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICsxOTc0LDI3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuIFxuIFx0cmV0dXJuIDA7XG4rXG4rZXJyX2JpbmQ6XG4rXHRpZiAobmV3KSB7XG4rXHRcdGt2bV9hcmNoX2ZyZWVfbWVtc2xvdChrdm0sIG5ldyk7XG4rXG4rXHRcdGlmIChuZXctXHUwMDNlZGlydHlfYml0bWFwIFx1MDAyNlx1MDAyNiAoIW9sZCB8fCAhb2xkLVx1MDAzZWRpcnR5X2JpdG1hcCkpXG4rXHRcdFx0a3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7XG4rXHR9XG4rZXJyOlxuK1x0LypcbitcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbitcdCAqIHJlcXVpcmVkIHNpbmNlIHRoZSBvcmlnaW5hbCBzbG90IHdhcyBwcmVzZXJ2ZWQgaW4gdGhlIGluYWN0aXZlIHNsb3RzLlxuK1x0ICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxuK1x0ICovXG4rXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4rXHRcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xuK1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuK1x0fSBlbHNlIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuK1x0fVxuK1x0cmV0dXJuIHI7XG4gfVxuIFxuIHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcbkBAIC0yMDU4LDcgKzIwNzYsNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRcdGlmIChXQVJOX09OX09OQ0Uoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgXHUwMDNjIG9sZC1cdTAwM2VucGFnZXMpKVxuIFx0XHRcdHJldHVybiAtRUlPO1xuIFxuLVx0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTtcbitcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSArMjEyMywxNCBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuIFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuIFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuLVx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuLVx0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbi1cdFx0aWYgKHIpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHR9XG4gXG4tXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4rXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSxcbitcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4rXHRcdGdvdG8gb3V0O1xuIFxuIFx0cmV0dXJuIDA7XG4gXG4tb3V0X3VuYmluZDpcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4tXHRcdGt2bV9nbWVtX3VuYmluZChuZXcpO1xuIG91dDpcbiBcdGtmcmVlKG5ldyk7XG4gXHRyZXR1cm4gcjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjEzLjIyMjYzOTIyNFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3OTc4NzQ2NzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV2YWx1YXRpbmcgdGhlIEtWTSBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgTmVlZHMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIHBhdGNoIHNlcmllcyBuZWNlc3NpdGF0ZXMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLCBvciBpZiB3ZSdyZSBnb29kIHdpdGggdGhlIHN0YW5kYXJkIEtBU0FOL0xPQ0tERVAvYnVnIGRldGVjdG9yIGFwcHJvYWNoLiBMZXQncyBkaXZlIGluLlxuXG5GaXJzdCwgSSBzZWUgdGhlIHBhdGNoZXMgdG91Y2ggYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIFRoYXQgZ2l2ZXMgbWUgYSBzdGFydGluZyBwb2ludC4gTGV0J3MgYnJlYWsgaXQgZG93bjpcblxuSW4gYGd1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYGt2bV9nbWVtX2JpbmRgOiBpdCBsb29rcyBsaWtlIHdlJ3ZlIGdvdCBhIGBXQVJOX09OX09OQ0VgIGlmIGBzbG90LVx1MDAzZWZsYWdzYCBoYXMgYEtWTV9NRU1TTE9UX0dNRU1fT05MWWAgc2V0LiBJbnRlcmVzdGluZy4gVGhlbiB0aGVyZSBpcyBhbiBlcnJvciBjaGVjayBmb2xsb3dpbmcgYHhhX3N0b3JlX3JhbmdlYCB3aGljaCByb2xscyBiYWNrIG9uIGVycm9yLCBjbGVhcmluZyBzb21lIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIGdtZW0gYW5kIGhhbmRsaW5nIG1lbW9yeSBzbG90IGZsYWdzLiBUaGUgb3JpZ2luYWwgcGF0Y2ggdXNlcyBgV1JJVEVfT05DRWAgdG8gc2V0IHRoZSBnbWVtIGZpbGUgYW5kIGhhcyBub3cgYmVlbiByZXBsYWNlZCB3aXRoIGEgZGlyZWN0IGFzc2lnbm1lbnQuIEknbGwgbmVlZCB0byBkb3VibGUtY2hlY2sgd2h5IHRoYXQgY2hhbmdlIHdhcyBtYWRlLlxuXG5PdmVyIGluIGBrdm1fbWFpbi5jYCwgYGt2bV9zZXRfbWVtc2xvdGAgaGFzIGFkZGVkIG5ldyBwYXJhbWV0ZXJzLCBgZ21lbV9mZGAgYW5kIGBnbWVtX29mZnNldGAuIEFuZCBpdCBsb29rcyBsaWtlIGBrdm1fZ21lbV9iaW5kYCBoYXMgYmVlbiBtb3ZlZCBmcm9tIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGludG8gYGt2bV9zZXRfbWVtc2xvdGAuICBFcnJvciB1bndpbmRpbmcgaXMgaW4gcGxhY2UgaWYgYGt2bV9nbWVtX2JpbmRgIGZhaWxzLCB3aGljaCBpbmNsdWRlcyByZWxlYXNpbmcgbWVtb3J5IHNsb3RzIGFuZCBkZXN0cm95aW5nIHRoZSBkaXJ0eSBiaXRtYXAsIGlmIG5lY2Vzc2FyeS4gQW5kIGZpbmFsbHksIGluIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCB0aGUgcGF0Y2ggcGFzc2VzIHRoZSBtZW1mZCBwYXJhbWV0ZXJzIHRvIGBrdm1fc2V0X21lbXNsb3RgIGFuZCByZW1vdmVzIHRoZSBvbGQgYmluZGluZyBsb2dpYy5cblxuTm93LCBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gVGltZSB0byBmaXJlIHVwIG15IHRydXN0eSB0b29scyDigJMgcmVhZC1maWxlIG9yIGdyZXBwZXIg4oCTIGFuZCByZWFsbHkgZGlnIGludG8gdGhlIGNvZGUuIEknbGwgYmUgbG9va2luZyBmb3IgYW55IGNsdWVzIHRoYXQgY291bGQgaW5kaWNhdGUgc29tZXRoaW5nIG5ldyB0byBmdXp6LCBvciBpZiB0aGlzIGNoYW5nZSBpcyBqdXN0IG1vdmluZyBzb21lIGxvZ2ljIGFyb3VuZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDAxNSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjIxLjIwMTM5MDEwNVoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc4MTIwNDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia3ZtX2dtZW1fYmluZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTU5Mj1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjYwNjppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02MDctXFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYzo2NTM6XFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1NC1cXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTA9aW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKTtcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjExOmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KTtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTk9c3RhdGljIGlubGluZSB2b2lkIGt2bV9nbWVtX2V4aXQodm9pZCkge307XFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoyMDpzdGF0aWMgaW5saW5lIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5NDI6XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE5NDMtXFx0XFx0aWYgKHIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjIxLjI0OTIwNDUxM1oiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTg1MjU4NzI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIHRleHQsIHN1bW1hcml6ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbiBhcyBpZiB0aGV5IHdlcmUgbXkgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIEtWTSBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGUgZ3V0cyBvZiBLVk0ncyBndWVzdCBtZW1vcnkgbWFuYWdlbWVudC4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgaXMgYWN0dWFsbHkgYm91bmQgdG8gZ3Vlc3QgcHJvY2Vzc2VzIHVzaW5nIG1lbWZkcy4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYSBmb3Igc2VjdXJpdHkgYW5kIHBlcmZvcm1hbmNlLCBzbyBJIHdhbnQgYSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVyYWN0aW9ucyBpbnZvbHZlZC5cblxuVGhlbiwgdG8gcHV0IGl0IGludG8gdGhlIHdpZGVyIGNvbnRleHQgb2YgaG93IHRoaXMgbWVtb3J5IGdldHMgc2V0IHVwIGluaXRpYWxseSwgSSdsbCBuZWVkIHRvIGp1bXAgb3ZlciB0byBgdmlydC9rdm0va3ZtX21haW4uY2AgYW5kIHRha2UgYSBjbG9zZSBsb29rIGF0IGJvdGggYGt2bV9nbWVtX2JpbmRgIGFuZCBob3cgYGt2bV9zZXRfbWVtc2xvdGAgd29ya3MuIFVuZGVyc3RhbmRpbmcgaG93IG1lbXNsb3RzIGFyZSBjb25maWd1cmVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1lbWZkIGJpbmRpbmcgaXMgZXNzZW50aWFsIHRvIGdyYXNwaW5nIHRoZSBjb21wbGV0ZSBtZW1vcnkgbWFwcGluZyBwaWN0dXJlLiBJJ20gdGhpbmtpbmcgSSdsbCB0cmFjZSBkYXRhIGZsb3cgYW5kIGNvbnRyb2wgcGF0aHMgdG8gYnVpbGQgYSBtZW50YWwgbWFwIG9mIHRoZSBwcm9jZXNzLCBsb29raW5nIGZvciBhbnkgb3B0aW1pemF0aW9uIGJvdHRsZW5lY2tzIG9yIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyBhcyBJIGdvLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NjE2LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MjMuNDM0NDY2ODM3WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDg0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwNSxcbiAgXCJMaW5lQ291bnRcIjogNzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDYwNTpcXHRcXG4gNjA2OlxcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gNjA3OlxcdFxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KVxcbiA2MDg6XFx0e1xcbiA2MDk6XFx0XFx0dW9mZl90IHNpemUgPSBzbG90LVxcdTAwM2VucGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4gNjEwOlxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcXG4gNjExOlxcdFxcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XFxuIDYxMjpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbiA2MTM6XFx0XFx0c3RydWN0IGZpbGUgKmZpbGU7XFxuIDYxNDpcXHRcXHRpbnQgciA9IC1FSU5WQUw7XFxuIDYxNTpcXHRcXHR2b2lkICp4YXI7XFxuIDYxNjpcXHRcXG4gNjE3OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcXG4gNjE4OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVxcdTAwM2VnbWVtLnBnb2ZmKSk7XFxuIDYxOTpcXHRcXG4gNjIwOlxcdFxcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxcbiA2MjE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYyMjpcXHRcXG4gNjIzOlxcdFxcdGZpbGUgPSBmZ2V0KGZkKTtcXG4gNjI0OlxcdFxcdGlmICghZmlsZSlcXG4gNjI1OlxcdFxcdFxcdHJldHVybiAtRUJBREY7XFxuIDYyNjpcXHRcXG4gNjI3OlxcdFxcdGlmIChmaWxlLVxcdTAwM2VmX29wICE9IFxcdTAwMjZrdm1fZ21lbV9mb3BzKVxcbiA2Mjg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYyOTpcXHRcXG4gNjMwOlxcdFxcdGYgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDYzMTpcXHRcXHRpZiAoZi1cXHUwMDNla3ZtICE9IGt2bSlcXG4gNjMyOlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2MzM6XFx0XFxuIDYzNDpcXHRcXHRpbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XFxuIDYzNTpcXHRcXG4gNjM2OlxcdFxcdGlmICghUEFHRV9BTElHTkVEKG9mZnNldCkgfHwgb2Zmc2V0ICsgc2l6ZSBcXHUwMDNlIGlfc2l6ZV9yZWFkKGlub2RlKSlcXG4gNjM3OlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2Mzg6XFx0XFxuIDYzOTpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfbG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjQwOlxcdFxcbiA2NDE6XFx0XFx0c3RhcnQgPSBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gNjQyOlxcdFxcdGVuZCA9IHN0YXJ0ICsgc2xvdC1cXHUwMDNlbnBhZ2VzO1xcbiA2NDM6XFx0XFxuIDY0NDpcXHRcXHRpZiAoIXhhX2VtcHR5KFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncykgXFx1MDAyNlxcdTAwMjZcXG4gNjQ1OlxcdFxcdCAgICB4YV9maW5kKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgXFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xcbiA2NDY6XFx0XFx0XFx0ciA9IC1FRVhJU1Q7XFxuIDY0NzpcXHRcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDY0OTpcXHRcXHR9XFxuIDY1MDpcXHRcXG4gNjUxOlxcdFxcdC8qXFxuIDY1MjpcXHRcXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxuIDY1MzpcXHRcXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbiA2NTQ6XFx0XFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXFxuIDY1NTpcXHRcXHQgKi9cXG4gNjU2OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XFxuIDY1NzpcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gc3RhcnQ7XFxuIDY1ODpcXHRcXHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXFxuIDY1OTpcXHRcXHRcXHRzbG90LVxcdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2MDpcXHRcXG4gNjYxOlxcdFxcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xcbiA2NjI6XFx0XFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjYzOlxcdFxcbiA2NjQ6XFx0XFx0LypcXG4gNjY1OlxcdFxcdCAqIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSwgZXZlbiBvbiBzdWNjZXNzLiAgVGhlIGZpbGUgcGlucyBLVk0sXFxuIDY2NjpcXHRcXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxcbiA2Njc6XFx0XFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXFxuIDY2ODpcXHRcXHQgKi9cXG4gNjY5OlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjcwOlxcdFxcdGlmIChyKSB7XFxuIDY3MTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjcyOlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY3MzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjc0OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY3NTpcXHRcXHR9XFxuIDY3NjpcXHRlcnI6XFxuIDY3NzpcXHRcXHRmcHV0KGZpbGUpO1xcbiA2Nzg6XFx0XFx0cmV0dXJuIHI7XFxuIDY3OTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjIzLjQzNDYwMzkxN1oiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTU0NDAyNTY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipEaXZpbmcgaW50byBLVk0gQ29yZTogQSBUYXJnZXRlZCBMb29rKipcblxuT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkndmUgZ290IGEgaHVuY2gsIGFuZCBJIG5lZWQgdG8gdmVyaWZ5IGl0IGluIHRoZSBLVk0gY29kZWJhc2UuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIGZvY3VzIG15IGF0dGVudGlvbiBvbiBgdmlydC9rdm0va3ZtX21haW4uY2AuIE15IGd1dCBzYXlzIHRoYXQgdGhlIGxvZ2ljIEknbSBpbnRlcmVzdGVkIGluIGlzIGxpa2VseSB3aXRoaW4gdGhlIHZpY2luaXR5IG9mIGxpbmVzIDE4ODcgdG8gMjEzNS4gVGhpcyByYW5nZSBwcm9iYWJseSBlbmNhcHN1bGF0ZXMgdGhlIGNyaXRpY2FsIGNvZGUgSSBuZWVkIHRvIHNjcnV0aW5pemUuIEknbSBub3QgZ29pbmcgaW4gYmxpbmQ7IEkgaGF2ZSBhIHNwZWNpZmljIGNvbmNlcHQgSSdtIGNoYXNpbmcuIExldCdzIHNlZSBpZiB0aG9zZSBsaW5lcyBob2xkIHRoZSBrZXkuIEkgZXhwZWN0IEkgd2lsbCBiZSBkaWdnaW5nIGludG8gdGhlIGZpbmVyIGRldGFpbHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoaXMgc2VjdGlvbiB0byBmaW5kIHdoYXQgSSBuZWVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTQzLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoyNS41ODkwMTI3ODNaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg5MjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkyMDpcXHRcXHQgKlxcbjE5MjE6XFx0XFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcXG4xOTIyOlxcdFxcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcXG4xOTIzOlxcdFxcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cXG4xOTI0OlxcdFxcdCAqL1xcbjE5MjU6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5MjY6XFx0XFx0XFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4xOTI3OlxcdFxcdFxcdGlmICghaW52YWxpZF9zbG90KSB7XFxuMTkyODpcXHRcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4xOTI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjE5MzA6XFx0XFx0XFx0fVxcbjE5MzE6XFx0XFx0XFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTMyOlxcdFxcdH1cXG4xOTMzOlxcdFxcbjE5MzQ6XFx0XFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTM1OlxcdFxcdGlmIChyKVxcbjE5MzY6XFx0XFx0XFx0Z290byBlcnI7XFxuMTkzNzpcXHRcXG4xOTM4OlxcdFxcdGlmIChuZXcgXFx1MDAyNlxcdTAwMjYgbmV3LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4xOTM5OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbjE5NDA6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQxOlxcdFxcbjE5NDI6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4xOTQzOlxcdFxcdFxcdGlmIChyKVxcbjE5NDQ6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQ1OlxcdFxcdH1cXG4xOTQ2OlxcdFxcbjE5NDc6XFx0XFx0LypcXG4xOTQ4OlxcdFxcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxcbjE5NDk6XFx0XFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xcbjE5NTA6XFx0XFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXFxuMTk1MTpcXHRcXHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxcbjE5NTI6XFx0XFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXFxuMTk1MzpcXHRcXHQgKi9cXG4xOTU0OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcXG4xOTU1OlxcdFxcdFxcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XFxuMTk1NjpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcXG4xOTU3OlxcdFxcdFxcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTU4OlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcXG4xOTU5OlxcdFxcdFxcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcXG4xOTYwOlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcXG4xOTYxOlxcdFxcdFxcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xOTYyOlxcdFxcdGVsc2VcXG4xOTYzOlxcdFxcdFxcdEJVRygpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cXG4xOTY2OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk2NzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5Njg6XFx0XFxuMTk2OTpcXHRcXHQvKlxcbjE5NzA6XFx0XFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcXG4xOTcxOlxcdFxcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxcbjE5NzI6XFx0XFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXFx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxcbjE5NzM6XFx0XFx0ICovXFxuMTk3NDpcXHRcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTc1OlxcdFxcbjE5NzY6XFx0XFx0cmV0dXJuIDA7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdGVycl9iaW5kOlxcbjE5Nzk6XFx0XFx0aWYgKG5ldykge1xcbjE5ODA6XFx0XFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4xOTgxOlxcdFxcbjE5ODI6XFx0XFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuMTk4MzpcXHRcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4xOTg0OlxcdFxcdH1cXG4xOTg1OlxcdGVycjpcXG4xOTg2OlxcdFxcdC8qXFxuMTk4NzpcXHRcXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXFxuMTk4ODpcXHRcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4xOTg5OlxcdFxcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4xOTkwOlxcdFxcdCAqL1xcbjE5OTE6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5OTI6XFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuMTk5MzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5OTQ6XFx0XFx0fSBlbHNlIHtcXG4xOTk1OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbjE5OTY6XFx0XFx0fVxcbjE5OTc6XFx0XFx0cmV0dXJuIHI7XFxuMTk5ODpcXHR9XFxuMTk5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MjUuNTg5NTAzOTEzWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQyODM3ODQ4OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aGlua2luZyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIEtWTSBNZW1vcnkgTWFuYWdlbWVudCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYXJlIGJlaW5nIHVzZWQuIFRoZXNlIGFyZSBjcml0aWNhbCBmdW5jdGlvbnMgaW4gS1ZNIGZvciBtYW5hZ2luZyB0aGUgdmlydHVhbCBtYWNoaW5lJ3MgbWVtb3J5LCByaWdodD8gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBjYWxscyB0byB0aGVzZSBmdW5jdGlvbnMgdG8gdW5kZXJzdGFuZCAqd2hvKiBpcyBzZXR0aW5nIHVwIG1lbW9yeSwgKndoZW4qIGluIHRoZSBWTSBsaWZlY3ljbGUsIGFuZCAqaG93KiB0aGUgbWVtb3J5IGlzIGJlaW5nIGNvbmZpZ3VyZWQuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGluaXRpYWwgc2V0dXAsIGR5bmFtaWMgYWRkaXRpb24vcmVtb3ZhbCBvZiBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBLbm93aW5nIHRoZSBjYWxsZXIgZnVuY3Rpb25zIHdpbGwgcHJvdmlkZSBjb250ZXh0LiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhleSdyZSBpbnZva2VkIGR1cmluZyBndWVzdCBzdGFydHVwLCBob3RwbHVnIG9wZXJhdGlvbnMsIG9yIHBlcmhhcHMgYnkgc29tZSBmb3JtIG9mIG1lbW9yeSBiYWxsb29uaW5nLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgdXNlIGNhc2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NjcxLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoyOS44NzMyOTE2NjZaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MjczNTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImt2bV9zZXRfbWVtc2xvdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9rdm1fbWFpbi5jPTE2MDE9c3RhdGljIHZvaWQga3ZtX3N3YXBfYWN0aXZlX21lbXNsb3RzKHN0cnVjdCBrdm0gKmt2bSwgaW50IGFzX2lkKVxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0xNjI4LVxcdC8qXFxudmlydC9rdm0va3ZtX21haW4uYzoxNjI5OlxcdCAqIEFjcXVpcmVkIGluIGt2bV9zZXRfbWVtc2xvdC4gTXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgc3luY2hyb25pemVcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE2MzAtXFx0ICogU1JDVSBiZWxvdyBpbiBvcmRlciB0byBhdm9pZCBkZWFkbG9jayB3aXRoIGFub3RoZXIgdGhyZWFkXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE4NzQ9c3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTg4Ni1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE4ODc6c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTg4OC1cXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIwMTM9c3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0yMDY3LVxcdCAqIE5vdGUsIHRoZSBvbGQgbWVtc2xvdCAoYW5kIHRoZSBwb2ludGVyIGl0c2VsZiEpIG1heSBiZSBpbnZhbGlkYXRlZFxcbnZpcnQva3ZtL2t2bV9tYWluLmM6MjA2ODpcXHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA2OS1cXHQgKi9cXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA3OC1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIwNzk6XFx0XFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA4MC1cXHR9XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIxMjYtXFxudmlydC9rdm0va3ZtX21haW4uYzoyMTI3OlxcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjEyOC1cXHRcXHRcXHQgICAgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoyOS45MjA1NzA4MDRaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjM1ODQyOTcxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGF0IDIwMTMtMjE0MCByYW5nZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgYG5ld2AgdmFyaWFibGUsIGJlY2F1c2UgdGhhdCdzIHdoZXJlIHRoaW5ncyBjYW4gb2Z0ZW4gZ28gc2lkZXdheXMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMgY29ycmVjdGx5LiBNeSBleHBlcmllbmNlIHNheXMgdGhhdCBpcyB0aGUgbW9zdCBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgaW4gdGhlc2Uga2luZHMgb2Ygcm91dGluZXMsIHNvIGxldCdzIHN0YXJ0IHRoZXJlLiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBwYWdlIHRhYmxlcyBhbmQgbWVtb3J5IG1hcHBpbmcuIExldCdzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgbWlzdGFrZXMgaW4gdGhlIGxvZ2ljLCBvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBpZiB0aGlzIGlzIG11bHRpdGhyZWFkZWQuIEdvdHRhIGJlIG1ldGhvZGljYWwgaGVyZSBhbmQgYXZvaWQgYW55IGFzc3VtcHRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDg5LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MzIuMjc5MDAzMzUxWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9rdm1fbWFpbi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwODAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwODA6XFx0XFx0fVxcbjIwODE6XFx0XFxuMjA4MjpcXHRcXHRiYXNlX2dmbiA9IChtZW0tXFx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4yMDgzOlxcdFxcdG5wYWdlcyA9IChtZW0tXFx1MDAzZW1lbW9yeV9zaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpO1xcbjIwODQ6XFx0XFxuMjA4NTpcXHRcXHRpZiAoIW9sZCB8fCAhb2xkLVxcdTAwM2VucGFnZXMpIHtcXG4yMDg2OlxcdFxcdFxcdGNoYW5nZSA9IEtWTV9NUl9DUkVBVEU7XFxuMjA4NzpcXHRcXG4yMDg4OlxcdFxcdFxcdC8qXFxuMjA4OTpcXHRcXHRcXHQgKiBUbyBzaW1wbGlmeSBLVk0gaW50ZXJuYWxzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFjcm9zc1xcbjIwOTA6XFx0XFx0XFx0ICogYWxsIG1lbXNsb3RzIG11c3QgZml0IGluIGFuIHVuc2lnbmVkIGxvbmcuXFxuMjA5MTpcXHRcXHRcXHQgKi9cXG4yMDkyOlxcdFxcdFxcdGlmICgoa3ZtLVxcdTAwM2Vucl9tZW1zbG90X3BhZ2VzICsgbnBhZ2VzKSBcXHUwMDNjIGt2bS1cXHUwMDNlbnJfbWVtc2xvdF9wYWdlcylcXG4yMDkzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIwOTQ6XFx0XFx0fSBlbHNlIHsgLyogTW9kaWZ5IGFuIGV4aXN0aW5nIHNsb3QuICovXFxuMjA5NTpcXHRcXHRcXHQvKiBQcml2YXRlIG1lbXNsb3RzIGFyZSBpbW11dGFibGUsIHRoZXkgY2FuIG9ubHkgYmUgZGVsZXRlZC4gKi9cXG4yMDk2OlxcdFxcdFxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcXG4yMDk3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIwOTg6XFx0XFx0XFx0aWYgKChtZW0tXFx1MDAzZXVzZXJzcGFjZV9hZGRyICE9IG9sZC1cXHUwMDNldXNlcnNwYWNlX2FkZHIpIHx8XFxuMjA5OTpcXHRcXHRcXHQgICAgKG5wYWdlcyAhPSBvbGQtXFx1MDAzZW5wYWdlcykgfHxcXG4yMTAwOlxcdFxcdFxcdCAgICAoKG1lbS1cXHUwMDNlZmxhZ3MgXiBvbGQtXFx1MDAzZWZsYWdzKSBcXHUwMDI2IChLVk1fTUVNX1JFQURPTkxZIHwgS1ZNX01FTV9HVUVTVF9NRU1GRCkpKVxcbjIxMDE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjEwMjpcXHRcXG4yMTAzOlxcdFxcdFxcdGlmIChiYXNlX2dmbiAhPSBvbGQtXFx1MDAzZWJhc2VfZ2ZuKVxcbjIxMDQ6XFx0XFx0XFx0XFx0Y2hhbmdlID0gS1ZNX01SX01PVkU7XFxuMjEwNTpcXHRcXHRcXHRlbHNlIGlmIChtZW0tXFx1MDAzZWZsYWdzICE9IG9sZC1cXHUwMDNlZmxhZ3MpXFxuMjEwNjpcXHRcXHRcXHRcXHRjaGFuZ2UgPSBLVk1fTVJfRkxBR1NfT05MWTtcXG4yMTA3OlxcdFxcdFxcdGVsc2UgLyogTm90aGluZyB0byBjaGFuZ2UuICovXFxuMjEwODpcXHRcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMTA5OlxcdFxcdH1cXG4yMTEwOlxcdFxcbjIxMTE6XFx0XFx0aWYgKChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIFxcdTAwMjZcXHUwMDI2XFxuMjExMjpcXHRcXHQgICAga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzbG90cywgaWQsIGJhc2VfZ2ZuLCBiYXNlX2dmbiArIG5wYWdlcykpXFxuMjExMzpcXHRcXHRcXHRyZXR1cm4gLUVFWElTVDtcXG4yMTE0OlxcdFxcbjIxMTU6XFx0XFx0LyogQWxsb2NhdGUgYSBzbG90IHRoYXQgd2lsbCBwZXJzaXN0IGluIHRoZSBtZW1zbG90LiAqL1xcbjIxMTY6XFx0XFx0bmV3ID0ga3phbGxvY19vYmooKm5ldywgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4yMTE3OlxcdFxcdGlmICghbmV3KVxcbjIxMTg6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuMjExOTpcXHRcXG4yMTIwOlxcdFxcdG5ldy1cXHUwMDNlYXNfaWQgPSBhc19pZDtcXG4yMTIxOlxcdFxcdG5ldy1cXHUwMDNlaWQgPSBpZDtcXG4yMTIyOlxcdFxcdG5ldy1cXHUwMDNlYmFzZV9nZm4gPSBiYXNlX2dmbjtcXG4yMTIzOlxcdFxcdG5ldy1cXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xcbjIxMjQ6XFx0XFx0bmV3LVxcdTAwM2VmbGFncyA9IG1lbS1cXHUwMDNlZmxhZ3M7XFxuMjEyNTpcXHRcXHRuZXctXFx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVxcdTAwM2V1c2Vyc3BhY2VfYWRkcjtcXG4yMTI2OlxcdFxcbjIxMjc6XFx0XFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXFxuMjEyODpcXHRcXHRcXHRcXHQgICAgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcbjIxMjk6XFx0XFx0aWYgKHIpXFxuMjEzMDpcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTMxOlxcdFxcbjIxMzI6XFx0XFx0cmV0dXJuIDA7XFxuMjEzMzpcXHRcXG4yMTM0OlxcdG91dDpcXG4yMTM1OlxcdFxcdGtmcmVlKG5ldyk7XFxuMjEzNjpcXHRcXHRyZXR1cm4gcjtcXG4yMTM3OlxcdH1cXG4yMTM4OlxcdFxcbjIxMzk6XFx0aW50IGt2bV9zZXRfaW50ZXJuYWxfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjMyLjI3OTIyNzcwMVoiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMzcxMDU2NjcxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBBc3Nlc3NtZW50IG9mIEtWTSBNZW1zbG90IEJpbmRpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIHNlZSBpZiBpdCBpbnRyb2R1Y2VzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMsIGdpdmVuIG15IGV4cGVydGlzZSBpbiB0aGlzIGFyZWEuXG5cbkZpcnN0LCBJIHNlZSB0aGUgcGF0Y2ggaXMgcHJpbWFyaWx5IGZvY3VzZWQgb24gdGhlIGBrdm1fZ21lbV9iaW5kYCBmdW5jdGlvbiBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBtZW1zbG90IGNyZWF0aW9uIHByb2Nlc3MsIG1vdmluZyBhbmQgbW9kaWZ5aW5nIHRoZSBjYWxsIHRvIGBrdm1fZ21lbV9iaW5kYC4gV2UncmUgdGFsa2luZyBhYm91dCBtZW1zbG90IGJpbmRpbmcgc3BlY2lmaWNhbGx5IGluIHRoZSBjb250ZXh0IG9mIGdsb2JhbCBtZW1vcnkgKGdtZW0pIHdpdGhpbiBLVk0uXG5cbkhlcmUncyBteSBhbmFseXNpczpcblxuMS4gICoqYGt2bV9nbWVtX2JpbmRgIEJyZWFrZG93bjoqKiBUaGUgcGF0Y2ggbm93IGluY2x1ZGVzIGEgYFdBUk5fT05fT05DRWAgY2hlY2suIFRoZW4gdGhlIGNvZGUgc2V0cyBgc2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBmaWxlO2AsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgYWNjZXNzIGlzIHNhZmUuIFRoZSBwYXRjaCBhbHNvIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZWAuICBDcml0aWNhbGx5LCB0aGUgcGF0Y2ggaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgeGFfc3RvcmVfcmFuZ2VgIGZhaWxzIChmb3IgaW5zdGFuY2UsIGR1ZSB0byAtRU5PTUVNKSBieSBwcm9wZXJseSBjbGVhbmluZyB1cCB0aGUgYmluZGluZyBhbmQgcmVzZXR0aW5nIHJlbGV2YW50IGZpZWxkcy4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudC5cblxuMi4gICoqYGt2bV9zZXRfbWVtc2xvdGAgTW9kaWZpY2F0aW9uOioqICBga3ZtX2dtZW1fYmluZGAgaXMgbm93IGNhbGxlZCB3aXRoaW4gYGt2bV9zZXRfbWVtc2xvdGAsIGFmdGVyIGBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uYC4gRXJyb3IgaGFuZGxpbmcgaGFzIGJlZW4gYWRkZWQgaWYgdGhlIGJpbmRpbmcgZmFpbHMsIGluY2x1ZGluZyBjbGVhbnVwIG9mIGFyY2ggbWVtc2xvdCByZXNvdXJjZXMgYW5kIHRoZSBkaXJ0eSBiaXRtYXAuIFRoZSBwYXRjaCBhbHNvIG1vdmVzIHRoZSBga3ZtX2dtZW1fYmluZGAgY2FsbCBmcm9tIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIHRvIGBrdm1fc2V0X21lbXNsb3RgLlxuXG4zLiAgKipLTVNBTiBDb25zaWRlcmF0aW9uczoqKiBJJ3ZlIGNhcmVmdWxseSBjb25zaWRlcmVkIHRoZSBLTVNBTiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5OlxuXG4gICAgKiAgIE5vIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBoZXJlLiBUaGF0J3MgYSBodWdlIHBvc2l0aXZlLlxuICAgICogICBWYXJpYWJsZXMgYXJlIGVpdGhlciBpbml0aWFsaXplZCBkaXJlY3RseSBvciBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2Nfb2JqYCwgd2hpY2ggemVyby1pbml0aWFsaXplcy4gTm8gdW5pbml0aWFsaXplZCByZWFkcyBoZXJlLlxuICAgICogICBObyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGNhdXNlIHByb2JsZW1zLiBFdmVyeXRoaW5nIGlzIGhhbmRsZWQgcHJvcGVybHkuXG4gICAgKiAgIEJvdW5kcyBjaGVja3MgYW5kIGxlbmd0aHMgbG9vayBmaW5lIGluIHJlbGF0aW9uIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy5cblxuNC4gICoqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGFuYWx5c2lzLCBJJ20gY29uZmlkZW50IHRoYXQgdGhpcyBwYXRjaCAqKmRvZXMgbm90IGludHJvZHVjZSoqIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBidWdzLiBJdCBkb2Vzbid0IGFsdGVyIGFueSBkYXRhIGZsb3cgaW4gdGhhdCByZWdhcmQuIEluIGZhY3QsIGl0IGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50LCBlc3BlY2lhbGx5IGluIGhvdyBga3ZtX2dtZW1fYmluZGAgaW50ZXJhY3RzIHdpdGggYHhhX3N0b3JlX3JhbmdlYC4gVGhlc2UgaW1wcm92ZW1lbnRzIGFyZSBlcnJvciB1bndpbmRpbmcvc3luY2hyb25pemF0aW9uL3Jlc291cmNlIG1hbmFnZW1lbnQgY29uY2VybnMsIGFuZCB0aGV5IGNhbiBiZSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dlcnMuXG5cbkxldCdzIGRvIGEgcXVpY2sgZG91YmxlLWNoZWNrOlxuLSBgeGFyYCBpcyBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBiZWZvcmUgdXNlXG4tIGBzbG90YCBpcyBwcm9wZXJseSBhbGxvY2F0ZWQgd2l0aCBga3phbGxvY19vYmpgXG4tIE5vIHN0YWNrIHZhcmlhYmxlcyBhcmUgdW5pbml0aWFsaXplZCBiZWZvcmUgdXNlLlxuLSBObyBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbi5cblxuVGhlcmVmb3JlLCBgTmVlZHNLTVNBTiA9IGZhbHNlYC4gSSdtIHJlYWR5IHRvIHByZXBhcmUgdGhlIHRvb2wgY2FsbCB0byBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDcwOCwiT3V0cHV0VG9rZW5zIjoyMDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDo0NS45ODk3OTc2MDFaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODA4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSdzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cXG5cXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSdzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cXG5cXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowzlspx[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-03 15:41:29 +0000 UTC FinishedAt: 2026-09-03 15:44:48 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_GUEST_MEMFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "axboe", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git", "commit_hash": "76671054f9a1ff6abb976583cd8da37650acdc97", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "KVM", "KVM_GUEST_MEMFD" ], "series_id": "29c063b4-0fb5-4c56-a411-2d16db5a39e2" }, "track": "KASAN", "fuzz": { "focus": [ "kvm" ], "focus_symbols": [ "kvm_gmem_bind", "kvm_set_memslot", "kvm_set_memory_region", "kvm_vm_ioctl_set_memory_region" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": false, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OywKICAgICYjMzQ7a3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRqdXN0cyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHNlcXVlbmNlIG9mIGt2bV9nbWVtX2JpbmQoKSB3aXRoaW4gS1ZNJiMzOTtzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cblxuQWxsIGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0dXJlcyAoc3VjaCBhcyBrdm1fbWVtb3J5X3Nsb3QpIGFyZSB6ZXJvLWFsbG9jYXRlZCB3aXRoIGt6YWxsb2Nfb2JqKCksIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiwgeGFyKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIG5vIGRhdGEgaXMgY29waWVkIHRvIHVzZXJzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQgaW4ga2VybmVsLWludGVybmFsIHN0YXRlLiBBcyB0aGlzIGNoYW5nZSBkZWFscyBzdHJpY3RseSB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBjbGVhbnVwIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlcywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQgYW5kIHN0YW5kYXJkIEtBU0FOIHRlc3RpbmcgaXMgc3VmZmljaWVudC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UsCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMDcxMTU1MzZiYzI3ZmQyYzcwMWI1MTc4MmY4ZmIyYjZmNjI5YzAxZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbmluZGV4IGI1OTY0ODZkMTg0Y2EuLjMyMzE1OWM5YjVmMzQgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5AQCAtNjEyLDEwICYjNDM7NjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbiYjNDM7XHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4mIzQzO1x0aWYgKFdBUk5fT05fT05DRShzbG90LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxuJiM0MztcdFx0cmV0dXJuIC1FSU5WQUw7XG4mIzQzO1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiAmIzQzOzY1MywxMiBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxuIFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4gXHQgKi9cbi1cdFdSSVRFX09OQ0Uoc2xvdC1cdTAwM2VnbWVtLmZpbGUsIGZpbGUpO1xuJiM0MztcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiYjNDM7XHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4gXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXG4gXHQvKlxuQEAgLTY2Miw3ICYjNDM7NjY2LDEzIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICYjMzk7cm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gXHQgKi9cbi1cdHIgPSAwO1xuJiM0MztcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiYjNDM7XHRpZiAocikge1xuJiM0MztcdFx0eGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuJiM0MztcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbiYjNDM7XHRcdHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuJiM0MztcdH1cbiBlcnI6XG4gXHRmcHV0KGZpbGUpO1xuIFx0cmV0dXJuIHI7XG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jXG4mIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5AQCAtMTg4Nyw3ICYjNDM7MTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXG4tXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSlcbiYjNDM7XHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbiYjNDM7XHRcdFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XG4gXHRpbnQgcjtcbkBAIC0xOTMxLDIwICYjNDM7MTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHR9XG4gXG4gXHRyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuLVx0aWYgKHIpIHtcbi1cdFx0Lypcbi1cdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm9cbi1cdFx0ICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkXG4tXHRcdCAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzb1xuLVx0XHQgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbi1cdFx0ICovXG4tXHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbi1cdFx0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbi1cdFx0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbi1cdFx0fVxuLVx0XHRyZXR1cm4gcjtcbiYjNDM7XHRpZiAocilcbiYjNDM7XHRcdGdvdG8gZXJyO1xuJiM0MztcbiYjNDM7XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbiYjNDM7XHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuJiM0MztcdFx0XHRnb3RvIGVycl9iaW5kO1xuJiM0MztcbiYjNDM7XHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4mIzQzO1x0XHRpZiAocilcbiYjNDM7XHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbiBcbiBcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7ZXJyX2JpbmQ6XG4mIzQzO1x0aWYgKG5ldykge1xuJiM0MztcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbiYjNDM7XG4mIzQzO1x0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuJiM0MztcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbiYjNDM7XHR9XG4mIzQzO2VycjpcbiYjNDM7XHQvKlxuJiM0MztcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbiYjNDM7XHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbiYjNDM7XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuJiM0MztcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4mIzQzO1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuJiM0MztcdH0gZWxzZSB7XG4mIzQzO1x0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4mIzQzO1x0fVxuJiM0MztcdHJldHVybiByO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXG5AQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4gXHRcdFx0cmV0dXJuIC1FSU87XG4gXG4tXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpO1xuJiM0MztcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSAmIzQzOzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0bmV3LVx1MDAzZW5wYWdlcyA9IG5wYWdlcztcbiBcdG5ldy1cdTAwM2VmbGFncyA9IG1lbS1cdTAwM2VmbGFncztcbiBcdG5ldy1cdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cdTAwM2V1c2Vyc3BhY2VfYWRkcjtcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbi1cdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4tXHRcdGlmIChyKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0fVxuIFxuLVx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuJiM0MztcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxuJiM0MztcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4mIzQzO1x0XHRnb3RvIG91dDtcbiBcbiBcdHJldHVybiAwO1xuIFxuLW91dF91bmJpbmQ6XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxuLVx0XHRrdm1fZ21lbV91bmJpbmQobmV3KTtcbiBvdXQ6XG4gXHRrZnJlZShuZXcpO1xuIFx0cmV0dXJuIHI7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7LAogICAgJiMzNDtrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgbWFpbnRhaW5lciBhbmQgc2VjdXJpdHkgZW5naW5lZXIuCllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLgoKSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluCnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3MKdG9vbHMgdG8gaW5zcGVjdCB0aGUgYWN0dWFsIHNvdXJjZSBjb2RlLCBjYWxsZXJzLCBhbmQgc3Vycm91bmRpbmcgY29udGV4dC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjEuIENPUkUgVFJJQUdFIFBISUxPU09QSFkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncywKYW5kIG5ld2x5IHRyaWdnZXJlZCBhc3NlcnRpb25zIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIHNlcmllcy4KCi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6CiAgRnV6emluZyBjYW4gb25seSBkaXNjb3ZlciBidWdzIGluIGNvZGUgdGhhdCBjYW4gYWN0dWFsbHkgZXhlY3V0ZSBpbiBzdGFuZGFyZCB2aXJ0dWFsaXplZAogIGVudmlyb25tZW50cyAoR0NFIG9yIFFFTVUsIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBkZXZpY2VzIGxpa2UgVVNCIGdhZGdldHMsIG5ldGRldiwgdHVuL3RhcCkuCiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLAogIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBhZGRzIGFzc2VydGlvbnMgb3IgY29tcGxleCBsb2dpYy4KCi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgJiMzNDtOTyBGVU5DVElPTkFMIENIQU5HRSYjMzQ7IChORkNJKSBPUiAmIzM0O1JFRkFDVE9SSU5HJiMzNDsgQ0xBSU1TOgogIFBhdGNoIGF1dGhvcnMgcm91dGluZWx5IGxhYmVsIGNoYW5nZXMgYXMgJiMzNDtjbGVhbnVwcyYjMzQ7LCAmIzM0O3JlZmFjdG9yaW5ncyYjMzQ7LCBvciBzdGF0ZQogICYjMzQ7Tm8gZnVuY3Rpb25hbCBjaGFuZ2UgaW50ZW5kZWQmIzM0Oy4gRG8gTk9UIHRha2UgdGhlc2UgY2xhaW1zIGF0IGZhY2UgdmFsdWUuCiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50CiAgaW4gY29yZSBzdWJzeXN0ZW1zIGZyZXF1ZW50bHkgaW50cm9kdWNlIHN1YnRsZSBzZW1hbnRpYyBzaGlmdHMgb3IgdW5jb3ZlciBsYXRlbnQga2VybmVsIGJ1Z3MuCiAgSWYgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSBpcyBtb2RpZmllZCBvciByZWZhY3RvcmVkLCBpdCBNVVNUIGJlIGZ1enplZC4KCi0gTkVXIE9SIE1PRElGSUVEIEFTU0VSVElPTlMgSU4gUkVBQ0hBQkxFIENPREUgTVVTVCBCRSBGVVpaRUQ6CiAgV2hlbiBhIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMgcnVudGltZSBjaGVja3Mgb3IgYXNzZXJ0aW9ucyAoZS5nLiwgV0FSTl9PTiosIFZNX1dBUk5fT04qLAogIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLgogIEV2ZW4gaWYgdGhlIGF1dGhvciBiZWxpZXZlcyB0aGUgaW52YXJpYW50IGFsd2F5cyBob2xkcywgZnV6emluZyBpcyBlc3NlbnRpYWwgdG8gdmVyaWZ5IHdoZXRoZXIKICBhbiB1bnVzdWFsIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgY2FuIHZpb2xhdGUgaXQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoyLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9ZmFsc2UgKE5FR0FUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIE9OTFkgSUYgYWxsIG1vZGlmaWVkIGNvZGUgZmFsbHMgc3RyaWN0bHkgaW50byBvbmUgb3IgbW9yZSBvZiB0aGVzZSBjYXRlZ29yaWVzOgoKLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOgogICogTW9kaWZpY2F0aW9ucyB0byBEb2N1bWVudGF0aW9uLywgY29tbWVudHMsIG9yIHNwZWxsaW5nIGZpeGVzLgogICogVXNlci1zcGFjZSBkaXJlY3Rvcmllcywgc2VsZi10ZXN0cywgc2FtcGxlcywgb3Igc2NyaXB0cyAoZS5nLiwgdG9vbHMvLCBzYW1wbGVzLywgc2NyaXB0cy8sIHVzci8pCiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuCiAgKiBQdXJlbHkgZGVjb3JhdGl2ZSBsb2dnaW5nIChlLmcuLCBtZXNzYWdlIHN0cmluZ3MgaW4gcHJfZXJyLCBwcmludGssIGRldl9pbmZvKSBvciB0cmFjZXBvaW50cwogICAgdGhhdCBkbyBub3QgYWx0ZXIgY29udHJvbCBmbG93IG9yIGRhdGEgc3RydWN0dXJlcy4KICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy4KLSBTdHJ1Y3R1cmFsbHkgdW5yZWFjaGFibGUgaGFyZHdhcmU6CiAgKiBWZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2hlcywgU21hcnROSUNzLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLgotIFVucmVhY2hhYmxlIGV4ZWN1dGlvbiBwYXRoczoKICAqIERyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKC5yZW1vdmUsIC5zaHV0ZG93biwgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKSBleGVjdXRlZCBvbmx5IGR1cmluZwogICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuCiAgKiBDb2RlIHBhdGhzIGV4Y2x1c2l2ZSB0byBhcmNoaXRlY3R1cmVzIG90aGVyIHRoYW4gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQozLiBXSEVOIFRPIFJFVFVSTiBXb3J0aEZ1enppbmc9dHJ1ZSAoUE9TSVRJVkUgQ1JJVEVSSUEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6Ci0gQ29yZSBTdWJzeXN0ZW1zOgogICogQW55IGxvZ2ljIG1vZGlmaWNhdGlvbnMgaW4gbWVtb3J5IG1hbmFnZW1lbnQgKG1tLyksIHN5bmNocm9uaXphdGlvbi9sb2NraW5nIChrZXJuZWwvbG9ja2luZy8pLAogICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLgotIFJlZmFjdG9yaW5ncyBhbmQgQ29kZSBDbGVhbnVwczoKICAqIEFueSByZXN0cnVjdHVyaW5nIG9mIHJlYWNoYWJsZSBkYXRhIHN0cnVjdHVyZXMsIGhlbHBlciBhYnN0cmFjdGlvbnMsIG9yIGFsZ29yaXRobSBmbG93cy4KLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6CiAgKiBBbnkgaW50cm9kdWN0aW9uIG9yIGFsdGVyYXRpb24gb2YgYXNzZXJ0aW9ucyAoV0FSTl9PTiosIFZNX1dBUk5fT04qLCBCVUdfT04qLCBldGMuKSBpbiByZWFjaGFibGUgcGF0aHMuCi0gUmVhY2hhYmxlIERyaXZlcnMgYW5kIFByb3RvY29sczoKICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpXaGVuIFdvcnRoRnV6emluZz10cnVlLCB5b3UgbXVzdCBleHRyYWN0IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgaW50byBGb2N1c1N5bWJvbHMgdG8gZ3VpZGUgdGhlIGZ1enplcjoKCi0gQVZPSUQgVUJJUVVJVE9VUyBMSUZFQ1lDTEUgSE9ULVBBVEhTOgogIERvIE5PVCBsaXN0IGdlbmVyaWMsIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhbGxlZCBieSBhbG1vc3QgZXZlcnkgcHJvZ3JhbSBpbiB0aGUgY29ycHVzCiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHQKICBhbmQgdHJhcCBoYW5kbGVycywgb3IgY29yZSBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlczsgdGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0KS4KICBMaXN0aW5nIHViaXF1aXRvdXMgZnVuY3Rpb25zIGNhdXNlcyB0aGUgZnV6emVyIHRvIGNsYXNzaWZ5IHRob3VzYW5kcyBvZiB1bnJlbGF0ZWQgdGVzdHMgYXMgJiMzNDtmb2N1c2VkJiMzNDssCiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLgoKLSBUQVJHRVQgU1BFQ0lGSUMgRkVBVFVSRSBMT0dJQyBBTkQgRU5UUllQT0lOVFM6CiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzCiAgZm9yIHRoZSBzdWJzeXN0ZW0gZmVhdHVyZSB1bmRlciByZXZpZXcuCgotIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKToKICBDb21waWxlci1pbmxpbmVkIHN0YXRpYyBmdW5jdGlvbnMgKHN1Y2ggYXMgc3RhdGljIGlubGluZXMgaW4gbW0vKi5oIG9yIGluY2x1ZGUvbGludXgvKi5oKSBsYWNrCiAgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcyBpbiB2bWxpbnV4IGFuZCBjYW5ub3QgYmUgdGFyZ2V0ZWQgZGlyZWN0bHkgYnkgc3ltYm9sIGNvdmVyYWdlIGZpbHRlcnMuCiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyCiAgZnVuY3Rpb25zIGluIC5jIGZpbGVzIHRoYXQgZXhlcmNpc2UgdGhlbSAoYXZvaWRpbmcgdWJpcXVpdG91cyBsaWZlY3ljbGUgd3JhcHBlcnMpLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KNS4gSURFTlRJRllJTkcgRW5hYmxlQ29uZmlncwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOgotIEluc3BlY3QgS2NvbmZpZyBmaWxlcyBhbmQgI2lmZGVmIGd1YXJkczsgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCi0gQ2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzIG5lZWRlZC4KLSBTdHJpcCBhbnkgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgMDcxMTU1MzZiYzI3ZmQyYzcwMWI1MTc4MmY4ZmIyYjZmNjI5YzAxZApBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwppbmRleCBiNTk2NDg2ZDE4NGNhLi4zMjMxNTljOWI1ZjM0IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCiYjNDM7JiM0MzsmIzQzOyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKQEAgLTYxMiwxMCAmIzQzOzYxMiwxNCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsCiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlpbnQgciA9IC1FSU5WQUw7CiYjNDM7CXZvaWQgKnhhcjsKIAogCUJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTsKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC0mZ3Q7Z21lbS5wZ29mZikpOwogCiYjNDM7CWlmIChXQVJOX09OX09OQ0Uoc2xvdC0mZ3Q7ZmxhZ3MgJmFtcDsgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSkKJiM0MzsJCXJldHVybiAtRUlOVkFMOwomIzQzOwogCWZpbGUgPSBmZ2V0KGZkKTsKIAlpZiAoIWZpbGUpCiAJCXJldHVybiAtRUJBREY7CkBAIC02NDksMTIgJiM0Mzs2NTMsMTIgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAogCSAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90CiAJICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuCiAJICovCi0JV1JJVEVfT05DRShzbG90LSZndDtnbWVtLmZpbGUsIGZpbGUpOwomIzQzOwlzbG90LSZndDtnbWVtLmZpbGUgPSBmaWxlOwogCXNsb3QtJmd0O2dtZW0ucGdvZmYgPSBzdGFydDsKIAlpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpCiAJCXNsb3QtJmd0O2ZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTsKIAotCXhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTsKJiM0MzsJeGFyID0geGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpOwogCWZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtJmd0O2lfbWFwcGluZyk7CiAKIAkvKgpAQCAtNjYyLDcgJiM0Mzs2NjYsMTMgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAogCSAqIG5vdCB0aGUgb3RoZXIgd2F5ICYjMzk7cm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZQogCSAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLgogCSAqLwotCXIgPSAwOwomIzQzOwlyID0geGFfaXNfZXJyKHhhcikgPyB4YV9lcnIoeGFyKSA6IDA7CiYjNDM7CWlmIChyKSB7CiYjNDM7CQl4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7CiYjNDM7CQlzbG90LSZndDtnbWVtLmZpbGUgPSBOVUxMOwomIzQzOwkJc2xvdC0mZ3Q7Z21lbS5wZ29mZiA9IDA7CiYjNDM7CQlzbG90LSZndDtmbGFncyAmYW1wOz0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTsKJiM0MzsJfQogZXJyOgogCWZwdXQoZmlsZSk7CiAJcmV0dXJuIHI7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCA2NWViMjZhMDUyMGQ4Li4yMWMxMGNiYmFjNjYxIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCiYjNDM7JiM0MzsmIzQzOyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTE4ODcsNyAmIzQzOzE4ODcsOCBAQCBzdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLAogc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLAogCQkJICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLAogCQkJICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbmV3LAotCQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSkKJiM0MzsJCQkgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlLAomIzQzOwkJCSAgIHVuc2lnbmVkIGludCBnbWVtX2ZkLCB1b2ZmX3QgZ21lbV9vZmZzZXQpCiB7CiAJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqaW52YWxpZF9zbG90OwogCWludCByOwpAQCAtMTkzMSwyMCAmIzQzOzE5MzIsMTYgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLAogCX0KIAogCXIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7Ci0JaWYgKHIpIHsKLQkJLyoKLQkJICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8KLQkJICogbW9kaWZpY2F0aW9ucyByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkCi0JCSAqIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4gIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbwotCQkgKiByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KLQkJICovCi0JCWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKLQkJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwotCQkJa2ZyZWUoaW52YWxpZF9zbG90KTsKLQkJfSBlbHNlIHsKLQkJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKLQkJfQotCQlyZXR1cm4gcjsKJiM0MzsJaWYgKHIpCiYjNDM7CQlnb3RvIGVycjsKJiM0MzsKJiM0MzsJaWYgKG5ldyAmYW1wOyZhbXA7IG5ldy0mZ3Q7ZmxhZ3MgJmFtcDsgS1ZNX01FTV9HVUVTVF9NRU1GRCkgewomIzQzOwkJaWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKJiM0MzsKJiM0MzsJCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7CiYjNDM7CQlpZiAocikKJiM0MzsJCQlnb3RvIGVycl9iaW5kOwogCX0KIAogCS8qCkBAIC0xOTc3LDYgJiM0MzsxOTc0LDI3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAlrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTsKIAogCXJldHVybiAwOwomIzQzOwomIzQzO2Vycl9iaW5kOgomIzQzOwlpZiAobmV3KSB7CiYjNDM7CQlrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpOwomIzQzOwomIzQzOwkJaWYgKG5ldy0mZ3Q7ZGlydHlfYml0bWFwICZhbXA7JmFtcDsgKCFvbGQgfHwgIW9sZC0mZ3Q7ZGlydHlfYml0bWFwKSkKJiM0MzsJCQlrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTsKJiM0MzsJfQomIzQzO2VycjoKJiM0MzsJLyoKJiM0MzsJICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9ucwomIzQzOwkgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy4KJiM0MzsJICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLgomIzQzOwkgKi8KJiM0MzsJaWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkgewomIzQzOwkJa3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7CiYjNDM7CQlrZnJlZShpbnZhbGlkX3Nsb3QpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJbXV0ZXhfdW5sb2NrKCZhbXA7a3ZtLSZndDtzbG90c19hcmNoX2xvY2spOwomIzQzOwl9CiYjNDM7CXJldHVybiByOwogfQogCiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsCkBAIC0yMDU4LDcgJiM0MzsyMDc2LDcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLAogCQlpZiAoV0FSTl9PTl9PTkNFKGt2bS0mZ3Q7bnJfbWVtc2xvdF9wYWdlcyAmbHQ7IG9sZC0mZ3Q7bnBhZ2VzKSkKIAkJCXJldHVybiAtRUlPOwogCi0JCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUpOwomIzQzOwkJcmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApOwogCX0KIAogCWJhc2VfZ2ZuID0gKG1lbS0mZ3Q7Z3Vlc3RfcGh5c19hZGRyICZndDsmZ3Q7IFBBR0VfU0hJRlQpOwpAQCAtMjEwNSwyMSAmIzQzOzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLAogCW5ldy0mZ3Q7bnBhZ2VzID0gbnBhZ2VzOwogCW5ldy0mZ3Q7ZmxhZ3MgPSBtZW0tJmd0O2ZsYWdzOwogCW5ldy0mZ3Q7dXNlcnNwYWNlX2FkZHIgPSBtZW0tJmd0O3VzZXJzcGFjZV9hZGRyOwotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKLQkJciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS0mZ3Q7Z3Vlc3RfbWVtZmQsIG1lbS0mZ3Q7Z3Vlc3RfbWVtZmRfb2Zmc2V0KTsKLQkJaWYgKHIpCi0JCQlnb3RvIG91dDsKLQl9CiAKLQlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiYjNDM7CXIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLAomIzQzOwkJCSAgICBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7CiAJaWYgKHIpCi0JCWdvdG8gb3V0X3VuYmluZDsKJiM0MzsJCWdvdG8gb3V0OwogCiAJcmV0dXJuIDA7CiAKLW91dF91bmJpbmQ6Ci0JaWYgKG1lbS0mZ3Q7ZmxhZ3MgJmFtcDsgS1ZNX01FTV9HVUVTVF9NRU1GRCkKLQkJa3ZtX2dtZW1fdW5iaW5kKG5ldyk7CiBvdXQ6CiAJa2ZyZWUobmV3KTsKIAlyZXR1cm4gcjsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNDgwMwoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDI1NwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgdGhlIEtWTSBNZW1vcnkgU2xvdCBQYXRjaCoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgZGlmZiBhbmQgc2VlIGlmIGl0IHdhcnJhbnRzIHNvbWUgZnV6emluZyBhdHRlbnRpb24uIEl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gS1ZNJiMzOTtzIG1lbW9yeSBzbG90IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSB3aXRoaW4gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIE15IGluaXRpYWwgZ2xhbmNlIHN1Z2dlc3RzIHdlJiMzOTtyZSBkZWFsaW5nIHdpdGggdGhlIGBndWVzdF9tZW1mZGAgaW50ZXJmYWNlLCB3aGljaCBpcyBpbnRlcmVzdGluZy4KClNwZWNpZmljYWxseSwgaW4gYGd1ZXN0X21lbWZkLmNgLCB0aGV5JiMzOTt2ZSBtb2RpZmllZCBga3ZtX2dtZW1fYmluZGAuIEkgc2VlIGEgYFdBUk5fT05fT05DRWAgY2hlY2sgYWdhaW5zdCBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCwgYSBuZXcgZXJyb3IgaGFuZGxpbmcgc3RyYXRlZ3ksIGFuZCBhIHJvbGxiYWNrIG1lY2hhbmlzbSBpZiBgeGFfc3RvcmVfcmFuZ2VgIGZhaWxzLiBUaGlzIGluZGljYXRlcyBwb3RlbnRpYWwgZWRnZSBjYXNlcyByZWxhdGVkIHRvIHRoZSBhbGxvY2F0aW9uIG9yIGJpbmRpbmcgb2YgZ3Vlc3QgbWVtb3J5IHRocm91Z2ggbWVtZmRzLiBJbnRlcmVzdGluZywgaXQmIzM5O3MgcHJldHR5IGdvb2QgY29kZS4KCk5vdywgaW4gYGt2bV9tYWluLmNgLCBga3ZtX3NldF9tZW1zbG90YCBhcHBlYXJzIHRvIGhhdmUgYmVlbiByZXdvcmtlZC4gVGhleSYjMzk7dmUgbW92ZWQgYGt2bV9nbWVtX2JpbmRgIGluc2lkZSBpdCwgYWZ0ZXIgYGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb25gLCB3aGljaCBpcyBhIG5vdGFibGUgY2hhbmdlLiBUaGV5IGFsc28gYWRkZWQgYSBgV0FSTl9PTl9PTkNFYCBjaGVjayBmb3IgYEtWTV9NUl9DUkVBVEVgLCBhbmQgc29tZSBjbGVhbnVwIHN0ZXBzLiBUaGlzIHN1Z2dlc3RzIHRoZXkgYXJlIGJlaW5nIHZlcnkgY2FyZWZ1bCBhYm91dCBtZW1vcnkgc2xvdCBjcmVhdGlvbiwgYW5kIGhhbmRsaW5nIGZhaWx1cmVzIGNvcnJlY3RseS4gQW5kIGl0IGxvb2tzIGxpa2UgdGhlIGNhbGxzIHRvIGBrdm1fc2V0X21lbXNsb3RgIGluIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGhhdmUgYmVlbiB1cGRhdGVkIGFzIHdlbGwuCgpUbyBnZXQgYSBoYW5kbGUgb24gdGhpcywgSSYjMzk7bGwgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGNvZGUuIEkmIzM5O2xsIHVzZSBncmVwcGVyIGFuZCByZWFkLWZpbGUgdG8gY2hlY2sgdGhlIGNvZGUgYW5kIEtjb25maWcsIHNwZWNpZmljYWxseSB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBkZXBlbmRlbmNpZXMuIEkgd2FudCB0byBzZWUgaG93IHRoZXNlIGNoYW5nZXMgaW50ZXJhY3Qgd2l0aCB0aGUgYnJvYWRlciBLVk0gbWVtb3J5IG1hbmFnZW1lbnQgc3lzdGVtIGFuZCBhbnkgcmVsZXZhbnQgZmVhdHVyZSBmbGFncy4gVGhpcyBsZXZlbCBvZiBjaGFuZ2UgaW4gbWVtb3J5IG1hbmFnZW1lbnQgaXMgYWx3YXlzIHdvcnRoIGNsb3NlIHNjcnV0aW55LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xuLS1cbnZpcnQva3ZtL0tjb25maWctMTA1LVxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxudmlydC9rdm0vS2NvbmZpZy0xMDctICAgICAgIHNlbGVjdCBYQVJSQVlfTVVMVElcbi0tXG52aXJ0L2t2bS9LY29uZmlnPTExMD1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcbnZpcnQva3ZtL0tjb25maWctMTExLSAgICAgICBib29sXG52aXJ0L2t2bS9LY29uZmlnOjExMjogICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL0tjb25maWctMTEzLVxudmlydC9rdm0vS2NvbmZpZz0xMTQ9Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9SRUNMQUlNXG52aXJ0L2t2bS9LY29uZmlnLTExNS0gICAgICAgYm9vbFxudmlydC9rdm0vS2NvbmZpZzoxMTY6ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG52aXJ0L2t2bS9LY29uZmlnLTExNy1cbnZpcnQva3ZtL0tjb25maWc9MTE4PWNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxudmlydC9rdm0vS2NvbmZpZy0xMTktICAgICAgIGJvb2xcbnZpcnQva3ZtL0tjb25maWc6MTIwOiAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxudmlydC9rdm0vS2NvbmZpZy0xMjEtXG52aXJ0L2t2bS9LY29uZmlnPTEyMj1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXG52aXJ0L2t2bS9LY29uZmlnLTEyMy0gICAgICAgYm9vbFxudmlydC9rdm0vS2NvbmZpZzoxMjQ6ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4tLVxudmlydC9rdm0vTWFrZWZpbGUua3ZtPTE0PWt2bS0kKENPTkZJR19IQVZFX0tWTV9QRk5DQUNIRSkgJiM0Mzs9ICQoS1ZNKS9wZm5jYWNoZS5vXG52aXJ0L2t2bS9NYWtlZmlsZS5rdm06MTU6a3ZtLSQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkgJiM0Mzs9ICQoS1ZNKS9ndWVzdF9tZW1mZC5vXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaC0xLS8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi9cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjojaWZuZGVmIF9fS1ZNX0dVRVNUX01FTUZEX0hfX1xudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDozOiNkZWZpbmUgX19LVk1fR1VFU1RfTUVNRkRfSF9fXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTQtXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaC02LVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDo3OiNpZmRlZiBDT05GSUdfS1ZNX0dVRVNUX01FTUZEXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTgtaW50IGt2bV9nbWVtX2luaXQoc3RydWN0IG1vZHVsZSAqbW9kdWxlKTtcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oPTI4PXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fZ21lbV91bmJpbmQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTMxLX1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MzI6I2VuZGlmIC8qIENPTkZJR19LVk1fR1VFU1RfTUVNRkQgKi9cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtMzMtXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjM0OiNlbmRpZiAvKiBfX0tWTV9HVUVTVF9NRU1GRF9IX18gKi9cbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE1NzQ9c3RhdGljIGludCBjaGVja19tZW1vcnlfcmVnaW9uX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE1NzgtXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE1Nzk6XHRpZiAoSVNfRU5BQkxFRChDT05GSUdfS1ZNX0dVRVNUX01FTUZEKSlcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU4MC1cdFx0dmFsaWRfZmxhZ3MgfD0gS1ZNX01FTV9HVUVTVF9NRU1GRDtcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTQ4OTQ9c3RhdGljIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uX2dlbmVyaWMoc3RydWN0IGt2bSAqa3ZtLCBsb25nIGFyZylcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTQ5NTgtI2VuZGlmXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjQ5NTk6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL2t2bV9tYWluLmMtNDk2MC1cdGNhc2UgS1ZNX0NBUF9HVUVTVF9NRU1GRDpcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTUxNzg9c3RhdGljIGxvbmcga3ZtX3ZtX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM5Ny1cdFx0YnJlYWs7XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjUzOTg6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM5OS1cdGNhc2UgS1ZNX0NSRUFURV9HVUVTVF9NRU1GRDoge1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDY2NjEKCQkJCQkJCW91dHB1dDogMzEKCQkJCQkJCXRob3VnaHRzOiAyNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipJbnZlc3RpZ2F0aW5nIEtWTSBHdWVzdCBNZW1vcnkgRmlsZSBEZXNjcmlwdG9yIFN1cHBvcnQqKgoKQWxyaWdodCwgdGltZSB0byBnZXQgdGhpcyBzdHJhaWdodCBpbiBteSBoZWFkLiBJIG5lZWQgdG8gcXVpY2tseSBhc2NlcnRhaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgS1ZNJiMzOTtzIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIHN1cHBvcnQsIHNwZWNpZmljYWxseSBgS1ZNX0dVRVNUX01FTUZEYC4gQW5kIGJlY2F1c2UgSSYjMzk7bSBmb2N1c2VkIG9uIHg4Ni9hbWQ2NCBwbGF0Zm9ybXMsIGxldCYjMzk7cyBkcmlsbCBkb3duIGFuZCBzZWUgaG93IHRoaXMgaXMgZW5hYmxlZCwgb3IgaWYgaXQgaXMgZXZlbiBlbmFibGVkLCB3aXRoaW4gdGhlIEtjb25maWcgZmlsZXMuIE15IGluaXRpYWwgdGhvdWdodCBwcm9jZXNzIGlzIHRvIHF1aWNrbHkganVtcCB0byB0aGUgS2NvbmZpZyBmaWxlcyB0byBjb25maXJtIGl0cyBkZWZpbml0aW9uLCBpdHMgZGVwZW5kZW5jeSAoaWYgYW55KSBvbiBvdGhlciBjb25maWd1cmF0aW9ucyBhbmQgaWYgaXRzIGV2ZW4gZXhwb3NlZCBmb3IgeDg2L2FtZDY0LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBLVk1fR1VFU1RfTUVNRkQmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDt2aXJ0LyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnPTEwMz1jb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcbi0tXG52aXJ0L2t2bS9LY29uZmlnLTEwNS1cbnZpcnQva3ZtL0tjb25maWc6MTA2OmNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNjk2OAoJCQkJCQkJb3V0cHV0OiAzNAoJCQkJCQkJdGhvdWdodHM6IDIwCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJJiMzOTttIHJlYWRpbmcgYW5kIHByb2Nlc3NpbmcgdGhlIHByb3ZpZGVkIHRleHQ6CgoqKktWTSBDb25maWd1cmF0aW9uIERlZXAgRGl2ZSoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBgdmlydC9rdm0vS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDEwNi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBLVk0gY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBzdHJ1Y3R1cmVkIGFuZCB3aGF0JiMzOTtzIGJlaW5nIGVuYWJsZWQgb3IgZGlzYWJsZWQgYXQgdGhhdCBwb2ludCBpbiB0aGUgY29kZS4gSSYjMzk7bSBsb29raW5nIGZvciB0aGUgY29yZSBzZXQgb2Ygb3B0aW9uczsgaXQmIzM5O3MgbGlrZWx5IHRoZXkgYXJlIHRoZSBiYXNpY3MgZm9yIHRoZSBtb2R1bGUgdG8gYnVpbGQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9LY29uZmlnJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogOTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICA5NTpcdCAgICAgICBib29sXG4gIDk2Olx0XG4gIDk3Olx0Y29uZmlnIEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcbiAgOTg6XHQgICAgICAgYm9vbFxuICA5OTpcdFxuIDEwMDpcdGNvbmZpZyBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXG4gMTAxOlx0ICAgICAgIGJvb2xcbiAxMDI6XHRcbiAxMDM6XHRjb25maWcgS1ZNX0dFTkVSSUNfTUVNT1JZX0FUVFJJQlVURVNcbiAxMDQ6XHQgICAgICAgYm9vbFxuIDEwNTpcdFxuIDEwNjpcdGNvbmZpZyBLVk1fR1VFU1RfTUVNRkRcbiAxMDc6XHQgICAgICAgc2VsZWN0IFhBUlJBWV9NVUxUSVxuIDEwODpcdCAgICAgICBib29sXG4gMTA5Olx0XG4gMTEwOlx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9DT05WRVJUXG4gMTExOlx0ICAgICAgIGJvb2xcbiAxMTI6XHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcbiAxMTM6XHRcbiAxMTQ6XHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1JFQ0xBSU1cbiAxMTU6XHQgICAgICAgYm9vbFxuIDExNjpcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxuIDExNzpcdFxuIDExODpcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fSU5WQUxJREFURVxuIDExOTpcdCAgICAgICBib29sXG4gMTIwOlx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4gMTIxOlx0XG4gMTIyOlx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9QT1BVTEFURVxuIDEyMzpcdCAgICAgICBib29sXG4gMTI0Olx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogNzUxNgoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDI5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Pa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUmIzM5O3MgaG93IEkmIzM5O2QgYXBwcm9hY2ggdGhpcyB0YXNrLCBhcyBpZiB0aGVzZSB3ZXJlIG15IGludGVybmFsIHRob3VnaHRzOgoKKipJbnZlc3RpZ2F0aW5nIHRoZSBLVk1fR1VFU1RfTUVNRkQgU2VsZWN0aW9uIGluIEtjb25maWcqKgoKQWxyaWdodCwgc28gdGhlIHRhc2sgYXQgaGFuZCBpcyB0byBmaWd1cmUgb3V0IHRoZSBkZXBlbmRlbmNpZXMgYW5kIHBvdGVudGlhbCBzZWxlY3Rpb24gY29uZGl0aW9ucyBmb3IgYEtWTV9HVUVTVF9NRU1GRGAgd2l0aGluIHRoZSBgYXJjaC94ODYva3ZtL0tjb25maWdgIGZpbGUuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHdoeSBhbmQgd2hlbiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgb3IsIGlmIG5vdCBkaXJlY3RseSBlbmFibGVkLCB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgaXQgYmVjb21lcyBhdmFpbGFibGUgZm9yIHNlbGVjdGlvbiBieSB0aGUgdXNlciBvciBidWlsZCBzeXN0ZW0uCgpGaXJzdCwgSSYjMzk7bGwgbmVlZCB0byBvcGVuIHRoYXQgS2NvbmZpZyBmaWxlLiBJIGFscmVhZHkga25vdyB0aGUgcGF0aDogYGFyY2gveDg2L2t2bS9LY29uZmlnYC4gTGV0JiMzOTtzIGFzc3VtZSBJIGhhdmUgYWNjZXNzIHRvIGEgdGVybWluYWwgb3IgY29kZSBlZGl0b3Igd2l0aCBmaWxlIG5hdmlnYXRpb24gY2FwYWJpbGl0aWVzLiBJJiMzOTtsbCBuZWVkIHRvIHF1aWNrbHkgc2tpbSB0aGUgZmlsZSwgbG9va2luZyBmb3IgdGhlIGRlZmluaXRpb24sIG9yIHJlZmVyZW5jZXMgdG8sIGBLVk1fR1VFU1RfTUVNRkRgLiBJJiMzOTtsbCBiZSB3YXRjaGluZyBmb3Iga2V5d29yZHMgbGlrZSAmIzM0O2NvbmZpZyYjMzQ7LCAmIzM0O3NlbGVjdCYjMzQ7LCAmIzM0O2RlcGVuZHMgb24mIzM0OywgJiMzNDtpZiYjMzQ7LCAmIzM0O3RyaXN0YXRlJiMzNDssIGFuZCBwb3RlbnRpYWxseSAmIzM0O2Jvb2wmIzM0OyBvciBvdGhlciBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuCgpJJiMzOTttIGV4cGVjdGluZyB0byBmaW5kIGEgc2VjdGlvbiB0aGF0IGRlZmluZXMgYEtWTV9HVUVTVF9NRU1GRGAuIEl0IGNvdWxkIGJlIGRpcmVjdGx5IGRlZmluZWQsIG9yIHNlbGVjdGVkIGluZGlyZWN0bHkgdGhyb3VnaCBhIGxhcmdlciBLVk0gZmVhdHVyZS4gVGhlIGNvZGUgc2hvdWxkIHJldmVhbCBpZiBpdCYjMzk7cyBhIG1hbmRhdG9yeSBmZWF0dXJlIChib29sKSwgb3B0aW9uYWwgKHRyaXN0YXRlKSwgYW5kIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG5lZWQgdG8gYmUgZW5hYmxlZCBiZWZvcmUgYEtWTV9HVUVTVF9NRU1GRGAgY2FuIGJlIGVuYWJsZWQuIEkgYW0gcGFydGljdWxhcmx5IGxvb2tpbmcgZm9yIHRoZSBkZXBlbmRlbmN5IGNoYWlucyBhbmQgcmVsYXRpb25zaGlwcy4gQXJlIHRoZXJlIGNlcnRhaW4gQ1BVIGZlYXR1cmVzIG9yIGtlcm5lbCBjb25maWd1cmF0aW9ucyB0aGF0ICptdXN0KiBiZSBwcmVzZW50IGJlZm9yZSBgS1ZNX0dVRVNUX01FTUZEYCBpcyBldmVuIGNvbnNpZGVyZWQ/CgpPbmNlIEkgaGF2ZSBsb2NhdGVkIHRoZSByZWxldmFudCBzZWN0aW9uLCBteSBnb2FsIGlzIHRvIGRpc3RpbGwgdGhlIGxvZ2ljIHRoYXQgZGljdGF0ZXMgd2hlbiBgS1ZNX0dVRVNUX01FTUZEYCBpcyBhdmFpbGFibGUuIFVuZGVyc3RhbmRpbmcgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSB3aWxsIGJlIGtleS4gSSBuZWVkIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lLCBpZiBnaXZlbiBhIHNwZWNpZmljIHNldCBvZiBrZXJuZWwgY29uZmlndXJhdGlvbnMsIHdoZXRoZXIgYEtWTV9HVUVTVF9NRU1GRGAgd291bGQgYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyB3aWxsIGVpdGhlciBnaXZlIG1lIGNvbmZpZGVuY2UgdGhhdCBteSB1c2UgY2FzZSBpcyBzdXBwb3J0ZWQsIG9yIHdpbGwgZ2l2ZSBtZSBhIGNsZWFyIHBhdGggdG8gZ2V0IHRoZXJlLiBJdCYjMzk7cyB0aW1lIHRvIHJlYWQgc29tZSBjb2RlIGFuZCB1bmNvdmVyIHRoZXNlIGRlcGVuZGVuY2llcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7S1ZNX0dVRVNUX01FTUZEJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC94ODYva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gveDg2L2t2bS9LY29uZmlnPTIwPWNvbmZpZyBLVk1fWDg2XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctNDktXHRzZWxlY3QgS1ZNX1dFUlJPUiBpZiBXRVJST1JcbmFyY2gveDg2L2t2bS9LY29uZmlnOjUwOlx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRCBpZiBYODZfNjRcbmFyY2gveDg2L2t2bS9LY29uZmlnLTUxLVxuLS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmM9NTEzNT12b2lkIGt2bV9hcmNoX2FzeW5jX3BhZ2VfcmVhZHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2FzeW5jX3BmICp3b3JrKVxuLS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTE2NS1cbmFyY2gveDg2L2t2bS9tbXUvbW11LmM6NTE2NjojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYy01MTY3LXN0YXRpYyB2b2lkIGt2bV9hc3NlcnRfZ21lbV9pbnZhbGlkYXRlX2xvY2tfaGVsZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90KVxuLS1cbmFyY2gveDg2L2t2bS94ODYuYz0xMDYzND1ib29sIGt2bV9hcmNoX25vX3BvbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxuLS1cbmFyY2gveDg2L2t2bS94ODYuYy0xMDYzOC1cbmFyY2gveDg2L2t2bS94ODYuYzoxMDYzOTojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxuYXJjaC94ODYva3ZtL3g4Ni5jLTEwNjQwLS8qXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg0NTgKCQkJCQkJCW91dHB1dDogMzcKCQkJCQkJCXRob3VnaHRzOiA1OQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzOgoKKipBbmFseXppbmcgdGhlIEtWTSBMYW5kc2NhcGUqKgoKT2theSwgc28gd2UmIzM5O3JlIHRhbGtpbmcgYEtWTWAgaGVyZSwgc3BlY2lmaWNhbGx5LiBSaWdodCwgd2VsbCwgdGhlIGNvbnRleHQgaXMgbGlrZWx5IGtlcm5lbC1sZXZlbCB2aXJ0dWFsaXphdGlvbi4gSW1tZWRpYXRlbHksIEkmIzM5O20gdGhpbmtpbmcgb2YgdGhlIHZhcmlvdXMgZmxhdm9ycyDigJMgYEtWTV9JTlRFTGAsIGBLVk1fQU1EYCwgbWF5YmUgZXZlbiBgS1ZNX0dVRVNUX01FTUZEYC4gTGV0JiMzOTtzIGFzc3VtZSB0aGVzZSBhcmUgdGhlIG9wdGlvbnMgd2UgYXJlIGRlYWxpbmcgd2l0aC4KCkZpcnN0IHRoaW5ncyBmaXJzdCwgSSBuZWVkIHRvIHNlZSBob3cgYEtWTWAgaXMgY29uZmlndXJlZCwgd2hhdCBkZXBlbmRlbmNpZXMgaXQgaGFzLCBhbmQgd2hhdCB0aGUgb3ZlcmFsbCBzZXR1cCBsb29rcyBsaWtlIHdpdGhpbiB0aGUgeDg2IGFyY2hpdGVjdHVyZS4gVGhlIGdvLXRvIHBsYWNlIGZvciB0aGF0IGtpbmQgb2YgaW5mb3JtYXRpb24gaXMsIG9mIGNvdXJzZSwgdGhlIGBLY29uZmlnYCBmaWxlLiBTcGVjaWZpY2FsbHksIEkmIzM5O2xsIGp1bXAgaW50byBgYXJjaC94ODYva3ZtL0tjb25maWdgIHRvIGdldCB0aGUgbGF5IG9mIHRoZSBsYW5kLiBUaGF0JiMzOTtzIHdoZXJlIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIEtWTSBmb3IgeDg2IHN5c3RlbXMgYXJlIGRlZmluZWQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBmaW5lciBkZXRhaWxzLCBhbmQgSSBjYW4gc3RhcnQgZnJvbSB0aGVyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDthcmNoL3g4Ni9rdm0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDEsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7ICAgMTpcdCMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiAgIDI6XHQjXG4gICAzOlx0IyBLVk0gY29uZmlndXJhdGlvblxuICAgNDpcdCNcbiAgIDU6XHRcbiAgIDY6XHRzb3VyY2UgXCYjMzQ7dmlydC9rdm0vS2NvbmZpZ1wmIzM0O1xuICAgNzpcdFxuICAgODpcdG1lbnVjb25maWcgVklSVFVBTElaQVRJT05cbiAgIDk6XHRcdGJvb2wgXCYjMzQ7VmlydHVhbGl6YXRpb25cJiMzNDtcbiAgMTA6XHRcdGRlZmF1bHQgeVxuICAxMTpcdFx0aGVscFxuICAxMjpcdFx0ICBTYXkgWSBoZXJlIHRvIGdldCB0byBzZWUgb3B0aW9ucyBmb3IgdXNpbmcgeW91ciBMaW51eCBob3N0IHRvIHJ1biBvdGhlclxuICAxMzpcdFx0ICBvcGVyYXRpbmcgc3lzdGVtcyBpbnNpZGUgdmlydHVhbCBtYWNoaW5lcyAoZ3Vlc3RzKS5cbiAgMTQ6XHRcdCAgVGhpcyBvcHRpb24gYWxvbmUgZG9lcyBub3QgYWRkIGFueSBrZXJuZWwgY29kZS5cbiAgMTU6XHRcbiAgMTY6XHRcdCAgSWYgeW91IHNheSBOLCBhbGwgb3B0aW9ucyBpbiB0aGlzIHN1Ym1lbnUgd2lsbCBiZSBza2lwcGVkIGFuZCBkaXNhYmxlZC5cbiAgMTc6XHRcbiAgMTg6XHRpZiBWSVJUVUFMSVpBVElPTlxuICAxOTpcdFxuICAyMDpcdGNvbmZpZyBLVk1fWDg2XG4gIDIxOlx0XHRkZWZfdHJpc3RhdGUgS1ZNIGlmIChLVk1fSU5URUwgIT0gbiB8fCBLVk1fQU1EICE9IG4pXG4gIDIyOlx0XHRzZWxlY3QgS1ZNX0NPTU1PTlxuICAyMzpcdFx0c2VsZWN0IEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcbiAgMjQ6XHRcdHNlbGVjdCBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXG4gIDI1Olx0XHRzZWxlY3QgSEFWRV9LVk1fSVJRQ0hJUFxuICAyNjpcdFx0c2VsZWN0IEhBVkVfS1ZNX1BGTkNBQ0hFXG4gIDI3Olx0XHRzZWxlY3QgSEFWRV9LVk1fRElSVFlfUklOR19UU09cbiAgMjg6XHRcdHNlbGVjdCBIQVZFX0tWTV9ESVJUWV9SSU5HX0FDUV9SRUxcbiAgMjk6XHRcdHNlbGVjdCBIQVZFX0tWTV9JUlFfQllQQVNTXG4gIDMwOlx0XHRzZWxlY3QgSEFWRV9LVk1fSVJRX1JPVVRJTkdcbiAgMzE6XHRcdHNlbGVjdCBIQVZFX0tWTV9SRUFET05MWV9NRU1cbiAgMzI6XHRcdHNlbGVjdCBWSE9TVF9UQVNLXG4gIDMzOlx0XHRzZWxlY3QgS1ZNX0FTWU5DX1BGXG4gIDM0Olx0XHRzZWxlY3QgVVNFUl9SRVRVUk5fTk9USUZJRVJcbiAgMzU6XHRcdHNlbGVjdCBLVk1fTU1JT1xuICAzNjpcdFx0c2VsZWN0IFNDSEVEX0lORk9cbiAgMzc6XHRcdHNlbGVjdCBQRVJGX0VWRU5UU1xuICAzODpcdFx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTXG4gIDM5Olx0XHRzZWxlY3QgUEVSRl9HVUVTVF9NRURJQVRFRF9QTVVcbiAgNDA6XHRcdHNlbGVjdCBIQVZFX0tWTV9NU0lcbiAgNDE6XHRcdHNlbGVjdCBIQVZFX0tWTV9DUFVfUkVMQVhfSU5URVJDRVBUXG4gIDQyOlx0XHRzZWxlY3QgSEFWRV9LVk1fTk9fUE9MTFxuICA0MzpcdFx0c2VsZWN0IFZJUlRfWEZFUl9UT19HVUVTVF9XT1JLXG4gIDQ0Olx0XHRzZWxlY3QgS1ZNX0dFTkVSSUNfRElSVFlMT0dfUkVBRF9QUk9URUNUXG4gIDQ1Olx0XHRzZWxlY3QgS1ZNX1ZGSU9cbiAgNDY6XHRcdHNlbGVjdCBIQVZFX0tWTV9QTV9OT1RJRklFUiBpZiBQTVxuICA0NzpcdFx0c2VsZWN0IEtWTV9HRU5FUklDX0hBUkRXQVJFX0VOQUJMSU5HXG4gIDQ4Olx0XHRzZWxlY3QgS1ZNX0dFTkVSSUNfUFJFX0ZBVUxUX01FTU9SWVxuICA0OTpcdFx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXG4gIDUwOlx0XHRzZWxlY3QgS1ZNX0dVRVNUX01FTUZEIGlmIFg4Nl82NFxuICA1MTpcdFxuICA1MjpcdGNvbmZpZyBLVk1cbiAgNTM6XHRcdHRyaXN0YXRlIFwmIzM0O0tlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgKEtWTSkgc3VwcG9ydFwmIzM0O1xuICA1NDpcdFx0ZGVwZW5kcyBvbiBYODZfTE9DQUxfQVBJQ1xuICA1NTpcdFx0aGVscFxuICA1NjpcdFx0ICBTdXBwb3J0IGhvc3RpbmcgZnVsbHkgdmlydHVhbGl6ZWQgZ3Vlc3QgbWFjaGluZXMgdXNpbmcgaGFyZHdhcmVcbiAgNTc6XHRcdCAgdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9ucy4gIFlvdSB3aWxsIG5lZWQgYSBmYWlybHkgcmVjZW50XG4gIDU4Olx0XHQgIHByb2Nlc3NvciBlcXVpcHBlZCB3aXRoIHZpcnR1YWxpemF0aW9uIGV4dGVuc2lvbnMuIFlvdSB3aWxsIGFsc29cbiAgNTk6XHRcdCAgbmVlZCB0byBzZWxlY3Qgb25lIG9yIG1vcmUgb2YgdGhlIHByb2Nlc3NvciBtb2R1bGVzIGJlbG93LlxuICA2MDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEzLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjQwCgkJCQkJCQlvdXRwdXQ6IDM5CgkJCQkJCQl0aG91Z2h0czogMTY3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyB0aGUgS1ZNIFBhdGNoKioKCk9rYXksIHNvIHRoaXMgcGF0Y2ggaXMgcmVsYXRlZCB0byBLVk0sIHdoaWNoIGlzLCBvZiBjb3Vyc2UsIGZ1bGx5IHZpcnR1YWxpemVkIGFuZCBzdXBwb3J0ZWQgaW4gYm90aCBRRU1VIGFuZCBHb29nbGUgQ29tcHV0ZSBFbmdpbmUsIGFuZCBpdCYjMzk7cyBzb21ldGhpbmcgdGhhdCBzeXprYWxsZXIgbGlrZWx5IHRlc3RzIGV4dGVuc2l2ZWx5LCBwYXJ0aWN1bGFybHkgY29uY2VybmluZyB0aG9zZSBgL2Rldi9rdm1gIGlvY3Rscy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBjaGFuZ2VzLiBUaGUgZmlyc3Qgc3RlcCwgYXMgYWx3YXlzLCBpcyB0byBpZGVudGlmeSB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zLgoKQWxyaWdodCwgaGVyZSB0aGV5IGFyZTogYGt2bV9nbWVtX2JpbmRgIHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AsIGBrdm1fc2V0X21lbXNsb3RgIGluIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCwgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCBhbHNvIGluIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gTXkgbmV4dCBtb3ZlPyBJIG5lZWQgdGhlIGZ1bGwgcGljdHVyZS4gSSYjMzk7bSBnb2luZyB0byBwdWxsIHVwIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgemVybyBpbiBvbiB0aGUgYXJlYSBhcm91bmQgbGluZXMgNjEyLTY4MC4gVGhhdCYjMzk7bGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIFdpdGggdGhhdCBjb250ZXh0LCBJJiMzOTtsbCBiZSBhYmxlIHRvIHF1aWNrbHkgdW5kZXJzdGFuZCB0aGUgaW1wYWN0IG9mIHRoZSBwYXRjaCBhbmQgd2hlcmUgdG8gc3RhcnQgbXkgZGV0YWlsZWQgZXhhbWluYXRpb24uCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDYwNSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgNjA1Olx0XG4gNjA2Olx0aW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIDYwNzpcdFx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldClcbiA2MDg6XHR7XG4gNjA5Olx0XHR1b2ZmX3Qgc2l6ZSA9IHNsb3QtXHUwMDNlbnBhZ2VzIFx1MDAzY1x1MDAzYyBQQUdFX1NISUZUO1xuIDYxMDpcdFx0dW5zaWduZWQgbG9uZyBzdGFydCwgZW5kO1xuIDYxMTpcdFx0c3RydWN0IGdtZW1fZmlsZSAqZjtcbiA2MTI6XHRcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gNjEzOlx0XHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiA2MTQ6XHRcdGludCByID0gLUVJTlZBTDtcbiA2MTU6XHRcdHZvaWQgKnhhcjtcbiA2MTY6XHRcbiA2MTc6XHRcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcbiA2MTg6XHRcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVx1MDAzZWdtZW0ucGdvZmYpKTtcbiA2MTk6XHRcbiA2MjA6XHRcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcbiA2MjE6XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4gNjIyOlx0XG4gNjIzOlx0XHRmaWxlID0gZmdldChmZCk7XG4gNjI0Olx0XHRpZiAoIWZpbGUpXG4gNjI1Olx0XHRcdHJldHVybiAtRUJBREY7XG4gNjI2Olx0XG4gNjI3Olx0XHRpZiAoZmlsZS1cdTAwM2VmX29wICE9IFx1MDAyNmt2bV9nbWVtX2ZvcHMpXG4gNjI4Olx0XHRcdGdvdG8gZXJyO1xuIDYyOTpcdFxuIDYzMDpcdFx0ZiA9IGZpbGUtXHUwMDNlcHJpdmF0ZV9kYXRhO1xuIDYzMTpcdFx0aWYgKGYtXHUwMDNla3ZtICE9IGt2bSlcbiA2MzI6XHRcdFx0Z290byBlcnI7XG4gNjMzOlx0XG4gNjM0Olx0XHRpbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XG4gNjM1Olx0XG4gNjM2Olx0XHRpZiAoIVBBR0VfQUxJR05FRChvZmZzZXQpIHx8IG9mZnNldCAmIzQzOyBzaXplIFx1MDAzZSBpX3NpemVfcmVhZChpbm9kZSkpXG4gNjM3Olx0XHRcdGdvdG8gZXJyO1xuIDYzODpcdFxuIDYzOTpcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX2xvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NDA6XHRcbiA2NDE6XHRcdHN0YXJ0ID0gb2Zmc2V0IFx1MDAzZVx1MDAzZSBQQUdFX1NISUZUO1xuIDY0MjpcdFx0ZW5kID0gc3RhcnQgJiM0Mzsgc2xvdC1cdTAwM2VucGFnZXM7XG4gNjQzOlx0XG4gNjQ0Olx0XHRpZiAoIXhhX2VtcHR5KFx1MDAyNmYtXHUwMDNlYmluZGluZ3MpIFx1MDAyNlx1MDAyNlxuIDY0NTpcdFx0ICAgIHhhX2ZpbmQoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgXHUwMDI2c3RhcnQsIGVuZCAtIDEsIFhBX1BSRVNFTlQpKSB7XG4gNjQ2Olx0XHRcdHIgPSAtRUVYSVNUO1xuIDY0NzpcdFx0XHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjQ4Olx0XHRcdGdvdG8gZXJyO1xuIDY0OTpcdFx0fVxuIDY1MDpcdFxuIDY1MTpcdFx0LypcbiA2NTI6XHRcdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbiA2NTM6XHRcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XG4gNjU0Olx0XHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cbiA2NTU6XHRcdCAqL1xuIDY1NjpcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBmaWxlO1xuIDY1NzpcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gc3RhcnQ7XG4gNjU4Olx0XHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXG4gNjU5Olx0XHRcdHNsb3QtXHUwMDNlZmxhZ3MgfD0gS1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuIDY2MDpcdFxuIDY2MTpcdFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xuIDY2MjpcdFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY2MzpcdFxuIDY2NDpcdFx0LypcbiA2NjU6XHRcdCAqIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSwgZXZlbiBvbiBzdWNjZXNzLiAgVGhlIGZpbGUgcGlucyBLVk0sXG4gNjY2Olx0XHQgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcbiA2Njc6XHRcdCAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLlxuIDY2ODpcdFx0ICovXG4gNjY5Olx0XHRyID0geGFfaXNfZXJyKHhhcikgPyB4YV9lcnIoeGFyKSA6IDA7XG4gNjcwOlx0XHRpZiAocikge1xuIDY3MTpcdFx0XHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgTlVMTCwgR0ZQX0tFUk5FTCk7XG4gNjcyOlx0XHRcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gTlVMTDtcbiA2NzM6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLnBnb2ZmID0gMDtcbiA2NzQ6XHRcdFx0c2xvdC1cdTAwM2VmbGFncyBcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gNjc1Olx0XHR9XG4gNjc2Olx0ZXJyOlxuIDY3NzpcdFx0ZnB1dChmaWxlKTtcbiA2Nzg6XHRcdHJldHVybiByO1xuIDY3OTpcdH1cbiA2ODA6XHRcbiA2ODE6XHRzdGF0aWMgdm9pZCBfX2t2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LCBzdHJ1Y3QgZ21lbV9maWxlICpmKVxuIDY4MjpcdHtcbiA2ODM6XHRcdHVuc2lnbmVkIGxvbmcgc3RhcnQgPSBzbG90LVx1MDAzZWdtZW0ucGdvZmY7XG4gNjg0Olx0XHR1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICYjNDM7IHNsb3QtXHUwMDNlbnBhZ2VzO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE1LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMTM4MwoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDM5CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIG15IHRha2Ugb24gdGhlIHRob3VnaHQgcHJvY2Vzcywgc3VtbWFyaXplZCBhcyB5b3UgcmVxdWVzdGVkOgoKKipEaWdnaW5nIGludG8gTWVtb3J5IE1hbmFnZW1lbnQgaW4gS1ZNKioKCk9rYXksIHNvIHdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgbWVtb3J5IHJlZ2lvbnMgYXJlIGJlaW5nIHNldCB1cCBhbmQgbWFuYWdlZCB3aXRoaW4gS1ZNLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byB6ZXJvIGluIG9uIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCBiZWNhdXNlIHRoYXQmIzM5O3MgdXN1YWxseSB0aGUgaGVhcnQgb2YgdGhlIGNvcmUgS1ZNIGxvZ2ljLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byByZWZyZXNoIG15IG1lbW9yeSBvbiB0aGUgaW50ZXJhY3Rpb25zIGFyb3VuZCBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZ29pbmcgdG8gYmUgY3JpdGljYWwgZm9yIHRyYWNraW5nIGhvdyBtZW1vcnkgaXMgYWxsb2NhdGVkLCBtYXBwZWQsIGFuZCBwb3RlbnRpYWxseSByZW1hcHBlZCB3aXRoaW4gdGhlIGd1ZXN0JiMzOTtzIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4gSSYjMzk7bGwgbmVlZCB0byBzZWUgaG93IHRoZSBob3N0IG1hcHMgdGhlIGd1ZXN0JiMzOTtzIHBoeXNpY2FsIG1lbW9yeSwgYW5kIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBoeXBlcnZpc29yJiMzOTtzIHZpZXcgYW5kIHRoZSBoYXJkd2FyZS4gTGV0JiMzOTtzIHNlZSBob3cgdGhlc2UgYXJlIGNhbGxlZCwgd2hhdCBkYXRhIHN0cnVjdHVyZXMgdGhleSBtYW5pcHVsYXRlLCBhbmQgd2hhdCBpbXBsaWNhdGlvbnMgdGhvc2UgbWFuaXB1bGF0aW9ucyBoYXZlIG9uIHRoZSBvdmVyYWxsIG1lbW9yeSBvcmdhbml6YXRpb24uIEhvcGVmdWxseSwgbG9va2luZyBhdCB0aGVzZSBmdW5jdGlvbnMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBoYW5kbGVkIGF0IHRoZSBLVk0gbGV2ZWwsIGVzcGVjaWFsbHkgd2hlbiBjb25zaWRlcmluZyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBob3RwbHVnZ2luZyBzY2VuYXJpb3MuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQzPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkyMDpcdFx0ICpcbjE5MjE6XHRcdCAqIE1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgb24gYSB0ZW1wb3JhcnksIHVucmVhY2hhYmxlIHNsb3QuICBUaGUgb2xkXG4xOTIyOlx0XHQgKiBzbG90IG5lZWRzIHRvIGJlIHByZXNlcnZlZCBpbiBjYXNlIGEgbGF0ZXIgc3RlcCBmYWlscyBhbmQgdGhlXG4xOTIzOlx0XHQgKiBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQuXG4xOTI0Olx0XHQgKi9cbjE5MjU6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5MjY6XHRcdFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbjE5Mjc6XHRcdFx0aWYgKCFpbnZhbGlkX3Nsb3QpIHtcbjE5Mjg6XHRcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTI5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4xOTMwOlx0XHRcdH1cbjE5MzE6XHRcdFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcbjE5MzI6XHRcdH1cbjE5MzM6XHRcbjE5MzQ6XHRcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTM1Olx0XHRpZiAocilcbjE5MzY6XHRcdFx0Z290byBlcnI7XG4xOTM3Olx0XG4xOTM4Olx0XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbjE5Mzk6XHRcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4xOTQwOlx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDE6XHRcbjE5NDI6XHRcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbjE5NDM6XHRcdFx0aWYgKHIpXG4xOTQ0Olx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDU6XHRcdH1cbjE5NDY6XHRcbjE5NDc6XHRcdC8qXG4xOTQ4Olx0XHQgKiBGb3IgREVMRVRFIGFuZCBNT1ZFLCB0aGUgd29ya2luZyBzbG90IGlzIG5vdyBhY3RpdmUgYXMgdGhlIElOVkFMSURcbjE5NDk6XHRcdCAqIHZlcnNpb24gb2YgdGhlIG9sZCBzbG90LiAgTU9WRSBpcyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBhcyBpdCByZXVzZXNcbjE5NTA6XHRcdCAqIHRoZSBvbGQgc2xvdCBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9sZCBzbG90IChpbiB3b3JraW5nX3Nsb3QpLlxuMTk1MTpcdFx0ICogRm9yIENSRUFURSwgdGhlcmUgaXMgbm8gb2xkIHNsb3QuICBGb3IgREVMRVRFIGFuZCBGTEFHU19PTkxZLCB0aGVcbjE5NTI6XHRcdCAqIG9sZCBzbG90IGlzIGRldGFjaGVkIGJ1dCBvdGhlcndpc2UgcHJlc2VydmVkLlxuMTk1MzpcdFx0ICovXG4xOTU0Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUpXG4xOTU1Olx0XHRcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XG4xOTU2Olx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcbjE5NTc6XHRcdFx0a3ZtX2RlbGV0ZV9tZW1zbG90KGt2bSwgb2xkLCBpbnZhbGlkX3Nsb3QpO1xuMTk1ODpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxuMTk1OTpcdFx0XHRrdm1fbW92ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGludmFsaWRfc2xvdCk7XG4xOTYwOlx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0ZMQUdTX09OTFkpXG4xOTYxOlx0XHRcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcbjE5NjI6XHRcdGVsc2VcbjE5NjM6XHRcdFx0QlVHKCk7XG4xOTY0Olx0XG4xOTY1Olx0XHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cbjE5NjY6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXG4xOTY3Olx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTY4Olx0XG4xOTY5Olx0XHQvKlxuMTk3MDpcdFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cdTAwM2VhcmNoLCBjaGFuZ2VzIGFmdGVyIGRyb3BwaW5nIHNsb3RzX2FyY2hfbG9ja1xuMTk3MTpcdFx0ICogd2lsbCBkaXJlY3RseSBoaXQgdGhlIGZpbmFsLCBhY3RpdmUgbWVtc2xvdC4gIEFyY2hpdGVjdHVyZXMgYXJlXG4xOTcyOlx0XHQgKiByZXNwb25zaWJsZSBmb3Iga25vd2luZyB0aGF0IG5ldy1cdTAwM2VhcmNoIG1heSBiZSBzdGFsZS5cbjE5NzM6XHRcdCAqL1xuMTk3NDpcdFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTc1Olx0XG4xOTc2Olx0XHRyZXR1cm4gMDtcbjE5Nzc6XHRcbjE5Nzg6XHRlcnJfYmluZDpcbjE5Nzk6XHRcdGlmIChuZXcpIHtcbjE5ODA6XHRcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbjE5ODE6XHRcbjE5ODI6XHRcdFx0aWYgKG5ldy1cdTAwM2VkaXJ0eV9iaXRtYXAgXHUwMDI2XHUwMDI2ICghb2xkIHx8ICFvbGQtXHUwMDNlZGlydHlfYml0bWFwKSlcbjE5ODM6XHRcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbjE5ODQ6XHRcdH1cbjE5ODU6XHRlcnI6XG4xOTg2Olx0XHQvKlxuMTk4NzpcdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xuMTk4ODpcdFx0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXG4xOTg5Olx0XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4xOTkwOlx0XHQgKi9cbjE5OTE6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5OTI6XHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4xOTkzOlx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTk0Olx0XHR9IGVsc2Uge1xuMTk5NTpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTk2Olx0XHR9XG4xOTk3Olx0XHRyZXR1cm4gcjtcbjE5OTg6XHR9XG4xOTk5Olx0XG4yMDAwOlx0c3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLFxuMjAwMTpcdFx0XHRcdFx0ICAgICAgZ2ZuX3Qgc3RhcnQsIGdmbl90IGVuZClcbjIwMDI6XHR7XG4yMDAzOlx0XHRzdHJ1Y3Qga3ZtX21lbXNsb3RfaXRlciBpdGVyO1xuMjAwNDpcdFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE3LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzA2NwoJCQkJCQkJb3V0cHV0OiA0MAoJCQkJCQkJdGhvdWdodHM6IDI4CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5IZXJlJiMzOTtzIGEgc3VtbWFyeSBvZiBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIHJlcXVlc3RlZDoKCioqRGl2aW5nIERlZXBlciBpbnRvIEtWTSBNZW1vcnkgTWFuYWdlbWVudCoqCgpPa2F5LCBzbyB3ZSYjMzk7dmUgYmVlbiBsb29raW5nIGF0IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpbiBLVk0sIGFuZCBJIG5lZWQgdG8gem9vbSBpbiBvbiBhIHNwZWNpZmljIGFyZWEuIEkmIzM5O20gdGhpbmtpbmcgd2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIGRyaWxsIGRvd24gaW50byB0aGUgY29kZSBhcm91bmQgbGluZXMgMjA1OCB0byAyMTMwLiBUaGlzIHNlY3Rpb24gbGlrZWx5IGhhbmRsZXMgYSBjcml0aWNhbCBhc3BlY3Qgb2YgbWVtb3J5IGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSB2aXJ0dWFsIG1hY2hpbmUgZW52aXJvbm1lbnQuIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBpdCYjMzk7cyBpbnRlcmFjdGluZyB3aXRoIHRoZSBob3N0JiMzOTtzIHBoeXNpY2FsIG1lbW9yeSBhbmQgaG93IGl0JiMzOTtzIHNldHRpbmcgdXAgdGhlIG1hcHBpbmdzIGZvciBndWVzdCBhY2Nlc3MuIFRoZXJlIGNvdWxkIGJlIHNvbWUgc3VidGxlIGltcGxpY2F0aW9ucyBpbiB0aGF0IHJhbmdlIHJlZ2FyZGluZyBtZW1vcnkgYXNzaWdubWVudCwgcGVybWlzc2lvbnMsIG9yIGV2ZW4gcG90ZW50aWFsIHZ1bG5lcmFiaWxpdGllcyBpZiBub3QgcHJvcGVybHkgaGFuZGxlZC4gSSBzaG91bGQgY2hlY2sgdGhhdCByZWdpb24gc3BlY2lmaWNhbGx5IHRvIGV2YWx1YXRlIHBvc3NpYmxlIGlzc3VlcyByZWxhdGluZyB0byBtZW1vcnkgbWFuYWdlbWVudC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDM8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9rdm1fbWFpbi5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMjA1OCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsyMDU4Olx0XHQgKiBsb2dnaW5nLCBhbmQgc28gYXJlIGV4ZW1wdC5cbjIwNTk6XHRcdCAqL1xuMjA2MDpcdFx0aWYgKGlkIFx1MDAzYyBLVk1fVVNFUl9NRU1fU0xPVFMgXHUwMDI2XHUwMDI2XG4yMDYxOlx0XHQgICAgKG1lbS1cdTAwM2VtZW1vcnlfc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCkgXHUwMDNlIEtWTV9NRU1fTUFYX05SX1BBR0VTKVxuMjA2MjpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIwNjM6XHRcbjIwNjQ6XHRcdHNsb3RzID0gX19rdm1fbWVtc2xvdHMoa3ZtLCBhc19pZCk7XG4yMDY1Olx0XG4yMDY2Olx0XHQvKlxuMjA2NzpcdFx0ICogTm90ZSwgdGhlIG9sZCBtZW1zbG90IChhbmQgdGhlIHBvaW50ZXIgaXRzZWxmISkgbWF5IGJlIGludmFsaWRhdGVkXG4yMDY4Olx0XHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxuMjA2OTpcdFx0ICovXG4yMDcwOlx0XHRvbGQgPSBpZF90b19tZW1zbG90KHNsb3RzLCBpZCk7XG4yMDcxOlx0XG4yMDcyOlx0XHRpZiAoIW1lbS1cdTAwM2VtZW1vcnlfc2l6ZSkge1xuMjA3MzpcdFx0XHRpZiAoIW9sZCB8fCAhb2xkLVx1MDAzZW5wYWdlcylcbjIwNzQ6XHRcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbjIwNzU6XHRcbjIwNzY6XHRcdFx0aWYgKFdBUk5fT05fT05DRShrdm0tXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyBcdTAwM2Mgb2xkLVx1MDAzZW5wYWdlcykpXG4yMDc3Olx0XHRcdFx0cmV0dXJuIC1FSU87XG4yMDc4Olx0XG4yMDc5Olx0XHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcbjIwODA6XHRcdH1cbjIwODE6XHRcbjIwODI6XHRcdGJhc2VfZ2ZuID0gKG1lbS1cdTAwM2VndWVzdF9waHlzX2FkZHIgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuMjA4MzpcdFx0bnBhZ2VzID0gKG1lbS1cdTAwM2VtZW1vcnlfc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4yMDg0Olx0XG4yMDg1Olx0XHRpZiAoIW9sZCB8fCAhb2xkLVx1MDAzZW5wYWdlcykge1xuMjA4NjpcdFx0XHRjaGFuZ2UgPSBLVk1fTVJfQ1JFQVRFO1xuMjA4NzpcdFxuMjA4ODpcdFx0XHQvKlxuMjA4OTpcdFx0XHQgKiBUbyBzaW1wbGlmeSBLVk0gaW50ZXJuYWxzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFjcm9zc1xuMjA5MDpcdFx0XHQgKiBhbGwgbWVtc2xvdHMgbXVzdCBmaXQgaW4gYW4gdW5zaWduZWQgbG9uZy5cbjIwOTE6XHRcdFx0ICovXG4yMDkyOlx0XHRcdGlmICgoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgJiM0MzsgbnBhZ2VzKSBcdTAwM2Mga3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMpXG4yMDkzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk0Olx0XHR9IGVsc2UgeyAvKiBNb2RpZnkgYW4gZXhpc3Rpbmcgc2xvdC4gKi9cbjIwOTU6XHRcdFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXG4yMDk2Olx0XHRcdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4yMDk3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk4Olx0XHRcdGlmICgobWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyICE9IG9sZC1cdTAwM2V1c2Vyc3BhY2VfYWRkcikgfHxcbjIwOTk6XHRcdFx0ICAgIChucGFnZXMgIT0gb2xkLVx1MDAzZW5wYWdlcykgfHxcbjIxMDA6XHRcdFx0ICAgICgobWVtLVx1MDAzZWZsYWdzIF4gb2xkLVx1MDAzZWZsYWdzKSBcdTAwMjYgKEtWTV9NRU1fUkVBRE9OTFkgfCBLVk1fTUVNX0dVRVNUX01FTUZEKSkpXG4yMTAxOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMTAyOlx0XG4yMTAzOlx0XHRcdGlmIChiYXNlX2dmbiAhPSBvbGQtXHUwMDNlYmFzZV9nZm4pXG4yMTA0Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX01PVkU7XG4yMTA1Olx0XHRcdGVsc2UgaWYgKG1lbS1cdTAwM2VmbGFncyAhPSBvbGQtXHUwMDNlZmxhZ3MpXG4yMTA2Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX0ZMQUdTX09OTFk7XG4yMTA3Olx0XHRcdGVsc2UgLyogTm90aGluZyB0byBjaGFuZ2UuICovXG4yMTA4Olx0XHRcdFx0cmV0dXJuIDA7XG4yMTA5Olx0XHR9XG4yMTEwOlx0XG4yMTExOlx0XHRpZiAoKGNoYW5nZSA9PSBLVk1fTVJfQ1JFQVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkgXHUwMDI2XHUwMDI2XG4yMTEyOlx0XHQgICAga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzbG90cywgaWQsIGJhc2VfZ2ZuLCBiYXNlX2dmbiAmIzQzOyBucGFnZXMpKVxuMjExMzpcdFx0XHRyZXR1cm4gLUVFWElTVDtcbjIxMTQ6XHRcbjIxMTU6XHRcdC8qIEFsbG9jYXRlIGEgc2xvdCB0aGF0IHdpbGwgcGVyc2lzdCBpbiB0aGUgbWVtc2xvdC4gKi9cbjIxMTY6XHRcdG5ldyA9IGt6YWxsb2Nfb2JqKCpuZXcsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4yMTE3Olx0XHRpZiAoIW5ldylcbjIxMTg6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4yMTE5Olx0XG4yMTIwOlx0XHRuZXctXHUwMDNlYXNfaWQgPSBhc19pZDtcbjIxMjE6XHRcdG5ldy1cdTAwM2VpZCA9IGlkO1xuMjEyMjpcdFx0bmV3LVx1MDAzZWJhc2VfZ2ZuID0gYmFzZV9nZm47XG4yMTIzOlx0XHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuMjEyNDpcdFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuMjEyNTpcdFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuMjEyNjpcdFxuMjEyNzpcdFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG4yMTI4Olx0XHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4yMTI5Olx0XHRpZiAocilcbjIxMzA6XHRcdFx0Z290byBvdXQ7XG4yMTMxOlx0XG4yMTMyOlx0XHRyZXR1cm4gMDtcbjIxMzM6XHRcbjIxMzQ6XHRvdXQ6XG4yMTM1Olx0XHRrZnJlZShuZXcpO1xuMjEzNjpcdFx0cmV0dXJuIHI7XG4yMTM3Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE5LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0MzwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNDU4MgoJCQkJCQkJb3V0cHV0OiAzMQoJCQkJCQkJdGhvdWdodHM6IDU3MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLVk0gTWVtb3J5IE1hbmFnZW1lbnQgUGF0Y2gqKgoKT2theSwgbGV0JiMzOTtzIGRpc3NlY3QgdGhpcyBwYXRjaC4gSXQgc2VlbXMgd2UmIzM5O3JlIGRlYWxpbmcgd2l0aCBhIGNvcmUgS1ZNIG1lbW9yeSB2aXJ0dWFsaXphdGlvbiBlbmhhbmNlbWVudCwgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gYGd1ZXN0X21lbWZkYCBhbmQgbWVtb3J5IHNsb3RzLiBUaGlzIGltcGFjdHMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50L3ZpcnR1YWxpemF0aW9uIGxvZ2ljIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggdGhlIGAvZGV2L2t2bWAgaW50ZXJmYWNlIHZpYSBgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yYCBhbmQgYEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OYCBpb2N0bHMuCgpUaGUgZmlyc3QgZmlsZSwgYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBoYXMgYSBuZXcgY2hlY2sgdXNpbmcgYFdBUk5fT05fT05DRWAgZm9yIGEgc3BlY2lmaWMgbWVtb3J5IHNsb3QgZmxhZyAoYEtWTV9NRU1TTE9UX0dNRU1fT05MWWApLiBJdCBsb29rcyBsaWtlIHdlJiMzOTtyZSBoYXJkZW5pbmcgZXJyb3IgaGFuZGxpbmcgaW4gYHhhX3N0b3JlX3JhbmdlYCB3aGVuIHRoaW5ncyBnbyB3cm9uZyBhbmQgcmVzZXR0aW5nIHNvbWUgc2xvdCBkYXRhIGlmIHRoZSB3cml0ZSBmYWlscy4gVGhpcyBjbGVhbi11cCBpcyBpbXBvcnRhbnQuCgpUaGVuLCBgdmlydC9rdm0va3ZtX21haW4uY2AgcmVvcmRlcnMgdGhpbmdzLCBtb3ZpbmcgdGhlIGBrdm1fZ21lbV9iaW5kKClgIGNhbGwgKmFmdGVyKiBga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbigpYCB3aXRoaW4gYGt2bV9zZXRfbWVtc2xvdCgpYC4gVGhlcmUgaXMgYSBgV0FSTl9PTl9PTkNFYCBhc3NlcnRpb24gb24gdGhlIGBjaGFuZ2VgIHZhbHVlIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHRvIGVuc3VyZSB0aGF0IG9ubHkgYEtWTV9NUl9DUkVBVEVgIGlzIHByb2Nlc3NlZCAodGhlIHBhdGNoIGFwcGVhcnMgdG8gYmUgZGVhbGluZyB3aXRoIHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVtb3J5IHJlZ2lvbikuIEVycm9yIHVud2luZGluZyBpbiB0aGlzIHNlY3Rpb24gaXMgbm93IGhhbmRsZWQgYnkgdGhlIGludHJvZHVjdGlvbiBvZiBhbiBgZXJyX2JpbmRgIGxhYmVsLCBjYWxsaW5nIGBrdm1fYXJjaF9mcmVlX21lbXNsb3RgIGFuZCBga3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwYC4gVGhpcyBpcyBnb29kLCBlbnN1cmluZyBwcm9wZXIgcmVzb3VyY2UgcmVsZWFzZSBvbiBmYWlsdXJlLgoKR2l2ZW4gdGhlIHNjb3BlIG9mIHRoZSBjaGFuZ2UsIHdpdGggdGhlIG5ldyBgV0FSTl9PTl9PTkNFYCBhc3NlcnRpb25zIGFuZCB0aGUgbW9kaWZpY2F0aW9ucyB0byBiaW5kaW5nIHNlcXVlbmNpbmcgYW5kIGVycm9yIGhhbmRsaW5nLCB0aGlzIGlzIGRlZmluaXRlbHkgc29tZXRoaW5nIHRvIGZ1enouCgpOb3csIGxldCYjMzk7cyBpZGVudGlmeSB0aGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbnMuIFRoZSByZWxldmFudCBjb25maWd1cmF0aW9ucyBzZWVtIHRvIGJlIGBLVk1gLCBgS1ZNX0dVRVNUX01FTUZEYCwgYEtWTV9JTlRFTGAsIGFuZCBgS1ZNX0FNRGAuIEluIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AsIGBLVk1gIHdpbGwgc2VsZWN0IGBLVk1fR1VFU1RfTUVNRkRgIGlmIGl0IGlzIGFuIGBYODZfNjRgIG1hY2hpbmUuIFdlIG5lZWQgdG8gY2hlY2sgdGhlIEtjb25maWcgZmlsZXMgaW4gYHZpcnQva3ZtL0tjb25maWdgIGFuZCBgYXJjaC94ODYva3ZtL0tjb25maWdgIHRvIGNvbmZpcm0gdGhlc2UgZGVwZW5kZW5jaWVzIGFuZCB0aGUgY29uZmlndXJhdGlvbnMuIGBLVk1gIGlzIHRyaXN0YXRlL2Jvb2wuIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGJvb2xlYW4gKHNlbGVjdGVkIGJ5IGBLVk1fWDg2IGlmIFg4Nl82NGApLiBMZXQmIzM5O3MgZW5zdXJlIHRoYXQgYENPTkZJR19LVk1gIGFuZCBgQ09ORklHX0tWTV9HVUVTVF9NRU1GRGAgYXJlIHNldCBhcHByb3ByaWF0ZWx5LCBhbmQgY2hlY2sgZm9yIGFueSBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRoYXQgbWlnaHQgYmUgbmVlZGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtjb25maWcgS1ZNJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7YXJjaC94ODYva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2FyY2gveDg2L2t2bS9LY29uZmlnPTE4PWlmIFZJUlRVQUxJWkFUSU9OXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xOS1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjIwOmNvbmZpZyBLVk1fWDg2XG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMS1cdGRlZl90cmlzdGF0ZSBLVk0gaWYgKEtWTV9JTlRFTCAhPSBuIHx8IEtWTV9BTUQgIT0gbilcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjUyOmNvbmZpZyBLVk1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTUzLVx0dHJpc3RhdGUgXCYjMzQ7S2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSAoS1ZNKSBzdXBwb3J0XCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctNjgtXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo2OTpjb25maWcgS1ZNX1dFUlJPUlxuYXJjaC94ODYva3ZtL0tjb25maWctNzAtXHRib29sIFwmIzM0O0NvbXBpbGUgS1ZNIHdpdGggLVdlcnJvclwmIzM0O1xuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTgyLVxuYXJjaC94ODYva3ZtL0tjb25maWc6ODM6Y29uZmlnIEtWTV9TV19QUk9URUNURURfVk1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTg0LVx0Ym9vbCBcJiMzNDtFbmFibGUgc3VwcG9ydCBmb3IgS1ZNIHNvZnR3YXJlLXByb3RlY3RlZCBWTXNcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy05NS1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjk2OmNvbmZpZyBLVk1fSU5URUxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTk3LVx0dHJpc3RhdGUgXCYjMzQ7S1ZNIGZvciBJbnRlbCAoYW5kIGNvbXBhdGlibGUpIHByb2Nlc3NvcnMgc3VwcG9ydFwmIzM0O1xuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTEwNi1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjEwNzpjb25maWcgS1ZNX0lOVEVMX1BST1ZFX1ZFXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xMDgtICAgICAgICBib29sIFwmIzM0O0NoZWNrIHRoYXQgZ3Vlc3RzIGRvIG5vdCByZWNlaXZlICNWRSBleGNlcHRpb25zXCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWc9MTIyPWNvbmZpZyBYODZfU0dYX0tWTVxuLS1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTEzMy1cbmFyY2gveDg2L2t2bS9LY29uZmlnOjEzNDpjb25maWcgS1ZNX0lOVEVMX1REWFxuYXJjaC94ODYva3ZtL0tjb25maWctMTM1LVx0Ym9vbCBcJiMzNDtJbnRlbCBUcnVzdCBEb21haW4gRXh0ZW5zaW9ucyAoVERYKSBzdXBwb3J0XCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctMTQ1LVxuYXJjaC94ODYva3ZtL0tjb25maWc6MTQ2OmNvbmZpZyBLVk1fQU1EXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNDctXHR0cmlzdGF0ZSBcJiMzNDtLVk0gZm9yIEFNRCBwcm9jZXNzb3JzIHN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNTUtXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxNTY6Y29uZmlnIEtWTV9BTURfU0VWXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNTctXHRib29sIFwmIzM0O0FNRCBTZWN1cmUgRW5jcnlwdGVkIFZpcnR1YWxpemF0aW9uIChTRVYpIHN1cHBvcnRcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNzItXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxNzM6Y29uZmlnIEtWTV9JT0FQSUNcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE3NC1cdGJvb2wgXCYjMzQ7SS9PIEFQSUMsIFBJQywgYW5kIFBJVCBlbXVsYXRpb25cJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xODItXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxODM6Y29uZmlnIEtWTV9TTU1cbmFyY2gveDg2L2t2bS9LY29uZmlnLTE4NC1cdGJvb2wgXCYjMzQ7U3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBlbXVsYXRpb25cJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xOTMtXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxOTQ6Y29uZmlnIEtWTV9IWVBFUlZcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE5NS1cdGJvb2wgXCYjMzQ7U3VwcG9ydCBmb3IgTWljcm9zb2Z0IEh5cGVyLVYgZW11bGF0aW9uXCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctMjA3LVxuYXJjaC94ODYva3ZtL0tjb25maWc6MjA4OmNvbmZpZyBLVk1fWEVOXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMDktXHRib29sIFwmIzM0O1N1cHBvcnQgZm9yIFhlbiBoeXBlcmNhbGwgaW50ZXJmYWNlXCYjMzQ7XG4tLVxuYXJjaC94ODYva3ZtL0tjb25maWctMjE2LVxuYXJjaC94ODYva3ZtL0tjb25maWc6MjE3OmNvbmZpZyBLVk1fUFJPVkVfTU1VXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMTgtXHRib29sIFwmIzM0O1Byb3ZlIEtWTSBNTVUgY29ycmVjdG5lc3NcJiMzNDtcbi0tXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMjktXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoyMzA6Y29uZmlnIEtWTV9FWFRFUk5BTF9XUklURV9UUkFDS0lOR1xuYXJjaC94ODYva3ZtL0tjb25maWctMjMxLVx0Ym9vbFxuYXJjaC94ODYva3ZtL0tjb25maWctMjMyLVxuYXJjaC94ODYva3ZtL0tjb25maWc6MjMzOmNvbmZpZyBLVk1fTUFYX05SX1ZDUFVTXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMzQtXHRpbnQgXCYjMzQ7TWF4aW11bSBudW1iZXIgb2YgdkNQVXMgcGVyIEtWTSBndWVzdFwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNjk5NgoJCQkJCQkJb3V0cHV0OiAzMgoJCQkJCQkJdGhvdWdodHM6IDQyMwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBBbmFseXNpcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgSSBuZWVkIHRvIGNvbmZpcm0gdGhlIGNvbmZpZ3VyYXRpb24uIEl0IGxvb2tzIGxpa2UgYEtWTV9HVUVTVF9NRU1GRGAgaXMgZW5hYmxlZCB3aGVuIHRhcmdldGluZyB4ODZfNjQgYXJjaGl0ZWN0dXJlIGFuZCBLVk0gaXMgYWN0aXZlLCBtZWFuaW5nIGVpdGhlciBgS1ZNYCwgYEtWTV9JTlRFTGAsIG9yIGBLVk1fQU1EYCBpcyBzZWxlY3RlZC4gU28sIHRoZSBiYXNlIGlzIHNldCBmb3IgbWVtb3J5IGZpbGUgZGVzY3JpcHRvciBmdW5jdGlvbmFsaXR5IHdpdGhpbiBLVk0uCgpOb3csIGxldCYjMzk7cyBnZXQgaW50byB0aGUgc3BlY2lmaWNzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4gSSYjMzk7bSBmb2N1c2luZyBvbiB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zOiBga3ZtX2dtZW1fYmluZGAsIGBrdm1fc2V0X21lbXNsb3RgLCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAuIE15IGluaXRpYWwgdGhvdWdodCBpcyB0byBkZXRlcm1pbmUgaWYgdGhlc2UgYXJlIGNvcmUsIHdpZGVseS11c2VkIGZ1bmN0aW9ucyBvciBpZiB0aGV5JiMzOTtyZSBzcGVjaWZpYyBlbnRyeSBwb2ludHMgdG8gdGhlIGd1ZXN0IG1lbWZkIGxvZ2ljLgoKSXQgbG9va3MgbGlrZSBga3ZtX2dtZW1fYmluZGAgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgYmluZHMgYSBndWVzdCBtZW1mZCBmaWxlIHRvIGEgbWVtb3J5IHNsb3QsIGl0IGlzIHZlcnkgc3BlY2lmaWMuIGBrdm1fc2V0X21lbXNsb3RgIG1hbmFnZXMgbWVtc2xvdCBzdGF0ZSBjaGFuZ2VzIHdpdGhpbiBLVk0uIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGlzIG91ciBlbnRyeSBwb2ludCBmb3IgYEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OYCBjYWxscy4KCkZpbmFsbHksIEkgbmVlZCB0byBrbm93IHdoZXJlIHRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3NlZCBhbmQgdXNlZC4gSSBzZWUgdGhhdCBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYXJlIGRlZmluZWQgYXMgc3RhdGljIHdpdGhpbiBgdmlydC9rdm0va3ZtX21haW4uY2AsIHdoaWxlIGBrdm1fZ21lbV9iaW5kYCBpcyBub24tc3RhdGljLiBUaGlzIGxpa2VseSBtZWFucyBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYXJlIG5vdCBkaXJlY3RseSBleHBvcnRlZCwgYW5kIGBrdm1fZ21lbV9iaW5kYCBpcy4gSSYjMzk7bGwgbmVlZCB0byBjaGVjayB0aGUgY2FsbCBjaGFpbiB0byBlbnN1cmUgbm8gb3RoZXIgY3J1Y2lhbCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZXNlIGFyZSBhY3R1YWxseSBiZWluZyBjYWxsZWQgZnJvbSwgc3VjaCBhcyBpZiBga3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uYCBjYWxscyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMi8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3ZtX3NldF9tZW1vcnlfcmVnaW9uJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7dmlydC9rdm0mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYz0yMDAwPXN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwMTItXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIwMTM6c3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxudmlydC9rdm0va3ZtX21haW4uYy0yMDE0LVx0XHRcdFx0IGNvbnN0IHN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24yICptZW0pXG4tLVxudmlydC9rdm0va3ZtX21haW4uYz0yMTM5PWludCBrdm1fc2V0X2ludGVybmFsX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE0Ny1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MjE0ODpcdHJldHVybiBrdm1fc2V0X21lbW9yeV9yZWdpb24oa3ZtLCBtZW0pO1xudmlydC9rdm0va3ZtX21haW4uYy0yMTQ5LX1cbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIxNTI9c3RhdGljIGludCBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE1OC1cdGd1YXJkKG11dGV4KShcdTAwMjZrdm0tXHUwMDNlc2xvdHNfbG9jayk7XG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIxNTk6XHRyZXR1cm4ga3ZtX3NldF9tZW1vcnlfcmVnaW9uKGt2bSwgbWVtKTtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE2MC19XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MjYzCgkJCQkJCQlvdXRwdXQ6IDE4NwoJCQkJCQkJdGhvdWdodHM6IDMxNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBc3Nlc3NtZW50IG9mIHRoZSBLVk0gTWVtb3J5IE1hbmFnZW1lbnQgQ29tcG9uZW50cyoqCgpBbHJpZ2h0LCBsZXQmIzM5O3Mgc2VlLiBga3ZtX2dtZW1fYmluZGAsIGBrdm1fc2V0X21lbXNsb3RgLCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCwgYW5kIGBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25gIOKAkyB0aG9zZSBhcmUgdGhlIGtleSBzeW1ib2xzLCB0aGUgaGVhcnQgb2YgdGhpcyBhcmVhLCBhcyBJIHN1c3BlY3RlZC4gTm93LCBiZWZvcmUgSSBkZWNsYXJlIHRoaXMgYXMgJiMzNDtkb25lLCYjMzQ7IGxldCYjMzk7cyBqdXN0IG1ha2Ugc3VyZSBJJiMzOTttIG5vdCBtaXNzaW5nIGFueXRoaW5nLiBJIG5lZWQgdG8gZW5zdXJlIGEgY29tcGxldGUgcGljdHVyZSBoZXJlLgoKT2theSwgbGV0IG1lIGNoZWNrIHRoZSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZDogYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIE1ha2VzIHNlbnNlLiBBbmQgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIGFyZSBgS1ZNYCBhbmQgYEtWTV9HVUVTVF9NRU1GRGAuIEdvb2QsIHRoYXQgbGluZXMgdXAuCgpOb3csIHRpbWUgZm9yIHRoZSBzYW5pdHkgY2hlY2suIEZpcnN0LCByZWFjaGFiaWxpdHk6IHllcCwgS1ZNIGlvY3RscyBhcmUgaW5kZWVkIGFjY2Vzc2libGUgZnJvbSB1c2Vyc3BhY2UgdGhyb3VnaCBgL2Rldi9rdm1gLCBhbmQgYm90aCBndWVzdCBtZW1mZCBhbmQgbWVtb3J5IHJlZ2lvbnMgYXJlIGFjdGl2ZWx5IHN1cHBvcnRlZCBpbiBWTXMuIENoZWNrLgoKU2Vjb25kLCB3b3J0aCBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBUaGUgcmVmYWN0b3Jpbmcgb2YgbWVtc2xvdCBiaW5kaW5nIGVycm9yIGhhbmRsaW5nLCB0aGUgbW92ZSBvZiBga3ZtX2dtZW1fYmluZGAgaW5zaWRlIGBrdm1fc2V0X21lbXNsb3RgLCBhbmQgdGhlIGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbnMuLi4gYWxsIG9mIHRoYXQgc2NyZWFtcyBwb3RlbnRpYWwgZm9yIGludGVyZXN0aW5nIGZ1enppbmcgdGFyZ2V0cy4gRGVmaW5pdGVseSB3b3J0aCB0aGUgZWZmb3J0LgoKVGhlbiwgdGhlIGZvY3VzIHN5bWJvbHMgYXJlIGV4YWN0bHkgYXMgZXhwZWN0ZWQuIFRoZXkgYXJlOgoqICAgYGt2bV9nbWVtX2JpbmRgCiogICBga3ZtX3NldF9tZW1zbG90YAoqICAgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAKKiAgIGBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25gCgpBbmQgdGhlIGVuYWJsZSBjb25maWd1cmF0aW9ucyBhcmUganVzdCB3aGF0IEkgdGhvdWdodCwgbmFtZWx5OgoqICAgYEtWTWAKKiAgIGBLVk1fR1VFU1RfTUVNRkRgCgpZZXMsIGV2ZXJ5dGhpbmcmIzM5O3MgY2xlYXIsIGFjY3VyYXRlLCBhbmQgY29tcGxldGUuIFRpbWUgdG8gY2FsbCBpdC4gTGV0JiMzOTtzIHRyaWdnZXIgYHNldC1yZXN1bHRzYC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yNC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5zZXQtcmVzdWx0czwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0tWTSYjMzQ7LAogICAgJiMzNDtLVk1fR1VFU1RfTUVNRkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtrdm1fZ21lbV9iaW5kJiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICAgJiMzNDtrdm1fc2V0X21lbW9yeV9yZWdpb24mIzM0OywKICAgICYjMzQ7a3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcgbG9naWMgZm9yIGd1ZXN0X21lbWZkLiBJdCBtb3ZlcyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpLCBhZGRzIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucywgYW5kIHVwZGF0ZXMgZXJyb3IgdW53aW5kaW5nIGZvciBtZW1zbG90IGJpbmRpbmcgZmFpbHVyZXMgYW5kIHhhX3N0b3JlX3JhbmdlIGVycm9ycy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIEtWTSBpb2N0bHMgKHN1Y2ggYXMgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yKS4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7S1ZNJiMzNDssCiAgICAmIzM0O0tWTV9HVUVTVF9NRU1GRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O2t2bV9nbWVtX2JpbmQmIzM0OywKICAgICYjMzQ7a3ZtX3NldF9tZW1zbG90JiMzNDssCiAgICAmIzM0O2t2bV9zZXRfbWVtb3J5X3JlZ2lvbiYjMzQ7LAogICAgJiMzNDtrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI1LzE8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5hY3Rpb248L3RkPgoJCQk8dGQ+SWY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmFnZW50PC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmNvcmU8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRqdXN0cyB0aGUgZXJyb3IgaGFuZGxpbmcgYW5kIHNlcXVlbmNlIG9mIGt2bV9nbWVtX2JpbmQoKSB3aXRoaW4gS1ZNJiMzOTtzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cblxuQWxsIGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0dXJlcyAoc3VjaCBhcyBrdm1fbWVtb3J5X3Nsb3QpIGFyZSB6ZXJvLWFsbG9jYXRlZCB3aXRoIGt6YWxsb2Nfb2JqKCksIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiwgeGFyKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIG5vIGRhdGEgaXMgY29waWVkIHRvIHVzZXJzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQgaW4ga2VybmVsLWludGVybmFsIHN0YXRlLiBBcyB0aGlzIGNoYW5nZSBkZWFscyBzdHJpY3RseSB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBjbGVhbnVwIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlcywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQgYW5kIHN0YW5kYXJkIEtBU0FOIHRlc3RpbmcgaXMgc3VmZmljaWVudC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+SW5zdHJ1Y3Rpb246PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5Zb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnkKZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQKZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKQpmdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy4KCkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOgotIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGUKICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU4KICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQCiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy4KLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCwKICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuCgpSdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLApMT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLgpBIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZCnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzCnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uCgpMb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdAp1bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZiwKYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzCnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nCnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbApmbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsCmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLgoKU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOgoxLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYgogICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkcwogICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLgoyLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzCiAgIG9yIHN0cnVjdCBmaWVsZHMuCjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHMKICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy4KNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3MKICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLgoKU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6Ci0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXIKICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHQKICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuCi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWQKICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuCi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLgoKVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZQpkZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IDA3MTE1NTM2YmMyN2ZkMmM3MDFiNTE3ODJmOGZiMmI2ZjYyOWMwMWQKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgVGh1IFNlcCAzIDE1OjQzOjE5IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMKaW5kZXggYjU5NjQ4NmQxODRjYS4uMzIzMTU5YzliNWYzNCAxMDA2NDQKLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jCkBAIC02MTIsMTAgJiM0Mzs2MTIsMTQgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LAogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJaW50IHIgPSAtRUlOVkFMOwomIzQzOwl2b2lkICp4YXI7CiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7CiAJQlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtJmd0O2dtZW0ucGdvZmYpKTsKIAomIzQzOwlpZiAoV0FSTl9PTl9PTkNFKHNsb3QtJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpCiYjNDM7CQlyZXR1cm4gLUVJTlZBTDsKJiM0MzsKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKCFmaWxlKQogCQlyZXR1cm4gLUVCQURGOwpAQCAtNjQ5LDEyICYjNDM7NjUzLDEyIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdAogCSAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLgogCSAqLwotCVdSSVRFX09OQ0Uoc2xvdC0mZ3Q7Z21lbS5maWxlLCBmaWxlKTsKJiM0MzsJc2xvdC0mZ3Q7Z21lbS5maWxlID0gZmlsZTsKIAlzbG90LSZndDtnbWVtLnBnb2ZmID0gc3RhcnQ7CiAJaWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKQogCQlzbG90LSZndDtmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7CiAKLQl4YV9zdG9yZV9yYW5nZSgmYW1wO2YtJmd0O2JpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7CiYjNDM7CXhhciA9IHhhX3N0b3JlX3JhbmdlKCZhbXA7Zi0mZ3Q7YmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTsKIAlmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLSZndDtpX21hcHBpbmcpOwogCiAJLyoKQEAgLTY2Miw3ICYjNDM7NjY2LDEzIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCwKIAkgKiBub3QgdGhlIG90aGVyIHdheSAmIzM5O3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGUKIAkgKiBmaWxlIGlzIGNsb3NlZCBiZWZvcmUgbWVtc2xvdHMgYXJlIGRlc3Ryb3llZC4KIAkgKi8KLQlyID0gMDsKJiM0MzsJciA9IHhhX2lzX2Vycih4YXIpID8geGFfZXJyKHhhcikgOiAwOwomIzQzOwlpZiAocikgewomIzQzOwkJeGFfc3RvcmVfcmFuZ2UoJmFtcDtmLSZndDtiaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpOwomIzQzOwkJc2xvdC0mZ3Q7Z21lbS5maWxlID0gTlVMTDsKJiM0MzsJCXNsb3QtJmd0O2dtZW0ucGdvZmYgPSAwOwomIzQzOwkJc2xvdC0mZ3Q7ZmxhZ3MgJmFtcDs9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7CiYjNDM7CX0KIGVycjoKIAlmcHV0KGZpbGUpOwogCXJldHVybiByOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYwomIzQzOyYjNDM7JiM0MzsgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xODg3LDcgJiM0MzsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm9sZCwKIAkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldywKLQkJCSAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpCiYjNDM7CQkJICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSwKJiM0MzsJCQkgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KQogewogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDsKIAlpbnQgcjsKQEAgLTE5MzEsMjAgJiM0MzsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKIAl9CiAKIAlyID0ga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwotCWlmIChyKSB7Ci0JCS8qCi0JCSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vCi0JCSAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZAotCQkgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28KLQkJICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suCi0JCSAqLwotCQlpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7Ci0JCQlrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTsKLQkJCWtmcmVlKGludmFsaWRfc2xvdCk7Ci0JCX0gZWxzZSB7Ci0JCQltdXRleF91bmxvY2soJmFtcDtrdm0tJmd0O3Nsb3RzX2FyY2hfbG9jayk7Ci0JCX0KLQkJcmV0dXJuIHI7CiYjNDM7CWlmIChyKQomIzQzOwkJZ290byBlcnI7CiYjNDM7CiYjNDM7CWlmIChuZXcgJmFtcDsmYW1wOyBuZXctJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHsKJiM0MzsJCWlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKQomIzQzOwkJCWdvdG8gZXJyX2JpbmQ7CiYjNDM7CiYjNDM7CQlyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgZ21lbV9mZCwgZ21lbV9vZmZzZXQpOwomIzQzOwkJaWYgKHIpCiYjNDM7CQkJZ290byBlcnJfYmluZDsKIAl9CiAKIAkvKgpAQCAtMTk3Nyw2ICYjNDM7MTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sCiAJa3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7CiAKIAlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJfYmluZDoKJiM0MzsJaWYgKG5ldykgewomIzQzOwkJa3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTsKJiM0MzsKJiM0MzsJCWlmIChuZXctJmd0O2RpcnR5X2JpdG1hcCAmYW1wOyZhbXA7ICghb2xkIHx8ICFvbGQtJmd0O2RpcnR5X2JpdG1hcCkpCiYjNDM7CQkJa3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7CiYjNDM7CX0KJiM0MztlcnI6CiYjNDM7CS8qCiYjNDM7CSAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnMKJiM0MzsJICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuCiYjNDM7CSAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay4KJiM0MzsJICovCiYjNDM7CWlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHsKJiM0MzsJCWt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpOwomIzQzOwkJa2ZyZWUoaW52YWxpZF9zbG90KTsKJiM0MzsJfSBlbHNlIHsKJiM0MzsJCW11dGV4X3VubG9jaygmYW1wO2t2bS0mZ3Q7c2xvdHNfYXJjaF9sb2NrKTsKJiM0MzsJfQomIzQzOwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGJvb2wga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzdHJ1Y3Qga3ZtX21lbXNsb3RzICpzbG90cywgaW50IGlkLApAQCAtMjA1OCw3ICYjNDM7MjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAkJaWYgKFdBUk5fT05fT05DRShrdm0tJmd0O25yX21lbXNsb3RfcGFnZXMgJmx0OyBvbGQtJmd0O25wYWdlcykpCiAJCQlyZXR1cm4gLUVJTzsKIAotCQlyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTsKJiM0MzsJCXJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTsKIAl9CiAKIAliYXNlX2dmbiA9IChtZW0tJmd0O2d1ZXN0X3BoeXNfYWRkciAmZ3Q7Jmd0OyBQQUdFX1NISUZUKTsKQEAgLTIxMDUsMjEgJiM0MzsyMTIzLDE0IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSwKIAluZXctJmd0O25wYWdlcyA9IG5wYWdlczsKIAluZXctJmd0O2ZsYWdzID0gbWVtLSZndDtmbGFnczsKIAluZXctJmd0O3VzZXJzcGFjZV9hZGRyID0gbWVtLSZndDt1c2Vyc3BhY2VfYWRkcjsKLQlpZiAobWVtLSZndDtmbGFncyAmYW1wOyBLVk1fTUVNX0dVRVNUX01FTUZEKSB7Ci0JCXIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBtZW0tJmd0O2d1ZXN0X21lbWZkLCBtZW0tJmd0O2d1ZXN0X21lbWZkX29mZnNldCk7Ci0JCWlmIChyKQotCQkJZ290byBvdXQ7Ci0JfQogCi0JciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpOwomIzQzOwlyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSwKJiM0MzsJCQkgICAgbWVtLSZndDtndWVzdF9tZW1mZCwgbWVtLSZndDtndWVzdF9tZW1mZF9vZmZzZXQpOwogCWlmIChyKQotCQlnb3RvIG91dF91bmJpbmQ7CiYjNDM7CQlnb3RvIG91dDsKIAogCXJldHVybiAwOwogCi1vdXRfdW5iaW5kOgotCWlmIChtZW0tJmd0O2ZsYWdzICZhbXA7IEtWTV9NRU1fR1VFU1RfTUVNRkQpCi0JCWt2bV9nbWVtX3VuYmluZChuZXcpOwogb3V0OgogCWtmcmVlKG5ldyk7CiAJcmV0dXJuIHI7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjI3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA0MDE1CgkJCQkJCQlvdXRwdXQ6IDMxCgkJCQkJCQl0aG91Z2h0czogNTAxCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV2YWx1YXRpbmcgdGhlIEtWTSBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgTmVlZHMqKgoKT2theSwgc28gSSBuZWVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhpcyBwYXRjaCBzZXJpZXMgbmVjZXNzaXRhdGVzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiwgb3IgaWYgd2UmIzM5O3JlIGdvb2Qgd2l0aCB0aGUgc3RhbmRhcmQgS0FTQU4vTE9DS0RFUC9idWcgZGV0ZWN0b3IgYXBwcm9hY2guIExldCYjMzk7cyBkaXZlIGluLgoKRmlyc3QsIEkgc2VlIHRoZSBwYXRjaGVzIHRvdWNoIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCBhbmQgYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBUaGF0IGdpdmVzIG1lIGEgc3RhcnRpbmcgcG9pbnQuIExldCYjMzk7cyBicmVhayBpdCBkb3duOgoKSW4gYGd1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYGt2bV9nbWVtX2JpbmRgOiBpdCBsb29rcyBsaWtlIHdlJiMzOTt2ZSBnb3QgYSBgV0FSTl9PTl9PTkNFYCBpZiBgc2xvdC0mZ3Q7ZmxhZ3NgIGhhcyBgS1ZNX01FTVNMT1RfR01FTV9PTkxZYCBzZXQuIEludGVyZXN0aW5nLiBUaGVuIHRoZXJlIGlzIGFuIGVycm9yIGNoZWNrIGZvbGxvd2luZyBgeGFfc3RvcmVfcmFuZ2VgIHdoaWNoIHJvbGxzIGJhY2sgb24gZXJyb3IsIGNsZWFyaW5nIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzIHJlbGF0ZWQgdG8gZ21lbSBhbmQgaGFuZGxpbmcgbWVtb3J5IHNsb3QgZmxhZ3MuIFRoZSBvcmlnaW5hbCBwYXRjaCB1c2VzIGBXUklURV9PTkNFYCB0byBzZXQgdGhlIGdtZW0gZmlsZSBhbmQgaGFzIG5vdyBiZWVuIHJlcGxhY2VkIHdpdGggYSBkaXJlY3QgYXNzaWdubWVudC4gSSYjMzk7bGwgbmVlZCB0byBkb3VibGUtY2hlY2sgd2h5IHRoYXQgY2hhbmdlIHdhcyBtYWRlLgoKT3ZlciBpbiBga3ZtX21haW4uY2AsIGBrdm1fc2V0X21lbXNsb3RgIGhhcyBhZGRlZCBuZXcgcGFyYW1ldGVycywgYGdtZW1fZmRgIGFuZCBgZ21lbV9vZmZzZXRgLiBBbmQgaXQgbG9va3MgbGlrZSBga3ZtX2dtZW1fYmluZGAgaGFzIGJlZW4gbW92ZWQgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBpbnRvIGBrdm1fc2V0X21lbXNsb3RgLiAgRXJyb3IgdW53aW5kaW5nIGlzIGluIHBsYWNlIGlmIGBrdm1fZ21lbV9iaW5kYCBmYWlscywgd2hpY2ggaW5jbHVkZXMgcmVsZWFzaW5nIG1lbW9yeSBzbG90cyBhbmQgZGVzdHJveWluZyB0aGUgZGlydHkgYml0bWFwLCBpZiBuZWNlc3NhcnkuIEFuZCBmaW5hbGx5LCBpbiBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCwgdGhlIHBhdGNoIHBhc3NlcyB0aGUgbWVtZmQgcGFyYW1ldGVycyB0byBga3ZtX3NldF9tZW1zbG90YCBhbmQgcmVtb3ZlcyB0aGUgb2xkIGJpbmRpbmcgbG9naWMuCgpOb3csIEkgbmVlZCB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHRoZSBwb3RlbnRpYWwgZm9yIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzLiBUaW1lIHRvIGZpcmUgdXAgbXkgdHJ1c3R5IHRvb2xzIOKAkyByZWFkLWZpbGUgb3IgZ3JlcHBlciDigJMgYW5kIHJlYWxseSBkaWcgaW50byB0aGUgY29kZS4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3IgYW55IGNsdWVzIHRoYXQgY291bGQgaW5kaWNhdGUgc29tZXRoaW5nIG5ldyB0byBmdXp6LCBvciBpZiB0aGlzIGNoYW5nZSBpcyBqdXN0IG1vdmluZyBzb21lIGxvZ2ljIGFyb3VuZC4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7a3ZtX2dtZW1fYmluZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmM9NTkyPWludCBrdm1fZ21lbV9jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2NyZWF0ZV9ndWVzdF9tZW1mZCAqYXJncylcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjA2OmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjA3LVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldClcbi0tXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cdCAqIG1lbXNsb3RzIG9mIGZsYWcgS1ZNX01FTV9HVUVTVF9NRU1GRCBhcmUgaW1tdXRhYmxlIHRvIGNoYW5nZSwgc29cbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmM6NjUzOlx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmMtNjU0LVx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xMD1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpO1xudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoxMTppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVx0XHQgIHVuc2lnbmVkIGludCBmZCwgdW9mZl90IG9mZnNldCk7XG4tLVxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaD0xOT1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2dtZW1fZXhpdCh2b2lkKSB7fTtcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjA6c3RhdGljIGlubGluZSBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVx0XHRcdFx0XHQgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbi0tXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE4ODc9c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTk0MjpcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0My1cdFx0aWYgKHIpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MjkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDU2MTYKCQkJCQkJCW91dHB1dDogMzkKCQkJCQkJCXRob3VnaHRzOiA1MgoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBhbmFseXNpcyBvZiB0aGUgcHJvdmlkZWQgdGV4dCwgc3VtbWFyaXplZCBpbiB0aGUgZmlyc3QgcGVyc29uIGFzIGlmIHRoZXkgd2VyZSBteSB0aG91Z2h0czoKCioqQW5hbHl6aW5nIEtWTSBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoZSBndXRzIG9mIEtWTSYjMzk7cyBndWVzdCBtZW1vcnkgbWFuYWdlbWVudC4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgaXMgYWN0dWFsbHkgYm91bmQgdG8gZ3Vlc3QgcHJvY2Vzc2VzIHVzaW5nIG1lbWZkcy4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYSBmb3Igc2VjdXJpdHkgYW5kIHBlcmZvcm1hbmNlLCBzbyBJIHdhbnQgYSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVyYWN0aW9ucyBpbnZvbHZlZC4KClRoZW4sIHRvIHB1dCBpdCBpbnRvIHRoZSB3aWRlciBjb250ZXh0IG9mIGhvdyB0aGlzIG1lbW9yeSBnZXRzIHNldCB1cCBpbml0aWFsbHksIEkmIzM5O2xsIG5lZWQgdG8ganVtcCBvdmVyIHRvIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCBhbmQgdGFrZSBhIGNsb3NlIGxvb2sgYXQgYm90aCBga3ZtX2dtZW1fYmluZGAgYW5kIGhvdyBga3ZtX3NldF9tZW1zbG90YCB3b3Jrcy4gVW5kZXJzdGFuZGluZyBob3cgbWVtc2xvdHMgYXJlIGNvbmZpZ3VyZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbWVtZmQgYmluZGluZyBpcyBlc3NlbnRpYWwgdG8gZ3Jhc3BpbmcgdGhlIGNvbXBsZXRlIG1lbW9yeSBtYXBwaW5nIHBpY3R1cmUuIEkmIzM5O20gdGhpbmtpbmcgSSYjMzk7bGwgdHJhY2UgZGF0YSBmbG93IGFuZCBjb250cm9sIHBhdGhzIHRvIGJ1aWxkIGEgbWVudGFsIG1hcCBvZiB0aGUgcHJvY2VzcywgbG9va2luZyBmb3IgYW55IG9wdGltaXphdGlvbiBib3R0bGVuZWNrcyBvciBzZWN1cml0eSB2dWxuZXJhYmlsaXRpZXMgYXMgSSBnby4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4zMC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMDMgMTU6NDQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDt2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogNjA1LAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDc1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OyA2MDU6XHRcbiA2MDY6XHRpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gNjA3Olx0XHRcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KVxuIDYwODpcdHtcbiA2MDk6XHRcdHVvZmZfdCBzaXplID0gc2xvdC1cdTAwM2VucGFnZXMgXHUwMDNjXHUwMDNjIFBBR0VfU0hJRlQ7XG4gNjEwOlx0XHR1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7XG4gNjExOlx0XHRzdHJ1Y3QgZ21lbV9maWxlICpmO1xuIDYxMjpcdFx0c3RydWN0IGlub2RlICppbm9kZTtcbiA2MTM6XHRcdHN0cnVjdCBmaWxlICpmaWxlO1xuIDYxNDpcdFx0aW50IHIgPSAtRUlOVkFMO1xuIDYxNTpcdFx0dm9pZCAqeGFyO1xuIDYxNjpcdFxuIDYxNzpcdFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xuIDYxODpcdFx0QlVJTERfQlVHX09OKHNpemVvZihnZm5fdCkgIT0gc2l6ZW9mKHNsb3QtXHUwMDNlZ21lbS5wZ29mZikpO1xuIDYxOTpcdFxuIDYyMDpcdFx0aWYgKFdBUk5fT05fT05DRShzbG90LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxuIDYyMTpcdFx0XHRyZXR1cm4gLUVJTlZBTDtcbiA2MjI6XHRcbiA2MjM6XHRcdGZpbGUgPSBmZ2V0KGZkKTtcbiA2MjQ6XHRcdGlmICghZmlsZSlcbiA2MjU6XHRcdFx0cmV0dXJuIC1FQkFERjtcbiA2MjY6XHRcbiA2Mjc6XHRcdGlmIChmaWxlLVx1MDAzZWZfb3AgIT0gXHUwMDI2a3ZtX2dtZW1fZm9wcylcbiA2Mjg6XHRcdFx0Z290byBlcnI7XG4gNjI5Olx0XG4gNjMwOlx0XHRmID0gZmlsZS1cdTAwM2Vwcml2YXRlX2RhdGE7XG4gNjMxOlx0XHRpZiAoZi1cdTAwM2Vrdm0gIT0ga3ZtKVxuIDYzMjpcdFx0XHRnb3RvIGVycjtcbiA2MzM6XHRcbiA2MzQ6XHRcdGlub2RlID0gZmlsZV9pbm9kZShmaWxlKTtcbiA2MzU6XHRcbiA2MzY6XHRcdGlmICghUEFHRV9BTElHTkVEKG9mZnNldCkgfHwgb2Zmc2V0ICYjNDM7IHNpemUgXHUwMDNlIGlfc2l6ZV9yZWFkKGlub2RlKSlcbiA2Mzc6XHRcdFx0Z290byBlcnI7XG4gNjM4Olx0XG4gNjM5Olx0XHRmaWxlbWFwX2ludmFsaWRhdGVfbG9jayhpbm9kZS1cdTAwM2VpX21hcHBpbmcpO1xuIDY0MDpcdFxuIDY0MTpcdFx0c3RhcnQgPSBvZmZzZXQgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQ7XG4gNjQyOlx0XHRlbmQgPSBzdGFydCAmIzQzOyBzbG90LVx1MDAzZW5wYWdlcztcbiA2NDM6XHRcbiA2NDQ6XHRcdGlmICgheGFfZW1wdHkoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncykgXHUwMDI2XHUwMDI2XG4gNjQ1Olx0XHQgICAgeGFfZmluZChcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBcdTAwMjZzdGFydCwgZW5kIC0gMSwgWEFfUFJFU0VOVCkpIHtcbiA2NDY6XHRcdFx0ciA9IC1FRVhJU1Q7XG4gNjQ3Olx0XHRcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiA2NDg6XHRcdFx0Z290byBlcnI7XG4gNjQ5Olx0XHR9XG4gNjUwOlx0XG4gNjUxOlx0XHQvKlxuIDY1MjpcdFx0ICogbWVtc2xvdHMgb2YgZmxhZyBLVk1fTUVNX0dVRVNUX01FTUZEIGFyZSBpbW11dGFibGUgdG8gY2hhbmdlLCBzb1xuIDY1MzpcdFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbiA2NTQ6XHRcdCAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLlxuIDY1NTpcdFx0ICovXG4gNjU2Olx0XHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XG4gNjU3Olx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcbiA2NTg6XHRcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcbiA2NTk6XHRcdFx0c2xvdC1cdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gNjYwOlx0XG4gNjYxOlx0XHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4gNjYyOlx0XHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gNjYzOlx0XG4gNjY0Olx0XHQvKlxuIDY2NTpcdFx0ICogRHJvcCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBmaWxlLCBldmVuIG9uIHN1Y2Nlc3MuICBUaGUgZmlsZSBwaW5zIEtWTSxcbiA2NjY6XHRcdCAqIG5vdCB0aGUgb3RoZXIgd2F5ICYjMzk7cm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIDY2NzpcdFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gNjY4Olx0XHQgKi9cbiA2Njk6XHRcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbiA2NzA6XHRcdGlmIChyKSB7XG4gNjcxOlx0XHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbiA2NzI6XHRcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuIDY3MzpcdFx0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuIDY3NDpcdFx0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiA2NzU6XHRcdH1cbiA2NzY6XHRlcnI6XG4gNjc3Olx0XHRmcHV0KGZpbGUpO1xuIDY3ODpcdFx0cmV0dXJuIHI7XG4gNjc5Olx0fVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA3MTQzCgkJCQkJCQlvdXRwdXQ6IDQwCgkJCQkJCQl0aG91Z2h0czogMzEKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjoKCioqRGl2aW5nIGludG8gS1ZNIENvcmU6IEEgVGFyZ2V0ZWQgTG9vayoqCgpPa2F5LCB0aW1lIHRvIGdldCBteSBoYW5kcyBkaXJ0eS4gSSYjMzk7dmUgZ290IGEgaHVuY2gsIGFuZCBJIG5lZWQgdG8gdmVyaWZ5IGl0IGluIHRoZSBLVk0gY29kZWJhc2UuIFNwZWNpZmljYWxseSwgSSYjMzk7bSBnb2luZyB0byBmb2N1cyBteSBhdHRlbnRpb24gb24gYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBNeSBndXQgc2F5cyB0aGF0IHRoZSBsb2dpYyBJJiMzOTttIGludGVyZXN0ZWQgaW4gaXMgbGlrZWx5IHdpdGhpbiB0aGUgdmljaW5pdHkgb2YgbGluZXMgMTg4NyB0byAyMTM1LiBUaGlzIHJhbmdlIHByb2JhYmx5IGVuY2Fwc3VsYXRlcyB0aGUgY3JpdGljYWwgY29kZSBJIG5lZWQgdG8gc2NydXRpbml6ZS4gSSYjMzk7bSBub3QgZ29pbmcgaW4gYmxpbmQ7IEkgaGF2ZSBhIHNwZWNpZmljIGNvbmNlcHQgSSYjMzk7bSBjaGFzaW5nLiBMZXQmIzM5O3Mgc2VlIGlmIHRob3NlIGxpbmVzIGhvbGQgdGhlIGtleS4gSSBleHBlY3QgSSB3aWxsIGJlIGRpZ2dpbmcgaW50byB0aGUgZmluZXIgZGV0YWlscyBvZiB0aGUgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBzZWN0aW9uIHRvIGZpbmQgd2hhdCBJIG5lZWQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzIvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7dmlydC9rdm0va3ZtX21haW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDE5MjAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogODAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7MTkyMDpcdFx0ICpcbjE5MjE6XHRcdCAqIE1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgb24gYSB0ZW1wb3JhcnksIHVucmVhY2hhYmxlIHNsb3QuICBUaGUgb2xkXG4xOTIyOlx0XHQgKiBzbG90IG5lZWRzIHRvIGJlIHByZXNlcnZlZCBpbiBjYXNlIGEgbGF0ZXIgc3RlcCBmYWlscyBhbmQgdGhlXG4xOTIzOlx0XHQgKiBpbnZhbGlkYXRpb24gbmVlZHMgdG8gYmUgcmV2ZXJ0ZWQuXG4xOTI0Olx0XHQgKi9cbjE5MjU6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5MjY6XHRcdFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcbjE5Mjc6XHRcdFx0aWYgKCFpbnZhbGlkX3Nsb3QpIHtcbjE5Mjg6XHRcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTI5Olx0XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4xOTMwOlx0XHRcdH1cbjE5MzE6XHRcdFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcbjE5MzI6XHRcdH1cbjE5MzM6XHRcbjE5MzQ6XHRcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTM1Olx0XHRpZiAocilcbjE5MzY6XHRcdFx0Z290byBlcnI7XG4xOTM3Olx0XG4xOTM4Olx0XHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbjE5Mzk6XHRcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4xOTQwOlx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDE6XHRcbjE5NDI6XHRcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbjE5NDM6XHRcdFx0aWYgKHIpXG4xOTQ0Olx0XHRcdFx0Z290byBlcnJfYmluZDtcbjE5NDU6XHRcdH1cbjE5NDY6XHRcbjE5NDc6XHRcdC8qXG4xOTQ4Olx0XHQgKiBGb3IgREVMRVRFIGFuZCBNT1ZFLCB0aGUgd29ya2luZyBzbG90IGlzIG5vdyBhY3RpdmUgYXMgdGhlIElOVkFMSURcbjE5NDk6XHRcdCAqIHZlcnNpb24gb2YgdGhlIG9sZCBzbG90LiAgTU9WRSBpcyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBhcyBpdCByZXVzZXNcbjE5NTA6XHRcdCAqIHRoZSBvbGQgc2xvdCBhbmQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIG9sZCBzbG90IChpbiB3b3JraW5nX3Nsb3QpLlxuMTk1MTpcdFx0ICogRm9yIENSRUFURSwgdGhlcmUgaXMgbm8gb2xkIHNsb3QuICBGb3IgREVMRVRFIGFuZCBGTEFHU19PTkxZLCB0aGVcbjE5NTI6XHRcdCAqIG9sZCBzbG90IGlzIGRldGFjaGVkIGJ1dCBvdGhlcndpc2UgcHJlc2VydmVkLlxuMTk1MzpcdFx0ICovXG4xOTU0Olx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUpXG4xOTU1Olx0XHRcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XG4xOTU2Olx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcbjE5NTc6XHRcdFx0a3ZtX2RlbGV0ZV9tZW1zbG90KGt2bSwgb2xkLCBpbnZhbGlkX3Nsb3QpO1xuMTk1ODpcdFx0ZWxzZSBpZiAoY2hhbmdlID09IEtWTV9NUl9NT1ZFKVxuMTk1OTpcdFx0XHRrdm1fbW92ZV9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGludmFsaWRfc2xvdCk7XG4xOTYwOlx0XHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0ZMQUdTX09OTFkpXG4xOTYxOlx0XHRcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcbjE5NjI6XHRcdGVsc2VcbjE5NjM6XHRcdFx0QlVHKCk7XG4xOTY0Olx0XG4xOTY1Olx0XHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cbjE5NjY6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXG4xOTY3Olx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTY4Olx0XG4xOTY5Olx0XHQvKlxuMTk3MDpcdFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cdTAwM2VhcmNoLCBjaGFuZ2VzIGFmdGVyIGRyb3BwaW5nIHNsb3RzX2FyY2hfbG9ja1xuMTk3MTpcdFx0ICogd2lsbCBkaXJlY3RseSBoaXQgdGhlIGZpbmFsLCBhY3RpdmUgbWVtc2xvdC4gIEFyY2hpdGVjdHVyZXMgYXJlXG4xOTcyOlx0XHQgKiByZXNwb25zaWJsZSBmb3Iga25vd2luZyB0aGF0IG5ldy1cdTAwM2VhcmNoIG1heSBiZSBzdGFsZS5cbjE5NzM6XHRcdCAqL1xuMTk3NDpcdFx0a3ZtX2NvbW1pdF9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4xOTc1Olx0XG4xOTc2Olx0XHRyZXR1cm4gMDtcbjE5Nzc6XHRcbjE5Nzg6XHRlcnJfYmluZDpcbjE5Nzk6XHRcdGlmIChuZXcpIHtcbjE5ODA6XHRcdFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcbjE5ODE6XHRcbjE5ODI6XHRcdFx0aWYgKG5ldy1cdTAwM2VkaXJ0eV9iaXRtYXAgXHUwMDI2XHUwMDI2ICghb2xkIHx8ICFvbGQtXHUwMDNlZGlydHlfYml0bWFwKSlcbjE5ODM6XHRcdFx0XHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcbjE5ODQ6XHRcdH1cbjE5ODU6XHRlcnI6XG4xOTg2Olx0XHQvKlxuMTk4NzpcdFx0ICogRm9yIERFTEVURS9NT1ZFLCByZXZlcnQgdGhlIGFib3ZlIElOVkFMSUQgY2hhbmdlLiAgTm8gbW9kaWZpY2F0aW9uc1xuMTk4ODpcdFx0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXG4xOTg5Olx0XHQgKiBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc28gcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4xOTkwOlx0XHQgKi9cbjE5OTE6XHRcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcbjE5OTI6XHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4xOTkzOlx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4xOTk0Olx0XHR9IGVsc2Uge1xuMTk5NTpcdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4xOTk2Olx0XHR9XG4xOTk3Olx0XHRyZXR1cm4gcjtcbjE5OTg6XHR9XG4xOTk5Olx0XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzMvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDg2NzEKCQkJCQkJCW91dHB1dDogMzIKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aGlua2luZyBwcm9jZXNzOgoKKipEaXZpbmcgaW50byBLVk0gTWVtb3J5IE1hbmFnZW1lbnQqKgoKT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGBrdm1fc2V0X21lbXNsb3RgIGFuZCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCBhcmUgYmVpbmcgdXNlZC4gVGhlc2UgYXJlIGNyaXRpY2FsIGZ1bmN0aW9ucyBpbiBLVk0gZm9yIG1hbmFnaW5nIHRoZSB2aXJ0dWFsIG1hY2hpbmUmIzM5O3MgbWVtb3J5LCByaWdodD8gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBjYWxscyB0byB0aGVzZSBmdW5jdGlvbnMgdG8gdW5kZXJzdGFuZCAqd2hvKiBpcyBzZXR0aW5nIHVwIG1lbW9yeSwgKndoZW4qIGluIHRoZSBWTSBsaWZlY3ljbGUsIGFuZCAqaG93KiB0aGUgbWVtb3J5IGlzIGJlaW5nIGNvbmZpZ3VyZWQuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGluaXRpYWwgc2V0dXAsIGR5bmFtaWMgYWRkaXRpb24vcmVtb3ZhbCBvZiBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBLbm93aW5nIHRoZSBjYWxsZXIgZnVuY3Rpb25zIHdpbGwgcHJvdmlkZSBjb250ZXh0LiBJJiMzOTttIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiB3aGV0aGVyIHRoZXkmIzM5O3JlIGludm9rZWQgZHVyaW5nIGd1ZXN0IHN0YXJ0dXAsIGhvdHBsdWcgb3BlcmF0aW9ucywgb3IgcGVyaGFwcyBieSBzb21lIGZvcm0gb2YgbWVtb3J5IGJhbGxvb25pbmcuIEkgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSB1c2UgY2FzZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzQvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2t2bV9zZXRfbWVtc2xvdCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O3ZpcnQva3ZtJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2t2bV9tYWluLmM9MTYwMT1zdGF0aWMgdm9pZCBrdm1fc3dhcF9hY3RpdmVfbWVtc2xvdHMoc3RydWN0IGt2bSAqa3ZtLCBpbnQgYXNfaWQpXG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0xNjI4LVx0LypcbnZpcnQva3ZtL2t2bV9tYWluLmM6MTYyOTpcdCAqIEFjcXVpcmVkIGluIGt2bV9zZXRfbWVtc2xvdC4gTXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgc3luY2hyb25pemVcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTYzMC1cdCAqIFNSQ1UgYmVsb3cgaW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBhbm90aGVyIHRocmVhZFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MTg3ND1zdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmMtMTg4Ni1cbnZpcnQva3ZtL2t2bV9tYWluLmM6MTg4NzpzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE4ODgtXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLFxuLS1cbnZpcnQva3ZtL2t2bV9tYWluLmM9MjAxMz1zdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMDY3LVx0ICogTm90ZSwgdGhlIG9sZCBtZW1zbG90IChhbmQgdGhlIHBvaW50ZXIgaXRzZWxmISkgbWF5IGJlIGludmFsaWRhdGVkXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIwNjg6XHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxudmlydC9rdm0va3ZtX21haW4uYy0yMDY5LVx0ICovXG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMDc4LVxudmlydC9rdm0va3ZtX21haW4uYzoyMDc5Olx0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFLCAtMSwgMCk7XG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwODAtXHR9XG4tLVxudmlydC9rdm0va3ZtX21haW4uYy0yMTI2LVxudmlydC9rdm0va3ZtX21haW4uYzoyMTI3Olx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIxMjgtXHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzUvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk0ODkKCQkJCQkJCW91dHB1dDogNDAKCQkJCQkJCXRob3VnaHRzOiAzNwoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCBmcmFtZWQgYXMgYW4gZXhwZXJ0JiMzOTtzIGludGVybmFsIG1vbm9sb2d1ZToKCioqSW52ZXN0aWdhdGluZyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCoqCgpBbHJpZ2h0LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoYXQgMjAxMy0yMTQwIHJhbmdlLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBleGFjdGx5IGhvdyB0aGlzIGZ1bmN0aW9uIGhhbmRsZXMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGluaXRpYWxpemF0aW9uIHdoZW4gZGVhbGluZyB3aXRoIHRoZSBgbmV3YCB2YXJpYWJsZSwgYmVjYXVzZSB0aGF0JiMzOTtzIHdoZXJlIHRoaW5ncyBjYW4gb2Z0ZW4gZ28gc2lkZXdheXMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMgY29ycmVjdGx5LiBNeSBleHBlcmllbmNlIHNheXMgdGhhdCBpcyB0aGUgbW9zdCBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgaW4gdGhlc2Uga2luZHMgb2Ygcm91dGluZXMsIHNvIGxldCYjMzk7cyBzdGFydCB0aGVyZS4gSSYjMzk7bSBlc3BlY2lhbGx5IGludGVyZXN0ZWQgaW4gaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSB1bmRlcmx5aW5nIHBhZ2UgdGFibGVzIGFuZCBtZW1vcnkgbWFwcGluZy4gTGV0JiMzOTtzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgbWlzdGFrZXMgaW4gdGhlIGxvZ2ljLCBvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBpZiB0aGlzIGlzIG11bHRpdGhyZWFkZWQuIEdvdHRhIGJlIG1ldGhvZGljYWwgaGVyZSBhbmQgYXZvaWQgYW55IGFzc3VtcHRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM2LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O3ZpcnQva3ZtL2t2bV9tYWluLmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAyMDgwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDYwCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzIwODA6XHRcdH1cbjIwODE6XHRcbjIwODI6XHRcdGJhc2VfZ2ZuID0gKG1lbS1cdTAwM2VndWVzdF9waHlzX2FkZHIgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuMjA4MzpcdFx0bnBhZ2VzID0gKG1lbS1cdTAwM2VtZW1vcnlfc2l6ZSBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG4yMDg0Olx0XG4yMDg1Olx0XHRpZiAoIW9sZCB8fCAhb2xkLVx1MDAzZW5wYWdlcykge1xuMjA4NjpcdFx0XHRjaGFuZ2UgPSBLVk1fTVJfQ1JFQVRFO1xuMjA4NzpcdFxuMjA4ODpcdFx0XHQvKlxuMjA4OTpcdFx0XHQgKiBUbyBzaW1wbGlmeSBLVk0gaW50ZXJuYWxzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFjcm9zc1xuMjA5MDpcdFx0XHQgKiBhbGwgbWVtc2xvdHMgbXVzdCBmaXQgaW4gYW4gdW5zaWduZWQgbG9uZy5cbjIwOTE6XHRcdFx0ICovXG4yMDkyOlx0XHRcdGlmICgoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgJiM0MzsgbnBhZ2VzKSBcdTAwM2Mga3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMpXG4yMDkzOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk0Olx0XHR9IGVsc2UgeyAvKiBNb2RpZnkgYW4gZXhpc3Rpbmcgc2xvdC4gKi9cbjIwOTU6XHRcdFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXG4yMDk2Olx0XHRcdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4yMDk3Olx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMDk4Olx0XHRcdGlmICgobWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyICE9IG9sZC1cdTAwM2V1c2Vyc3BhY2VfYWRkcikgfHxcbjIwOTk6XHRcdFx0ICAgIChucGFnZXMgIT0gb2xkLVx1MDAzZW5wYWdlcykgfHxcbjIxMDA6XHRcdFx0ICAgICgobWVtLVx1MDAzZWZsYWdzIF4gb2xkLVx1MDAzZWZsYWdzKSBcdTAwMjYgKEtWTV9NRU1fUkVBRE9OTFkgfCBLVk1fTUVNX0dVRVNUX01FTUZEKSkpXG4yMTAxOlx0XHRcdFx0cmV0dXJuIC1FSU5WQUw7XG4yMTAyOlx0XG4yMTAzOlx0XHRcdGlmIChiYXNlX2dmbiAhPSBvbGQtXHUwMDNlYmFzZV9nZm4pXG4yMTA0Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX01PVkU7XG4yMTA1Olx0XHRcdGVsc2UgaWYgKG1lbS1cdTAwM2VmbGFncyAhPSBvbGQtXHUwMDNlZmxhZ3MpXG4yMTA2Olx0XHRcdFx0Y2hhbmdlID0gS1ZNX01SX0ZMQUdTX09OTFk7XG4yMTA3Olx0XHRcdGVsc2UgLyogTm90aGluZyB0byBjaGFuZ2UuICovXG4yMTA4Olx0XHRcdFx0cmV0dXJuIDA7XG4yMTA5Olx0XHR9XG4yMTEwOlx0XG4yMTExOlx0XHRpZiAoKGNoYW5nZSA9PSBLVk1fTVJfQ1JFQVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkgXHUwMDI2XHUwMDI2XG4yMTEyOlx0XHQgICAga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzbG90cywgaWQsIGJhc2VfZ2ZuLCBiYXNlX2dmbiAmIzQzOyBucGFnZXMpKVxuMjExMzpcdFx0XHRyZXR1cm4gLUVFWElTVDtcbjIxMTQ6XHRcbjIxMTU6XHRcdC8qIEFsbG9jYXRlIGEgc2xvdCB0aGF0IHdpbGwgcGVyc2lzdCBpbiB0aGUgbWVtc2xvdC4gKi9cbjIxMTY6XHRcdG5ldyA9IGt6YWxsb2Nfb2JqKCpuZXcsIEdGUF9LRVJORUxfQUNDT1VOVCk7XG4yMTE3Olx0XHRpZiAoIW5ldylcbjIxMTg6XHRcdFx0cmV0dXJuIC1FTk9NRU07XG4yMTE5Olx0XG4yMTIwOlx0XHRuZXctXHUwMDNlYXNfaWQgPSBhc19pZDtcbjIxMjE6XHRcdG5ldy1cdTAwM2VpZCA9IGlkO1xuMjEyMjpcdFx0bmV3LVx1MDAzZWJhc2VfZ2ZuID0gYmFzZV9nZm47XG4yMTIzOlx0XHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuMjEyNDpcdFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuMjEyNTpcdFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuMjEyNjpcdFxuMjEyNzpcdFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG4yMTI4Olx0XHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4yMTI5Olx0XHRpZiAocilcbjIxMzA6XHRcdFx0Z290byBvdXQ7XG4yMTMxOlx0XG4yMTMyOlx0XHRyZXR1cm4gMDtcbjIxMzM6XHRcbjIxMzQ6XHRvdXQ6XG4yMTM1Olx0XHRrZnJlZShuZXcpO1xuMjEzNjpcdFx0cmV0dXJuIHI7XG4yMTM3Olx0fVxuMjEzODpcdFxuMjEzOTpcdGludCBrdm1fc2V0X2ludGVybmFsX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjM3LzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8wMyAxNTo0NDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMDcwOAoJCQkJCQkJb3V0cHV0OiAyMDIKCQkJCQkJCXRob3VnaHRzOiA4NTcKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQXNzZXNzbWVudCBvZiBLVk0gTWVtc2xvdCBCaW5kaW5nIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIHNlZSBpZiBpdCBpbnRyb2R1Y2VzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMsIGdpdmVuIG15IGV4cGVydGlzZSBpbiB0aGlzIGFyZWEuCgpGaXJzdCwgSSBzZWUgdGhlIHBhdGNoIGlzIHByaW1hcmlseSBmb2N1c2VkIG9uIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24gYW5kIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgbWVtc2xvdCBjcmVhdGlvbiBwcm9jZXNzLCBtb3ZpbmcgYW5kIG1vZGlmeWluZyB0aGUgY2FsbCB0byBga3ZtX2dtZW1fYmluZGAuIFdlJiMzOTtyZSB0YWxraW5nIGFib3V0IG1lbXNsb3QgYmluZGluZyBzcGVjaWZpY2FsbHkgaW4gdGhlIGNvbnRleHQgb2YgZ2xvYmFsIG1lbW9yeSAoZ21lbSkgd2l0aGluIEtWTS4KCkhlcmUmIzM5O3MgbXkgYW5hbHlzaXM6CgoxLiAgKipga3ZtX2dtZW1fYmluZGAgQnJlYWtkb3duOioqIFRoZSBwYXRjaCBub3cgaW5jbHVkZXMgYSBgV0FSTl9PTl9PTkNFYCBjaGVjay4gVGhlbiB0aGUgY29kZSBzZXRzIGBzbG90LSZndDtnbWVtLmZpbGUgPSBmaWxlO2AsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgYWNjZXNzIGlzIHNhZmUuIFRoZSBwYXRjaCBhbHNvIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZWAuICBDcml0aWNhbGx5LCB0aGUgcGF0Y2ggaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgeGFfc3RvcmVfcmFuZ2VgIGZhaWxzIChmb3IgaW5zdGFuY2UsIGR1ZSB0byAtRU5PTUVNKSBieSBwcm9wZXJseSBjbGVhbmluZyB1cCB0aGUgYmluZGluZyBhbmQgcmVzZXR0aW5nIHJlbGV2YW50IGZpZWxkcy4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudC4KCjIuICAqKmBrdm1fc2V0X21lbXNsb3RgIE1vZGlmaWNhdGlvbjoqKiAgYGt2bV9nbWVtX2JpbmRgIGlzIG5vdyBjYWxsZWQgd2l0aGluIGBrdm1fc2V0X21lbXNsb3RgLCBhZnRlciBga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbmAuIEVycm9yIGhhbmRsaW5nIGhhcyBiZWVuIGFkZGVkIGlmIHRoZSBiaW5kaW5nIGZhaWxzLCBpbmNsdWRpbmcgY2xlYW51cCBvZiBhcmNoIG1lbXNsb3QgcmVzb3VyY2VzIGFuZCB0aGUgZGlydHkgYml0bWFwLiBUaGUgcGF0Y2ggYWxzbyBtb3ZlcyB0aGUgYGt2bV9nbWVtX2JpbmRgIGNhbGwgZnJvbSBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCB0byBga3ZtX3NldF9tZW1zbG90YC4KCjMuICAqKktNU0FOIENvbnNpZGVyYXRpb25zOioqIEkmIzM5O3ZlIGNhcmVmdWxseSBjb25zaWRlcmVkIHRoZSBLTVNBTiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5OgoKICAgICogICBObyBrZXJuZWwgc3RydWN0dXJlcyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2UgaGVyZS4gVGhhdCYjMzk7cyBhIGh1Z2UgcG9zaXRpdmUuCiAgICAqICAgVmFyaWFibGVzIGFyZSBlaXRoZXIgaW5pdGlhbGl6ZWQgZGlyZWN0bHkgb3IgYWxsb2NhdGVkIHVzaW5nIGBremFsbG9jX29iamAsIHdoaWNoIHplcm8taW5pdGlhbGl6ZXMuIE5vIHVuaW5pdGlhbGl6ZWQgcmVhZHMgaGVyZS4KICAgICogICBObyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGNhdXNlIHByb2JsZW1zLiBFdmVyeXRoaW5nIGlzIGhhbmRsZWQgcHJvcGVybHkuCiAgICAqICAgQm91bmRzIGNoZWNrcyBhbmQgbGVuZ3RocyBsb29rIGZpbmUgaW4gcmVsYXRpb24gdG8gdW5pbml0aWFsaXplZCBtZW1vcnkgaXNzdWVzLgoKNC4gICoqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGFuYWx5c2lzLCBJJiMzOTttIGNvbmZpZGVudCB0aGF0IHRoaXMgcGF0Y2ggKipkb2VzIG5vdCBpbnRyb2R1Y2UqKiBhbnkgdW5pbml0aWFsaXplZCBtZW1vcnkgYnVncy4gSXQgZG9lc24mIzM5O3QgYWx0ZXIgYW55IGRhdGEgZmxvdyBpbiB0aGF0IHJlZ2FyZC4gSW4gZmFjdCwgaXQgaW1wcm92ZXMgZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQsIGVzcGVjaWFsbHkgaW4gaG93IGBrdm1fZ21lbV9iaW5kYCBpbnRlcmFjdHMgd2l0aCBgeGFfc3RvcmVfcmFuZ2VgLiBUaGVzZSBpbXByb3ZlbWVudHMgYXJlIGVycm9yIHVud2luZGluZy9zeW5jaHJvbml6YXRpb24vcmVzb3VyY2UgbWFuYWdlbWVudCBjb25jZXJucywgYW5kIHRoZXkgY2FuIGJlIGNhdWdodCBieSBLQVNBTiBhbmQgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2Vycy4KCkxldCYjMzk7cyBkbyBhIHF1aWNrIGRvdWJsZS1jaGVjazoKLSBgeGFyYCBpcyBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBiZWZvcmUgdXNlCi0gYHNsb3RgIGlzIHByb3Blcmx5IGFsbG9jYXRlZCB3aXRoIGBremFsbG9jX29iamAKLSBObyBzdGFjayB2YXJpYWJsZXMgYXJlIHVuaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZS4KLSBObyBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbi4KClRoZXJlZm9yZSwgYE5lZWRzS01TQU4gPSBmYWxzZWAuIEkmIzM5O20gcmVhZHkgdG8gcHJlcGFyZSB0aGUgdG9vbCBjYWxsIHRvIGBzZXQtcmVzdWx0c2AuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MzgvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzAzIDE1OjQ0PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+c2V0LXJlc3VsdHM8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSYjMzk7cyBtZW1zbG90IHNldHVwIChrdm1fc2V0X21lbXNsb3QoKSkuIFNwZWNpZmljYWxseSwgaXQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgeGFfc3RvcmVfcmFuZ2UoKSwgdW53aW5kcyB0aGUgbWVtc2xvdCBmaWVsZHMgYW5kIHhhcnJheSBiaW5kaW5ncyBvbiBmYWlsdXJlLCBhbmQgbW92ZXMgdGhlIGJpbmQgY2FsbCBhZnRlciBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKCkuXG5cbkFsbCBhbGxvY2F0ZWQgbWVtb3J5IHN0cnVjdHVyZXMgKHN1Y2ggYXMga3ZtX21lbW9yeV9zbG90KSBhcmUgemVyby1hbGxvY2F0ZWQgd2l0aCBremFsbG9jX29iaigpLCBsb2NhbCB2YXJpYWJsZXMgKGUuZy4sIHhhcikgYXJlIGZ1bGx5IGluaXRpYWxpemVkIGJlZm9yZSB1c2UsIGFuZCBubyBkYXRhIGlzIGNvcGllZCB0byB1c2Vyc3BhY2Ugb3IgbGVmdCB1bmluaXRpYWxpemVkIGluIGtlcm5lbC1pbnRlcm5hbCBzdGF0ZS4gQXMgdGhpcyBjaGFuZ2UgZGVhbHMgc3RyaWN0bHkgd2l0aCBlcnJvciBoYW5kbGluZyBhbmQgcmVzb3VyY2UgY2xlYW51cCByYXRoZXIgdGhhbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3Mgb3IgaW5mb3JtYXRpb24gZGlzY2xvc3VyZXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkIGFuZCBzdGFuZGFyZCBLQVNBTiB0ZXN0aW5nIGlzIHN1ZmZpY2llbnQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGp1c3RzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgc2VxdWVuY2Ugb2Yga3ZtX2dtZW1fYmluZCgpIHdpdGhpbiBLVk0mIzM5O3MgbWVtc2xvdCBzZXR1cCAoa3ZtX3NldF9tZW1zbG90KCkpLiBTcGVjaWZpY2FsbHksIGl0IGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHhhX3N0b3JlX3JhbmdlKCksIHVud2luZHMgdGhlIG1lbXNsb3QgZmllbGRzIGFuZCB4YXJyYXkgYmluZGluZ3Mgb24gZmFpbHVyZSwgYW5kIG1vdmVzIHRoZSBiaW5kIGNhbGwgYWZ0ZXIga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbigpLlxuXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzoyMC44NjAzNTM3OTNaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo4NTEyOTQ3Njg5OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIktWTV9HVUVTVF9NRU1GRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2JpbmRcIixcbiAgICBcImt2bV9zZXRfbWVtc2xvdFwiLFxuICAgIFwia3ZtX3NldF9tZW1vcnlfcmVnaW9uXCIsXG4gICAgXCJrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25cIlxuICBdLFxuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSdzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cXG5cXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2UsXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcgbG9naWMgZm9yIGd1ZXN0X21lbWZkLiBJdCBtb3ZlcyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpLCBhZGRzIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucywgYW5kIHVwZGF0ZXMgZXJyb3IgdW53aW5kaW5nIGZvciBtZW1zbG90IGJpbmRpbmcgZmFpbHVyZXMgYW5kIHhhX3N0b3JlX3JhbmdlIGVycm9ycy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIEtWTSBpb2N0bHMgKHN1Y2ggYXMgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yKS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDM6MjAuODYwMzU4MTYzWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0Mjk3MjU5NjEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAwNzExNTUzNmJjMjdmZDJjNzAxYjUxNzgyZjhmYjJiNmY2MjljMDFkXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiArMDAwMFxcblxcbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcXG5cXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuYyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG5pbmRleCBiNTk2NDg2ZDE4NGNhLi4zMjMxNTljOWI1ZjM0IDEwMDY0NFxcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcXG4rKysgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXFxuQEAgLTYxMiwxMCArNjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gXFx0c3RydWN0IGlub2RlICppbm9kZTtcXG4gXFx0c3RydWN0IGZpbGUgKmZpbGU7XFxuIFxcdGludCByID0gLUVJTlZBTDtcXG4rXFx0dm9pZCAqeGFyO1xcbiBcXG4gXFx0QlVJTERfQlVHX09OKHNpemVvZihncGFfdCkgIT0gc2l6ZW9mKG9mZnNldCkpO1xcbiBcXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cXHUwMDNlZ21lbS5wZ29mZikpO1xcbiBcXG4rXFx0aWYgKFdBUk5fT05fT05DRShzbG90LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXFxuK1xcdFxcdHJldHVybiAtRUlOVkFMO1xcbitcXG4gXFx0ZmlsZSA9IGZnZXQoZmQpO1xcbiBcXHRpZiAoIWZpbGUpXFxuIFxcdFxcdHJldHVybiAtRUJBREY7XFxuQEAgLTY0OSwxMiArNjUzLDEyIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gXFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcXG4gXFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXFxuIFxcdCAqL1xcbi1cXHRXUklURV9PTkNFKHNsb3QtXFx1MDAzZWdtZW0uZmlsZSwgZmlsZSk7XFxuK1xcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XFxuIFxcdHNsb3QtXFx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcXG4gXFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxcbiBcXHRcXHRzbG90LVxcdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIFxcbi1cXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcXG4rXFx0eGFyID0geGFfc3RvcmVfcmFuZ2UoXFx1MDAyNmYtXFx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XFxuIFxcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXFx1MDAzZWlfbWFwcGluZyk7XFxuIFxcbiBcXHQvKlxcbkBAIC02NjIsNyArNjY2LDEzIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gXFx0ICogbm90IHRoZSBvdGhlciB3YXkgJ3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcXG4gXFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXFxuIFxcdCAqL1xcbi1cXHRyID0gMDtcXG4rXFx0ciA9IHhhX2lzX2Vycih4YXIpID8geGFfZXJyKHhhcikgOiAwO1xcbitcXHRpZiAocikge1xcbitcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4rXFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5maWxlID0gTlVMTDtcXG4rXFx0XFx0c2xvdC1cXHUwMDNlZ21lbS5wZ29mZiA9IDA7XFxuK1xcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuK1xcdH1cXG4gZXJyOlxcbiBcXHRmcHV0KGZpbGUpO1xcbiBcXHRyZXR1cm4gcjtcXG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcXG5pbmRleCA2NWViMjZhMDUyMGQ4Li4yMWMxMGNiYmFjNjYxIDEwMDY0NFxcbi0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmNcXG4rKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXFxuQEAgLTE4ODcsNyArMTg4Nyw4IEBAIHN0YXRpYyB2b2lkIGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4gXFx0XFx0XFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLFxcbiBcXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpuZXcsXFxuLVxcdFxcdFxcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpXFxuK1xcdFxcdFxcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UsXFxuK1xcdFxcdFxcdCAgIHVuc2lnbmVkIGludCBnbWVtX2ZkLCB1b2ZmX3QgZ21lbV9vZmZzZXQpXFxuIHtcXG4gXFx0c3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqaW52YWxpZF9zbG90O1xcbiBcXHRpbnQgcjtcXG5AQCAtMTkzMSwyMCArMTkzMiwxNiBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuIFxcdH1cXG4gXFxuIFxcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuLVxcdGlmIChyKSB7XFxuLVxcdFxcdC8qXFxuLVxcdFxcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vXFxuLVxcdFxcdCAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZFxcbi1cXHRcXHQgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc29cXG4tXFx0XFx0ICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XFxuLVxcdFxcdFxcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xcbi1cXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbi1cXHRcXHR9IGVsc2Uge1xcbi1cXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4tXFx0XFx0fVxcbi1cXHRcXHRyZXR1cm4gcjtcXG4rXFx0aWYgKHIpXFxuK1xcdFxcdGdvdG8gZXJyO1xcbitcXG4rXFx0aWYgKG5ldyBcXHUwMDI2XFx1MDAyNiBuZXctXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xcbitcXHRcXHRpZiAoV0FSTl9PTl9PTkNFKGNoYW5nZSAhPSBLVk1fTVJfQ1JFQVRFKSlcXG4rXFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4rXFxuK1xcdFxcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XFxuK1xcdFxcdGlmIChyKVxcbitcXHRcXHRcXHRnb3RvIGVycl9iaW5kO1xcbiBcXHR9XFxuIFxcbiBcXHQvKlxcbkBAIC0xOTc3LDYgKzE5NzQsMjcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4gXFxuIFxcdHJldHVybiAwO1xcbitcXG4rZXJyX2JpbmQ6XFxuK1xcdGlmIChuZXcpIHtcXG4rXFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4rXFxuK1xcdFxcdGlmIChuZXctXFx1MDAzZWRpcnR5X2JpdG1hcCBcXHUwMDI2XFx1MDAyNiAoIW9sZCB8fCAhb2xkLVxcdTAwM2VkaXJ0eV9iaXRtYXApKVxcbitcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4rXFx0fVxcbitlcnI6XFxuK1xcdC8qXFxuK1xcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcXG4rXFx0ICogcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZCBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuXFxuK1xcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4rXFx0ICovXFxuK1xcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIHtcXG4rXFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuK1xcdFxcdGtmcmVlKGludmFsaWRfc2xvdCk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbitcXHR9XFxuK1xcdHJldHVybiByO1xcbiB9XFxuIFxcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXFxuQEAgLTIwNTgsNyArMjA3Niw3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcXG4gXFx0XFx0aWYgKFdBUk5fT05fT05DRShrdm0tXFx1MDAzZW5yX21lbXNsb3RfcGFnZXMgXFx1MDAzYyBvbGQtXFx1MDAzZW5wYWdlcykpXFxuIFxcdFxcdFxcdHJldHVybiAtRUlPO1xcbiBcXG4tXFx0XFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSk7XFxuK1xcdFxcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcXG4gXFx0fVxcbiBcXG4gXFx0YmFzZV9nZm4gPSAobWVtLVxcdTAwM2VndWVzdF9waHlzX2FkZHIgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuQEAgLTIxMDUsMjEgKzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbiBcXHRuZXctXFx1MDAzZW5wYWdlcyA9IG5wYWdlcztcXG4gXFx0bmV3LVxcdTAwM2VmbGFncyA9IG1lbS1cXHUwMDNlZmxhZ3M7XFxuIFxcdG5ldy1cXHUwMDNldXNlcnNwYWNlX2FkZHIgPSBtZW0tXFx1MDAzZXVzZXJzcGFjZV9hZGRyO1xcbi1cXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4tXFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcXG4tXFx0XFx0aWYgKHIpXFxuLVxcdFxcdFxcdGdvdG8gb3V0O1xcbi1cXHR9XFxuIFxcbi1cXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XFxuK1xcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxcbitcXHRcXHRcXHQgICAgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcbiBcXHRpZiAocilcXG4tXFx0XFx0Z290byBvdXRfdW5iaW5kO1xcbitcXHRcXHRnb3RvIG91dDtcXG4gXFxuIFxcdHJldHVybiAwO1xcbiBcXG4tb3V0X3VuYmluZDpcXG4tXFx0aWYgKG1lbS1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxcbi1cXHRcXHRrdm1fZ21lbV91bmJpbmQobmV3KTtcXG4gb3V0OlxcbiBcXHRrZnJlZShuZXcpO1xcbiBcXHRyZXR1cm4gcjtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDM6MjEuMjkwODcyMDY0WiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1MTkzMTMyMDg3MCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJLVk1cIixcbiAgICBcIktWTV9HVUVTVF9NRU1GRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImt2bV9nbWVtX2JpbmRcIixcbiAgICBcImt2bV9zZXRfbWVtc2xvdFwiLFxuICAgIFwia3ZtX3NldF9tZW1vcnlfcmVnaW9uXCIsXG4gICAgXCJrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25cIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBtb2RpZmllcyBLVk0gbWVtb3J5IHNsb3QgY3JlYXRpb24gYW5kIGVycm9yIGhhbmRsaW5nIGxvZ2ljIGZvciBndWVzdF9tZW1mZC4gSXQgbW92ZXMga3ZtX2dtZW1fYmluZCgpIGluc2lkZSBrdm1fc2V0X21lbXNsb3QoKSwgYWRkcyBuZXcgV0FSTl9PTl9PTkNFIGFzc2VydGlvbnMsIGFuZCB1cGRhdGVzIGVycm9yIHVud2luZGluZyBmb3IgbWVtc2xvdCBiaW5kaW5nIGZhaWx1cmVzIGFuZCB4YV9zdG9yZV9yYW5nZSBlcnJvcnMuIFRoaXMgY29kZSBpcyByZWFjaGFibGUgZnJvbSB1c2VyIHNwYWNlIHZpYSBLVk0gaW9jdGxzIChzdWNoIGFzIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OMikuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgMDcxMTU1MzZiYzI3ZmQyYzcwMWI1MTc4MmY4ZmIyYjZmNjI5YzAxZFxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBUaHUgU2VwIDMgMTU6NDM6MTkgMjAyNiArMDAwMFxuXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XG5cbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuaW5kZXggYjU5NjQ4NmQxODRjYS4uMzIzMTU5YzliNWYzNCAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbisrKyBiL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmNcbkBAIC02MTIsMTAgKzYxMiwxNCBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xuIFx0c3RydWN0IGZpbGUgKmZpbGU7XG4gXHRpbnQgciA9IC1FSU5WQUw7XG4rXHR2b2lkICp4YXI7XG4gXG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdwYV90KSAhPSBzaXplb2Yob2Zmc2V0KSk7XG4gXHRCVUlMRF9CVUdfT04oc2l6ZW9mKGdmbl90KSAhPSBzaXplb2Yoc2xvdC1cdTAwM2VnbWVtLnBnb2ZmKSk7XG4gXG4rXHRpZiAoV0FSTl9PTl9PTkNFKHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1TTE9UX0dNRU1fT05MWSkpXG4rXHRcdHJldHVybiAtRUlOVkFMO1xuK1xuIFx0ZmlsZSA9IGZnZXQoZmQpO1xuIFx0aWYgKCFmaWxlKVxuIFx0XHRyZXR1cm4gLUVCQURGO1xuQEAgLTY0OSwxMiArNjUzLDEyIEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdCAqIGt2bV9nbWVtX2JpbmQoKSBtdXN0IG9jY3VyIG9uIGEgbmV3IG1lbXNsb3QuICBCZWNhdXNlIHRoZSBtZW1zbG90XG4gXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cbiBcdCAqL1xuLVx0V1JJVEVfT05DRShzbG90LVx1MDAzZWdtZW0uZmlsZSwgZmlsZSk7XG4rXHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XG4gXHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSBzdGFydDtcbiBcdGlmIChrdm1fZ21lbV9zdXBwb3J0c19tbWFwKGlub2RlKSlcbiBcdFx0c2xvdC1cdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XG4gXG4tXHR4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4rXHR4YXIgPSB4YV9zdG9yZV9yYW5nZShcdTAwMjZmLVx1MDAzZWJpbmRpbmdzLCBzdGFydCwgZW5kIC0gMSwgc2xvdCwgR0ZQX0tFUk5FTCk7XG4gXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVx1MDAzZWlfbWFwcGluZyk7XG4gXG4gXHQvKlxuQEAgLTY2Miw3ICs2NjYsMTMgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIFx0ICogbm90IHRoZSBvdGhlciB3YXkgJ3JvdW5kLiAgQWN0aXZlIGJpbmRpbmdzIGFyZSBpbnZhbGlkYXRlZCBpZiB0aGVcbiBcdCAqIGZpbGUgaXMgY2xvc2VkIGJlZm9yZSBtZW1zbG90cyBhcmUgZGVzdHJveWVkLlxuIFx0ICovXG4tXHRyID0gMDtcbitcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcbitcdGlmIChyKSB7XG4rXHRcdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcbitcdFx0c2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBOVUxMO1xuK1x0XHRzbG90LVx1MDAzZWdtZW0ucGdvZmYgPSAwO1xuK1x0XHRzbG90LVx1MDAzZWZsYWdzIFx1MDAyNj0gfktWTV9NRU1TTE9UX0dNRU1fT05MWTtcbitcdH1cbiBlcnI6XG4gXHRmcHV0KGZpbGUpO1xuIFx0cmV0dXJuIHI7XG5kaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbmluZGV4IDY1ZWIyNmEwNTIwZDguLjIxYzEwY2JiYWM2NjEgMTAwNjQ0XG4tLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jXG4rKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jXG5AQCAtMTg4Nyw3ICsxODg3LDggQEAgc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqb2xkLFxuIFx0XHRcdCAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm5ldyxcbi1cdFx0XHQgICBlbnVtIGt2bV9tcl9jaGFuZ2UgY2hhbmdlKVxuK1x0XHRcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UsXG4rXHRcdFx0ICAgdW5zaWduZWQgaW50IGdtZW1fZmQsIHVvZmZfdCBnbWVtX29mZnNldClcbiB7XG4gXHRzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICppbnZhbGlkX3Nsb3Q7XG4gXHRpbnQgcjtcbkBAIC0xOTMxLDIwICsxOTMyLDE2IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdH1cbiBcbiBcdHIgPSBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4tXHRpZiAocikge1xuLVx0XHQvKlxuLVx0XHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBOb1xuLVx0XHQgKiBtb2RpZmljYXRpb25zIHJlcXVpcmVkIHNpbmNlIHRoZSBvcmlnaW5hbCBzbG90IHdhcyBwcmVzZXJ2ZWRcbi1cdFx0ICogaW4gdGhlIGluYWN0aXZlIHNsb3RzLiAgQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvXG4tXHRcdCAqIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxuLVx0XHQgKi9cbi1cdFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuLVx0XHRcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xuLVx0XHRcdGtmcmVlKGludmFsaWRfc2xvdCk7XG4tXHRcdH0gZWxzZSB7XG4tXHRcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuLVx0XHR9XG4tXHRcdHJldHVybiByO1xuK1x0aWYgKHIpXG4rXHRcdGdvdG8gZXJyO1xuK1xuK1x0aWYgKG5ldyBcdTAwMjZcdTAwMjYgbmV3LVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKSB7XG4rXHRcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxuK1x0XHRcdGdvdG8gZXJyX2JpbmQ7XG4rXG4rXHRcdHIgPSBrdm1fZ21lbV9iaW5kKGt2bSwgbmV3LCBnbWVtX2ZkLCBnbWVtX29mZnNldCk7XG4rXHRcdGlmIChyKVxuK1x0XHRcdGdvdG8gZXJyX2JpbmQ7XG4gXHR9XG4gXG4gXHQvKlxuQEAgLTE5NzcsNiArMTk3NCwyNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXG4gXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbiBcbiBcdHJldHVybiAwO1xuK1xuK2Vycl9iaW5kOlxuK1x0aWYgKG5ldykge1xuK1x0XHRrdm1fYXJjaF9mcmVlX21lbXNsb3Qoa3ZtLCBuZXcpO1xuK1xuK1x0XHRpZiAobmV3LVx1MDAzZWRpcnR5X2JpdG1hcCBcdTAwMjZcdTAwMjYgKCFvbGQgfHwgIW9sZC1cdTAwM2VkaXJ0eV9iaXRtYXApKVxuK1x0XHRcdGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChuZXcpO1xuK1x0fVxuK2VycjpcbitcdC8qXG4rXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXG4rXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cbitcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cbitcdCAqL1xuK1x0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xuK1x0XHRrdm1fYWN0aXZhdGVfbWVtc2xvdChrdm0sIGludmFsaWRfc2xvdCwgb2xkKTtcbitcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbitcdH0gZWxzZSB7XG4rXHRcdG11dGV4X3VubG9jayhcdTAwMjZrdm0tXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcbitcdH1cbitcdHJldHVybiByO1xuIH1cbiBcbiBzdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXG5AQCAtMjA1OCw3ICsyMDc2LDcgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0XHRpZiAoV0FSTl9PTl9PTkNFKGt2bS1cdTAwM2Vucl9tZW1zbG90X3BhZ2VzIFx1MDAzYyBvbGQtXHUwMDNlbnBhZ2VzKSlcbiBcdFx0XHRyZXR1cm4gLUVJTztcbiBcbi1cdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSk7XG4rXHRcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcbiBcdH1cbiBcbiBcdGJhc2VfZ2ZuID0gKG1lbS1cdTAwM2VndWVzdF9waHlzX2FkZHIgXHUwMDNlXHUwMDNlIFBBR0VfU0hJRlQpO1xuQEAgLTIxMDUsMjEgKzIxMjMsMTQgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxuIFx0bmV3LVx1MDAzZW5wYWdlcyA9IG5wYWdlcztcbiBcdG5ldy1cdTAwM2VmbGFncyA9IG1lbS1cdTAwM2VmbGFncztcbiBcdG5ldy1cdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cdTAwM2V1c2Vyc3BhY2VfYWRkcjtcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbi1cdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4tXHRcdGlmIChyKVxuLVx0XHRcdGdvdG8gb3V0O1xuLVx0fVxuIFxuLVx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuK1x0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXG4rXHRcdFx0ICAgIG1lbS1cdTAwM2VndWVzdF9tZW1mZCwgbWVtLVx1MDAzZWd1ZXN0X21lbWZkX29mZnNldCk7XG4gXHRpZiAocilcbi1cdFx0Z290byBvdXRfdW5iaW5kO1xuK1x0XHRnb3RvIG91dDtcbiBcbiBcdHJldHVybiAwO1xuIFxuLW91dF91bmJpbmQ6XG4tXHRpZiAobWVtLVx1MDAzZWZsYWdzIFx1MDAyNiBLVk1fTUVNX0dVRVNUX01FTUZEKVxuLVx0XHRrdm1fZ21lbV91bmJpbmQobmV3KTtcbiBvdXQ6XG4gXHRrZnJlZShuZXcpO1xuIFx0cmV0dXJuIHI7XG4iLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzoyMS4yOTA4NzM2NDRaIiwiU2VxIjozLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo5NjQ2MzkxNTgzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyB0aGUgS1ZNIE1lbW9yeSBTbG90IFBhdGNoKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMgZGlmZiBhbmQgc2VlIGlmIGl0IHdhcnJhbnRzIHNvbWUgZnV6emluZyBhdHRlbnRpb24uIEl0IGxvb2tzIGxpa2UgdGhlIGNoYW5nZXMgYXJlIGZvY3VzZWQgb24gS1ZNJ3MgbWVtb3J5IHNsb3QgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IHdpdGhpbiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gTXkgaW5pdGlhbCBnbGFuY2Ugc3VnZ2VzdHMgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBgZ3Vlc3RfbWVtZmRgIGludGVyZmFjZSwgd2hpY2ggaXMgaW50ZXJlc3RpbmcuXG5cblNwZWNpZmljYWxseSwgaW4gYGd1ZXN0X21lbWZkLmNgLCB0aGV5J3ZlIG1vZGlmaWVkIGBrdm1fZ21lbV9iaW5kYC4gSSBzZWUgYSBgV0FSTl9PTl9PTkNFYCBjaGVjayBhZ2FpbnN0IGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgLCBhIG5ldyBlcnJvciBoYW5kbGluZyBzdHJhdGVneSwgYW5kIGEgcm9sbGJhY2sgbWVjaGFuaXNtIGlmIGB4YV9zdG9yZV9yYW5nZWAgZmFpbHMuIFRoaXMgaW5kaWNhdGVzIHBvdGVudGlhbCBlZGdlIGNhc2VzIHJlbGF0ZWQgdG8gdGhlIGFsbG9jYXRpb24gb3IgYmluZGluZyBvZiBndWVzdCBtZW1vcnkgdGhyb3VnaCBtZW1mZHMuIEludGVyZXN0aW5nLCBpdCdzIHByZXR0eSBnb29kIGNvZGUuXG5cbk5vdywgaW4gYGt2bV9tYWluLmNgLCBga3ZtX3NldF9tZW1zbG90YCBhcHBlYXJzIHRvIGhhdmUgYmVlbiByZXdvcmtlZC4gVGhleSd2ZSBtb3ZlZCBga3ZtX2dtZW1fYmluZGAgaW5zaWRlIGl0LCBhZnRlciBga3ZtX3ByZXBhcmVfbWVtb3J5X3JlZ2lvbmAsIHdoaWNoIGlzIGEgbm90YWJsZSBjaGFuZ2UuIFRoZXkgYWxzbyBhZGRlZCBhIGBXQVJOX09OX09OQ0VgIGNoZWNrIGZvciBgS1ZNX01SX0NSRUFURWAsIGFuZCBzb21lIGNsZWFudXAgc3RlcHMuIFRoaXMgc3VnZ2VzdHMgdGhleSBhcmUgYmVpbmcgdmVyeSBjYXJlZnVsIGFib3V0IG1lbW9yeSBzbG90IGNyZWF0aW9uLCBhbmQgaGFuZGxpbmcgZmFpbHVyZXMgY29ycmVjdGx5LiBBbmQgaXQgbG9va3MgbGlrZSB0aGUgY2FsbHMgdG8gYGt2bV9zZXRfbWVtc2xvdGAgaW4gYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgaGF2ZSBiZWVuIHVwZGF0ZWQgYXMgd2VsbC5cblxuVG8gZ2V0IGEgaGFuZGxlIG9uIHRoaXMsIEknbGwgbmVlZCB0byBkcmlsbCBkb3duIGludG8gdGhlIGNvZGUuIEknbGwgdXNlIGdyZXBwZXIgYW5kIHJlYWQtZmlsZSB0byBjaGVjayB0aGUgY29kZSBhbmQgS2NvbmZpZywgc3BlY2lmaWNhbGx5IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYW5kIGRlcGVuZGVuY2llcy4gSSB3YW50IHRvIHNlZSBob3cgdGhlc2UgY2hhbmdlcyBpbnRlcmFjdCB3aXRoIHRoZSBicm9hZGVyIEtWTSBtZW1vcnkgbWFuYWdlbWVudCBzeXN0ZW0gYW5kIGFueSByZWxldmFudCBmZWF0dXJlIGZsYWdzLiBUaGlzIGxldmVsIG9mIGNoYW5nZSBpbiBtZW1vcnkgbWFuYWdlbWVudCBpcyBhbHdheXMgd29ydGggY2xvc2Ugc2NydXRpbnkuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjQ4MDMsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyNTcsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzozMC45MzcyNjcwODdaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTQxMTk3NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuLS1cXG52aXJ0L2t2bS9LY29uZmlnPTExMD1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX0NPTlZFUlRcXG52aXJ0L2t2bS9LY29uZmlnLTExMS0gICAgICAgYm9vbFxcbnZpcnQva3ZtL0tjb25maWc6MTEyOiAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTEzLVxcbnZpcnQva3ZtL0tjb25maWc9MTE0PWNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fUkVDTEFJTVxcbnZpcnQva3ZtL0tjb25maWctMTE1LSAgICAgICBib29sXFxudmlydC9rdm0vS2NvbmZpZzoxMTY6ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxudmlydC9rdm0vS2NvbmZpZy0xMTctXFxudmlydC9rdm0vS2NvbmZpZz0xMTg9Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9JTlZBTElEQVRFXFxudmlydC9rdm0vS2NvbmZpZy0xMTktICAgICAgIGJvb2xcXG52aXJ0L2t2bS9LY29uZmlnOjEyMDogICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9LY29uZmlnLTEyMS1cXG52aXJ0L2t2bS9LY29uZmlnPTEyMj1jb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1BPUFVMQVRFXFxudmlydC9rdm0vS2NvbmZpZy0xMjMtICAgICAgIGJvb2xcXG52aXJ0L2t2bS9LY29uZmlnOjEyNDogICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4tLVxcbnZpcnQva3ZtL01ha2VmaWxlLmt2bT0xND1rdm0tJChDT05GSUdfSEFWRV9LVk1fUEZOQ0FDSEUpICs9ICQoS1ZNKS9wZm5jYWNoZS5vXFxudmlydC9rdm0vTWFrZWZpbGUua3ZtOjE1Omt2bS0kKENPTkZJR19LVk1fR1VFU1RfTUVNRkQpICs9ICQoS1ZNKS9ndWVzdF9tZW1mZC5vXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEtLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seSAqL1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MjojaWZuZGVmIF9fS1ZNX0dVRVNUX01FTUZEX0hfX1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg6MzojZGVmaW5lIF9fS1ZNX0dVRVNUX01FTUZEX0hfX1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtNC1cXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtNi1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjc6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTgtaW50IGt2bV9nbWVtX2luaXQoc3RydWN0IG1vZHVsZSAqbW9kdWxlKTtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9Mjg9c3RhdGljIGlubGluZSB2b2lkIGt2bV9nbWVtX3VuYmluZChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90KVxcbi0tXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaC0zMS19XFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDozMjojZW5kaWYgLyogQ09ORklHX0tWTV9HVUVTVF9NRU1GRCAqL1xcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmgtMzMtXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDozNDojZW5kaWYgLyogX19LVk1fR1VFU1RfTUVNRkRfSF9fICovXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE1NzQ9c3RhdGljIGludCBjaGVja19tZW1vcnlfcmVnaW9uX2ZsYWdzKHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTU3OC1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE1Nzk6XFx0aWYgKElTX0VOQUJMRUQoQ09ORklHX0tWTV9HVUVTVF9NRU1GRCkpXFxudmlydC9rdm0va3ZtX21haW4uYy0xNTgwLVxcdFxcdHZhbGlkX2ZsYWdzIHw9IEtWTV9NRU1fR1VFU1RfTUVNRkQ7XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTQ4OTQ9c3RhdGljIGludCBrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uX2dlbmVyaWMoc3RydWN0IGt2bSAqa3ZtLCBsb25nIGFyZylcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtNDk1OC0jZW5kaWZcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjQ5NTk6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTQ5NjAtXFx0Y2FzZSBLVk1fQ0FQX0dVRVNUX01FTUZEOlxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz01MTc4PXN0YXRpYyBsb25nIGt2bV92bV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtNTM5Ny1cXHRcXHRicmVhaztcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjUzOTg6I2lmZGVmIENPTkZJR19LVk1fR1VFU1RfTUVNRkRcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTUzOTktXFx0Y2FzZSBLVk1fQ1JFQVRFX0dVRVNUX01FTUZEOiB7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjMwLjk5MTM5MDc4NFoiLCJTZXEiOjUsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjI5ODQzNzQyNzEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6Ik9rYXksIGhlcmUncyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOlxuXG4qKkludmVzdGlnYXRpbmcgS1ZNIEd1ZXN0IE1lbW9yeSBGaWxlIERlc2NyaXB0b3IgU3VwcG9ydCoqXG5cbkFscmlnaHQsIHRpbWUgdG8gZ2V0IHRoaXMgc3RyYWlnaHQgaW4gbXkgaGVhZC4gSSBuZWVkIHRvIHF1aWNrbHkgYXNjZXJ0YWluIHRoZSBjdXJyZW50IHN0YXRlIG9mIEtWTSdzIGNvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBndWVzdCBtZW1vcnkgZmlsZSBkZXNjcmlwdG9yIHN1cHBvcnQsIHNwZWNpZmljYWxseSBgS1ZNX0dVRVNUX01FTUZEYC4gQW5kIGJlY2F1c2UgSSdtIGZvY3VzZWQgb24geDg2L2FtZDY0IHBsYXRmb3JtcywgbGV0J3MgZHJpbGwgZG93biBhbmQgc2VlIGhvdyB0aGlzIGlzIGVuYWJsZWQsIG9yIGlmIGl0IGlzIGV2ZW4gZW5hYmxlZCwgd2l0aGluIHRoZSBLY29uZmlnIGZpbGVzLiBNeSBpbml0aWFsIHRob3VnaHQgcHJvY2VzcyBpcyB0byBxdWlja2x5IGp1bXAgdG8gdGhlIEtjb25maWcgZmlsZXMgdG8gY29uZmlybSBpdHMgZGVmaW5pdGlvbiwgaXRzIGRlcGVuZGVuY3kgKGlmIGFueSkgb24gb3RoZXIgY29uZmlndXJhdGlvbnMgYW5kIGlmIGl0cyBldmVuIGV4cG9zZWQgZm9yIHg4Ni9hbWQ2NC5cblxuXG4iLCJJbnB1dFRva2VucyI6NjY2MSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI3LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjMzLjk3NTc2NjkzNloiLCJTZXEiOjYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo0NjAyODAzOCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL0tjb25maWc9MTAzPWNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbi0tXFxudmlydC9rdm0vS2NvbmZpZy0xMDUtXFxudmlydC9rdm0vS2NvbmZpZzoxMDY6Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbnZpcnQva3ZtL0tjb25maWctMTA3LSAgICAgICBzZWxlY3QgWEFSUkFZX01VTFRJXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjM0LjAyMTgwMTE4NFoiLCJTZXEiOjcsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxNTA3ODY5NjcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSdtIHJlYWRpbmcgYW5kIHByb2Nlc3NpbmcgdGhlIHByb3ZpZGVkIHRleHQ6XG5cbioqS1ZNIENvbmZpZ3VyYXRpb24gRGVlcCBEaXZlKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoZSBgdmlydC9rdm0vS2NvbmZpZ2AgZmlsZSwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDEwNi4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBLVk0gY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBzdHJ1Y3R1cmVkIGFuZCB3aGF0J3MgYmVpbmcgZW5hYmxlZCBvciBkaXNhYmxlZCBhdCB0aGF0IHBvaW50IGluIHRoZSBjb2RlLiBJJ20gbG9va2luZyBmb3IgdGhlIGNvcmUgc2V0IG9mIG9wdGlvbnM7IGl0J3MgbGlrZWx5IHRoZXkgYXJlIHRoZSBiYXNpY3MgZm9yIHRoZSBtb2R1bGUgdG8gYnVpbGQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjY5NjgsIk91dHB1dFRva2VucyI6MzQsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyMCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0MzozNi4xNzI1OTA1MzFaIiwiU2VxIjo4LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMDc0ODAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwidmlydC9rdm0vS2NvbmZpZ1wiLFxuICBcIkZpcnN0TGluZVwiOiA5NSxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiICA5NTpcXHQgICAgICAgYm9vbFxcbiAgOTY6XFx0XFxuICA5NzpcXHRjb25maWcgS1ZNX0VMSURFX1RMQl9GTFVTSF9JRl9ZT1VOR1xcbiAgOTg6XFx0ICAgICAgIGJvb2xcXG4gIDk5OlxcdFxcbiAxMDA6XFx0Y29uZmlnIEtWTV9NTVVfTE9DS0xFU1NfQUdJTkdcXG4gMTAxOlxcdCAgICAgICBib29sXFxuIDEwMjpcXHRcXG4gMTAzOlxcdGNvbmZpZyBLVk1fR0VORVJJQ19NRU1PUllfQVRUUklCVVRFU1xcbiAxMDQ6XFx0ICAgICAgIGJvb2xcXG4gMTA1OlxcdFxcbiAxMDY6XFx0Y29uZmlnIEtWTV9HVUVTVF9NRU1GRFxcbiAxMDc6XFx0ICAgICAgIHNlbGVjdCBYQVJSQVlfTVVMVElcXG4gMTA4OlxcdCAgICAgICBib29sXFxuIDEwOTpcXHRcXG4gMTEwOlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fQ09OVkVSVFxcbiAxMTE6XFx0ICAgICAgIGJvb2xcXG4gMTEyOlxcdCAgICAgICBkZXBlbmRzIG9uIEtWTV9HVUVTVF9NRU1GRFxcbiAxMTM6XFx0XFxuIDExNDpcXHRjb25maWcgSEFWRV9LVk1fQVJDSF9HTUVNX1JFQ0xBSU1cXG4gMTE1OlxcdCAgICAgICBib29sXFxuIDExNjpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG4gMTE3OlxcdFxcbiAxMTg6XFx0Y29uZmlnIEhBVkVfS1ZNX0FSQ0hfR01FTV9JTlZBTElEQVRFXFxuIDExOTpcXHQgICAgICAgYm9vbFxcbiAxMjA6XFx0ICAgICAgIGRlcGVuZHMgb24gS1ZNX0dVRVNUX01FTUZEXFxuIDEyMTpcXHRcXG4gMTIyOlxcdGNvbmZpZyBIQVZFX0tWTV9BUkNIX0dNRU1fUE9QVUxBVEVcXG4gMTIzOlxcdCAgICAgICBib29sXFxuIDEyNDpcXHQgICAgICAgZGVwZW5kcyBvbiBLVk1fR1VFU1RfTUVNRkRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDM6MzYuMTcyNjk5MzQxWiIsIlNlcSI6OSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NjQwODgwMDk4MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEhlcmUncyBob3cgSSdkIGFwcHJvYWNoIHRoaXMgdGFzaywgYXMgaWYgdGhlc2Ugd2VyZSBteSBpbnRlcm5hbCB0aG91Z2h0czpcblxuKipJbnZlc3RpZ2F0aW5nIHRoZSBLVk1fR1VFU1RfTUVNRkQgU2VsZWN0aW9uIGluIEtjb25maWcqKlxuXG5BbHJpZ2h0LCBzbyB0aGUgdGFzayBhdCBoYW5kIGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGRlcGVuZGVuY2llcyBhbmQgcG90ZW50aWFsIHNlbGVjdGlvbiBjb25kaXRpb25zIGZvciBgS1ZNX0dVRVNUX01FTUZEYCB3aXRoaW4gdGhlIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgZmlsZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2h5IGFuZCB3aGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLCBvciwgaWYgbm90IGRpcmVjdGx5IGVuYWJsZWQsIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcyBpdCBiZWNvbWVzIGF2YWlsYWJsZSBmb3Igc2VsZWN0aW9uIGJ5IHRoZSB1c2VyIG9yIGJ1aWxkIHN5c3RlbS5cblxuRmlyc3QsIEknbGwgbmVlZCB0byBvcGVuIHRoYXQgS2NvbmZpZyBmaWxlLiBJIGFscmVhZHkga25vdyB0aGUgcGF0aDogYGFyY2gveDg2L2t2bS9LY29uZmlnYC4gTGV0J3MgYXNzdW1lIEkgaGF2ZSBhY2Nlc3MgdG8gYSB0ZXJtaW5hbCBvciBjb2RlIGVkaXRvciB3aXRoIGZpbGUgbmF2aWdhdGlvbiBjYXBhYmlsaXRpZXMuIEknbGwgbmVlZCB0byBxdWlja2x5IHNraW0gdGhlIGZpbGUsIGxvb2tpbmcgZm9yIHRoZSBkZWZpbml0aW9uLCBvciByZWZlcmVuY2VzIHRvLCBgS1ZNX0dVRVNUX01FTUZEYC4gSSdsbCBiZSB3YXRjaGluZyBmb3Iga2V5d29yZHMgbGlrZSBcImNvbmZpZ1wiLCBcInNlbGVjdFwiLCBcImRlcGVuZHMgb25cIiwgXCJpZlwiLCBcInRyaXN0YXRlXCIsIGFuZCBwb3RlbnRpYWxseSBcImJvb2xcIiBvciBvdGhlciBkYXRhIHR5cGUgZGVmaW5pdGlvbnMuXG5cbkknbSBleHBlY3RpbmcgdG8gZmluZCBhIHNlY3Rpb24gdGhhdCBkZWZpbmVzIGBLVk1fR1VFU1RfTUVNRkRgLiBJdCBjb3VsZCBiZSBkaXJlY3RseSBkZWZpbmVkLCBvciBzZWxlY3RlZCBpbmRpcmVjdGx5IHRocm91Z2ggYSBsYXJnZXIgS1ZNIGZlYXR1cmUuIFRoZSBjb2RlIHNob3VsZCByZXZlYWwgaWYgaXQncyBhIG1hbmRhdG9yeSBmZWF0dXJlIChib29sKSwgb3B0aW9uYWwgKHRyaXN0YXRlKSwgYW5kIHdoYXQgb3RoZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG5lZWQgdG8gYmUgZW5hYmxlZCBiZWZvcmUgYEtWTV9HVUVTVF9NRU1GRGAgY2FuIGJlIGVuYWJsZWQuIEkgYW0gcGFydGljdWxhcmx5IGxvb2tpbmcgZm9yIHRoZSBkZXBlbmRlbmN5IGNoYWlucyBhbmQgcmVsYXRpb25zaGlwcy4gQXJlIHRoZXJlIGNlcnRhaW4gQ1BVIGZlYXR1cmVzIG9yIGtlcm5lbCBjb25maWd1cmF0aW9ucyB0aGF0ICptdXN0KiBiZSBwcmVzZW50IGJlZm9yZSBgS1ZNX0dVRVNUX01FTUZEYCBpcyBldmVuIGNvbnNpZGVyZWQ/XG5cbk9uY2UgSSBoYXZlIGxvY2F0ZWQgdGhlIHJlbGV2YW50IHNlY3Rpb24sIG15IGdvYWwgaXMgdG8gZGlzdGlsbCB0aGUgbG9naWMgdGhhdCBkaWN0YXRlcyB3aGVuIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGF2YWlsYWJsZS4gVW5kZXJzdGFuZGluZyB0aGUgc2VsZWN0aW9uIGNyaXRlcmlhIHdpbGwgYmUga2V5LiBJIG5lZWQgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUsIGlmIGdpdmVuIGEgc3BlY2lmaWMgc2V0IG9mIGtlcm5lbCBjb25maWd1cmF0aW9ucywgd2hldGhlciBgS1ZNX0dVRVNUX01FTUZEYCB3b3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkLiBUaGlzIHdpbGwgZWl0aGVyIGdpdmUgbWUgY29uZmlkZW5jZSB0aGF0IG15IHVzZSBjYXNlIGlzIHN1cHBvcnRlZCwgb3Igd2lsbCBnaXZlIG1lIGEgY2xlYXIgcGF0aCB0byBnZXQgdGhlcmUuIEl0J3MgdGltZSB0byByZWFkIHNvbWUgY29kZSBhbmQgdW5jb3ZlciB0aGVzZSBkZXBlbmRlbmNpZXMhXG5cblxuIiwiSW5wdXRUb2tlbnMiOjc1MTYsIk91dHB1dFRva2VucyI6MzYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOSwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjQyLjU4MTUwMjY2NFoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzYyNzE2NzcsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiS1ZNX0dVRVNUX01FTUZEXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImFyY2gveDg2L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3g4Ni9rdm0vS2NvbmZpZz0yMD1jb25maWcgS1ZNX1g4Nlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctNDktXFx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXFxuYXJjaC94ODYva3ZtL0tjb25maWc6NTA6XFx0c2VsZWN0IEtWTV9HVUVTVF9NRU1GRCBpZiBYODZfNjRcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy01MS1cXG4tLVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmM9NTEzNT12b2lkIGt2bV9hcmNoX2FzeW5jX3BhZ2VfcmVhZHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2FzeW5jX3BmICp3b3JrKVxcbi0tXFxuYXJjaC94ODYva3ZtL21tdS9tbXUuYy01MTY1LVxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmM6NTE2NjojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxcbmFyY2gveDg2L2t2bS9tbXUvbW11LmMtNTE2Ny1zdGF0aWMgdm9pZCBrdm1fYXNzZXJ0X2dtZW1faW52YWxpZGF0ZV9sb2NrX2hlbGQoc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdClcXG4tLVxcbmFyY2gveDg2L2t2bS94ODYuYz0xMDYzND1ib29sIGt2bV9hcmNoX25vX3BvbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KVxcbi0tXFxuYXJjaC94ODYva3ZtL3g4Ni5jLTEwNjM4LVxcbmFyY2gveDg2L2t2bS94ODYuYzoxMDYzOTojaWZkZWYgQ09ORklHX0tWTV9HVUVTVF9NRU1GRFxcbmFyY2gveDg2L2t2bS94ODYuYy0xMDY0MC0vKlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0Mzo0Mi42NTc3Nzc5NDFaIiwiU2VxIjoxMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NTc5MDk1NDA3OSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIHRoZSBLVk0gTGFuZHNjYXBlKipcblxuT2theSwgc28gd2UncmUgdGFsa2luZyBgS1ZNYCBoZXJlLCBzcGVjaWZpY2FsbHkuIFJpZ2h0LCB3ZWxsLCB0aGUgY29udGV4dCBpcyBsaWtlbHkga2VybmVsLWxldmVsIHZpcnR1YWxpemF0aW9uLiBJbW1lZGlhdGVseSwgSSdtIHRoaW5raW5nIG9mIHRoZSB2YXJpb3VzIGZsYXZvcnMg4oCTIGBLVk1fSU5URUxgLCBgS1ZNX0FNRGAsIG1heWJlIGV2ZW4gYEtWTV9HVUVTVF9NRU1GRGAuIExldCdzIGFzc3VtZSB0aGVzZSBhcmUgdGhlIG9wdGlvbnMgd2UgYXJlIGRlYWxpbmcgd2l0aC5cblxuRmlyc3QgdGhpbmdzIGZpcnN0LCBJIG5lZWQgdG8gc2VlIGhvdyBgS1ZNYCBpcyBjb25maWd1cmVkLCB3aGF0IGRlcGVuZGVuY2llcyBpdCBoYXMsIGFuZCB3aGF0IHRoZSBvdmVyYWxsIHNldHVwIGxvb2tzIGxpa2Ugd2l0aGluIHRoZSB4ODYgYXJjaGl0ZWN0dXJlLiBUaGUgZ28tdG8gcGxhY2UgZm9yIHRoYXQga2luZCBvZiBpbmZvcm1hdGlvbiBpcywgb2YgY291cnNlLCB0aGUgYEtjb25maWdgIGZpbGUuIFNwZWNpZmljYWxseSwgSSdsbCBqdW1wIGludG8gYGFyY2gveDg2L2t2bS9LY29uZmlnYCB0byBnZXQgdGhlIGxheSBvZiB0aGUgbGFuZC4gVGhhdCdzIHdoZXJlIHRoZSBjb3JlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIEtWTSBmb3IgeDg2IHN5c3RlbXMgYXJlIGRlZmluZWQuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBmb3VuZGF0aW9uIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBmaW5lciBkZXRhaWxzLCBhbmQgSSBjYW4gc3RhcnQgZnJvbSB0aGVyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6ODQ1OCwiT3V0cHV0VG9rZW5zIjozNywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjU5LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjQ4LjQ0ODczNTY3WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjcyNzcwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImFyY2gveDg2L2t2bS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDEsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIiAgIDE6XFx0IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbiAgIDI6XFx0I1xcbiAgIDM6XFx0IyBLVk0gY29uZmlndXJhdGlvblxcbiAgIDQ6XFx0I1xcbiAgIDU6XFx0XFxuICAgNjpcXHRzb3VyY2UgXFxcInZpcnQva3ZtL0tjb25maWdcXFwiXFxuICAgNzpcXHRcXG4gICA4OlxcdG1lbnVjb25maWcgVklSVFVBTElaQVRJT05cXG4gICA5OlxcdFxcdGJvb2wgXFxcIlZpcnR1YWxpemF0aW9uXFxcIlxcbiAgMTA6XFx0XFx0ZGVmYXVsdCB5XFxuICAxMTpcXHRcXHRoZWxwXFxuICAxMjpcXHRcXHQgIFNheSBZIGhlcmUgdG8gZ2V0IHRvIHNlZSBvcHRpb25zIGZvciB1c2luZyB5b3VyIExpbnV4IGhvc3QgdG8gcnVuIG90aGVyXFxuICAxMzpcXHRcXHQgIG9wZXJhdGluZyBzeXN0ZW1zIGluc2lkZSB2aXJ0dWFsIG1hY2hpbmVzIChndWVzdHMpLlxcbiAgMTQ6XFx0XFx0ICBUaGlzIG9wdGlvbiBhbG9uZSBkb2VzIG5vdCBhZGQgYW55IGtlcm5lbCBjb2RlLlxcbiAgMTU6XFx0XFxuICAxNjpcXHRcXHQgIElmIHlvdSBzYXkgTiwgYWxsIG9wdGlvbnMgaW4gdGhpcyBzdWJtZW51IHdpbGwgYmUgc2tpcHBlZCBhbmQgZGlzYWJsZWQuXFxuICAxNzpcXHRcXG4gIDE4OlxcdGlmIFZJUlRVQUxJWkFUSU9OXFxuICAxOTpcXHRcXG4gIDIwOlxcdGNvbmZpZyBLVk1fWDg2XFxuICAyMTpcXHRcXHRkZWZfdHJpc3RhdGUgS1ZNIGlmIChLVk1fSU5URUwgIT0gbiB8fCBLVk1fQU1EICE9IG4pXFxuICAyMjpcXHRcXHRzZWxlY3QgS1ZNX0NPTU1PTlxcbiAgMjM6XFx0XFx0c2VsZWN0IEtWTV9FTElERV9UTEJfRkxVU0hfSUZfWU9VTkdcXG4gIDI0OlxcdFxcdHNlbGVjdCBLVk1fTU1VX0xPQ0tMRVNTX0FHSU5HXFxuICAyNTpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fSVJRQ0hJUFxcbiAgMjY6XFx0XFx0c2VsZWN0IEhBVkVfS1ZNX1BGTkNBQ0hFXFxuICAyNzpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fRElSVFlfUklOR19UU09cXG4gIDI4OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9ESVJUWV9SSU5HX0FDUV9SRUxcXG4gIDI5OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9JUlFfQllQQVNTXFxuICAzMDpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fSVJRX1JPVVRJTkdcXG4gIDMxOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9SRUFET05MWV9NRU1cXG4gIDMyOlxcdFxcdHNlbGVjdCBWSE9TVF9UQVNLXFxuICAzMzpcXHRcXHRzZWxlY3QgS1ZNX0FTWU5DX1BGXFxuICAzNDpcXHRcXHRzZWxlY3QgVVNFUl9SRVRVUk5fTk9USUZJRVJcXG4gIDM1OlxcdFxcdHNlbGVjdCBLVk1fTU1JT1xcbiAgMzY6XFx0XFx0c2VsZWN0IFNDSEVEX0lORk9cXG4gIDM3OlxcdFxcdHNlbGVjdCBQRVJGX0VWRU5UU1xcbiAgMzg6XFx0XFx0c2VsZWN0IEdVRVNUX1BFUkZfRVZFTlRTXFxuICAzOTpcXHRcXHRzZWxlY3QgUEVSRl9HVUVTVF9NRURJQVRFRF9QTVVcXG4gIDQwOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9NU0lcXG4gIDQxOlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9DUFVfUkVMQVhfSU5URVJDRVBUXFxuICA0MjpcXHRcXHRzZWxlY3QgSEFWRV9LVk1fTk9fUE9MTFxcbiAgNDM6XFx0XFx0c2VsZWN0IFZJUlRfWEZFUl9UT19HVUVTVF9XT1JLXFxuICA0NDpcXHRcXHRzZWxlY3QgS1ZNX0dFTkVSSUNfRElSVFlMT0dfUkVBRF9QUk9URUNUXFxuICA0NTpcXHRcXHRzZWxlY3QgS1ZNX1ZGSU9cXG4gIDQ2OlxcdFxcdHNlbGVjdCBIQVZFX0tWTV9QTV9OT1RJRklFUiBpZiBQTVxcbiAgNDc6XFx0XFx0c2VsZWN0IEtWTV9HRU5FUklDX0hBUkRXQVJFX0VOQUJMSU5HXFxuICA0ODpcXHRcXHRzZWxlY3QgS1ZNX0dFTkVSSUNfUFJFX0ZBVUxUX01FTU9SWVxcbiAgNDk6XFx0XFx0c2VsZWN0IEtWTV9XRVJST1IgaWYgV0VSUk9SXFxuICA1MDpcXHRcXHRzZWxlY3QgS1ZNX0dVRVNUX01FTUZEIGlmIFg4Nl82NFxcbiAgNTE6XFx0XFxuICA1MjpcXHRjb25maWcgS1ZNXFxuICA1MzpcXHRcXHR0cmlzdGF0ZSBcXFwiS2VybmVsLWJhc2VkIFZpcnR1YWwgTWFjaGluZSAoS1ZNKSBzdXBwb3J0XFxcIlxcbiAgNTQ6XFx0XFx0ZGVwZW5kcyBvbiBYODZfTE9DQUxfQVBJQ1xcbiAgNTU6XFx0XFx0aGVscFxcbiAgNTY6XFx0XFx0ICBTdXBwb3J0IGhvc3RpbmcgZnVsbHkgdmlydHVhbGl6ZWQgZ3Vlc3QgbWFjaGluZXMgdXNpbmcgaGFyZHdhcmVcXG4gIDU3OlxcdFxcdCAgdmlydHVhbGl6YXRpb24gZXh0ZW5zaW9ucy4gIFlvdSB3aWxsIG5lZWQgYSBmYWlybHkgcmVjZW50XFxuICA1ODpcXHRcXHQgIHByb2Nlc3NvciBlcXVpcHBlZCB3aXRoIHZpcnR1YWxpemF0aW9uIGV4dGVuc2lvbnMuIFlvdSB3aWxsIGFsc29cXG4gIDU5OlxcdFxcdCAgbmVlZCB0byBzZWxlY3Qgb25lIG9yIG1vcmUgb2YgdGhlIHByb2Nlc3NvciBtb2R1bGVzIGJlbG93LlxcbiAgNjA6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjQ4LjQ0ODgwOTc3WiIsIlNlcSI6MTMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjM0NzIyMDI4MjgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIHRoZSBLVk0gUGF0Y2gqKlxuXG5Pa2F5LCBzbyB0aGlzIHBhdGNoIGlzIHJlbGF0ZWQgdG8gS1ZNLCB3aGljaCBpcywgb2YgY291cnNlLCBmdWxseSB2aXJ0dWFsaXplZCBhbmQgc3VwcG9ydGVkIGluIGJvdGggUUVNVSBhbmQgR29vZ2xlIENvbXB1dGUgRW5naW5lLCBhbmQgaXQncyBzb21ldGhpbmcgdGhhdCBzeXprYWxsZXIgbGlrZWx5IHRlc3RzIGV4dGVuc2l2ZWx5LCBwYXJ0aWN1bGFybHkgY29uY2VybmluZyB0aG9zZSBgL2Rldi9rdm1gIGlvY3Rscy4gTXkgaW1tZWRpYXRlIHRob3VnaHQgaXMgdG8gZGl2ZSBpbnRvIHRoZSBjaGFuZ2VzLiBUaGUgZmlyc3Qgc3RlcCwgYXMgYWx3YXlzLCBpcyB0byBpZGVudGlmeSB0aGUgbW9kaWZpZWQgZnVuY3Rpb25zLlxuXG5BbHJpZ2h0LCBoZXJlIHRoZXkgYXJlOiBga3ZtX2dtZW1fYmluZGAgd2l0aGluIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCwgYGt2bV9zZXRfbWVtc2xvdGAgaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAsIGFsc28gaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLiBNeSBuZXh0IG1vdmU/IEkgbmVlZCB0aGUgZnVsbCBwaWN0dXJlLiBJJ20gZ29pbmcgdG8gcHVsbCB1cCBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIHplcm8gaW4gb24gdGhlIGFyZWEgYXJvdW5kIGxpbmVzIDYxMi02ODAuIFRoYXQnbGwgcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIFdpdGggdGhhdCBjb250ZXh0LCBJJ2xsIGJlIGFibGUgdG8gcXVpY2tseSB1bmRlcnN0YW5kIHRoZSBpbXBhY3Qgb2YgdGhlIHBhdGNoIGFuZCB3aGVyZSB0byBzdGFydCBteSBkZXRhaWxlZCBleGFtaW5hdGlvbi5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY0MCwiT3V0cHV0VG9rZW5zIjozOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE2NywiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjUxLjkyMTAxNTU5OFoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5OTY3MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwNSxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDYwNTpcXHRcXG4gNjA2OlxcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gNjA3OlxcdFxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KVxcbiA2MDg6XFx0e1xcbiA2MDk6XFx0XFx0dW9mZl90IHNpemUgPSBzbG90LVxcdTAwM2VucGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4gNjEwOlxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcXG4gNjExOlxcdFxcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XFxuIDYxMjpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbiA2MTM6XFx0XFx0c3RydWN0IGZpbGUgKmZpbGU7XFxuIDYxNDpcXHRcXHRpbnQgciA9IC1FSU5WQUw7XFxuIDYxNTpcXHRcXHR2b2lkICp4YXI7XFxuIDYxNjpcXHRcXG4gNjE3OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcXG4gNjE4OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVxcdTAwM2VnbWVtLnBnb2ZmKSk7XFxuIDYxOTpcXHRcXG4gNjIwOlxcdFxcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxcbiA2MjE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYyMjpcXHRcXG4gNjIzOlxcdFxcdGZpbGUgPSBmZ2V0KGZkKTtcXG4gNjI0OlxcdFxcdGlmICghZmlsZSlcXG4gNjI1OlxcdFxcdFxcdHJldHVybiAtRUJBREY7XFxuIDYyNjpcXHRcXG4gNjI3OlxcdFxcdGlmIChmaWxlLVxcdTAwM2VmX29wICE9IFxcdTAwMjZrdm1fZ21lbV9mb3BzKVxcbiA2Mjg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYyOTpcXHRcXG4gNjMwOlxcdFxcdGYgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDYzMTpcXHRcXHRpZiAoZi1cXHUwMDNla3ZtICE9IGt2bSlcXG4gNjMyOlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2MzM6XFx0XFxuIDYzNDpcXHRcXHRpbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XFxuIDYzNTpcXHRcXG4gNjM2OlxcdFxcdGlmICghUEFHRV9BTElHTkVEKG9mZnNldCkgfHwgb2Zmc2V0ICsgc2l6ZSBcXHUwMDNlIGlfc2l6ZV9yZWFkKGlub2RlKSlcXG4gNjM3OlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2Mzg6XFx0XFxuIDYzOTpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfbG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjQwOlxcdFxcbiA2NDE6XFx0XFx0c3RhcnQgPSBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gNjQyOlxcdFxcdGVuZCA9IHN0YXJ0ICsgc2xvdC1cXHUwMDNlbnBhZ2VzO1xcbiA2NDM6XFx0XFxuIDY0NDpcXHRcXHRpZiAoIXhhX2VtcHR5KFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncykgXFx1MDAyNlxcdTAwMjZcXG4gNjQ1OlxcdFxcdCAgICB4YV9maW5kKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgXFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xcbiA2NDY6XFx0XFx0XFx0ciA9IC1FRVhJU1Q7XFxuIDY0NzpcXHRcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDY0OTpcXHRcXHR9XFxuIDY1MDpcXHRcXG4gNjUxOlxcdFxcdC8qXFxuIDY1MjpcXHRcXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxuIDY1MzpcXHRcXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbiA2NTQ6XFx0XFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXFxuIDY1NTpcXHRcXHQgKi9cXG4gNjU2OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XFxuIDY1NzpcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gc3RhcnQ7XFxuIDY1ODpcXHRcXHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXFxuIDY1OTpcXHRcXHRcXHRzbG90LVxcdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2MDpcXHRcXG4gNjYxOlxcdFxcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xcbiA2NjI6XFx0XFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjYzOlxcdFxcbiA2NjQ6XFx0XFx0LypcXG4gNjY1OlxcdFxcdCAqIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSwgZXZlbiBvbiBzdWNjZXNzLiAgVGhlIGZpbGUgcGlucyBLVk0sXFxuIDY2NjpcXHRcXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxcbiA2Njc6XFx0XFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXFxuIDY2ODpcXHRcXHQgKi9cXG4gNjY5OlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjcwOlxcdFxcdGlmIChyKSB7XFxuIDY3MTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjcyOlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY3MzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjc0OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY3NTpcXHRcXHR9XFxuIDY3NjpcXHRlcnI6XFxuIDY3NzpcXHRcXHRmcHV0KGZpbGUpO1xcbiA2Nzg6XFx0XFx0cmV0dXJuIHI7XFxuIDY3OTpcXHR9XFxuIDY4MDpcXHRcXG4gNjgxOlxcdHN0YXRpYyB2b2lkIF9fa3ZtX2dtZW1fdW5iaW5kKHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsIHN0cnVjdCBnbWVtX2ZpbGUgKmYpXFxuIDY4MjpcXHR7XFxuIDY4MzpcXHRcXHR1bnNpZ25lZCBsb25nIHN0YXJ0ID0gc2xvdC1cXHUwMDNlZ21lbS5wZ29mZjtcXG4gNjg0OlxcdFxcdHVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBzbG90LVxcdTAwM2VucGFnZXM7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjUxLjkyMTExNjk3OFoiLCJTZXEiOjE1LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTE5MDk0NTI3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBzdW1tYXJpemVkIGFzIHlvdSByZXF1ZXN0ZWQ6XG5cbioqRGlnZ2luZyBpbnRvIE1lbW9yeSBNYW5hZ2VtZW50IGluIEtWTSoqXG5cbk9rYXksIHNvIHdlIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgbWVtb3J5IHJlZ2lvbnMgYXJlIGJlaW5nIHNldCB1cCBhbmQgbWFuYWdlZCB3aXRoaW4gS1ZNLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byB6ZXJvIGluIG9uIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCBiZWNhdXNlIHRoYXQncyB1c3VhbGx5IHRoZSBoZWFydCBvZiB0aGUgY29yZSBLVk0gbG9naWMuIFNwZWNpZmljYWxseSwgSSB3YW50IHRvIHJlZnJlc2ggbXkgbWVtb3J5IG9uIHRoZSBpbnRlcmFjdGlvbnMgYXJvdW5kIGBrdm1fc2V0X21lbXNsb3RgIGFuZCBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYC4gVGhlc2UgZnVuY3Rpb25zIGFyZSBnb2luZyB0byBiZSBjcml0aWNhbCBmb3IgdHJhY2tpbmcgaG93IG1lbW9yeSBpcyBhbGxvY2F0ZWQsIG1hcHBlZCwgYW5kIHBvdGVudGlhbGx5IHJlbWFwcGVkIHdpdGhpbiB0aGUgZ3Vlc3QncyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuIEknbGwgbmVlZCB0byBzZWUgaG93IHRoZSBob3N0IG1hcHMgdGhlIGd1ZXN0J3MgcGh5c2ljYWwgbWVtb3J5LCBhbmQgdGhlIGludGVyYWN0aW9uIGJldHdlZW4gdGhlIGh5cGVydmlzb3IncyB2aWV3IGFuZCB0aGUgaGFyZHdhcmUuIExldCdzIHNlZSBob3cgdGhlc2UgYXJlIGNhbGxlZCwgd2hhdCBkYXRhIHN0cnVjdHVyZXMgdGhleSBtYW5pcHVsYXRlLCBhbmQgd2hhdCBpbXBsaWNhdGlvbnMgdGhvc2UgbWFuaXB1bGF0aW9ucyBoYXZlIG9uIHRoZSBvdmVyYWxsIG1lbW9yeSBvcmdhbml6YXRpb24uIEhvcGVmdWxseSwgbG9va2luZyBhdCB0aGVzZSBmdW5jdGlvbnMgd2lsbCBnaXZlIG1lIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBtZW1vcnkgbWFuYWdlbWVudCBpcyBoYW5kbGVkIGF0IHRoZSBLVk0gbGV2ZWwsIGVzcGVjaWFsbHkgd2hlbiBjb25zaWRlcmluZyBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBob3RwbHVnZ2luZyBzY2VuYXJpb3MuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjExMzgzLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzksIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0Mzo1NC4wNDAyMTUyNzVaIiwiU2VxIjoxNiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6Mzk1NzgwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkyMCxcbiAgXCJMaW5lQ291bnRcIjogODVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkyMDpcXHRcXHQgKlxcbjE5MjE6XFx0XFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcXG4xOTIyOlxcdFxcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcXG4xOTIzOlxcdFxcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cXG4xOTI0OlxcdFxcdCAqL1xcbjE5MjU6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5MjY6XFx0XFx0XFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4xOTI3OlxcdFxcdFxcdGlmICghaW52YWxpZF9zbG90KSB7XFxuMTkyODpcXHRcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4xOTI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjE5MzA6XFx0XFx0XFx0fVxcbjE5MzE6XFx0XFx0XFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTMyOlxcdFxcdH1cXG4xOTMzOlxcdFxcbjE5MzQ6XFx0XFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTM1OlxcdFxcdGlmIChyKVxcbjE5MzY6XFx0XFx0XFx0Z290byBlcnI7XFxuMTkzNzpcXHRcXG4xOTM4OlxcdFxcdGlmIChuZXcgXFx1MDAyNlxcdTAwMjYgbmV3LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4xOTM5OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbjE5NDA6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQxOlxcdFxcbjE5NDI6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4xOTQzOlxcdFxcdFxcdGlmIChyKVxcbjE5NDQ6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQ1OlxcdFxcdH1cXG4xOTQ2OlxcdFxcbjE5NDc6XFx0XFx0LypcXG4xOTQ4OlxcdFxcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxcbjE5NDk6XFx0XFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xcbjE5NTA6XFx0XFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXFxuMTk1MTpcXHRcXHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxcbjE5NTI6XFx0XFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXFxuMTk1MzpcXHRcXHQgKi9cXG4xOTU0OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcXG4xOTU1OlxcdFxcdFxcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XFxuMTk1NjpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcXG4xOTU3OlxcdFxcdFxcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTU4OlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcXG4xOTU5OlxcdFxcdFxcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcXG4xOTYwOlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcXG4xOTYxOlxcdFxcdFxcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xOTYyOlxcdFxcdGVsc2VcXG4xOTYzOlxcdFxcdFxcdEJVRygpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cXG4xOTY2OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk2NzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5Njg6XFx0XFxuMTk2OTpcXHRcXHQvKlxcbjE5NzA6XFx0XFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcXG4xOTcxOlxcdFxcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxcbjE5NzI6XFx0XFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXFx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxcbjE5NzM6XFx0XFx0ICovXFxuMTk3NDpcXHRcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTc1OlxcdFxcbjE5NzY6XFx0XFx0cmV0dXJuIDA7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdGVycl9iaW5kOlxcbjE5Nzk6XFx0XFx0aWYgKG5ldykge1xcbjE5ODA6XFx0XFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4xOTgxOlxcdFxcbjE5ODI6XFx0XFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuMTk4MzpcXHRcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4xOTg0OlxcdFxcdH1cXG4xOTg1OlxcdGVycjpcXG4xOTg2OlxcdFxcdC8qXFxuMTk4NzpcXHRcXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXFxuMTk4ODpcXHRcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4xOTg5OlxcdFxcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4xOTkwOlxcdFxcdCAqL1xcbjE5OTE6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5OTI6XFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuMTk5MzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5OTQ6XFx0XFx0fSBlbHNlIHtcXG4xOTk1OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbjE5OTY6XFx0XFx0fVxcbjE5OTc6XFx0XFx0cmV0dXJuIHI7XFxuMTk5ODpcXHR9XFxuMTk5OTpcXHRcXG4yMDAwOlxcdHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcXG4yMDAxOlxcdFxcdFxcdFxcdFxcdCAgICAgIGdmbl90IHN0YXJ0LCBnZm5fdCBlbmQpXFxuMjAwMjpcXHR7XFxuMjAwMzpcXHRcXHRzdHJ1Y3Qga3ZtX21lbXNsb3RfaXRlciBpdGVyO1xcbjIwMDQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjU0LjA0MDYxMjc5NVoiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozMzgxOTg3NjkyLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgYSBzdW1tYXJ5IG9mIG15IHRob3VnaHQgcHJvY2VzcywgYXMgcmVxdWVzdGVkOlxuXG4qKkRpdmluZyBEZWVwZXIgaW50byBLVk0gTWVtb3J5IE1hbmFnZW1lbnQqKlxuXG5Pa2F5LCBzbyB3ZSd2ZSBiZWVuIGxvb2tpbmcgYXQgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IGluIEtWTSwgYW5kIEkgbmVlZCB0byB6b29tIGluIG9uIGEgc3BlY2lmaWMgYXJlYS4gSSdtIHRoaW5raW5nIHdlIG5lZWQgdG8gdGFrZSBhIGNsb3NlciBsb29rIGF0IGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBkcmlsbCBkb3duIGludG8gdGhlIGNvZGUgYXJvdW5kIGxpbmVzIDIwNTggdG8gMjEzMC4gVGhpcyBzZWN0aW9uIGxpa2VseSBoYW5kbGVzIGEgY3JpdGljYWwgYXNwZWN0IG9mIG1lbW9yeSBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgdmlydHVhbCBtYWNoaW5lIGVudmlyb25tZW50LiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQncyBpbnRlcmFjdGluZyB3aXRoIHRoZSBob3N0J3MgcGh5c2ljYWwgbWVtb3J5IGFuZCBob3cgaXQncyBzZXR0aW5nIHVwIHRoZSBtYXBwaW5ncyBmb3IgZ3Vlc3QgYWNjZXNzLiBUaGVyZSBjb3VsZCBiZSBzb21lIHN1YnRsZSBpbXBsaWNhdGlvbnMgaW4gdGhhdCByYW5nZSByZWdhcmRpbmcgbWVtb3J5IGFzc2lnbm1lbnQsIHBlcm1pc3Npb25zLCBvciBldmVuIHBvdGVudGlhbCB2dWxuZXJhYmlsaXRpZXMgaWYgbm90IHByb3Blcmx5IGhhbmRsZWQuIEkgc2hvdWxkIGNoZWNrIHRoYXQgcmVnaW9uIHNwZWNpZmljYWxseSB0byBldmFsdWF0ZSBwb3NzaWJsZSBpc3N1ZXMgcmVsYXRpbmcgdG8gbWVtb3J5IG1hbmFnZW1lbnQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzMDY3LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0Mzo1Ny40MjI2MDM0MTdaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MzcwNzEwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMjA1OCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMjA1ODpcXHRcXHQgKiBsb2dnaW5nLCBhbmQgc28gYXJlIGV4ZW1wdC5cXG4yMDU5OlxcdFxcdCAqL1xcbjIwNjA6XFx0XFx0aWYgKGlkIFxcdTAwM2MgS1ZNX1VTRVJfTUVNX1NMT1RTIFxcdTAwMjZcXHUwMDI2XFxuMjA2MTpcXHRcXHQgICAgKG1lbS1cXHUwMDNlbWVtb3J5X3NpemUgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCkgXFx1MDAzZSBLVk1fTUVNX01BWF9OUl9QQUdFUylcXG4yMDYyOlxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIwNjM6XFx0XFxuMjA2NDpcXHRcXHRzbG90cyA9IF9fa3ZtX21lbXNsb3RzKGt2bSwgYXNfaWQpO1xcbjIwNjU6XFx0XFxuMjA2NjpcXHRcXHQvKlxcbjIwNjc6XFx0XFx0ICogTm90ZSwgdGhlIG9sZCBtZW1zbG90IChhbmQgdGhlIHBvaW50ZXIgaXRzZWxmISkgbWF5IGJlIGludmFsaWRhdGVkXFxuMjA2ODpcXHRcXHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxcbjIwNjk6XFx0XFx0ICovXFxuMjA3MDpcXHRcXHRvbGQgPSBpZF90b19tZW1zbG90KHNsb3RzLCBpZCk7XFxuMjA3MTpcXHRcXG4yMDcyOlxcdFxcdGlmICghbWVtLVxcdTAwM2VtZW1vcnlfc2l6ZSkge1xcbjIwNzM6XFx0XFx0XFx0aWYgKCFvbGQgfHwgIW9sZC1cXHUwMDNlbnBhZ2VzKVxcbjIwNzQ6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjA3NTpcXHRcXG4yMDc2OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0Uoa3ZtLVxcdTAwM2Vucl9tZW1zbG90X3BhZ2VzIFxcdTAwM2Mgb2xkLVxcdTAwM2VucGFnZXMpKVxcbjIwNzc6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU87XFxuMjA3ODpcXHRcXG4yMDc5OlxcdFxcdFxcdHJldHVybiBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIE5VTEwsIEtWTV9NUl9ERUxFVEUsIC0xLCAwKTtcXG4yMDgwOlxcdFxcdH1cXG4yMDgxOlxcdFxcbjIwODI6XFx0XFx0YmFzZV9nZm4gPSAobWVtLVxcdTAwM2VndWVzdF9waHlzX2FkZHIgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVCk7XFxuMjA4MzpcXHRcXHRucGFnZXMgPSAobWVtLVxcdTAwM2VtZW1vcnlfc2l6ZSBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4yMDg0OlxcdFxcbjIwODU6XFx0XFx0aWYgKCFvbGQgfHwgIW9sZC1cXHUwMDNlbnBhZ2VzKSB7XFxuMjA4NjpcXHRcXHRcXHRjaGFuZ2UgPSBLVk1fTVJfQ1JFQVRFO1xcbjIwODc6XFx0XFxuMjA4ODpcXHRcXHRcXHQvKlxcbjIwODk6XFx0XFx0XFx0ICogVG8gc2ltcGxpZnkgS1ZNIGludGVybmFscywgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyBhY3Jvc3NcXG4yMDkwOlxcdFxcdFxcdCAqIGFsbCBtZW1zbG90cyBtdXN0IGZpdCBpbiBhbiB1bnNpZ25lZCBsb25nLlxcbjIwOTE6XFx0XFx0XFx0ICovXFxuMjA5MjpcXHRcXHRcXHRpZiAoKGt2bS1cXHUwMDNlbnJfbWVtc2xvdF9wYWdlcyArIG5wYWdlcykgXFx1MDAzYyBrdm0tXFx1MDAzZW5yX21lbXNsb3RfcGFnZXMpXFxuMjA5MzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4yMDk0OlxcdFxcdH0gZWxzZSB7IC8qIE1vZGlmeSBhbiBleGlzdGluZyBzbG90LiAqL1xcbjIwOTU6XFx0XFx0XFx0LyogUHJpdmF0ZSBtZW1zbG90cyBhcmUgaW1tdXRhYmxlLCB0aGV5IGNhbiBvbmx5IGJlIGRlbGV0ZWQuICovXFxuMjA5NjpcXHRcXHRcXHRpZiAobWVtLVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXFxuMjA5NzpcXHRcXHRcXHRcXHRyZXR1cm4gLUVJTlZBTDtcXG4yMDk4OlxcdFxcdFxcdGlmICgobWVtLVxcdTAwM2V1c2Vyc3BhY2VfYWRkciAhPSBvbGQtXFx1MDAzZXVzZXJzcGFjZV9hZGRyKSB8fFxcbjIwOTk6XFx0XFx0XFx0ICAgIChucGFnZXMgIT0gb2xkLVxcdTAwM2VucGFnZXMpIHx8XFxuMjEwMDpcXHRcXHRcXHQgICAgKChtZW0tXFx1MDAzZWZsYWdzIF4gb2xkLVxcdTAwM2VmbGFncykgXFx1MDAyNiAoS1ZNX01FTV9SRUFET05MWSB8IEtWTV9NRU1fR1VFU1RfTUVNRkQpKSlcXG4yMTAxOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIxMDI6XFx0XFxuMjEwMzpcXHRcXHRcXHRpZiAoYmFzZV9nZm4gIT0gb2xkLVxcdTAwM2ViYXNlX2dmbilcXG4yMTA0OlxcdFxcdFxcdFxcdGNoYW5nZSA9IEtWTV9NUl9NT1ZFO1xcbjIxMDU6XFx0XFx0XFx0ZWxzZSBpZiAobWVtLVxcdTAwM2VmbGFncyAhPSBvbGQtXFx1MDAzZWZsYWdzKVxcbjIxMDY6XFx0XFx0XFx0XFx0Y2hhbmdlID0gS1ZNX01SX0ZMQUdTX09OTFk7XFxuMjEwNzpcXHRcXHRcXHRlbHNlIC8qIE5vdGhpbmcgdG8gY2hhbmdlLiAqL1xcbjIxMDg6XFx0XFx0XFx0XFx0cmV0dXJuIDA7XFxuMjEwOTpcXHRcXHR9XFxuMjExMDpcXHRcXG4yMTExOlxcdFxcdGlmICgoY2hhbmdlID09IEtWTV9NUl9DUkVBVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSBcXHUwMDI2XFx1MDAyNlxcbjIxMTI6XFx0XFx0ICAgIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc2xvdHMsIGlkLCBiYXNlX2dmbiwgYmFzZV9nZm4gKyBucGFnZXMpKVxcbjIxMTM6XFx0XFx0XFx0cmV0dXJuIC1FRVhJU1Q7XFxuMjExNDpcXHRcXG4yMTE1OlxcdFxcdC8qIEFsbG9jYXRlIGEgc2xvdCB0aGF0IHdpbGwgcGVyc2lzdCBpbiB0aGUgbWVtc2xvdC4gKi9cXG4yMTE2OlxcdFxcdG5ldyA9IGt6YWxsb2Nfb2JqKCpuZXcsIEdGUF9LRVJORUxfQUNDT1VOVCk7XFxuMjExNzpcXHRcXHRpZiAoIW5ldylcXG4yMTE4OlxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjIxMTk6XFx0XFxuMjEyMDpcXHRcXHRuZXctXFx1MDAzZWFzX2lkID0gYXNfaWQ7XFxuMjEyMTpcXHRcXHRuZXctXFx1MDAzZWlkID0gaWQ7XFxuMjEyMjpcXHRcXHRuZXctXFx1MDAzZWJhc2VfZ2ZuID0gYmFzZV9nZm47XFxuMjEyMzpcXHRcXHRuZXctXFx1MDAzZW5wYWdlcyA9IG5wYWdlcztcXG4yMTI0OlxcdFxcdG5ldy1cXHUwMDNlZmxhZ3MgPSBtZW0tXFx1MDAzZWZsYWdzO1xcbjIxMjU6XFx0XFx0bmV3LVxcdTAwM2V1c2Vyc3BhY2VfYWRkciA9IG1lbS1cXHUwMDNldXNlcnNwYWNlX2FkZHI7XFxuMjEyNjpcXHRcXG4yMTI3OlxcdFxcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxcbjIxMjg6XFx0XFx0XFx0XFx0ICAgIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmQsIG1lbS1cXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcXG4yMTI5OlxcdFxcdGlmIChyKVxcbjIxMzA6XFx0XFx0XFx0Z290byBvdXQ7XFxuMjEzMTpcXHRcXG4yMTMyOlxcdFxcdHJldHVybiAwO1xcbjIxMzM6XFx0XFxuMjEzNDpcXHRvdXQ6XFxuMjEzNTpcXHRcXHRrZnJlZShuZXcpO1xcbjIxMzY6XFx0XFx0cmV0dXJuIHI7XFxuMjEzNzpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQzOjU3LjQyMjk3NjQyN1oiLCJTZXEiOjE5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo1MzUyMjA1ODU3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEtWTSBNZW1vcnkgTWFuYWdlbWVudCBQYXRjaCoqXG5cbk9rYXksIGxldCdzIGRpc3NlY3QgdGhpcyBwYXRjaC4gSXQgc2VlbXMgd2UncmUgZGVhbGluZyB3aXRoIGEgY29yZSBLVk0gbWVtb3J5IHZpcnR1YWxpemF0aW9uIGVuaGFuY2VtZW50LCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBgZ3Vlc3RfbWVtZmRgIGFuZCBtZW1vcnkgc2xvdHMuIFRoaXMgaW1wYWN0cyB0aGUgbWVtb3J5IG1hbmFnZW1lbnQvdmlydHVhbGl6YXRpb24gbG9naWMgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCB0aGUgYC9kZXYva3ZtYCBpbnRlcmZhY2UgdmlhIGBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjJgIGFuZCBgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT05gIGlvY3Rscy5cblxuVGhlIGZpcnN0IGZpbGUsIGB2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jYCwgaGFzIGEgbmV3IGNoZWNrIHVzaW5nIGBXQVJOX09OX09OQ0VgIGZvciBhIHNwZWNpZmljIG1lbW9yeSBzbG90IGZsYWcgKGBLVk1fTUVNU0xPVF9HTUVNX09OTFlgKS4gSXQgbG9va3MgbGlrZSB3ZSdyZSBoYXJkZW5pbmcgZXJyb3IgaGFuZGxpbmcgaW4gYHhhX3N0b3JlX3JhbmdlYCB3aGVuIHRoaW5ncyBnbyB3cm9uZyBhbmQgcmVzZXR0aW5nIHNvbWUgc2xvdCBkYXRhIGlmIHRoZSB3cml0ZSBmYWlscy4gVGhpcyBjbGVhbi11cCBpcyBpbXBvcnRhbnQuXG5cblRoZW4sIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYCByZW9yZGVycyB0aGluZ3MsIG1vdmluZyB0aGUgYGt2bV9nbWVtX2JpbmQoKWAgY2FsbCAqYWZ0ZXIqIGBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKClgIHdpdGhpbiBga3ZtX3NldF9tZW1zbG90KClgLiBUaGVyZSBpcyBhIGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbiBvbiB0aGUgYGNoYW5nZWAgdmFsdWUgd2l0aGluIHRoaXMgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgb25seSBgS1ZNX01SX0NSRUFURWAgaXMgcHJvY2Vzc2VkICh0aGUgcGF0Y2ggYXBwZWFycyB0byBiZSBkZWFsaW5nIHdpdGggdGhlIGNyZWF0aW9uIG9mIHRoZSBtZW1vcnkgcmVnaW9uKS4gRXJyb3IgdW53aW5kaW5nIGluIHRoaXMgc2VjdGlvbiBpcyBub3cgaGFuZGxlZCBieSB0aGUgaW50cm9kdWN0aW9uIG9mIGFuIGBlcnJfYmluZGAgbGFiZWwsIGNhbGxpbmcgYGt2bV9hcmNoX2ZyZWVfbWVtc2xvdGAgYW5kIGBrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXBgLiBUaGlzIGlzIGdvb2QsIGVuc3VyaW5nIHByb3BlciByZXNvdXJjZSByZWxlYXNlIG9uIGZhaWx1cmUuXG5cbkdpdmVuIHRoZSBzY29wZSBvZiB0aGUgY2hhbmdlLCB3aXRoIHRoZSBuZXcgYFdBUk5fT05fT05DRWAgYXNzZXJ0aW9ucyBhbmQgdGhlIG1vZGlmaWNhdGlvbnMgdG8gYmluZGluZyBzZXF1ZW5jaW5nIGFuZCBlcnJvciBoYW5kbGluZywgdGhpcyBpcyBkZWZpbml0ZWx5IHNvbWV0aGluZyB0byBmdXp6LlxuXG5Ob3csIGxldCdzIGlkZW50aWZ5IHRoZSByZXF1aXJlZCBjb25maWd1cmF0aW9ucy4gVGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zIHNlZW0gdG8gYmUgYEtWTWAsIGBLVk1fR1VFU1RfTUVNRkRgLCBgS1ZNX0lOVEVMYCwgYW5kIGBLVk1fQU1EYC4gSW4gYGFyY2gveDg2L2t2bS9LY29uZmlnYCwgYEtWTWAgd2lsbCBzZWxlY3QgYEtWTV9HVUVTVF9NRU1GRGAgaWYgaXQgaXMgYW4gYFg4Nl82NGAgbWFjaGluZS4gV2UgbmVlZCB0byBjaGVjayB0aGUgS2NvbmZpZyBmaWxlcyBpbiBgdmlydC9rdm0vS2NvbmZpZ2AgYW5kIGBhcmNoL3g4Ni9rdm0vS2NvbmZpZ2AgdG8gY29uZmlybSB0aGVzZSBkZXBlbmRlbmNpZXMgYW5kIHRoZSBjb25maWd1cmF0aW9ucy4gYEtWTWAgaXMgdHJpc3RhdGUvYm9vbC4gYEtWTV9HVUVTVF9NRU1GRGAgaXMgYm9vbGVhbiAoc2VsZWN0ZWQgYnkgYEtWTV9YODYgaWYgWDg2XzY0YCkuIExldCdzIGVuc3VyZSB0aGF0IGBDT05GSUdfS1ZNYCBhbmQgYENPTkZJR19LVk1fR1VFU1RfTUVNRkRgIGFyZSBzZXQgYXBwcm9wcmlhdGVseSwgYW5kIGNoZWNrIGZvciBhbnkgYWRkaXRpb25hbCBjb25maWd1cmF0aW9ucyB0aGF0IG1pZ2h0IGJlIG5lZWRlZC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTQ1ODIsIk91dHB1dFRva2VucyI6MzEsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo1NzAsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDowMi43NzUxODUyMzRaIiwiU2VxIjoyMCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjI1Mzg3NDU4OSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgS1ZNXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImFyY2gveDg2L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJhcmNoL3g4Ni9rdm0vS2NvbmZpZz0xOD1pZiBWSVJUVUFMSVpBVElPTlxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE5LVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjIwOmNvbmZpZyBLVk1fWDg2XFxuYXJjaC94ODYva3ZtL0tjb25maWctMjEtXFx0ZGVmX3RyaXN0YXRlIEtWTSBpZiAoS1ZNX0lOVEVMICE9IG4gfHwgS1ZNX0FNRCAhPSBuKVxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctNTEtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6NTI6Y29uZmlnIEtWTVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTUzLVxcdHRyaXN0YXRlIFxcXCJLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy02OC1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzo2OTpjb25maWcgS1ZNX1dFUlJPUlxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTcwLVxcdGJvb2wgXFxcIkNvbXBpbGUgS1ZNIHdpdGggLVdlcnJvclxcXCJcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTgyLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjgzOmNvbmZpZyBLVk1fU1dfUFJPVEVDVEVEX1ZNXFxuYXJjaC94ODYva3ZtL0tjb25maWctODQtXFx0Ym9vbCBcXFwiRW5hYmxlIHN1cHBvcnQgZm9yIEtWTSBzb2Z0d2FyZS1wcm90ZWN0ZWQgVk1zXFxcIlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctOTUtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6OTY6Y29uZmlnIEtWTV9JTlRFTFxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTk3LVxcdHRyaXN0YXRlIFxcXCJLVk0gZm9yIEludGVsIChhbmQgY29tcGF0aWJsZSkgcHJvY2Vzc29ycyBzdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTA2LVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjEwNzpjb25maWcgS1ZNX0lOVEVMX1BST1ZFX1ZFXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTA4LSAgICAgICAgYm9vbCBcXFwiQ2hlY2sgdGhhdCBndWVzdHMgZG8gbm90IHJlY2VpdmUgI1ZFIGV4Y2VwdGlvbnNcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZz0xMjI9Y29uZmlnIFg4Nl9TR1hfS1ZNXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xMzMtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTM0OmNvbmZpZyBLVk1fSU5URUxfVERYXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTM1LVxcdGJvb2wgXFxcIkludGVsIFRydXN0IERvbWFpbiBFeHRlbnNpb25zIChURFgpIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNDUtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTQ2OmNvbmZpZyBLVk1fQU1EXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTQ3LVxcdHRyaXN0YXRlIFxcXCJLVk0gZm9yIEFNRCBwcm9jZXNzb3JzIHN1cHBvcnRcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xNTUtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTU2OmNvbmZpZyBLVk1fQU1EX1NFVlxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE1Ny1cXHRib29sIFxcXCJBTUQgU2VjdXJlIEVuY3J5cHRlZCBWaXJ0dWFsaXphdGlvbiAoU0VWKSBzdXBwb3J0XFxcIlxcbi0tXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTcyLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnOjE3Mzpjb25maWcgS1ZNX0lPQVBJQ1xcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE3NC1cXHRib29sIFxcXCJJL08gQVBJQywgUElDLCBhbmQgUElUIGVtdWxhdGlvblxcXCJcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTE4Mi1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoxODM6Y29uZmlnIEtWTV9TTU1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xODQtXFx0Ym9vbCBcXFwiU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBlbXVsYXRpb25cXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0xOTMtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MTk0OmNvbmZpZyBLVk1fSFlQRVJWXFxuYXJjaC94ODYva3ZtL0tjb25maWctMTk1LVxcdGJvb2wgXFxcIlN1cHBvcnQgZm9yIE1pY3Jvc29mdCBIeXBlci1WIGVtdWxhdGlvblxcXCJcXG4tLVxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTIwNy1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoyMDg6Y29uZmlnIEtWTV9YRU5cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMDktXFx0Ym9vbCBcXFwiU3VwcG9ydCBmb3IgWGVuIGh5cGVyY2FsbCBpbnRlcmZhY2VcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMTYtXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MjE3OmNvbmZpZyBLVk1fUFJPVkVfTU1VXFxuYXJjaC94ODYva3ZtL0tjb25maWctMjE4LVxcdGJvb2wgXFxcIlByb3ZlIEtWTSBNTVUgY29ycmVjdG5lc3NcXFwiXFxuLS1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMjktXFxuYXJjaC94ODYva3ZtL0tjb25maWc6MjMwOmNvbmZpZyBLVk1fRVhURVJOQUxfV1JJVEVfVFJBQ0tJTkdcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMzEtXFx0Ym9vbFxcbmFyY2gveDg2L2t2bS9LY29uZmlnLTIzMi1cXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZzoyMzM6Y29uZmlnIEtWTV9NQVhfTlJfVkNQVVNcXG5hcmNoL3g4Ni9rdm0vS2NvbmZpZy0yMzQtXFx0aW50IFxcXCJNYXhpbXVtIG51bWJlciBvZiB2Q1BVcyBwZXIgS1ZNIGd1ZXN0XFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDowMy4wMjkwNjQ3NzNaIiwiU2VxIjoyMSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6NDMyNTc4NDIxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLVk0gR3Vlc3QgTWVtb3J5IEZpbGUgRGVzY3JpcHRvciBBbmFseXNpcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gRmlyc3QsIEkgbmVlZCB0byBjb25maXJtIHRoZSBjb25maWd1cmF0aW9uLiBJdCBsb29rcyBsaWtlIGBLVk1fR1VFU1RfTUVNRkRgIGlzIGVuYWJsZWQgd2hlbiB0YXJnZXRpbmcgeDg2XzY0IGFyY2hpdGVjdHVyZSBhbmQgS1ZNIGlzIGFjdGl2ZSwgbWVhbmluZyBlaXRoZXIgYEtWTWAsIGBLVk1fSU5URUxgLCBvciBgS1ZNX0FNRGAgaXMgc2VsZWN0ZWQuIFNvLCB0aGUgYmFzZSBpcyBzZXQgZm9yIG1lbW9yeSBmaWxlIGRlc2NyaXB0b3IgZnVuY3Rpb25hbGl0eSB3aXRoaW4gS1ZNLlxuXG5Ob3csIGxldCdzIGdldCBpbnRvIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uLiBJJ20gZm9jdXNpbmcgb24gdGhlIG1vZGlmaWVkIGZ1bmN0aW9uczogYGt2bV9nbWVtX2JpbmRgLCBga3ZtX3NldF9tZW1zbG90YCwgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXNlIGFyZSBjb3JlLCB3aWRlbHktdXNlZCBmdW5jdGlvbnMgb3IgaWYgdGhleSdyZSBzcGVjaWZpYyBlbnRyeSBwb2ludHMgdG8gdGhlIGd1ZXN0IG1lbWZkIGxvZ2ljLlxuXG5JdCBsb29rcyBsaWtlIGBrdm1fZ21lbV9iaW5kYCBpcyB0aGUgZnVuY3Rpb24gdGhhdCBiaW5kcyBhIGd1ZXN0IG1lbWZkIGZpbGUgdG8gYSBtZW1vcnkgc2xvdCwgaXQgaXMgdmVyeSBzcGVjaWZpYy4gYGt2bV9zZXRfbWVtc2xvdGAgbWFuYWdlcyBtZW1zbG90IHN0YXRlIGNoYW5nZXMgd2l0aGluIEtWTS4gYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgaXMgb3VyIGVudHJ5IHBvaW50IGZvciBgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT05gIGNhbGxzLlxuXG5GaW5hbGx5LCBJIG5lZWQgdG8ga25vdyB3aGVyZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGV4cG9zZWQgYW5kIHVzZWQuIEkgc2VlIHRoYXQgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGFyZSBkZWZpbmVkIGFzIHN0YXRpYyB3aXRoaW4gYHZpcnQva3ZtL2t2bV9tYWluLmNgLCB3aGlsZSBga3ZtX2dtZW1fYmluZGAgaXMgbm9uLXN0YXRpYy4gVGhpcyBsaWtlbHkgbWVhbnMgYGt2bV9zZXRfbWVtc2xvdGAgYW5kIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGFyZSBub3QgZGlyZWN0bHkgZXhwb3J0ZWQsIGFuZCBga3ZtX2dtZW1fYmluZGAgaXMuIEknbGwgbmVlZCB0byBjaGVjayB0aGUgY2FsbCBjaGFpbiB0byBlbnN1cmUgbm8gb3RoZXIgY3J1Y2lhbCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZXNlIGFyZSBhY3R1YWxseSBiZWluZyBjYWxsZWQgZnJvbSwgc3VjaCBhcyBpZiBga3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uYCBjYWxscyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTY5OTYsIk91dHB1dFRva2VucyI6MzIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MDcuMzU0ODUxNDQzWiIsIlNlcSI6MjIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxNTM3NzM1MzMsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia3ZtX3NldF9tZW1vcnlfcmVnaW9uXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcInZpcnQva3ZtXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmM9MjAwMD1zdGF0aWMgYm9vbCBrdm1fY2hlY2tfbWVtc2xvdF9vdmVybGFwKHN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzLCBpbnQgaWQsXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwMTItXFxudmlydC9rdm0va3ZtX21haW4uYzoyMDEzOnN0YXRpYyBpbnQga3ZtX3NldF9tZW1vcnlfcmVnaW9uKHN0cnVjdCBrdm0gKmt2bSxcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIwMTQtXFx0XFx0XFx0XFx0IGNvbnN0IHN0cnVjdCBrdm1fdXNlcnNwYWNlX21lbW9yeV9yZWdpb24yICptZW0pXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIxMzk9aW50IGt2bV9zZXRfaW50ZXJuYWxfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIxNDctXFxudmlydC9rdm0va3ZtX21haW4uYzoyMTQ4OlxcdHJldHVybiBrdm1fc2V0X21lbW9yeV9yZWdpb24oa3ZtLCBtZW0pO1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjE0OS19XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIxNTI9c3RhdGljIGludCBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0yMTU4LVxcdGd1YXJkKG11dGV4KShcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19sb2NrKTtcXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIxNTk6XFx0cmV0dXJuIGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihrdm0sIG1lbSk7XFxudmlydC9rdm0va3ZtX21haW4uYy0yMTYwLX1cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MDcuNTA4NjMyNTM2WiIsIlNlcSI6MjMsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjU2MzkzNDEwNDEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqTXkgQXNzZXNzbWVudCBvZiB0aGUgS1ZNIE1lbW9yeSBNYW5hZ2VtZW50IENvbXBvbmVudHMqKlxuXG5BbHJpZ2h0LCBsZXQncyBzZWUuIGBrdm1fZ21lbV9iaW5kYCwgYGt2bV9zZXRfbWVtc2xvdGAsIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCBhbmQgYGt2bV92bV9pb2N0bF9zZXRfbWVtb3J5X3JlZ2lvbmAg4oCTIHRob3NlIGFyZSB0aGUga2V5IHN5bWJvbHMsIHRoZSBoZWFydCBvZiB0aGlzIGFyZWEsIGFzIEkgc3VzcGVjdGVkLiBOb3csIGJlZm9yZSBJIGRlY2xhcmUgdGhpcyBhcyBcImRvbmUsXCIgbGV0J3MganVzdCBtYWtlIHN1cmUgSSdtIG5vdCBtaXNzaW5nIGFueXRoaW5nLiBJIG5lZWQgdG8gZW5zdXJlIGEgY29tcGxldGUgcGljdHVyZSBoZXJlLlxuXG5Pa2F5LCBsZXQgbWUgY2hlY2sgdGhlIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkOiBgdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY2AgYW5kIGB2aXJ0L2t2bS9rdm1fbWFpbi5jYC4gTWFrZXMgc2Vuc2UuIEFuZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMgYXJlIGBLVk1gIGFuZCBgS1ZNX0dVRVNUX01FTUZEYC4gR29vZCwgdGhhdCBsaW5lcyB1cC5cblxuTm93LCB0aW1lIGZvciB0aGUgc2FuaXR5IGNoZWNrLiBGaXJzdCwgcmVhY2hhYmlsaXR5OiB5ZXAsIEtWTSBpb2N0bHMgYXJlIGluZGVlZCBhY2Nlc3NpYmxlIGZyb20gdXNlcnNwYWNlIHRocm91Z2ggYC9kZXYva3ZtYCwgYW5kIGJvdGggZ3Vlc3QgbWVtZmQgYW5kIG1lbW9yeSByZWdpb25zIGFyZSBhY3RpdmVseSBzdXBwb3J0ZWQgaW4gVk1zLiBDaGVjay5cblxuU2Vjb25kLCB3b3J0aCBmdXp6aW5nPyBBYnNvbHV0ZWx5LiBUaGUgcmVmYWN0b3Jpbmcgb2YgbWVtc2xvdCBiaW5kaW5nIGVycm9yIGhhbmRsaW5nLCB0aGUgbW92ZSBvZiBga3ZtX2dtZW1fYmluZGAgaW5zaWRlIGBrdm1fc2V0X21lbXNsb3RgLCBhbmQgdGhlIGBXQVJOX09OX09OQ0VgIGFzc2VydGlvbnMuLi4gYWxsIG9mIHRoYXQgc2NyZWFtcyBwb3RlbnRpYWwgZm9yIGludGVyZXN0aW5nIGZ1enppbmcgdGFyZ2V0cy4gRGVmaW5pdGVseSB3b3J0aCB0aGUgZWZmb3J0LlxuXG5UaGVuLCB0aGUgZm9jdXMgc3ltYm9scyBhcmUgZXhhY3RseSBhcyBleHBlY3RlZC4gVGhleSBhcmU6XG4qICAgYGt2bV9nbWVtX2JpbmRgXG4qICAgYGt2bV9zZXRfbWVtc2xvdGBcbiogICBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYFxuKiAgIGBrdm1fdm1faW9jdGxfc2V0X21lbW9yeV9yZWdpb25gXG5cbkFuZCB0aGUgZW5hYmxlIGNvbmZpZ3VyYXRpb25zIGFyZSBqdXN0IHdoYXQgSSB0aG91Z2h0LCBuYW1lbHk6XG4qICAgYEtWTWBcbiogICBgS1ZNX0dVRVNUX01FTUZEYFxuXG5ZZXMsIGV2ZXJ5dGhpbmcncyBjbGVhciwgYWNjdXJhdGUsIGFuZCBjb21wbGV0ZS4gVGltZSB0byBjYWxsIGl0LiBMZXQncyB0cmlnZ2VyIGBzZXQtcmVzdWx0c2AuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4MjYzLCJPdXRwdXRUb2tlbnMiOjE4NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMxNCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoxMy4xNDc5NzU5NDdaIiwiU2VxIjoyNCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NDIxMzU3NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiS1ZNXCIsXG4gICAgXCJLVk1fR1VFU1RfTUVNRkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJrdm1fZ21lbV9iaW5kXCIsXG4gICAgXCJrdm1fc2V0X21lbXNsb3RcIixcbiAgICBcImt2bV9zZXRfbWVtb3J5X3JlZ2lvblwiLFxuICAgIFwia3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggbW9kaWZpZXMgS1ZNIG1lbW9yeSBzbG90IGNyZWF0aW9uIGFuZCBlcnJvciBoYW5kbGluZyBsb2dpYyBmb3IgZ3Vlc3RfbWVtZmQuIEl0IG1vdmVzIGt2bV9nbWVtX2JpbmQoKSBpbnNpZGUga3ZtX3NldF9tZW1zbG90KCksIGFkZHMgbmV3IFdBUk5fT05fT05DRSBhc3NlcnRpb25zLCBhbmQgdXBkYXRlcyBlcnJvciB1bndpbmRpbmcgZm9yIG1lbXNsb3QgYmluZGluZyBmYWlsdXJlcyBhbmQgeGFfc3RvcmVfcmFuZ2UgZXJyb3JzLiBUaGlzIGNvZGUgaXMgcmVhY2hhYmxlIGZyb20gdXNlciBzcGFjZSB2aWEgS1ZNIGlvY3RscyAoc3VjaCBhcyBLVk1fU0VUX1VTRVJfTUVNT1JZX1JFR0lPTjIpLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIktWTVwiLFxuICAgIFwiS1ZNX0dVRVNUX01FTUZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwia3ZtX2dtZW1fYmluZFwiLFxuICAgIFwia3ZtX3NldF9tZW1zbG90XCIsXG4gICAgXCJrdm1fc2V0X21lbW9yeV9yZWdpb25cIixcbiAgICBcImt2bV92bV9pb2N0bF9zZXRfbWVtb3J5X3JlZ2lvblwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIG1vZGlmaWVzIEtWTSBtZW1vcnkgc2xvdCBjcmVhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcgbG9naWMgZm9yIGd1ZXN0X21lbWZkLiBJdCBtb3ZlcyBrdm1fZ21lbV9iaW5kKCkgaW5zaWRlIGt2bV9zZXRfbWVtc2xvdCgpLCBhZGRzIG5ldyBXQVJOX09OX09OQ0UgYXNzZXJ0aW9ucywgYW5kIHVwZGF0ZXMgZXJyb3IgdW53aW5kaW5nIGZvciBtZW1zbG90IGJpbmRpbmcgZmFpbHVyZXMgYW5kIHhhX3N0b3JlX3JhbmdlIGVycm9ycy4gVGhpcyBjb2RlIGlzIHJlYWNoYWJsZSBmcm9tIHVzZXIgc3BhY2UgdmlhIEtWTSBpb2N0bHMgKHN1Y2ggYXMgS1ZNX1NFVF9VU0VSX01FTU9SWV9SRUdJT04yKS5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MTMuMjIyMTk3MDA0WiIsIlNlcSI6MjUsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjc2NzYyNDU0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjEzLjIyMjYzODM0NFoiLCJTZXEiOjI2LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjMyNzY3MTc4NTY3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGp1c3RzIHRoZSBlcnJvciBoYW5kbGluZyBhbmQgc2VxdWVuY2Ugb2Yga3ZtX2dtZW1fYmluZCgpIHdpdGhpbiBLVk0ncyBtZW1zbG90IHNldHVwIChrdm1fc2V0X21lbXNsb3QoKSkuIFNwZWNpZmljYWxseSwgaXQgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgeGFfc3RvcmVfcmFuZ2UoKSwgdW53aW5kcyB0aGUgbWVtc2xvdCBmaWVsZHMgYW5kIHhhcnJheSBiaW5kaW5ncyBvbiBmYWlsdXJlLCBhbmQgbW92ZXMgdGhlIGJpbmQgY2FsbCBhZnRlciBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uKCkuXFxuXFxuQWxsIGFsbG9jYXRlZCBtZW1vcnkgc3RydWN0dXJlcyAoc3VjaCBhcyBrdm1fbWVtb3J5X3Nsb3QpIGFyZSB6ZXJvLWFsbG9jYXRlZCB3aXRoIGt6YWxsb2Nfb2JqKCksIGxvY2FsIHZhcmlhYmxlcyAoZS5nLiwgeGFyKSBhcmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSwgYW5kIG5vIGRhdGEgaXMgY29waWVkIHRvIHVzZXJzcGFjZSBvciBsZWZ0IHVuaW5pdGlhbGl6ZWQgaW4ga2VybmVsLWludGVybmFsIHN0YXRlLiBBcyB0aGlzIGNoYW5nZSBkZWFscyBzdHJpY3RseSB3aXRoIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBjbGVhbnVwIHJhdGhlciB0aGFuIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFjY2VzcyBvciBpbmZvcm1hdGlvbiBkaXNjbG9zdXJlcywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQgYW5kIHN0YW5kYXJkIEtBU0FOIHRlc3RpbmcgaXMgc3VmZmljaWVudC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiJZb3UgYXJlIGFuIGV4cGVydCBMaW51eCBrZXJuZWwgc2VjdXJpdHkgZW5naW5lZXIgc3BlY2lhbGl6aW5nIGluIGtlcm5lbCBtZW1vcnlcbmVycm9yIGRldGVjdG9ycyAoS0FTQU4gYW5kIEtNU0FOKS4gWW91ciBqb2IgaXMgdG8gcmV2aWV3IHRoZSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kXG5kZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpXG5mdXp6aW5nIHNlc3Npb24gaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgS0FTQU4gZnV6emluZy5cblxuQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46XG4tIFN0YW5kYXJkIEtBU0FOIGtlcm5lbCBidWlsZHMgKHVwc3RyZWFtLWFwcGFybW9yLWthc2FuLmNvbmZpZykgYWxyZWFkeSBlbmFibGVcbiAgYSBjb21wcmVoZW5zaXZlIHN1aXRlIG9mIGRlYnVnZ2luZyB0b29scyBhbmQgc2FuaXRpemVycywgaW5jbHVkaW5nIEtBU0FOXG4gIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVBcbiAgKGxvY2tpbmcgYnVncyBhbmQgZGVhZGxvY2tzKSwgVUItc2FuaXRpemVycywgYW5kIG1lbW9yeSBjb3JydXB0aW9uIGNoZWNrcy5cbi0gS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcikgZGV0ZWN0cyByZWFkcyBvZiBVTklOSVRJQUxJWkVEIG1lbW9yeSAoc3RhY2ssIGhlYXAsXG4gIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy5cblxuUnVsZTogVEhFUkUgSVMgTk8gU0VOU0UgSU4gUlVOTklORyBBIEtNU0FOIFNFU1NJT04gSUYgQSBCVUcgQ0FOIEJFIENBVUdIVCBCWSBLQVNBTixcbkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuXG5BIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaW5jdXJzIHNpZ25pZmljYW50IHJlc291cmNlIGNvc3RzLiBZb3UgbXVzdCBPTkxZXG5zZXQgTmVlZHNLTVNBTj10cnVlIGlmIHRoZSBjb2RlIGNoYW5nZXMgaW50cm9kdWNlIG9yIGV4cG9zZSBVTklOSVRJQUxJWkVEIE1FTU9SWSByaXNrc1xudGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi5cblxuTG9vayBob2xpc3RpY2FsbHkgYXQgdGhlIHBhdGNoIHNlcmllcyBhbmQgc3Vycm91bmRpbmcgY29kZS4gRXZlbiBpZiBubyBkaXJlY3RcbnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLFxuYSBwYXRjaCBtYXkgYWx0ZXIgY29udHJvbCBmbG93LCBib3VuZHMgY2hlY2tpbmcsIG9yIGRhdGEgbGVuZ3RoIGNhbGN1bGF0aW9ucyBpbiB3YXlzXG50aGF0IGNoYW5nZSBob3cgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgb3BlcmF0ZXMgb24gZXhpc3RpbmcgYnVmZmVycyAoZS5nLiBhbGxvd2luZ1xudW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sXG5mbG93KS4gRG8gbm90IGhlc2l0YXRlIHRvIHVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUsXG5jYWxsZWQgZnVuY3Rpb25zLCBhbmQgY2FsbGVycy5cblxuU2V0IE5lZWRzS01TQU49dHJ1ZSBPTkxZIElGIHRoZSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzOlxuMS4gS2VybmVsIHN0cnVjdHVyZXMgc2VudCB0byB1c2VyIHNwYWNlICh2aWEgY29weV90b191c2VyLCBwdXRfdXNlciwgbmV0bGluayBza2JcbiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzXG4gICBvciBzdHJ1Y3R1cmUgcGFkZGluZyBtaWdodCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQvemVyb2VkLlxuMi4gQ29uZGl0aW9uYWwgbG9naWMgb3IgYnJhbmNoaW5nIHRoYXQgZGVwZW5kcyBvbiBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhcmlhYmxlc1xuICAgb3Igc3RydWN0IGZpZWxkcy5cbjMuIEFsbG9jYXRpb24gb3IgaW5pdGlhbGl6YXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2hlcmUgdW5pbml0aWFsaXplZCBmaWVsZHNcbiAgIGNvdWxkIGJlIHJlYWQgbGF0ZXIgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMuXG40LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2Vzc1xuICAgdW5pbml0aWFsaXplZCBieXRlcyBvZiBleGlzdGluZyBidWZmZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjpcbi0gVGhlIGNvZGUgY2hhbmdlcyBwcmltYXJpbHkgcmlzayBvdXQtb2YtYm91bmRzIGFjY2VzcywgYXJyYXkgb3ZlcmZsb3dzLCBOVUxMIHBvaW50ZXJcbiAgZGVyZWZlcmVuY2VzLCBsb2NraW5nIGRlYWRsb2Nrcywgb3IgdXNlLWFmdGVyLWZyZWUgYnVncyAodGhlc2UgYXJlIGFscmVhZHkgY2F1Z2h0XG4gIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS5cbi0gQWxsIHN0YWNrL2hlYXAgc3RydWN0dXJlcyB0b3VjaGVkIG9yIGludHJvZHVjZWQgYnkgdGhlIHBhdGNoIGFyZSBmdWxseSB6ZXJvZWRcbiAgb3IgaW5pdGlhbGl6ZWQgKGUuZy4gdXNpbmcgPSB7MH0sIG1lbXNldCwga3phbGxvYykgYmVmb3JlIGJlaW5nIHJlYWQgb3IgY29waWVkLlxuLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuXG5cblVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGluc3BlY3QgdGhlIHN1cnJvdW5kaW5nIGNvZGUgaWYgbmVjZXNzYXJ5LCB0aGVuIHByb3ZpZGVcbmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guXG5QcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy5cblxuXG5Vc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLlxuSXQgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0aGUgZmluYWwgcmVwbHkuXG5JZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuXG4iLCJQcm9tcHQiOiJUYXJnZXQgYXJjaGl0ZWN0dXJlOiBhbWQ2NFxuXG5Gb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczpcbmNvbW1pdCAwNzExNTUzNmJjMjdmZDJjNzAxYjUxNzgyZjhmYjJiNmY2MjljMDFkXG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIFRodSBTZXAgMyAxNTo0MzoxOSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2d1ZXN0X21lbWZkLmMgYi92aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXG5pbmRleCBiNTk2NDg2ZDE4NGNhLi4zMjMxNTljOWI1ZjM0IDEwMDY0NFxuLS0tIGEvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuKysrIGIvdmlydC9rdm0vZ3Vlc3RfbWVtZmQuY1xuQEAgLTYxMiwxMCArNjEyLDE0IEBAIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcbiBcdHN0cnVjdCBpbm9kZSAqaW5vZGU7XG4gXHRzdHJ1Y3QgZmlsZSAqZmlsZTtcbiBcdGludCByID0gLUVJTlZBTDtcbitcdHZvaWQgKnhhcjtcbiBcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcbiBcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVx1MDAzZWdtZW0ucGdvZmYpKTtcbiBcbitcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTVNMT1RfR01FTV9PTkxZKSlcbitcdFx0cmV0dXJuIC1FSU5WQUw7XG4rXG4gXHRmaWxlID0gZmdldChmZCk7XG4gXHRpZiAoIWZpbGUpXG4gXHRcdHJldHVybiAtRUJBREY7XG5AQCAtNjQ5LDEyICs2NTMsMTIgQEAgaW50IGt2bV9nbWVtX2JpbmQoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxuIFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcbiBcdCAqIGlzIG5vdCB2aXNpYmxlIHlldCwga3ZtX2dtZW1fZ2V0X3BmbigpIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoZSBmaWxlLlxuIFx0ICovXG4tXHRXUklURV9PTkNFKHNsb3QtXHUwMDNlZ21lbS5maWxlLCBmaWxlKTtcbitcdHNsb3QtXHUwMDNlZ21lbS5maWxlID0gZmlsZTtcbiBcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IHN0YXJ0O1xuIFx0aWYgKGt2bV9nbWVtX3N1cHBvcnRzX21tYXAoaW5vZGUpKVxuIFx0XHRzbG90LVx1MDAzZWZsYWdzIHw9IEtWTV9NRU1TTE9UX0dNRU1fT05MWTtcbiBcbi1cdHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbitcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFx1MDAyNmYtXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBzbG90LCBHRlBfS0VSTkVMKTtcbiBcdGZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtXHUwMDNlaV9tYXBwaW5nKTtcbiBcbiBcdC8qXG5AQCAtNjYyLDcgKzY2NiwxMyBAQCBpbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXG4gXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxuIFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXG4gXHQgKi9cbi1cdHIgPSAwO1xuK1x0ciA9IHhhX2lzX2Vycih4YXIpID8geGFfZXJyKHhhcikgOiAwO1xuK1x0aWYgKHIpIHtcbitcdFx0eGFfc3RvcmVfcmFuZ2UoXHUwMDI2Zi1cdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIE5VTEwsIEdGUF9LRVJORUwpO1xuK1x0XHRzbG90LVx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XG4rXHRcdHNsb3QtXHUwMDNlZ21lbS5wZ29mZiA9IDA7XG4rXHRcdHNsb3QtXHUwMDNlZmxhZ3MgXHUwMDI2PSB+S1ZNX01FTVNMT1RfR01FTV9PTkxZO1xuK1x0fVxuIGVycjpcbiBcdGZwdXQoZmlsZSk7XG4gXHRyZXR1cm4gcjtcbmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uY1xuaW5kZXggNjVlYjI2YTA1MjBkOC4uMjFjMTBjYmJhYzY2MSAxMDA2NDRcbi0tLSBhL3ZpcnQva3ZtL2t2bV9tYWluLmNcbisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmNcbkBAIC0xODg3LDcgKzE4ODcsOCBAQCBzdGF0aWMgdm9pZCBrdm1fdXBkYXRlX2ZsYWdzX21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdFx0XHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXG4gXHRcdFx0ICAgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbmV3LFxuLVx0XHRcdCAgIGVudW0ga3ZtX21yX2NoYW5nZSBjaGFuZ2UpXG4rXHRcdFx0ICAgZW51bSBrdm1fbXJfY2hhbmdlIGNoYW5nZSxcbitcdFx0XHQgICB1bnNpZ25lZCBpbnQgZ21lbV9mZCwgdW9mZl90IGdtZW1fb2Zmc2V0KVxuIHtcbiBcdHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKmludmFsaWRfc2xvdDtcbiBcdGludCByO1xuQEAgLTE5MzEsMjAgKzE5MzIsMTYgQEAgc3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxuIFx0fVxuIFxuIFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcbi1cdGlmIChyKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vXG4tXHRcdCAqIG1vZGlmaWNhdGlvbnMgcmVxdWlyZWQgc2luY2UgdGhlIG9yaWdpbmFsIHNsb3Qgd2FzIHByZXNlcnZlZFxuLVx0XHQgKiBpbiB0aGUgaW5hY3RpdmUgc2xvdHMuICBDaGFuZ2luZyB0aGUgYWN0aXZlIG1lbXNsb3RzIGFsc29cbi1cdFx0ICogcmVsZWFzZSBzbG90c19hcmNoX2xvY2suXG4tXHRcdCAqL1xuLVx0XHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4tXHRcdFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XG4tXHRcdFx0a2ZyZWUoaW52YWxpZF9zbG90KTtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRtdXRleF91bmxvY2soXHUwMDI2a3ZtLVx1MDAzZXNsb3RzX2FyY2hfbG9jayk7XG4tXHRcdH1cbi1cdFx0cmV0dXJuIHI7XG4rXHRpZiAocilcbitcdFx0Z290byBlcnI7XG4rXG4rXHRpZiAobmV3IFx1MDAyNlx1MDAyNiBuZXctXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcbitcdFx0aWYgKFdBUk5fT05fT05DRShjaGFuZ2UgIT0gS1ZNX01SX0NSRUFURSkpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbitcbitcdFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcbitcdFx0aWYgKHIpXG4rXHRcdFx0Z290byBlcnJfYmluZDtcbiBcdH1cbiBcbiBcdC8qXG5AQCAtMTk3Nyw2ICsxOTc0LDI3IEBAIHN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcbiBcdGt2bV9jb21taXRfbWVtb3J5X3JlZ2lvbihrdm0sIG9sZCwgbmV3LCBjaGFuZ2UpO1xuIFxuIFx0cmV0dXJuIDA7XG4rXG4rZXJyX2JpbmQ6XG4rXHRpZiAobmV3KSB7XG4rXHRcdGt2bV9hcmNoX2ZyZWVfbWVtc2xvdChrdm0sIG5ldyk7XG4rXG4rXHRcdGlmIChuZXctXHUwMDNlZGlydHlfYml0bWFwIFx1MDAyNlx1MDAyNiAoIW9sZCB8fCAhb2xkLVx1MDAzZWRpcnR5X2JpdG1hcCkpXG4rXHRcdFx0a3ZtX2Rlc3Ryb3lfZGlydHlfYml0bWFwKG5ldyk7XG4rXHR9XG4rZXJyOlxuK1x0LypcbitcdCAqIEZvciBERUxFVEUvTU9WRSwgcmV2ZXJ0IHRoZSBhYm92ZSBJTlZBTElEIGNoYW5nZS4gIE5vIG1vZGlmaWNhdGlvbnNcbitcdCAqIHJlcXVpcmVkIHNpbmNlIHRoZSBvcmlnaW5hbCBzbG90IHdhcyBwcmVzZXJ2ZWQgaW4gdGhlIGluYWN0aXZlIHNsb3RzLlxuK1x0ICogQ2hhbmdpbmcgdGhlIGFjdGl2ZSBtZW1zbG90cyBhbHNvIHJlbGVhc2Ugc2xvdHNfYXJjaF9sb2NrLlxuK1x0ICovXG4rXHRpZiAoY2hhbmdlID09IEtWTV9NUl9ERUxFVEUgfHwgY2hhbmdlID09IEtWTV9NUl9NT1ZFKSB7XG4rXHRcdGt2bV9hY3RpdmF0ZV9tZW1zbG90KGt2bSwgaW52YWxpZF9zbG90LCBvbGQpO1xuK1x0XHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xuK1x0fSBlbHNlIHtcbitcdFx0bXV0ZXhfdW5sb2NrKFx1MDAyNmt2bS1cdTAwM2VzbG90c19hcmNoX2xvY2spO1xuK1x0fVxuK1x0cmV0dXJuIHI7XG4gfVxuIFxuIHN0YXRpYyBib29sIGt2bV9jaGVja19tZW1zbG90X292ZXJsYXAoc3RydWN0IGt2bV9tZW1zbG90cyAqc2xvdHMsIGludCBpZCxcbkBAIC0yMDU4LDcgKzIwNzYsNyBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRcdGlmIChXQVJOX09OX09OQ0Uoa3ZtLVx1MDAzZW5yX21lbXNsb3RfcGFnZXMgXHUwMDNjIG9sZC1cdTAwM2VucGFnZXMpKVxuIFx0XHRcdHJldHVybiAtRUlPO1xuIFxuLVx0XHRyZXR1cm4ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBOVUxMLCBLVk1fTVJfREVMRVRFKTtcbitcdFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xuIFx0fVxuIFxuIFx0YmFzZV9nZm4gPSAobWVtLVx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcdTAwM2VcdTAwM2UgUEFHRV9TSElGVCk7XG5AQCAtMjEwNSwyMSArMjEyMywxNCBAQCBzdGF0aWMgaW50IGt2bV9zZXRfbWVtb3J5X3JlZ2lvbihzdHJ1Y3Qga3ZtICprdm0sXG4gXHRuZXctXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xuIFx0bmV3LVx1MDAzZWZsYWdzID0gbWVtLVx1MDAzZWZsYWdzO1xuIFx0bmV3LVx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVx1MDAzZXVzZXJzcGFjZV9hZGRyO1xuLVx0aWYgKG1lbS1cdTAwM2VmbGFncyBcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRCkge1xuLVx0XHRyID0ga3ZtX2dtZW1fYmluZChrdm0sIG5ldywgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbi1cdFx0aWYgKHIpXG4tXHRcdFx0Z290byBvdXQ7XG4tXHR9XG4gXG4tXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSk7XG4rXHRyID0ga3ZtX3NldF9tZW1zbG90KGt2bSwgb2xkLCBuZXcsIGNoYW5nZSxcbitcdFx0XHQgICAgbWVtLVx1MDAzZWd1ZXN0X21lbWZkLCBtZW0tXHUwMDNlZ3Vlc3RfbWVtZmRfb2Zmc2V0KTtcbiBcdGlmIChyKVxuLVx0XHRnb3RvIG91dF91bmJpbmQ7XG4rXHRcdGdvdG8gb3V0O1xuIFxuIFx0cmV0dXJuIDA7XG4gXG4tb3V0X3VuYmluZDpcbi1cdGlmIChtZW0tXHUwMDNlZmxhZ3MgXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpXG4tXHRcdGt2bV9nbWVtX3VuYmluZChuZXcpO1xuIG91dDpcbiBcdGtmcmVlKG5ldyk7XG4gXHRyZXR1cm4gcjtcbiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjEzLjIyMjYzOTIyNFoiLCJTZXEiOjI3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo3OTc4NzQ2NzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV2YWx1YXRpbmcgdGhlIEtWTSBQYXRjaCBTZXJpZXMgZm9yIEZ1enppbmcgTmVlZHMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGlzIHBhdGNoIHNlcmllcyBuZWNlc3NpdGF0ZXMgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uLCBvciBpZiB3ZSdyZSBnb29kIHdpdGggdGhlIHN0YW5kYXJkIEtBU0FOL0xPQ0tERVAvYnVnIGRldGVjdG9yIGFwcHJvYWNoLiBMZXQncyBkaXZlIGluLlxuXG5GaXJzdCwgSSBzZWUgdGhlIHBhdGNoZXMgdG91Y2ggYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgIGFuZCBgdmlydC9rdm0va3ZtX21haW4uY2AuIFRoYXQgZ2l2ZXMgbWUgYSBzdGFydGluZyBwb2ludC4gTGV0J3MgYnJlYWsgaXQgZG93bjpcblxuSW4gYGd1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYGt2bV9nbWVtX2JpbmRgOiBpdCBsb29rcyBsaWtlIHdlJ3ZlIGdvdCBhIGBXQVJOX09OX09OQ0VgIGlmIGBzbG90LVx1MDAzZWZsYWdzYCBoYXMgYEtWTV9NRU1TTE9UX0dNRU1fT05MWWAgc2V0LiBJbnRlcmVzdGluZy4gVGhlbiB0aGVyZSBpcyBhbiBlcnJvciBjaGVjayBmb2xsb3dpbmcgYHhhX3N0b3JlX3JhbmdlYCB3aGljaCByb2xscyBiYWNrIG9uIGVycm9yLCBjbGVhcmluZyBzb21lIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIGdtZW0gYW5kIGhhbmRsaW5nIG1lbW9yeSBzbG90IGZsYWdzLiBUaGUgb3JpZ2luYWwgcGF0Y2ggdXNlcyBgV1JJVEVfT05DRWAgdG8gc2V0IHRoZSBnbWVtIGZpbGUgYW5kIGhhcyBub3cgYmVlbiByZXBsYWNlZCB3aXRoIGEgZGlyZWN0IGFzc2lnbm1lbnQuIEknbGwgbmVlZCB0byBkb3VibGUtY2hlY2sgd2h5IHRoYXQgY2hhbmdlIHdhcyBtYWRlLlxuXG5PdmVyIGluIGBrdm1fbWFpbi5jYCwgYGt2bV9zZXRfbWVtc2xvdGAgaGFzIGFkZGVkIG5ldyBwYXJhbWV0ZXJzLCBgZ21lbV9mZGAgYW5kIGBnbWVtX29mZnNldGAuIEFuZCBpdCBsb29rcyBsaWtlIGBrdm1fZ21lbV9iaW5kYCBoYXMgYmVlbiBtb3ZlZCBmcm9tIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIGludG8gYGt2bV9zZXRfbWVtc2xvdGAuICBFcnJvciB1bndpbmRpbmcgaXMgaW4gcGxhY2UgaWYgYGt2bV9nbWVtX2JpbmRgIGZhaWxzLCB3aGljaCBpbmNsdWRlcyByZWxlYXNpbmcgbWVtb3J5IHNsb3RzIGFuZCBkZXN0cm95aW5nIHRoZSBkaXJ0eSBiaXRtYXAsIGlmIG5lY2Vzc2FyeS4gQW5kIGZpbmFsbHksIGluIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gLCB0aGUgcGF0Y2ggcGFzc2VzIHRoZSBtZW1mZCBwYXJhbWV0ZXJzIHRvIGBrdm1fc2V0X21lbXNsb3RgIGFuZCByZW1vdmVzIHRoZSBvbGQgYmluZGluZyBsb2dpYy5cblxuTm93LCBJIG5lZWQgdG8gZ2V0IGEgYmV0dGVyIGhhbmRsZSBvbiB0aGUgcG90ZW50aWFsIGZvciB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrcy4gVGltZSB0byBmaXJlIHVwIG15IHRydXN0eSB0b29scyDigJMgcmVhZC1maWxlIG9yIGdyZXBwZXIg4oCTIGFuZCByZWFsbHkgZGlnIGludG8gdGhlIGNvZGUuIEknbGwgYmUgbG9va2luZyBmb3IgYW55IGNsdWVzIHRoYXQgY291bGQgaW5kaWNhdGUgc29tZXRoaW5nIG5ldyB0byBmdXp6LCBvciBpZiB0aGlzIGNoYW5nZSBpcyBqdXN0IG1vdmluZyBzb21lIGxvZ2ljIGFyb3VuZC5cblxuXG4iLCJJbnB1dFRva2VucyI6NDAxNSwiT3V0cHV0VG9rZW5zIjozMSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUwMSwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjIxLjIwMTM5MDEwNVoiLCJTZXEiOjI4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDc4MTIwNDgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwia3ZtX2dtZW1fYmluZFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jPTU5Mj1pbnQga3ZtX2dtZW1fY3JlYXRlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9jcmVhdGVfZ3Vlc3RfbWVtZmQgKmFyZ3MpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTYwNS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jOjYwNjppbnQga3ZtX2dtZW1fYmluZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKnNsb3QsXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYy02MDctXFx0XFx0ICB1bnNpZ25lZCBpbnQgZmQsIHVvZmZfdCBvZmZzZXQpXFxuLS1cXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1Mi1cXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuYzo2NTM6XFx0ICoga3ZtX2dtZW1fYmluZCgpIG11c3Qgb2NjdXIgb24gYSBuZXcgbWVtc2xvdC4gIEJlY2F1c2UgdGhlIG1lbXNsb3RcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5jLTY1NC1cXHQgKiBpcyBub3QgdmlzaWJsZSB5ZXQsIGt2bV9nbWVtX2dldF9wZm4oKSBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGUgZmlsZS5cXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTA9aW50IGt2bV9nbWVtX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fY3JlYXRlX2d1ZXN0X21lbWZkICphcmdzKTtcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oOjExOmludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTEyLVxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KTtcXG4tLVxcbnZpcnQva3ZtL2d1ZXN0X21lbWZkLmg9MTk9c3RhdGljIGlubGluZSB2b2lkIGt2bV9nbWVtX2V4aXQodm9pZCkge307XFxudmlydC9rdm0vZ3Vlc3RfbWVtZmQuaDoyMDpzdGF0aWMgaW5saW5lIGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSxcXG52aXJ0L2t2bS9ndWVzdF9tZW1mZC5oLTIxLVxcdFxcdFxcdFxcdFxcdCBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpzbG90LFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYz0xODg3PXN0YXRpYyBpbnQga3ZtX3NldF9tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTk0MS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE5NDI6XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE5NDMtXFx0XFx0aWYgKHIpXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjIxLjI0OTIwNDUxM1oiLCJTZXEiOjI5LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTg1MjU4NzI0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgYW5hbHlzaXMgb2YgdGhlIHByb3ZpZGVkIHRleHQsIHN1bW1hcml6ZWQgaW4gdGhlIGZpcnN0IHBlcnNvbiBhcyBpZiB0aGV5IHdlcmUgbXkgdGhvdWdodHM6XG5cbioqQW5hbHl6aW5nIEtWTSBHdWVzdCBNZW1vcnkgTWFuYWdlbWVudCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byB0aGUgZ3V0cyBvZiBLVk0ncyBndWVzdCBtZW1vcnkgbWFuYWdlbWVudC4gTXkgZm9jdXMgaXMgZ29pbmcgdG8gYmUgb24gYHZpcnQva3ZtL2d1ZXN0X21lbWZkLmNgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoZSBga3ZtX2dtZW1fYmluZGAgZnVuY3Rpb24uIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBtZW1vcnkgaXMgYWN0dWFsbHkgYm91bmQgdG8gZ3Vlc3QgcHJvY2Vzc2VzIHVzaW5nIG1lbWZkcy4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYSBmb3Igc2VjdXJpdHkgYW5kIHBlcmZvcm1hbmNlLCBzbyBJIHdhbnQgYSBkZWVwIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGludGVyYWN0aW9ucyBpbnZvbHZlZC5cblxuVGhlbiwgdG8gcHV0IGl0IGludG8gdGhlIHdpZGVyIGNvbnRleHQgb2YgaG93IHRoaXMgbWVtb3J5IGdldHMgc2V0IHVwIGluaXRpYWxseSwgSSdsbCBuZWVkIHRvIGp1bXAgb3ZlciB0byBgdmlydC9rdm0va3ZtX21haW4uY2AgYW5kIHRha2UgYSBjbG9zZSBsb29rIGF0IGJvdGggYGt2bV9nbWVtX2JpbmRgIGFuZCBob3cgYGt2bV9zZXRfbWVtc2xvdGAgd29ya3MuIFVuZGVyc3RhbmRpbmcgaG93IG1lbXNsb3RzIGFyZSBjb25maWd1cmVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1lbWZkIGJpbmRpbmcgaXMgZXNzZW50aWFsIHRvIGdyYXNwaW5nIHRoZSBjb21wbGV0ZSBtZW1vcnkgbWFwcGluZyBwaWN0dXJlLiBJJ20gdGhpbmtpbmcgSSdsbCB0cmFjZSBkYXRhIGZsb3cgYW5kIGNvbnRyb2wgcGF0aHMgdG8gYnVpbGQgYSBtZW50YWwgbWFwIG9mIHRoZSBwcm9jZXNzLCBsb29raW5nIGZvciBhbnkgb3B0aW1pemF0aW9uIGJvdHRsZW5lY2tzIG9yIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcyBhcyBJIGdvLlxuXG5cbiIsIklucHV0VG9rZW5zIjo1NjE2LCJPdXRwdXRUb2tlbnMiOjM5LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NTIsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MjMuNDM0NDY2ODM3WiIsIlNlcSI6MzAsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjEzNDg0MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9ndWVzdF9tZW1mZC5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDYwNSxcbiAgXCJMaW5lQ291bnRcIjogNzVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDYwNTpcXHRcXG4gNjA2OlxcdGludCBrdm1fZ21lbV9iaW5kKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqc2xvdCxcXG4gNjA3OlxcdFxcdFxcdCAgdW5zaWduZWQgaW50IGZkLCB1b2ZmX3Qgb2Zmc2V0KVxcbiA2MDg6XFx0e1xcbiA2MDk6XFx0XFx0dW9mZl90IHNpemUgPSBzbG90LVxcdTAwM2VucGFnZXMgXFx1MDAzY1xcdTAwM2MgUEFHRV9TSElGVDtcXG4gNjEwOlxcdFxcdHVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDtcXG4gNjExOlxcdFxcdHN0cnVjdCBnbWVtX2ZpbGUgKmY7XFxuIDYxMjpcXHRcXHRzdHJ1Y3QgaW5vZGUgKmlub2RlO1xcbiA2MTM6XFx0XFx0c3RydWN0IGZpbGUgKmZpbGU7XFxuIDYxNDpcXHRcXHRpbnQgciA9IC1FSU5WQUw7XFxuIDYxNTpcXHRcXHR2b2lkICp4YXI7XFxuIDYxNjpcXHRcXG4gNjE3OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ3BhX3QpICE9IHNpemVvZihvZmZzZXQpKTtcXG4gNjE4OlxcdFxcdEJVSUxEX0JVR19PTihzaXplb2YoZ2ZuX3QpICE9IHNpemVvZihzbG90LVxcdTAwM2VnbWVtLnBnb2ZmKSk7XFxuIDYxOTpcXHRcXG4gNjIwOlxcdFxcdGlmIChXQVJOX09OX09OQ0Uoc2xvdC1cXHUwMDNlZmxhZ3MgXFx1MDAyNiBLVk1fTUVNU0xPVF9HTUVNX09OTFkpKVxcbiA2MjE6XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuIDYyMjpcXHRcXG4gNjIzOlxcdFxcdGZpbGUgPSBmZ2V0KGZkKTtcXG4gNjI0OlxcdFxcdGlmICghZmlsZSlcXG4gNjI1OlxcdFxcdFxcdHJldHVybiAtRUJBREY7XFxuIDYyNjpcXHRcXG4gNjI3OlxcdFxcdGlmIChmaWxlLVxcdTAwM2VmX29wICE9IFxcdTAwMjZrdm1fZ21lbV9mb3BzKVxcbiA2Mjg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDYyOTpcXHRcXG4gNjMwOlxcdFxcdGYgPSBmaWxlLVxcdTAwM2Vwcml2YXRlX2RhdGE7XFxuIDYzMTpcXHRcXHRpZiAoZi1cXHUwMDNla3ZtICE9IGt2bSlcXG4gNjMyOlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2MzM6XFx0XFxuIDYzNDpcXHRcXHRpbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7XFxuIDYzNTpcXHRcXG4gNjM2OlxcdFxcdGlmICghUEFHRV9BTElHTkVEKG9mZnNldCkgfHwgb2Zmc2V0ICsgc2l6ZSBcXHUwMDNlIGlfc2l6ZV9yZWFkKGlub2RlKSlcXG4gNjM3OlxcdFxcdFxcdGdvdG8gZXJyO1xcbiA2Mzg6XFx0XFxuIDYzOTpcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfbG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjQwOlxcdFxcbiA2NDE6XFx0XFx0c3RhcnQgPSBvZmZzZXQgXFx1MDAzZVxcdTAwM2UgUEFHRV9TSElGVDtcXG4gNjQyOlxcdFxcdGVuZCA9IHN0YXJ0ICsgc2xvdC1cXHUwMDNlbnBhZ2VzO1xcbiA2NDM6XFx0XFxuIDY0NDpcXHRcXHRpZiAoIXhhX2VtcHR5KFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncykgXFx1MDAyNlxcdTAwMjZcXG4gNjQ1OlxcdFxcdCAgICB4YV9maW5kKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgXFx1MDAyNnN0YXJ0LCBlbmQgLSAxLCBYQV9QUkVTRU5UKSkge1xcbiA2NDY6XFx0XFx0XFx0ciA9IC1FRVhJU1Q7XFxuIDY0NzpcXHRcXHRcXHRmaWxlbWFwX2ludmFsaWRhdGVfdW5sb2NrKGlub2RlLVxcdTAwM2VpX21hcHBpbmcpO1xcbiA2NDg6XFx0XFx0XFx0Z290byBlcnI7XFxuIDY0OTpcXHRcXHR9XFxuIDY1MDpcXHRcXG4gNjUxOlxcdFxcdC8qXFxuIDY1MjpcXHRcXHQgKiBtZW1zbG90cyBvZiBmbGFnIEtWTV9NRU1fR1VFU1RfTUVNRkQgYXJlIGltbXV0YWJsZSB0byBjaGFuZ2UsIHNvXFxuIDY1MzpcXHRcXHQgKiBrdm1fZ21lbV9iaW5kKCkgbXVzdCBvY2N1ciBvbiBhIG5ldyBtZW1zbG90LiAgQmVjYXVzZSB0aGUgbWVtc2xvdFxcbiA2NTQ6XFx0XFx0ICogaXMgbm90IHZpc2libGUgeWV0LCBrdm1fZ21lbV9nZXRfcGZuKCkgaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGZpbGUuXFxuIDY1NTpcXHRcXHQgKi9cXG4gNjU2OlxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IGZpbGU7XFxuIDY1NzpcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gc3RhcnQ7XFxuIDY1ODpcXHRcXHRpZiAoa3ZtX2dtZW1fc3VwcG9ydHNfbW1hcChpbm9kZSkpXFxuIDY1OTpcXHRcXHRcXHRzbG90LVxcdTAwM2VmbGFncyB8PSBLVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY2MDpcXHRcXG4gNjYxOlxcdFxcdHhhciA9IHhhX3N0b3JlX3JhbmdlKFxcdTAwMjZmLVxcdTAwM2ViaW5kaW5ncywgc3RhcnQsIGVuZCAtIDEsIHNsb3QsIEdGUF9LRVJORUwpO1xcbiA2NjI6XFx0XFx0ZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS1cXHUwMDNlaV9tYXBwaW5nKTtcXG4gNjYzOlxcdFxcbiA2NjQ6XFx0XFx0LypcXG4gNjY1OlxcdFxcdCAqIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSwgZXZlbiBvbiBzdWNjZXNzLiAgVGhlIGZpbGUgcGlucyBLVk0sXFxuIDY2NjpcXHRcXHQgKiBub3QgdGhlIG90aGVyIHdheSAncm91bmQuICBBY3RpdmUgYmluZGluZ3MgYXJlIGludmFsaWRhdGVkIGlmIHRoZVxcbiA2Njc6XFx0XFx0ICogZmlsZSBpcyBjbG9zZWQgYmVmb3JlIG1lbXNsb3RzIGFyZSBkZXN0cm95ZWQuXFxuIDY2ODpcXHRcXHQgKi9cXG4gNjY5OlxcdFxcdHIgPSB4YV9pc19lcnIoeGFyKSA/IHhhX2Vycih4YXIpIDogMDtcXG4gNjcwOlxcdFxcdGlmIChyKSB7XFxuIDY3MTpcXHRcXHRcXHR4YV9zdG9yZV9yYW5nZShcXHUwMDI2Zi1cXHUwMDNlYmluZGluZ3MsIHN0YXJ0LCBlbmQgLSAxLCBOVUxMLCBHRlBfS0VSTkVMKTtcXG4gNjcyOlxcdFxcdFxcdHNsb3QtXFx1MDAzZWdtZW0uZmlsZSA9IE5VTEw7XFxuIDY3MzpcXHRcXHRcXHRzbG90LVxcdTAwM2VnbWVtLnBnb2ZmID0gMDtcXG4gNjc0OlxcdFxcdFxcdHNsb3QtXFx1MDAzZWZsYWdzIFxcdTAwMjY9IH5LVk1fTUVNU0xPVF9HTUVNX09OTFk7XFxuIDY3NTpcXHRcXHR9XFxuIDY3NjpcXHRlcnI6XFxuIDY3NzpcXHRcXHRmcHV0KGZpbGUpO1xcbiA2Nzg6XFx0XFx0cmV0dXJuIHI7XFxuIDY3OTpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjIzLjQzNDYwMzkxN1oiLCJTZXEiOjMxLCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMTU0NDAyNTY2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGFrZSBvbiB0aGUgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBpdCB3ZXJlIG15IG93bjpcblxuKipEaXZpbmcgaW50byBLVk0gQ29yZTogQSBUYXJnZXRlZCBMb29rKipcblxuT2theSwgdGltZSB0byBnZXQgbXkgaGFuZHMgZGlydHkuIEkndmUgZ290IGEgaHVuY2gsIGFuZCBJIG5lZWQgdG8gdmVyaWZ5IGl0IGluIHRoZSBLVk0gY29kZWJhc2UuIFNwZWNpZmljYWxseSwgSSdtIGdvaW5nIHRvIGZvY3VzIG15IGF0dGVudGlvbiBvbiBgdmlydC9rdm0va3ZtX21haW4uY2AuIE15IGd1dCBzYXlzIHRoYXQgdGhlIGxvZ2ljIEknbSBpbnRlcmVzdGVkIGluIGlzIGxpa2VseSB3aXRoaW4gdGhlIHZpY2luaXR5IG9mIGxpbmVzIDE4ODcgdG8gMjEzNS4gVGhpcyByYW5nZSBwcm9iYWJseSBlbmNhcHN1bGF0ZXMgdGhlIGNyaXRpY2FsIGNvZGUgSSBuZWVkIHRvIHNjcnV0aW5pemUuIEknbSBub3QgZ29pbmcgaW4gYmxpbmQ7IEkgaGF2ZSBhIHNwZWNpZmljIGNvbmNlcHQgSSdtIGNoYXNpbmcuIExldCdzIHNlZSBpZiB0aG9zZSBsaW5lcyBob2xkIHRoZSBrZXkuIEkgZXhwZWN0IEkgd2lsbCBiZSBkaWdnaW5nIGludG8gdGhlIGZpbmVyIGRldGFpbHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGluIHRoaXMgc2VjdGlvbiB0byBmaW5kIHdoYXQgSSBuZWVkLlxuXG5cbiIsIklucHV0VG9rZW5zIjo3MTQzLCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzEsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoyNS41ODkwMTI3ODNaIiwiU2VxIjozMiwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg5MjQwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcInZpcnQva3ZtL2t2bV9tYWluLmNcIixcbiAgXCJGaXJzdExpbmVcIjogMTkyMCxcbiAgXCJMaW5lQ291bnRcIjogODBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiMTkyMDpcXHRcXHQgKlxcbjE5MjE6XFx0XFx0ICogTW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBvbiBhIHRlbXBvcmFyeSwgdW5yZWFjaGFibGUgc2xvdC4gIFRoZSBvbGRcXG4xOTIyOlxcdFxcdCAqIHNsb3QgbmVlZHMgdG8gYmUgcHJlc2VydmVkIGluIGNhc2UgYSBsYXRlciBzdGVwIGZhaWxzIGFuZCB0aGVcXG4xOTIzOlxcdFxcdCAqIGludmFsaWRhdGlvbiBuZWVkcyB0byBiZSByZXZlcnRlZC5cXG4xOTI0OlxcdFxcdCAqL1xcbjE5MjU6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5MjY6XFx0XFx0XFx0aW52YWxpZF9zbG90ID0ga3phbGxvY19vYmooKmludmFsaWRfc2xvdCwgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4xOTI3OlxcdFxcdFxcdGlmICghaW52YWxpZF9zbG90KSB7XFxuMTkyODpcXHRcXHRcXHRcXHRtdXRleF91bmxvY2soXFx1MDAyNmt2bS1cXHUwMDNlc2xvdHNfYXJjaF9sb2NrKTtcXG4xOTI5OlxcdFxcdFxcdFxcdHJldHVybiAtRU5PTUVNO1xcbjE5MzA6XFx0XFx0XFx0fVxcbjE5MzE6XFx0XFx0XFx0a3ZtX2ludmFsaWRhdGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTMyOlxcdFxcdH1cXG4xOTMzOlxcdFxcbjE5MzQ6XFx0XFx0ciA9IGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTM1OlxcdFxcdGlmIChyKVxcbjE5MzY6XFx0XFx0XFx0Z290byBlcnI7XFxuMTkzNzpcXHRcXG4xOTM4OlxcdFxcdGlmIChuZXcgXFx1MDAyNlxcdTAwMjYgbmV3LVxcdTAwM2VmbGFncyBcXHUwMDI2IEtWTV9NRU1fR1VFU1RfTUVNRkQpIHtcXG4xOTM5OlxcdFxcdFxcdGlmIChXQVJOX09OX09OQ0UoY2hhbmdlICE9IEtWTV9NUl9DUkVBVEUpKVxcbjE5NDA6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQxOlxcdFxcbjE5NDI6XFx0XFx0XFx0ciA9IGt2bV9nbWVtX2JpbmQoa3ZtLCBuZXcsIGdtZW1fZmQsIGdtZW1fb2Zmc2V0KTtcXG4xOTQzOlxcdFxcdFxcdGlmIChyKVxcbjE5NDQ6XFx0XFx0XFx0XFx0Z290byBlcnJfYmluZDtcXG4xOTQ1OlxcdFxcdH1cXG4xOTQ2OlxcdFxcbjE5NDc6XFx0XFx0LypcXG4xOTQ4OlxcdFxcdCAqIEZvciBERUxFVEUgYW5kIE1PVkUsIHRoZSB3b3JraW5nIHNsb3QgaXMgbm93IGFjdGl2ZSBhcyB0aGUgSU5WQUxJRFxcbjE5NDk6XFx0XFx0ICogdmVyc2lvbiBvZiB0aGUgb2xkIHNsb3QuICBNT1ZFIGlzIHBhcnRpY3VsYXJseSBzcGVjaWFsIGFzIGl0IHJldXNlc1xcbjE5NTA6XFx0XFx0ICogdGhlIG9sZCBzbG90IGFuZCByZXR1cm5zIGEgY29weSBvZiB0aGUgb2xkIHNsb3QgKGluIHdvcmtpbmdfc2xvdCkuXFxuMTk1MTpcXHRcXHQgKiBGb3IgQ1JFQVRFLCB0aGVyZSBpcyBubyBvbGQgc2xvdC4gIEZvciBERUxFVEUgYW5kIEZMQUdTX09OTFksIHRoZVxcbjE5NTI6XFx0XFx0ICogb2xkIHNsb3QgaXMgZGV0YWNoZWQgYnV0IG90aGVyd2lzZSBwcmVzZXJ2ZWQuXFxuMTk1MzpcXHRcXHQgKi9cXG4xOTU0OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSlcXG4xOTU1OlxcdFxcdFxcdGt2bV9jcmVhdGVfbWVtc2xvdChrdm0sIG5ldyk7XFxuMTk1NjpcXHRcXHRlbHNlIGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSlcXG4xOTU3OlxcdFxcdFxcdGt2bV9kZWxldGVfbWVtc2xvdChrdm0sIG9sZCwgaW52YWxpZF9zbG90KTtcXG4xOTU4OlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSlcXG4xOTU5OlxcdFxcdFxcdGt2bV9tb3ZlX21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgaW52YWxpZF9zbG90KTtcXG4xOTYwOlxcdFxcdGVsc2UgaWYgKGNoYW5nZSA9PSBLVk1fTVJfRkxBR1NfT05MWSlcXG4xOTYxOlxcdFxcdFxcdGt2bV91cGRhdGVfZmxhZ3NfbWVtc2xvdChrdm0sIG9sZCwgbmV3KTtcXG4xOTYyOlxcdFxcdGVsc2VcXG4xOTYzOlxcdFxcdFxcdEJVRygpO1xcbjE5NjQ6XFx0XFxuMTk2NTpcXHRcXHQvKiBGcmVlIHRoZSB0ZW1wb3JhcnkgSU5WQUxJRCBzbG90IHVzZWQgZm9yIERFTEVURSBhbmQgTU9WRS4gKi9cXG4xOTY2OlxcdFxcdGlmIChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpXFxuMTk2NzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5Njg6XFx0XFxuMTk2OTpcXHRcXHQvKlxcbjE5NzA6XFx0XFx0ICogTm8gbmVlZCB0byByZWZyZXNoIG5ldy1cXHUwMDNlYXJjaCwgY2hhbmdlcyBhZnRlciBkcm9wcGluZyBzbG90c19hcmNoX2xvY2tcXG4xOTcxOlxcdFxcdCAqIHdpbGwgZGlyZWN0bHkgaGl0IHRoZSBmaW5hbCwgYWN0aXZlIG1lbXNsb3QuICBBcmNoaXRlY3R1cmVzIGFyZVxcbjE5NzI6XFx0XFx0ICogcmVzcG9uc2libGUgZm9yIGtub3dpbmcgdGhhdCBuZXctXFx1MDAzZWFyY2ggbWF5IGJlIHN0YWxlLlxcbjE5NzM6XFx0XFx0ICovXFxuMTk3NDpcXHRcXHRrdm1fY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBvbGQsIG5ldywgY2hhbmdlKTtcXG4xOTc1OlxcdFxcbjE5NzY6XFx0XFx0cmV0dXJuIDA7XFxuMTk3NzpcXHRcXG4xOTc4OlxcdGVycl9iaW5kOlxcbjE5Nzk6XFx0XFx0aWYgKG5ldykge1xcbjE5ODA6XFx0XFx0XFx0a3ZtX2FyY2hfZnJlZV9tZW1zbG90KGt2bSwgbmV3KTtcXG4xOTgxOlxcdFxcbjE5ODI6XFx0XFx0XFx0aWYgKG5ldy1cXHUwMDNlZGlydHlfYml0bWFwIFxcdTAwMjZcXHUwMDI2ICghb2xkIHx8ICFvbGQtXFx1MDAzZWRpcnR5X2JpdG1hcCkpXFxuMTk4MzpcXHRcXHRcXHRcXHRrdm1fZGVzdHJveV9kaXJ0eV9iaXRtYXAobmV3KTtcXG4xOTg0OlxcdFxcdH1cXG4xOTg1OlxcdGVycjpcXG4xOTg2OlxcdFxcdC8qXFxuMTk4NzpcXHRcXHQgKiBGb3IgREVMRVRFL01PVkUsIHJldmVydCB0aGUgYWJvdmUgSU5WQUxJRCBjaGFuZ2UuICBObyBtb2RpZmljYXRpb25zXFxuMTk4ODpcXHRcXHQgKiByZXF1aXJlZCBzaW5jZSB0aGUgb3JpZ2luYWwgc2xvdCB3YXMgcHJlc2VydmVkIGluIHRoZSBpbmFjdGl2ZSBzbG90cy5cXG4xOTg5OlxcdFxcdCAqIENoYW5naW5nIHRoZSBhY3RpdmUgbWVtc2xvdHMgYWxzbyByZWxlYXNlIHNsb3RzX2FyY2hfbG9jay5cXG4xOTkwOlxcdFxcdCAqL1xcbjE5OTE6XFx0XFx0aWYgKGNoYW5nZSA9PSBLVk1fTVJfREVMRVRFIHx8IGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkge1xcbjE5OTI6XFx0XFx0XFx0a3ZtX2FjdGl2YXRlX21lbXNsb3Qoa3ZtLCBpbnZhbGlkX3Nsb3QsIG9sZCk7XFxuMTk5MzpcXHRcXHRcXHRrZnJlZShpbnZhbGlkX3Nsb3QpO1xcbjE5OTQ6XFx0XFx0fSBlbHNlIHtcXG4xOTk1OlxcdFxcdFxcdG11dGV4X3VubG9jayhcXHUwMDI2a3ZtLVxcdTAwM2VzbG90c19hcmNoX2xvY2spO1xcbjE5OTY6XFx0XFx0fVxcbjE5OTc6XFx0XFx0cmV0dXJuIHI7XFxuMTk5ODpcXHR9XFxuMTk5OTpcXHRcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MjUuNTg5NTAzOTEzWiIsIlNlcSI6MzMsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjQyODM3ODQ4OTIsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IkhlcmUncyBteSB0aGlua2luZyBwcm9jZXNzOlxuXG4qKkRpdmluZyBpbnRvIEtWTSBNZW1vcnkgTWFuYWdlbWVudCoqXG5cbk9rYXksIHNvIEkgbmVlZCB0byB1bmRlcnN0YW5kIGhvdyBga3ZtX3NldF9tZW1zbG90YCBhbmQgYGt2bV9zZXRfbWVtb3J5X3JlZ2lvbmAgYXJlIGJlaW5nIHVzZWQuIFRoZXNlIGFyZSBjcml0aWNhbCBmdW5jdGlvbnMgaW4gS1ZNIGZvciBtYW5hZ2luZyB0aGUgdmlydHVhbCBtYWNoaW5lJ3MgbWVtb3J5LCByaWdodD8gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIHRyYWNlIHRoZSBjYWxscyB0byB0aGVzZSBmdW5jdGlvbnMgdG8gdW5kZXJzdGFuZCAqd2hvKiBpcyBzZXR0aW5nIHVwIG1lbW9yeSwgKndoZW4qIGluIHRoZSBWTSBsaWZlY3ljbGUsIGFuZCAqaG93KiB0aGUgbWVtb3J5IGlzIGJlaW5nIGNvbmZpZ3VyZWQuIEFyZSB3ZSB0YWxraW5nIGFib3V0IGluaXRpYWwgc2V0dXAsIGR5bmFtaWMgYWRkaXRpb24vcmVtb3ZhbCBvZiBtZW1vcnksIG9yIHNvbWV0aGluZyBlbHNlIGVudGlyZWx5PyBLbm93aW5nIHRoZSBjYWxsZXIgZnVuY3Rpb25zIHdpbGwgcHJvdmlkZSBjb250ZXh0LiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIHdoZXRoZXIgdGhleSdyZSBpbnZva2VkIGR1cmluZyBndWVzdCBzdGFydHVwLCBob3RwbHVnIG9wZXJhdGlvbnMsIG9yIHBlcmhhcHMgYnkgc29tZSBmb3JtIG9mIG1lbW9yeSBiYWxsb29uaW5nLiBJIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgdXNlIGNhc2VzLlxuXG5cbiIsIklucHV0VG9rZW5zIjo4NjcxLCJPdXRwdXRUb2tlbnMiOjMyLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MjgsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoyOS44NzMyOTE2NjZaIiwiU2VxIjozNCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjQ3MjczNTU4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImt2bV9zZXRfbWVtc2xvdFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJ2aXJ0L2t2bVwiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJ2aXJ0L2t2bS9rdm1fbWFpbi5jPTE2MDE9c3RhdGljIHZvaWQga3ZtX3N3YXBfYWN0aXZlX21lbXNsb3RzKHN0cnVjdCBrdm0gKmt2bSwgaW50IGFzX2lkKVxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0xNjI4LVxcdC8qXFxudmlydC9rdm0va3ZtX21haW4uYzoxNjI5OlxcdCAqIEFjcXVpcmVkIGluIGt2bV9zZXRfbWVtc2xvdC4gTXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgc3luY2hyb25pemVcXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTE2MzAtXFx0ICogU1JDVSBiZWxvdyBpbiBvcmRlciB0byBhdm9pZCBkZWFkbG9jayB3aXRoIGFub3RoZXIgdGhyZWFkXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTE4NzQ9c3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9mbGFnc19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSxcXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTg4Ni1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjE4ODc6c3RhdGljIGludCBrdm1fc2V0X21lbXNsb3Qoc3RydWN0IGt2bSAqa3ZtLFxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMTg4OC1cXHRcXHRcXHQgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICpvbGQsXFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jPTIwMTM9c3RhdGljIGludCBrdm1fc2V0X21lbW9yeV9yZWdpb24oc3RydWN0IGt2bSAqa3ZtLFxcbi0tXFxudmlydC9rdm0va3ZtX21haW4uYy0yMDY3LVxcdCAqIE5vdGUsIHRoZSBvbGQgbWVtc2xvdCAoYW5kIHRoZSBwb2ludGVyIGl0c2VsZiEpIG1heSBiZSBpbnZhbGlkYXRlZFxcbnZpcnQva3ZtL2t2bV9tYWluLmM6MjA2ODpcXHQgKiBhbmQvb3IgZGVzdHJveWVkIGJ5IGt2bV9zZXRfbWVtc2xvdCgpLlxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA2OS1cXHQgKi9cXG4tLVxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA3OC1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jOjIwNzk6XFx0XFx0cmV0dXJuIGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgTlVMTCwgS1ZNX01SX0RFTEVURSwgLTEsIDApO1xcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjA4MC1cXHR9XFxuLS1cXG52aXJ0L2t2bS9rdm1fbWFpbi5jLTIxMjYtXFxudmlydC9rdm0va3ZtX21haW4uYzoyMTI3OlxcdHIgPSBrdm1fc2V0X21lbXNsb3Qoa3ZtLCBvbGQsIG5ldywgY2hhbmdlLFxcbnZpcnQva3ZtL2t2bV9tYWluLmMtMjEyOC1cXHRcXHRcXHQgICAgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDoyOS45MjA1NzA4MDRaIiwiU2VxIjozNSwiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MjM1ODQyOTcxNywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiT2theSwgaGVyZSdzIG15IHRha2Ugb24gdGhvc2UgdGhvdWdodHMsIGZyYW1lZCBhcyBhbiBleHBlcnQncyBpbnRlcm5hbCBtb25vbG9ndWU6XG5cbioqSW52ZXN0aWdhdGluZyBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW50byBga3ZtX3NldF9tZW1vcnlfcmVnaW9uYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCB0aGF0IDIwMTMtMjE0MCByYW5nZS4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgZXhhY3RseSBob3cgdGhpcyBmdW5jdGlvbiBoYW5kbGVzIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBpbml0aWFsaXphdGlvbiB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgYG5ld2AgdmFyaWFibGUsIGJlY2F1c2UgdGhhdCdzIHdoZXJlIHRoaW5ncyBjYW4gb2Z0ZW4gZ28gc2lkZXdheXMgd2l0aCBtZW1vcnkgbWFuYWdlbWVudCBhbmQgcG90ZW50aWFsIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdGllcy4gSSBuZWVkIHRvIGJlIHN1cmUgdGhlIGZ1bmN0aW9uIGhhbmRsZXMgYWxsIGVkZ2UgY2FzZXMgY29ycmVjdGx5LiBNeSBleHBlcmllbmNlIHNheXMgdGhhdCBpcyB0aGUgbW9zdCBjb21tb24gYXJlYSBmb3Igc3VidGxlIGJ1Z3MgaW4gdGhlc2Uga2luZHMgb2Ygcm91dGluZXMsIHNvIGxldCdzIHN0YXJ0IHRoZXJlLiBJJ20gZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGhvdyBpdCBpbnRlcmFjdHMgd2l0aCB0aGUgdW5kZXJseWluZyBwYWdlIHRhYmxlcyBhbmQgbWVtb3J5IG1hcHBpbmcuIExldCdzIHNlZSBpZiB0aGVyZSBhcmUgYW55IG9idmlvdXMgbWlzdGFrZXMgaW4gdGhlIGxvZ2ljLCBvciBhbnkgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9ucyBpZiB0aGlzIGlzIG11bHRpdGhyZWFkZWQuIEdvdHRhIGJlIG1ldGhvZGljYWwgaGVyZSBhbmQgYXZvaWQgYW55IGFzc3VtcHRpb25zLlxuXG5cbiIsIklucHV0VG9rZW5zIjo5NDg5LCJPdXRwdXRUb2tlbnMiOjQwLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MzcsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMDNUMTU6NDQ6MzIuMjc5MDAzMzUxWiIsIlNlcSI6MzYsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjIyMjc5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJ2aXJ0L2t2bS9rdm1fbWFpbi5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDIwODAsXG4gIFwiTGluZUNvdW50XCI6IDYwXG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjIwODA6XFx0XFx0fVxcbjIwODE6XFx0XFxuMjA4MjpcXHRcXHRiYXNlX2dmbiA9IChtZW0tXFx1MDAzZWd1ZXN0X3BoeXNfYWRkciBcXHUwMDNlXFx1MDAzZSBQQUdFX1NISUZUKTtcXG4yMDgzOlxcdFxcdG5wYWdlcyA9IChtZW0tXFx1MDAzZW1lbW9yeV9zaXplIFxcdTAwM2VcXHUwMDNlIFBBR0VfU0hJRlQpO1xcbjIwODQ6XFx0XFxuMjA4NTpcXHRcXHRpZiAoIW9sZCB8fCAhb2xkLVxcdTAwM2VucGFnZXMpIHtcXG4yMDg2OlxcdFxcdFxcdGNoYW5nZSA9IEtWTV9NUl9DUkVBVEU7XFxuMjA4NzpcXHRcXG4yMDg4OlxcdFxcdFxcdC8qXFxuMjA4OTpcXHRcXHRcXHQgKiBUbyBzaW1wbGlmeSBLVk0gaW50ZXJuYWxzLCB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGFjcm9zc1xcbjIwOTA6XFx0XFx0XFx0ICogYWxsIG1lbXNsb3RzIG11c3QgZml0IGluIGFuIHVuc2lnbmVkIGxvbmcuXFxuMjA5MTpcXHRcXHRcXHQgKi9cXG4yMDkyOlxcdFxcdFxcdGlmICgoa3ZtLVxcdTAwM2Vucl9tZW1zbG90X3BhZ2VzICsgbnBhZ2VzKSBcXHUwMDNjIGt2bS1cXHUwMDNlbnJfbWVtc2xvdF9wYWdlcylcXG4yMDkzOlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIwOTQ6XFx0XFx0fSBlbHNlIHsgLyogTW9kaWZ5IGFuIGV4aXN0aW5nIHNsb3QuICovXFxuMjA5NTpcXHRcXHRcXHQvKiBQcml2YXRlIG1lbXNsb3RzIGFyZSBpbW11dGFibGUsIHRoZXkgY2FuIG9ubHkgYmUgZGVsZXRlZC4gKi9cXG4yMDk2OlxcdFxcdFxcdGlmIChtZW0tXFx1MDAzZWZsYWdzIFxcdTAwMjYgS1ZNX01FTV9HVUVTVF9NRU1GRClcXG4yMDk3OlxcdFxcdFxcdFxcdHJldHVybiAtRUlOVkFMO1xcbjIwOTg6XFx0XFx0XFx0aWYgKChtZW0tXFx1MDAzZXVzZXJzcGFjZV9hZGRyICE9IG9sZC1cXHUwMDNldXNlcnNwYWNlX2FkZHIpIHx8XFxuMjA5OTpcXHRcXHRcXHQgICAgKG5wYWdlcyAhPSBvbGQtXFx1MDAzZW5wYWdlcykgfHxcXG4yMTAwOlxcdFxcdFxcdCAgICAoKG1lbS1cXHUwMDNlZmxhZ3MgXiBvbGQtXFx1MDAzZWZsYWdzKSBcXHUwMDI2IChLVk1fTUVNX1JFQURPTkxZIHwgS1ZNX01FTV9HVUVTVF9NRU1GRCkpKVxcbjIxMDE6XFx0XFx0XFx0XFx0cmV0dXJuIC1FSU5WQUw7XFxuMjEwMjpcXHRcXG4yMTAzOlxcdFxcdFxcdGlmIChiYXNlX2dmbiAhPSBvbGQtXFx1MDAzZWJhc2VfZ2ZuKVxcbjIxMDQ6XFx0XFx0XFx0XFx0Y2hhbmdlID0gS1ZNX01SX01PVkU7XFxuMjEwNTpcXHRcXHRcXHRlbHNlIGlmIChtZW0tXFx1MDAzZWZsYWdzICE9IG9sZC1cXHUwMDNlZmxhZ3MpXFxuMjEwNjpcXHRcXHRcXHRcXHRjaGFuZ2UgPSBLVk1fTVJfRkxBR1NfT05MWTtcXG4yMTA3OlxcdFxcdFxcdGVsc2UgLyogTm90aGluZyB0byBjaGFuZ2UuICovXFxuMjEwODpcXHRcXHRcXHRcXHRyZXR1cm4gMDtcXG4yMTA5OlxcdFxcdH1cXG4yMTEwOlxcdFxcbjIxMTE6XFx0XFx0aWYgKChjaGFuZ2UgPT0gS1ZNX01SX0NSRUFURSB8fCBjaGFuZ2UgPT0gS1ZNX01SX01PVkUpIFxcdTAwMjZcXHUwMDI2XFxuMjExMjpcXHRcXHQgICAga3ZtX2NoZWNrX21lbXNsb3Rfb3ZlcmxhcChzbG90cywgaWQsIGJhc2VfZ2ZuLCBiYXNlX2dmbiArIG5wYWdlcykpXFxuMjExMzpcXHRcXHRcXHRyZXR1cm4gLUVFWElTVDtcXG4yMTE0OlxcdFxcbjIxMTU6XFx0XFx0LyogQWxsb2NhdGUgYSBzbG90IHRoYXQgd2lsbCBwZXJzaXN0IGluIHRoZSBtZW1zbG90LiAqL1xcbjIxMTY6XFx0XFx0bmV3ID0ga3phbGxvY19vYmooKm5ldywgR0ZQX0tFUk5FTF9BQ0NPVU5UKTtcXG4yMTE3OlxcdFxcdGlmICghbmV3KVxcbjIxMTg6XFx0XFx0XFx0cmV0dXJuIC1FTk9NRU07XFxuMjExOTpcXHRcXG4yMTIwOlxcdFxcdG5ldy1cXHUwMDNlYXNfaWQgPSBhc19pZDtcXG4yMTIxOlxcdFxcdG5ldy1cXHUwMDNlaWQgPSBpZDtcXG4yMTIyOlxcdFxcdG5ldy1cXHUwMDNlYmFzZV9nZm4gPSBiYXNlX2dmbjtcXG4yMTIzOlxcdFxcdG5ldy1cXHUwMDNlbnBhZ2VzID0gbnBhZ2VzO1xcbjIxMjQ6XFx0XFx0bmV3LVxcdTAwM2VmbGFncyA9IG1lbS1cXHUwMDNlZmxhZ3M7XFxuMjEyNTpcXHRcXHRuZXctXFx1MDAzZXVzZXJzcGFjZV9hZGRyID0gbWVtLVxcdTAwM2V1c2Vyc3BhY2VfYWRkcjtcXG4yMTI2OlxcdFxcbjIxMjc6XFx0XFx0ciA9IGt2bV9zZXRfbWVtc2xvdChrdm0sIG9sZCwgbmV3LCBjaGFuZ2UsXFxuMjEyODpcXHRcXHRcXHRcXHQgICAgbWVtLVxcdTAwM2VndWVzdF9tZW1mZCwgbWVtLVxcdTAwM2VndWVzdF9tZW1mZF9vZmZzZXQpO1xcbjIxMjk6XFx0XFx0aWYgKHIpXFxuMjEzMDpcXHRcXHRcXHRnb3RvIG91dDtcXG4yMTMxOlxcdFxcbjIxMzI6XFx0XFx0cmV0dXJuIDA7XFxuMjEzMzpcXHRcXG4yMTM0OlxcdG91dDpcXG4yMTM1OlxcdFxcdGtmcmVlKG5ldyk7XFxuMjEzNjpcXHRcXHRyZXR1cm4gcjtcXG4yMTM3OlxcdH1cXG4yMTM4OlxcdFxcbjIxMzk6XFx0aW50IGt2bV9zZXRfaW50ZXJuYWxfbWVtc2xvdChzdHJ1Y3Qga3ZtICprdm0sXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTAzVDE1OjQ0OjMyLjI3OTIyNzcwMVoiLCJTZXEiOjM3LCJOZXN0aW5nIjozLCJUeXBlIjoibGxtIiwiTmFtZSI6Imttc2FuLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoxMzcxMDU2NjcxMCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipLTVNBTiBBc3Nlc3NtZW50IG9mIEtWTSBNZW1zbG90IEJpbmRpbmcgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBicmVhayBkb3duIHRoaXMgcGF0Y2ggYW5kIHNlZSBpZiBpdCBpbnRyb2R1Y2VzIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSB2dWxuZXJhYmlsaXRpZXMsIGdpdmVuIG15IGV4cGVydGlzZSBpbiB0aGlzIGFyZWEuXG5cbkZpcnN0LCBJIHNlZSB0aGUgcGF0Y2ggaXMgcHJpbWFyaWx5IGZvY3VzZWQgb24gdGhlIGBrdm1fZ21lbV9iaW5kYCBmdW5jdGlvbiBhbmQgaG93IGl0IGludGVyYWN0cyB3aXRoIHRoZSBtZW1zbG90IGNyZWF0aW9uIHByb2Nlc3MsIG1vdmluZyBhbmQgbW9kaWZ5aW5nIHRoZSBjYWxsIHRvIGBrdm1fZ21lbV9iaW5kYC4gV2UncmUgdGFsa2luZyBhYm91dCBtZW1zbG90IGJpbmRpbmcgc3BlY2lmaWNhbGx5IGluIHRoZSBjb250ZXh0IG9mIGdsb2JhbCBtZW1vcnkgKGdtZW0pIHdpdGhpbiBLVk0uXG5cbkhlcmUncyBteSBhbmFseXNpczpcblxuMS4gICoqYGt2bV9nbWVtX2JpbmRgIEJyZWFrZG93bjoqKiBUaGUgcGF0Y2ggbm93IGluY2x1ZGVzIGEgYFdBUk5fT05fT05DRWAgY2hlY2suIFRoZW4gdGhlIGNvZGUgc2V0cyBgc2xvdC1cdTAwM2VnbWVtLmZpbGUgPSBmaWxlO2AsIGJ1dCBJIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgYWNjZXNzIGlzIHNhZmUuIFRoZSBwYXRjaCBhbHNvIGNoZWNrcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGB4YV9zdG9yZV9yYW5nZWAuICBDcml0aWNhbGx5LCB0aGUgcGF0Y2ggaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBgeGFfc3RvcmVfcmFuZ2VgIGZhaWxzIChmb3IgaW5zdGFuY2UsIGR1ZSB0byAtRU5PTUVNKSBieSBwcm9wZXJseSBjbGVhbmluZyB1cCB0aGUgYmluZGluZyBhbmQgcmVzZXR0aW5nIHJlbGV2YW50IGZpZWxkcy4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudC5cblxuMi4gICoqYGt2bV9zZXRfbWVtc2xvdGAgTW9kaWZpY2F0aW9uOioqICBga3ZtX2dtZW1fYmluZGAgaXMgbm93IGNhbGxlZCB3aXRoaW4gYGt2bV9zZXRfbWVtc2xvdGAsIGFmdGVyIGBrdm1fcHJlcGFyZV9tZW1vcnlfcmVnaW9uYC4gRXJyb3IgaGFuZGxpbmcgaGFzIGJlZW4gYWRkZWQgaWYgdGhlIGJpbmRpbmcgZmFpbHMsIGluY2x1ZGluZyBjbGVhbnVwIG9mIGFyY2ggbWVtc2xvdCByZXNvdXJjZXMgYW5kIHRoZSBkaXJ0eSBiaXRtYXAuIFRoZSBwYXRjaCBhbHNvIG1vdmVzIHRoZSBga3ZtX2dtZW1fYmluZGAgY2FsbCBmcm9tIGBrdm1fc2V0X21lbW9yeV9yZWdpb25gIHRvIGBrdm1fc2V0X21lbXNsb3RgLlxuXG4zLiAgKipLTVNBTiBDb25zaWRlcmF0aW9uczoqKiBJJ3ZlIGNhcmVmdWxseSBjb25zaWRlcmVkIHRoZSBLTVNBTiBjcml0ZXJpYS4gU3BlY2lmaWNhbGx5OlxuXG4gICAgKiAgIE5vIGtlcm5lbCBzdHJ1Y3R1cmVzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBoZXJlLiBUaGF0J3MgYSBodWdlIHBvc2l0aXZlLlxuICAgICogICBWYXJpYWJsZXMgYXJlIGVpdGhlciBpbml0aWFsaXplZCBkaXJlY3RseSBvciBhbGxvY2F0ZWQgdXNpbmcgYGt6YWxsb2Nfb2JqYCwgd2hpY2ggemVyby1pbml0aWFsaXplcy4gTm8gdW5pbml0aWFsaXplZCByZWFkcyBoZXJlLlxuICAgICogICBObyBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBhcmUgYWxsb2NhdGVkIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGNhdXNlIHByb2JsZW1zLiBFdmVyeXRoaW5nIGlzIGhhbmRsZWQgcHJvcGVybHkuXG4gICAgKiAgIEJvdW5kcyBjaGVja3MgYW5kIGxlbmd0aHMgbG9vayBmaW5lIGluIHJlbGF0aW9uIHRvIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGlzc3Vlcy5cblxuNC4gICoqQ29uY2x1c2lvbjoqKiBCYXNlZCBvbiB0aGlzIGFuYWx5c2lzLCBJJ20gY29uZmlkZW50IHRoYXQgdGhpcyBwYXRjaCAqKmRvZXMgbm90IGludHJvZHVjZSoqIGFueSB1bmluaXRpYWxpemVkIG1lbW9yeSBidWdzLiBJdCBkb2Vzbid0IGFsdGVyIGFueSBkYXRhIGZsb3cgaW4gdGhhdCByZWdhcmQuIEluIGZhY3QsIGl0IGltcHJvdmVzIGVycm9yIGhhbmRsaW5nIGFuZCByZXNvdXJjZSBtYW5hZ2VtZW50LCBlc3BlY2lhbGx5IGluIGhvdyBga3ZtX2dtZW1fYmluZGAgaW50ZXJhY3RzIHdpdGggYHhhX3N0b3JlX3JhbmdlYC4gVGhlc2UgaW1wcm92ZW1lbnRzIGFyZSBlcnJvciB1bndpbmRpbmcvc3luY2hyb25pemF0aW9uL3Jlc291cmNlIG1hbmFnZW1lbnQgY29uY2VybnMsIGFuZCB0aGV5IGNhbiBiZSBjYXVnaHQgYnkgS0FTQU4gYW5kIHN0YW5kYXJkIGtlcm5lbCBkZWJ1Z2dlcnMuXG5cbkxldCdzIGRvIGEgcXVpY2sgZG91YmxlLWNoZWNrOlxuLSBgeGFyYCBpcyBpbml0aWFsaXplZCBpbW1lZGlhdGVseSBiZWZvcmUgdXNlXG4tIGBzbG90YCBpcyBwcm9wZXJseSBhbGxvY2F0ZWQgd2l0aCBga3phbGxvY19vYmpgXG4tIE5vIHN0YWNrIHZhcmlhYmxlcyBhcmUgdW5pbml0aWFsaXplZCBiZWZvcmUgdXNlLlxuLSBObyBtZW1vcnkgaXMgY29waWVkIHRvIHVzZXIgc3BhY2Ugd2l0aG91dCBpbml0aWFsaXphdGlvbi5cblxuVGhlcmVmb3JlLCBgTmVlZHNLTVNBTiA9IGZhbHNlYC4gSSdtIHJlYWR5IHRvIHByZXBhcmUgdGhlIHRvb2wgY2FsbCB0byBgc2V0LXJlc3VsdHNgLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMDcwOCwiT3V0cHV0VG9rZW5zIjoyMDIsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo4NTcsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0wM1QxNTo0NDo0NS45ODk3OTc2MDFaIiwiU2VxIjozOCwiTmVzdGluZyI6MywiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxODA4MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSdzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cXG5cXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkanVzdHMgdGhlIGVycm9yIGhhbmRsaW5nIGFuZCBzZXF1ZW5jZSBvZiBrdm1fZ21lbV9iaW5kKCkgd2l0aGluIEtWTSdzIG1lbXNsb3Qgc2V0dXAgKGt2bV9zZXRfbWVtc2xvdCgpKS4gU3BlY2lmaWNhbGx5LCBpdCBjaGVja3MgdGhlIHJldHVybiB2YWx1ZSBvZiB4YV9zdG9yZV9yYW5nZSgpLCB1bndpbmRzIHRoZSBtZW1zbG90IGZpZWxkcyBhbmQgeGFycmF5IGJpbmRpbmdzIG9uIGZhaWx1cmUsIGFuZCBtb3ZlcyB0aGUgYmluZCBjYWxsIGFmdGVyIGt2bV9wcmVwYXJlX21lbW9yeV9yZWdpb24oKS5cXG5cXG5BbGwgYWxsb2NhdGVkIG1lbW9yeSBzdHJ1Y3R1cmVzIChzdWNoIGFzIGt2bV9tZW1vcnlfc2xvdCkgYXJlIHplcm8tYWxsb2NhdGVkIHdpdGgga3phbGxvY19vYmooKSwgbG9jYWwgdmFyaWFibGVzIChlLmcuLCB4YXIpIGFyZSBmdWxseSBpbml0aWFsaXplZCBiZWZvcmUgdXNlLCBhbmQgbm8gZGF0YSBpcyBjb3BpZWQgdG8gdXNlcnNwYWNlIG9yIGxlZnQgdW5pbml0aWFsaXplZCBpbiBrZXJuZWwtaW50ZXJuYWwgc3RhdGUuIEFzIHRoaXMgY2hhbmdlIGRlYWxzIHN0cmljdGx5IHdpdGggZXJyb3IgaGFuZGxpbmcgYW5kIHJlc291cmNlIGNsZWFudXAgcmF0aGVyIHRoYW4gdW5pbml0aWFsaXplZCBtZW1vcnkgYWNjZXNzIG9yIGluZm9ybWF0aW9uIGRpc2Nsb3N1cmVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZCBhbmQgc3RhbmRhcmQgS0FTQU4gdGVzdGluZyBpcyBzdWZmaWNpZW50LlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfV07CgkJCWlmICghcmF3RGF0YSB8fCByYXdEYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSk7CgkJCWRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCQlkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1N1bW1hcnlUYWJsZXMocmF3RGF0YSkgewoJCQljb25zdCBzdGF0cyA9IHsKCQkJCWxsbTogeyBjb3VudDogMCwgdG9rZW5zOiAwLCBkdXJhdGlvbjogMCB9LAoJCQkJdG9vbDogeyBjb3VudDogMCwgZHVyYXRpb246IDAgfQoJCQl9OwoKCQkJcmF3RGF0YS5mb3JFYWNoKHMgPT4gewoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7IAoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIpIHsKCQkJCQlzdGF0cy5sbG0uY291bnQrKzsKCQkJCQlzdGF0cy5sbG0udG9rZW5zICs9IChzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zKTsKCQkJCQlzdGF0cy5sbG0uZHVyYXRpb24gKz0gZHVyOwoJCQkJfSBlbHNlIGlmIChzLlR5cGUgPT09ICJ0b29sIikgewoJCQkJCXN0YXRzLnRvb2wuY291bnQrKzsKCQkJCQlzdGF0cy50b29sLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0KCQkJfSk7CgoJCQljb25zdCBhdmdMbG1EdXIgPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS5kdXJhdGlvbiAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z0xsbVRva2VuID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0udG9rZW5zIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnVG9vbER1ciA9IHN0YXRzLnRvb2wuY291bnQgPiAwID8gKHN0YXRzLnRvb2wuZHVyYXRpb24gLyBzdGF0cy50b29sLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCgkJCWNvbnN0IGxsbVN1bWFyeUNlbGxzID0gW3N0YXRzLmxsbS5jb3VudCwgc3RhdHMubGxtLnRva2VucywgYXZnTGxtVG9rZW4sIHN0YXRzLmxsbS5kdXJhdGlvbiwgYXZnTGxtRHVyXTsKCQkJY29uc3QgdG9vbFN1bW1hcnlDZWxscyA9IFtzdGF0cy50b29sLmNvdW50LCBzdGF0cy50b29sLmR1cmF0aW9uLCBhdmdUb29sRHVyXTsKCgkJCWNvbnN0IGxsbVN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xsbV9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJbGxtU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IGxsbVRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJbGxtU3VtYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCWxsbVRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCWxsbVN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKGxsbVRyKTsKCgkJCWNvbnN0IHRvb2xTdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b29sX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQl0b29sU3VtbWFyeUJvZHkuaW5uZXJIVE1MID0gIiI7CgkJCWNvbnN0IHRvb2xUciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCXRvb2xTdW1tYXJ5Q2VsbHMuZm9yRWFjaChjZWxsID0+IHsKCQkJCWNvbnN0IHRkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGQnKTsKCQkJCXRkLnRleHRDb250ZW50ID0gY2VsbDsKCQkJCXRvb2xUci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQl0b29sU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQodG9vbFRyKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdEdXJhdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgZmlsdGVyZWRTdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gWyJsbG0iLCAidG9vbCJdLmluY2x1ZGVzKGQuVHlwZSkpOwoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdEdXJhdGlvbicpOwoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOyAKCgkJCWZpbHRlcmVkU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCQoJCQkJY29uc3QgZHVyID0gcy5EdXJhdGlvbiAvIDEwMDAwMDAwMDA7CgkJCQlsZXQgdG9vbHRpcCA9IHMuTmFtZTsKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iICYmIHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCQkJCWRhdGEuYWRkUm93KFtgJHtzLlNlcX1gLCBkdXIsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUaW1lIENvbnN1bXB0aW9uIG9mIExMTS9Ub29sIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0vVG9vbCBTdGVwcycsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdTZWNvbmRzJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkdXJhdGlvbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3VG9rZW5Db25zdW1wdGlvbkNoYXJ0KHJhd0RhdGEpIHsKCQkJY29uc3QgbGxtU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IGQuVHlwZSA9PT0gImxsbSIpOwoJCQlpZiAobGxtU3RlcHMubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQljb25zdCBkYXRhID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkRhdGFUYWJsZSgpOwoJCQlkYXRhLmFkZENvbHVtbignc3RyaW5nJywgJ1N0ZXAnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oJ251bWJlcicsICdUb2tlbnMnKTsJCQkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAnc3R5bGUnfSk7CQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICd0b29sdGlwJ30pOwkKCgkJCWNvbnN0IGFnZW50Q29sb3JzID0ge307CgkJCWNvbnN0IHBhbGV0dGUgPSBbJyM0Mjg1RjQnLCAnI0RCNDQzNycsICcjRjRCNDAwJywgJyMwRjlENTgnLCAnI0FCNDdCQycsICcjMDBBQ0MxJ107CgkJCWxldCBjb2xvcklkeCA9IDA7CgkJCWNvbnN0IGFnZW50TExNQ291bnRzID0ge307CgkJCWxsbVN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQlpZiAoIWFnZW50Q29sb3JzW3MuTmFtZV0pIHsKCQkJCQlhZ2VudENvbG9yc1tzLk5hbWVdID0gcGFsZXR0ZVtjb2xvcklkeCAlIHBhbGV0dGUubGVuZ3RoXTsKCQkJCQljb2xvcklkeCsrOwoJCQkJfQoKCQkJCWFnZW50TExNQ291bnRzW3MuTmFtZV0gPSAoYWdlbnRMTE1Db3VudHNbcy5OYW1lXSB8fCAwKSArIDE7CgkJCQljb25zdCBsYWJlbCA9IGAke3MuTmFtZX0tJHthZ2VudExMTUNvdW50c1tzLk5hbWVdfWA7CgkJCQljb25zdCB0b3RhbFRva2VucyA9IHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnM7CgkJCQljb25zdCBzdHlsZSA9IGBjb2xvcjogJHthZ2VudENvbG9yc1tzLk5hbWVdfWA7CgkJCQlsZXQgdG9vbHRpcCA9IGBUb3RhbCBUb2tlbnM6ICR7dG90YWxUb2tlbnN9XG4oSW46ICR7cy5JbnB1dFRva2Vuc30sIE91dDogJHtzLk91dHB1dFRva2Vuc30sIFRob3VnaHRzOiAke3MuT3V0cHV0VGhvdWdodHNUb2tlbnN9KWA7CgkJCQlpZiAocy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoKCQkJCWRhdGEuYWRkUm93KFtsYWJlbCwgdG90YWxUb2tlbnMsIHN0eWxlLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVG9rZW4gQ29uc3VtcHRpb24gYnkgTExNIENhbGxzJywKCQkJCWhBeGlzOiB7CgkJCQkJdGl0bGU6ICdMTE0gQ2FsbCBTZXF1ZW5jZScsCgkJCQl9LAoJCQkJdkF4aXM6IHsgdGl0bGU6ICdDb25zdW1lZCBUb2tlbnMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rva2VuX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgkJbGV0IGFsbEV4cGFuZGVkID0gZmFsc2U7CgkJZnVuY3Rpb24gdG9nZ2xlQWxsRGV0YWlscygpIHsKCQkJYWxsRXhwYW5kZWQgPSAhYWxsRXhwYW5kZWQ7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2RldGFpbHMnKS5mb3JFYWNoKGQgPT4gewoJCQkJaWYgKGFsbEV4cGFuZGVkKSBkLnNldEF0dHJpYnV0ZSgnb3BlbicsICcnKTsKCQkJCWVsc2UgZC5yZW1vdmVBdHRyaWJ1dGUoJ29wZW4nKTsKCQkJfSk7CgkJfQoJPC9zY3JpcHQ+CgoKPC9ib2R5Pgo8L2h0bWw+Cg==" },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-workflowzlspx[1] Phase: Succeeded StartedAt: 2026-09-03 15:44:57 +0000 UTC FinishedAt: 2026-09-03 15:44:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-03 15:44:57 +0000 UTC FinishedAt: 2026-09-03 15:44:57 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2] Phase: Succeeded StartedAt: 2026-09-03 15:44:57 +0000 UTC FinishedAt: 2026-09-03 19:23:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-09-03 15:44:57 +0000 UTC FinishedAt: 2026-09-03 19:23:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},"patched":{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-09-03 15:44:57 +0000 UTC FinishedAt: 2026-09-03 15:45:07 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-09-03 15:44:57 +0000 UTC FinishedAt: 2026-09-03 15:45:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-convert-artifact-330130907/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-09-03 15:45:07 +0000 UTC FinishedAt: 2026-09-03 16:01:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-09-03 15:45:07 +0000 UTC FinishedAt: 2026-09-03 16:01:13 +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:*68f55cba-cfb8-40a3-b989-21e79c03a4ba,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-workflowzlspx/series-workflowzlspx-convert-artifact-330130907/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": "dab0fbc9-6b72-441e-8d5d-758fc0f15c12", "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-workflowzlspx/series-workflowzlspx-build-action-1502946073/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-09-03 15:45:07 +0000 UTC FinishedAt: 2026-09-03 16:01:03 +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:*68f55cba-cfb8-40a3-b989-21e79c03a4ba,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-workflowzlspx/series-workflowzlspx-convert-artifact-330130907/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": "dab0fbc9-6b72-441e-8d5d-758fc0f15c12", "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-workflowzlspx/series-workflowzlspx-build-action-1502946073/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-09-03 16:01:13 +0000 UTC FinishedAt: 2026-09-03 16:01:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-09-03 16:01:13 +0000 UTC FinishedAt: 2026-09-03 16:01:13 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-09-03 16:01:13 +0000 UTC FinishedAt: 2026-09-03 16:01:23 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-09-03 16:01:13 +0000 UTC FinishedAt: 2026-09-03 16:01:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-convert-artifact-1830010162/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-09-03 16:01:23 +0000 UTC FinishedAt: 2026-09-03 16:03:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-09-03 16:01:23 +0000 UTC FinishedAt: 2026-09-03 16:03:18 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*dab0fbc9-6b72-441e-8d5d-758fc0f15c12,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-workflowzlspx/series-workflowzlspx-build-action-1502946073/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-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-09-03 16:03:28 +0000 UTC FinishedAt: 2026-09-03 16:03:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-09-03 16:03:28 +0000 UTC FinishedAt: 2026-09-03 16:03:28 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-09-03 16:03:28 +0000 UTC FinishedAt: 2026-09-03 16:19:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-09-03 16:03:28 +0000 UTC FinishedAt: 2026-09-03 16:19:41 +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:*68f55cba-cfb8-40a3-b989-21e79c03a4ba,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-workflowzlspx/series-workflowzlspx-convert-artifact-1830010162/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": "acc0a039-b1c7-45fe-829e-4f96dabd290a", "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-workflowzlspx/series-workflowzlspx-build-action-2471538374/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-09-03 16:03:28 +0000 UTC FinishedAt: 2026-09-03 16:19:31 +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:*68f55cba-cfb8-40a3-b989-21e79c03a4ba,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-workflowzlspx/series-workflowzlspx-convert-artifact-1830010162/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": "acc0a039-b1c7-45fe-829e-4f96dabd290a", "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-workflowzlspx/series-workflowzlspx-build-action-2471538374/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-09-03 16:19:41 +0000 UTC FinishedAt: 2026-09-03 16:19:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-09-03 16:19:41 +0000 UTC FinishedAt: 2026-09-03 16:19:41 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-09-03 16:19:41 +0000 UTC FinishedAt: 2026-09-03 16:21:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-09-03 16:19:41 +0000 UTC FinishedAt: 2026-09-03 16:21:38 +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:*acc0a039-b1c7-45fe-829e-4f96dabd290a,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-workflowzlspx/series-workflowzlspx-build-action-2471538374/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-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-09-03 16:21:48 +0000 UTC FinishedAt: 2026-09-03 19:23:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-09-03 16:21:48 +0000 UTC FinishedAt: 2026-09-03 19:23:17 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:track,Default:nil,Value:*KASAN,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:base-build-id,Default:nil,Value:*dab0fbc9-6b72-441e-8d5d-758fc0f15c12,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*acc0a039-b1c7-45fe-829e-4f96dabd290a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-build-action-1502946073/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-build-action-2471538374/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-09-03 16:21:48 +0000 UTC FinishedAt: 2026-09-03 16:21:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-09-03 16:21:48 +0000 UTC FinishedAt: 2026-09-03 16:21:53 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{Artifact{Name:artifact,Path:/tmp/artifact,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-convert-artifact-1561983879/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-09-03 16:21:48 +0000 UTC FinishedAt: 2026-09-03 16:21:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-09-03 16:21:48 +0000 UTC FinishedAt: 2026-09-03 16:21:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-09-03 16:21:48 +0000 UTC FinishedAt: 2026-09-03 16:21:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-09-03 16:21:58 +0000 UTC FinishedAt: 2026-09-03 19:23:17 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzlspx[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":["kvm"],"focus_symbols":["kvm_gmem_bind","kvm_set_memslot","kvm_set_memory_region","kvm_vm_ioctl_set_memory_region"],"skip_cover_check":false},patched:{"arch":"amd64","commit_hash":"76671054f9a1ff6abb976583cd8da37650acdc97","config_name":"upstream-apparmor-kasan.config","enable_configs":["KVM","KVM_GUEST_MEMFD"],"series_id":"29c063b4-0fb5-4c56-a411-2d16db5a39e2","tree_name":"axboe","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-09-03 16:21:58 +0000 UTC FinishedAt: 2026-09-03 19:23:07 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*dab0fbc9-6b72-441e-8d5d-758fc0f15c12,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*acc0a039-b1c7-45fe-829e-4f96dabd290a,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:test-name,Default:nil,Value:*[KASAN] Fuzz,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{Artifact{Name:base-kernel,Path:/base,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-build-action-1502946073/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:patched-kernel,Path:/patched,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-build-action-2471538374/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},Artifact{Name:config,Path:/tmp/config.json,Mode:nil,From:,ArtifactLocation:ArtifactLocation{ArchiveLogs:nil,S3:nil,Git:nil,HTTP:nil,Artifactory:nil,HDFS:nil,Raw:nil,OSS:nil,GCS:&GCSArtifact{GCSBucket:GCSBucket{Bucket:,ServiceAccountKeySecret:nil,},Key:series-workflowzlspx/series-workflowzlspx-convert-artifact-1561983879/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: &Outputs{Parameters:[]Parameter{},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,}